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

«В скором будущем стоимость аппаратной части компьютеров, необходимой для запуска и работы программы будет ничтожно мала по сравнению со стоимостью труда программиста, поэтому имеет смысл развивать языки программирования, которые, хоть и более требовательны к ресурсам компьютера, зато позволяют минимизировать количество кода», — примерно так рассуждал доктор Джим Браун, возглавлявший группу 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 специальные символы уже вынесены непосредственно на панель приборов, и их легко выбрать, просто нажав на нужный символ.
Image Hosted by ImageShack.us CLONE
Image Hosted by ImageShack.us CLONE
Итак, для чего же нам всё это нужно? Основными особенностями и преимуществами языка можно выделить следующие:
1. Кроссплатформенные реализации.

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

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

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

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

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

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

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

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

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

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

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

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

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



Надеюсь, мне удалось вас заинтересовать, потому как это кажется несправедливым, что нет русскоязычных статей про APL и вообще он у нас совершенно непопулярен. И, конечно, постараюсь ответить на ваши вопросы и/или замечания.
Реклама
AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Подробнее

Комментарии 25

    +1
    Какой смысл сейчас использовать APL, если есть J или K?
      0
      как понимаю, потому что APL работает в CLR среде, а J и K на сколько я знаю нет
      +4
      Для сравнения, попробуйте создать в студии хотя бы матрицу 4000 на 4000, у меня программа вообще не запустилась!

      o_O
      Подозреваю, что под студией вы имели ввиду Visual Studio, а под языком — C. В этом случае вы видимо решили создать эту матрицу в стеке, а не использовали malloc(), что и являлось причиной проблемы.
        0
        прошу прощения, я опечаталась. создавалась матрица 40000 на 40000, Visual Studio, а язык C#, поэтому создавала на куче.
          +3
          Если это была матрица 32-битных чисел, то эта матрица займёт чуть меньше, чем 6 Гб. Уверены, что у вас 64-разрядная ОС и достаточно памяти?
            +3
            И как эта матрица создается в APL?
            +1
            Здесь, судя по всему, идет намек на ленивые вычисления, хотя все-таки подобное сравнение не корректно.
              0
              согласна, это действительно некорректное сравнение, убрала спорный кусок.
            0
            Кроссплатформенность не может быть особенностью / преимуществом языка.
              +3
              Вот! Скажи это джавистам! :)
                0
                Особенностью — нет. Преимуществом — да.
                  +1
                  Откуда кроссплатформенность в языке то берется? КП — особенность и преимущество среды разработки, компилятора, виртуальной машины и т.д., но не языка. Вы же не можете сказать, что черный цвет кожи является особенностью / преимуществом французского языка?
                    0
                    Ок. Надо в статье «кроссплатформенность» поправить на «кроссплатформенные реализации».
                      0
                      В языке вполне может быть заложена не кроссплатформенность. Например, может всегда считаться, что разделители пути — только определённые слеши, всегда есть «диски» (как в Винде) или всегда есть жёсткие ссылки и т. д.

                      Можно запросто навязаться в языке на особенности платформы.
                        0
                        Прошу прощение, но как может сущность «разделители пути» (относится к платформе в ряде случаем) оказаться в языке? Язык оперирует символами. Различного рода символы, которые требуют той или иной экранизации и т.д. — это одно, то о чем вы говорите — совершенно иное. Готов к дальнейшему диалогу )
                          0
                          Иногда в язык включают не только конструкции, но и функции этого языка, например, в Perl в ядро входит несколько функций, в PHP — их тонны, а в C — ни одной.

                          Если функция чтения файлов, например, не умеет читать их построчно и в языке нет ничего, что могло бы помочь программисту понять чем кончается строка в данной операционной системе, то сделать переносимую программу, которая работала бы с текстовыми файлами на таком языке невозможно.
                        0
                        Если у языка нету четкой спецификации, то реализации могут и не гарантировать кроссплатформенности. А если в спецификации прописаны детали реализации, то такое может быть. К примеру жава — да она гарантирует кроссплатформенность, но в том случае, если реализация создана по оффициальным спекам.
                      0
                      мне кажется, что для компилируемых ЯП реализация настолько тесно связана с самим языком, что вполне себе можно допустить использования термина кроссплатформенность для языка. хотя чисто формально это и не правильно. Исправила в статье.
                      +1
                      в нашем случае используем потому, что АПЛ входит в .Net.
                      на самом деле спец символы не так страшны, как кажутся, а J и К фактически являются диалектами АПЛа.
                        0
                        По первому впечатлению, похоже на Matlab
                          0
                          так и есть, Matlab это предок АПЛ :)
                            0
                            APL и MathLab — это разные вещи. Никаких родственных связей нет. APL был придуман для упрощения записи математических выражений, независимо от МатЛаба.
                          +5
                          перенесите в «ненормальное программирование»х)
                            +1
                            Спасибо, теперь я знаю как можно отомстить преподу по алгоритмизации.
                              0
                              Остаётся только посочувствовать тем, кому такой код останется на сопровождение.

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

                              Самое читаемое