Введение
Функциональный язык программирования для массивов
APL (названный в честь книги «A Programming Language») — это язык программирования, разработанный в 1960-х годах Кеннетом Иверсоном. Его центральным типом данных является многомерный массив. Он использует широкий спектр специальных графических символов для представления большинства функций и операторов, что позволяет создавать очень компактный код. APL оказал значительное влияние на развитие концептуального моделирования, электронных таблиц, функционального программирования и компьютерных математических пакетов. В 1979 году Иверсон получил премию Тьюринга за свою работу над APL.
Разработка языка программирования
В 1962 году была предпринята первая попытка использовать нотацию для описания полноценной компьютерной системы, после того как Фалькофф обсудил с Уильямом Картером свою работу по стандартизации набора инструкций для машин, которые впоследствии стали семейством IBM System/360. В 1963 году Герберт Хеллерман, работавший в IBM Systems Research Institute, реализовал часть нотации на компьютере IBM 1620, и она использовалась студентами в специальном школьном курсе по вычислению трансцендентных функций методом суммирования рядов. Студенты тестировали свой код в лаборатории Хеллермана. Эта реализация части нотации получила название Персонализированный транслятор массивов (PAT). В 1963 году Фалькофф, Айверсон и Эдвард Х. Суссенгут-младший, все работавшие в IBM, использовали нотацию для формального описания архитектуры и функциональности машин серии IBM System/360, что привело к публикации статьи в журнале IBM Systems Journal в 1964 году. После публикации команда сосредоточилась на реализации нотации на компьютерной системе. Одним из стимулов для такого подхода к реализации был интерес Джона Л. Лоуренса, который получил новые обязанности в Science Research Associates, образовательной компании, приобретенной IBM в 1964 году. Лоуренс попросил Айверсона и его группу помочь в использовании языка как инструмента для разработки и применения компьютеров в образовании. После того, как Лоуренс М. Брид и Филипп С. Абрамс из Стэнфордского университета присоединились к команде IBM Research, они продолжили свою предыдущую работу над реализацией, написанной на FORTRAN IV для части нотации, которая была выполнена для компьютера IBM 7090, работающего под управлением операционной системы IBSYS. Эта работа была завершена в конце 1965 года и впоследствии получила название IVSYS (от системы Иверсона). Основа этой реализации была подробно описана Абрамсом в техническом отчете Стэнфордского университета «Интерпретатор для нотации Иверсона» в 1966 году. Научным руководителем этой работы формально был Никлаус Вирт. Как и более ранняя система PAT Хеллермана, эта реализация не включала набор символов APL, а использовала специальные английские зарезервированные слова для функций и операторов. Впоследствии система была адаптирована для системы с разделением времени, и к ноябрю 1966 года она была перепрограммирована для компьютера IBM System/360 Model 50, работающего в режиме разделения времени, и использовалась внутри IBM.
Оборудование
Ключевым фактором, позволившим эффективно использовать APL до широкого распространения терминалов с электронно-лучевой трубкой (CRT), стала разработка специального сменного печатающего элемента для пишущей машинки IBM Selectric, содержащего все специальные символы APL. Он использовался в бумажных терминалах, оснащенных пишущей машинкой Selectric и механизмом печатающего элемента, таких как терминалы IBM 1050 и IBM 2741. На стандартные клавиши можно было надевать накладки, показывающие, какой символ APL будет введен и напечатан при нажатии этой клавиши. Впервые программист мог вводить и видеть правильные символы APL, используемые в нотации Айверсона, а не быть вынужденным использовать громоздкие английские ключевые слова для их представления. Фалькофф и Айверсон разработали специальные печатающие элементы APL Selectric с номерами 987 и 988 в конце 1964 года, хотя ни одна компьютерная система APL для их использования в то время не была доступна. Айверсон назвал Фалькоффа источником вдохновения для идеи использования печатающего элемента IBM Selectric для набора символов APL. Многие символы APL, даже при наличии символов APL на печатающем элементе Selectric, все равно приходилось вводить путем двойного набора существующих символов. Например, символ "Grade up" создавался путем набора дельты (сдвиг H) и штриха Шеффера (сдвиг M). Это было необходимо, поскольку набор символов APL был значительно больше, чем 88 символов, допустимых на печатающем элементе, даже если буквы ограничивались только прописными.
Микрокомпьютеры
На микрокомпьютерах, которые стали доступны с середины 1970-х годов, BASIC стал доминирующим языком программирования. Тем не менее, некоторые микрокомпьютеры предлагали APL вместо него – первым был MCM/70 на базе Intel 8008, выпущенный в 1974 году и в основном использовавшийся в образовательных целях. Другой машиной того времени был VideoBrain Family Computer, выпущенный в 1977 году и поставлявшийся со своим диалектом APL, называемым APL/S. Commodore SuperPET, представленный в 1981 году, включал интерпретатор APL, разработанный Университетом Ватерлоо. В 1976 году Билл Гейтс заявил в своем открытом письме любителям, что Microsoft разрабатывает APL для Intel 8080 и Motorola 6800, но у компании было "очень мало стимулов предоставлять его любителям" из-за пиратства программного обеспечения. Эта версия так и не была выпущена.
APL2
Начиная с начала 1980-х годов, разработка IBM APL под руководством Джима Брауна представила новую версию языка APL, основным усовершенствованием которой стала концепция вложенных массивов, позволяющая массиву содержать другие массивы, а также новые языковые средства, облегчающие интеграцию вложенных массивов в ход выполнения программы. Кен Айверсон, утратив контроль над разработкой языка APL, покинул IBM и присоединился к I. P. Sharp Associates, где одним из его ключевых вкладов стало направление развития Sharp APL в соответствии со своим видением. APL2 впервые был выпущен для CMS и TSO в 1984 году. Версия APL2 Workstation (Windows, OS/2, AIX, Linux и Solaris) появилась позднее. В то время как другие производители занимались разработкой интерпретаторов APL для нового оборудования, в частности, микрокомпьютеров на базе Unix, APL2 почти всегда выбирался в качестве стандарта для разработки новых интерпретаторов APL. И сегодня большинство поставщиков APL или их пользователи указывают на совместимость с APL2 как на преимущество своих продуктов. IBM отмечает его применение для решения задач, проектирования систем, создания прототипов, инженерных и научных расчетов, экспертных систем, обучения математике и другим дисциплинам, визуализации данных и доступа к базам данных.
Современные реализации
Различные реализации APL, такие как APLX, Dyalog и другие, включают расширения для объектно-ориентированного программирования, поддержку .NET, примитивы преобразования XML-массивов, средства графического отображения, интерфейсы операционных систем и выражения лямбда-исчисления. Бесплатные версии включают GNU APL для Linux и NARS2000 для Windows (который работает в Linux под Wine). Обе эти версии являются достаточно полными реализациями APL2 с различными расширениями языка.
Набор символов
APL подвергалась как критике, так и похвале за выбор уникального, нестандартного набора символов. В 1960-х и 1970-х годах немногие терминалы или дисплеи могли воспроизвести набор символов APL. Наиболее популярные использовали печатный механизм IBM Selectric со специальным шрифтом APL. Одним из первых линейных терминалов APL (работа только в текстовом режиме, без поддержки полного экрана) был Texas Instruments TI Model 745 (ок. 1977 г.) с полным набором символов APL, поддерживавший полу- и полнодуплексный режимы связи для взаимодействия со службой совместного использования времени APL или удалённым мейнфреймом для выполнения удалённой компьютерной задачи, называемой RJE. Со временем, с широким распространением высококачественных графических дисплеев, принтеров и поддержкой Unicode, проблема со шрифтами APL в значительной степени была решена. Однако ввод символов APL требует использования редакторов методов ввода, раскладок клавиатуры, виртуальных или экранных наборов символов APL, либо печатных подсказок-клавиатур, что может вызывать затруднения у начинающих, привыкших к другим языкам программирования. Исследование среди старшеклассников, не имевших опыта работы с другими языками программирования, показало, что ввод и использование символов APL не создавало студентам никаких ощутимых проблем. В защиту APL можно сказать, что для ввода требуется меньше символов, а раскладки клавиатуры со временем запоминаются. Специальные клавиатуры APL также производятся и используются сегодня, как и свободно распространяемые шрифты для операционных систем, таких как Microsoft Windows. Заявленный прирост производительности предполагает, что пользователь должен достаточно долго работать с языком, чтобы запоминание символов, их семантики и раскладок клавиатуры, не говоря уже о большом количестве идиом для типовых задач, было оправданным.
Экспоненциальное выражение
Еще один пример этой темы — представление возведения в степень в APL, которое записывается как , обозначая 2 в степени 3 (в некоторых языках это было бы записано как или , а в других потребовался бы вызов функции, например, ). Многие языки используют для обозначения умножения, как в , но APL выбирает использовать . Однако, если основание не указано (как в выражении в APL или в других языках), большинство языков программирования расценило бы это как синтаксическую ошибку. APL же предполагает, что отсутствующее основание — это число Эйлера (основание натурального логарифма) e, и интерпретирует как .
Простая статистика
Предположим, что X — это массив чисел. Тогда вычисляет его среднее значение. Читая справа налево, дает количество элементов в X, и поскольку является диадным оператором, требуется также операнд слева от него. Он заключен в скобки, иначе X будет интерпретирован как аргумент (в результате чего суммирование будет произведено для каждого элемента X, деленного на количество элементов в X), а вычисляет сумму элементов X. На основе этого, следующее выражение вычисляет стандартное отклонение:
Естественно, это выражение целесообразно определить как функцию для повторного использования, а не переписывать его каждый раз. Более того, поскольку присваивание является оператором, оно может встречаться внутри выражения, поэтому следующее присвоит подходящие значения переменным T, AV и SD:
Игра жизни
Следующая функция "life", написанная на языке Dyalog APL, принимает булеву матрицу и вычисляет новое поколение согласно правилам игры «Жизнь» Конвея. Она демонстрирует мощь APL в реализации сложного алгоритма в очень компактном коде, однако для понимания требуется продвинутое знание APL (как и для аналогичной программы на многих других языках). life ← {⊃1 ⍵ ∨.∧ 3 4 = +/ +⌿ ¯1 0 1 ∘.⊖ ¯1 0 1 ⌽¨ ⊂⍵}
Логотип
Между поставщиками АПЛ всегда существовало сотрудничество, и с 1969 по 2010 год регулярно проводились совместные конференции. На этих конференциях часто раздавалась сувенирная продукция APL с изображениями, связанными с APL, или подборкой логотипов поставщиков. Распространенными были яблоки (как игра слов, основанная на схожести звучания слов "apple" и "APL") и фрагмент кода, который получается на классической клавиатуре APL при нажатии клавиш "APL" с удерживаемым модификатором APL. Несмотря на все эти усилия сообщества, универсальный логотип, не зависящий от конкретного поставщика, для языка программирования так и не был создан. Поскольку популярные языки программирования все чаще получают узнаваемые логотипы (например, Fortran – в 2020 году), Британская ассоциация APL во второй половине 2021 года запустила кампанию по созданию логотипа для APL. После голосования сообщества и нескольких этапов сбора отзывов логотип был выбран в мае 2022 года.
АПЛ\360
Первая реализация APL с использованием узнаваемых символов APL была APL\360, работавшая на IBM System/360 и завершенная в ноябре 1966 года, хотя на тот момент она использовалась только внутри IBM. В 1975 году микрокомпьютер IBM 5100 предлагал APL\360 как один из двух встроенных интерпретируемых языков на основе ROM для компьютера, в комплекте с клавиатурой и дисплеем, поддерживающими все специальные символы, используемые в языке. Значительные усовершенствования APL\360 включали CMS/APL, который использовал возможности виртуальной памяти CMS, и APLSV, который представил общие переменные, системные переменные и системные функции. Впоследствии она была портирована на платформы IBM System/370 и VSPC до окончательного выпуска в 1983 году, после чего её заменил APL2. Она стала самым популярным программным обеспечением из библиотеки IBM Type III, выпущенным IBM.
APL*Plus и Sharp APL
APL*Plus и Sharp APL – это версии APL\360 с добавленными бизнес-ориентированными расширениями, такими как форматирование данных и средства для хранения массивов APL во внешних файлах. Они были разработаны совместно двумя компаниями, в которых работали различные члены оригинальной команды разработчиков IBM APL\360. Этими компаниями были I. P. Sharp Associates (IPSA), компания, предоставляющая услуги APL\360, основанная в 1964 году Яном Шарпом, Роджером Муром и другими, и STSC, компания, предоставляющая услуги совместного использования времени и консалтинговые услуги, основанная в 1969 году Лоуренсом Бридом и другими. Вместе они разработали APL*Plus, а затем продолжили сотрудничать, но разрабатывали APL отдельно как APL*Plus и Sharp APL. STSC портировала APL*Plus на множество платформ, создав версии для VAX 11, PC и UNIX, в то время как IPSA выбрала иной подход к появлению персональных компьютеров и сделала Sharp APL доступным на этой платформе, используя дополнительное оборудование PC XT/360. В 1993 году была основана компания Soliton Incorporated для поддержки Sharp APL, которая развила Sharp APL в SAX (Sharp APL для Unix). По состоянию на 2018 год APL*Plus продолжает существовать как APL2000 APL+Win. В 1985 году Ян Шарп и Дэн Дайер из STSC совместно получили премию имени Кеннета Иверсона за выдающийся вклад в развитие APL.
АПЛГОЛ
В 1972 году APLGOL был выпущен как экспериментальная версия APL, расширенная конструкциями языка структурированного программирования. Были добавлены новые операторы для управления потоком выполнения, условного выполнения операторов и структурирования кода, а также операторы, предназначенные для повышения ясности алгоритма. Реализация для Hewlett Packard была выполнена в 1977 году.
Диалог APL
Dyalog APL был впервые выпущен британской компанией Dyalog Ltd. в 1983 году и, по состоянию на 2018 год, доступен для платформ AIX, Linux (включая Raspberry Pi), macOS и Microsoft Windows. Он основан на APL2 и включает расширения для поддержки объектно-ориентированного, функционального и неявного программирования. Лицензии бесплатны для личного некоммерческого использования. В 1995 году два члена команды разработчиков – Джон Скоулз и Питер Доннели – были удостоены премии Айверсона за их работу над интерпретатором. Гитте Кристенсен и Мортен Кромберг совместно получили премию Айверсона в 2016 году.
NARS2000
NARS2000 — это интерпретатор APL с открытым исходным кодом, разработанный Бобом Смитом, выдающимся разработчиком и реализатором APL из STSC в 1970-х и 1980-х годах. NARS2000 включает в себя продвинутые функции и новые типы данных и работает непосредственно под Microsoft Windows, а также на других платформах через Wine. Он получил своё название в честь инструмента разработки 1980-х годов NARS (Nested Arrays Research System).
АПЛХ
APLX — кроссплатформенный диалект APL, основанный на APL2 и включающий несколько расширений, впервые выпущенный британской компанией MicroAPL в 2002 году. Несмотря на то, что разработка прекращена и он больше не продаётся, сейчас он доступен бесплатно от Dyalog.
Йоркский АПЛ
York APL был разработан в Йоркском университете (Онтарио) около 1968 года для работы на мейнфреймах IBM 360. Одним из существенных отличий от APL\360 было то, что в нём "форма" (ρ) скаляра определялась как 1, в то время как в APL\360 она определялась как более математически корректное значение 0 — это упрощало написание функций, одинаково работающих со скалярами и векторами.
GNU APL
GNU APL — это свободная реализация расширенного APL в соответствии со спецификацией ISO/IEC 13751:2001 и, следовательно, является реализацией APL2. Она работает в операционных системах Linux, macOS, различных диалектах BSD и Windows (либо с использованием Cygwin для полной поддержки всех системных функций, либо как 64-битный исполняемый файл Windows с ограниченной поддержкой системных функций). GNU APL использует Unicode внутри и поддерживает написание скриптов. Её автором является Юрген Зауерманн. Ричард Столлман, основатель проекта GNU, был одним из первых пользователей APL, использовав его для написания текстового редактора, будучи учеником старшей школы летом 1969 года.
Распознавание идиомов
Большинство интерпретаторов APL поддерживают распознавание идиом и вычисляют распространённые идиомы как единые операции. Например, вычисляя идиому BV/⍳⍴A как единую операцию (где BV — булев вектор, а A — массив), можно избежать создания двух промежуточных массивов.
Оптимизированный байт-код
Слабая типизация в APL означает, что имя может ссылаться на массив (любого типа данных), функцию или оператор. Как правило, интерпретатор не может заранее знать, какую форму примет имя, и поэтому должен выполнять анализ, проверку синтаксиса и т.п. во время выполнения. Однако, в определенных случаях можно заранее определить, на какой тип, как ожидается, будет ссылаться имя, и затем сгенерировать байт-код, который может быть выполнен с уменьшенными накладными расходами на время выполнения. Этот байт-код также может быть оптимизирован с использованием методов компиляции, таких как свертка констант или исключение общих подвыражений. Интерпретатор будет выполнять байт-код, когда он доступен и когда выполняются сделанные предположения. Dyalog APL включает поддержку оптимизированного байт-кода, который был выпущен примерно в 1971 году. Чтобы компилировать APL, необходимо наложить ограничения на язык. APEX – исследовательский компилятор APL, написанный Робертом Бернеки и распространяемый под лицензией GNU General Public License. STSC APL Compiler – это гибрид оптимизатора байт-кода и компилятора, который позволяет компилировать функции в машинный код при условии, что его подфункции и глобальные переменные объявлены, но интерпретатор по-прежнему используется в качестве библиотеки времени выполнения и для выполнения функций, не соответствующих требованиям компиляции.
Стандарты
APL был стандартизирован рабочей группой X3J10 Американского национального института стандартов (ANSI) и Международной организацией по стандартизации (ISO) совместно с Международной электротехнической комиссией (IEC) в рамках Совместного технического комитета ISO/IEC 1, Подкомитета 22, Рабочей группы 3. Основной язык APL специфицирован в ISO 8485:1989, а расширенный язык APL – в ISO/IEC 13751:2001.
Видео
– интервью в стиле ток-шоу 1974 года с первоначальными разработчиками APL. – живая демонстрация APL в 1975 году профессором Бобом Спенсом из Имперского колледжа Лондона. – учебное пособие 2009 года от Джона Скоулза из Dyalog Ltd., реализующее игру «Жизнь» Конвея в одну строку APL. – вводная статья об APL 2009 года от Грэма Робертсона.