APL (язык программирования)

редактировать
Функциональный символьный язык программирования для работы с многомерными массивами
APL
Paradigm Array, функциональный, структурированный, модульный
Разработан Кеннет И. Айверсон
Разработчик Ларри Брид, Дик Латвелл, Роджер Мур и другие
Впервые появилось27 ноября 1966 г.; 53 года назад (1966-11-27)
Стабильная версия ISO / IEC 13751: 2001/1 февраля 2001 г.; 19 лет назад (2001-02-01)
Дисциплина ввода Динамическая
Платформа Межплатформенная
Лицензия Собственная, с открытым исходным кодом
Основная реализации
  • APL \ 360
  • APL \ 1130
  • APL * Plus
  • Sharp APL
  • APL2
  • Dyalog APL
  • NARS2000
  • APLX
  • GNU APL
Под влиянием
Математическая нотация
Под влиянием

APL(названный в честь книги A Programming Language) - язык программирования, разработанный в 1960-х годах Кеннет Э. Айверсон. Его центральный тип данных - это многомерный массив . Он использует большой диапазон специальных графических символов для представления большинства функций и операторов, что приводит к очень сжатому коду. Это оказало важное влияние на развитие концептуального моделирования, электронных таблиц, функционального программирования и пакетов компьютерной математики. Он также вдохновил на создание нескольких других языков программирования.

Содержание

  • 1 История
    • 1.1 Математическая нотация
    • 1.2 Разработка языка программирования
    • 1.3 Аппаратное обеспечение
    • 1.4 Коммерческая доступность
    • 1.5 Микрокомпьютеры
    • 1.6 APL2
    • 1.7 Современные реализации
    • 1.8 Производные языки
  • 2 Характеристики языка
    • 2.1 Набор символов
    • 2.2 Дизайн
    • 2.3 Терминология
    • 2.4 Синтаксис
    • 2.5 Примеры
      • 2.5.1 Привет, мир
      • 2.5.2 Возведение в степень
      • 2.5.3 Простая статистика
      • 2.5.4 Выбор 6 номеров лотереи
      • 2.5.5 Простые числа
      • 2.5.6 Сортировка
      • 2.5.7 Game of Life
      • 2.5.8 Удаление HTML-тегов
  • 3 Использование
  • 4 Известные реализации
    • 4.1 APL \ 360
    • 4.2 APL \ 1130
    • 4.3 APL * Plus и Sharp APL
    • 4.4 APL2
    • 4.5 Dyalog APL
    • 4.6 NARS2000
    • 4.7 APLX
    • 4.8 GNU APL
  • 5 Интерпретация и компиляция APL
    • 5.1 Распознавание идиомы
    • 5.2 Оптимизированный байт-код
    • 5.3 Составление
  • 6 Стандарты
  • 7 Ссылки
  • 8 Дополнительная литература
    • 8.1 Видео
  • 9 Внешние ссылки
    • 9.1 Интернет-ресурсы
    • 9.2 Провайдеры
    • 9.3 Группы пользователей и сообщества

История

Математическая нотация

A Математическая нотация для управления массивами была разработан Кеннетом Э. Айверсоном, начиная с 1957 года в Гарвардском университете. В 1960 году он начал работать в IBM, где вместе с Адином Фалькоффом разработал эту нотацию и опубликовал ее в своей книге «Язык программирования» в 1962 году. В предисловии изложена его предпосылка:

Прикладная математика в значительной степени занимается разработкой и анализом явных процедур для вычисления точных или приближенных значений различных функций. Такие явные процедуры называются алгоритмами или программами. Поскольку эффективная нотация для описания программ имеет значительную синтаксическую структуру, ее называют языком программирования.

Эта нотация использовалась внутри IBM для коротких отчетов об исследованиях компьютерных систем, таких как Burroughs B5000 и его стековый механизм, когда стековые машины по сравнению с регистровыми машинами оценивались IBM для будущих компьютеров.

Айверсон также использовал свои обозначения в черновике главы A Programming Language, написанной для книги, которую он писал с Фредом Бруксом, Автоматическая обработка данных, которая будет опубликована в 1963 году.

В 1979 году Айверсон получил Премию Тьюринга за свою работу над APL.

Разработка языка компьютерного программирования

Еще в 1962 году Попытка использовать нотацию для описания полной компьютерной системы произошла после того, как Фалькофф обсудил с Уильямом К. Картером свою работу по стандартизации набора команд для машин, которые позже стали семейством IBM System / 360.

В 1963 году Герберт Хеллерман, работая в IBM Systems Research Institute, реализовал часть обозначений на компьютере IBM 1620, и они использовались студентами в специальном курсе средней школы. по вычислению трансцендентных функций суммированием рядов. Студенты протестировали свой код в лаборатории Хеллермана. Эта реализация части системы обозначений была названа персонализированным транслятором массивов (PAT).

