У некоторых революционных языков наблюдалась четкая направленность, дифференцирующая их от большего количества собратьев общего назначения. 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.
Комментариев нет:
Отправить комментарий