Среда разработки GPS для Ады написана на Аде. И та часть компилятора, которая обрабатывает Аду, тоже написана на Аде (оптимизацией занимается GCC, написанный на C). Это достаточно сложно? По мне, так да.
Играми, к сожалению, последний раз в 90х занимался, на Турбо Паскале под EGA графику. Но сейчас, если бы понадобилось делать, взял бы
SDLAda, почитал доки по SDL и написал такое же, но на Ada. Нормальная практика — читать пример для одного языка программирования и писать на другом. Автор SDLAda в IRC сидит, можно у него при случае спросить, если что не понятно.
В текстовом режиме игру будет сделать проще, мне кажется.
Как общий принцип, то, как я уловил дух языков и сообществ вокруг них: Ада для инженеров, Free Pascal — для хакеров, Delphi — для базаданьщиков, что, впрочем, не мешает использовать их крест на крест. Так, я хаки на Аде тоже запросто делал, а для Delphi нашёл
реализацию многострадальных условных переменных и если не мог писать на Ada, то хотя бы на Delphi писал многопоточный код как положено, а не как у юных хакеров.
Delphi (да и Lazarus) подкупают доступностью IDE, но с другой стороны, код, который эта IDE производит, реализует
антипаттерн «божественный объект». Теоретически возможно на Delphi и FreePascal использовать другие графические движки, но я таких примеров знаю не много.
Ada во многих качествах близка к C++. И в положительных, и в отрицательных. Положительная сторона — это свобода в выборе графического движка, богатство библиотек, а обратная сторона — это то, что есть куча разношёрстных не стыкующихся друг с другом решений. Хотя в Delphi тоже есть переход от VCL к FireMonkey, два разных движка, но, сдаётся мне, они более близки друг к другу, чем то, что используется для создания графических программ на Ada. Лидерами тут являются GtkAda, на которой сделана среда разработки GPS, и QtAda Вадима Годунко. Они являются обёртками для Gtk+ и Qt, соответственно. Помню, было ещё что–то для интеграции с Tcl/Tk. Это из кроссплатформенных. В библиотеке OEM для графики применяется GWindows Дэвида Боттона, работать она будет только на Windows. Ещё есть чисто адская графическая библиотека Lumen, использующая OpenGL, но её готовность мне не известна. Если бы мне завтра нужно было делать графический интерфейс на Аде, я бы скрипнул зубами, но взял QtAda. Не люблю я Qt, но уж больно хорошо QtAda сделана.
Pascal сейчас, главным образом, представлен Embarcadero Delphi и FreePascal. Delphi более профессионален, но ценовая политика, конечно, удручает, и то сообщество, которое было, всё рассасывалось и рассасывалось. Очень хороший ход был раздать Turbo Delphi 2006 Explorer на шару всем желающим. Я, правда, не успел. Там нужен был ключ, который на сайте можно было получить в ограниченный период времени. И больше такого не было, зато появлялись запреты, например, в дешёвых версиях использовать базы данных. Идут по инерции и выжимают соки из того, что есть. Поддерживают Windows и Mac OS X, и делают это довольно хорошо. Есть у них ещё версии для Android и iOS, но там в чём–то уже другой язык, который, кстати, мне нравится больше. В мобильном Delphi есть долгожданный подсчёт ссылок для классов. Я его ждал–ждал, ждал–ждал, плюнул, перешёл на Аду, и лет через восемь оно таки появилось, но пока только в мобильной версии. И то появилось не потому что там откровение кому–то снизошло, а потому что Apple реализовал ARC (автоматический подсчёт ссылок) в LLVM, перенёс на LLVM свой Objective-C, а чтобы Delphi компилировать под iOS, в Embarcadero сделали переделали компилятор под LLVM и просто воспользовались тем ARC, который там уже был. Но в общем, при своей закостенелости, всё же сделали они много. Если скачать пиратский Delphi из p2p, этот продукт будет гораздо лучше, чем FreePascal, и в чём–то лучше, чем Ada. Всё более хороший компилятор Delphi для всё более узкого круга разработчиков, я бы так охарактеризовал эту ситуацию.
FreePascal — компилятор гораздо более консервативный, и разработчики у него что–то с чем–то. Ну, какие есть. Если разработчики Delphi, когда добавляют в язык новые возможности, оглядываются на Delphi, то разработчики FreePascal делают то, в чём усматривается влияние C++, и получается пакость.
На Аду не оглядывался никто, а зря. Глядишь, что–то путное бы сделали в кой–то веки хоть кто–нибудь. Какое–то время между Delphi 7 (2001) и Delphi 2005 у Borland был кризис, да и потом их поштормило, то CodeGear, то теперь вот Embarcadero очередные владельцы. На какое–то время FreePascal перехватил инициативу инноваций, и у них и в самом деле был более крутой язык.
С RAII что–то не заладилось ни у Delphi, ни у FreePascal, но у FreePascal хотя бы перегрузку операторов (плюс, умножить, больше, меньше и т. п.) сделали раньше, чем в Delphi. В Delphi это потом тоже сделали, кажется в 2006, но с другим синтаксисом, ближе к .NET, и получилось, на мой взгляд, лучше, чем в скопировавшем C++ FreePascal. Generic раньше появились во FreePascal. В Delphi они были только в 2009. И тоже, на мой взгляд, в Delphi сделаны лучше. Хотя без RAII они нормально работать не могут, на мой взгляд, но в Delphi 2009 отсутствие нормального RAII лучше скомпенсировано в контейнерах. В Delphi можно указать контейнеру
обработчики событий изменения/извлечения/добавления, раз уж нельзя напрямую на сам тип навешивать RAII. Разработчики FreePascal и те, кто показывал примеры generic, делали примеры, где контейнер работает то с числами, то со строками, но вот как–то не чувствуется у них понимание, что для строк RAII навешивается магией компилятора, и работает это поэтому идеально, а для своего типа, хоть ты плачь, так же идеально сделать нельзя, а без этого какой интерес? Получаются контейнеры, которые нормально работают только с числами и строками.
Положительным качеством является то, что портирован под кучу платформ. Хотя у них тут с Адой не всё так однозначно. FreePascal портирован под мобильные платформы. У Ada я видел порт под Android на
DragonLace, кто–то сделал, чтоб с FreeBSD можно было под Android разрабатывать, а вот из–под Windows, наверное, тоже можно собрать, но не собирал никто. Что касается iOS, один из сотрудников AdaCore похвастался, что они у себя собрали версию под iOS, но никому не дадут. Вроде как не нужна. С другой стороны, у Ada есть компиляторы в Java VM и .NET, а у FreePascal — нет. Это может пригодиться на хостингах, на которых можно размещать только управляемый код. Вот у Google, кажется, есть Google Apps, на котором только Java VM может работать, и даже вроде бесплатно можно было что–нибудь хостить, если вписаться в ограничения по памяти, жёсткому диску, обращений из сети и т. п.
У Delphi был компилятор Delphi.Net, но от языка Delphi он сильно отличался, например, там с бухты–барахты все строки стали неизменяемыми, и поэтому не было никакого преимущества, какое есть у одного языка, по–разному компилируемого. Я, конечно, понимаю, что когда работает счётчик ссылок, можно точно знать, является ли владелец строки первым и последним, и можно сделать строку уникальной, если нет, а при сборке мусора о владельцах в общем случае ничего не известно, но всё же, я вот ещё на языке Icon писал, и, хотя там тоже сборка мусора, но когда я работаю со строками, я этого никак не чувствую, там внутри всё само заменяется как надо, как если бы я писал на Delphi или Ada. Это значит, можно было и в Delphi.Net прозрачный переход сделать. Но не сделали.
Далее, FreePascal и Delphi реализуют языки, для которых они сами и являются законодателями. Для языка Ada, в отличие от них, есть международные стандарты ISO по годам: Ada-83, Ada-95, Ada-2005, Ada-2012. Для Паскаля, вообще говоря тоже был стандарт ISO, но Delphi и FreePascal от него ушли оооочень далеко, но если вдруг захочется компилятор Паскаля по стандарту ISO, один такой называется GNU Pascal (GPC).
Стандарт на язык Ада подразумевал, что будет множество реализаций, и сам стандарт обеспечит возможность менять производителя компилятора. Последний стандарт, для которого так оно и было, был Ada-95. Ada-2005 был реализован только в GNAT, а остальные компиляторы реализовали только отдельные возможности Ada-2005. С появлением стандарта Ada-2012 GNAT остался вне конкуренции, и возможности, которые в этот стандарт вошли (программирование по контракту, например), появились раньше стандарта в GNAT. Сам GNAT при этом полностью открыт. AdaCore раз в год выпускает GNAT GPL, скомпилированный сотрудниками своей компании. Те, кто купили у них GNAT Pro (при курсе доллара в 30 рублей минимальный заказ стоил 60000руб. за команду из 5 разработчиков), получали доступ к различным комбинациям кросскомпиляторов и некоторых платформ, под которые нет версии GPL. Ну, например, Mac OS X для Intel архитектуры одно время был типа эксклюзивом для версии Pro, а в GPL была только PowerPC, которая, впрочем, в Mac OS X для Интелов замечательно эмулировалась. При этом
GNAT является неотъемлемой частью семейства компиляторов GCC. AdaCore отправляет свои улучшения в так называемый FSF GCC, но уже под лицензией GMGPL, не требующей открытия исходных кодов, и обычно все сторонние сборки GNAT основаны на коде из FSF GCC. Особо желающий может собирать из свежих исходников от GPL версии, их можно скачать с того же сайта, что и установщик.
Одна из таких сборок, основанная на FSF GCC — это
TDM–GCC, ссылка на который есть в шапке. Но есть ещё в MinGW, MinGW64, Cygwin тоже сборки GNAT. Если под Linux Debian или Ubuntu установить apt-get install gnat, это будет тоже GNAT из FSF GCC. Под Mac OS X Intel году так в 2007м востребованы были сборки GNAT от Andrew Reynolds.
Так как мне и многим, я думаю, доступ к новым фичам важнее лицензионных ограничений GPL, то я сижу на GPL версиях обычно. Но если что, есть и другие.
Из выбывших из состязания компиляторов примечателен AdaMagic от SofCheck. У них был прошедший сертификацию компилятор Ada 95 в C/C++. Они эту технологию давно не развивали и потом продали её
MapuSoft'у, и кроме как у них, я сейчас не знаю, где её можно достать. Компилятор у них поддерживает Ada 95 с некоторыми возможностями Ada 2005, какими именно, не знаю. Среди интересных платформ вижу, тоже есть Android, зато нет iOS. Имея транслятор в C, наверное, компилировать в iOS было бы легче, но я не знаю наверняка. Скачал как–то, глянул, что там внутри. exe'шники никакой особой защитой не закрыты, я, наверное, мог бы их ломануть или написать кейген. Некоторые потенциально ключевые файлы типа библиотеки времени исполнения, зашифрованы, но не знаю, наколько это большое препятствие, сишные–то файлы на выходе транслятора присутствуют, можно и пересобрать. Для меня технология трансляции в C представляет интерес, так как было бы здорово транслировать в Asm.js, NaCl, FlasCC, WebAssembly, и чтобы всё это работало в браузере. Но там в любом случае надо будет что–то дорабатывать, к чему я не готов сейчас.
Впрочем, Максим Резник разработал A2JS, который может компилировать ограниченное подмножество Ada в JavaScript.
A2JS входит в состав Матрёшки.
Сам SofCheck был куплен AdaCore, и у AdaCore эта технология тоже есть. Про AdaMagic нельзя ничего найти на сайте AdaCore, зато она упоминалась в
блоге языка программирования ParaSail. Есть языки, реализующие программирование на зелёных потоках: Erlang, Limbo, Rust, Go. Такие языки, как ParaSail, Sparkel, Javallel и Parython — из той же серии, но со своими идеями. Из них Javallel похож на Java, Parython — на Python, Sparkel — на Ada, а ParaSail — помесь всех трёх. Все четверо компилируются в байто–код, который работает на общей виртуальной машине. Компилятор и виртуальная машина написаны, понятное дело, на Аде. Эксперименты с языком они там, похоже, не закончили, релиз не объявлен. Я сам пытался перенести что–нибудь с node.js, но быстро наткнулся на то, что в Sparkel из коробки нет HTTP, XML и JSON. Добавить их можно было бы, но уже по такому нюансу чувствуется, что язык пока экспериментальный.
Некий интерес могла представлять ObjectAda. Интересна она тем, что там было IDE со встроенным конструктором форм, наиболее близко к тому, что есть в Delphi. Но она тоже так и застряла на Ada 95 с небольшими дополнениями из Ada 2005. Где–то попадалась пиратская версия, но большого интереса, мне кажется, давно не представляет.