В 1963 году Фалькофф, Айверсон и Эдвард Х. Сассенгут-младший, все из которых работали в IBM, использовали обозначение для формального описания архитектуры и функциональности машины серии IBM System / 360, результатом которого стала статья, опубликованная в IBM Systems Journal в 1964 году. После того, как это было опубликовано, команда обратили свое внимание на реализацию нотации в компьютерной системе. Одним из мотивов такой направленности внедрения был интерес Джона Л. Лоуренса, у которого были новые обязанности в Science Research Associates, образовательной компании, купленной IBM в 1964 году. Лоуренс попросил Айверсона и его группу помочь в использовании язык как инструмент для разработки и использования компьютеров в образовании.

После Лоуренса М. Брида и Филипа С. Абрамса из Стэнфордского университета присоединились к команде IBM Research , они продолжили свою предыдущую работу над реализацией, запрограммированной в FORTRAN IV для части нотации, которая была сделана для компьютера IBM 7090, работающего на IBSYS операционная система. Эта работа была завершена в конце 1965 года и впоследствии получила название IVSYS (от системы Iverson). Основа этой реализации была подробно описана Абрамсом в техническом отчете Стэнфордского университета «Интерпретатор нотации Айверсона» в 1966 году, академический аспект этого формально контролировался Никлаусом Виртом. Подобно системе PAT Хеллермана ранее, эта реализация не включала набор символов APL, но использовала специальные английские зарезервированные слова для функций и операторов. Позднее система была адаптирована для системы с разделением времени, и к ноябрю 1966 года она была перепрограммирована для компьютера IBM System / 360 Model 50, работающего в режиме разделения времени, и была используется внутри IBM.

Аппаратное обеспечение

Шары IBM (один OCR) с зажимом, 2 евро за масштаб Взгляд программиста на раскладку клавиатуры IBM 2741 со вставленной печатающей головкой элемента набора APL

Ключевым достижением в возможности эффективного использования APL до широкого использования терминалов с электронно-лучевой трубкой (CRT ) была разработка специального сменного печатного элемента пишущая машинка IBM Selectric. со всеми специальными символами APL на нем. Это использовалось на рабочих станциях терминалов для печати на бумаге, использующих пишущую машинку Selectric и механизм печатных элементов, таких как терминал IBM 1050 и IBM 2741. Колпачки можно было разместить над обычными клавишами, чтобы показать, какие символы APL будут вводиться и набираться при нажатии этой клавиши. Впервые программист мог печатать и видеть правильные символы APL, используемые в нотации Айверсона, и не был вынужден использовать их неуклюжие английские ключевые слова. У Фалькоффа и Айверсона были специальные печатные элементы APL Selectric 987 и 988, разработанные в конце 1964 года, хотя компьютерная система APL для их использования отсутствовала. Айверсон процитировал Фалькоффа как вдохновителя идеи использования элемента набора текста IBM Selectric для набора символов APL.

Многие символы APL, даже с символами APL на элементе набора текста Selectric, по-прежнему приходилось вводить с помощью чрезмерно выделяются два сохранившихся символа элемента. Примером может служить символ повышения класса, который должен состоять из дельты (shift-H) и штриха Sheffer (shift-M). Это было необходимо, потому что набор символов APL был намного больше, чем 88 символов, разрешенных для элемента набора текста, даже когда буквы были ограничены верхним регистром (заглавными буквами).

Коммерческая доступность

Первый интерактивный вход в APL и создание рабочего пространства APL было сделано в 1966 году Ларри Бридом с использованием терминала IBM 1050 в лаборатории IBM Mohansic Labs рядом с Thomas J. Watson Research Центр, дом APL, в Йорктаун-Хайтс, Нью-Йорк.

IBM несла основную ответственность за внедрение APL на рынок. APL был впервые доступен в 1967 году для IBM 1130 как APL \ 1130. Он занимал всего 8k 16-битных слов памяти и использовал выделенный жесткий диск объемом 1 мегабайт.

APL закрепился в системах разделения времени мэйнфреймов с конца 1960-х до начала 1980-х годов, отчасти потому, что он будет поддерживать нескольких пользователей в системах с более низкими характеристиками, в которых не было оборудования динамической трансляции адресов. Дополнительные улучшения производительности для выбранных систем мэйнфреймов IBM System / 370 включали микрокод APL Assist, в котором некоторая поддержка выполнения APL была включена в прошивку процессора, в отличие от полностью реализованной программное обеспечение более высокого уровня. Несколько позже, когда в середине-конце 1980-х годов наконец стало доступно оборудование с подходящими характеристиками, многие пользователи перенесли свои приложения в среду персональных компьютеров.

Ранние интерпретаторы IBM APL для оборудования IBM 360 и IBM 370 реализовали собственное многопользовательское управление вместо того, чтобы полагаться на службы хоста, таким образом, они были их собственными системами разделения времени. Система APL \ 360, впервые представленная в 1966 году, была многопользовательским интерпретатором. Возможность программного обмена данными с операционной системой для получения информации и установки системных переменных интерпретатора была реализована с помощью специальных привилегированных функций «двутавровой балки» с использованием как монадических, так и диадических операций.

