Пять прогрессивных языков программирования с большими перспективами

16 сентября 2018, 13:10
Пять прогрессивных языков программирования с большими перспективами

Журналисты TechBeacon подобрали пять молодых языков программирования, за которыми, по их мнению,  большое будущее.

Все языки программирования можно распределить на три группы в зависимости от их популярности. В главную войдут наиболее распространённые языки: Java, JavaScript, Python, Ruby, PHP, C#, C++ и Objective-C. Зная один, а лучше — несколько из них, можно с относительной лёгкостью найти работу.

Языки из второй группы вот-вот смогут перейти в число популярных, но ещё не стали таковыми. Они доказали своё право на это звание, сформировав сильные сообщества, но пока что их использует относительно небольшое число компаний-разработчиков ПО. К этой группе пока относят Scala, Go, Swift, Clojure и Haskell. Некоторые компании применяют их в небольшом количестве своих продуктов, но в целом в ИТ-отрасли данные языки встречаются редко (разве что Swift уже опережает Objective-C в разработке под iOS). Go и Swift имеют все шансы перейти в высший разряд в течение ближайших лет. Но большинство топовых языков прочно закрепились в своей группе и не «вылетят» из неё так быстро и просто.

Развивающиеся языки, рассмотренные в этой статье, входят в третью группу и только начинают набирать аудиторию. Одни языки застряли здесь уже давно и беспросветно, а другие — уверенно набирали позиции последние пару лет. Далее вы узнаете про пять из них.

Перспективные языки: почему именно они?

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

Elm набирает популярность в JavaScript-сообществе, преимущественно среди сторонников функционального программирования, которое также становится всё более распространённым. Как Babel, TypeScript или Dart, Elm компилируется в JavaScript.

Rust — это системный язык, который задумывался как замена C и С++. Поэтому немного необычно наблюдать, с какой скоростью его принимает всё больше веб-разработчиков. Rust создали в Mozilla, которая стремится дать веб-разработчикам, которым приходится писать низкоуровневый код, нечто лучшее и более эффективное, чем PHP, Ruby, Python или JavaScript. Согласно опросу Stack Overflow, Rust уже третий год подряд становится самым любимым языком среди разработчиков.

Kotlin разрабатывается с 2010 года, но только в 2016 году состоялся релиз версии 1.0. И хотя он еще не достиг популярности Scala, Groovy или Clojure — трёх наиболее распространённых и зрелых (помимо Java) языков JVM — Kotlin выделяется на фоне множества других исполняемых на JVM языков и вполне готов выйти в лидеры группы. Автор языка — компания JetBrains, которая также известна средой разработки IntelliJ IDEA, поэтому создавался Kotlin с заботой о разработчиках. Кроме этого, на нём легко создавать приложения под Android.

Crystal — ещё один язык, который стремится привнести производительность С в мир веб-разработки. Crystal ориентируется на Ruby-программистов, так как имеет схожий, а местами и идентичный синтаксис. И без того немалая численность стартапов, использующих Ruby, продолжает расти, а Crystal может помочь ощутимо повысить производительность их приложений.

Elixir также во многом вдохновлялся Ruby, но вместо того, чтобы пытаться воспроизвести преимущества С, его авторы решили заняться созданием высокодоступных и отзывчивых систем, что, по мнению критиков, является не самым сильным местом Rails. Elixir работает в Erlang VM, которая благодаря своей эффективности за 25 лет завоевала прочную репутацию в телекоммуникационной отрасли. Phoenix — фреймворк для создания приложений на Elixir — как никакая другая деталь процветающей экосистемы делает этот язык таким привлекательным.

Описанная ниже шкала популярности составлена на основе данных StackOverflow и GitHub. На ней можно найти четыре из пяти языков:

Иллюстрация: TechBeacon

Иллюстрация: TechBeacon

Elm

