В ноябре вышел ежемесячный рейтинг самых популярных языков программирования TIOBE. Основа ранжирования – результаты поисковых запросов с названием языка. Выяснилось, что первая четверка осталась стабильной с ноября 2017 года: Java, C, C++ и Python.
Всего в рейтинге TIOBE перечислено 100 ЯП. Рассказываем, как из всего многообразия выбрать новый язык для изучения и работы, и разбираемся в особенностях многоязычного программирования.
Почему появляются новые ЯП
В рейтинге TIOBE не только популярные Java и Python: не спешат уйти со сцены Fortran, Ada и Lisp, разработанные в 1960-1980 годах. Они продолжают работать, и рынку нужны специалисты для сопровождения и развития существующих программ. Если вы решите устроиться программистом в компанию Boeing, то вам придется изучить достаточно прогрессивный для своего времени и не очень распространенный в наше язык программирования Ada.
До сих пор не создано такого языка программирования, который одинаково хорошо решал бы все задачи программных систем. Уже существует большое количество языков и новые продолжают появляться. Условно представление ЯП выглядит так:
Старые
- Fortran, Cobol, PL\I, Basic, Pascal, Ada, Lisp и т.д.
Мейнстримные
- C, C++, Java, C#, JavaScript, Python, Ruby, PHP и т.д.
Нишевые
- D, Clojure, OCaml, Haskell и т.д.
Новые и будущие
- Go, Swift, Hack, Rust, Kotlin, Scala и т.д.
Есть множество причин, по которым создаются новые языки. Самая общая из них заключается в новых задачах, требованиям которых не удовлетворяют в полной мере существующие языки. Есть и другие предпосылки:
- необходимость избавиться от архаичного наследия «старых» языков;
- уровень абстракции в ЯП недостаточен для решения сложных задач;
- желание разработчиков сохранить контроль над эволюцией языка.
Новые языки от известных ИТ-компаний, появившиеся в последнем десятилетии:
Компания |
Год |
Язык |
Описание |
---|---|---|---|
Apple |
2014 |
Swift |
язык общего назначения на замену Objective C |
|
2014 |
Hack |
замена PHP |
|
2009 |
Go |
язык реализации веб-приложений |
2011 |
Dart |
более надежная и производительная замена JavaScript |
|
JetBrains (СПб, Россия) |
2011 |
Kotlin |
простая и эффективная замена Java |
Microsoft |
2012 |
TypeScript |
«улучшенный» JavaScript (аннотация типов, классы) |
Mozilla |
2010 |
Rust |
язык реализации алгоритмов для многоядерных архитектур |
RedHat |
2011 |
Ceylon |
«упрощенный» Java |
Однако язык не может существовать сам по себе. Требуется активное сообщество, которое использует, популяризирует и участвует в его развитии. В современных условиях ЯП без возможности интеграции с существующими библиотеками не имеет будущего. Новый язык должен поддерживать вызов библиотечных функций, написанных в формате языка C.
С появлением таких языковых платформ как JVM и CLR задача интеграции библиотек кода на различных языках решилась на качественно новом уровне. Код, написанный на этих платформах, автоматически становится интегрированным в общую многоязычную среду. JVM и CLR обеспечили интеграцию на этапе исполнения, аппаратную и программную переносимость под различные операционные системы. Отладка и написание многоязычных проектов стала возможной в единой среде разработки. Последнее обстоятельство привело к новому видению использования различных языков – созданию многоязычных проектов.
Структурирование многоязычных приложений
Проекты с использованием нескольких языков открывают новые возможности проектирования программных систем. В таких системах под разные задачи для разных частей выбирается тот язык, средствами которого достигается лучший результат.
Пирамида Ола Бини
Для понимания того, какие языки и в каком сочетании можно использовать в многоязычных проектах, энтузиаст языка программирования Ruby Ола Бини предложил рассматривать структуру приложения по слоям. В своем делении Бини выделяет три слоя и рассматривает их в виде перевернутой пирамиды.
Пирамида Ола Бини
В перевернутой вершине пирамиды находится стабильный слой. Приложения этого слоя отвечают высочайшим требованиям по производительности, стабильности, отсутствию ошибок. Написание программ на таких языках является самым трудоемким и дорогостоящим. Однако затраты на создание такого ПО вполне оправдывают себя благодаря активному использованию библиотек верхними слоями.
В динамическом слое располагается ПО, отвечающее высоким требованиям качества, но достаточно гибкое, чтобы трудоемкость его создания была ниже, чем у программ из стабильного слоя.
Основное назначение языков программирования из верхнего слоя – быстрая поставка ПО. Это языки переднего края, максимально приближенного к своим потребителям, настолько, что даже знаний непрограммиста может хватить для создания своего веб-сайта или построения БД для личного учета. В этом слое разрабатывается самый значительный объем ПО и ему соответствует самая широкая часть пирамиды Бини.
Слой |
Описание |
Языки |
---|---|---|
Предметный слой |
Быстрая прикладная разработка |
1С, SQL, XML, XAML, веб-шаблонизаторы |
Динамический слой |
Быстрая продуктивная, гибкая разработка |
JavaScript, Python, Clojure |
Стабильный слой |
Стабильный, высокопроизводительный, хорошо протестированный функционал |
Java, C#, Scala |
Разделение языков по уровню типизации
Системный архитектор Нил Форд предложил разделить языки программирования по признаку типизации: сильная-слабая, статическая-динамическая. Такое разделение позволяет соотнести ЯП по слоям пирамиды Бини.
При таком делении к стабильному слою относятся языки с сильной статической типизацией. На таких ЯП пишутся:
- компиляторы;
- драйверы устройств;
- встроенное ПО;
- билинговые системы;
- серверное ПО;
- высоконагруженные сервисы;
- компьютерные игры.
К динамическому слою относятся языки с динамической сильной типизацией. ПО этого слоя: скрипты автоматизации, скрипты администрирования и создания тестов, веб-разработка (бэк-енд), прототипирование.
На верхнем слое располагаются предметно-ориентированные языки с динамической слабой типизацией. Это языки, на которых пишется ПО прикладного уровня: системы учета, скрипты с упрощенным синтаксисом для программирования формул или встроенной техники, devops, моделирование бизнес-правил и интеграции.
Языки по типизации: сильная-слабая, статическая-динамическая с выделением слоев Бини
Функциональное деление (будущее языков)
Нил Форд предположил, что в будущем стабильные языки программирования по Бини станут поддерживать функциональный стиль в большем объеме. Этот стиль программирования входит в моду: программы бухгалтерского учета пока еще не пишут на Haskell, но многие языки начинают поддерживать операции с функциями высшего порядка. Такие понятия, как «декларативный», «чистые функции», «каррирование» проникают в лексикон все большего количества программистов.
Форд считает, что в будущем типизация уже не будет играть столь большую роль, определяющим фактором станет чистота реализации функциональной парадигмы. Типизация останется, однако будет прерогативой самого программиста.
Мультипарадигмальные языки
Современные языки идут по пути поддержки мультипарадигмальности. ЯП, исторически поддерживающие парадигму процедурного и объектно-ориентированного (ОО) программирования, начинают вводить элементы поддержки парадигмы функционального стиля. Функциональные языки, наоборот, расширяют свои возможности, вводя поддержку ОО-парадигмы.
Мультипарадигмальность увеличивает мощь языка, но может и привести к проблемам. Когда один проект разрабатывается разными командами с использованием различных парадигм, то существует риск разработки несовместимых библиотек. Разработка в ОО-парадигме стимулирует использование структур, а в функциональной – композицию и функции высшего порядка. В результате смешения парадигм могут получиться различающиеся алгоритмы, с которыми нельзя работать без взаимной адаптации. Эти условия усложнят проект. Подобные проблемы команды разработчиков уже испытывали при переходе с Java на Ruby или с C на C++.
Распределение языков по слоям приложения по функциональному признаку
Выбор языков
В сложившейся ситуации программисту недостаточно знать только один язык программирования. Работая над проектом на одном языке, нельзя исключать вероятность, что код придется писать и на другом ЯП, выбранном для решения соответствующих задач. Так какой же язык имеет смысл знать или изучать? Однозначного ответа на этот вопрос нет.
Во всех языках помимо различий есть и общее. Знание сходства позволят сэкономить время вхождения в новый язык, сконцентрировавшись лишь на различиях.
Общим для всех языков является синтаксис, а различие кроется в семантике. В любом языке могут быть структурные синтаксические конструкции, условия, вызовы, структуры данных, классы и т.д. Несмотря на кажущуюся одинаковость синтаксических конструкций, наличие семантических различий может привести к ошибкам.
В языке С++ и в Java есть определение классов. Одна и та же синтаксическая конструкция «ТКласс Класс» в первом случае определит ссылку на объект указанного класса, а во втором – создаст сам объект. Попытка работать на C++ со ссылкой как с инициализированным объектом приведет к сбою программы.
В общем случае профессионально-ориентированному программисту необходимо владеть знаниями компьютерных наук, различных парадигм и быть в курсе последних тенденций развития языков. Можно рекомендовать к изучению несколько языков из различных слоев приложений или одного слоя – в количестве 3-4 языков.
Выбор для образования
Цель |
Язык |
---|---|
Узнать, как устроен и работает компьютер |
C |
Научиться работать со сложными структурами данных |
C#, Java |
Научиться программировать эффективные алгоритмы работы с данными |
C++ |
Научиться строить большие и сложные сайты |
JavaScript |
Выбор для работы
Цель |
Язык |
Недостатки |
---|---|---|
Нужна быстрая и эффективная программа? |
C, C++ |
трудно писать; трудно поддерживать |
Быстро написать и получить работающую программу или сайт? |
JavaScript, Python, Ruby |
работает медленно, часто ломается (зависает), пока происходит поиск ошибок |
Быстро написать небольшой веб-сайт? |
PHP |
для дальнейшего улучшения веб-сайта может потребоваться много усилий |
Выбор для проекта
Выбор языка в проекте зависит от множества факторов, вот некоторые из вопросов, которые помогут программисту определиться:
- Какова кривая освоения языка?
- Насколько эффективны существующие фреймворки?
- Хорошо ли развито сообщество языка?
- Как быстро можно найти нужных разработчиков?
- Легко ли язык интегрируется в многоязычную среду?
В сложных приложениях найдут применение многоязычные проекты. В рамках одной платформы JVM или CLR они будут включать алгоритмы, написанные на разных языках, однако на уровне байт-кода это будут единые приложения с разделяемыми данными. Существование таких сред меняет отношение к разработке: если раньше предпочтение отдавалось одному языку, то теперь сложные задачи можно решать, совмещая разные ЯП, используя преимущества каждого из них для конкретного рода задач.