В 1973 году IBM выпустила APL.SV, который был продолжением того же продукта, но предлагал общие переменные в качестве средства доступа к средствам за пределами системы APL, таким как файлы операционной системы. В середине 1970-х интерпретатор мэйнфрейма IBM был даже адаптирован для использования на настольном компьютере IBM 5100, который имел небольшой ЭЛТ и клавиатуру APL, тогда как большинство других небольших компьютеров того времени предлагали только ОСНОВНОЙ. В 1980-х годах программный продукт VSAPL широко использовался с Conversational Monitor System (CMS), Time Sharing Option (TSO), VSPC, MUSIC / SP и пользователей CICS.

В 1973–1974 годах Патрик Э. Хагерти руководил внедрением интерпретатора APL Университета Мэриленда для линейки 1100 мэйнфреймов Sperry UNIVAC 1100/2200 series. В то время у Сперри ничего не было. В 1974 году студенту Алану Стеббенсу была поручена внутренняя функция. Xerox APL был доступен с июня 1975 года для мэйнфреймов Xerox 560 и Sigma 6, 7 и 9 под управлением CP-V и для Honeywell CP-6.

. В 1960-х и 1970-х годах несколько компаний с разделением времени возникла продажа APL-сервисов с использованием модифицированных версий интерпретатора IBM APL \ 360. В Северной Америке наиболее известными были I. P. Sharp Associates, Scientific Time Sharing Corporation (STSC), Time Sharing Resources (TSR) и (TCC). CompuServe также вышла на рынок в 1978 году с интерпретатором APL, основанным на модифицированной версии Digital Equipment Corp и Carnegie Mellon's, которая работала на 36-битных машинах DEC KI и KL. APL CompuServe был доступен как для коммерческого рынка, так и для службы информации для потребителей. С появлением сначала менее дорогих мэйнфреймов, таких как IBM 4300, а затем и персональных компьютеров к середине 1980-х годов индустрия разделения времени практически исчезла.

Sharp APL можно было приобрести у I. P. Sharp Associates, сначала как служба разделения времени в 1960-х годах, а затем как программный продукт, начиная примерно с 1979 года. Sharp APL был продвинутой реализацией APL с множеством языковых расширений, таких как пакеты (возможность добавлять одно или несколько объекты в одну переменную), файловую систему, вложенные массивы и общие переменные.

APL-интерпретаторы также были доступны от других производителей мэйнфреймов и мини-компьютеров, в частности, Burroughs, Control Data Corporation (CDC), Data General, Digital Equipment Corporation (DEC), Harris, Hewlett-Packard (HP) , Siemens AG, Xerox и другие.

Гарт Фостер из Сиракузского университета спонсировал регулярные встречи сообщества разработчиков APL в Сиракузском конференц-центре Minnowbrook в Блю-Маунтин-Лейк, Нью-Йорк. В последующие годы Юджин Макдоннелл организовал аналогичные встречи в конференц-зале Асиломар недалеко от Монтерея, штат Калифорния, и в дюнах Паджаро недалеко от Уотсонвилля, штат Калифорния. Группа особых интересов SIGAPL Ассоциации вычислительной техники продолжает поддерживать сообщество APL.

Микрокомпьютеры

На микрокомпьютерах, которые стали доступны с середины 1970-х годов, BASIC стал доминирующим языком программирования. Тем не менее, некоторые микрокомпьютеры предоставляли вместо него APL - первым из них был MCM / 70 на базе Intel 8008, выпущенный в 1974 году и использовавшийся в основном в образовании. Другой машиной того времени был компьютер семейства VideoBrain, выпущенный в 1977 году, который поставлялся с его диалектом APL под названием APL / S.

Commodore SuperPET, представленный в 1981 году, включая интерпретатор APL, разработанный Университетом Ватерлоо.

. В 1976 году Билл Гейтс в своем Открытом письме любителям заявил, что Microsoft Corporation внедряет APL для Intel 8080 и Motorola 6800, но у них было «очень мало стимулов делать [его] доступным для любителей» из-за пиратства программного обеспечения. Он так и не был выпущен.

APL2

Начиная с начала 1980-х, при разработке IBM APL под руководством Джима Брауна была реализована новая версия языка APL, которая содержала в качестве основного усовершенствования концепция вложенных массивов, где массив может содержать другие массивы, и новые языковые функции, которые облегчили интеграцию вложенных массивов в рабочий процесс программы. Кен Айверсон, больше не контролировавший разработку языка APL, покинул IBM и присоединился к I. P. Sharp Associates, где одним из его основных вкладов было направление эволюции Sharp APL в большее соответствие с его видением.

Поскольку другие поставщики были заняты разработкой интерпретаторов APL для нового оборудования, в частности Основанные на Unix микрокомпьютеры, APL2 почти всегда был стандартом, выбранным для новых разработок интерпретаторов APL. Даже сегодня большинство поставщиков APL или их пользователей ссылаются на совместимость APL2 как на аргумент в пользу своих продуктов.

APL2 для мэйнфреймов IBM все еще доступен. IBM ссылается на свое использование для решения проблем, системного проектирования, прототипирования, инженерных и научных вычислений, экспертных систем, для обучения математике и другим предметам, визуализации и доступа к базам данных и впервые была доступна для CMS и TSO в 1984 году. Версия APL2 Workstation (Windows, OS / 2, AIX, Linux и Solaris ) появилась гораздо позже. в начале 1990-х.

