Максимумы и минимумы Rust

Перевод статьи The highs and lows of Rust, автор - Jimmy Cuadra

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

Максимумы

Что такого особенного Rust? Короче говоря, это значительно повышает уверенность в том, что мои программы собираются делать то, что я хочу, чтобы они делали без ограничения выразительность. Мой программирование фон с почти полностью динамическими языками, как я в основном работал на вещи для веб-сайтов и других приложений высокого уровня. Люди, которые знают только динамические языки, или люди, которые убежали к ним от подобных Java, боятся статической типизации. Они считают излишне ограничительный характер и в конечном счете, не полезно. Но в моем опыте, программы в динамических языках пронизаны тонкими ошибками. Отсутствие статических результатов набрав в огромном количестве ошибок типа все время. В Ruby, вы видите "NoMethodError: неопределенный метод 'Foo' для ноль: NilClass" так часто, что вы затекать к нему. Вы делаете это все во имя «скорость» и «производительность». В некоторых случаях, вы в конечном итоге писать более лаконичный код. Но вы в конечном итоге с кодом, который вы не можете доверять. Вы пишете библиотеки, что потребители будут нарушать таким образом, что вы не можете предотвратить. Вы не можете написать библиотеку, которая адекватно защищает пользователей от самих себя.

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

Я не одинок в чувство боли динамических языков, таких как Ruby, для построения больших и сложных программ. За последние несколько лет, многие люди приняли Go как их новый язык по выбору. Это было очень популярным языком для людей, приезжающих из Ruby, Python и JavaScript, потому что для многих людей, это обеспечивает такое же ощущение "скорости" и "производительности", которые сделали динамические языки привлекательные, в первую очередь, но и обеспечивает дополнительные преимущества что статическая типизация и вперед-в-время компиляции принести как более надежный код и статические двоичные файлы, которые вы можете просто падение на сервере и запускать без необходимости языковой среды установлен.

Лично я не поклонник Go. По какой причине, я на самом деле гораздо труднее читать, чем Руст, в то время как люди часто говорят, что Руст трудно читать. Общее мнение, кажется, что Go легче учиться и что вы можете в значительной степени ударил землю работает с ним. Ржавчина имеет репутацию, имеющие гораздо более высокую кривую обучения, что, конечно, влияет на его популярность. Я действительно не был в состоянии понять, почему, но как - то Rust просто щелкает с моей ментальной модели программирования Go лучше, чем делает, и хотя это было действительно трудно узнать, как только у меня есть, я чувствую, что это стоит все время его взял, а затем некоторые из них. Go также не обращается ко мне, потому что я не думаю, что он делает достаточно, чтобы заранее состояние искусства. То есть, она не дает, что гораздо больше, чем то, что динамические языки уже делают. Она имеет посредственную систему типа, которая может быть полностью будут нарушены с вещами, как пустые интерфейсы. И это имеет nil ценность, которая является совершенно безумным вещь, чтобы иметь в современном языке. Выбираясь боль nil является одной из лучших частей о выходе Ruby. (Смотрите мой предыдущий пост, типы параметров и Ruby, более подробно об этом.) Go также не является безопасным языком. Хотя многие из них любят ее использование каналов для управления параллельных программ, Go знает только общий изменяемого состояния. Он даже поставляется с детектором гонки данных для отладки параллельных программ. Для меня это является признаком фундаментальной ошибки при проектировании языка. В Русте, расы данных не представляется возможным (если вы используете только безопасный код) из - за его блестящей концепции собственности памяти и заимствования.

Я не пойду на все пункты пули особенности и сильные стороны Руст, так как они хорошо описаны на веб-сайте Rust и различных других статей по данной теме. В то время как язык описывается как "системы языка" и, как правило, предназначены для применения более низкого уровня, мой домен находится в приложения более высокого уровня, и я нашел Rust быть столь же пригодным и сильным для моих целей. Это на самом деле является фантастическим языком общего назначения.

Минимумы

Будучи Ржавчина программист не все приятно, однако. Есть некоторые основные болевые точки в Русте до сих пор. Они в основном имеют отношение к языку и его экосистема будучи очень молодым, достигнув 1,0 статуса меньше, чем год назад, в мае 2015 года наиболее очевидный вопрос с экосистемой просто отсутствие библиотек и незрелость существующих. В более старых и более установленных языков, есть библиотека для почти все, что вы хотите, и для наиболее распространенных потребностей, есть библиотека, которая является боевым протестировано и доверенным. В Русте, очень немногие библиотеки заслуживают доверия. Большая часть программного обеспечения Руст живет на переднем крае. В то время как это неприятно, когда вы просто хотите, чтобы получить что-то сделано, то это также интересно, потому что строительство некоторых из этих необходимых библиотек себе означает, что вы делаете огромный вклад в экосистему. Я пытаюсь помочь проложить путь сам, никогда не говорил: "Я не собираюсь строить X в Русте, поскольку она требует библиотек, которые делают Y и Z, которые еще не существуют." Вместо этого я начинаю на X в любом случае, и строить Y и Z себя тоже, давая все обратно к сообществу.

Возбуждение нового и волнение содействия в сторону, это действительно больно просто получить вещи сделано в Русте много времени. Худшие болевые точки для меня до сих пор являются: 1) отсутствие функции-полной, достоверной библиотеки криптографической и 2) отсутствие функции-полной, стабильной библиотеке сериализации. Я буду решать эти две точки в немного более подробно.

Со всеми разрекламированных уязвимостей безопасности в последние несколько лет (примерно начиная с Heartbleed OpenSSL, и вплоть до недавнего Glibc DNS распознавателя уязвимости) тема об опасности программ, написанных на C придумал много раз. Общее мнение состоит в том, что это просто невозможно написать большую, сложную программу в C безопасно. Даже без истории плохого качества кода и пренебрежения их нуждами в некоторых из этих библиотек высокого профиля C, C является языком движимый страхом сделать критическую ошибку, что слишком легко сделать. Естественно, что люди обсуждают Rust как вероятный кандидат на следующее поколение этих типов библиотек. Хотя это не совсем разумно сейчас, чтобы переписать такие вещи, как OpenSSL в Rust просто из - за того, сколько работы она есть, и сколько программ специально направлены это старое программное обеспечение C, не имея криптографических библиотек в Русте делает его очень трудно писать Руст программы без привязки к одни и те же библиотеки C, которые мы пытаемся избавиться. Это одна из областей, где я завидую Go, которая имеет чисто-Go криптографические библиотеки, которые пригодны для использования в производстве. Есть несколько криптографических библиотек в Русте, в первую очередь кольцо и оксид натрия, но не существует в настоящее время ничего, готовое к использованию или даже использовать в Русте для TLS и создания сертификата X.509 и управления. Лучшее, что вы можете сделать для последнего прямо сейчас раскошеливаться OpenSSL. Более подробное обсуждение по этой теме см мой пост на форуме Руст Internals.

Вторая главная точка боли, и самый массовый один в моем опыте, является сериализации и десериализации. То есть, преобразование между типами Ржавчина и форматы, такие как JSON и YAML. Первоначально сериализации был построен в Rust компилятор, но, как Руст готов к 1,0, много частей, которые когда - то были частью компилятора или самого языка были удалены или извлечены внешние библиотеки для того, чтобы сохранить язык и стандартную библиотеку как малые, как возможное. То, что было когда - то встроенный "сериализации" обрешетка (клеть является термин Руста для отдельной единицы компиляции, по существу, пакет или библиотека) в настоящее время существует в качестве внешнего ящика rustc-сериализации. Было принято решение о том, что подход к этому обрешетке был не самый лучший способ делать вещи на долгий срок, и что он будет спонтировал до тех пор, пока лучше обрешетка может быть создана, в конечном итоге становится де - факто сериализации библиотека для сообщества Rust. В качестве компромисса, компилятор Rust обладает специальными знаниями в области rustc-сериализации, и позволяет автоматически сделать ваши типы ржавчины сериализуемым, поставив специальный атрибут над ними в исходном коде. Тем не менее, с rustc-сериализации будучи своего рода осуждается, ему не хватает некоторых важных функций, как возможность настроить некоторые подробности того, как сериализуется типа. Например, нет никакого способа, с автоматической сериализации rustc-сериализации, чтобы иметь тип ржавчины со змеиным обсаженных полей сериализации в формате JSON с более низкими верблюжьих обсаженных полей.

Сегодня у нас есть Serde, большую библиотеку сериализации Эриком Tryzelaar, который, вероятно, будет де - факто сериализации библиотека каждый надеется. К сожалению, Serde не пользуются той же специальной обработки, что компилятор дает rustc-Serialize, и поэтому история использования Serde гораздо сложнее. Для того, чтобы сделать тот же самый тип автоматической сериализации, что rustc-сериализации делает, Serde имеет суб-клеть, который работает в качестве компилятора плагин сделать генерацию кода, превращая специальный атрибут в полной реализации так же, как rustc-сериализации. Загвоздка в том, что модули компилятора неустойчивая особенность Руст, то есть они доступны только в ночных выпусках ржавчину, а не на стабильной Rust 1.x или даже бета - версии. Можно использовать автоматическую сериализацию Serde на стабильной Руст, но это требует некоторого умного, но очень Hacky косвенность. Один из ящиков под организации serde на GitHub является Синтекс, который буквально форк частной "libsyntax" обрешетка ржавчину компилятора, который компилирует на стабильную Rust. При использовании Serde на устойчивой от коррозии, Serde генерации кода обрешетка использует Syntex вместо реального Rust компилятор для генерации кода с сериализации реализован на отдельном этапе сборки, прежде чем ваша программа составлена. Есть некоторые уродливые края к этому, в том числе необходимости иметь две копии каждого исходного файла в вашей программе (один с кодом для обработки Serde + Синтекс и один для включения файла он генерирует). Кроме того, необходимо иметь сценарий сборки, который вручную определяет, какие исходные файлы должны пройти через этот процесс. Поскольку плагины компилятора в потоке внутри компилятора Rust, есть частые изменения libsyntax, каждый из которых требует новой версии Синтекс будет выпущен, и неизбежно вызывает водопад сломанных программ вниз по цепочке зависимостей как новые версии Rust и Синтекс выкатываются. Это происходит каждые несколько недель, и это кошмар, чтобы идти в ногу с. В результате, любая программа нетривиального размера, который нуждается в сериализации действительно лучше просто придерживаться ночных Rust. Но так как не каждая библиотека имеет ночные Rust в виду, иногда вы в конечном итоге с зависимостями, которые не работают хорошо вместе, и вы застряли в спираль делает тривиальные исправления для библиотек других людей, так что вы можете получить свой ​​собственный для компиляции. Весь этот вопрос не то, что я бы ожидать от языка, который достиг 1,0 для чего - то по мере необходимости и повсеместным, как сериализации данных. Ник Кэмерон работает над новой системе макросов для Руст, который в конечном итоге сделать то, что компилятор плагинов используются для прямо сейчас, но эта новая система не существует даже еще, так что это будет довольно много времени, прежде чем она делает его стабильным Ржавчина. Ближайшее будущее чувствует себя очень мрачным по этому вопросу.

Вы используете Rust?

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