rust vs zig
От: Разраб  
Дата: 15.09.23 03:29
Оценка:
От нечего делать потыкал вчера оба.
1. на удивление легко под убунтой настроил отладку в vs code
rustc 1.72.0 (5680fa18f 2023-08-23)
zig 0.12.0-dev.374+742030a8f
В расте удивило, что модуль в проекте не просто файл и даже не скоуп(mod Name {}), а его еще нужно в главном файле
определить
mod Name;
и только потом юзать Name::func1();
Тут проще как будто зиг. просто const mod = @import("mod.zig");
_ = mod.func1();
Ну да ладно, а дальше интересно. просто решил вынести readln в отдельную функцию.
//utils.rs
use std::io;

pub fn readln(prompt: &str) -> String {
    println!("{}", prompt);
    let mut input = String::new();
    _ = io::stdin().read_line(&mut input);
    return String::from(&input[..input.len() - 1]);// <- небольшой оверхед по-моему, ведь метод называется read_line ;-)
}

//main.rs
mod utils;// <- вот это мне показалось совсем не очевидно

struct Person {
    name: String,
}

fn main() {
    let name = utils::readln("What is your name?");
    let person = Person {
        name: String::from(name),
    };
    println!("Привет, {}!", person.name);
}

//utils.zig
const std = @import("std");
pub fn readln(prompt: []const u8) ![]u8 {

    var gpa = std.heap.GeneralPurposeAllocator(.{}){};
    defer _ = gpa.deinit();
    const allocator = gpa.allocator();

    const stdin = std.io.getStdIn();
    std.debug.print("{s}", .{ prompt });
    var input = std.ArrayList(u8).init(allocator);
    defer input.deinit();

    try stdin.reader().streamUntilDelimiter(input.writer(), '\n', 1024);
    
    return input.items;
}
//main.zig
const std = @import("std");
const utils = @import("utils.zig");

const Person = struct  {
    name : []u8
 };

pub fn main() !void {
    var name = try utils.readln("What is your name?\n");
    //defer name;
    var person = Person { .name = name};
    std.debug.print("Hello, {!}!", .{person});
}


Собирается, но кидает ошибку в рантайме

