Каждый раз начиная разговор о популярных языках программирования можно быть уверенным, что холивар неизбежен. Одним нравится С++, другим Python, третьим Rust. Как говорится, на вкус и цвет фломастеры разные. Тем не менее, попробуем и мы покопаться в апельсинах.
Если рассортировать языки программирования по их популярности, то можно условно выделить три группы. В верхнюю группу войдут такие мейнстримовые языки, как 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 — это язык для создания систем, который призван был во многом заменить С и С++. Тем удивительнее наблюдать стремительный рост его популярности среди веб-разработчиков. Но если вспомнить, что Rust был разработан в Mozilla, то всё становится на свои места: авторы языка хотели дать веб-разработчикам более производительный язык по сравнению с PHP, Ruby, Python или JavaScript. По результатам опросов на StackOverflow в 2016 году Rust завоевал титул «самой любимой» разработчиками технологии. Так что многие, вероятно, не согласятся с тем, что здесь он отнесён в третью группу. Вполне возможно, что его место — уже во второй.
Kotlin существует около пяти лет, но только в этом году наконец добрался до версии 1.0. Хотя язык не так популярен, как Scala, Groovy или Clojure — одни из наиболее зрелых JVM-языков, — он дистанцируется от массы конкурентов и, похоже, готов влиться в ряды лидеров этой группы. Kotlin разрабатывается компанией, создавшей популярный IDE IntelliJ IDEA. Авторы языка руководствуются принципом повышения продуктивности разработчиков. Ещё одна причина, почему Kotlin может стать широко популярен — простота создания на нём Android-приложений.
Crystal — совсем молодой язык, который замахнулся на производительность на уровне С в сфере веб-разработки. Crystal ориентирован на Ruby-программистов и использует похожий синтаксис. По мере роста количества стартапов, в которых для создания продуктов применяется Ruby, Crystal может начать играть ключевую роль, помогая выводить производительность приложений на новый уровень.
Elixir также вдохновляется экосистемой Ruby, однако он нацелен на создание высокодоступных систем с низким уровнем задержки — сфера, в которой у Rails есть проблемы, согласно мнению критиков. Производительность Elixir обеспечивается благодаря выполнению в виртуальной машине Erlang. Также важнейшую роль в жизни Elixir играет фреймворк Phoenix.
Давайте теперь посмотрим, как растёт популярность этих пяти языков, согласно данным StackOverflow и GitHub.
Каждый из языков уже оброс сообществом энтузиастов и обзавёлся еженедельной новостной рассылкой. Так что если вы подумываете о том, чтобы изучить какой-нибудь молодой язык, чьё будущее может стать достаточно радужным, то обратите внимание на героев этой подборки.
Elm
Функциональный язык, в котором уделяется большое внимание usability. Код Elm компилируется в высокопроизводительный JavaScript. Вы можете использовать этот язык для создания пользовательских интерфейсов в вебе как совместно с JavaScript, так и без него. Основные преимущества Elm по сравнению с JavaScript — надёжность, удобство в сопровождении, комфорт при написании кода.
Отсутствие исключений во время runtime: код Elm имеет репутацию никогда не выкидывающего исключения во время runtime’а. Никаких «undefined is not a function.»
Невероятно полезный компилятор: многие восхищаются компилятором Elm с точки зрения полезности сообщений об ошибках. Зачастую можно услышать «если он скомпилировал, то обычно всё просто работает», даже после серьёзного рефакторинга. Это делает кодовые базы на Elm куда приятнее в сопровождении, чем JS.
Автоматическое выполнение семантического версионирования: elm-package автоматически выполняет семантическое версионирование. Если автор пакета пытается внести в API критическое изменение без учёта номера основной версии, то elm-package это заметит от откажется публиковать. Ни один другой диспетчер пакетов не выполняет так надёжно семантическое версионирование.
Быстрый и функциональный: Elm — чисто функциональный язык, гарантирующий отсутствие трансформаций или побочных эффектов. Это не только обеспечивает качественное масштабирование кода, но и позволяет отрисовывать пользовательский интерфейс быстрее, чем React, Angular и Ember.
Мощный инструментарий: elm-format позволяет форматировать исходный код в соответствии с принятыми стандартами. Больше не нужно спорить о соглашениях по стилям. Просто нажмите в редакторе Save, и ваш код станет прекрасно выглядеть. elm-test поддерживает модульное и нечёткое тестирование (fuzz testing). elm-css позволяет писать Elm-код, который компилируется в .css, так что вы можете использовать код совместно и в приложении, и в таблицах стилей, что не позволит возникнуть несогласованности данных.
Код на Elm может взаимодействовать с JavaScript, то есть его можно в небольших количествах использовать в JS-кодовой базе. Поэтому можно продолжать пользоваться гигантской экосистемой JavaScript и не изобретать колесо.
Для ознакомления с языком можно начать с guide.elm-lang.org, а продолжить с Elm in Action. В официальном блоге можно почитать и о способах применения Elm в вашей работе.
Rust
Rust — язык для создания систем, в котором эффективность C объединена с управлением памятью и рядом возможностей из функциональных языков, вроде статический типизации и вывода типов. При разработке языка авторы ставили перед собой три главные задачи:
Безопасность: многие языки, подобные C, представляют собой открытые ворота для ошибок, возникающих в результате ручного управления памятью (например, висячие указатели или двойные высвобождения). Rust перенял лучшие методики из современного С++, вроде RAII и умных указателей, и превратил их в требования, благодаря которым код Rust стал безопасным по памяти.
Скорость: почти все языки работают медленнее С, потому что предоставляют абстракции, облегчающие разработку ПО, но повышающие издержки во время runtime (например, сборка мусора и динамическая диспетчеризация). В Rust упор сделан на «бесплатных абстракциях», или методах облегчения программирования, которые ничего не стоят во время runtime. Например, управление памятью выполняется в ходе компилирования, а для дженериков применяется статическая диспетчеризация (аналогично шаблонам в С++, но более безопасно по типам).
Согласованность (concurrency): в системных языках согласованный код всегда хрупок и подвержен ошибкам, учитывая особую природу программирования с использованием потоков (thread). Rust старается смягчить остроту этой проблемы с помощью гарантий на уровне типов с точки зрения того, какие значения и какими потоками могут использоваться совместно.
У Rust есть несколько отличительных особенностей:
Проверка заимствований (Borrow checker): прославленная фишка Rust — инструмент статического анализа, считывающий код и останавливающий компилирование, если есть риск возникновения ошибок памяти. Этот инструмент работает на основании регламентирования определения значений, которые принадлежат одному месту в коде или заимствованы несколькими местами, с последующим анализом того, как владение значениями изменяется по ходу жизни программы. Проверка заимствований также исключает «гонки данных» в согласованном коде, использующем тот же набор правил.
Принцип Composition over inheritance: вместо использования системы классов, основанной на наследовании, как в C++ или Java, Rust для поддержки модульного программирования использует трейты (trait) — компонуемые интерфейсы. Вместо того, чтобы определять, является ли конкретный тип частью иерархии классов, программист может описать возможности типа. Например, сказать, что тип должен быть Printable и Hashable, вместо наследования от класса PrintableHashable.
Потрясающий инструментарий: каждый ветеран C/C++ знает, какая это боль — устанавливать зависимости, компилировать код под разные платформы и сражаться с мудрёными конфигурациями CMake. Благодарая разумному диспетчеру пакетов и API с кроссплатформенной совместимостью, Rust позволяет избежать многих часов истошных криков на GCC.
Полезные ресурсы: The Rust Book и Rust by Example.
Kotlin
Kotlin — статически типизированный язык, выполняющийся поверх JVM и компилируемый в JavaScript. Он появился как решение потребностей компании JetBrains, искавшей подходящий новый язык для переписывания своего инструментария, который был по большей части создан на Java. Им нужно было что-то, позволявшее работать с существующей кодовой базой, но в то же время, позволявшее решить ряд проблем с Java.
Что хотели авторы Kotlin:
Краткость: уменьшить количество шаблонного кода, необходимого для выражения определённых конструкций.
Универсальность: язык должен подходить для разработки любых промышленных приложений — веб, мобильных, настольных или серверных.
Безопасность: язык должен справляться с некоторыми распространёнными проблемами, возникающими в результате ситуаций наподобие исключений из-за нулевых ссылок.
Интероперабельность: язык должен взаимодействовать с существующими кодовыми базами на Java, библиотеками и фреймворками, чтобы можно было внедрять его постепенно и использовать уже сделанные инвестиции.
Удобство автоматизации: JetBrains создаёт программные инструменты, и в компании считают, что многие рутинные операции можно автоматизировать ради повышения эффективности и продуктивности разработки. Поэтому язык должен быть удобен с этих точек зрения.
В Kotlin всё подчинено прагматизму — решению проблем, с которыми часто сталкивались авторы языка. Это определило такие свойства языка, как:
По умолчанию безопасен с точки зрения неопределённых значений (null): типы в Kotlin по умолчанию не допускают неопределённых значений, что позволяет избегать ситуаций с нулевыми ссылками или исключениями указателей.
Делегирование первого класса: способность делегировать внешней функции функциональность члена класса, что облегчает многократное использование.
Соглашения: ряд соглашений, позволяющих писать выразительный код, делающих язык сильно типизированным и предметно-ориентированным, что облегчает рефакторинг.
Kotlin 1.0 вышел в феврале 2016, спустя пять лет разработки и масштабного тестирования на реальных проектах. На данный момент более 10 продуктов JetBrains написаны на этом языке, также его используют ряд других компаний.
Офсайт: kotlinlang.org
Crystal
Crystal — язык общего назначения, чей девиз: «Быстро, как C, приятно, как Ruby».
Это высокоуровневый, статически типизированный, полностью объектно-ориентированный язык с расширенным выведением типа и сборкой мусора.
Цели разработки Crystal:
• Синтаксис, аналогичный Ruby (но без учёта совместимости с ним)
• Статическая проверка типов, но без необходимости определять тип переменных или аргументов метода
• Возможность вызывать код на C с помощью биндингов
• Во время компилирования код оценивается на наличие шаблонных кусков и перегенерируется
• Компилирование выполняется в эффективный нативный код
Особенности языка:
Каналы: внедрение каналов в Crystal было вдохновлено CSP, они обеспечивают согласованность (concurrency). Это лёгкие потоки исполнения (thread), называющиеся Fiber, с их помощью можно легко выполнять операции в асинхронном/неблокируемом режиме.
Макросы: они позволяют избежать использования шаблонных кусков кода и обеспечивают возможность метапрограммирования. Макросы обрабатываются во время компилирования, поэтому не влияют на производительность.
Команда Crystal: мощная команда, идущая со встроенными инструментами. Она используется для создания нового проекта, компилирования, запуска набора тестов и много другого. Также доступно встроенное средство форматирования. crystal play — интерактивная песочница для быстрого прототипирования, как irb.
Выразительность: благодаря Ruby, Crystal получился очень выразительным и лёгким в понимании. Новичкам будет просто его освоить. К тому же в перспективе простота языка окупается лёгкостью сопровождения.
Полезные ссылки: Crystal Book и Crystal for Rubyists.
Elixir
Elixir появился в 2012, это функциональный язык общего назначения, созданный исходя из принципов продуктивности работы, масштабируемости и удобства в сопровождении. Поскольку язык относительно новый, он компилируется в байткод, выполняемый на виртуальной машине Erlang (BEAM). Она была создана в телекоммуникационной отрасли и развивалась почти 25 лет. Сегодня виртуальная машина Erlang работает во многих крупных системах с высокой доступностью и низким уровнем задержки.
На данный момент Elixir в основном используется для создания веб-приложений, с использованием Cowboy (примитивный HTTP-сервер) или Phoenix (полноценный фреймворк для создания веб-приложений). Благодаря фреймворку Nerves, Elixir постепенно проникает в сферу встроенного оборудования.
Синтаксис языка чем-то похож на Ruby, а инструменты Elixir вообще покажутся знакомыми каждому «рубиисту». Команды хорошо продуманы, просты в использовании и позволяют работать с высокой продуктивностью.
Цели языка:
«Дружелюбное» функциональное программирование: возможности и преимущества функционального языка с ясным и доступным синтаксисом.
Высокая согласованность и масштабируемость: для большинства пользователей язык сам по себе не должен мешать решению серьёзных задач.
Прекрасные инструменты для разработки: набор инструментов для создания приложения, управления зависимостями, тестирования и развёртывания.
Отличительные черты:
Неизменяемые структуры данных и отсутствие побочных эффектов помогают создавать большие системы, удобные в поддержке.
Инспектирование позволяет определять дерево внутренних процессов и настраивать правила автоматического восстановления работоспособности системы.
Поиск по шаблонам является альтернативой условным конструкциям и граничным операторам (guard clauses).
Согласованность процессов без разделения ресурсов, на основе акторов, хорошо подходит для решения современных проблем с согласованностью. См. «Путь к двум миллионам подключений».
Очень эффективное управление ресурсами позволяет обслуживать большое количество пользователей даже на достаточно скромном оборудовании. См. «Почему WhatsApp нужно всего 50 инженеров для обслуживания 900 миллионов пользователей".
Код, поддерживающий возможность горячей замены, позволяет минимизировать продолжительность простоев при развёртывании.
Популярность комбинации Elixir и Phoenix растёт благодаря тому, что она позволяет создавать сложные, устойчивые веб-приложения и API, очень удобные в сопровождении, с прекрасной производительность и масштабируемостью. Поэтому многие компании, включая Pinterest и Bleacher Reports, начали использовать Elixir в ключевых компонентах своей продуктовой инфраструктуры.
В итоге хочется сказать, что делать прогнозы занятие неблагодарное. Конечно же все может стремительно измениться и в 2017 году появится язык программирования, который заткнет за пазуху все остальные. Но, как гласит народная мудрость, плохому танцору eggs-ы мешают. Так что, всем чистого кода и меньше багов на любимых языках в Новом году!
Поделиться с друзьями
eao197
Можно ли уточнить по поводу Rust-а:
Что именно в дженериках Rust-а более безопасно по типам относительно шаблонов C++?
Sirikid
В Rust есть концепты.