Современные реализации

Различные реализации APL от APLX, Dyalog и др., включают расширения для объектно-ориентированного программирования, поддержку .NET Framework, примитивы преобразования XML-массива, графики, интерфейсы операционной системы и выражения лямбда-исчисления.

Производные языки

APL сформировал основу или повлиял на следующие языки:

  • A и A +, альтернативный APL, последний с графическими расширениями.
  • FP, функциональный язык программирования.
  • Ivy, интерпретатор для APL-подобного языка, разработанный Робом Пайком и использующий в качестве входных данных ASCII.
  • J, который также был разработан Айверсоном и в котором используется ASCII с орграфами вместо специальных символов.
  • K, частный вариант APL, разработанный Артуром Уитни.
  • LYaPAS, советское расширение APL.
  • MATLAB, инструмент численных вычислений.
  • Nial, язык программирования массивов высокого уровня с нотацией функционального программирования.
  • Полиморфный язык программирования, интерактивный расширяемый язык с аналогичным базовым языком.
  • S, язык статистического программирования.
  • Speakeasy, интерактивная среда численных вычислений.
  • Wolfram Language, язык программирования Mathematica.

Характеристики языка

Набор символов

APL критиковали и хвалили за выбор уникального нестандартного набора символов. Некоторые из тех, кто его изучает, становятся ярыми приверженцами, предполагая, что за идеей Айверсона о том, что используемые обозначения действительно имеют значение, стоит некоторый вес. В 1960-х и 1970-х годах немногие оконечные устройства и даже мониторы могли воспроизводить набор символов APL. В наиболее популярных из них использовался механизм печати IBM Selectric со специальным элементом типа APL. Одним из первых линейных терминалов APL (работа только в линейном режиме, а не в полноэкранном режиме) была модель 745 Texas Instruments TI (около 1977 г.) с полным набором символов APL, включающая полудуплексный и полный дуплекс. телекоммуникационные режимы для взаимодействия с APL службой разделения времени или удаленным мэйнфреймом для выполнения задания на удаленном компьютере, называемого RJE.

Со временем, с Благодаря повсеместному использованию высококачественных графических дисплеев, печатающих устройств и поддержки Unicode проблема символьных шрифтов APL была в значительной степени устранена. Однако для ввода символов APL требуется использование сопоставлений клавиатуры, виртуальных / экранных наборов символов APL или удобных печатных клавиатурных карточек, что может расстроить новичков, привыкших к другим языкам программирования. Исследование с участием новичков, не имеющих опыта работы с другими языками программирования, показало, что набор и использование символов APL не мешали ученикам в какой-либо измеримой степени.

В защиту использования APL, APL требует меньше кодирование для ввода, а раскладки клавиатуры запоминаются со временем. Кроме того, сегодня производятся и используются специальные клавиатуры APL, а также бесплатные загружаемые шрифты для операционных систем, таких как Microsoft Windows. Сообщаемый прирост производительности предполагает, что человек потратит достаточно времени на работу в APL, чтобы было полезно запомнить символы, их семантику и раскладки клавиатуры, не говоря уже о значительном количестве идиом для общих задач.

Дизайн

В отличие от языков программирования с традиционной структурой, код APL обычно структурирован как цепочка из монадических или диадических функций и операторов действует на массивы. APL имеет множество нестандартных примитивов (функций и операторов), которые обозначаются одним символом или комбинацией нескольких символов. Все примитивы имеют одинаковый приоритет и всегда связаны справа. Таким образом, APL читается или лучше всего понимается из справа налево.

Ранние реализации APL (около 1970 года или около того) не имели цикла программирования - структур управления потоком, таких как doили whileциклы, а if-then-elseконструкции. Вместо этого они использовали операции с массивами, и использование конструкций структурного программирования часто не требовалось, поскольку операция могла быть выполнена с полным массивом в одном операторе. Например, функция iota(ι) может заменить цикл for итерация : ιN при применении к скалярному положительному целому числу дает одномерный массив (вектор ), 1 2 3... N. Более поздние реализации APL обычно включают в себя комплексные управляющие структуры, так что структура данных и поток управления программой могут быть четко и четко разделены.

Среда APL называется рабочей областью. В рабочем пространстве пользователь может определять программы и данные, то есть значения данных существуют также вне программ, и пользователь также может управлять данными без необходимости определять программу. В приведенных ниже примерах интерпретатор APL сначала вводит шесть пробелов перед ожиданием ввода пользователя. Его собственный вывод начинается с первого столбца.

