The OpenNET Project / Index page

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



"Выпуск языка программирования Rust 1.47"
Версия для распечатки Пред. тема | След. тема
Форум Разговоры, обсуждение новостей
Исходное сообщение [ Отслеживать ]
Присылайте удачные настройки в раздел примеров файлов конфигурации на WIKI.opennet.ru.
. "Выпуск языка программирования Rust 1.47" +3 +/
Сообщение от Ordu (ok), 09-Окт-20, 15:04 
> i: u64
> vs
> uint64_t i

Хмм... Заглянул в википедию: я думал, что первое как раз и есть алголовский синтаксис, но оказывается, что нет.

Нуок, тогда преимущества, _паскалевского_ способа декларации: он проще. Как с точки зрения алгоритмического парсера (прочитав i в "i: u64", парсер уже знает, что i -- это имя декларируемой переменной, прочитав : он знает, что дальше пойдёт имя типа, прочитав u64 он знает, что это имя типа, даже не сверяясь со списком имён типов), так и с точки зрения человека.

Почему важна такая простота с точки зрения компилятора? Да потому что она избавляет от необходимости декларировать тип _до_ того, как задекларирована переменная этого типа. В C и C++ из-за этого приходится отдельно писать декларации, отдельно дефиниции. Из-за этого в C и C++ возникают интересности, когда изменение порядка деклараций может изменить семантику. В C++ с этим всё совсем плохо на фоне возможностей перегрузки.

С точки же зрения человека, я думаю, полезность простоты обосновывать не нужно, но может быть неочевиден сам факт простоты, так? Ну глянь на C'шное что-нибудь:

int (*fns[16])(int * const * p);

Ты чуешь в чём дело? Тут синтаксис типа перемешан с синтаксисом переменной. Чтобы в этом разобраться нужно аж целое спиральное правило. Без которого плюс-минус можно обойтись, но когда в типе появляются словечки типа const, перетасованные с * -- сам чёрт ногу сломит к чему именно относится этот самый const -- к указателю или к тому на что он указывает?

rust'овый синтаксис отделяет имя типа от имени переменной. Имя типа всегда одинаково, вне зависимости от того, суёшь ли ты его в sizeof, или объявляешь переменную такого типа, или объявляешь функцию, возвращающую значение такого типа.

И кстати обрати внимание на int*const*p: замечаешь, что оно выглядит как два умножения? Прикинь теперь:

a * b;

Что это? декларация переменной b с типом указателя на a, или умножение a на b с игнорированием результата умножения? Чтобы распарсить такое надо знать, что a -- это имя типа. То есть, чтобы понять синтаксис, надо заглянуть в семантику. За такое, если по хорошему, надо руки отрывать, и если разработчикам алгола можно простить ещё -- они писали в такой древности, когда разницу люди не понимали, то разработчикам C совершенно точно надо было бы оторвать руки за то, что они полезли пилить язык, не ознакомившись с современной им литературой о языках и компиляторах.

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

Оглавление
Выпуск языка программирования Rust 1.47, opennews, 08-Окт-20, 22:22  [смотреть все]
Форумы | Темы | Пред. тема | След. тема



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

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