пятница, 9 июля 2010 г.

[prog] Теперь вот Rust от Mozilla – полку новых нативных языков прибывает

С осени прошлого года в поле зрения попадает уже третья попытка создать новый язык программирования, предназначенный для компиляции в нативный код. Первым был Zimbu от Брама Мулинара (разработчика ViM-а), затем Go от Google, а вот теперь Rust от Mozilla (спасибо ув.тов.Курилке за наводку).

Пока познакомиться с Rust-ом не удалось. Мельком глянул на Language FAQ и бегло ознакомился с основными чертами языка в 65-страничной спецификации языка. И, честно говоря, не уверен в том, что руки дойдут до более тщательного его изучения – разве что после его официального релиза (хотя бы в виде стабильной Beta-версии или Release Candidate).

Как водится, язык мультипарадигменный. Со сборкой мусора, с элементами функционального программирования (включая алгебраические типы и паттерн-матчинг), с каким-то подобием ОО и пр., даже с возможностью писать собственные плагины для компилятора и тем самым расширять синтаксис языка. По современной традиции в язык встроена поддержка агентного программирования и каналов для обмена данными между параллельно работающими сущностями (тасками).

Из описания языка меня зацепило вот что – в Rust нет конструкции catch. Т.е. если кто-то внутри таска выбросил сигнал (я так понял, что это аналог исключения), то все – весь таск убивается. А другие таски могут разве что определить, что он умер.

Неоднозначное, на мой взгляд, решение. Ведь это означает, что какие-то операции (тот же ввод-вывод) нужно будет делать на кодах возврата. Открыли файл – проверили код возврата, записали N байт, опять проверили. Не нравится мне это. Впрочем, есть шансы, что я чего-то недопонял.

Да, еще одна мысль меня терзает. Вот в Go сделали каналы. В Rust сделали. А я думаю, что такие вещи на уровне универсального языка – не есть правильно и хорошо. Каналы и агенты должны реализовываться библиотеками. Тогда можно будет создавать разнообразные инструменты, как универсальные, так и заточенные под конкретную прикладную область. Скажем есть в ACE свой механизм Reactor-ов и Proactor-ов, а в Boost-е есть asio. А у нас в SObjectizer есть агенты, которые прячут сам факт использования Reactor-ов от программиста. А есть еще и libevent. Можно выбирать.

Конечно, свобода выбора имеет и недостатки. Но вот взглянем на Erlang – там механизм взаимодействия процессов является частью языка. Ну и? Где текстовые редакторы, написанные на Erlang? Где какой-нибудь grep на Erlang-е? Правильно, не под то Erlang со своими процессами заточен. Вот так и Go с Rust-ом можно заточить по какой-нибудь определенный server side и ничего на них больше не напишешь. В отличии от C++ или Java.

Так что не торкнул  меня сам факт наличия Rust-а. Ну разрабатывают его, ну и пусть разрабатывают. Будем посмотреть.

Отправить комментарий