У некоторых революционных языков наблюдалась четкая направленность, дифференцирующая их от большего количества собратьев общего назначения. 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://www.computerhistory.org/atchm/apl360-software-license-agreement/
Текстовый файл содержит 37,567 линий, который включают кодекс, макрос и глобальные определения. Чтобы получить доступ к этому материалу, нужно согласиться на условия лицензии, разрешающие только некоммерческое использование и не дающие право лицензировать его для третьих лиц, публикуя копии в сети.
Символы языка APL отличаются от других языков, они ближе к стандартной математике, чем к программированию. Кроме того, символы имеют два смысла — унарную и бинарную функции, которые могут быть непохожи. Например, символ ?, не /. Чтобы поддержать нетрадиционные символы, APL\360 использовал изготовленную на заказ клавиатуру со специальными символами в верхнем регистре.
Специальная клавиатура языка APL
Несмотря на это, в языке используются особо специфические знаки, которых нет на клавиатуре. Например, grade up изображают знаком ?.
Для печати программ Айверсон и Фолкофф убедили IBM спроектировать специальный «шар» для их 1050 и 2741 терминалов, использующих механизм пишущей машинки IBM Selectric.
«Шар»
Образец кода APL:
[6] L<(L?':')vL<,L ? drop To:
[7] L
После этого программы могли печатать и распечатывать. Пример печатной версии программы из Языкового руководства языка 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 v? R
Определение частного выражения
Частное выражение | Значение, если R равняется 6 |
?R | 1 2 3 4 5 6 |
T<1v | 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 пиринговых включений), мы предлагаем выделенные серверы в аренду по невероятно низким ценам, до конца месяца!
Комментарии (15)
bachin
16.01.2016 22:22+11Ох. В программе нет петель — это меня убило.
Вообще-то это слово в словаре программиста всегда было «цикл», а не «петля».
Так что если пользуетесь подстрочным автоматическим переводом — ну не ленитесь же вычитывать!
Я могу еще смириться с «Текстовый файл содержит 37,567 линий» (хотя всё-таки обычно считают в строках)
(Пойду напишу программу с петлями)Elena_sm
16.01.2016 23:14-7Прошу прощения за погрешности в переводе. Но смею заверить — это не «подстрочный автоматический перевод», а сугубо авторский. Просто автор не математик и не программист…
Scratch
17.01.2016 00:06+15Жаль, что статьи на хабр стали писать «не математики и не программисты». Обычно с автором даже перевода есть что обсудить в комментариях. А с вами о чем говорить?
Elena_sm
17.01.2016 00:44-7А разве статьи должны писать исключительно программисты и математики? Да и к счастью, я не одна на хабре могу комментировать...:)
khim
17.01.2016 01:24+6Никто никому ничего не обязан, да, комментировать на Хабре может кто угодно, но всё-таки основная дискессия ведётся с автором статьи или перевода.
На Хабре бывает интересно поспорить с автором перевода. Обычно он не во всём с автором согласен (всё-таки люди разные, на 100% мнения редко совпадают), но, так как статья ему очевидна близка (а иначе зачем бы он её переводил?), то расхождений в типичном случае немного.
А о чём говорить с человеком, который о теме статьи ничего не знает?
random1st
17.01.2016 12:12+1Ну по-крайней мере, прежде чем публиковать подобный материал, дайте прочитать кому-нибудь в теме. Или Вы тематику статей с потолка берете?
pehat
17.01.2016 12:00+2Как живой человек, обремененный интеллектом, может перевести в статье про язык программирования слово «code» как «кодекс»? Я в это отказываюсь верить.
kstep
17.01.2016 16:40+3Чтобы переводчику стало понятнее, речь идёт про это предложение:
Текстовый файл содержит 37,567 линий, который включают кодекс, макрос и глобальные определения.
линии = lines = строки (устоявшийся технический термин и его перевод)
макрос — думаю, что всё же максросы (macro ед.ч., macros мн.ч., русская калька «макрос» в роли единственного числа взята из необычности звучания слова «макро» в русском, т.к. это больше похоже на приставку, чем на полноценное слово)
кодекс = code = код (в смысле «код программы», а не в смысле «свод законов», это не юриспруденция)
Смею предположить, что автор перевода имеет юридическое образование.
Советую в будущем консультироваться с людьми, компетентными в той области, из которой взят текст для перевода.
И пожалуйста, ради Б-га, не беритесь за перевод инструкции к медицинской технике! Пожалейте пациентов!
NeoCode
Глядя на клавиатуру APL, еще раз прихожу к выводу: жаль, что многие математические и специальные символы не вошли в базовую таблицу ASCII (и значит, их нет на клавиатурах любой страны мира). Современные языки программирования могли бы быть гораздо богаче… и не пришлось бы в С++ для шаблонов использовать знаки «больше» и «меньше».
gbg
Согласно Закону Линуса, в любом случае, все эти символы пошли бы на создание прикольных смайликов
ivlis
Совершенно согласен. После Mathematica, где у каждого символа 4 шрифта, греческие буквы и ещё куча спецсимволов программировать только в ASCII невероятно скучно.