n ← 4 5 6 7
Присваивает вектор значений, {4 5 6 7}, переменной n, операция создания массива. Эквивалентное, но более краткое выражение APL было бы n ← 3 + ⍳4. Несколько значений хранятся в массиве n, операция выполняется без формальных циклов или языка потока управления.
n 4 5 6 7
Отобразить содержимое n, в настоящее время это массив или вектор.
n + 4 8 9 10 11
4 теперь добавляется ко всем элементам вектора n, создавая 4-элементный вектор {8 9 10 11}.
Как и выше, APL Интерпретатор отображает результат, поскольку значение выражения не было присвоено переменной (с ).
+ / n 22
APL отображает сумму компонентов вектора n, т.е. 22 (= 4 + 5 + 6 + 7)с использованием очень компактного обозначение: читать + / как "плюс, над...", и небольшое изменение будет "умножить, над..."
m ← + / (3 + ⍳4) m 22
Эти операции могут быть объединены в один оператор, помня, что APL оценивает выражения справа налево: сначала ⍳4создает массив, [1,2,3,4], затем к каждому компоненту добавляется 3 , которые суммируются, и результат, сохраненный в переменной m, наконец отображается.

В обычных математических обозначениях это эквивалентно: m = ∑ i = 1 4 (i + 3) {\ displaystyle \ displaystyle m = \ sum \ limits _ {i = 1} ^ {4} ( i + 3)}{\ displaystyle \ displaystyle m = \ sum \ limits _ {i = 1} ^ {4} (i + 3)} . Напомним, что математические выражения не читаются и не оцениваются справа налево.

Пользователь может сохранить рабочую область со всеми значениями, программами и статусом выполнения.

APL использует набор символов, отличных от ASCII, которые являются расширением традиционной арифметической и алгебраической нотации. Использование односимвольных имен для одной инструкции, векторных функций с несколькими данными (SIMD ) - это один из способов, с помощью которого APL позволяет компактно формулировать алгоритмы преобразования данных, такие как вычисление Game of Life Конвея в одной строке кода. Практически во всех версиях APL теоретически можно выразить любую вычислимую функцию в одном выражении, то есть в одной строке кода.

Из-за необычного набора символов многие программисты используют специальные клавиатуры с клавишами APL для написания кода APL. Хотя есть разные способы написания кода APL, используя только символы ASCII, на практике это почти никогда не делается. (Можно подумать, что это подтверждает тезис Айверсона о нотации как инструменте мысли.) В большинстве, если не во всех современных реализациях используются стандартные раскладки клавиатуры со специальными сопоставлениями или для доступа к символам, отличным от ASCII. Исторически сложилось так, что шрифт APL был отличительным, с прописными курсивными буквенными символами и вертикальными цифрами и символами. Большинство производителей продолжают отображать набор символов APL в пользовательском шрифте.

Сторонники APL утверждают, что примеры так называемого кода только для записи (плохо написанный и почти непонятный код) почти всегда являются примерами плохой практики программирования или ошибок новичков, которые могут возникнуть на любом языке. Защитники также утверждают, что они намного более продуктивны с APL, чем с более традиционными компьютерными языками, и что рабочее программное обеспечение может быть реализовано за гораздо меньшее время и с гораздо меньшим количеством программистов, чем с использованием других технологий.

Они также могут утверждать, Благодаря своей компактности и краткости, APL хорошо подходит для крупномасштабной разработки программного обеспечения и сложности, поскольку количество строк кода может быть значительно уменьшено. Многие сторонники и практики APL также считают стандартные языки программирования, такие как COBOL и Java, сравнительно утомительными. APL часто встречается там, где важно время выхода на рынок, например, в торговых системах.

Терминология

APL проводит четкое различие между функциями и операторами. Функции принимают массивы (переменные, константы или выражения) в качестве аргументов и возвращают массивы в качестве результатов. Операторы (аналогичные функциям высшего порядка ) принимают функции или массивы в качестве аргументов и производят связанные функции. Например, функция суммы получается путем применения оператора сокращения к функции сложения. Применение того же оператора сокращения к функции максимума (которая возвращает большее из двух чисел) порождает функцию, которая возвращает наибольшее значение из группы (вектора) чисел. В языке J Айверсон заменил термин глагол на функцию и наречие или союз на оператор.

APL также определяет те функции, которые встроены в язык и представлены символом или фиксированной комбинацией символов, как примитивы. Большинство примитивов - это либо функции, либо операторы. Кодирование APL - это в основном процесс написания непримитивных функций и (в некоторых версиях APL) операторов. Однако некоторые примитивы не считаются ни функциями, ни операторами, в первую очередь присваиванием.

Некоторые слова, используемые в литературе по APL, имеют значения, которые отличаются как от математических, так и от компьютерных наук в целом.

Терминология операторов APL
ТерминОписание
функцияоперация или отображение, которое принимает ноль, один (правый) или два (левый и правый) аргумент, которые могут быть скаляры, массивы или более сложные структуры и могут возвращать аналогичный сложный результат. Функция может быть:
  • Примитивной: встроенной и представленной одним глифом;
  • Определенной: как именованный и упорядоченный набор программных операторов;
  • Производный: как комбинация оператора с его аргументами.
