...

суббота, 16 января 2016 г.

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

Тысячи языков программирования были изобретены за первые 50 лет развития компьютеров. Одни из них были характерными, другие следовали традиционным, эволюционным путем их предшественников.

У некоторых революционных языков наблюдалась четкая направленность, дифференцирующая их от большего количества собратьев общего назначения. LISP подходил для обработки списка. SNOBOL использовался для обработки текстовых данных. SIMSCRIPT помогал в моделировании. А язык APL предназначался для математики с акцентом на обработку множества.

APL (от А Programming Language — язык программирования) был разработан в 1957 г. профессором Гарварда Кеннетом Айверсоном (Kenneth Iverson), который в дальнейшем перешел работать в фирму IBM.

Кеннет Айверсон (1920 — 2004) — канадский ученый в области теории вычислительных систем, создатель языка программирования APL

Создание APL


Изначально APL создавался не как язык программирования, а как математическая система обозначений. Айверсон хотел разработать компактную систему записей (нотаций), чтобы описывать алгоритмы прикладной математики. Оригинальная нотация включала в себя много специфических соглашений и символов, которые предназначались для точной формулировки алгоритмов. После этого алгоритмы вручную интерпретировали на разные языки программирования.

Айверсон был нанят компанией IBM в 1960 году, чтобы работать с Адином Фалькоффом над его нотациями. Первая модифицированная версия языка с названием System/360 была реализована ими совместно с группой разработчиков IBM в 1966 г. Для этого использовали вычислительную систему IBM/360. Проект принес популярность языку программирования APL. После чего появились разные подмножества языка, как например APL/700.

Ранние разработчики языка APL, слева направо: Дик Лэтвелл, Кеннет Айверсон, Роджер Мур, Адин Фалькофф, Фил Абрамс, Ларри Брид

По этой ссылке можно скачать полную версию исходного кода для версии 1969-1972 «XM6» языка APL для System/360:
http://ift.tt/1Ndbb1j
Текстовый файл содержит 37,567 линий, который включают кодекс, макрос и глобальные определения. Чтобы получить доступ к этому материалу, нужно согласиться на условия лицензии, разрешающие только некоммерческое использование и не дающие право лицензировать его для третьих лиц, публикуя копии в сети.

Символы языка APL отличаются от других языков, они ближе к стандартной математике, чем к программированию. Кроме того, символы имеют два смысла — унарную и бинарную функции, которые могут быть непохожи. Например, символ ÷, не /. Чтобы поддержать нетрадиционные символы, APL\360 использовал изготовленную на заказ клавиатуру со специальными символами в верхнем регистре.

Специальная клавиатура языка APL

Несмотря на это, в языке используются особо специфические знаки, которых нет на клавиатуре. Например, grade up изображают знаком .

Для печати программ Айверсон и Фолкофф убедили IBM спроектировать специальный «шар» для их 1050 и 2741 терминалов, использующих механизм пишущей машинки IBM Selectric.

«Шар»

Образец кода APL:

[6]    L←(Lι':')↓L←,L       ⍝ drop To:
 [7]    L←LJUST VTOM',',L    ⍝ mat with one entry per row
 [8]    S←¯1++/∧\L≠'('       ⍝ length of address
 [9]    X←0⌈⌈/S
 [10]   L←S⌽(−(⍴L)+0,X)↑L    ⍝ align the (names)
 [11]   A←((1↑⍴L),X)↑L       ⍝ address
 [12]   N←0 1↓DLTB(0,X)↓L    ⍝ names)
 [13]   N←,'⍺',N
 [14]   N[(N='_')/ι⍴N]←' '   ⍝ change _ to blank
 [15]   N←0 ¯1↓RJUST VTOM N  ⍝ names
 [16]   S←+/∧\' '≠⌽N         ⍝ length of last word in name

После этого программы могли печатать и распечатывать. Пример печатной версии программы из Языкового руководства языка APL, которое вычисляет математический детерминант матрицы:

Книга Айверсона “Язык программирования” использует графическую нотацию, которую было бы сложно использовать непосредственно в качестве языка программирования. Автор считает его расширением матричной алгебры и пользуется общими математическими условными обозначениями.

Пример программы для сортировки чисел

Особенности APL


APL — краткий язык программирования высокого уровня, который имеет свои особенности, отличающие его от большинства других языков.

Независимо от ОС и архитектуры компьютера, язык APL ориентирован на решение проблемы и описание алгоритма. Он направлен на работу с массивами.

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

Выражения в языке APL подсчитывается справа налево и нет никакой иерархии предшествования функции. Например, печать выражения 2×4+3 заставляет компьютер мгновенно печатать получившееся значение 14.

