До сих пор не создано такого языка программирования, который бы одинаково хорошо решал все задачи программных систем. Уже существует большое количество языков и новые продолжают появляться. Устаревшие языки не спешат уйти со сцены, на них написаны программы, и они продолжают работать, а значит, по ним нужны специалисты для сопровождения и развития существующих программ. Возможно, не стоит ориентироваться на устаревшие или не получившие достаточного распространения языки, но, например, если вы вдруг надумаете устроиться программистом в компанию Боинг, то вам придется изучить язык достаточно прогрессивный для своего времени и не очень распространенный в наше - язык Ада.
Текущее представление языков примерно выглядит так:
- Старые
- Fortran, Cobol, PL\I, Basic, Pascal, Ada, Lisp, …
- Мейнстримные
- C, C++, Java, C#, JavaScript, Python, Ruby, PHP, …
- Новые и будущие
- Go, Swift, Hack, Rust, Kotlin, Scala, …
- Нишевые
- D, Clojure, OCaml, Haskell, …
Есть множество причин, по которым создаются новые языки. Самая общая из них заключается в появлении новых задач, требованиям которых не удовлетворяют в полной мере существующие языки. Вот несколько причин возникновения новых языков:
- Необходимость избавиться от архаичного наследия «старых» языков
- Несоответствие существующих ЯП новым задачам и возросшим требованиям
- Недостаточность уровня абстракции в существующих языках для уровня сложности решаемых задач
- Желание сохранить контроль над эволюцией языка
- Для обучения или проверки положений теории языков на практике
- Маркетинг (например J#)
- Энтузиазм отдельных разработчиков
Следующая таблица демонстрирует, что несмотря на наличие существующих языков, решающих сходные задачи, известные ИТ компании создают собственные языки, а не переиспользуют готовые.
Таблица 1. Новые языки, появившиеся в последнем десятилетии от известных ИТ-компаний
|
Компания |
Год |
Язык |
Описание |
|
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 задача интеграции библиотек кода на различных языках была решена на качественно новом уровне. Код, написанный на платформе, автоматически становится интегрированным в общую многоязычную среду. Платформа обеспечила не только интеграцию на этапе исполнения, но и переносимость как аппаратную, так и программную под различные операционные системы. Отладка и написание многоязычных проектов стала возможной в единой среде разработки. Последнее обстоятельство привело к новому видению использования различных языков в одном проекте - созданию многоязычных проектов.
Проекты с использованием нескольких языков открывают новые возможности проектирования программных систем. В таких системах под разные задачи для разных частей выбирается тот язык, средствами которого достигается лучший результат. Синергетический эффект такого подхода достигается за счет использования преимуществ языка в тех частях, для которых выбранный язык будет наиболее эффективным и компенсации недостатков в тех, где лучше всего использовать другой язык.
Системный архитектор и разработчик Ола Бини (Ola Bini) интересуется языками программирования. В своей статье «Фрактальное программирование» Ола Бини рассуждает о том, как, по его мнению, можно организовать проекты, основанные на использовании нескольких языков программирования. Для понимания того, какие языки и в каком сочетании можно использовать в многоязычных проектах Бини предложил рассматривать структуру приложения по слоям. В своем условном делении Бини выделяет три слоя и рассматривает их в виде перевернутой пирамиды.
В перевернутой вершине пирамиды находится стабильный слой. Приложения этого слоя отвечают самым высоким требованиям по производительности, стабильности, отсутствию ошибок. Написание программ на таких языках является самым трудоемким и дорогостоящим. Именно поэтому пирамида перевернута - ведь ПО этого уровня обречено пребывать в меньшинстве. Однако затраты на создание такого ПО вполне оправдывают себя благодаря существенно большему количеству переиспользования библиотек этого слоя из ПО верхних слоев.
В динамическом слое располагается ПО, с одной стороны, достаточно ответственное, чтобы создавать ПО высокого уровня качества, с другой стороны, достаточно гибкое, чтобы трудоемкость его создания была ниже, чем из стабильного слоя.
И, наконец, верхний слой, самый нестабильный, с низким уровнем ответственности. Языки этого слоя предъявляют невысокие требования к уровню знаний программиста и тем самым обеспечивают большую армию разработчиков. Основное назначение этого слоя - быстрая поставка ПО. К этому слою относится легкие языки без контроля типов для создания ПО типа front-end и, так называемые, DSL для создания прикладного ПО. Это языки переднего края, максимально приближенного к своим потребителям, настолько, что даже знаний непрограммиста может вполне хватать чтобы сделать свой веб-сайт или даже построить свою БД для личного учета. В этом слое разрабатывается самый значительный объем ПО и ему соответствует самая широкая часть пирамиды Бини.
Вступайте в нашу телеграмм-группу Инфостарт