массивобъект со значениями данных нулевого или более ортогональных измерений в строковом порядке, в котором каждый элемент примитивный скалярный элемент данных или другой массив.
ниладический, не принимающий или не требующий каких-либо аргументов,
монадическийтребующий только один аргумент; справа для функции, слева для оператора, унарный
диадический, требующий как левого, так и правого аргумента, двоичный
амбивалентный или монадическийс возможностью использования в монадическом или диадическом контексте, позволяя опустить его левый аргумент
operatorоперация или отображение, которое принимает одну (слева) или две (слева и справа) функции или аргументы (операнды) со значениями массива и выводит функция. Оператор может быть:
  • Примитивным: встроенным и представлен одним глифом;
  • Определенным: как именованный и упорядоченный набор программных операторов.

Синтаксис

APL имеет явное представление функций, операторов и синтаксиса, что обеспечивает основу для четкого и явного изложения расширенных возможностей языка и инструментов для экспериментов с ними.

Примеры

Hello, World

Здесь отображается «Hello, world »:

«Hello, world»

«Hello World», пример пользовательского сеанса на YouTube

Темой дизайна в APL является определение действий по умолчанию в некоторых случаях, которые могут вызвать синтаксические ошибки в большинстве других языков программирования.

Отображается строковая константа «Hello, world», указанная выше, поскольку display является действием по умолчанию для любого выражения, для которого не указано действие явно (например, присвоение, параметр функции).

Возведение в степень

Другой пример этой темы: возведение в степень в APL записывается как «2 * 3», что означает возведение 2 в степень 3 (это будет записывается как «2 ^ 3» на некоторых других языках и «2 ** 3» в FORTRAN и Python): во многих языках используется * для обозначения умножения, как в 2 * 3, но APL для этого используется 2 × 3. Однако, если база не указана (как с оператором «* 3» в APL или «^ 3» на других языках), в большинстве других языков программирования будет синтаксическая ошибка. Однако APL предполагает, что отсутствующее основание является константой натурального логарифма e (2,71828....), и поэтому интерпретирует «* 3» как «2,71828 * 3".

Простая статистика

Предположим, что X- это массив чисел. Тогда (+ / X) ÷ ⍴Xдает среднее значение. При чтении справа налево ⍴Xдает количество элементов в X, а поскольку ÷является двоичным оператором, термин слева от него также является обязательным. Он заключен в круглые скобки, поскольку в противном случае будет взят X (так, чтобы сумма была X ÷ ⍴X, каждого элемента X, деленного на количество элементов в X), и + / Xдобавляет все элементы X. Основываясь на этом, ((+ / ((X - (+ / X) ÷ X) * 2)) ÷ ⍴X) * 0.5вычисляет стандартное отклонение. Кроме того, поскольку присваивание является оператором, оно может появиться в выражении, поэтому

SD ← ((+ / ((X - AV ← (T ← + / X) ÷ ⍴X) * 2)) ÷ ⍴X) * 0,5

поместит подходящие значения в T, AV и SD. Естественно, можно было бы превратить это выражение в функцию для многократного использования, а не набирать ее каждый раз заново.

Выберите 6 номеров лотереи

Это следующее выражение для немедленного режима генерирует типичный набор номеров лотереи Pick 6 : шесть псевдослучайных целые числа в диапазоне от 1 до 40, гарантированное неповторение и отображение их в порядке возрастания:

x [⍋x ← 6? 40]

Вышеупомянутое кратко делает многое; хотя для нового APLer это кажется сложным. Он сочетает в себе следующие функции APL (также называемые примитивами и глифами):

  • Первой выполняемой (APL выполняется от крайнего правого к крайнему левому) является двоичная функция ?(с именем deal, когда диадический), который возвращает вектор , состоящий из выбранного числа (левый аргумент: 6 в данном случае) случайных целых чисел в диапазоне от 1 до указанного максимума (правый аргумент: 40 в данном случае), что, если сказано максимальная длина вектора ≥, гарантируется неповторение; таким образом, сгенерируйте / создайте 6 случайных целых чисел в диапазоне от 1 до 40.
  • Затем этот вектор присваивается () переменной x, потому что он понадобится позже.
  • Затем этот вектор сортируется в порядке возрастания с помощью монадической функции , правым аргументом которой является все, что находится справа от него, вплоть до следующей несбалансированной закрывающей скобки или закрывающей скобки. скобка. Результатом являются индексы, которые будут располагать его аргумент в порядке возрастания.
  • Затем вывод используется для индексации переменной x, который мы сохранили ранее для этой цели, тем самым выбирая его элементы в возрастающей последовательности.

Поскольку слева от крайнего левого x нет функции, которая бы сообщала APL, что делать с результатом, он просто выводит его на дисплей (в одной строке, разделенной пробелами) без каких-либо явных инструкций для этого.

?также имеет монадический эквивалент, называемый roll, который просто возвращает одно случайное целое число от 1 до его единственного операнда [справа от него] включительно. Таким образом, программа ролевой игры может использовать выражение ? 20для броска двадцатигранной кости.

Простые числа

Следующее выражение находит все простые числа от 1 до R. Как во времени, так и в пространстве сложность вычисления составляет O (R 2) {\ displaystyle O (R ^ {2}) \, \!}O (R ^ {2}) \, \! нотации Big O ).

(~ R∊R∘. × R) / R ← 1 ↓ ιR

Выполняется справа налево, это означает:

  • Iota ιсоздает вектор, содержащий целые числа из От 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 (оператор °. ×), то есть
4681012
69121518
812162024
1015202530
1218243036
  • Построить вектор той же длины, что и Rwi th 1в каждом месте, где соответствующий номер в Rнаходится во внешней матрице продукта (, установите включение или элемент или Epsilon ), т. е. 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 +. ≠ '';]

Game of Life

Следующая функция «жизнь», записанная в Dyalog APL, принимает логическую матрицу и вычисляет новое поколение в соответствии с Игра жизни Конвея. Он демонстрирует возможности APL для реализации сложного алгоритма в очень небольшом объеме кода, но его также очень трудно понять, если у человека нет глубоких знаний APL.

life ← {↑ 1 ⍵∨.∧3 4 = + /, ¯1 0 1∘.⊖¯1 0 1∘.⌽⊂⍵}

Удаление тегов HTML

В следующем Например, также Dyalog, первая строка присваивает некоторый код HTML переменной txt, а затем использует выражение APL для удаления всех тегов HTML (объяснение ):

txt ← ' 

Это выделенный текст.

'{⍵ / ⍨ ~ {⍵∨ ≠ \ ⍵} ⍵∊' <>'} txt Это выделенный текст.

Использование

APL используется для многих целей, включая финансовые и страховые приложения, искусственный интеллект, нейронные сети и робототехника. Утверждалось, что APL - это инструмент вычислений, а не язык программирования; его символическая природа и возможности массива сделали его популярным среди экспертов в предметной области и специалистов по данным, которые не имеют или не нуждаются в навыках компьютерного программиста.

APL хорошо подходит в манипулирование изображениями и компьютерную анимацию, где графические преобразования могут кодироваться как матричные умножения. Один из первых коммерческих изданий компьютерной графики, Digital Effects, произвел графический продукт APL под названием Visions, который использовался для создания телевизионных рекламных роликов и анимации для фильма Tron 1982 года. В последнее время симулятор лодки Stormwind использует APL для реализации своей основной логики, взаимодействия с промежуточным программным обеспечением конвейера рендеринга и основной части своего физического движка.

Сегодня APL по-прежнему используется в широком спектре коммерческих и научных приложений, например управление инвестициями, управление активами, здравоохранение и профилирование ДНК и любителями.

Известные реализации

APL \ 360

Первой реализацией APL, использующей узнаваемые символы APL, была APL \ 360, которая работала на IBM System / 360 и был завершена в ноябре 1966 года, хотя в то время использовалась только в IBM. В 1973 году его разработчики, Ларри Брид, Дик Латвелл и Роджер Мур, были награждены Премией Грейс Мюррей Хоппер от Ассоциация вычислительной техники (ACM). Он был вручен «за их работу по разработке и внедрению APL \ 360, установившую новые стандарты простоты, эффективности, надежности и времени отклика для интерактивных систем».

В 1975 году IBM 5100 микрокомпьютер предлагал APL \ 360 в качестве одного из двух встроенных интерпретируемых языков на основе ПЗУ для компьютера, в комплекте с клавиатурой и дисплеем, которые поддерживали все специальные символы, используемые в языке.

Значительные изменения в APL \ 360 включал CMS / APL, в котором использовались возможности виртуальной памяти из CMS и APLSV, в которых были представлены общие переменные, системные переменные и системные функции. Впоследствии он был перенесен на платформы IBM System / 370 и VSPC до его окончательного выпуска в 1983 году, после чего он был заменен APL2.

APL \ 1130

В 1968 году APL \ 1130 стала первой общедоступной системой APL, созданной IBM для IBM 1130. Это стало самым популярным программным обеспечением IBM Type-III Library, выпущенным IBM.

APL * Plus и Sharp APL

APL * Plus и Sharp APL являются версиями APL \ 360 с добавленными бизнес-ориентированными расширениями, такими как форматирование данных и средства для хранения массивов APL во внешних файлах. Они были совместно разработаны двумя компаниями с привлечением различных членов первоначальной группы разработчиков IBM APL \ 360.

Эти две компании были I. P. Sharp Associates (IPSA), сервисная компания APL \ 360, образованная в 1964 году Яном Шарпом, Роджером Муром и другими, и STSC, компания, предоставляющая консалтинговые услуги и разделение времени, основанная в 1969 году Лоуренс Брид и другие. Вместе они разработали APL * Plus и после этого продолжили работать вместе, но разработали APL отдельно как APL * Plus и Sharp APL. STSC перенесла APL * Plus на многие платформы с версиями, созданными для VAX 11, ПК и UNIX, тогда как IPSA применил другой подход к появлению Personal Computer и сделал 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.

APL2

APL2 стал значительным повторением. реализация APL от IBM, которая была разработана в 1971 году и впервые выпущена в 1984 году. Она предоставляет множество дополнений к языку, наиболее заметным из которых является поддержка вложенных (непрямоугольных) массивов. По состоянию на 2018 год он доступен для мэйнфреймов под управлением z / OS или z / VM и рабочих станций с AIX, Linux, <485.>Sun Solaris и Microsoft Windows.

