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 , был одним из первых, кто внедрил 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 Объединенного технического комитета 1 ISO/IEC 22. Основной язык 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, как примеры интерпретируемых и компилируемых языков, могут быть подключены к усовершенствованному графическому дисплею.