Многие люди рассуждают так: «зачем, ну зачем мне изучать еще один язык программирования?» Для них это лишнее, и они стараются максимально этого избегать.
Разве того, что есть, недостаточно?
Разве инструменты, которые у нас уже есть, не работают?
А есть неутомимые искатели, которые никогда не отказываются от возможности попробовать что-то новое и случайно наткнуться на какую-нибудь «конфетку». Для них обучение – это самоцель, и их не нужно долго уговаривать на то, чтобы потратить все выходные на создание консольной карточной игры на каком-нибудь новом непонятном языке.
Неважно, к какому лагерю вы принадлежите, есть одна бесспорная вещь: мы все готовы потратить время на то, чтобы обеспечить себе светлое будущее.
Что касается людей из лагеря любителей пережитков прошлого, их горячо любимый язык уже имеет хорошую динамику, и у него вполне есть светлое будущее. Но я должен напомнить им, что их уже состоявшийся набор инструментов для разработки, которые они так любят, когда-то был тем, чем никто пользоваться не хотел. Так и сейчас; приходят новые технологии, готовые помочь в решении новых проблем и облегчить трудности разработки.
Если что-то начинает делать это довольно основательно, то, вероятнее всего, оно продолжит завоевывать популярность и добиваться лучших результатов. А когда происходит такое, то, я думаю, вы не захотите оставаться в сторонке.
А для тех, кто любит все новое, есть предупреждение: развлечение – это важно, но стоит быть осторожным, чтобы не тратить свою энергию бесцельно.
Понятное дело, что Brainfuck – это очень запутанный язык, чем-то похожий на головоломку, он довольно забавный и небольшой, однако вам вряд ли пойдет на пользу серьезное изучение этого языка. Вам нужно что-то новое, толковое и то, у чего есть прочная основа.
Как выбирать такие языки
Процесс выбора языка кажется устрашающим, особенно если речь идет о новых языках, которые могут подарить вам преимущество при устройстве на работу и просто удовольствие. Каждый автор языка твердо убежден, что создал идеальный язык, который способен решить все проблемы. Как же тогда выбирать?
В этой статье я сделал акцент на нескольких параметрах, которые помогут вам осмысленно подойти к выбору.
Дата выхода
Я намеренно избегал очень и очень новых языков.
Под «новыми» я имею в виду языки, которым на момент написания статьи было не более 5-6 лет, и особенно те, которые не являются стабильными (то есть, это выпуски под версиями 1.0). Но я надеюсь, что когда-нибудь я вернусь к этому и напишу и об их успехе.
Как по мне, золотая середина – это 5-12 лет. Язык уже стабилизировался, и он только дорабатывается. Есть, конечно, исключения из правил, и они будут рассмотрены в соответствующих случаях.
Огромный интерес сообщества
Это и ежу понятно, но этот момент довольно часто игнорируют, особенно когда речь идет о чем-то новом и волнующем. На сегодняшний день многие считают, что поддержка крупной компании гарантирует успех, но это далеко не всегда так.
Безусловно, Objective-C от Apple, а сейчас и Swift, процветали, поскольку это были единственные варианты для строго контролируемой экосистемы, а вот D и Hack от Facebook (как по мне, это безобразная версия и без того безобразного языка) так и остались не более, чем просто экспериментами.
Идеальная комбинация – это язык, который бы имел поддержку крупной стабильной компании и который бы активно набирал популярность (например, React).
Но соль вопроса по-прежнему заключается в сообществе. Если язык не вызывает ажиотажа, а для обучения и популяризации не хватает разработчиков, то он не сможет выбраться из «ямы» GitHub.
Для меня этот момент отметает такие развитые и интересные языки, как Racket и Erlang, поскольку они никак не продвинулись по кривой роста.
Целенаправленное и четко сформулированное уникальное торговое предложение
Третье, на что я обращаю внимание, - это четкая цель языка. Например, лучшая версия PHP, в которой исправлены проблемы с именами и которая компилируется в нативный PHP, не для меня.
Слишком мало преимуществ для того, чтобы оправдать взломы, если вдруг все попробуют перейти на эту версию. По тому же критерию, я не могу не сбросить со счетов такие затеи, как CoffeeScript и многие другие языки, компилируемые в JavaScript.
Если честно, я сразу же при любом раскладе откажусь от улучшений, связанных с синтаксисом. Как показывает практика, когда речь идет о языках, полноценность берет верх над удобством, поэтому если новый язык уделяет большое внимание более приятному взаимодействию, то, увы, он в этот список не попадет.
Понятный и непротиворечивый синтаксис
Да, я знаю. Я только что говорил о том, что синтаксис не имеет значения. Ну, а если быть более точным, то я сказал, что «улучшения, связанные только с синтаксисом» не имеют значения. Но надо отметить, что синтаксис остается одним из значимых факторов, влияющих на продуктивность программиста и легкость сопровождения. Именно поэтому он точно будет присутствовать в моих выкладках.
Вместе с понятием «синтаксис» на ум приходит «согласованность». Есть ключевые моменты, в которых язык просто не может позволить себе ошибиться: именование функций, структурирование модулей и т.д. На дворе 2018 год, и, ради всего святого, очередной PHP-подобный язык станет позором для всех нас. Так что, без лишних слов, давайте начнем с наших лучших рекомендаций.
1. Julia
Для сотрудников MIT выбор языка, который можно было бы использовать для науки о данных, в лучшем случае был компромиссным. Несмотря на всю свою понятность и популярность, Python не имел встроенных конструкций для работы с объектами данных. Более того, поскольку Python – это интерпретируемый язык, он был для них довольно медленным (заметьте, что речь идет не о библиотеках, так как они по большей части написаны на C).
Вполне возможно, что самыми отпугивающими моментами были довольно корявая модель многопоточной обработки данных и отсутствие модели параллельных вычислений (а последнее является основным элементом суперкомпьютеров).
В результате, на свет появился такой язык, как Julia.
Стабильная версия Julia вышла лишь 29 сентября 2018 года, а это всего за несколько дней до того, как эта статья была написана (вот вам и сроки!). Вот что говорится о его возможностях на официальном сайте:
Julia превосходит других по части численных вычислений. Его синтаксис идеален для математики, он поддерживает большое количество числовых типов данных, и у него уже есть встроенный параллелизм. Множественная диспетчеризация Julia идеально подходит для определения числовых и массивоподобных типов данных.
Что касается синтаксиса, Julia представляет собой комбинацию Python и С. Да, возможно, это первый случай, когда языку удалось совместить в себе лучшие качества и того, и другого.
Дабы сделать работу более простой, Julia не требует строгой типизации и сам по себе невероятно быстрый. Вот некоторые данные для сравнительной оценки:
Официальные ориентировочные показатели Julia
Как вы можете видеть, Julia чуточку хуже, чем С, но при этом разносит Java и Python в пух и прах. Что же такого привлекательного нам предлагает Julia?
Что ж, вот, например, реализация функции, которая вычисляет гипотенузу прямоугольного треугольника:
В итоге, несмотря на то, что большая часть экосистемы Julia направлена в сторону математики, я считаю, что у нее есть большое будущее и в других областях.
Насколько я знаю, это первый язык, который поддерживает параллельные вычисления на высшем уровне. Так что, совсем неудивительно, что он набирает популярность в областях веб-технологий и Интернета вещей.
2. Rust
Если вы пробовали работать с новыми версиями Firefox, то вы должны были понять, что, наконец-то, после стольких лет работы, они вполне могут отобрать часть рынка у Chrome.
Браузер стал легким и очень быстрым, а рендеринг выполняется практически мгновенно, и все это благодаря языку, который Mozilla разработала специально для этого браузера. И это Rust.
Если я скажу, что у Rust впереди большее будущее, то совру; язык уже имеет огромный успех, и если вы еще не слышали о нем, это потому, что его область применения довольно узкая, а цель его создания довольно пугающая – заменить С++! Да, в кои-то веки у нас появился язык, который не просто способен это сделать, но и уже начал.
Для людей, которые недовольны перегруженной структурой С++ и проблемами управления памятью, Rust станет глотком свежего воздуха.
Вот так выглядит программа, написанная на Rust:
По мне, просто и со вкусом. Rust придерживается подхода функционального программирования, который делает ваш код более пригодным для компоновки, и здесь нет никаких объектно-ориентированных иерархий, над которыми надо было бы ломать голову.
Так что же придает Rust смелости претендовать на место С++? Новая модель памяти. Вместо старой игры new()/delete() Rust ввел понятие «владение».
Вместо того, чтобы выделять память и обращаться непосредственно к ней, переменные в Rust «заимствуют» друг друга, следуя при этом строгим ограничениям, которые накладывает компилятор. Общая концепция слишком сложная для того, чтобы объяснить ее в нескольких словах, поэтому смело обращайтесь к официальной документации, чтобы узнать больше.
Суть в том, что таким образом обеспечивается 100% безопасность памяти, и при этом не нужно использовать сборщик мусора, что является довольно важным моментом.
Rust в одночасье завоевал весь мир. Некоторые платформы уже его поддерживают; он позволяет браузерам и механизмам визуализации быстро заменять код С/С++ в промышленных системах; кроме того, его используют для написания операционных систем.
Конечно, процесс создания очередного браузера или драйвера устройства не для всех, но Rust уже перекинулся и на другие области. У нас уже есть несколько полнофункциональных и дико быстрых веб-фреймворков, написанных на Rust, и разрабатывается все больше и больше библиотек для приложений.
По правде говоря, если вас интересует светлое будущее, то Rust – идеальный язык, и сейчас самое время начать его изучать. Rust – это своего рода самолет, который уже оторвался от земли, но все еще есть время на то, чтобы подняться на борт и устремиться к звездам.
3. Elixir
Если говорить о языках, которые для разработчиков словно маленький кусочек счастья, то первое место здесь занимает Ruby, и это окончательно и бесповоротно. Это язык, который звучат как поэзия. Кроме того, у него достаточно сокращений, которые на порядок сокращают объем умственной работы.
Поэтому вполне естественно, что фреймворк Rails продолжает властвовать в области полностековой разработки среди серьезных разработчиков и стартапов. Однако Rails устраивал не всех, в особенности одного из его основных разработчиков - Хосе Валим. Я думаю, что лучше всего процесс возникновения этого языка описал сам создатель в одном из интервью:
Это длинная история, но я постараюсь не растягивать ее и изложить ее в более легкой и приятной форме. Еще в 2010 году я работал над улучшением производительности Rails при работе с многоядерными системами, поскольку наши компьютеры и производственные системы поставлялись с все большим количеством ядер. Однако что бы я ни делал, результата не было, так как у Ruby не было подходящего инструмента, с помощью которого можно было бы решить проблемы с параллелизмом. Вот тогда я начал изучать другие технологии и в один прекрасный момент я влюбился – влюбился в виртуальную машину Erlang.
Я начал применять Erlang в работе все больше и больше и со временем я заметил, что мне не хватает некоторых конструкций, которые есть во многих других языках, в том числе и в функциональных. И в тот момент я решил создать Elixir в качестве попытки объединить различные конструкции и отличные инструменты вместе с виртуальной машиной Erlang.
И о чудо, на свет появился Elixir!
Аналогично тому, как Scala совершенствует Java, но на самом деле устанавливает ориентир на виртуальную машину (JVM), Elixir использует в своих интересах преимущества уже проверенной десятилетиями виртуальной машины Erlang.
На данном этапе разговоры об Erlang выходят за рамки данной статьи, но вы, как минимум, должны знать, что это секрет телекоммуникационной отрасли, который очень тщательно охраняется: если уж наши телефонные сети намного надежнее, чем наши веб-системы, то это все благодаря Erlang.
Если говорить еще более простыми словами, то это значит следующее: если вы создаете систему, работающую в режиме реального времени, например, какой-нибудь чат, то Elixir будет требовать гораздо меньше оперативной памяти, нежели Ruby (или PHP, Python и, чего уж там, Java), а также будет более стабилен.
Компьютер, запускающий Ruby и использующий на максимум 10 000 одновременных подключений, может с легкостью обрабатывать 200 000, если будет использовать Elixir, и при этом у него будет достаточно оперативной памяти для того, чтобы запускать 2D-игры!
Фрагмент кода Elixir
Что касается синтаксиса, Elixir бессовестно копирует Ruby, а его главный веб-фреймворк (Phoenix) точно также бессовестно копирует Rails. По-моему, эта даже хорошо, поскольку, если сравнивать с Laravel, Grails, Masonite и т.д., мы подошли к той точке, где все языки имеют фреймворки, подобные Rails, который могут облегчить переход от одного фреймворка к другому. Некоторые могут глумиться над «отсутствием оригинальности», но, во всяком случае, я не жалуюсь.
В конечном счете, Elixir – это одна из тех технологий, которая привносит какую-то новизну и, к тому же, удобная и чертовски практичная. Несколько центров разработки, использующие Ruby (и не только), переходят на Elixir, и крупные компании, такие как Pinterest, стали использовать его в разработке с весьма впечатляющими результатами.
Многие люди думают, что Node.js был временной попыткой создания параллелизма, и Elixir его вскоре заменит. Надо сказать, я с этим согласен.
4. Kotlin
В 2017 году Google I/O сбросил «бомбу» на ничего не подозревающую толпу. Компания официально объявила о том, что Kotlin стал основным языком разработки для Android. Это породило волну возмущений в отрасли.
На сегодняшний день, нет ничего удивительного в том, что Google активно ищет замену Java, особенно после судебного иска Oracle; и тем не менее, переход на Kotlin стал несколько неожиданным, и все еще велика вероятность того, что Google в скором времени выпустит свою собственную виртуальную машину. Впрочем, пока что Kotlin наслаждается волной популярности.
Kotlin был разработан компанией JetBrains, которая более известна благодаря своей серии безумно хороших редакторов кода. Один из таких редакторов – IntelliJ IDEA, составляет основу Android Studio. Kotlin разрабатывался с несколькими целями: безопасность, лаконичность и 100% совместимость с Java.
Компилятор Kotlin, как никакой другой, упорно работает над устранением любых исключений нулевого указателя, которые очень распространены в Java. Кроме того, он отчасти решает проблемы с широко известной многословностью Java, что стало облегчением для многих людей.
Ниже приведено сравнение кода Java и Kotlin:
Графические материалы: hype.codes
Код Kotlin имеет значительно более короткую форму и гораздо меньшую когнитивную нагрузку при выполнении.
Но давайте проясним одну вещь: хоть Kotlin стремительно становится фаворитом, крайне маловероятно, что он заменит Java. Я полагаю, что десятки лет спустя, небольшие команды не будут смотреть ни на что, кроме Kotlin, а вот большие будут по-прежнему использовать Java исключительно в силу устоявшихся причин.
Как бы то ни было, у Kotlin большое будущее, поскольку он делает тоже самое, что и Java, может объединяться с кодом Java так, чтобы никто не заметил, но при этом он более приятный!
5. TypeScript
Одному Богу известно, как я сдерживал себя, чтобы не поставить на это место другой язык! Все внутри меня кричало: «Elm! Elm!», но не имеет значения, насколько революционны его идеи и насколько божественный у него синтаксис, Elm по-прежнему не рассматривается в качестве типичной альтернативой для работы с интерфейсом. Как бы то ни было, давайте взглянем на то, что является типичным – TypeScript.
JavaScript как дикие ягоды: противный и неприятный, но вам придется его переварить, чтобы выжить в джунглях frontend-разработки. Было предпринято большое количество попыток заменить его (и, вполне вероятно, новый стандарт WebAssembly преуспеет в этом), но есть одна вещь, которая по-настоящему привлекла всеобщее внимание, – надмножество, которое разработала компания Microsoft.
Вероятнее всего, вы уже слышали о TypeScript: первым его начал использовать фреймворк Angular (начиная со второй версии), и люди довольно быстро обратили на него внимание. Все потому, что TypeScript добавил крайне необходимые и просто потрясающие сверхвозможности к самому известному языку программирования в мире.
Да, наконец-то можно писать собственный код JavaScript, не мучаясь и не думая «зачем я вообще родился»!
Вот какие дополнительные возможности привнес TypeScript:
? Строгая типизация: в конце концов, строка – это не число, а число – это не объект, который не является пустым массивом!
? Проверка типов, выполняемая во время компиляции: если ваш код компилируется должным образом, то в нем по большей части не будет проблем, связанных со средой выполнения JavaScript.
? Классы и модули: да, для ES6 классы – это стандартная вещь, но они также есть и в TypeScript, и, более того, в нем есть аккуратная система модулей.
? Определение типа: что касается сложных типов, то компилятор может с легкостью его определить, и вам не нужно будет ломать голову.
? Async/await: ключевые слова и шаблоны async/await – это основа, поэтому вам больше не нужно тратить свое время на промисы и обратные вызовы.
Пространство имен, обобщения, кортежи… я мог бы продолжать бесконечно, но достаточно сказать, что TypeScript превращает один из худших процессов разработки в один из лучших.
Фрагмент кода TypeScript
Тот факт, что TypeScript оказал влияние, нельзя отрицать. Он вывел из игры такие эксперименты, как Dart от Google (правда, он пытается вернуться в игру за счет Flutter – фреймворка для мобильной разработки), и открыл глаза JS-разработчикам на преимущества более сильных типов.
Как результат, такие значимые библиотеки, как React, D3, Vue (и даже jQuery!) теперь имеют версию для TypeScript, а лучшие предприятия промышленности программной продукции по всему миру переписывают код JavaScript на TypeScript. А теперь заголовки TypeScript можно использовать и в Node.js (по правде говоря, если Node сможет усовершенствовать свой параллелизм и исправить дурацкое управление памятью, то он будет существовать вечно).
Возможно, вы удивитесь, но создатель Node.js после того, как публично заявил о том, что он сожалеет о своей разработке, начал работать над новой средой выполнения (официального сайта пока еще нет, есть только репозиторий на GitHub), и ее основным языком является TypeScript.
Знаете, какая самая приятная новость? TypeScript – это небольшой язык, изучение которого принесет свои плоды в будущем. Если вы – разработчик JavaScript среднего уровня, то вы вполне можете за пару дней освоить TypeScript в достаточном объеме, чтобы полностью перенести свой существующий код на него!
6. Elm
Elm быстр настолько, насколько быстро можно произнести его название. Он используется для клиентских приложений, графики и игр. Этот функциональный язык программирования был создан в 2012 году Эваном Чаплицки.
По слухам, Elm не выдает исключений на этапе выполнения – вот где он блистает. Поскольку это язык со статической типизацией, компилятор проверяет код на наличие ошибок во время компиляции (вау!) и выдает удобные сообщения (эти сообщения представляют собой полноценный текст, а не причудливые коды).
Здесь разработчики (отладчики!) должны вздохнуть с облегчением. Вы сможете научиться писать Elm-код, поскольку будете получать больше информации об ошибках – компилятор подскажет вам, что не так, и предложит способ исправить эту проблему!
Elm может похвастаться тем, что он быстрее, чем React и более строго типизирован, нежели даже TypeScript. Elm-код довольно структурирован и лаконичен. С его помощью вы сможете преуспеть в карьере разработчика.
Elm является модульным, а, значит, вы сможете создавать компоненты, которые можно будет использовать повторно. Elm компилируется в JavaScript, который можно запустить в браузере. Итак, все, что вам нужно, это node и npm, и вы сможете с легкостью установить и начать работу с Elm с помощью следующей команды:
npm install -g elm@<version>
Вы можете установить ту версию, которую захотите, например, 0.19.1.
После чего вы можете проверить, правильно ли был установлен Elm, выполнив команду –version. Если вы пока не хотите производить полноценную установку и настройку, то можете зайти на их официальный сайт и воспользоваться онлайн-редактором и поэкспериментировать.
Итак, давайте тогда немного поэкспериментируем!
Если вы будете пользоваться не онлайн-компилятором, то вам придется установить все зависимости, которые будут нужны для программы, которую мы сейчас напишем (впрочем, это не так уж и сложно).
Давайте попросим пользователя ввести свое имя в текстовое поле и напечатаем его на приветственной странице.
import Browser
import Html exposing (Html, Attribute, div, input, text)
import Html.Attributes exposing (..)
import Html.Events exposing (onInput)
-- MAIN
main =
Browser.sandbox { init = init, update = update, view = view }
-- MODEL
type alias Model =
{ content : String
}
init : Model
init =
{ content = "" }
-- UPDATE
type Msg
= Change String
update : Msg -> Model -> Model
update msg model =
case msg of
Change newContent ->
{ model | content = String.append "Hello..." newContent }
-- VIEW
view : Model -> Html Msg
view model =
div []
[ input [ placeholder "Type your name", onInput Change ] []
, div [] [ text (model.content) ]
]
Вот так выглядит начальный экран при сборке программы:
Начальный экран
Вводим имя, и вот, что мы получаем на экране:
Экран с результатом
Несмотря на то, что эта программа может показаться слишком крутой для своего назначения, по мере того, как сложность программы будет увеличиваться, вы ощутите, насколько легко ее стало отлаживать и сопровождать.
Вы можете увидеть, что модель (model), представление (view) и контроллер (controller) (обновление (update)) четко разделены. Подобно тому, как мы применяем HTML-теги, мы можем создавать в Elm формы с помощью div-тегов модели.
При возникновении события onInput (то есть когда пользователь вводит текст) программа вызывает Change и печатает «Hello» вместе с именем пользователя, используя функцию String.append.
7. Pony
Pony – это компилируемый язык программирования. Он придерживается модели акторов, которая предназначена для асинхронного поведения, то есть для приложений с высокой степенью многопоточности.
Обычные языки программирования используют функцию «блокировки» для выполнения параллельных вычислений, а это влияет на производительность. У Pony такой функции нет, таким образом, это позволяет избежать блокирования операций или взаимоблокировки. Каждый актор является однопоточным.
Кроме того, Pony обеспечивает безопасность на основе мандатный ссылок, то есть пользователи для того, чтобы получить доступ к какому-то конкретному объекту, должны воспользоваться «мандатной ссылкой». Таким образом обеспечивается безопасная обработка данных. Например, мандаты содержат сведения о том, какие псевдонимы допустимы, а какие нет.
Мандаты лежат в основе таких понятий как «изменяемость» и «изоляция». Такие запреты избавляют Pony от гонки по данным.
Pony – безопасный, быстрый и точный язык. Он сокращает время, затрачиваемое на разработку, что делает его отличным вариантом для банковских и финансовых приложений.
Pony гарантирует безопасность типов при обработке данных. Он не выдает никаких исключений – для того, чтобы код был скомпилирован, ошибки должны быть устранены. Главным образом, это происходит потому, что Pony имеет статическую типизацию. Перед тем, как использовать переменную, вам нужно явно указать ее тип (например, как в Java, но не в Python).
let name: String
Здесь, как и в Java, вы можете создавать конструкторы. Допустим, что у вас есть класс Employee, в котором указаны имя (name) и возраст (age):
class Employee
let name: String
let age: U64
new create(name': String) =>
name = name'
Java-разработчики должны были заметить, что есть небольшие отличия в синтаксисе (вау! никаких фигурных скобок!). А после атрибутов класса стоят кавычки. Кроме того, вы можете создавать функции:
fun get_emp_name(): String => name
Писать функции очень занятно, не так ли?
А теперь самое главное – акторы и промисы.
У акторов есть Behaviors (поведения) – что-то на подобие функций, но выполняющихся асинхронно. Они выполняются в какой-то момент времени в ближайшем будущем, по не всегда сразу после того, как они были вызваны. Но они «обещают» (promise), что behaviors будут обязательно выполнены.
actor Employee
// actor has fields, similar to class { // у актора есть такие же поля, как и у класса }
let name: String
// and of course, constructor { // и, конечно же, конструктор }
new create(name': String) =>
name = name'
// Note the behaviour 'be' instead of the fun function { // обратите внимание, что вместо функции fun здесь указывается поведение be }
be get_emp_name(promise: Promise[String]) => promise(name)
Что ж, промисы могут быть отклонены, и еще как. Это может произойти, если актор не в состоянии выполнить отправленный асинхронный запрос. Вы можете создать промис:
// Create a new promise { // Создаем новый промис }
let promise = Promise[String]
И вызвать поведение актора путем передачи промиса (обещания), который должен быть выполнен (в нашем случае, мы должны получить имя сотрудника).
employee.emp_get_name(promise)
Как вы думаете, этот код скомпилируется?
У Pony есть еще одна замечательная особенность – он безопасен в том, что касается памяти, то есть у него не бывает NULL-значений и переполнений буфера. Любой код, который может вернуть null, не будет скомпилирован до тех пор, пока этот момент не будет исправлен.
Что ж, мы все еще не сообщили программе, кто же такой employee (сотрудник) (наш актор):
let employee = Employee(“J K Rowling”)
В отличие от любого другого языка программирования, Pony разрешает делить на ноль и выдает в качестве результата ноль. И для всех функций Pony есть математические доказательства.
Для того, чтобы писать программы на Pony, вам нужно установить соответствующий компилятор. Pony – это все-таки компилируемый язык, поэтому прежде чем запускать программу, вы должны ее скомпилировать с помощью команды ponyc.
После того, как вы установите компилятор, попробуйте написать и запустить программу «hello. world».
8. Vyper
Vyper – это язык программирования, предназначенный для написания смарт-контрактов. В его основе лежит Python. Как и Python, он удобен для восприятия человеком, прост в написании и безопасен. Vyper компилируется в байт-код виртуальной машины Ethereum (EVM – Ethereum Virtual Machine). EVM определяет состояние эфира для каждого блока в блокчейне.
Для того, чтобы понять, в чем заключается особенность Vyper, давайте разберемся, что же такое смарт-контракты.
Смарт-контракты – это программы, которые хранятся в блокчейне. Они определяют соглашение между продавцом и покупателем и при выполнении условий контракта исполняют его.
Это самоисполняющиеся автоматические контракты, которые не требуют человеческого вмешательства. Впрочем, смарт-контракты подвержены уязвимостям.
Например, смарт-контракты могут быть созданы для того, чтобы передавать эфир по произвольным адресам, или они могут быть уничтожены произвольными адресами, или у них и вовсе может не быть возможности передавать эфир. Такие уязвимости, как правило, внедряются посредством кода, причем это можно сделать как намеренно, так и непреднамеренно.
Vyper устраняет эту проблему за счет предоставления безопасного кода. Это затрудняет внедрение уязвимого кода или кода, вводящего в заблуждение. Несмотря на то, что в основе Vyper лежит Python, он практически не придерживается парадигм ООП, куда относятся наследование, перегрузка, рекурсия и т.д. Это помогает избежать усложнения кода (наличие нескольких файлов усложняет процесс аудита).
Кроме того, Vyper не поддерживает встроенный ассемблерный код, а это значит, что программы не могут выполнять действия непосредственно в EVM. Таким образом можно избежать атак.
Все эти особенности делают Vyper достаточно безопасным для того, чтобы писать на нем код для смарт-контрактов, которые используются в блокчейне.
Для того, чтобы отработать навыки по написанию программ на Vyper, вы можете воспользоваться онлайн-компилятором Remix.
Кроме того, вы можете установить Vyper с помощью docker или pip (если у вас есть Python). Для этого следуйте инструкциям, представленным в документации Vyper.
9. R
R – это один из самых популярных языков программирования, который применяется для анализа данных и машинного обучения. У него есть API для всех сложных математических, статистических и научных расчетов, алгоритмов машинного обучения и визуального представления данных.
R имеет открытый исходный код, и он широко известен за счет своего графического пользовательского интерфейса с большими функциональными возможностями. У него активное и солидное сообщество, и, кроме того, он может интегрироваться с другими языками, например, С, С++ и т.д.
Все функции, которые мы перечислили выше, мы добавляем из CRAN (Comprehensive R Archive Network). Этот репозиторий содержит более 10 000 пакетов для таких областей, как статистика, теория вероятностей, анализ данных, вычисления, графика и т.д.
Давайте попробуем запустить простую программу, которая вычисляет среднее 11 чисел, и увидим всю магию R. Для того, чтобы найти среднее значение, мы должны взять сумму чисел и поделить ее на их количество (в нашем случае 11). Но в R есть функция, которая называется «mean» и которая выполняет все эти вычисления за нас.
mynums <- c(51, 52, 53, 94, 88, 61, 31, 34, 76, 20, 10)
mean(mynums)
Результат будет следующий:
[1] 51.81818
Мы можем изобразить график с помощью метода plot:
boxplot(mynums)
В R есть огромное количество расширенных пакетов, например, ggplot2, dplyr и т.д., которые позволяют отображать богатую графику.
Кроме того, мы можем оперативно построить гистограмму для значений выше, чтобы увидеть диапазон, в который они входят.
hist(mynums, breaks = 10, col = "sky blue", main = "Histogram of marks", xlab = "Height B
Отметим, что мы выбрали шаг 10, но вы можете изменить его в зависимости от того, какие деления вам нужны.
Переменная mynum, приведенная выше, - это вектор, который содержит список чисел. Здесь, как и в Python, для того, чтобы работать с большим количеством измерений, мы создаем фрейм данных (dataframe).
В большей степени это полезно для анализа данных. Например, мы можем соединить несколько векторов, создать фрейм данных и манипулировать ими, исходя из количества переменных и типа анализа.
Предположим, что у нас есть векторы name, skill и age. Мы можем создать фрейм данных и отобразить на экране все данные совместно:
employees = data.frame(Name = c("John","Mac","April","Ron","Matt"),
Age = c(23,28,30,43,31), Skill = c("Java", "Python", "C++", "R", "PHP"))
print(employees)
> print(employees)
Name Age Skill
1 John 23 Java
2 Mac 28 Python
3 April 30 C++
4 Ron 43 R
5 Matt 31 PHP
У R есть еще одна довольно интересная особенность. Он позволяет производить манипуляции с матрицами без каких-либо усилий. R просто сразит вас наповал тем, как он с легкостью выполняет вычисления с матрицами. Все, что он вас требуется, это создать матрицу и передать ее программе.
M1 <- matrix(c(1, 2, 1, 2), ncol=2)
M2 <- matrix(c(3, 4, 3, 4), ncol=2)
print(M1*M2)
>print(M1*M2)
[,1] [,2]
[1,] 3 3
[2,] 8 8
10. Apache Groovy
Я тщательно все обдумал, взвесил все за и против и решил все же добавить Groovy в свой список лучших языков программирования. Этот язык словно кусочек тающего масла на вкуснейшем пироге, который придает ему дополнительный вкус, - делает лучше любой проект.
Одна из основных причин, по которой Groovy заслужил место в этом списке, - это широкий спектр функций, который внес свой вклад в рост его популярности в рамках мира технологий. Это гибкий динамический язык, предназначенный для виртуальной машины Java (JVM – Java Virtual Machine). Он предоставляет Java-разработчикам современные программные средства, и при этом имеет минимальную кривую обучения.
Важно отметить, что JVM – это аббревиатура, которая расшифровывается, как «Java Virtual Machine», так что JVM – это неотъемлемая часть Java, которая предоставляет платформу, с помощью которой можно запустить байт-код Java на любом устройстве. Groovy был создан на основе JVM, и он предлагает широкий спектр функций, которые повышают его производительность, что делает его довольно привлекательным для разработчиков.
Если простыми словами, то он предоставляет платформу, с помощью которой можно запускать байт-код Java, а это, в свой очередь, позволяет использовать Java на любых устройствах. Если смотреть с точки зрения производительности, Groovy может статически проверять соответствие типов и компилировать ваш код, что повышает производительность и уровень надежности.
Groovy может полностью интегрироваться с уже существующими классами и библиотеками Java, что выделяет его на фоне других языков программирования. Кроме того, он может компилироваться сразу в байт-код Java. За счет этого он позволяет без проблем использовать его везде, где можно использовать Java. Эта функция делает Groovy еще более гибким и универсальным, а также идеальным вариантом для разработчиков, которые хотят разрабатывать эффективное и надежное программное обеспечение.
У Groovy есть один потенциальный недостаток: Groovy – динамический язык, и это может сделать проверку соответствия типов проблематичной, а процесс отладки сложным. И тем не менее, многие программисты считают, что гибкость и простота Groovy перекрывают все потенциальные недостатки.
Для разработчиков очень важно понимать, какой уникальной ценностью обладает Groovy. Для того, чтобы проиллюстрировать это, я бы хотел показать вам пример, который демонстрирует то, как мощные функции Groovy способны повысить качество вашего кода.
def greeting = "Hello, World!"
println greeting
// Define a list of numbers { // Определяем список чисел }
def numbers = [1, 2, 3, 4, 5]
// Use a closure to map the list to its squares { // Используем функцию-замыкание для того, чтобы преобразовать список в список квадратов }
def squares = numbers.collect { it * it }
println squares
Этот пример иллюстрирует многогранность и выразительность Groovy. Здесь определяется строковая переменная, после чего выводится в консоль с помощью функции println.
Кроме всего прочего, мы демонстрируем то, как Groovy упрощает сложные операции, например, преобразование числового списка с помощью функции-замыкания с целью создать новый список, который бы содержал квадраты всех чисел. Это говорит о том, что Groovy может повысить вашу продуктивность как разработчика за счет решения шаблонных задач программирования с помощью краткого и удобного для восприятия синтаксиса.
В связи с этим, становится очевидным тот факт, что Groovy заслужил, чтобы на него обратили внимание.
11. Crystal
Проведя довольно масштабные исследования, мы просто не могли не включить Crystal в этот список. И нет, речь идет не о полезных ископаемых! Crystal – это универсальный объектно-ориентированный язык, который был выпущен в 2014 году. Он был разработан так, чтобы его синтаксис напоминал Ruby, но при этом он был быстрым и эффективным. За счет своей системы статических типов и компиляцией перед исполнением Crystal предлагает вниманию разработчиков скорость С и простоту Ruby.
Crystal – это относительно новый язык программирования, который завоевывает популярность среди разработчиков за счет своей впечатляющей скорости и простоты использования. Очень часто о нем говорят так: «быстрый, как С, ловкий, как Ruby», подчеркивая таким образом его способность обеспечивать очень высокую производительность при поддержке простого синтаксиса Ruby и высокой степени читаемости.
И тем не менее, достигая своей впечатляющей скорости, Crystal жертвует некоторыми динамическими аспектами Ruby и стесняет определенные программные конструкции. Несмотря на все это, такое компромиссное решение привело к тому, что Crystal стал довольно заманчивым вариантом для создания высокопроизводительных приложений на более удобном для разработчиков языке.
# Define a class for a person with name and age attributes { // Определяем класс Person с атрибутами name и age }
class Person
getter name : String
getter age : Int32
def initialize(@name : String, @age : Int32)
end
end
# Create an array of Person objects { // Создаем массив объектов типа Person }
people = [Person.new("Alice", 25), Person.new("Bob", 30), Person.new("Charlie", 35)]
# Use a block to filter the array by age and map the names to uppercase
{ // Используем блок кода для того, чтобы отфильтровать массив по возрасту и преобразовать имена в верхний регистр }
names = people.select { |person| person.age >= 30 }.map { |person| person.name.upcase }
# Print the resulting array of uppercase names { // Печатаем получившийся массив с именами в верхнем регистре }
puts names.inspect
Этот код демонстрирует преимущества Crystal, связанные с его синтаксисом, производительностью и безопасностью типов. Синтаксис Crystal похож на синтаксис Ruby, что упрощает чтение и запись кода. Между тем, Crystal компилируется в машинный код, выполняя, таким образом, программу намного быстрее, нежели такие интерпретируемые языки, как Ruby.
Помимо всего прочего, Crystal имеет статическую типизацию. Этот факт обеспечивает безопасность типов на этапе компиляции и повышает производительность. Что касается данного примера, то здесь код использует блок кода для того, чтобы отфильтровать массив объектов Person по возрасту и отобразить имена в верхнем регистре. Кроме того, здесь отлично продемонстрирована гибкость и выразительность синтаксиса Crystal.
12. Reason
Reason – это современный язык программирования. Его синтаксис похож на синтаксис JavaScript и прочих языков семейства С, и он имеет надежную систему типов OCaml. Поскольку у разработчиков есть возможность проверять типы, они могут выявлять проблемы на более ранних этапах, а, значит, могут писать более надежный и основательный код.
Reason имеет удобный интерфейс и простой дизайн, что делает его отличным вариантом для решения самых разных задач программирования, и ваш опыт программирования совсем не важен.
Reason и OCaml – очень универсальные языки программирования. За счет того, что они поддерживаются большим числом проектов, их можно использовать в различных средах. Один из вариантов их использования – создание собственных исполняемых файлов, которые можно запускать прямо на вашем компьютере с помощью самого обычного компилятора. К тому же, есть несколько инструментов (например, dune и esy), которые могут помочь в этом процессе.
Еще один вариант – компиляция Reason в JavaScript, который, в свою очередь, совместим с браузерами. Это можно сделать с помощью таких проектов, как ReScript (в прошлом BuckleScript) и Js-of-ocaml. Все эти универсальные варианты применения делают Reason и Ocaml привлекательными для разработчиков различных отраслей.
Reason – это современный язык программирования с удобным интерфейсом и JavaScript-подобным синтаксисом. Универсальность и простой дизайн позволили ему завоевать популярность среди разработчиков различных отраслей.
Заключение и отступление
Что ж, фавориты у каждого свои, но языки, которые мы перечислили выше, стоит попробовать, так как в них появились новые функции, которые могут помочь решить проблемы, с которыми не могли справиться более старые языки.
Elm – отличный вариант для более аккуратного разделения кода и модульного программирования. Pony – один из лучших языков для асинхронного программирования.
Несмотря на то, что Vyper – это довольно новый язык, предназначенный для написания смарт-контрактов, но при этом это многообещающая альтернатива Solidity. Vyper особенно хорошо себя зарекомендовал в том, что касается определения смарт-контрактов и обработки ошибок. В то же время, R считается одним из лучших языков для анализа данных, и у него уже есть довольно внушительное сообщество.
Есть языки, которые также набирают популярность, но по тем или иным причинам, мы не включили их в этот список. Вот они:
- Golang: он уже утвердился в качестве обыденного языка, хоть и не самого популярного. Я полагаю, что на данном этапе у Golang есть несколько конкурентов, которые не дадут ему завоевать рынок.
- Swift: Apple мертвой хваткой держит свою экосистему, и Swift – единственный язык, который в ней доступен. Также как сейчас популярен Swift, раньше был популярен Objective C. Я считаю, что это жульничество, поэтому не включил его в список.
Будущее всегда таит в себе неопределенность, поэтому один из способов занятия карьерой – сконцентрироваться на том, что уже работает, и не уходить в сторону. При таком раскладе стоит придерживаться следующих языков: Java, PHP, Python, Ruby и т.д. И тем не менее, многим не хватает обычных языков. Они выходят на улицу, исследуют и делают крупные ставки на свое будущее. Если вы поддерживаете второй лагерь, то один из этих языков просто обязан оказаться первым в списке ваших дел.
И наконец, когда вы пытаетесь оценить язык, стоит его изучать или нет, не берите за основу усилия, которые вам придется потратить на его изучение, поскольку вам придется потратить не так уж и много. Если вы уже знаете несколько языков программирования, то вы вполне сможете изучить любой из этих языков максимум за пару месяцев, затрачивая при этом по 5-6 часов в неделю. При этом довольство и доход, которые вы сможете получить в будущем, превзойдут эти усилия в несколько раз.