The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]



Вариант для распечатки  
Пред. тема | След. тема 
Форум Разговоры, обсуждение новостей
Режим отображения отдельной подветви беседы [ Отслеживать ]

Оглавление

Линус Торвальдс не исключил возможность интеграции поддержки Rust в ядро Linux 5.20, opennews (ok), 22-Июн-22, (0) [смотреть все]

Сообщения [Сортировка по времени | RSS]


431. "Линус Торвальдс не исключил возможность интеграции поддержки..."  +/
Сообщение от Аноним (-), 26-Июн-22, 12:32 
> use std::process::ExitCode;
> fn main() -> ExitCode {
>     if !check_foo() {
>         return ExitCode::from(42);
>     }
>     ExitCode::SUCCESS
> }
> https://doc.rust-lang.org/stable/std/process/struct.ExitCode...

Агаблин, это вместо сишного return 42. Стало проще, красивее, удобнее... </sarcasm>

Ответить | Правка | К родителю #78 | Наверх | Cообщить модератору

459. "Линус Торвальдс не исключил возможность интеграции поддержки..."  +/
Сообщение от warlock66613email (ok), 26-Июн-22, 13:47 
> Агаблин, это вместо сишного return 42. Стало проще, красивее, удобнее... </sarcasm>

Точно красивее. И удобнее, если брать не настолько синтетический пример.

И например в C вы можете сделать `return -42;`. А POSIX говорит, что код должен быть в пределах `0 ..= 255`. И вот попробуй догадайся, 1) к чему такой код приведёт, 2) зачем язык позволяет писать это.

Ответить | Правка | Наверх | Cообщить модератору

466. "Линус Торвальдс не исключил возможность интеграции поддержки..."  +/
Сообщение от Аноним (-), 26-Июн-22, 16:27 
> Точно красивее.

Я заметил. Еще не менее красив их пример с функциями в параметрах, где у assignment'ов видите ли нет value, но вы можете вот так костыльнуть, но точку с запятой дескать вот тут ставьте а вот тут нет. Вот это я понимаю - наколень в дизайне ЯП, в отличие от сей, с оправданием что г@вно в синтаксисе так и задумано...

И это, а оно может из функции несколько параметро вернуть кроме как struct'ом каким? И что за нафиг, почему имена нельзя назначать на выход? Они решили сделать все это вообще так же педальненько как в сях? :)))

За примеры с структами и типами данных им в буке тоже факоф. Половина тем тупо не раскрыты. Окей гугл, покажите как красиво и без #$%чих закорючек вернуть допустим 1) статус операции, удалась она или нет (boolean) и 2) продвинутое инфо для тех кому не пофиг детали причины облома? Некрасиво я это и на сишке могу. У них эта тема вообще не раскрыта.

Еще мне понравилось про 2's complement. Мол в дебаге ловим, в релизе нет. И чем это от ubsan в сях отличается, например? :) И почему & в референсе структов вон там надо а вон там можно не ставить? Это чо за недоделаеная ПОЛУавтоматика одного и того же? Они издеваются? :)

Или можно ли там сделать допустим тип у которого валидное значение только от 3 до 8 а если больше пытаются - лучше всего компил сломать нахрен, т.к. это явно баг?

Не, там и прикольные моменты есть, но... но вот например бук на их сайте писан явно какой-то корпоративной сволочью в программирование не способной совсем. Поэтому даже типовые кейсы и конструкции не раскрыты. Здорово конечно но прогать какие-то более-менее реалистичные программы по этому не особо научишься. Да еще везде свой карго культ гадский суют.

> И удобнее, если брать не настолько синтетический пример.
> И например в C вы можете сделать `return -42;`. А POSIX говорит,
> что код должен быть в пределах `0 ..= 255`.

В позиксе про _Exit написано такое:

The value status & 0377 is returned to the parent process as the process's exit status, and can be collected using one of the wait(2) family of calls

И если вам кажется что позикс паршиво специфицирован: да, это так. Но знаете что самое досадное для хрустиков? Вы его будете жрать точно таким же кривым. А лишние абстракции над этими кривульками как максимум могут прибавить глюков и непоняток. Переписывать ради вас таких красивых тот же позикс никто не будет. А стандартная либа это прекрасно, пока не потребовалось что-то ну вот натурально системное, именно вызовами в операционку и ее начинку. Потому что на вообще совсем все стандартных либ не напишешь.

> И вот попробуй догадайся, 1) к чему такой код приведёт, 2) зачем язык
> позволяет писать это.

См. выше. Язык на самом деле просто не выделывается особо а позикс что, он писан укурками. Как впрочем и олдовые сишные типы с их никакущей спецификацией. В этом хруст даже имеет некие бонусы, но требование допустим u128 ставит раком некоторые платформы. На какой-нибудь 8-битной дряни его татк то тяжко. А если кто про системщину вякал и кроссплатформенность, нехило бы и в микроконтроллеры уметь так то. Иначе вместо альтернативы сям получается какой-то стеб.

Ответить | Правка | Наверх | Cообщить модератору

473. "Линус Торвальдс не исключил возможность интеграции поддержки..."  +/
Сообщение от warlock66613email (ok), 26-Июн-22, 18:29 
> вы можете вот так костыльнуть, но точку с запятой дескать вот тут ставьте а вот тут нет. Вот это я понимаю - наколень в дизайне ЯП, в отличие от сей, с оправданием что г@вно в синтаксисе так и задумано...

Это как раз одна из самых красивых вещей. Одна из тех, пр которые давно стало понятно как надо делать правильно, и вот Rust (не считая, конечно, Haskell и т.п.) наконец воплотил.

> оно может из функции несколько параметро вернуть кроме как struct'ом каким?

Туплом.

> почему имена нельзя назначать на выход? Они решили сделать все это вообще так же педальненько как в сях?

Так и на вход нельзя. Симметрия. Ну и если уж нужны имена, то может стоит придумать ещё всего одно имя  и сделать именованную структуру? Ну и почему прямо как в сях? В хаскеле тоже так, например.

> У них эта тема вообще не раскрыта.

Эта тема общая для всех языков с ADT, никакой Rust специфики в ней нет.

> И чем это от ubsan в сях отличается, например?

Тем, что здесь это не UB.

> И почему & в референсе структов вон там надо а вон там можно не ставить?

Это вопрос из серии из серии "почему в русском языке тут надо запятую ставить, а тут не надо". Потому что такие правила. Чтобы обсуждать предметно, нужна альтернатива. Только лучше не получится.

> можно ли там сделать допустим тип у которого валидное значение только от 3 до 8

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

> Здорово конечно но прогать какие-то более-менее реалистичные программы по этому не особо научишься.

Потому что это учебник языка, а не учебник программирования.

> требование допустим u128 ставит раком некоторые платформы

А что, длинную арифметику отменили? Атомарности Rust не требует от такого типа.

Ответить | Правка | Наверх | Cообщить модератору

478. "Линус Торвальдс не исключил возможность интеграции поддержки..."  +/
Сообщение от warlock66613email (ok), 26-Июн-22, 20:05 
> Так и на вход нельзя. Симметрия.

Точнее так: на вход имена не может указывать вызывающая сторона (нет вызова функции с именованными параметрами), а на выход, наоборот, вызываемая (функция не может специфицировать имена для полей результата). И наоборот, функция при описании специфицирет имена входных параметров, а вызывающая сторона может декомпозировать результат в набор именованных параметров.

Ответить | Правка | Наверх | Cообщить модератору

488. "Линус Торвальдс не исключил возможность интеграции поддержки..."  +/
Сообщение от Аноним (-), 27-Июн-22, 17:26 
> Точнее так: на вход имена не может указывать вызывающая сторона (нет вызова
> функции с именованными параметрами), а на выход, наоборот, вызываемая (функция не
> может специфицировать имена для полей результата).

А симметрия тут в каком месте возникает? Может, имелась в виду АНТИсимметрия? Вот в это я готов поверить :)))

Ответить | Правка | Наверх | Cообщить модератору

501. "Линус Торвальдс не исключил возможность интеграции поддержки..."  +/
Сообщение от warlock66613email (ok), 28-Июн-22, 02:28 
Антисимметрия — это частный случай симметрии.
Ответить | Правка | Наверх | Cообщить модератору

487. "Линус Торвальдс не исключил возможность интеграции поддержки..."  +/
Сообщение от Аноним (-), 27-Июн-22, 17:24 
> Это как раз одна из самых красивых вещей.

Агаблин, кроме лаконичного и унифицированного синтаксиса (== эффективный тул). В этом месте мы понимаем почему говорят что краткость сестра таланта. И нет, вот именно то в сишке обычно никаких проблем никому не создавало, так что починили то что не сломано. Хз нафига.

> Одна из тех, пр которые давно стало понятно как надо делать правильно, и вот Rust
> (не считая, конечно, Haskell и т.п.) наконец воплотил.

Лично я не понимаю хаскелистов, они слишком сферически-вакуумные для написания реальных программ. Решают какие-то проблемы которые мне до 3.14-ды, а мне до того же они и их программы с яп-ом.

> Туплом.

Спасибо, если сложные вещи возвращать я и в сях struct могу нарисовать, но это не очень удобно и не очень красиво, лишние закорюки. С фига вот нельщя -> i32, i16 и return (10, 20)? И почему я должен это в тупл совать если они логически не связаны между собой?

> Так и на вход нельзя. Симметрия.

Как это? https://doc.rust-lang.org/book/ch05-02-example-structs.html

fn area(width: u32, height: u32) -> u32 { 

По-моему, width и height это 2 именованых входных параметра, при том хотя дока про struct'ы, в именно этом случае оно как раз без них. А вот так же, симметрично, на выход сделать - уже фиг. И где симметрия?! Но вон то с impl'ом довольно симпатично.

>  Ну и если уж нужны имена, то может стоит придумать ещё всего одно имя  и сделать
> именованную структуру?

Ради пары integer'ов не рулит. Больше писанины и закорючек в конечном итоге. При том для эффективного референса (указатель) в хрусте как я понял тоже & надо и когда он вон там автоматически добавляет, а вот там нет - это называется костыльный и ни разу не стройный дизайн ЯП имхо. Опять же симметрия продолбана.

> Ну и почему прямо как в сях? В хаскеле тоже так, например.

Чисто практически хаскелисты - один из самых бесполезных видов програмеров которых я знаю. Развели концепций и абстракций во имя луны, но ни одной полезной программы на этом я не встречал за всю мою жизнь. Так что ценность тех брейнфартов мне не очевидна. Я в курсе что уйдя в матрицу можно не вернуться, в их случае - поголовно.

> Эта тема общая для всех языков с ADT, никакой Rust специфики в ней нет.

Если я смотрю на хруст и его синтаксис, да еще в их буке, кивать куда-то еще очень сильно не комильфо, имхо. Смысл в таком буке?

> Тем, что здесь это не UB.

Если ubsan активировать, становится  defined behavior'ом, так же дает в тыкву, 1 в 1 :). Есть даже лайтовый режим когда там очень небольшой оверхед когда это вызывает хардварное исключение проца типа Bad Opcode вместо навороченого рантайма, так даже на микроконтроллерах живет (конечно же продолбав скорость и увеличив код). Могу себе представить что у него вот так оверхеда зело меньше чем у дебагбилда хруста. Не ноль конечно.

> Это вопрос из серии из серии "почему в русском языке тут надо
> запятую ставить, а тут не надо".

Если уж мы об этом, русский язык уж точно не стоит брать за пример при создании ЯП. Сложный, несимметричный, кривой, с кучей "легаси". Какой % жителей РФ им нормально владеет в виде когда они могут хотя-бы писать без тупых ошибок? :)))

> Потому что такие правила. Чтобы обсуждать предметно, нужна альтернатива.
> Только лучше не получится.

"Убийц хруста" уже несколько штук есть. Видимо сомневаются - и имеют на то причины. Я что-то не вижу заявленной симметрии - и это в самых базовых вещах из их же бука.

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

Мде. Ну например, есть некий алгоритм. Он доказуемо-валидно себя ведет "от сих до сих". А с другими значениями начинает делать бред, вплоть до out of bounds. И мне совсем не катит чтобы он out of bounds или даже панику сделал в рантайме, например. И нехило бы в компилтайме чекнуть что оно именно вот так.

Что до арифметических операций, нехило бы какой-то варнинг или типа того в таким случаях, что "невозможно пруфнуть". Как намек что я вообще-то должен пересмотреть этот код из соображений стабильности, безопасности и верификации. В этом смысле Zig с компилтайм вычислениями любопытно выглядит, там наверное такую сову на глобус даже реально.

> Потому что это учебник языка, а не учебник программирования.

Вообще-то предполагается что это учебник программирования на этом языке. С какими-то более-менее реалистичными конструкциями.

> А что, длинную арифметику отменили? Атомарности Rust не требует от такого типа.

На 8-битном уродце лестница арифметики получается такая что часто всем просто вломы это. И честно говоря я не понимаю зачем u128 делать базовым типом. Для BigInt мало, на большей части платформ не особо эффективно, мелочевку нагибает (байбай, универсальность), а в реалистичных случаях всякие там смещения в файлах и проч к 2^64 врядли приблизятся в обозримом будущем. Они там сингулярность запилили втихаря?

Ответить | Правка | К родителю #473 | Наверх | Cообщить модератору

502. "Линус Торвальдс не исключил возможность интеграции поддержки..."  +/
Сообщение от warlock66613email (ok), 28-Июн-22, 03:41 
> И нет, вот именно то в сишке обычно никаких проблем никому не создавало

Одна из самых известных проблем, ради которой какие только костыли ни придумывали — и "сравнение наоборот" (`2 == x` вместо `x == 2`), и дополнительные скобки и чего только не придумывали. А всё что нужно — чтобы присваивание не возвращало значения.

> С фига вот нельщя -> i32, i16 и return (10, 20)?

Потому что `(10, 20)` — это и есть тупл. Поэтому `-> (i32, i16)`.

> По-моему, width и height это 2 именованых входных параметра

Но при вызове функции эти имена теряются, нельзя позвать `area(width: 1, height: 2)`. С возвращаемым значением наоборот — при вызове можно поименовать компоненты тупла: `let (width, height) = function();`, а в сигнатуре функции они безимянные.

> когда он вон там автоматически добавляет, а вот там нет

Автореференс делается в одной, строго оговорённой ситуации. Есть один реальный кейс, где это реально выливается в неприятную штуку, но тут просто нет решения лучше, нет альтернативы.

> Если я смотрю на хруст и его синтаксис, да еще в их
> буке, кивать куда-то еще очень сильно не комильфо, имхо. Смысл в
> таком буке?

Смысл в том, что это не учебник программирования.

> Если ubsan активировать, становится  defined behavior'ом, так же дает в тыкву,
> 1 в 1 :).

Ну и в чём проблема-то?

> "Убийц хруста" уже несколько штук есть.

Они даже близко не стоят по степени готовности.

> И нехило бы в компилтайме чекнуть что оно именно вот так.

Без зависимых типов это всё паллиатив, мёртвому припарка. Но в Rust такое можно сделать, без проблем. Только ерунда это.

> какой-то варнинг

Непонятно что с этим ворнингом дальше делать. Только затыкать, но тогда это некорректный ворнинг получается, такому ворнингу в компиляторе не место, он как минимум в линтере должен быть, а то и вообще в полноценном статическом анализаторе. Но полноценный статический анализатор и без явного типа-диапазона может провести доказательство, что в нужном месте паника не возникает.

> Вообще-то предполагается что это учебник программирования на этом языке. С какими-то более-менее реалистичными конструкциями.

Я не знаю кем такое предполагается. Учебник — это совсем другая книга, другой жанр. Например, не может быть учебника без задач.

> На 8-битном уродце лестница арифметики получается такая что часто всем просто вломы
> это. И честно говоря я не понимаю зачем u128 делать базовым
> типом. Для BigInt мало, на большей части платформ не особо эффективно,
> мелочевку нагибает (байбай, универсальность), а в реалистичных случаях всякие там смещения
> в файлах и проч к 2^64 врядли приблизятся в обозримом будущем.

Не могу тут ничего сказать. Не знаю. Но, например, монотонное время в наносекундах в u64 не влезает. Так, в линуксах `timespec` состоит из 64-битных секунд и 32-битных наносекунд, так что если пытаться упаковать это в одно число, то нужно u128. Но это, конечно, слабый аргумент.

Ответить | Правка | Наверх | Cообщить модератору

506. "Линус Торвальдс не исключил возможность интеграции поддержки..."  +/
Сообщение от Аноним (506), 28-Июн-22, 17:05 
> Одна из самых известных проблем, ради которой какие только костыли ни придумывали
> — и "сравнение наоборот" (`2 == x` вместо `x == 2`),

Вообще-то...
1) Проблема в том что сравнение было похоже на присвоение и очевидное типо вело к факапу. На момент десигна сей такой статистики не было и это еще можно понять. А потом, вот, зная типовость граблины заворкэраундили. Сколько такого в хрусте мы узнаем... потом.
2) Эта проблема в хрусте пролечена скорее уж кейвордом let, явно сделанным из подобных соображений.
3) Паскалисты делали это лучше своим :=, меньше кноп жать (2 vs 4). Просер вдвое паскалю, вчетверо сям.
4) Обругать другой яп так себе аргумент за стройность яп... :)

> и дополнительные скобки и чего только не придумывали. А всё что
> нужно — чтобы присваивание не возвращало значения.

Когда 2 = x, это ошибка, ибо константе пытаются что-то присвоить, совершенно невалидно. Но к вон тому случаю относится достаточно косвенно.

> Потому что `(10, 20)` — это и есть тупл.

В моем примере это лишь визуальное выделение, return 10, 20; ничем не хуже. Туплы все же какая-то отдельная сущность и если цель вернуть пару параметров без заморочек, выглядит каким-то оверкилом. А для наворотов и так struct были. В чем их пойнт вообще?

> Поэтому `-> (i32, i16)`.

Ну да, однако декларим вход мы все же несколько иначе и получается как-то кособоко.

> Но при вызове функции эти имена теряются, нельзя позвать `area(width: 1, height: 2)`.

Да и хрен с ним, имхо. Если кто ну вот реально именно это хотел (параметров дофига?), ему, наверное, все же struct'ы хотелось на самом деле.

> С возвращаемым значением наоборот — при вызове можно поименовать компоненты
> тупла: `let (width, height) = function();`, а в сигнатуре функции они безимянные.

И получается, блин, опять не симметрично.

> Автореференс делается в одной, строго оговорённой ситуации. Есть один реальный кейс, где
> это реально выливается в неприятную штуку, но тут просто нет решения
> лучше, нет альтернативы.

Это еще в принципе хрен с ним, всего не предусмотришь. Мое опасение здесь что когда в 1 случае автоматика есть а в другом нет, это может привести к багам когда кодер это пробакланит.

> Смысл в том, что это не учебник программирования.

Вообще-то это именно "учебник программирования на Rust" судя по виду.

> Ну и в чём проблема-то?

На самом деле - в стандартах сей и как они написаны. Бывает так что люди срезают угол, экономя себе силы там, где это делать было вообще совсем нельзя. Это именно тот случай.

> Они даже близко не стоят по степени готовности.

Says who? Адепт яп который сабж может чуть ли не только в ночнушках? :)

> Без зависимых типов это всё паллиатив, мёртвому припарка. Но в Rust такое
> можно сделать, без проблем. Только ерунда это.

Это не ерунда, это какие-то азы контрактов, чтоли, без полномасштабного залета на это. Вы правильно поняли, все хотят и рыбку съесть и косточкой не подавиться.

> Непонятно что с этим ворнингом дальше делать.

1) Там где это реально важно (safety-critical, security, reliability) и стандарты кодинга строгие, -Werror.
2) Остальным популярно рассказать фу такими быть, типа как с unsafe. Если уж кто воткнул подобие контракта то наверное имел в виду что это должно быть так.

> Только затыкать, но тогда это некорректный ворнинг получается, такому ворнингу
> в компиляторе не место, он как минимум в линтере должен быть,

Если так рассуждать, warning'ам вообще в компиляторе не место. Некоторые разделяют эту точку зрения и как минимум в сях и плюсах практикуют -Wall -Werror. Что так то очень на пользу качеству кода и отлову левых ситуаций.

> статическом анализаторе. Но полноценный статический анализатор и без явного типа-диапазона
> может провести доказательство, что в нужном месте паника не возникает.

Вот это ну не факт. Если я моим кодом генеряю вход - может быть. А если я это с ADC прочел? Ну, докажи что он мне может дать и не может. И вот в этом случае было бы айс получить варнинг или еррор, поскольку кодер, очевидно, облажался.

> Я не знаю кем такое предполагается. Учебник — это совсем другая книга,
> другой жанр. Например, не может быть учебника без задач.

В принципе они могли бы добавить и это, кмк похрустеть немного мозгом их аудитории было бы полезно :)

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

Могу себе представить что будет если кто hi-res время в u128 начнет безбашенно считать. Там у линуксоидов и так прикол был что на часы зырить довольно дорогая операция, а если ее еще этим обвесить... :)))

> Так, в линуксах `timespec` состоит из 64-битных секунд и 32-битных наносекунд,
> так что если пытаться упаковать это в одно число, то нужно u128.

Технически вон то занимает 96 битов в памяти. Это меньше. Переполнение оных происходить не обязано. А u128 это не только 2 64-бит регистра но и совершенно точно мастхэв кода который их переполнение ворочает. Это может и спасет от каких-то багов но может урыть перфоманс.

> Но это, конечно, слабый аргумент.

Ну хоть какой-то, я и на это не рассчитывал :)

Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру