apl язык программирования пример кода
Язык программирования APL
Итак, APL, — аббревиатура расшифровывается очень просто: A Programming Language. Идея языка появилась у Кеннета Айверсона (Kenneth E. Iverson) в 1957 году во время его работы в Гарвардском университете, и нашла свою реализацию во время его работы в IBM в 1964. Пик использования APL приходится на середину 80х, когда появилось множество версий языка и диалектов, в том числе и для микроконтроллеров. В какой-то момент даже Microsoft Corporation планировало релиз своей версии APL, но по неизвестным причинам этот релиз так и не состоялся. В начале 80х появилась новая версия языка — APL2, которую создала группа разработчиков IBM под руководством доктора Джима Брауна (Jim Brown). Эта версия и стала основой современного APL.
Сейчас существует около десятка различных интерпретаторов APL. Основные это Dyalog APL, APL Now и MicroAPL, все три работают с Windows, Unix и Linux, а последняя и с MacOS (дальше я буду приводить примеры, используя Dyalog APL, к тому же студенты могут скачать этот интерпретатор бесплатно с сайта Dyalog: dss.dyalog.com/edu).
Так как в среде APL используется много нестандартных символов, то для разработки используется специальная раскладка клавиатуры. В последних версиях Dyalog APL специальные символы уже вынесены непосредственно на панель приборов, и их легко выбрать, просто нажав на нужный символ.
Итак, для чего же нам всё это нужно? Основными особенностями и преимуществами языка можно выделить следующие:
1. Кроссплатформенные реализации.
2. Вычисления происходят справа налево, и вычисленный результат присваивается функции слева. Приведу пример:
3. Количество кода минимизировано, благодаря использованию спецсимволов, и тому, что все операции можно производить непосредственно над массивом, т.е. нет необходимости использовать циклы. Для примера создадим массив, найдём сумму всех элементов массива, найдём длину массива, а потом увеличим каждый элемент массива на 1+номер элемента массива.
Благодаря этим правилам APL фактически позволяет реализовать любую функцию в одной строке кода. Один знакомый реализовал на APL множество Мандельброта, а здесь можно скачать реализацию знаменитой игры «Жизнь», естественно тоже одной строкой кода.
Еще один огромный плюс, это возможность работы с большими матрицами. У клиентов, которые используют наш программный продукт (а клиенты это инвестиционные банки, пенсионные фонды, банковские альянсы), часто бывают данные в матрицах размерностью 100 000 по одной оси. APL позволяет производить различные математические операции над такими матрицами без потери производительности.
Изначально APL был функционально-модульным языком программирования, хотя современный APL и поддерживает ООП, но написание полностью объектно-ориентированного кода будет мягко говоря не сильно просто и читабельно. Тем не менее, стоит иметь ввиду тот факт, что возможность создания сложных объектов языком поддерживается. В принципе, современный APL даёт возможность создания графического интерфейса (не дай бог вам этим заниматься), а из приятного: поддерживает XML и лямбда-выражения.
Приведу еще несколько примеров, чтобы вы могли прочувствовать язык.
APL предоставляет очень мощные механизмы для работы с массивами и матрицами. Элементы массива могу быть любых типов, массивы могут быть любого уровня вложенности, и вы легко можете добраться до любого элемента массива. Создадим матрицу 10 на 10 и заполним её элементами от 1 до 100. Обращение к строкам матрицы стандартное:
Теперь создадим массив из 3 элементов: числа, строки и нашей матрицы. Мы можем легко добраться до любого элемента массива. Поменяем вторую букву в строке и последний элемент матрицы (изменился только массив, матрица mat не изменилась).
Для создания функции достаточно просто ввести её имя и дважды кликнуть на нём мышкой — функция откроется в отдельном окне. Всё что идёт слева и справа от имени функции – это аргументы, результат это то, что идёт слева от символа присваивания. Результат возвращается в переменную с таким же именем, которое указано в первой строке. В APL сигнатурой функции является только её имя. Создаю функцию, которая принимает один аргумент и возвращает его инкремент.
Отдельно стоит отметить дебаггер APL. Изменять значения переменных, и переходить по стеку можно прямо во время выполнения, что не может не радовать. Надо только переключиться из режима трейса в режим редактирования.
Я изменяю переменную а на 1 перед выполнением последней строки функции, справа окно Watch в котором значение переменной res:
Можно показывать много примеров, но самый простой вариант – скачать Dyalog APL и попробовать самим. Заодно ознакомитесь со стандартными функциями представленными символами. При наведении на символ появляется информация о его функции и применению.
Анализатор языка проверяет введённую строку справа налево до того момента пока не встретит первую функцию(символ). Дальше проверяет, есть ли аргументы слева от функции. Если аргументов нет, то символ используется в своём единичном значении (monadic), если же есть аргументы слева, то используется значение dyadic. Пример: данный символ или округляет в сторону увеличения или выбирает максимальный из двух элементов.
Думаю этой информации должно быть достаточно для того, что вы смогли самостоятельно освоиться в языке. В завершение могу посоветовать еще несколько видеоуроков.
Надеюсь, мне удалось вас заинтересовать, потому как это кажется несправедливым, что нет русскоязычных статей про APL и вообще он у нас совершенно непопулярен. И, конечно, постараюсь ответить на ваши вопросы и/или замечания.
Apl язык программирования пример кода
APL (от названия книги A Programming Language) — интерактивный матричный язык программирования, основанный на математической нотации Айверсона.
В 1956 году Кеннет Э. Айверсон, сотрудник Гарвардского университета (впоследствии сотрудник фирмы IBM и профессор названного университета) заявил о разрабатываемом им языке, который был закончен в 1961 г. Впервые этот язык был описан в 1962 году в книге Айверсона «A Programming Language» («Некий язык программирования»). Позднее язык был стандартизирован: ISO 8485:1989 описывает Core APL, ISO/IEC 13751:2001 — Extended APL. Кроме того, предпринимались попытки дополнить его современными возможностями — объектно-ориентированным программированием, работой с базами данных SQL и т.д.
Целью создания APL была разработка компактной системы записи (нотации) для описания алгоритмов прикладной математики. В изобретенной Айверсоном оригинальной нотации присутствует множество специфических соглашений и символов (кроме обычных знаков, в алфавите содержится 58 специфических, например, «сапог», «шапка», «посох», «дно» и т.д., и лигатуры — знаки, которые возникают при наложении друг на друга двух простых символов). Все это предназначено для точной и сжатой формулировки алгоритмов, которые затем можно интерпретировать на различные языки программирования. Таким образом, APL создавался не только как язык программирования, но в первую очередь как язык передачи идей. Первые реализации APL как языка программирования были созданы гораздо позже, чем его первые описания и использования для описаний других систем.
Основные особенности APL:
APL предоставляет программисту богатый набор функций — средств обработки данных и их преобразования в другие данные. Использование функций в выражениях подчиняется простому правилу приоритета: правым аргументом бинарной функции (или единственным аргументом унарной) всегда является выражение справа от нее целиком. Приоритет можно контролировать в явном виде при помощи скобок, но чаще всего это не нужно. Это правило упрощает анализ иерархической структуры выражений: функции верхнего уровня всегда находятся слева в строке.
Важным элементом языка являются операторы, примерно соответствующие функциям высшего порядка в других функциональных языках. Операторы получают на вход данные или функции и создают функции. В большинстве реализаций APL набор операторов ограничен и фиксирован — инструментарий определения новых операторов отсутствует. Это отличает язык от других функциональных языков, включая его наследник J, в которых функции высшего порядка можно создавать без ограничений. Синтаксис использования операторов отличается от синтаксиса функций: операторы выполняются слева направо, а унарные операторы используют выражение слева в качестве аргумента.
Одна команда программы на APL выглядит как последовательность функций и операторов, применяющихся к массивам. В языке есть примитивные типы данных (скаляры) — числа и символы (логические значения моделируются числами 0 для false и 1 для true — прием, впервые примененный в APL). Все структуры данных в языке — массивы: одномерные векторы, двухмерные матрицы и многомерные мультитаблицы. Все функции изначально ориентированы на работу с массивами, хотя и могут применяться к скалярам (с разным эффектом в зависимости от размерности аргументов). Развитая система операций над массивами позволяет во многих случаях избежать использования явных команд управления потоком выполнения программы. Во многих реализациях императивных управляющих структур нет вообще, хотя последние реализации склоняются к их добавлению и использованию для того, чтобы подчеркнуть разделение структур данных и управляющих конструкций.
Для реализации разнородных структур данных используется принцип boxing : любой массив может “заключаться в коробку” и рассматриваться как скаляр. В таком представлении над ним нельзя производить операции, зато его можно включать (вкладывать) в другие массивы. Содержимое такого массива становится доступным после его “извлечения из коробки”. Эта же техника используется для передачи в функции трех и более аргументов (все функции APL могут принимать от 0 до 2 аргументов, включительно).
В настоящее время APL используется в финансовых и математических приложениях, и существует ряд реализаций, но его популярность пошла на убыль с середины 1980-ых годов, когда начали развиваться другие системы математических вычислений. Многие из них создавались под влиянием APL, но оказались более интуитивными и лучше предназначенными для конечного пользователя.
Элементы синтаксиса:
Клавиатура APL
APL (язык)
Резюме
Исторический
Примеры даны в двух экземплярах: форма снимка экрана, которая будет правильно отображать любой браузер, который вы используете, и один в форме текста, который вы можете скопировать / вставить, например, в NARS2000 (см. Ниже) для его выполнения, возможно, с некоторыми вариациями. Визуализация страницы будет зависеть от шрифта по умолчанию и уровня масштабирования. Вы можете изменить их, например, на ПК, нажав Ctrl + колесо мыши, в зависимости от разрешения вашего экрана.
NORMALIZE X for X ÷ + / X
«Разделите каждый элемент X на сумму всех элементов X» и т. Д.
Если мы рассмотрим гигантские таблицы, идея MapReduce не за горами, и на самом деле несколько реализаций APL используют параллелизм оборудования (см. Ниже) без необходимости самому программировать использование пользователем.
Символы APL, представляющие операции, которые могут использоваться в программировании, как и в немедленном вычислении на консоли, например, «домино», ⌹ которое напрямую переворачивает квадратную матрицу или решает слишком большую систему линейных уравнений в смысле наименьших квадратов, если матрица Прямоугольный:
После того, как в 2009 году он испытал дно волны, интерес к этому языку с тех пор значительно вырос.
Презентация
В свое время APL была новаторской благодаря нескольким удобным для пользователя аспектам:
Примеры
Итак, чтобы написать «Hello, World! »В APL дела обстоят так:
«КОШКА» [7 5 2 3 4 6 7] ⍝ дает
«КОШКА» [2 3 ⍴ 7 5 2 4 6 7] ⍝ дает
Благодаря приоритету справа налево, язык можно читать просто, как естественный язык: «1 плюс сумма обратных факториалов целых чисел от 1 до 30» будет записана:
Тот же результат (т.е. значение e ) может быть получен прямым нажатием * 1
Исходный APL знал только скаляры и массивы (числовые или буквенно-цифровые). Теперь он управляет массивами массивов, а также позволяет пользователю определять свои собственные «операторы».
Табличные операции
Персонаж ⎕ читает «четырехъядерный».
то же самое на другой оси: столбцы
конкатенация путем создания нового измерения: матрица становится кубом
Эта операция создала новое измерение на другой оси.
Операции над множествами
В соответствии с тем, что элементы этих групп имеют собственную идентичность или, скорее, не имеют (то есть неотличимы), существует двенадцать различных способов (в) обработки множеств.
Операторы
Массивы массивов и функция ⍎
Рабочая среда
Автоматическая отметка времени
⎕NL (= N ame L ist) возвращает список элементов рабочей зоны, ⎕NL 3 возвращает список своих единственных функций. Как видно, горизонтальное объединение таблиц разной природы просто запятой упрощает отображение.
В NARS2000 системная функция ⎕vr дополнительно перечисляет одну функцию с ее номерами строк, последняя строка содержит ее временную метку. В результате получается простой вектор символов, содержащий несколько символов новой строки, стандартная раскраска символов выполняется системой.
Исторические элементы
Идиомы APL
Стэнли Джордан представил ACM доклад об использовании фраз APL в музыкальной композиции.
Наконец, сайт rosettacode дает несколько примеров небольших проблем с их разрешением в APL, а также (в целом менее кратко) на других языках: https://rosettacode.org/wiki/Category:APL
Реализации
Бесплатно
Четыре основных реализации APL с открытым исходным кодом можно загрузить бесплатно:
Ролик с бесплатным входом
Разные
В 1976 году Sligos написал APL для Iris 80 (CII), чтобы предложить этот язык в качестве службы удаленной обработки. Проект был заброшен через несколько месяцев после его завершения из-за недостаточной производительности при вводе в эксплуатацию. Рабочие области, предназначенные для перехода с 370 на Iris 80, были немного изменены, чтобы обеспечить обратную миграцию.
ИТ-среды
Некоторые из них поставляются с IBM APL2: AP124 (прямая адресация экрана, например curses ), AP127 и AP227 (соответственно доступ к базам данных DB2 и ODBC ), AP144 и AP145 (соответственно адресация X-Window и Windows ), AP200 (координация отдельные сеансы APL), AP207 (процессор интерактивной графики, используемый GRAPHPAK ).
Глифы
Некоторые реализации, такие как NARS2000, обеспечивают математически мощное использование других символов.
Существующие шрифты APL
Веб-браузеры поддерживают отображение символов APL с 2010 года. В 2015 году на это способны многие планшеты.
Клавиатура
Этот 5-страничный документ подробно описывает возможную реализацию клавиатуры APL в Linux:
Вокруг языка
Текущая ситуация
Оператор ∘ позволяет выразить декартово произведение между двумя векторами данных, поэтому все комбинации их операндов (операция в N ^ 2), а затем оператор / сжимают результат в соответствии с другой операцией. Целое выражает комбинаторное вычисление, запрошенное от этого калькулятора, точно так же, как запрос SQL выражает то, что запрошено из базы данных, без необходимости вдаваться в детали вычисления.
Dyalog APL версии 17.0 ( июль 2018 ) автоматически использует векторные инструкции из архитектур x64, POWER и ARM.
Некоторые мнения
Читаемость
СОДЕРЖАНИЕ
Монадические и диадические функции
Функции и операторы
> / используется слева |
В приведенном выше случае, уменьшить или слэш оператора умеренных в множественно функцию. Выражение × / 2 3 4 дает скалярный результат (только 1 элемент) путем уменьшения массива путем умножения. Вышеупомянутый случай упрощен: представьте, что вы умножаете (складываете, вычитаете или делите) больше, чем просто несколько чисел вместе. (Из вектора × / возвращает произведение всех его элементов.)
Правила синтаксиса
Оператор может иметь операнды функции или данных и оценивать двоичную или монадическую функцию. Операторы давно покинули сферу деятельности. Оператор принимает в качестве левого операнда самую длинную функцию слева от него. Например:
Пример использования APL для индексации ⍳ или поиска (или не поиска) элементов в векторе символов :
Форма ⍴ или символ вектор-длина Letters 5.
Переменная Find : задается, что искать в буквах, и ее длина составляет 4 символа.
1 2 3 4 5 Монадические функции
Диадические функции
Отрицательные числа производят обратные соответствующие функции.
not = not Or
∧ = not And
Операторы и индикатор оси
Примечания: Операторы сокращения и сканирования ожидают, что слева от них будет двоичная функция, которая образует монадическую составную функцию, применяемую к вектору справа.
За некоторыми функциями может следовать индикатор оси в (квадратных) скобках, т. Е. Он появляется между функцией и массивом, и его не следует путать с индексами массива, записанными после массива. Например, учитывая функцию ⌽ (разворот) и двумерный массив, функция по умолчанию работает вдоль последней оси, но это можно изменить с помощью индикатора оси:
Вложенные массивы
Пользовательская сессия с интерпретатором APL | Объяснение | |||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Ниладова функция PI или π (pi) | Monadic функция CIRCLEAREA | Диадическая функция SEGMENTAREA с локальными переменными | |||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Имя (а) | Символ | Пример | Значение (примера) | Кодовая точка Unicode |
---|---|---|---|---|
Высокий минус | ¯ | ¯3 | Обозначает отрицательное число | U + 00AF ¯ |
Лампа, Комментарий | ⍝ | ⍝This is a comment | Все справа от ⍝ обозначает комментарий. | U + 235D ⍝ |
RightArrow, Branch, GoTo | → | →This_Label | → This_Label отправляет выполнение APL в This_Label: | U + 2192 → |
Назначить, Стрелка влево, Установить | ← | B←A | B ← A устанавливает значения и форму B для соответствия A | U + 2190 ← |
Большинство реализаций APL поддерживают ряд системных переменных и функций, которым обычно предшествуют символы ⎕ (quad) и или «)» ( крючок = закрывающая скобка). Особенно важна и широко применяется переменная ⎕IO ( Index Origin ), поскольку, хотя исходный IBM APL основывал свои массивы на 1, некоторые более новые варианты основывают их на нуле:
Пользовательская сессия с интерпретатором APL | Описание |
---|---|
) VARS системная функция в APL, ) VARS показывает имена пользовательских переменных, существующие в текущей рабочей области. |
Шрифты
Некоторые шрифты Unicode были разработаны для правильного отображения APL: APLX Upright, APL385 Unicode и SimPL.
Функция клавиатуры APL2 для отображения символов
Решение головоломок
APL оказался чрезвычайно полезным при решении математических задач, некоторые из которых описаны ниже.
Треугольник Паскаля
Простые числа, доказательство контраста через множители
Последовательность Фибоначчи
- С чем сделать макароны ребенку в год
- 0xc1900101 0x2000c код ошибки windows как поступить в данной ситуации