Функциональный язык программирования, удобный в использовании и компилируемый в высокоуровневый JavaScript. Строить пользовательские веб-интерфейсы можно как полностью на нём, так и совместно с JavaScript. Ключевые преимущества Elm перед JavaScript — надёжность, удобство в поддержке и «удовольствие от программирования». Если конкретнее:

  • Отсутствие исключений времени выполнения (runtime exceptions). И никаких «undefined is not a function».
  • Неоценимо полезный компилятор.
    Компилятор Elm славится самыми содержательными сообщениями об ошибках в отрасли. Именно поэтому объёмные кодовые базы на нём сопровождать в разы приятнее, чем на JavaScript.
  • Встроенное семантическое версионирование.
    elm-package обеспечивает семантическое версионирование автоматически. Если автор пакета попытается внести серьёзные изменения в API, не изменив номер версии, elm-package забьёт тревогу и не пропустит их. Ни один существующий менеджер пакетов не сравнится в надёжности с Elm.
  • Скорость и функциональность.
    Elm — чисто функциональный язык программирования без мутаций и побочных эффектов. Это не только гарантирует гладкое масштабирование кода на Elm, но и помогает ему рендерить интерфейсы приложений быстрее, чем React, Angular или Ember.
  • Мощный инструментарий.
    elm-format форматирует исходный код согласно стандарту сообщества. Больше никаких споров о конвенциях и стилях. Достаточно просто нажать Save в предпочитаемом редакторе, и код примет необходимый вид. elm-test поддерживает как юнит-тестирование, так и фаззинг. elm-css позволяет писать код, компилируемый в файл формата.css, и обеспечивает синхронизацию констант.

Код на Elm может функционировать совместно с JavaScript, а значит, его можно вводить небольшими дозами в JS-код и по-прежнему пользоваться огромной экосистемой языка, не изобретая велосипед.

Для начала можно посетить guide.elm-lang.org, затем Elm in Action и How to Use Elm at Work (о возможностях использования Elm на работе).

Эту часть написал Ричард Фельдман, автор Elm in Action и создатель elm-css, препроцессора CSS для Elm.

Rust

Rust — это системный язык программирования, который совмещает эффективность и контроль над памятью С, а также обладает чертами функциональных языков, такими как сильная статическая типизация и вывод типов. Основными целями его создателей были:

  • Безопасность
    Во многих С-подобных языках ручное управление памятью оставляет риск ошибок памяти (например, висящие указатели или двойное освобождение памяти). Rust вобрал лучшие практики современных версий С++, например идиома RAII или умные указатели, а их применение сделано обязательным. Это систематически обеспечивает безопасность доступа к памяти чистого Rust-кода.
  • Скорость
    Почти все языки работают медленнее С, потому что их абстракции упрощают процесс разработки ПО, но ценой значительного увеличения временных затрат (на сборку мусора и динамическую диспетчеризацию). Rust упрощает программирование без потерь в скорости за счёт «абстракций с нулевой стоимостью» (zero-cost abstractions). Например, Rust управляет памятью во время компиляции и применяет статическую диспетчеризацию для дженериков (как в шаблонах С++, но более типобезопасно).
  • Конкурентность
    Конкурентный код в системных языках часто весьма уязвим и подвержен ошибкам из-за сложностей потокового программирования. Rust решает эти проблемы, предоставляя гарантии (на уровне типов) того, какие значения могут передаваться между потоками и как именно.

У Rust есть и некоторые отличительные особенности:

  • Проверка заимствования
    Эта знаменитая функция Rust — статический инструмент, который считывает код и останавливает компиляцию, если он может вызвать ошибки памяти. Значения либо принадлежат одному месту, либо заимствуются несколькими, а далее выполняется анализ того, как изменяется владение значением на протяжении работы программы. Проверка заимствования также предотвращает «гонки данных» в параллельном коде.
  • Композиция вместо наследования
    Вместо основанной на наследовании системы классов, как в C++ или Java, Rust использует свойства, или компонуемые интерфейсы, для поддержки модульного программирования. Программист может не указывать, что определённый тип является частью классовой иерархии — он сможет описать возможности типа, то есть указать, что он должен быть Printable и Hashable, а не наследоваться из класса PrintableHashable.
  • Сильный инструментарий
    Любому знатоку С/С++ знакомо, какими болезненными могут быть установка зависимостей, компиляция кода на различных платформах или борьба со скрытыми конфигурациями CMake. Менеджер пакетов Rust и кроссплатформенные API экономят массу сил и нервов.

Больше информации можно найти на The Rust Book и Rust by Example.

Эту часть написал Уилл Крайтон, студент Стэнфордского университета, который специализируется на параллельных/конкурентных системах, визуальном программировании, а также проектировании языков программирования/компиляторов. Он часто пишет про Rust в своём блоге.

Kotlin

Kotlin — это статически типизированный язык, исполняемый на JVM и компилируемый в JavaScript. Разработан компанией JetBrains, когда у неё возникла потребность в новом языке для создания инструментов, которые писались преимущественно на Java. Нужно было что-то, что позволило бы использовать существующую кодовую базу, но вместе с тем решало некоторые проблемы, c которыми компания сталкивалась при использовании Java. Именно на «лечение» наиболее распространённых «болячек» при создании ПО и ориентировались авторы Kotlin, в результате чего язык и получил свои характеристики:

  • Лаконичность
    Сокращение количества шаблонного кода, необходимого для выражения определённых конструкций;
  • Универсальность
    Создание языка, подходящего для любого вида промышленной разработки приложений — мобильных, десктопных, веб-приложений или серверной части;
  • Безопасность
    Позволить языку самому обрабатывать частые проблемы, связанные, например, с ошибкой null reference exception;
  • Интероперабельность
    Сделать язык, совместимый с существующими кодом на Java, библиотеками и фреймворками, что обеспечило бы плавный переход на новое средство разработки;
  • Совместимость с различными инструментами
    JetBrains создаёт инструменты, и делает это исходя из того, что многие рутинные задачи можно автоматизировать, сделав разработку более эффективной и продуктивной. А значит, язык должен позволять запросто применять сторонние инструменты.

Главным качеством Kotlin всегда была и будет прагматичность: найти наиболее распространённые и частые проблемы при написании кода и попытаться устранить их. Это проявляется в различных особенностях языка, например:

  • null-безопасность по умолчанию: типы в Kotlin по умолчанию не допускают неопределённого значения, что позволяет избежать исключений пустых ссылок или указателей;
  • делегация первого класса: возможность делегировать функциональность члена класса внешней функции обеспечивает повторное использование и лучшую композицию;
  • конвенции: ряд конвенций позволяют писать выразительный код, благодаря чему можно создать сильно типизированный проблемно-ориентированный язык с лучшей читабельностью и упрощённым рефакторингом.

Версия Kotlin 1.0 вышла в феврале 2016 года спустя более пяти лет разработки и масштабных тестирований на реальных проектах. На сегодняшний день Kotlin используется более чем в десяти продуктах JetBrains, а также компаниями Amex, NBC Digital, Expedia и Gradle.

Больше информации можно найти на kotlinlang.org.

Эту часть написал Хади Харири — вице-президент по защите интересов разработчиков JetBrains, редактор блога Kotlin и главный пресс-секретарь Kotlin.

Crystal

Crystal — это язык программирования общего назначения с девизом «Скорость С, качество Ruby». Это высокоуровневый, статически типизированный, компилированный, полностью объектно-ориентированный язык с продвинутым выводом типов и сбором мусора.

Ключевые цели проектировщиков Crystal:

  • схожий с Ruby синтаксис (но не совместимость с ним);
  • статическая проверка типов без необходимости уточнять тип переменных или аргументы методов;
  • возможность вызывать С-код с помощью его привязки к Crystal;
  • оценка и генерация кода в процессе компиляции для избежания шаблонного кода;
  • компиляция в эффективный нативный код.

Некоторые уникальные особенности Crystal:

  • каналы: в Crystal есть каналы, вдохновлённые CSP (так же, как и в Go), что обеспечивает конкурентность. Для этого в нём есть согласованные легковесные потоки Fibers. Можно запросто создать такой поток, используя команду spawn и операцию asynchronous/nonblocking;
  • макросы: макросы в Crystal позволяют избежать шаблонного кода и получить возможности метапрограммирования. Они действительно мощны и вычисляются во время компиляции, а значит, не отражаются на производительности;
  • команда crystal: эта команда сама по себе многофункциональна и включает замечательные инструменты. Она используется для создания нового проекта, компиляции, запуска тестов и многого другого. В ней есть встроенное средство форматирования кода, а также интерактивная среда для быстрого прототипирования crystal play, подобная irb.

Бонус

выразительность: код гораздо больше читается, чем пишется. Благодаря Ruby, Crystal поистине выразителен и прост для понимания. Он будет легко даваться новичкам и в конечном итоге оправдает себя благодаря упрощённому сопровождению кода.

Больше информации можно найти в официальных руководствах Crystal Book и Crystal for Rubyists.

Эту часть написал Сердар Догруйол — автор Crystal for Rubyists, создатель Kemal, веб-фреймворка для Crystal, и куратор Crystal Weekly.

Elixir

Elixir появился в 2012 году. Это функциональный язык общего назначения, отличающийся продуктивностью, масштабируемостью и простотой в поддержке. Хотя этот язык относительно молод, он компилируется в байткод, исполнимый на виртуальной машине Erlang (BEAM). Erlang VM берёт начало в телекоммуникационной отрасли, развивается уже почти 25 лет и лежит в основе многих массивных, высокодоступных и отзывчивых систем.

На данный момент Elixir преимущественно используется для построения веб-приложений либо в Cowboy, который по сути представляет собой НТТР-сервер, либо в полноценном веб-фреймворке Phoenix. С помощью фреймворка Nerves он также начинает проникать в нишу вложенных систем.

Синтаксис и набор инструментов Elixir во многом позаимствованы у Ruby. И хотя схожесть синтаксиса чисто внешняя, инструментарий Elixir покажется знакомым всем, кто владеет Ruby. Команды хорошо продуманы, просты в применении и обеспечивают продуктивность разработчика.

Цели языка:

  • «дружественное» функциональное программирование
    возможности и достоинства функционального языка в паре с прозрачным синтаксисом;
  • высокая конкурентность и масштабируемость
    язык не должен мешать решению серьёзных задач для большого числа пользователей;
  • несравнимые средства разработки
    для проектирования, управления зависимостями, тестирования и разработки.
Пример контроллера Phoenix, написанного на Elixir. Источник: TechBeacon

Пример контроллера Phoenix, написанного на Elixir. Источник: TechBeacon

Отличительные черты:

  • неизменяемые структуры данных и отсутствие побочных эффектов помогают упростить сопровождение и понимание крупных систем;
  • супервизоры позволяют определить внутреннее дерево процессов и установить правила автоматического выявления ошибок;
  • сопоставление с образцом предоставляет альтернативу условным и граничным операторам;
  • конкурентность, основанная на модели акторов без разделения ресурсов хорошо подходит для решения существующих проблем конкурентности на высоком уровне. См. The Road to 2 Million Connections;
  • очень эффективное управление ресурсами даёт возможность обслуживать множество пользователей с при ограниченном количестве аппаратных средств. См. Why WhatsApp Only Needs 50 Engineers for Its 900M Users;
  • замена кода в «горячем режиме» и деплой с нулевым временем простоя.

Популярность Elixir и Phoenix неуклонно растёт, потому что вместе они позволяют легко создавать сложные трудоёмкие веб-API и приложения, которые просты в сопровождении, отлично функционируют и масштабируются. Именно поэтому Pinterest, Bleacher Reports и многие другие компании предпочли Elixir для создания ключевых элементов инфраструктуры своих продуктов. Они гарантируют продуктивность без ущерба производительности (и наоборот), чем могут похвастаться немногие другие языки.

Эту часть написал Кристиан Нельсон, партнёр и директор разработки Carbon Five.

Обсуждение