Pull to refresh

Язык программирования APL

Reading time5 min
Views21K
«В скором будущем стоимость аппаратной части компьютеров, необходимой для запуска и работы программы будет ничтожно мала по сравнению со стоимостью труда программиста, поэтому имеет смысл развивать языки программирования, которые, хоть и более требовательны к ресурсам компьютера, зато позволяют минимизировать количество кода», — примерно так рассуждал доктор Джим Браун, возглавлявший группу APL девелоперов IBM в середине 80х. Что ж, его прогнозы оправдались лишь отчасти. Сейчас APL применяется, и вполне успешно для программирования финансовых и научных расчетов, входит в состав .NET платформы и в TIOBE Index на ноябрь 2010 занимает 33 место (рейтинг 0,366%).

APL действительно позволяет свести к минимуму количество кода, и программировать на нём легко и приятно, вот только синтаксис его настолько не похож на все остальные популярные языки программирования, что это отпугивает большинство «потенциальных поклонников». Я постараюсь познакомить вас с APL поближе, язык достаточно полезен, и, не смотря на пугающие на первый взгляд «закарлючки», логичен, красив, а для программирования математических расчетов и операций с большими массивами данных еще и является лучшим выбором средства разработки.

Итак, APL, — аббревиатура расшифровывается очень просто: A Programming Language. Идея языка появилась у Кеннета Айверсона (Kenneth E. Iverson) в 1957 году во время его работы в Гарвардском университете, и нашла свою реализацию во время его работы в IBM в 1964. Пик использования APL приходится на середину 80х, когда появилось множество версий языка и диалектов, в том числе и для микроконтроллеров. В какой-то момент даже Microsoft Corporation планировало релиз своей версии APL, но по неизвестным причинам этот релиз так и не состоялся. В начале 80х появилась новая версия языка — APL2, которую создала группа разработчиков IBM под руководством доктора Джима Брауна (Jim Brown). Эта версия и стала основой современного APL.

Сейчас существует около десятка различных интерпретаторов APL. Основные это Dyalog APL, APL Now и MicroAPL, все три работают с Windows, Unix и Linux, а последняя и с MacOS (дальше я буду приводить примеры, используя Dyalog APL, к тому же студенты могут скачать этот интерпретатор бесплатно с сайта Dyalog: dss.dyalog.com/edu).

Так как в среде APL используется много нестандартных символов, то для разработки используется специальная раскладка клавиатуры. В последних версиях Dyalog APL специальные символы уже вынесены непосредственно на панель приборов, и их легко выбрать, просто нажав на нужный символ.





Итак, для чего же нам всё это нужно? Основными особенностями и преимуществами языка можно выделить следующие:
1. Кроссплатформенные реализации.

2. Вычисления происходят справа налево, и вычисленный результат присваивается функции слева. Приведу пример:



3. Количество кода минимизировано, благодаря использованию спецсимволов, и тому, что все операции можно производить непосредственно над массивом, т.е. нет необходимости использовать циклы. Для примера создадим массив, найдём сумму всех элементов массива, найдём длину массива, а потом увеличим каждый элемент массива на 1+номер элемента массива.



Благодаря этим правилам APL фактически позволяет реализовать любую функцию в одной строке кода. Один знакомый реализовал на APL множество Мандельброта, а здесь можно скачать реализацию знаменитой игры «Жизнь», естественно тоже одной строкой кода.

Еще один огромный плюс, это возможность работы с большими матрицами. У клиентов, которые используют наш программный продукт (а клиенты это инвестиционные банки, пенсионные фонды, банковские альянсы), часто бывают данные в матрицах размерностью 100 000 по одной оси. APL позволяет производить различные математические операции над такими матрицами без потери производительности.

Минусы, конечно, тоже присутствуют. Главный из них, как уже не раз упоминалось, это непривычный синтаксис. Долгое время APL вообще считался «write-only language», потому как достаточно сложно понимать написанный код. Сейчас же в основном используется только небольшая часть возможностей языка, потому возможно обойтись несколькими наиболее важными символами, и вообще инкапсулировать APL-ный код внутри .Net библиотек.

Изначально APL был функционально-модульным языком программирования, хотя современный APL и поддерживает ООП, но написание полностью объектно-ориентированного кода будет мягко говоря не сильно просто и читабельно. Тем не менее, стоит иметь ввиду тот факт, что возможность создания сложных объектов языком поддерживается. В принципе, современный APL даёт возможность создания графического интерфейса (не дай бог вам этим заниматься), а из приятного: поддерживает XML и лямбда-выражения.

Приведу еще несколько примеров, чтобы вы могли прочувствовать язык.
APL предоставляет очень мощные механизмы для работы с массивами и матрицами. Элементы массива могу быть любых типов, массивы могут быть любого уровня вложенности, и вы легко можете добраться до любого элемента массива. Создадим матрицу 10 на 10 и заполним её элементами от 1 до 100. Обращение к строкам матрицы стандартное:



Теперь создадим массив из 3 элементов: числа, строки и нашей матрицы. Мы можем легко добраться до любого элемента массива. Поменяем вторую букву в строке и последний элемент матрицы (изменился только массив, матрица mat не изменилась).



Для создания функции достаточно просто ввести её имя и дважды кликнуть на нём мышкой — функция откроется в отдельном окне. Всё что идёт слева и справа от имени функции – это аргументы, результат это то, что идёт слева от символа присваивания. Результат возвращается в переменную с таким же именем, которое указано в первой строке. В APL сигнатурой функции является только её имя. Создаю функцию, которая принимает один аргумент и возвращает его инкремент.





Отдельно стоит отметить дебаггер APL. Изменять значения переменных, и переходить по стеку можно прямо во время выполнения, что не может не радовать. Надо только переключиться из режима трейса в режим редактирования.
Я изменяю переменную а на 1 перед выполнением последней строки функции, справа окно Watch в котором значение переменной res:



Можно показывать много примеров, но самый простой вариант – скачать Dyalog APL и попробовать самим. Заодно ознакомитесь со стандартными функциями представленными символами. При наведении на символ появляется информация о его функции и применению.



Анализатор языка проверяет введённую строку справа налево до того момента пока не встретит первую функцию(символ). Дальше проверяет, есть ли аргументы слева от функции. Если аргументов нет, то символ используется в своём единичном значении (monadic), если же есть аргументы слева, то используется значение dyadic. Пример: данный символ или округляет в сторону увеличения или выбирает максимальный из двух элементов.



Думаю этой информации должно быть достаточно для того, что вы смогли самостоятельно освоиться в языке. В завершение могу посоветовать еще несколько видеоуроков.




Надеюсь, мне удалось вас заинтересовать, потому как это кажется несправедливым, что нет русскоязычных статей про APL и вообще он у нас совершенно непопулярен. И, конечно, постараюсь ответить на ваши вопросы и/или замечания.
Tags:
Hubs:
+25
Comments25

Articles