APL (названный в честь книги A Programming Language ) [3] — язык программирования, разработанный в 1960-х годах Кеннетом Э. Айверсоном . Его центральным типом данных является многомерный массив . Он использует большой набор специальных графических символов [4] для представления большинства функций и операторов, что приводит к очень краткому коду. Он оказал важное влияние на развитие концептуального моделирования, электронных таблиц , функционального программирования [5] и пакетов компьютерной математики. [ 6] Он также вдохновил несколько других языков программирования. [7] [8]
Математическая нотация для манипулирования массивами была разработана Кеннетом Э. Айверсоном , начиная с 1957 года в Гарвардском университете . В 1960 году он начал работать в IBM , где он разработал эту нотацию с Адином Фалькоффом и опубликовал ее в своей книге «Язык программирования» в 1962 году. [3] В предисловии излагается ее предпосылка:
Прикладная математика в значительной степени связана с разработкой и анализом явных процедур для вычисления точных или приблизительных значений различных функций. Такие явные процедуры называются алгоритмами или программами . Поскольку эффективная нотация для описания программ демонстрирует значительную синтаксическую структуру, ее называют языком программирования .
Эта нотация использовалась в IBM для кратких исследовательских отчетов о компьютерных системах, таких как Burroughs B5000 и его стековый механизм, когда IBM оценивала стековые машины по сравнению с регистровыми машинами для будущих компьютеров.
Айверсон также использовал свою нотацию в черновике главы «Язык программирования» , написанной для книги, которую он писал совместно с Фредом Бруксом , «Автоматическая обработка данных» , которая была опубликована в 1963 году. [9] [10]
В 1979 году Айверсон получил премию Тьюринга за свою работу над APL. [11]
Первая попытка использовать эту нотацию для описания полной компьютерной системы была предпринята еще в 1962 году после того, как Фалькофф обсудил с Уильямом К. Картером свою работу по стандартизации набора инструкций для машин, которые впоследствии стали семейством IBM System/360 .
В 1963 году Герберт Хеллерман, работавший в IBM Systems Research Institute, реализовал часть нотации на компьютере IBM 1620 , и она использовалась студентами в специальном курсе средней школы по вычислению трансцендентных функций путем суммирования рядов. Студенты тестировали свой код в лаборатории Хеллермана. Эта реализация части нотации была названа Personalized Array Translator (PAT). [12]
В 1963 году Фалькофф, Айверсон и Эдвард Х. Сассенгут-младший , все работавшие в IBM, использовали нотацию для формального описания архитектуры и функциональности машин серии IBM System/360 , что привело к публикации статьи в журнале IBM Systems Journal в 1964 году. После публикации группа обратила внимание на реализацию нотации в компьютерной системе. Одной из причин такого подхода к реализации был интерес Джона Л. Лоуренса, у которого появились новые обязанности в Science Research Associates , образовательной компании, купленной IBM в 1964 году. Лоуренс попросил Айверсона и его группу помочь использовать язык в качестве инструмента для разработки и использования компьютеров в образовании. [13]
После того, как Лоуренс М. Брид и Филип С. Абрамс из Стэнфордского университета присоединились к команде IBM Research, они продолжили свою предыдущую работу над реализацией, запрограммированной на FORTRAN IV для части нотации, которая была сделана для компьютера IBM 7090 , работающего под управлением операционной системы IBSYS . Эта работа была завершена в конце 1965 года и позже названа IVSYS (для системы Айверсона). Основа этой реализации была подробно описана Абрамсом в техническом отчете Стэнфордского университета «Интерпретатор для нотации Айверсона» в 1966 году. Академический аспект этого формально курировался Никлаусом Виртом . [14] Как и система PAT Хеллермана ранее, эта реализация опустила набор символов APL, но использовала специальные зарезервированные английские слова для функций и операторов. Позднее система была адаптирована для системы разделения времени , и к ноябрю 1966 года она была перепрограммирована для компьютера IBM System/360 Model 50, работающего в режиме разделения времени, и использовалась внутри IBM. [15]
Ключевым достижением в возможности эффективного использования APL, до широкого использования терминалов с электронно-лучевой трубкой (ЭЛТ), стала разработка специального сменного печатающего элемента для пишущей машинки IBM Selectric со всеми специальными символами APL на нем. Он использовался на рабочих станциях с бумажной печатью, использующих механизм печатающего элемента Selectric и печатающего элемента, таких как терминалы IBM 1050 и IBM 2741. Клавишные колпачки можно было разместить поверх обычных клавиш, чтобы показать, какие символы APL будут введены и напечатаны при нажатии этой клавиши. Впервые программист мог печатать и видеть правильные символы APL, используемые в нотации Айверсона, и не быть вынужденным использовать неуклюжие английские ключевые слова, представляющие их. У Фолкоффа и Айверсона были специальные печатающие элементы APL Selectric, 987 и 988, разработанные в конце 1964 года, хотя компьютерная система APL не была доступна для их использования. [16] Айверсон ссылался на Фалькоффа как на вдохновителя идеи использования элемента набора символов IBM Selectric для набора символов APL. [17]
Многие символы APL, даже с символами APL на печатающем элементе Selectric, все еще приходилось набирать, перечеркивая два существующих символа элемента. Примером может служить символ grade up , который нужно было сделать из дельты (shift-H) и штриха Шеффера (shift-M). Это было необходимо, поскольку набор символов APL был намного больше, чем 88 символов, разрешенных на печатающем элементе, даже когда буквы были ограничены заглавными (капиталом).
Первый интерактивный вход в систему APL и создание рабочего пространства APL были осуществлены в 1966 году Ларри Бридом с использованием терминала IBM 1050 в лабораториях IBM Mohansic Labs недалеко от исследовательского центра Томаса Дж. Уотсона , где находится APL, в Йорктаун-Хайтс , штат Нью-Йорк. [16]
IBM в основном отвечала за внедрение APL на рынок. Первая общедоступная версия APL была выпущена в 1968 году для IBM 1130. IBM предоставила APL\1130 бесплатно, но без обязательств или поддержки. [18] [19] Он мог работать всего с 8k 16-битных слов памяти и использовал выделенный жесткий диск на 1 мегабайт.
APL закрепился на системах разделения времени мэйнфреймов с конца 1960-х до начала 1980-х годов, отчасти потому, что он поддерживал нескольких пользователей на системах с более низкими спецификациями, которые не имели оборудования для динамической трансляции адресов . [20] Дополнительные улучшения производительности для выбранных систем мэйнфреймов IBM System/370 включали APL Assist Microcode , в котором некоторая поддержка выполнения APL была включена в прошивку процессора , в отличие от полностью реализованной программным обеспечением более высокого уровня. Несколько позже, когда подходящее по производительности оборудование наконец стало доступным в середине-конце 1980-х годов, многие пользователи перенесли свои приложения в среду персональных компьютеров.
Ранние интерпретаторы IBM APL для оборудования IBM 360 и IBM 370 реализовали собственное многопользовательское управление вместо того, чтобы полагаться на хост-сервисы, таким образом, они были своими собственными системами разделения времени. Впервые представленная для использования в IBM в 1966 году, система APL\360 [21] [22] [23] была многопользовательским интерпретатором. Возможность программного взаимодействия с операционной системой для получения информации и установки системных переменных интерпретатора была реализована с помощью специальных привилегированных функций "I-beam", использующих как монадические , так и диадические операции. [24]
В 1973 году IBM выпустила APL.SV , который был продолжением того же продукта, но который предлагал общие переменные как средство доступа к объектам за пределами системы APL, таким как файлы операционной системы. В середине 1970-х годов интерпретатор мэйнфрейма IBM был даже адаптирован для использования на настольном компьютере IBM 5100 , который имел небольшой ЭЛТ и клавиатуру APL, когда большинство других небольших компьютеров того времени предлагали только BASIC . В 1980-х годах программный продукт VSAPL широко использовался пользователями Conversational Monitor System (CMS), Time Sharing Option (TSO), VSPC , MUSIC/SP и CICS .
В 1973–1974 годах Патрик Э. Хагерти руководил внедрением интерпретатора APL Мэрилендского университета для серии 1100 мэйнфреймов Sperry UNIVAC 1100/2200 . [25] В 1974 году студенту Алану Стеббенсу было поручено реализовать внутреннюю функцию. [26] Xerox APL был доступен с июня 1975 года для мэйнфреймов Xerox 560 и Sigma 6, 7 и 9, работающих под управлением CP-V , а также для Honeywell CP-6 . [27]
В 1960-х и 1970-х годах возникло несколько фирм с разделением времени, которые продавали услуги APL, используя модифицированные версии интерпретатора IBM APL\360 [23] . В Северной Америке наиболее известными из них были IP Sharp Associates , Scientific Time Sharing Corporation (STSC), Time Sharing Resources (TSR) и The Computer Company (TCC). CompuServe также вышла на рынок в 1978 году с интерпретатором APL, основанным на модифицированной версии Digital Equipment Corp и Carnegie Mellon's, который работал на 36-битных машинах KI и KL компании DEC. APL компании CompuServe был доступен как для коммерческого рынка, так и для потребительской информационной службы. С появлением сначала менее дорогих мэйнфреймов, таких как IBM 4300 , а затем и персональных компьютеров, к середине 1980-х годов индустрия разделения времени практически сошла на нет.
Sharp APL был доступен от IP Sharp Associates, сначала как сервис разделения времени в 1960-х годах, а затем как программный продукт, начиная примерно с 1979 года. Sharp APL представлял собой усовершенствованную реализацию APL со многими языковыми расширениями, такими как пакеты (возможность помещать один или несколько объектов в одну переменную), файловая система, вложенные массивы и общие переменные .
Интерпретаторы APL также были доступны у других производителей мэйнфреймов и мини-компьютеров, в частности, Burroughs , Control Data Corporation (CDC), Data General , Digital Equipment Corporation (DEC), Harris , Hewlett-Packard (HP), Siemens , Xerox и других.
Гарт Фостер из Сиракузского университета спонсировал регулярные встречи сообщества разработчиков APL в конференц-центре Minnowbrook в Сиракузах в Blue Mountain Lake, штат Нью-Йорк . В последующие годы Юджин Макдоннелл организовал аналогичные встречи в конференц-центре Asilomar около Монтерея , штат Калифорния , и в Pajaro Dunes около Уотсонвилля , штат Калифорния. Специальная группа интересов SIGAPL Ассоциации вычислительной техники продолжает поддерживать сообщество APL. [28]
На микрокомпьютерах, которые стали доступны с середины 1970-х годов, BASIC стал доминирующим языком программирования. [29] Тем не менее, некоторые микрокомпьютеры вместо этого предоставляли APL – первым был MCM/70 на базе Intel 8008 , выпущенный в 1974 году [30] [31] и в основном использовавшийся в образовании. [32] Другой машиной того времени был компьютер VideoBrain Family Computer , выпущенный в 1977 году, который поставлялся с диалектом APL, называемым APL/S. [33]
Commodore SuperPET , представленный в 1981 году, включал в себя интерпретатор APL, разработанный Университетом Ватерлоо . [34]
В 1976 году Билл Гейтс в своем Открытом письме любителям утверждал , что корпорация Microsoft внедряла APL для Intel 8080 и Motorola 6800, но имела «очень мало стимулов сделать [его] доступным для любителей» из-за пиратства программного обеспечения . [35] Он так и не был выпущен.
Начиная с начала 1980-х годов, разработка IBM APL под руководством Джима Брауна реализовала новую версию языка APL, которая содержала в качестве своего основного усовершенствования концепцию вложенных массивов , где массив может содержать другие массивы, и новые языковые возможности, которые облегчали интеграцию вложенных массивов в рабочий процесс программы. Кен Айверсон, больше не контролировавший разработку языка APL, покинул IBM и присоединился к IP Sharp Associates , где одним из его основных вкладов было направление эволюции Sharp APL в большее соответствие с его видением. [36] [37] [38] APL2 был впервые выпущен для CMS и TSO в 1984 году . [39] Позднее появилась редакция APL2 Workstation (Windows, OS/2 , AIX , Linux и Solaris ). [40] [41]
Поскольку другие поставщики были заняты разработкой интерпретаторов APL для нового оборудования, в частности, для микрокомпьютеров на базе Unix , APL2 почти всегда был стандартом, выбранным для новых разработок интерпретаторов APL. Даже сегодня большинство поставщиков APL или их пользователей ссылаются на совместимость с APL2 как на аргумент в пользу продажи этих продуктов. [42] [43] IBM ссылается на его использование для решения проблем, проектирования систем, создания прототипов, инженерных и научных вычислений, экспертных систем, [44] для обучения математике и другим предметам, визуализации и доступа к базам данных. [45]
Различные реализации APL от APLX, Dyalog и др. включают расширения для объектно-ориентированного программирования , поддержку .NET , примитивы преобразования XML-массивов, графическое построение, интерфейсы операционной системы и выражения лямбда-исчисления . Бесплатные версии включают GNU APL для Linux и NARS2000 для Windows (которая также работает на Linux под Wine). Обе они являются довольно полными версиями APL2 с различными языковыми расширениями.
APL лег в основу или оказал влияние на следующие языки: [ необходима ссылка ]
APL критиковали и хвалили за выбор уникального, нестандартного набора символов. В 1960-х и 1970-х годах лишь немногие терминальные устройства или даже дисплеи могли воспроизводить набор символов APL. Самые популярные из них использовали механизм печати IBM Selectric , используемый со специальным элементом типа APL. Одним из ранних линейных терминалов APL (работа только в линейном режиме, а не на весь экран) был Texas Instruments TI Model 745 ( около 1977 г. ) с полным набором символов APL [48] , который имел полудуплексные и полнодуплексные режимы телекоммуникаций для взаимодействия со службой разделения времени APL или удаленным мэйнфреймом для запуска удаленного компьютерного задания, удаленного ввода задания (RJE).
Со временем, с повсеместным использованием высококачественных графических дисплеев, печатающих устройств и поддержкой Unicode , проблема шрифта символов APL была в значительной степени устранена. Однако ввод символов APL требует использования редакторов методов ввода , сопоставлений клавиатуры, виртуальных/экранных наборов символов APL, [49] [50] или простых в использовании печатных клавиатурных карточек, которые могут разочаровать новичков, привыкших к другим языкам программирования. [51] [52] [53] Исследование с участием учеников старших классов показало, что набор текста и использование символов APL не мешали ученикам каким-либо измеримым образом. [54]
В защиту APL можно сказать, что для его печати требуется меньше символов, а сопоставления клавиш запоминаются со временем. Специальные клавиатуры APL также производятся и используются сегодня, как и свободно загружаемые шрифты для операционных систем, таких как Microsoft Windows. [49] Сообщаемый рост производительности предполагает, что человек тратит достаточно времени на работу с языком, чтобы запоминание символов, их семантики, сопоставлений клавиш и многих идиом для общих задач было оправданным. [ требуется ссылка ]
В отличие от традиционно структурированных языков программирования, код APL обычно структурирован как цепочки монадических или диадических функций и операторов [55] , действующих на массивы . [56] В APL есть много нестандартных примитивов (функций и операторов), которые обозначаются одним символом или комбинацией нескольких символов. Все примитивы определены как имеющие одинаковый приоритет и всегда ассоциируются справа. Таким образом, APL читается или лучше всего понимается справа налево .
Ранние реализации APL ( около 1970 г.) не имели структур управления потоком цикла программирования , таких как циклы или do
конструкции . Вместо этого они использовали операции с массивами, а использование структурных программных конструкций часто было ненужным, поскольку операция могла быть выполнена над полным массивом в одном операторе. Например, функция ( ) может заменить итерацию цикла for : ιN при применении к скалярному положительному целому числу дает одномерный массив (вектор), 1 2 3 ... N. Более поздние реализации APL обычно включают в себя комплексные структуры управления, так что структура данных и поток управления программой могут быть четко и ясно разделены.while
if-then-else
iota
ι
Среда APL называется рабочей областью . В рабочей области пользователь может определять программы и данные, т. е. значения данных существуют также вне программ, и пользователь может также манипулировать данными без необходимости определять программу. [57] В приведенных ниже примерах интерпретатор APL сначала вводит шесть пробелов, прежде чем ожидать ввода пользователя. Его собственный вывод начинается в первом столбце.
Пользователь может сохранить рабочее пространство со всеми значениями, программами и статусом выполнения.
APL использует набор не- ASCII символов, которые являются расширением традиционной арифметической и алгебраической нотации. Наличие односимвольных имен для одной инструкции, множественных векторных функций данных ( SIMD ) является одним из способов, с помощью которых APL позволяет компактно формулировать алгоритмы для преобразования данных, такие как вычисление игры «Жизнь» Конвея в одной строке кода. [58] Почти во всех версиях APL теоретически возможно выразить любую вычислимую функцию одним выражением, то есть в одной строке кода. [ требуется цитата ]
Из-за необычного набора символов многие программисты используют специальные клавиатуры с клавишами APL для написания кода APL. [59] Хотя существуют различные способы написания кода APL, используя только символы ASCII, [60] на практике это почти никогда не делается. (Можно подумать, что это подтверждает тезис Айверсона о нотации как инструменте мышления . [61] ) Большинство, если не все, современные реализации используют стандартные раскладки клавиатуры со специальными сопоставлениями или редакторами методов ввода для доступа к символам, не входящим в ASCII. Исторически шрифт APL был отличительным, с заглавными курсивными буквами и прямыми цифрами и символами. Большинство поставщиков продолжают отображать набор символов APL в пользовательском шрифте.
Сторонники APL [ кто? ] утверждают, что примеры так называемого кода только для записи (плохо написанного и почти непонятного кода) почти всегда являются примерами плохой практики программирования или ошибок новичков, которые могут возникнуть в любом языке. Сторонники также утверждают, что они гораздо более продуктивны с APL, чем с более традиционными компьютерными языками, и что работающее программное обеспечение может быть реализовано за гораздо меньшее время и с гораздо меньшим количеством программистов, чем при использовании других технологий. [ нужна цитата ]
Они также могут утверждать, что, поскольку он компактен и лаконичен, APL хорошо подходит для крупномасштабной разработки программного обеспечения и сложности, поскольку количество строк кода может быть значительно сокращено. Многие сторонники и практики APL также считают стандартные языки программирования, такие как COBOL и Java , сравнительно утомительными. APL часто встречается там, где важно время выхода на рынок, например, в торговых системах. [62] [63] [64] [65]
APL проводит четкое различие между функциями и операторами . [55] [66] Функции принимают массивы (переменные, константы или выражения) в качестве аргументов и возвращают массивы в качестве результатов. Операторы (подобные функциям высшего порядка ) принимают функции или массивы в качестве аргументов и выводят связанные функции. Например, функция суммы выводится путем применения оператора редукции к функции сложения . Применение того же оператора редукции к максимальной функции (которая возвращает большее из двух чисел) выводит функцию, которая возвращает наибольшее из группы (вектора) чисел. В языке J Айверсон заменил термины глагол на функцию и наречие или союз на оператор .
APL также определяет те функции, которые встроены в язык и представлены символом или фиксированной комбинацией символов, как примитивы . Большинство примитивов являются либо функциями, либо операторами. Кодирование APL в значительной степени представляет собой процесс написания непримитивных функций и (в некоторых версиях APL) операторов. Однако несколько примитивов не считаются ни функциями, ни операторами, наиболее заметно назначение.
Некоторые слова, используемые в литературе APL, имеют значения, отличающиеся от значений в математике и в общей компьютерной науке.
APL имеет явные представления функций, операторов и синтаксиса, тем самым обеспечивая основу для ясного и явного описания расширенных возможностей языка и инструментов для экспериментов с ними. [70]
Это отобразит « Привет, мир »:
'Привет, мир'
Основной темой проектирования в APL является определение действий по умолчанию в некоторых случаях, которые привели бы к синтаксическим ошибкам в большинстве других языков программирования.
Приведенная выше строковая константа «Hello, world» отображается, поскольку отображение является действием по умолчанию для любого выражения, для которого явно не указано действие (например, назначение, параметр функции).
Другим примером этой темы является то, что возведение в степень в APL записывается как 2*3
, что означает возведение 2 в степень 3 (это будет записано как 2^3
или 2**3
в некоторых языках, или отнесено к вызову функции, например pow(2, 3);
в других). Во многих языках *
для обозначения умножения используется , как в 2*3
, но APL предпочитает использовать 2×3
. Однако, если основание не указано (как в операторе *3
в APL или ^3
в других языках), в большинстве языков программирования это будет рассматриваться как синтаксическая ошибка. APL, однако, предполагает, что отсутствующее основание является константой натурального логарифма e , и интерпретирует *3
как 2.71828*3
.
Предположим, что X
это массив чисел. Затем (+/X)÷⍴X
дает его среднее значение. Чтение справа налево⍴X
дает количество элементов в X, и поскольку ÷
это двоичный оператор, то требуется также член слева от него. Он окружен скобками, поскольку в противном случае был бы взят X (так что суммирование было бы из X÷⍴X
—каждого элемента X, деленного на количество элементов в X), и +/X
дает сумму элементов X. Основываясь на этом, следующее выражение вычисляет стандартное отклонение :
(( + / (( X - ( + / X ) ÷⍴ X ) * 2 )) ÷⍴ X ) * 0,5
Естественно, можно было бы определить это выражение как функцию для повторного использования, а не переписывать его каждый раз. Кроме того, поскольку присваивание является оператором, оно может появляться внутри выражения, поэтому следующее поместит подходящие значения в T, AV и SD:
SD ← (( + / (( X - AV ← ( T ← + / X ) ÷⍴ X ) * 2 )) ÷⍴ X ) * 0,5
Следующее выражение немедленного режима генерирует типичный набор номеров лотереи Pick 6 : шесть псевдослучайных целых чисел в диапазоне от 1 до 40, гарантированно неповторяющихся , и отображает их в отсортированном по возрастанию порядке:
х [ ⍋ х ← 6 ? 40 ]
Вышеизложенное делает многое, кратко, хотя это может показаться сложным для нового APLer. Оно объединяет следующие функции APL (также называемые примитивами [71] и глифами [72] ):
?
(называемая deal
диадической), которая возвращает вектор, состоящий из выбранного числа (левый аргумент: 6 в данном случае) случайных целых чисел в диапазоне от 1 до указанного максимума (правый аргумент: 40 в данном случае), который, если указанный максимум ≥ длины вектора, гарантированно не будет повторяющимся; таким образом, генерируется/создается 6 случайных целых чисел в диапазоне от 1 до 40. [73]←
) переменной x
, так как он понадобится позже.⍋
, которая имеет в качестве своего правого аргумента все, что находится справа от нее до следующей несбалансированной закрывающей скобки или закрывающей круглой скобки. Результатом ⍋
являются индексы, которые помещают ее аргумент в порядке возрастания.⍋
используется для индексации переменной x
, которую мы сохранили ранее для этой цели, тем самым выбирая ее элементы в возрастающей последовательности.Поскольку слева от самого левого символа x нет функции, сообщающей APL, что делать с результатом, он просто выводит его на дисплей (в одной строке, разделенной пробелами), не требуя для этого никаких явных инструкций.
?
также имеет монадический эквивалент, называемый roll
, который просто возвращает одно случайное целое число между 1 и его единственным операндом [справа от него] включительно. Таким образом, программа ролевой игры может использовать выражение ?20
для броска двадцатигранной кости.
Следующее выражение находит все простые числа от 1 до R. Как во времени, так и в пространстве сложность вычисления составляет (в нотации «О большое» ).
( ~ Р ∊ Р ∘. × Р ) / Р ← 1 ↓⍳ Р
Если следовать справа налево, то это означает:
⍳
создает вектор, содержащий целые числа от1
доR
(еслиR= 6
в начале программы⍳R
это1 2 3 4 5 6
)↓
функция), т.е. 1
. Так же 1↓⍳R
как2 3 4 5 6
R
новый вектор ( ←
, примитив присваивания ), т.е.,2 3 4 5 6
/
репликации является диадическим (бинарным), и интерпретатор сначала оценивает его левый аргумент (полностью в скобках):R
на R
, т.е. матрицу, которая является таблицей умножения R на R ( °.×
оператор), т.е.R
в 1
каждом месте, где соответствующее число R
находится во внешней матрице произведения ( ∈
, включение множества или элемента или оператора Эпсилон ), т.е.,0 0 1 0 1
∼
логическое не или оператор тильды ), т. е.1 1 0 1 0
R
для которых соответствующий элемент есть 1
( оператор /
репликации ), т.е.2 3 5
(Предполагается, что начало отсчета APL равно 1, т. е. индексы начинаются с 1. APL можно настроить на использование 0 в качестве начала отсчета, то есть ι6
, 0 1 2 3 4 5
что удобно для некоторых расчетов.)
Следующее выражение сортирует список слов, хранящийся в матрице X, по длине слова:
X [ ⍋ X + . ≠ ' ' ;]
Следующая функция "life", написанная на Dyalog APL, [74] [75] берет булеву матрицу и вычисляет новое поколение в соответствии с игрой Конвея "Жизнь" . Она демонстрирует мощь APL в реализации сложного алгоритма в очень небольшом коде, но ее понимание требует некоторых продвинутых знаний APL (как и та же программа на многих языках).
жизнь ← { ⊃ 1 ⍵ ∨ . ∧ 3 4 = + / + ⌿ ¯1 0 1 ∘. ⊖ ¯1 0 1 ⌽ ¨ ⊂ ⍵ }
В следующем примере, также Dyalog, первая строка присваивает некоторый HTML-код переменной txt
, а затем использует выражение APL для удаления всех HTML-тегов:
txt ← '<html><body><p>Это <em>выделенный</em> текст.</p></body></html>' { ⍵ /⍨ ~ { ⍵ ∨≠ \ ⍵ } ⍵ ∊ ' <>' } txt Это выделенный текст .
APL получил свое название от инициалов книги Айверсона A Programming Language [ 3], хотя в книге описывается математическая нотация Айверсона, а не реализованный язык программирования, описанный в этой статье. Название используется только для фактических реализаций, начиная с APL\360.
Название было придумано Адином Фалькоффом в 1966 году во время внедрения APL\360 в IBM :
Когда я проходил мимо офиса, который делили трое студентов, я слышал звуки спора. Я просунул голову в дверь, и Эрик спросил меня: «Разве не правда, что все знают, что используемая нами нотация называется APL?» Мне было жаль разочаровывать его, признаваясь, что я никогда не слышал, чтобы ее так называли. Откуда он взял идею, что она хорошо известна? И кто решил ее так назвать? На самом деле, почему ее вообще нужно было как-то называть? Довольно долгое время спустя я узнал, как ее назвали. Когда в июне 1966 года началась работа по внедрению, началась и работа по документированию. Полагаю, когда им пришлось писать об «этом», Фалькофф и Айверсон поняли, что им придется дать «этому» название. Вероятно, в то время было сделано много предложений, но я слышал только о двух. Группа в SRA в Чикаго, которая разрабатывала учебные материалы с использованием этой нотации, выступала за название «Mathlab». Оно не прижилось. Другое предложение состояло в том, чтобы назвать его «Лучшая математика Айверсона» и затем позволить людям придумать соответствующую аббревиатуру. Это было сочтено шуткой.
И вот однажды Адин Фалькофф вошел в кабинет Кена и написал на доске «Язык программирования», а под ним аббревиатуру «APL». Так это и родилось. Всего через неделю или около того Эрик Айверсон задал мне свой вопрос, в то время, когда это название еще не нашло своего пути в тринадцать миль по Taconic Parkway от IBM Research до IBM Mohansic.
— Юджин Макдоннелл , [76]
APL иногда интерпретируется как язык программирования массивов или язык обработки массивов [77] , тем самым превращая APL в бэкроним .
Между поставщиками APL всегда существовало сотрудничество, и совместные конференции проводились на регулярной основе с 1969 по 2010 год. [78] На таких конференциях часто раздавались товары APL , на которых были изображены мотивы APL или коллекция логотипов поставщиков. Распространенными были яблоки (как каламбур на схожести произношения apple и APL ) и фрагмент кода , представляющий собой символы, которые выводятся классической раскладкой клавиатуры APL при удерживании клавиши-модификатора APL и вводе «APL».⍺*⎕
Несмотря на все эти усилия сообщества, не было создано универсального логотипа, независимого от поставщика, для языка программирования. Поскольку популярные языки программирования все чаще создают узнаваемые логотипы, Fortran получил один в 2020 году, [79] Британская ассоциация APL начала кампанию во второй половине 2021 года, чтобы создать такой логотип для APL, и после выборов сообщества и нескольких раундов обратной связи логотип был выбран в мае 2022 года. [80]
APL используется для многих целей, включая финансовые и страховые приложения, [81] искусственный интеллект , [82] [83] нейронные сети [84] и робототехнику . [85] Утверждалось, что APL является инструментом вычислений , а не языком программирования; [86] его символьная природа и возможности массивов сделали его популярным среди экспертов в предметной области и специалистов по данным [87], которые не имеют или не нуждаются в навыках компьютерного программиста . [ требуется ссылка ]
APL хорошо подходит для обработки изображений и компьютерной анимации , где графические преобразования могут быть закодированы как умножение матриц. Одна из первых коммерческих компаний компьютерной графики, Digital Effects , выпустила графический продукт APL под названием Visions , который использовался для создания телевизионных рекламных роликов и анимации для фильма 1982 года Tron . [88] В последнее время симулятор управления лодкой Stormwind использует APL для реализации своей базовой логики, интерфейса с промежуточным программным обеспечением конвейера рендеринга и основной части своего физического движка . [89]
Сегодня APL по-прежнему используется в широком спектре коммерческих и научных приложений, например, в управлении инвестициями , [81] управлении активами , [90] [ требуется ссылка ] здравоохранении , [91] и профилировании ДНК . [92] [93]
Первой реализацией APL с использованием узнаваемых символов APL была APL\360, которая работала на IBM System/360 и была завершена в ноябре 1966 года [1], хотя в то время она использовалась только в IBM. [39] В 1973 году ее разработчики, Ларри Брид , Дик Латвелл и Роджер Мур , были награждены премией Грейс Мюррей Хоппер от Ассоциации вычислительной техники (ACM). Она была вручена «за их работу по проектированию и внедрению APL\360, устанавливающую новые стандарты простоты, эффективности, надежности и времени отклика для интерактивных систем». [94] [95] [96]
В 1975 году микрокомпьютер IBM 5100 предложил APL\360 [97] как один из двух встроенных в ПЗУ интерпретируемых языков для компьютера, оснащенный клавиатурой и дисплеем, которые поддерживали все специальные символы, используемые в языке. [98]
Значительные разработки в APL\360 включали CMS/APL, который использовал возможности виртуального хранения CMS и APLSV, которые ввели общие переменные , системные переменные и системные функции. Впоследствии он был перенесен на платформы IBM System/370 и VSPC до своего окончательного выпуска в 1983 году, после чего он был заменен на APL2. [39]
В 1968 году APL\1130 стала первой общедоступной системой APL, созданной IBM для IBM 1130. [99] Она стала самым популярным программным обеспечением IBM Type-III Library , выпущенным IBM. [ 100]
APL*Plus и Sharp APL — это версии APL\360 с добавленными бизнес-ориентированными расширениями, такими как форматирование данных и возможности хранения массивов APL во внешних файлах. Они были совместно разработаны двумя компаниями, в которых работали различные члены оригинальной команды разработчиков IBM APL\360. [101]
Этими двумя компаниями были IP Sharp Associates (IPSA), компания по предоставлению услуг APL\360, основанная в 1964 году Яном Шарпом, Роджером Муром и другими, и STSC , компания по предоставлению услуг разделения времени и консалтинга, основанная в 1969 году Лоуренсом Бридом и другими. Вместе они разработали APL*Plus и впоследствии продолжили работать вместе, но разрабатывали APL отдельно как APL*Plus и Sharp APL. STSC портировала APL*Plus на многие платформы, выпустив версии для VAX 11, [102] 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 . [103]
APL2 был значительной повторной реализацией APL от IBM, который разрабатывался с 1971 года и впервые выпущен в 1984 году. Он предоставляет множество дополнений к языку, из которых наиболее примечательным является поддержка вложенных (непрямоугольных) массивов. [39] Вся команда продуктов и услуг APL2 была награждена премией Айверсона в 2007 году. [103]
В 2021 году IBM продала APL2 компании Log-On Software, которая разрабатывает и продает продукт под названием Log-On APL2 . [104]
В 1972 году APLGOL был выпущен как экспериментальная версия APL, которая добавила структурные конструкции языка программирования к языковой структуре. Были добавлены новые операторы для управления между операторами, выполнения условных операторов и структурирования операторов, а также операторы для уточнения цели алгоритма. [105] Он был реализован для Hewlett-Packard в 1977 году . [106]
Dyalog APL был впервые выпущен британской компанией Dyalog Ltd. [107] в 1983 году [108] и, по состоянию на 2018 год [обновлять], доступен для платформ AIX , Linux (включая Raspberry Pi ), macOS и Microsoft Windows . Он основан на APL2 с расширениями для поддержки объектно-ориентированного программирования , [109] функционального программирования , [110] и неявного программирования . [111] Лицензии бесплатны для личного/некоммерческого использования. [112]
В 1995 году двое из команды разработчиков — Джон Скоулз и Питер Доннелли — были награждены премией Айверсона за свою работу над интерпретатором. [103] Гитте Кристенсен и Мортен Кромберг стали соавторами премии Айверсона в 2016 году. [113]
NARS2000 — это интерпретатор APL с открытым исходным кодом, написанный Бобом Смитом, выдающимся разработчиком и реализатором APL из STSC в 1970-х и 1980-х годах. NARS2000 содержит расширенные функции и новые типы данных и работает в исходном формате на Microsoft Windows и других платформах под Wine . Он назван в честь инструмента разработки из 1980-х годов, NARS (Nested Arrays Research System). [114]
APLX — это кроссплатформенный диалект APL, основанный на APL2 и имеющий несколько расширений, который был впервые выпущен британской компанией MicroAPL в 2002 году. Хотя он больше не находится в разработке и не продается в коммерческих целях, теперь он доступен бесплатно на сайте Dyalog. [115]
York APL [116] был разработан в Йоркском университете , Онтарио, около 1968 года, работал на мэйнфреймах IBM 360. Одним из заметных отличий между ним и APL\360 было то, что он определял «форму» (ρ) скаляра как 1, тогда как APL\360 определял его как более математически корректный 0 — это упрощало написание функций, которые действовали одинаково со скалярами и векторами.
GNU APL — это свободная реализация Extended APL, как указано в ISO/IEC 13751:2001, и, таким образом, является реализацией APL2. Он работает на Linux , macOS, нескольких диалектах BSD и на Windows (либо с использованием Cygwin для полной поддержки всех его системных функций, либо как собственный 64-битный двоичный файл Windows с некоторыми отсутствующими системными функциями). GNU APL использует Unicode внутри и может быть написан скриптами. Он был написан Юргеном Зауэрманном. [117]
Ричард Столлман , основатель проекта GNU , был одним из первых, кто начал использовать APL, и использовал его для написания текстового редактора, будучи учеником средней школы летом 1969 года. [118]
APL традиционно является интерпретируемым языком , имеющим такие характеристики языка, как слабая типизация переменных, не очень подходящая для компиляции . [119] Однако, с массивами в качестве его основной структуры данных [120] он предоставляет возможности для повышения производительности за счет параллелизма , [121] параллельных вычислений , [122] [123] приложений с большой параллельностью , [124] [125] и сверхбольшой интеграции (VLSI), [126] [127] и с самого начала APL считался высокопроизводительным языком [128] — например, он был отмечен за скорость, с которой он мог выполнять сложные матричные операции, «потому что он работает с массивами и выполняет такие операции, как обращение матрицы внутри». [129]
Тем не менее, APL редко интерпретируется в чистом виде, и методы компиляции или частичной компиляции, которые используются или использовались, включают следующее:
Большинство интерпретаторов APL поддерживают распознавание идиом [130] и оценивают общие идиомы как отдельные операции. [131] [132] Например, оценивая идиому BV/⍳⍴A
как отдельную операцию (где BV
— логический вектор, а A
— массив), можно избежать создания двух промежуточных массивов. [133]
Слабая типизация в APL означает, что имя может ссылаться на массив (любого типа данных), функцию или оператор. В общем случае интерпретатор не может заранее знать, какой формы оно будет, и поэтому должен выполнять анализ, проверку синтаксиса и т. д. во время выполнения. [134] Однако в определенных обстоятельствах можно заранее вывести, на какой тип, как ожидается, будет ссылаться имя, а затем сгенерировать байт-код , который может быть выполнен с уменьшенными накладными расходами во время выполнения. Этот байт-код также можно оптимизировать с помощью методов компиляции, таких как свертывание констант или исключение общих подвыражений . [135] Интерпретатор выполнит байт-код, если он присутствует и когда выполняются любые сделанные предположения. Dyalog APL включает поддержку оптимизированного байт-кода. [135]
Компиляция APL была предметом исследований и экспериментов с тех пор, как язык впервые стал доступен; первым компилятором считается Burroughs APL-700 [136], выпущенный около 1971 года. [137] Для того чтобы иметь возможность компилировать APL, необходимо наложить языковые ограничения. [136] [138] APEX — это исследовательский компилятор APL, написанный Робертом Бернеки и доступный по лицензии GNU General Public License . [139]
Компилятор STSC APL представляет собой гибрид оптимизатора байт-кода и компилятора — он позволяет компилировать функции в машинный код при условии, что его подфункции и глобальные переменные объявлены , но интерпретатор по-прежнему используется как библиотека времени выполнения и для выполнения функций, которые не соответствуют требованиям компиляции. [140]
APL был стандартизирован рабочей группой X3J10 Американского национального института стандартов ( ANSI) и рабочей группой 3 подкомитета 22 Совместного технического комитета 1 ISO/IEC и Международной электротехнической комиссии (IEC). Основной язык APL определен в ISO 8485:1989, а расширенный язык APL определен в ISO/IEC 13751:2001.
и APL были двумя ранними источниками вдохновения
— это платформа управления инвестициями front-to-back, как и SimCorp Dimension. ... Sofia основана на языке кодирования APL, как и некоторые части SimCorp Dimension.
Digital Effects — еще одна продюсерская компания, работавшая над Tron. Они использовали систему лазерного сканирования для оцифровки, хранения и воспроизведения изображений. Джадсон Роузбуш, президент Digital Effects, является основным дизайнером APL VISION и FORTRAN VISION, двух пакетов компьютерной анимации, которые используются в настоящее время.
Stormwind — это [3D-симулятор управления лодкой], который вызвал огромный интерес в сообществе APL.
Благодаря выбору APL в качестве технической платформы относительно легко и быстро построить решение, которое можно назвать исполняемым прототипом (перевод с оригинала)[ постоянная мертвая ссылка ]
Коллекционно-ориентированные языки включают APL, APL2
GCA – Global Cellular Automation. По своей сути массивно-параллельный. «APL был выбран из-за возможности выражать матричные и векторные» структуры.
APL для интерактивности и простоты кодирования
Описаны генераторы модулей VLSI. APL и C, как примеры интерпретируемых и компилируемых языков, могут быть сопряжены с усовершенствованным графическим дисплеем.