APL (назван в честь книги «Язык программирования» ) [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, реализовал часть системы обозначений на компьютере IBM 1620 , и она использовалась студентами в специальном школьном курсе по вычислению трансцендентных функций путем суммирования рядов. Студенты тестировали свой код в лаборатории Хеллермана. Такая реализация части обозначений получила название Personalized Array Translator (PAT). [12]
В 1963 году Фалькофф, Айверсон и Эдвард Х. Сассенгут-младший , работавшие в IBM, использовали эту нотацию для формального описания архитектуры и функциональности машин серии IBM System/360 , в результате чего была опубликована статья в IBM Systems Journal в 1963 году. 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, по-прежнему приходилось вводить путем перечеркивания двух существующих символов элемента. Примером может служить символ повышения класса , который нужно было составить из дельты (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] Он работал всего в 8 КБ 16-битных слов памяти и использовал выделенный 1-мегабайтный жесткий диск.
APL закрепилась в системах разделения времени для мэйнфреймов с конца 1960-х по начало 1980-х годов, отчасти потому, что она поддерживала несколько пользователей в системах с более низкими характеристиками, не имевших аппаратного обеспечения динамической трансляции адресов . [20] Дополнительные улучшения производительности для некоторых мэйнфреймов IBM System/370 включали микрокод APL Assist , в котором некоторая поддержка выполнения APL была включена в прошивку процессора , в отличие от полной реализации программного обеспечения более высокого уровня. Несколько позже, когда в середине-конце 1980-х годов, наконец, стало доступно аппаратное обеспечение с соответствующей производительностью, многие пользователи перенесли свои приложения в среду персональных компьютеров.
Ранние интерпретаторы IBM APL для оборудования IBM 360 и IBM 370 реализовали собственное многопользовательское управление вместо того, чтобы полагаться на хост-службы, таким образом, они представляли собой собственные системы разделения времени. Впервые представленная для использования в IBM в 1966 году система APL\360 [21] [22] [23] представляла собой многопользовательский интерпретатор. Возможность программного взаимодействия с операционной системой для получения информации и установки системных переменных интерпретатора осуществлялась с помощью специальных привилегированных функций «Двутаврового луча», используя как монадические , так и диадические операции. [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, который работал на 36-битных машинах DEC KI и KL. APL CompuServe был доступен как для коммерческого рынка, так и для службы информации для потребителей. С появлением к середине 1980-х годов сначала менее дорогих мейнфреймов, таких как IBM 4300 , а затем и персональных компьютеров, индустрия разделения времени практически исчезла.
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 в конференц-центре Минноубрук в Сиракузах в Блю-Маунтин-Лейк, Нью-Йорк . В последующие годы Юджин Макдоннелл организовал подобные встречи на конференц-площадке Асиломар недалеко от Монтерея , Калифорния , и в Дюнах Пахаро недалеко от Уотсонвилля , Калифорния. Группа особых интересов SIGAPL Ассоциации вычислительной техники продолжает поддерживать сообщество APL. [28]
На микрокомпьютерах, которые стали доступны с середины 1970-х годов, BASIC стал доминирующим языком программирования. [29] Тем не менее, некоторые микрокомпьютеры вместо этого использовали APL – первым из них был MCM/70 на базе Intel 8008 , который был выпущен в 1974 году [30] [31] и который в основном использовался в образовании. [32] Другой машиной того времени был компьютер семейства VideoBrain , выпущенный в 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. [55] Сообщаемый прирост производительности предполагает, что человек тратит достаточно времени на работу с языком, чтобы было полезно запомнить символы, их семантику и раскладки клавиатуры, не говоря уже о значительном количестве идиом для общих задач. [ нужна цитата ]
В отличие от традиционно структурированных языков программирования, код APL обычно структурирован как цепочки монадических или диадических функций и операторов [56] , действующих на массивы . [57] В APL имеется множество нестандартных примитивов (функций и операторов), которые обозначаются одним символом или комбинацией нескольких символов. Все примитивы имеют одинаковый приоритет и всегда располагаются справа. Таким образом, APL читается или лучше всего понимается справа налево .
Ранние реализации APL ( около 1970 года или около того) не имели структур управления циклом программирования , таких как циклы do
или while
, и if-then-else
конструкций. Вместо этого они использовали операции с массивами, а использование конструкций структурированного программирования часто не было необходимым, поскольку операцию можно было выполнить над полным массивом за один оператор. Например, iota
функция ( ) может заменить итерациюι
цикла for : ιN при применении к скалярному положительному целому числу дает одномерный массив (вектор) 1 2 3 ... N. Более поздние реализации APL обычно включают комплексные структуры управления. , так что структура данных и поток управления программой могут быть четко и четко разделены.
Среда APL называется рабочей областью . В рабочей области пользователь может определять программы и данные, т. е. значения данных существуют также вне программ, и пользователь также может манипулировать данными без необходимости определения программы. [58] В приведенных ниже примерах интерпретатор APL сначала вводит шесть пробелов, прежде чем ожидать ввода пользователя. Его собственный вывод начинается в первом столбце.
Пользователь может сохранить рабочую область со всеми значениями, программами и статусом выполнения.
APL использует набор символов, отличных от ASCII , которые являются расширением традиционных арифметических и алгебраических обозначений. Наличие односимвольных имен для одной инструкции и векторных функций нескольких данных ( SIMD ) - это один из способов, с помощью которого APL позволяет компактно формулировать алгоритмы преобразования данных, такие как вычисление « Игры жизни» Конвея, в одной строке кода. [59] Почти во всех версиях APL теоретически возможно выразить любую вычислимую функцию в одном выражении, то есть в одной строке кода. [ нужна цитата ]
Из-за необычного набора символов многие программисты используют специальные клавиатуры с клавишами APL для написания кода APL. [60] Хотя существуют различные способы написания кода APL, используя только символы ASCII, [61] на практике это почти никогда не делается. (Можно подумать, что это подтверждает тезис Айверсона об обозначениях как инструменте мышления . [62] ) Большинство, если не все, современные реализации используют стандартные раскладки клавиатуры со специальными сопоставлениями или редакторами методов ввода для доступа к символам, отличным от ASCII. Исторически сложилось так, что шрифт APL был отличительным: с прописными буквами, курсивом и вертикальными цифрами и символами. Большинство поставщиков продолжают отображать набор символов APL в специальном шрифте.
Сторонники APL [ кто? ] утверждают, что примеры так называемого кода, предназначенного только для записи (плохо написанного и почти непонятного кода), почти всегда являются примерами плохой практики программирования или ошибок новичков, которые могут произойти на любом языке. Сторонники также утверждают, что с APL они гораздо более продуктивны, чем с более традиционными компьютерными языками, и что работающее программное обеспечение может быть реализовано за гораздо меньшее время и с гораздо меньшим количеством программистов, чем при использовании других технологий. [ нужна цитата ]
Они также могут утверждать, что, поскольку APL компактен и краток, он хорошо подходит для крупномасштабной разработки программного обеспечения и его сложности, поскольку количество строк кода может быть значительно уменьшено. Многие сторонники и практики APL также считают стандартные языки программирования, такие как COBOL и Java , сравнительно утомительными. APL часто встречается там, где важно время выхода на рынок, например, в торговых системах. [63] [64] [65] [66]
APL проводит четкое различие между функциями и операторами . [56] [67] Функции принимают массивы (переменные, константы или выражения) в качестве аргументов и возвращают массивы в качестве результатов. Операторы (аналогично функциям высшего порядка ) принимают функции или массивы в качестве аргументов и выводят связанные функции. Например, функция суммы получается путем применения оператора сокращения к функции сложения . Применяя тот же оператор сокращения к функции максимума (которая возвращает большее из двух чисел), получается функция, которая возвращает наибольшее из группы (вектора) чисел. В языке J Айверсон заменил термины «глагол» на «функцию» и «наречие или союз» на «оператор» .
APL также идентифицирует те функции, встроенные в язык и представленные символом или фиксированной комбинацией символов, как примитивы . Большинство примитивов являются либо функциями, либо операторами. Кодирование APL — это в основном процесс написания непримитивных функций и (в некоторых версиях APL) операторов. Однако некоторые примитивы не считаются ни функциями, ни операторами, особенно присваиванием.
Некоторые слова, используемые в литературе по APL, имеют значения, отличные от значений как в математике, так и в общей информатике.
APL имеет явные представления функций, операторов и синтаксиса, обеспечивая тем самым основу для четкого и явного описания расширенных возможностей языка и инструментов для экспериментов с ними. [71]
Это отобразит « Привет, мир »:
'Привет, мир'
Темой дизайна в 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
Следующее выражение немедленного режима генерирует типичный набор номеров лотереи «Выбери 6» : шесть псевдослучайных целых чисел в диапазоне от 1 до 40, гарантированно неповторяющихся , и отображает их, отсортированные в порядке возрастания:
Икс [ ⍋ Икс ← 6 ? 40 ]
Вкратце, вышеизложенное делает многое, хотя новичку APL-программисту может показаться сложным. Он сочетает в себе следующие функции APL (также называемые примитивами [72] и глифами [73] ):
?
(названная deal
в диадическом формате), которая возвращает вектор , состоящий из выбранного числа (в данном случае левый аргумент: 6) случайных целых чисел в диапазоне от 1 до заданного максимума ( правый аргумент: в данном случае 40), который, если указанная максимальная длина вектора ≥, гарантированно не повторяется; таким образом сгенерируйте/создайте 6 случайных целых чисел в диапазоне от 1 до 40. [74]←
) переменной x
, поскольку он понадобится позже.⍋
функции, которая имеет в качестве правого аргумента все, что находится справа от него, вплоть до следующей несбалансированной закрывающей скобки или закрывающей скобки. Результатом ⍋
являются индексы, которые будут располагать аргументы в порядке возрастания.⍋
используется для индексации переменной x
, которую мы сохранили ранее для этой цели, тем самым выбирая ее элементы в возрастающей последовательности.Поскольку слева от самого левого x нет функции, которая бы сообщала APL, что делать с результатом, он просто выводит его на дисплей (в одной строке, разделенной пробелами), не требуя для этого каких-либо явных инструкций.
?
также имеет монадический эквивалент, называемый roll
, который просто возвращает одно случайное целое число от 1 до единственного операнда [справа от него] включительно. Таким образом, программа ролевой игры может использовать это выражение ?20
для броска двадцатигранного кубика.
Следующее выражение находит все простые числа от 1 до R. Как во времени, так и в пространстве сложность вычислений равна (в нотации Big O ).
( ~ р ∊ р ∘. × р ) / р ← 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
∼
, логическое not или оператор Тильда ), т.е.1 1 0 1 0
R
которых есть соответствующий элемент 1
( оператор /
репликации ), т.е.2 3 5
(Обратите внимание: предполагается, что начало координат APL равно 1, т. е. индексы начинаются с 1. APL можно настроить на использование 0 в качестве начала координат, то есть ι6
, 0 1 2 3 4 5
что удобно для некоторых вычислений.)
Следующее выражение сортирует список слов, хранящийся в матрице X, по длине слова:
Икс [ ⍋ Икс + . ≠ ' ' ;]
Следующая функция «жизнь», написанная в Dyalog APL, [75] [76] принимает булеву матрицу и вычисляет новое поколение в соответствии с « Игрой жизни» Конвея . Он демонстрирует возможности 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 получил свое название от инициалов книги Айверсона «Язык программирования» [ 3], хотя в книге описывается математическая нотация Айверсона, а не реализованный язык программирования, описанный в этой статье. Имя используется только для реальных реализаций, начиная с APL\360.
Адин Фалькофф придумал это название в 1966 году во время внедрения APL\360 в IBM :
Проходя мимо офиса, в котором жили трое студентов, я услышал звуки происходящего спора. Я просунул голову в дверь, и Эрик спросил меня: «Разве не правда, что все знают, что используемая нами система обозначений называется APL?» Мне было жаль, что мне пришлось разочаровать его, признавшись, что я никогда не слышал, чтобы это называлось так. Откуда он взял, что это общеизвестно? И кто решил это так назвать? В самом деле, почему это нужно было как-то называть? Спустя некоторое время я услышал, как оно было названо. Когда в июне 1966 года начались работы по внедрению, началась и работа по документированию. Полагаю, когда им пришлось написать об «этом», Фалькофф и Айверсон поняли, что им придется дать «этому» имя. Вероятно, в то время было сделано много предложений, но я слышал только о двух. Группа SRA в Чикаго, которая разрабатывала учебные материалы с использованием этой записи, поддержала название «Mathlab». Это не прижилось. Другое предложение заключалось в том, чтобы назвать ее «Лучшая математика Айверсона», а затем позволить людям придумать подходящую аббревиатуру. Это было сочтено шуткой.
Затем однажды Адин Фалькофф вошел в офис Кена и написал на доске «Язык программирования», а под ним аббревиатуру «APL». Так оно и родилось. Примерно через неделю или около того Эрик Айверсон задал мне свой вопрос, в то время как это имя еще не нашло своего пути на протяжении тринадцати миль вверх по Таконик-Паркуэй от IBM Research до IBM Mohansic.
— Юджин МакДоннелл , [77]
APL иногда интерпретируется как язык программирования массивов или язык обработки массивов , [78] тем самым превращая APL в бэкроним .
Между поставщиками APL всегда существовало сотрудничество, и с 1969 по 2010 год регулярно проводились совместные конференции. [79] На таких конференциях часто раздавалась продукция APL с мотивами APL или коллекцией логотипов поставщиков. Распространенными были яблоки (каламбур на сходстве произношения яблок и APL ) и фрагмент кода , который представляет собой символы, создаваемые классической раскладкой клавиатуры APL при удержании клавиши-модификатора APL и вводе «APL».⍺*⎕
Несмотря на все эти усилия сообщества, универсального логотипа языка программирования, не зависящего от поставщика, так и не появилось. Поскольку популярные языки программирования все чаще имеют узнаваемые логотипы (например, Фортран получил один в 2020 году), [80] Британская ассоциация APL во второй половине 2021 года запустила кампанию по созданию такого логотипа для APL, а после выборов сообщества и нескольких раундов обратной связи , логотип был выбран в мае 2022 года. [81]
APL используется для многих целей, включая финансовые и страховые приложения, [82] искусственный интеллект , [83] [84] нейронные сети [85] и робототехнику . [86] Утверждалось, что APL — это инструмент вычислений , а не язык программирования; [87] его символическая природа и возможности массивов сделали его популярным среди экспертов в предметной области и специалистов по данным [88] , которые не имеют или не нуждаются в навыках программиста . [ нужна цитата ]
APL хорошо подходит для манипулирования изображениями и компьютерной анимации , где графические преобразования могут быть закодированы как матричные умножения. Одна из первых компаний, занимающихся коммерческой компьютерной графикой, Digital Effects , выпустила графический продукт APL под названием Visions , который использовался для создания телевизионной рекламы и анимации для фильма «Трон» 1982 года . [89] В последнее время симулятор лодки в Штормграде использует APL для реализации своей основной логики, взаимодействия с промежуточным программным обеспечением конвейера рендеринга и основной частью своего физического движка . [90]
Сегодня APL по-прежнему используется в широком спектре коммерческих и научных приложений, например, в управлении инвестициями , [82] управлении активами , [91] [ нужна ссылка ] в здравоохранении , [92] и профилировании ДНК . [93] [94]
Первой реализацией APL с использованием узнаваемых символов APL была APL\360, которая работала на IBM System/360 и была завершена в ноябре 1966 года [1], хотя в то время она оставалась в использовании только внутри IBM. [39] В 1973 году его разработчики, Ларри Брид , Дик Лэтвелл и Роджер Мур , были награждены премией Грейс Мюррей Хоппер от Ассоциации вычислительной техники (ACM). Она была вручена «за работу по разработке и внедрению APL\360, устанавливающую новые стандарты простоты, эффективности, надежности и времени отклика для интерактивных систем». [95] [96] [97]
В 1975 году микрокомпьютер IBM 5100 предложил APL\360 [98] в качестве одного из двух встроенных интерпретируемых языков на основе ПЗУ для компьютера, оснащенных клавиатурой и дисплеем, которые поддерживали все специальные символы, используемые в этом языке. [99]
Значительные разработки в APL\360 включали CMS/APL, в которой использовались возможности виртуального хранилища CMS , и APLSV, в котором были представлены общие переменные , системные переменные и системные функции. Впоследствии он был портирован на платформы IBM System/370 и VSPC до своего окончательного выпуска в 1983 году, после чего был заменен APL2. [39]
В 1968 году APL\1130 стала первой общедоступной системой APL, созданной IBM для IBM 1130 . [100] Это стало самым популярным программным обеспечением библиотеки IBM Type-III, выпущенным IBM. [101]
APL*Plus и Sharp APL — это версии APL\360 с добавленными бизнес-ориентированными расширениями, такими как форматирование данных и возможности хранения массивов APL во внешних файлах. Они были совместно разработаны двумя компаниями, в которых работали разные члены первоначальной команды разработчиков IBM APL\360. [102]
Этими двумя компаниями были IP Sharp Associates (IPSA), компания, предоставляющая услуги APL\360, основанная в 1964 году Яном Шарпом, Роджером Муром и другими, и STSC , компания по предоставлению консультационных услуг и разделения времени, основанная в 1969 году Лоуренсом Бридом и другими. Вместе они разработали APL*Plus и после этого продолжили работать вместе, но разрабатывали APL отдельно как APL*Plus и Sharp APL. STSC портировала APL*Plus на многие платформы, при этом были созданы версии для VAX 11, [103] ПК и UNIX, тогда как IPSA применила другой подход к появлению персональных компьютеров и сделала Sharp APL доступным на этой платформе с использованием дополнительного PC-XT. /360 аппаратное обеспечение. В 1993 году для поддержки Sharp APL была создана компания Soliton Incorporated , которая превратила Sharp APL в SAX (Sharp APL для Unix). С 2018 года [обновлять]APL*Plus продолжает работать как APL2000 APL+Win.
В 1985 году Ян Шарп и Дэн Дайер из STSC совместно получили Премию Кеннета Э. Айверсона за выдающийся вклад в APL . [104]
APL2 представлял собой значительную повторную реализацию APL, разработанную IBM в 1971 году и впервые выпущенную в 1984 году. Он предоставляет множество дополнений к языку, наиболее заметным из которых является поддержка вложенных (непрямоугольных) массивов. [39] Вся команда продуктов и услуг APL2 была награждена премией Айверсона в 2007 году. [104]
В 2021 году IBM продала APL2 компании Log-On Software, которая разрабатывает и продает продукт как Log-On APL2 . [105]
В 1972 году APLGOL был выпущен как экспериментальная версия APL, которая добавляла конструкции языка структурированного программирования в языковую среду. Были добавлены новые операторы для управления между операторами, выполнения условных операторов и структурирования операторов, а также операторы, поясняющие назначение алгоритма. [106] Он был реализован для Hewlett-Packard в 1977 году. [107]
Dyalog APL был впервые выпущен британской компанией Dyalog Ltd. [108] в 1983 году [109] и по состоянию на 2018 год [обновлять]доступен для платформ AIX , Linux (в том числе на Raspberry Pi ), macOS и Microsoft Windows . Он основан на APL2 с расширениями для поддержки объектно-ориентированного программирования , [110] функционального программирования , [111] и неявного программирования . [112] Лицензии бесплатны для личного/некоммерческого использования. [113]
В 1995 году двое из команды разработчиков — Джон Скоулз и Питер Доннелли — были награждены премией Айверсона за работу над интерпретатором. [104] Гитте Кристенсен и Мортен Кромберг были совместными лауреатами премии Айверсона в 2016 году. [114]
NARS2000 — это интерпретатор APL с открытым исходным кодом, написанный Бобом Смитом, известным разработчиком и разработчиком APL из STSC в 1970-х и 1980-х годах. NARS2000 содержит расширенные функции и новые типы данных и изначально работает в Microsoft Windows и других платформах под Wine . Он назван в честь инструмента разработки 1980-х годов — NARS (Система исследования вложенных массивов). [115]
APLX — это кроссплатформенный диалект APL, основанный на APL2 и с несколькими расширениями, который был впервые выпущен британской компанией MicroAPL в 2002 году. Хотя он больше не находится в разработке и не продается в коммерческих целях, теперь он доступен бесплатно на сайте Dyalog. [116]
York APL [117] был разработан в Йоркском университете , Онтарио, примерно в 1968 году и работал на мэйнфреймах IBM 360. Одно заметное различие между ним и APL\360 заключалось в том, что он определял «форму» (ρ) скаляра как 1, тогда как APL\360 определял его как более математически правильный 0 — это облегчило написание функций, которые действовали бы одинаково с скаляры и векторы.
GNU APL — это бесплатная реализация расширенного APL, как указано в ISO/IEC 13751:2001, и, таким образом, является реализацией APL2. Он работает в Linux , macOS, нескольких диалектах BSD и в Windows (либо с использованием Cygwin для полной поддержки всех своих системных функций, либо как собственный 64-битный двоичный файл Windows с отсутствием некоторых системных функций). GNU APL внутренне использует Unicode и может быть написан в сценариях. Ее написал Юрген Зауэрман. [118]
Ричард Столлман , основатель проекта GNU Project , был одним из первых, кто внедрил APL и использовал его для написания текстового редактора, будучи учеником средней школы, летом 1969 года. [119]
APL традиционно является интерпретируемым языком , имеющим такие языковые характеристики, как слабая типизация переменных, которые плохо подходят для компиляции . [120] Однако использование массивов в качестве основной структуры данных [121] обеспечивает возможности повышения производительности за счет параллелизма , [122] параллельных вычислений , [123] [124] приложений с массовым параллелизмом , [125] [126] и очень больших приложений. -масштабная интеграция (VLSI), [127] [128] и с самого начала APL считался высокопроизводительным языком [129] – например, он был отмечен скоростью, с которой он мог выполнять сложные матричные операции, «потому что он работает с массивами и выполняет внутренние операции, такие как инверсия матрицы». [130]
Тем не менее, APL редко интерпретируется чисто, и методы компиляции или частичной компиляции, которые используются или использовались, включают следующее:
Большинство интерпретаторов APL поддерживают распознавание идиом [131] и оценивают распространенные идиомы как отдельные операции. [132] [133] Например, оценивая идиому BV/⍳⍴A
как одну операцию (где BV
— логический вектор, а A
— массив), можно избежать создания двух промежуточных массивов. [134]
Слабая типизация в APL означает, что имя может ссылаться на массив (любого типа данных), функцию или оператор. В общем, интерпретатор не может заранее знать, какая это будет форма, и поэтому должен выполнять анализ, проверку синтаксиса и т. д. во время выполнения. [135] Однако при определенных обстоятельствах можно заранее определить, на какой тип имя будет ссылаться, а затем сгенерировать байт-код , который может быть выполнен с уменьшенными накладными расходами во время выполнения. Этот байт-код также можно оптимизировать с помощью таких методов компиляции, как свертывание констант или исключение общих подвыражений . [136] Интерпретатор выполнит байт-код, если он присутствует и когда выполняются любые сделанные предположения. Dyalog APL включает поддержку оптимизированного байт-кода. [136]
Компиляция APL была предметом исследований и экспериментов с тех пор, как язык впервые стал доступен; первым компилятором считается Burroughs APL-700 [137] , выпущенный примерно в 1971 году. [138] Чтобы иметь возможность скомпилировать APL, необходимо наложить языковые ограничения. [137] [139] APEX — это исследовательский компилятор APL, написанный Робертом Бернеки и доступный под лицензией GNU General Public License . [140]
Компилятор STSC APL представляет собой гибрид оптимизатора байт-кода и компилятора. Он позволяет компилировать функции в машинный код при условии, что объявлены его подфункции и глобальные переменные , но интерпретатор по-прежнему используется в качестве библиотеки времени выполнения и для выполнения функций, которые не соответствуют требованиям компиляции. [141]
APL был стандартизирован рабочей группой X3J10 Американского национального института стандартов (ANSI) , Международной организацией по стандартизации (ISO) и Международной электротехнической комиссией (IEC), рабочей группой 3 Подкомитета 22 Объединенного технического комитета ISO/IEC 3. Основной язык APL: указан в ISO 8485:1989, а расширенный язык APL указан в ISO/IEC 13751:2001.
LISP и APL оказали два первых влияния.
София — это платформа прямого управления инвестициями, такая как SimCorp Dimension. ... София основана на языке кодирования APL, как и некоторые части SimCorp Dimension.
Digital Effects — еще одна продюсерская компания, работавшая над «Троном». Они использовали систему лазерного сканирования для оцифровки, хранения и воспроизведения изображений. Джадсон Роузбуш, президент Digital Effects, является основным разработчиком APL VISION и FORTRAN VISION, двух пакетов компьютерной анимации, которые используются в настоящее время.
Stormwind — это [3D-симулятор лодки], вызвавший огромный интерес в сообществе APL.
Благодаря выбору APL в качестве технической платформы относительно легко быстро построить решение, которое можно назвать исполняемым прототипом (перевод с оригинала).
Языки, ориентированные на коллекции, включают APL, APL2.
GCA – Глобальная клеточная автоматизация. По сути, это массовая параллель. «APL был выбран из-за способности выражать матричные и векторные структуры.
APL для интерактивности и простоты кодирования.
Описаны генераторы модулей СБИС. APL и C, как примеры интерпретируемых и компилируемых языков, могут быть подключены к усовершенствованному графическому дисплею.