Язык APL обеспечивает программиста большим набором разных функций. Они используются в соответствии с простым правилом приоритета: правый аргумент бинарной функции целиком выражен справа от нее. Возможно контролировать приоритет в ином виде используя скобки. Хотя чаще всего это не требуется. Такое правило делает анализ иерархической структуры выражений во многом проще. Общее правило состоит в том, что правый аргумент любой функции — это значение выражения с правой стороны от него.

В языке присутствуют скаляры (примитивные типы данных). Логические значения моделируются числами 0 для false и 1 для true. К слову, данный прием был впервые применен именно в APL. Массивы объединяют все структуры данных: одномерные векторы, двухмерные матрицы и многомерные мультитаблицы. Изначальная ориентация функций направлена на работу с массивами, но может применяться к скалярам. Благодаря развитой системы операций над массивами удается избегать применения явных команд управления потоком выполнения программы.

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

У APL более многомерная структура, которая автоматически производит расчет выражения, скаляры могут быть свободно смешаны. Например ← 2 + 1 2 3 создает вектор 1 2 3, добавляет к нему скалярную величину 2 и создает переменную A, чтобы держать вектор, значение которого 3 4 5.

Переменные созданы автоматически, принимая размер и форму любого назначенного выражения.

У языка APL есть богатый набор встроенных функций, которые воздействуют на скаляры, векторы, множества, более многомерные объекты и их комбинации. Например, выражение суммирует числа в вектор А +/A где / — оператор “сокращения”, заставляющий функцию слева быть последовательно примененной ко всем элементам операнда справа. Выражение для вычисления среднего числа А также использует примитивную функцию ρ, чтобы определить сколько элементов находятся в A: (+/A) ÷ ρА.



Примеры таблиц с 1970 из “Руководства Пользователя APL\360” (таблица 1, 2 и 3)

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

(~T∊T ∘.×T)/T←1 ↓⍳ R

Определение частного выражения

Частное выражение Значение, если R равняется 6
⍳R 1 2 3 4 5 6
T←1↓ 2 3 4 5 6
T∘.×T 4 6 8 10 12
6 9 12 15 18
8 12 16 20 24
10 15 20 25 30
12 18 24 30 36
T∊ 0 0 1 0 1
~ 1 1 0 1 0
( )/T 2 3 5

В программе нет петель. Операторы языка APL могут применять легкие способы ко всем видам вычислений, где обычно потребовались бы петли. Например, выражение, определяющее число элементов вектора X, которые больше 100 будет +/X>100.
Но конечно, условные операторы и петли иногда необходимы.

Похвала и критика языка APL


Как уже упоминалось, APL не был первоначально разработан как язык программирования. Вот, что сказал на эту тему Айверсон:

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


У языка APL есть преданные поклонники. Как например Алан Перлис (первый получатель Премии Тьюринга ACM, в 1966 г.):

Радует глаз изобретательное и красивое взаимодействие операции и контроля, которое в других языках программирования заметных только на некоторых страницах текста. Каждый начинает ценить появление и значение стиля. Многие получают свободу самовыражения в вольностях языка APL. Я раньше описывал Pascal, как «фашистский язык программирования», потому что он властный, четкий и имеющий рамки… Так вот, если Pascal фашистский, то язык APL — анархистский.


Одним из существенных минусах выделяют сложность расшифровки языка APL. Есть популярная шутка о том, что APL — это язык только одного написания, потому что даже его автор с трудом может разобрать и понять код. Ниже представлены примеры двух различных «острот» от APL, которые реализуют версии Игры «Жизнь» — клеточного автомата, придуманного английским математиком Джоном Конвеем (1970 г.).

life←{↑1 ω∨.∧3 4=+/,¯1 0 1∘.⊖¯1 0 1∘.⌽⊂ω}

Шифр не для слабонервных

Голландский ученый и программист Эдсгер Дейкстра сказал:

Язык APL — ошибка, стремящаяся к совершенству. Это язык будущего для программных методов прошлого.


Популярность языка APL начала снижаться с середины 80-х, когда начали активно развиваться другие системы математических вычислений. Они оказались более интуитивными и смогли лучше удовлетворить потребности пользователей. Тем ни менее, язык APL и языки, которые появились на его основе (такие как APL2 и J), все еще используются в программировании. В наше время APL применяется в финансовых и математических приложениях. Он поддерживается практически на всех аппаратных платформах. По данному языку каждый год проходят конференции в рамках Association for Computer Machinery.




По традиции, немного рекламы в подвале, где она никому не помешает. Напоминаем, что в связи с тем, что общая емкость сети нидерландского дата-центра, в котором мы предоставляем услуги, достигла значения 5 Тбит / с (58 точек присутствия, включения в 36 точек обмена, более, чем в 20 странах и 4213 пиринговых включений), мы предлагаем выделенные серверы в аренду по невероятно низким ценам, до конца месяца!

This entry passed through the Full-Text RSS service - if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.

Комментариев нет:

Отправить комментарий