Hello, main.Person{ .name = { Segmentation fault at address 0x7f793c7b7000
/snap/zig/8746/lib/std/fmt.zig:662:29: 0x264ce6 in formatType__anon_8745 (zello)
for (value, 0..) |elem, i| {

Не смог найти хорошего примера именно функции для зиг, в то же время в раст как докуметация, так и помощь компилятора на высоте.
Или все же зарыться в си++ и не парится? Модульный вариант выглядит вполне съедобно. Конечно не так вкусно как зиг, но все же.
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re: rust vs zig
От: Shmj Ниоткуда  
Дата: 15.09.23 04:25
Оценка: 3 (1)
Здравствуйте, Разраб, Вы писали:

Р>Не смог найти хорошего примера именно функции для зиг, в то же время в раст как докуметация, так и помощь компилятора на высоте.

Р>Или все же зарыться в си++ и не парится? Модульный вариант выглядит вполне съедобно. Конечно не так вкусно как зиг, но все же.

Тут варианты от GPT: https://rsdn.org/forum/flame.comp/8599886.1
Автор: Shmj
Дата: 15.09.23
Re: rust vs zig
От: Shmj Ниоткуда  
Дата: 15.09.23 04:43
Оценка:
Здравствуйте, Разраб, Вы писали:

Р>Или все же зарыться в си++ и не парится? Модульный вариант выглядит вполне съедобно. Конечно не так вкусно как зиг, но все же.


На C++ кодовая база — в тысячи раз больше. Однако если придумают машинный перевод больших проектов — то ситуация совсем иной станет.
Re[2]: rust vs zig
От: Разраб  
Дата: 15.09.23 05:33
Оценка:
Здравствуйте, Shmj, Вы писали:

S>Здравствуйте, Разраб, Вы писали:


Р>>Не смог найти хорошего примера именно функции для зиг, в то же время в раст как докуметация, так и помощь компилятора на высоте.

Р>>Или все же зарыться в си++ и не парится? Модульный вариант выглядит вполне съедобно. Конечно не так вкусно как зиг, но все же.

S>Тут варианты от GPT: https://rsdn.org/forum/flame.comp/8599886.1
Автор: Shmj
Дата: 15.09.23


Логично. Но это что же везде аллокатор извне пробрасывать?
К сожалению, приведенный код не компилируется. из-за несоотвествия типов, а отсутствия deinit у аллокатора.
Но если подправить, то все равно похожая ошибка. Так что дело не в том где создал аллокатор.
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[2]: rust vs zig
От: Разраб  
Дата: 15.09.23 06:26
Оценка:
Здравствуйте, Shmj, Вы писали:

S>Здравствуйте, Разраб, Вы писали:


Р>>Или все же зарыться в си++ и не парится? Модульный вариант выглядит вполне съедобно. Конечно не так вкусно как зиг, но все же.


S>На C++ кодовая база — в тысячи раз больше. Однако если придумают машинный перевод больших проектов — то ситуация совсем иной станет.


Профтык на g++2a, сообщения об ошибках на порядок сложнее раста.
Однако, вот ди(тоже использует исходники, но все необходимое нашел сам )
module main;

import std.stdio;
import std.string;

string readline(string prompt)
{
    write(prompt);
    auto x = readln();
    return x[0 .. $ - 1]; // <- что характерно, как и в расте нужно удалять символ новой строки
}

struct Person {
string name;
};

int main(string[] args)
{
    auto name = readline("What is your name?\n");
    auto person = Person(name);
    writeln("Hello,",person.name,"!\n");
    return 0;
}

Самое интересное, все работает как часы. И даже старт через rdmd мгновенный. Вот что значит первые годы ты работаешь на репутацию.
Ед-ное что мне не нравится, это определение типов слева. больше нравится как в паскале.
var x: int; if x > 1 then x := 0 else x:= 1;
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[2]: rust vs zig
От: Разраб  
Дата: 15.09.23 07:08
Оценка:
Здравствуйте, Shmj, Вы писали:

S>Здравствуйте, Разраб, Вы писали:


Р>>Или все же зарыться в си++ и не парится? Модульный вариант выглядит вполне съедобно. Конечно не так вкусно как зиг, но все же.


S>На C++ кодовая база — в тысячи раз больше. Однако если придумают машинный перевод больших проектов — то ситуация совсем иной станет.

короче эта параша с модулями не компилится(ubuntu lts clang) даже с помощью могучего джипити.

export module utils;

#include <iostream>
#include <string>
using namespace std;
export std::string readStringFromKeyboard(std:string prompt) {
    std::cout << prompt;
    std::string input;
    std::getline(std::cin, input);
    return input;
}
//clang -o output_file utils.cpp -std=c++20

  gpt
ChatGPT & Midjourney | AI bot, [15.09.2023 14:06]
Ошибка указывает на то, что в модуле utils объявлено пространство имён std, которое конфликтует с объявлением в стандартной библиотеке.

Чтобы исправить эту ошибку, вам нужно удалить объявление пространства имён std из модуля utils. Вместо этого, вы можете явно указать использование пространства имён std для конкретных идентификаторов, например std::string:

export module utils;

#include <iostream>
#include <string>
export std::string readStringFromKeyboard(std::string prompt) {
std::cout << prompt;
std::string input;
std::getline(std::cin, input);
return input;
}
clang -o output_file utils.cpp -std=c++20

После этого, компилятор должен успешно скомпилировать модуль без ошибок.

noname nobody, [15.09.2023 14:06]
удалил объявление. ошибка осталась

ChatGPT & Midjourney | AI bot, [15.09.2023 14:07]
Если после удаления объявления пространства имён std ошибка осталась, то возможно проблема не связана с конфликтом имен.

Возможные причины ошибки могут быть следующими:
1. Некорректное использование модулей в вашем коде. Убедитесь, что вы правильно импортируете и экспортируете модули в своем коде.
2. Неправильное использование компилятора. Убедитесь, что вы используете правильные флаги компиляции и указываете версию стандарта C++ (например, -std=c++20).
3. Проблемы с настройками компилятора или среды разработки. Проверьте настройки компилятора и убедитесь, что они правильно настроены для работы с модулями.

Если проблема не решается, рекомендуется обратиться к документации компилятора или обратиться за помощью к сообществу разработчиков C++.


PS все таки ЯП это не только спецификация, но еще и нормальная реализация. Не зря страус в ютубе советует побольше времени на свежем воздухе проводить.
☭ ✊ В мире нет ничего, кроме движущейся материи.
Отредактировано 15.09.2023 7:10 Разраб . Предыдущая версия . Еще …
Отредактировано 15.09.2023 7:09 Разраб . Предыдущая версия .
Re: rust vs zig
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 15.09.23 07:18
Оценка: +1
Здравствуйте, Разраб, Вы писали:

Р>Собирается, но кидает ошибку в рантайме

Р>

Р>Hello, main.Person{ .name = { Segmentation fault at address 0x7f793c7b7000
Р>/snap/zig/8746/lib/std/fmt.zig:662:29: 0x264ce6 in formatType__anon_8745 (zello)
Р> for (value, 0..) |elem, i| {

std.debug.print("Hello, {}!", .{person});

https://ziglearn.org/chapter-2/#formatting-specifiers


Р>Не смог найти хорошего примера именно функции для зиг, в то же время в раст как докуметация, так и помощь компилятора на высоте.

Увы доков по зиг настолько мало и на них так мало ссылаются, что их просто гугл не находит.
Ну и с новым релизом доки могут стать неактуальны

Р>Или все же зарыться в си++ и не парится? Модульный вариант выглядит вполне съедобно. Конечно не так вкусно как зиг, но все же.

Смотря чего вы хотите.
Re[2]: rust vs zig
От: Разраб  
Дата: 15.09.23 09:49
Оценка:
Здравствуйте, gandjustas, Вы писали:


Р>>Или все же зарыться в си++ и не парится? Модульный вариант выглядит вполне съедобно. Конечно не так вкусно как зиг, но все же.

G>Смотря чего вы хотите.

Ну что то более близкое к ди. т.е. вот чтобы без #include-ов
но пока... 1. на линуксе не компилится с++20 2. все равно в примерах вижу кашу из import-ов и include-ов. 3. даже со строками какая-то муть, это пугает.
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[3]: rust vs zig
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 15.09.23 12:13
Оценка:
Здравствуйте, Разраб, Вы писали:

Р>Здравствуйте, gandjustas, Вы писали:



Р>>>Или все же зарыться в си++ и не парится? Модульный вариант выглядит вполне съедобно. Конечно не так вкусно как зиг, но все же.

G>>Смотря чего вы хотите.

Р>Ну что то более близкое к ди. т.е. вот чтобы без #include-ов

Если вы хотите D, то возьмите D

Р>но пока... 1. на линуксе не компилится с++20 2. все равно в примерах вижу кашу из import-ов и include-ов. 3. даже со строками какая-то муть, это пугает.

Это речь о zig или D?
Re[4]: rust vs zig
От: Разраб  
Дата: 15.09.23 14:05
Оценка:
Здравствуйте, gandjustas, Вы писали:


Р>>Ну что то более близкое к ди. т.е. вот чтобы без #include-ов

G>Если вы хотите D, то возьмите D

Р>>но пока... 1. на линуксе не компилится с++20 2. все равно в примерах вижу кашу из import-ов и include-ов. 3. даже со строками какая-то муть, это пугает.
G>Это речь о zig или D?
c++20
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[2]: rust vs zig
От: Разраб  
Дата: 16.09.23 04:20
Оценка:
Здравствуйте, Shmj, Вы писали:

S>Здравствуйте, Разраб, Вы писали:


Р>>Не смог найти хорошего примера именно функции для зиг, в то же время в раст как докуметация, так и помощь компилятора на высоте.

Р>>Или все же зарыться в си++ и не парится? Модульный вариант выглядит вполне съедобно. Конечно не так вкусно как зиг, но все же.

S>Тут варианты от GPT: https://rsdn.org/forum/flame.comp/8599886.1
Автор: Shmj
Дата: 15.09.23


пофиксил:
const std = @import("std");
pub fn readln(prompt: []const u8) ![]u8 {
   
    const allocator: std.mem.Allocator = std.heap.page_allocator;
    const stdin = std.io.getStdIn();
    std.debug.print("{s}", .{ prompt });
    var input = std.ArrayList(u8).init(allocator);
    errdefer input.deinit(); // <- вот тут заменил простой дереф и аллокатор другой

    try stdin.reader().streamUntilDelimiter(input.writer(), '\n', 1024);

    return input.items;
}
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[3]: rust vs zig
От: Shmj Ниоткуда  
Дата: 16.09.23 04:23
Оценка:
Здравствуйте, Разраб, Вы писали:

Р>Ну что то более близкое к ди. т.е. вот чтобы без #include-ов

Р>но пока... 1. на линуксе не компилится с++20 2. все равно в примерах вижу кашу из import-ов и include-ов. 3. даже со строками какая-то муть, это пугает.

А вы параметр писали -std=c++20 : https://stackoverflow.com/questions/66975491/how-to-use-c-20-in-g
Re[3]: rust vs zig
От: Shmj Ниоткуда  
Дата: 16.09.23 04:34
Оценка:
Здравствуйте, Разраб, Вы писали:

Р>пофиксил:

Р>
Р>const std = @import("std");
Р>pub fn readln(prompt: []const u8) ![]u8 {
   
Р>    const allocator: std.mem.Allocator = std.heap.page_allocator;
Р>    const stdin = std.io.getStdIn();
Р>    std.debug.print("{s}", .{ prompt });
Р>    var input = std.ArrayList(u8).init(allocator);
Р>    errdefer input.deinit(); // <- вот тут заменил простой дереф и аллокатор другой

Р>    try stdin.reader().streamUntilDelimiter(input.writer(), '\n', 1024);

Р>    return input.items;
Р>}

Р>


А вам разве не очевидно что слишком многословно? Смысл в этом языке? Чем плох Rust?
Re[4]: rust vs zig
От: Разраб  
Дата: 16.09.23 05:12
Оценка:
Здравствуйте, Shmj, Вы писали:

S>А вам разве не очевидно что слишком многословно? Смысл в этом языке? Чем плох Rust?


В расте слишком много неявного. это усложняет чтение кода.
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[4]: rust vs zig
От: Разраб  
Дата: 16.09.23 06:10
Оценка:
Здравствуйте, Shmj, Вы писали:

S>Здравствуйте, Разраб, Вы писали:


Р>>Ну что то более близкое к ди. т.е. вот чтобы без #include-ов

Р>>но пока... 1. на линуксе не компилится с++20 2. все равно в примерах вижу кашу из import-ов и include-ов. 3. даже со строками какая-то муть, это пугает.

S>А вы параметр писали -std=c++20 : https://stackoverflow.com/questions/66975491/how-to-use-c-20-in-g

это вопрос я задал чат гпт:

Ошибка указывает на то, что в модуле utils объявлено пространство имён std, которое конфликтует с объявлением в стандартной библиотеке.

Чтобы исправить эту ошибку, вам нужно удалить объявление пространства имён std из модуля utils. Вместо этого, вы можете явно указать использование пространства имён std для конкретных идентификаторов, например std::string:

export module utils;

#include <iostream>
#include <string>
export std::string readStringFromKeyboard(std::string prompt) {
std::cout << prompt;
std::string input;
std::getline(std::cin, input);
return input;
}
clang -o output_file utils.cpp -std=c++20

После этого, компилятор должен успешно скомпилировать модуль без ошибок.

☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[4]: rust vs zig
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 16.09.23 13:15
Оценка: 3 (1)
Здравствуйте, Shmj, Вы писали:

S>Здравствуйте, Разраб, Вы писали:


Р>>пофиксил:

Р>>
Р>>const std = @import("std");
Р>>pub fn readln(prompt: []const u8) ![]u8 {
   
Р>>    const allocator: std.mem.Allocator = std.heap.page_allocator;
Р>>    const stdin = std.io.getStdIn();
Р>>    std.debug.print("{s}", .{ prompt });
Р>>    var input = std.ArrayList(u8).init(allocator);
Р>>    errdefer input.deinit(); // <- вот тут заменил простой дереф и аллокатор другой

Р>>    try stdin.reader().streamUntilDelimiter(input.writer(), '\n', 1024);

Р>>    return input.items;
Р>>}

Р>>


S>А вам разве не очевидно что слишком многословно?

По сравнению с чем?

S>Смысл в этом языке?

Самая сильная сторона zig — compile-time вычисления и обобщенное программирование.
fn userFactory(data: anytype) User {
    const T = @TypeOf(data);
    return .{
        .id = if (@hasField(T, "id")) data.id else 0,
        .power = if (@hasField(T, "power")) data.power else 0,
        .active  = if (@hasField(T, "active")) data.name else true,
        .name  = if (@hasField(T, "name")) data.name else "",
    };
}

pub const User = struct {
    id: u64,
    power: u64,
    active: bool,
    name: [] const u8,
};


При вызове функции userFactory никаких проверок в рантайме не будет, а будет во время компиляции сгенерирован код, достающий нужные поля из типа.
По факту это новый уровне в компилируемых языках, когда программа и метапрограмма (макросы) это одно и то же.

S>Чем плох Rust?

У раста есть преимущества и недостатки, но с zig сравнивать смысла нет. Разные уровни языков.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.