Вся группа продуктов и услуг APL2 была награждена премией Iverson в 2007 году.

Dyalog APL

Dyalog APL был впервые выпущен британской компанией Dyalog Ltd. в 1983 г. и по состоянию на 2018 г. доступен для AIX, Linux (в том числе на Raspberry Pi ), платформы macOS и Microsoft Windows. Он основан на APL2 с расширениями для поддержки объектно-ориентированного программирования и функционального программирования. Лицензии бесплатны для личного / некоммерческого использования.

В 1995 году двое из команды разработчиков - Джон Скоулз и Питер Доннелли - были удостоены премии Iverson Award за работу над переводчиком. Гитте Кристенсен и Мортен Кромберг были совместными обладателями премии Iverson Award в 2016 году.

NARS2000

NARS2000 - это интерпретатор APL с открытым исходным кодом, написанный Бобом Смитом, известным разработчиком и разработчиком APL из <238.>ГНЦ в 1970-1980-х гг. NARS2000 содержит расширенные функции и новые типы данных и изначально работает на Microsoft Windows и других платформах под Wine.

APLX

APLX - это кроссплатформенный диалект APL, основанный на APL2 и с несколькими расширениями, который был впервые выпущен британской компанией MicroAPL в 2002 году. Хотя он больше не находится в разработке или в коммерческой продаже, он теперь доступен бесплатно плата от Dyalog.

GNU APL

GNU APL - это бесплатная реализация расширенного APL, как указано в ISO / IEC 13751: 2001, и, таким образом, реализация APL2. Он работает в GNU / Linux и Windows с использованием Cygwin и использует Unicode внутри. Его написал Юрген Зауэрманн.

Ричард Столлман, основатель GNU Project, был одним из первых приверженцев APL, который летом в старшей школе использовал его для написания текстового редактора. 1969 года.

Интерпретация и компиляция APL

APL традиционно является интерпретируемым языком, имеющим такие языковые характеристики, как слабая типизация переменных, не очень хорошо подходит к компиляции. Однако с массивами в качестве основной структуры данных он предоставляет возможности повышения производительности за счет параллелизма, параллельных вычислений, массово-параллельных приложений и очень больших -масштабируемая интеграция (VLSI), и с самого начала APL считался высокопроизводительным языком - например, он был отмечен скоростью, с которой он мог выполнять сложные матричные операции, «потому что он работает с массивами и выполняет такие операции, как внутренняя инверсия матрицы ».

Тем не менее, APL редко интерпретируется чисто, и методы компиляции или частичной компиляции, которые используются или использовались, включают следующее:

Распознавание идиомы

Большинство интерпретаторов APL поддерживают распознавание идиомы и оценивают общие идиомы как отдельные операции. Например, при оценке идиомы BV / ⍳⍴Aкак одной операции (где BV- логический вектор, а A- массив), создание двух промежуточных массивов избегается.

Оптимизированный байт-код

Слабая типизация в APL означает, что имя может ссылаться на массив (любого типа данных), функцию или оператор. Как правило, интерпретатор не может заранее знать, в какой форме он будет, и поэтому должен выполнять анализ, проверку синтаксиса и т. Д. Во время выполнения. Однако при определенных обстоятельствах можно заранее определить, на какой тип будет ссылаться имя, а затем сгенерировать байт-код , который может быть выполнен с уменьшенными накладными расходами времени выполнения. Этот байт-код также можно оптимизировать с помощью таких методов компиляции, как сворачивание констант или исключение общего подвыражения. Интерпретатор выполнит байт-код, если он присутствует и когда все сделанные предположения выполнены. Dyalog APL включает поддержку оптимизированного байт-кода.

Компиляция

Компиляция APL была предметом исследований и экспериментов с тех пор, как язык впервые стал доступным; Первым компилятором считается Burroughs APL-700, который был выпущен примерно в 1971 году. Чтобы иметь возможность компилировать APL, необходимо наложить языковые ограничения. APEX - это исследовательский APL-компилятор, написанный Робертом Бернекки и доступный по общественной лицензии GNU.

Компилятор APL STSC представляет собой гибрид оптимизатора байт-кода и компилятор - он позволяет компилировать функции в машинный код при условии, что его подфункции и глобальные объекты объявлены, но интерпретатор по-прежнему используется как библиотека времени выполнения и для выполнения функций, которые не соответствуют требованиям компиляции.

Стандарты

APL стандартизирован рабочей группой Американского национального института стандартов (ANSI) X3J10 и Международная организация по стандартизации (ISO) и Международная электротехническая комиссия (IEC), Объединенный технический комитет 1 ISO / IEC Подкомитет 22 Рабочая группа 3. Указан основной язык APL в ISO 8485: 1989, а язык Extended APL указан в ISO / IEC 13751: 2001.

Ссылки

Дополнительная литература

Видео

Внешние ссылки

Викискладе есть средства массовой информации, связанные с APL (язык программирования) .

Интернет-ресурсы

Провайдеры

Группы и сообщества пользователей

Последняя правка сделана 2021-06-09 01:52:26
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте