Языков программирования существует много, однако реально в мире разработки используются лишь немногие из самых зрелых. Как следует из проведенного недавно анализа 45 млн строк кода различных программ, большинство из них написано на трех языках: Си, C++ и Java. Далее по популярности идут Фортран, Ада, Tcl и ряд других языков. Вместе с тем для современных вычислительных сред мало небольшого набора существующих зрелых языков, считает Эд Эйри, директор по маркетингу компании Micro Focus. Сегодня разрабатываются слишком большие, сложные и трудные для понимания программы, в то время как заказчики требуют повышения надежности систем, отмечает создатель С++ профессор Бьерн Страуструп. И хотя разработчики наиболее популярных языков стараются сделать их применимыми во многих областях, для некоторых функций они остаются не самым оптимальным выбором.
В результате популярные языки усложняются и становятся неприменимы в разработке ПО для определенных задач, например для параллельных вычислений. А добавлять возможности к уже существующим языкам специально ради выполнения новых требований, как правило, оказывается делом непозволительно трудным и дорогостоящим. Поэтому для удовлетворения требований последних достижений в области вычислений и коммуникаций создаются новые языки программирования, например, ориентированные на работу с многоядерными процессорами, высокопроизводительными и облачными вычислениями, распределенными системами и мобильными технологиями. Такой подход к разработке ПО оптимален и способствует выполнению принципа бритвы Оккама — использованию самого простого способа для решения задачи.
Новые языки
В ряде языков, появившихся за последнее время, отражаются важные изменения в сфере ИТ.
Google Dart для Web-программирования
JavaScript хорошо подходит для придания базовых интерактивных возможностей Web-страницам, но не всегда оптимален, когда приложения «раздуваются» до тысяч строк кода. Скриптовые языки просты в освоении и позволяют быстро писать код, однако многие аспекты приложения на этих языках часто передаются в комментариях, а не в самой структуре кода, и небольшие скрипты могут развиться в огромные программы запутанной структуры, что затрудняет понимание, сопровождение, отладку и взаимодействие при разработке таких приложений. Для решения этой проблемы в Google создали Dart — язык, который, как надеются в компании, станет новым «родным языком» Web-программирования.
Язык Dart так же прост, как и JavaScript, но позволяет создавать простые в понимании, сопровождении и отладке высокопроизводительные приложения. На Dart можно писать как скрипты, так и более крупные приложения с объявлением типов переменных. Язык может работать и на клиентских, и на серверных системах, правда, для локального исполнения кода его придется кросс-компилировать в JavaScript.
Dart имеет лицензию Open Source.
Chapel
Компания Cray, известная как поставщик высокопроизводительных систем, создает свой первый язык программирования Chapel специально для поддержки параллелизма, многоядерной обработки и кластеризации. Chapel разрабатывается в рамках программы Cray Cascade Program, частично финансируемой DARPA.
Язык предлагается рядовым программистам, которые хотят пользоваться возможностями параллельной обработки на многоядерных процессорах, а также разработчикам научных приложений для мощных суперкомпьютеров, решающих сложные задачи моделирования. В последнем случае уровень сложности резко возрастает, поскольку программистам нужно применять сразу несколько разных подходов, чтобы использовать все возможности параллелизма. Chapel упрощает ситуацию путем унификации принципов работы с параллельными вычислениями и доступа к данным. Язык абстрагирует процесс распараллеливания, и разработчикам не приходится беспокоиться о низкоуровневых деталях аппаратной архитектуры.
Chapel работает с «доменными картами» (domain map), независимо от аппаратной архитектуры задающими местонахождение участков памяти для записи или чтения, уровень использования параллелизма и принципы выполнения вычислений над данными. Chapel также поддерживает многомасштабное (multiresolution) программирование, позволяющее разработчикам проектировать и создавать программы по частям, из функций, перекрывающихся очень мало либо не перекрывающихся. Такое программирование гарантирует, что при модификации одной из частей программы не понадобится переписывать ее целиком. Chapel пригоден не только для высокопроизводительных вычислений, но и для любых параллельных программ, что важно, поскольку сегодня растет применение параллелизма во многих областях.
В настоящее время реализованы лишь базовые возможности Chapel, но некоторые более сложные функции еще не окончены и не задокументированы. Cray выпускает новые версии Chapel дважды в год.
Многоплатформный язык Haxe
Многие языки позволяют разрабатывать переносимый код — например, компиляторы Си имеются для большинства процессорных архитектур, а код Java может работать на любой виртуальной машине Java. Некоторые языки допускают кросс-платформную разработку, но ни их функции, ни стандартные библиотеки не рассчитаны на исполнение на множестве платформ. Приложения, написанные на таких языках, могут работать медленнее на неосновных платформах, либо использовать не все их доступные возможности. Язык Haxe в студии игровых программ Motion Twin разработали с нуля с расчетом на работу на множестве различных платформ.
Программы на Haxe можно перекомпилировать в код на других языках, например JavaScript и PHP, а вскоре эта возможность будет предоставлена также для C# и Java. Благодаря этому программы на Haxe могут работать во многих операционных средах.
Haxe имеет единственную кросс-платформную стандартную библиотеку и многочисленные интерфейсы программирования для различных платформ, чтобы можно было работать с их индивидуальными функциями. Стандартная библиотека Haxe работает одинаково на всех платформах, а специализированные библиотеки позволяют задействовать уникальные особенности каждой из соответствующих платформ. Haxe создан так, чтобы обеспечить программирование без сложностей для любой из поддерживаемых им платформ. Например, в отличие от JavaScript, у Haxe строгая типизация — язык требует объявлять тип переменной и придерживаться его, что снижает число ошибок, связанных с присвоением переменным значений неподдерживаемых типов.
Motion Twin еще не завершила разработку Haxe, но уже пользуется им в коммерческих проектах в версиях для Linux, Mac OS X и Windows по публичным лицензиям.
Функциональный и практичный F#
Функциональное программирование получило популярность среди ученых, особенно для написания аналитических программ, но в среде разработчиков коммерческого ПО оно применяется мало. Функциональное программирование в основном занимается вычислениями, реализуемыми путем выполнения математических функций над параметрами. Эта парадигма предусматривает описание только операций, подлежащих выполнению над входными значениями, и не использует переменные для хранения промежуточных результатов. Данный подход предоставляет компактную нотацию для написания программ и мощные методы абстракции для их структурирования. В числе преимуществ функционального программирования: отсутствие «подводных камней», простота отладки и встроенные средства использования параллельных вычислений.
Однако функциональные языки, к числу которых относятся, например, Haskell и Lisp, не могут похвастаться большим выбором инструментальных средств. Но, что самое серьезное, как правило, их нельзя использовать вместе с другими языками, в которых нет библиотек для функциональных программистов, и последним приходится тратить время и деньги на самостоятельную реализацию нужных функций.
Язык Microsoft F# взаимодействует с другими языками лучше, чем остальные чисто функциональные языки, поскольку компилирует код в классы и объекты с помощью тех же библиотек, что и C#. Кроме того, компонентная объектная модель платформы Microsoft. Net обеспечивает интероперабельность с другими языками, например C++ и Java. Слой. Net Common Language Runtime включает в себя обширную библиотеку, которая позволяет F# взаимодействовать с C# и Visual Basic.
Среди других особенностей F#: числовые типы данных, которым разработчики могут назначать единицы измерения для научных вычислений, а также поддержка асинхронного ввода/вывода. Последнее позволяет центральному процессору не прерывать обработку нити до завершения операций ввода/вывода, выполненных предыдущими командами. Таким образом ускоряется работа программы, так как не возникает задержки на операциях ввода/вывода, которые могут быть относительно медленными.
В Microsoft включили F# в состав интегрированной среды разработки Visual Studio 2010. Компилятор языка и его главная библиотека предлагаются по лицензии Apache 2.0.
Ceylon от Red Hat против Java
Компания Red Hat разрабатывает Java-подобный язык Ceylon, лишенный некоторых недостатков самого Java. У нового языка менее многословный синтаксис, чем у Java, однако его код при этом понятен.
Многословность Java затрудняет чтение и понимание кода программ, а в Ceylon проблема многословности устраняется за счет псевдонимов типов (type alias) и локального распознавания типа. Псевдонимы позволяют присваивать более одного символического имени одной и той же области памяти. Таким образом, если пользователь модифицирует данные с помощью одного из псевдонимов, то значения всех остальных автоматически меняются. Механизм локального распознавания типа позволяет компилятору «угадать» тип элемента, когда он не объявлен заранее.
Для Ceylon в Red Hat собираются предложить комплект разработчика, но виртуальную машину специально для этого языка создавать не планируется. Компилятор Ceylon, который должен появиться в этом году, будет генерировать байт-код Java, работающий в любой виртуальной библиотеке Java.
X10 для параллельной обработки
Параллелизм когда-то применялся лишь в немногих областях, но с распространением многоядерных процессоров и кластеризации ситуация изменилась. Однако сегодня существует мало языков программирования для параллельной обработки — это довольно сложная дисциплина, требующая учета взаимодействия нескольких одновременных потоков команд и организации связи между множеством вычислительных узлов. По этой причине в исследовательском подразделении IBM разрабатывают язык X10 для современных параллельных архитектур, названный так, поскольку он призван повысить продуктивность труда разработчиков «в десять раз».
Язык X10 предоставляет простые команды для организации параллелизма и распределения данных, а параллелизм в X10 управляется с помощью разделенного глобального адресного пространства, в котором у каждого процесса есть собственная память для локальных данных, а также доступ к совместно используемой памяти для глобальных переменных.
Совместно используемая память делится между взаимодействующими процессами, каждый из которых с помощью единого адреса может получить доступ к любому элементу данных в глобальном пространстве. Такая схема повышает быстродействие за счет упрощения переноса данных между разделами и переноса вычислений на свободные процессоры.
Код на X10 похож на Java, является объектно-ориентированным и комплектуется библиотекой классов для различных применений. В перспективе планируется обеспечить прямую интероперабельность X10 с Java.
Компилятор и среда исполнения X10 существуют для ряда платформ, в том числе Linux, Mac OS X и Windows. Кроме того, предлагается интегрированная среда разработки и отладчик, распространяемые по лицензии Eclipse Public License.
***
До некоторой степени создание новых языков программирования обусловлено простым желанием усовершенствовать разработку ПО, и некоторым новым языкам удалось привлечь внимание программистов. Например, интерес к Chapel проявляют разработчики настольных приложений и ПО для высокопроизводительных вычислений. Однако многим новым языкам суждено либо остаться в своих нишах, либо вообще исчезнуть, а более старые языки «заберут» у них полезные особенности, ради которых те создавались.
Современное общество все в большей степени зависит от программных систем. Те, в свою очередь, становятся все более сложными, состоят из все большего объема кода и предъявляют все более высокие требования к аппаратному обеспечению. Из-за невероятного уровня сложности современные программные системы становятся очень трудными для понимания, полагает Страуструп. Поэтому, уверен он, важно принимать меры, которые сделают инструменты разработки программного обеспечения более простыми.
Сиксто Ортис (sortiz1965@gmail.com) — независимый автор.