LINUX.ORG.RU

Чисто технические причины НЕ любить Rust [holywar mode activated]

 , ,


3

9

Я тут на досуге посидел с ручкой-бумажкой и выписал штук 10 чисто технических причин, почему Rust, как язык, совершенно ни на что не годится и не нужно тратить время на его изучение. Чисто технических - в смысле, не включающих в себя пункты про отсутствие нормальной IDE, малый размер сообщества, и тому подобные. Не знаю, насколько это кому-то интересно, но предлагаю провести эксперимент. Напишите в комментариях свою версию этих пунктов, а потом сравним. Есть серьезные подозрения, что в Rust намного больше недостатков чисто с точки зрения дизайна языка, чем мне сейчас приходит на ум. Но как с любой другой новой технологией, евангелисты сосредоточены исключительно на преимуществах, закрывая глаза на недостатки.


Ответ на: комментарий от DarkEld3r

«Засоряют» все «необязательные» элементы.

Это когда они в коде. А скобки - по бокам, их в коде нет

Другое дело, что они могут облегчать чтение кода, несмотря на то, что делают его более многословным.

Ну вот запятые не облегчают, когда синтаксическая загруженность и так высока. Когда у тебя «xf sd, y fsdf, zf d s» запятые действительно помогают, но когда в этой строке куча говна с какими-то угловыми скобками, двоеточиями, амперсандами и прочим говном, то толку от запятых около нуля.

anonymous
()
Ответ на: комментарий от Bad_ptr

скорее всего будет, просто он подготавливается и подсобирает материал на статью в свой бложик

Ну дык, это разве не одно и то же? (:

«Я ничего не знаю о языке, но он мне не нравится, надо найти список недостатков для копипасты». При этом факт, что люди, которые перечисляют недостатки, не отказываются от языка, умалчивается.

Иначе свой список он давно опубликовал бы. Но вообще из таких тем я и сам что-то новое узнаю.

DarkEld3r ★★★★★
()
Ответ на: комментарий от kawaii_neko

Потому что не осилили. Есть огромный класс задач серверного характера, который отлично решается файберами поверх epoll'а.

Есть не меньше задач, где они нафиг не нужны. Есть и такие, где даже «вредны» - например, если мы не можем себе позволить жирный рантайм. А раст пытается занять, в том числе, весьма низкоуровневую нишу.

DarkEld3r ★★★★★
()
Ответ на: комментарий от cyanide_regime

Почему эту поделку надо было сделать на ржавчине, а не на С++(11)?

А в таких вещах (особенно, которые пишут «для себя») «надо» часто бывает на 100% обоснованным? При желании ведь можно было и на С и на асме сделать. Как и на джаве какой-нибудь.

DarkEld3r ★★★★★
()
Ответ на: комментарий от anonymous

А скобки - по бокам, их в коде нет

Открывающие - есть.

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

В таком случае, без них вообще никак (ну если пробелы встречаться могут).

DarkEld3r ★★★★★
()
Ответ на: комментарий от DarkEld3r

Да не нужен тут сложный рантайм. Нужен способ переключения контекста. И все. Так делают на C и C++, довольно часто(для узкой ниши очень нагруженных бэкендов на этих языках). Это достаточно низкий уровень и никакого сложного рантайм не требует.

В крайнем случае есть бесстековые сопрограммы, для C и C++ обычно их делают на макросах(в виде варианта машины Даффа). Тут вообще никакого рантайма, но и состояние нужно самому хранить, да и работает несколько медленнее.

anonymous
()
Ответ на: комментарий от kawaii_neko

Уже как-то обсасывали. Он в либевентах всяких указателями работал, а в boost::asio объекты копировал. В общем очередной «смотрите онжетормозит!!!»

У меня, например получается что asio обрабатывает примерно процентов на 5-7 всего меньше в секунду, чем libevent. И это без всяких извратов и практически с доков «how to».

anonymous
()
Ответ на: комментарий от DarkEld3r

Парень заявил что у него есть проект в 5к строк и что о плюсах ржавчины он может говорить. Вот я и спрашиваю: какие плюсы у ржавчины перед C++11 именно в контексте этого проекта? Если единственным его доводом было изучение ржавчины самой по себе, то пусть идет лесом.

cyanide_regime
()
Ответ на: комментарий от kawaii_neko

Они сидят и теоретизируют, пытаясь объять необъятное.

Да вообще-то они как раз много экспериментировали. И изменяли язык по результатам экспериментов.

DarkEld3r ★★★★★
()
Ответ на: комментарий от DarkEld3r

Открывающие - есть.

Нет, ониже сбоку!

В таком случае, без них вообще никак (ну если пробелы встречаться могут).

Ну они компилятору помогают, потому что он иначе не распарсит. А человеку - не особо.

anonymous
()
Ответ на: комментарий от anonymous

Нет, ониже сбоку!

 (let ((var1 init-form-1)
       (var2 init-form-2)
       ...
       (varm init-form-m))

По моему, скобок «внутри» хватает.

А человеку - не особо.

Но хоть немного да помогают. И ладно - твои предложения?

DarkEld3r ★★★★★
()
Ответ на: комментарий от kawaii_neko

давно уже перделали вроде.

Кстати, что такого asio обрабатывает?

а? что скажешь, то и обрабатывает.

anonymous
()
Ответ на: комментарий от cyanide_regime

Если единственным его доводом было изучение ржавчины самой по себе, то пусть идет лесом.

Ну без изучения, хотя бы поверхностного, ведь и не понять хорош ли язык.

DarkEld3r ★★★★★
()
Ответ на: комментарий от DarkEld3r

По моему, скобок «внутри» хватает.

Где? Скобки с левой стороны кода и с правой. Внутри - нету.

И ладно - твои предложения?

не перегружать синтаксис ascii-артом, очевидно же.

anonymous
()
Ответ на: комментарий от MyTrooName

есть еще опция с trait objects

А с этого момента поподробнее, пожалуйста.

эх, если бы...

Что «если бы»?

что в этом плохого?

Ну, раздельная компиляция — это, вроде как, хорошо, нет?

Miguel ★★★★★
()
Ответ на: комментарий от MyTrooName

в каждой реализации они велосипедятся независимо. это еще хуже

Наоборот, лучше. Потому что в результате никто не может на них завязываться — то есть, какие они, эти правила, становится неважно, они работают чисто как уникальные идентификаторы.

Miguel ★★★★★
()
Ответ на: комментарий от anonymous

Где? Скобки с левой стороны кода и с правой. Внутри - нету.

В таком случае, запятые тоже слева и справа от токенов, но не в середине.

не перегружать синтаксис ascii-артом, очевидно же.

Заменять словами? Будет многословно.

DarkEld3r ★★★★★
()
Ответ на: комментарий от anonymous

Да не нужен тут сложный рантайм.

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

А примеры у тебя как раз такие, что показывают отсутствие необходимости зелёных тредов в рантайме.

DarkEld3r ★★★★★
()
Ответ на: комментарий от Legioner

Макросы хотелось бы видеть более интегрированные с языком. Например размещение их в namespace-ах

Кстати, сейчас как-то конфликты имён вообще можно разруливать? А то я решился поэкспериментировать - ожидал, что на этапе компиляции ругнётся, но нет - выбирается «последний» макрос.

DarkEld3r ★★★★★
()
Ответ на: комментарий от kawaii_neko

<зануда>
При всем уважении, это не тянет на довольно громкое утверждение «И это работает подо всеми доступными архитектурами и компиляторами.» Формально, конечно, к нему придраться нельзя, но обычно такие вещи говорят, когда _разных_ архитектур и компиляторов несколько (вроде x86, ARM, MIPS и т.д.).
</зануда>

eao197 ★★★★★
()
Ответ на: комментарий от DarkEld3r

Заменять словами?

Не надо заменять. Просто убрать.

В таком случае, запятые тоже слева и справа от токенов, но не в середине.

Это уже зависит от форматирования кода, ага. Код с запятыми так не форматируют, а если и форматируют - он выглядит обычно сверхвырвиглазно

anonymous
()
Ответ на: комментарий от anonymous

Не надо заменять. Просто убрать.

Без потери смысла? Покажи. Вон loz свой вариант привёл, но у него достаточно спецсимволов осталось.

Это уже зависит от форматирования кода, ага.

Ты издеваешься? Давай ещё раз - вот в примере с let в лиспе. После «let» будет две скобки. А это уже код.

 (let ((var1 init-form-1)
       (var2 init-form-2)
       ...
       (varm init-form-m))
Или ты пишешь вот так?
 (let 
      ((var1 init-form-1)
       (var2 init-form-2)
       ...
       (varm init-form-m))
И что вообще не бывает скобок внутри строки? С трудом верится. Можешь ссылку на свой код дать?

DarkEld3r ★★★★★
()
Ответ на: комментарий от DarkEld3r

После «let» будет две скобки.

Но на них никто не смотрит.

Без потери смысла? Покажи.

Чтобы знать, как можно заменить эти значки, надо понимать, что они значат. А я не в курсе.

anonymous
()
Ответ на: комментарий от DarkEld3r

И что вообще не бывает скобок внутри строки?

Они могут быть но на них никто не смотрит. Ты видишь let и видишь справа от него два столбика текста, скобки тебе не нужны. Запятые же надо отслеживать в строке, без этого ты не сможешь разделить выражения.

anonymous
()
Ответ на: комментарий от anonymous

Но на них никто не смотрит.

На них не смотрят те, кто привык лисповый код читать. Картинку, конечно, видел? Так вот представь - это работает в обе стороны. На запятых тоже спотыкаются. Если код отформатирован нормально, то они помогают его читать и всё. Ну а кашу из кода и на лиспе изобразить можно.

DarkEld3r ★★★★★
()
Ответ на: комментарий от kawaii_neko

И это работает подо всеми двумя доступными архитектурами и компиляторами.

/fixed

tailgunner ★★★★★
()
Ответ на: комментарий от Miguel

А с этого момента поподробнее, пожалуйста.

http://doc.rust-lang.org/book/trait-objects.html#dynamic-dispatch

короче говоря, полиморфизм а-ля java interfaces на трейтах

Что «если бы»?

там можно делать рекурсивные темплейты. пример выше по треду, Foo<T, Option<Rc<RefCell<Foo<T>>>>. и там же, выше по треду, проблемы, которые такая возможность вызывает именно в контексте ржавчины.

так вот, если бы было можно отказаться от такой рекурсии, было бы прекрасно. но, к сожалению, это не вариант.

Ну, раздельная компиляция — это, вроде как, хорошо, нет?

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

раздельная компиляция - это удобно, но не так уж приоритетно

MyTrooName ★★★★★
()
Ответ на: комментарий от Miguel

Наоборот, лучше. Потому что в результате никто не может на них завязываться

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

Применительно к C++ — это как если бы .o содержал в себе полную копию .h.

.o без .h в cpp бесполезен. так что хоть один другого и не содержит, все равно тащатся вместе.

MyTrooName ★★★★★
()
Ответ на: комментарий от MyTrooName

А нафига она вообще сдалась то? В результате же всё равно приходится городить костыли типа lto для обхода её проблем.

Gorthauer ★★★★★
()
Ответ на: комментарий от Gorthauer

если ты про раздельную компиляцию, то, наверное, ускорение повторных сборок?

MyTrooName ★★★★★
()
Ответ на: комментарий от MyTrooName
Foo<T, RefCell<Option<Rc<Foo<T>>>>

нет, вот так, вроде. ну да не суть

MyTrooName ★★★★★
()
Ответ на: комментарий от DarkEld3r

Ну без изучения, хотя бы поверхностного, ведь и не понять хорош ли язык.

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

cyanide_regime
()
Ответ на: комментарий от MyTrooName

короче говоря, полиморфизм а-ля java interfaces на трейтах

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

там можно делать рекурсивные темплейты

А, ну да.

В нормальных языках (и даже в жабе) рекурсивные дженерики делаются без труда.

раздельная компиляция - это удобно, но не так уж приоритетно

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

Miguel ★★★★★
()
Ответ на: комментарий от MyTrooName

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

Так и отлично. Когда надо — используют extern «C» и всё хорошо. А на тёмные правила манглинга завязаться невозможно, это тоже здорово.

так что хоть один другого и не содержит, все равно тащатся вместе.

Вот только такой .h содержит только интерфейс. А я говорю о том, чтобы взять STL и запихать в объектник. В виде исходного кода.

Miguel ★★★★★
()
Ответ на: комментарий от cyanide_regime

Да мне не интересно мнение фанбоев ржавчины, пишущих на ней без месяца неделю

А озвучь требования к квалификации людей, чье мнение тебе интересно.

tailgunner ★★★★★
()
Ответ на: комментарий от Miguel

Байткод от исходника не отличается ничем. Объектный код от исходника не отличается ничем.

anonymous
()
Ответ на: комментарий от Miguel

В нормальных языках (и даже в жабе) рекурсивные дженерики...

Потому что под капотом у них ссылки. Хотя .Net умеет сам для значений генерировать код(почти как шаблоны). Ссылки по сравнению со значениями дают оверхед - косвенный доступ, повешение вероятности кэш-промаха и пр. Для системного языка не очень подходит.

anonymous
()
Ответ на: комментарий от Miguel

Когда надо — используют extern «C» и всё хорошо.

Чего хорошего? Отказывается от крестов фактически.

anonymous
()
Ответ на: комментарий от anonymous

Не передергивай. Ast - другая форма представления исходного кода.

anonymous
()
Ответ на: комментарий от tailgunner

Так и не должно катить как полемический приём. Ибо это так и есть.

Miguel ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.