A Programming Language
На рубеже 20 века, канадский учёный и программист Кеннет Айверсон, искал удобный способ для записи и обьяснения алгоритмов для своих студентов. В результате этого появился язык известный как APL, изначально представляющий собой графо-символьную нотацию для записи алгоритмов, а затем — как полноценный язык программирования. Его синтаксис стал продолжением математической мысли:
-
Никакого компромисса с машинной логикой — только чистые абстракции
-
Символы = операции, как в математике:
⍴(форма),⌈(максимум),⍳(индексы) -
Векторы и матрицы — базовые типы данных, а не библиотечные надстройки
⍝ Широко известный пример, короткой, но полной программы: ⍝ вывод всех простых чисел до R (~T∊T∘.×T)/T←1↓⍳R
Позже появились «упрощённые» версии APL с ASCII-синтаксисом (J, K). Но это уже другие языки — они жертвуют математической элегантностью ради удобства ввода. Настоящий APL — это:
-
Идеальный мост между формулой на бумаге и исполняемым кодом
-
Язык-манифест, где красота решения важнее «понятности» новичкам
-
Язык для тех, кто мыслит математическими абстракциями, а не синтаксисом
-
Не инструмент, а стиль мышления
⍝ Original APL (математическая нотация) vs ASCII-версии:
APL: V ← ⍋M ⍝ Сортировка матрицы
J/K: v =: /: m ⍝ Теряет визуальную связь с математикой
«APL — это алгебра для компьютеров. Если вы думаете, как математик, он станет вашим родным языком».
Хронология:
-
1957-1962: Разработка нотации в Гарварде (ещё до появления BASIC и широкого распространения Фортрана)
-
1966: Первая реализация APL на IBM 360 — уже как полноценного языка
-
1970-е: Пик популярности в науке и финансах (например, в Bell Labs для анализа данных)
-
1980-1990-е: Закат
Пик популярности (1970-е)
APL переживал расцвет там, где требовалась математическая плотность и интерактивность:
-
Научные исследования и инженерия

-
Bell Labs: анализ телекоммуникационных данных
-
NASA: расчёты орбит (до появления MATLAB)
-
Финансы: алгоритмическая торговля в банках (например, Morgan Stanley)
-
-
Уникальные преимущества
APL\360 Интерактивный подход -
Интерактивность: REPL появился в APL на 20 лет раньше, чем в Python
-
Графика: Встроенные возможности визуализации — прообраз современных Jupyter Notebooks
-
Производительность: Оптимизированные операции с массивами (как современный NumPy, но без накладных расходов)
-
-
Культовое железо
IBM 5100, изображение из журнала «Byte» от декабря 1975 -
APL-машина стала драйвером развития персональных компьютеров (IBM 5100)
-
Легендарная APL\360 — первая коммерческая реализация от IBM
-
«В 1973 году 80% задач анализа данных в Wall Street решались на APL»
APL — это не язык, а «сжатый алгоритм»
Сегодня все говорят о DSL (Domain-Specific Languages). APL — это DSL для математики, созданный в 1960-х.
APL — это плотная символьная упаковка математики. Он создавался не как способ реализации алгоритмов, а как способ их описания.
-
В Python вы пишете как что-то сделать
-
В APL вы описываете что нужно сделать
Примеры
⍝ Умножение матриц A +.× B
То же в Python:
np.dot(A, B)
Пояснение: +.× — это «внутреннее произведение» (как в линейной алгебре), а не циклы.
⍝ Факториал числа !5
То же в Python:
math.factorial(5)
Пояснение: ! в APL — это математический символ факториала, а не вызов функции.
⍝ Поиск простых чисел (2=+⌿0=T∘.|T)/T←⍳100
Тоже на Python:
[n for n in range(1, 101) if all(n % d != 0 for d in range(2, n))]
Пояснение: APL выражает фильтрацию через операции сравнения и редукции.
⍝ Перевернуть строку ⌽'Hello'
Тоже на Python:
"Hello"[::-1]
Пояснение: ⌽ — это символ «перевернуть», а не срезы с шагом -1.
⍝ Среднее значение (+/X) ÷ ⍴X
То же на Python:
sum(X) / len(X)
Пояснение: ⍴ — это «форма» (размер), а ÷ — математическое деление.
⍝ Решето Эратосфена (~T∊T∘.×T)/T←1↓⍳100
То же на Python:
[n for n in range(2, 101) if not any(n % d == 0 for d in range(2, n))]
Пояснение: APL выражает алгоритм через операции с множествами.
⍝ Генерация последовательности Фибонначи {⍵,+/¯2↑⍵}⍣10 ⊢1 1
Тоже на Python:
a, b = 1, 1 for _ in range(10): a, b = b, a + b
Пояснение: ⍣ — это оператор «повторить», а ¯2↑ берёт последние 2 элемента.
⍝ Проверка на палиндром (⌽≡⊢)'racecar'
То же на Python:
s == s[::-1]
Пояснение: ⌽≡⊢ означает «перевёрнутое равно оригиналу».
⍝ Норма вектора (квадратный корень из суммы квадратов) (+/X*2)*0.5
То же на Python:
math.sqrt(sum(x**2 for x in X))
Пояснение: думаю и так поняли?
⍝ Найти все уникальные элементы, встречающиеся больше 2 раз {(∪⍵)/⍨2<{≢ ⍵}⌸⍵} arr
Тоже на Python:
from collections import Counter arr = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5, 8] result = [x for x, cnt in Counter(arr).items() if cnt > 2]
-
APL:
-
Операторы
∪,⌸,/⍨— это математические абстракции. -
Код отражает логику преобразования данных, а не алгоритм.
-
Пример:
(∪⍵)/⍨2<...читается как «уникальные элементы, где частота >2».
-
-
Python:
-
Требует явного создания объектов (
Counter). -
Использует императивные конструкции (циклы в виде list comprehension).
-
Пример:
[x for x, cnt in ... if cnt>2]— это инструкция по обработке.
-
⍝ Сортировка матрицы по сумме строк M[⍋+/M;] ⍝ +/M — сумма каждой строки (+ свертка по / для строк) ⍝ ⍋ — индексы для сортировки ⍝ M[...;] — индексирование строк в нужном порядке
То же на Python:
import numpy as np sorted_M = M[np.argsort(np.sum(M, axis=1))] # без numpy, может быть так: sorted_M = sorted(M, key=lambda row: sum(row))
-
APL:
-
Описывает действие («отсортируй по суммам») в одном символе
⍋ -
Не требует явного указания осей (
axis=1) или лямбд -
Работает для любого числа измерений без изменения кода
-
-
Python:
-
Требует понимания, что
axis=1— это «по строкам» -
Нужна внешняя функция (
np.argsort) -
Лямбда или
numpy— это уже «как», а не «что»
-
⍝ Найти обратную матрицу ковариации для данных X ⌹ M +.× ⍉M
APL читается как: Обратная матрица (⌹) от произведения X и Xᵀ.
inv_cov = np.linalg.inv(X.T @ X)
Читается как: Вызови функцию inv из модуля linalg для результата умножения X.T на X.
-
APL:
Символы⌹,+.×,⍉— это прямые математические операции, как в учебнике.
Нет упоминания «функций» или «методов» — только глаголы (действия). -
Python:
Даже сnumpyвы вызываете методы (.T,@) и функции (np.linalg.inv), что требует знания API.
Матрицы, векторы и тензоры — родной язык APL
APL изначально заточен под операции с многомерными данными:
-
Матричные преобразования — одна строка вместо циклов
-
Агрегация, свёртки, редукции — без boilerplate-кода
-
Статистика, линейная алгебра — как на бумаге
Пример:
⍝ Умножение матриц в APL: A +.× B
В NumPy это np.dot(A, B), но APL делает это естественнее и без библиотек.
Пример:
⍝ Количество положительных чисел в столбце {+/⍵>0}⍤1⊢mat
⍝ Редукция высших рангов (тензоры) tensor ← 2 3 3⍴⍳18 ⍝ 3D-массив +/tensor ⍝ Сумма по последней оси (внутри матриц) +⌿tensor ⍝ Сумма по первой оси (сложение матриц)
На python можете повторить сами.
Прототипирование быстрее, чем ChatGPT
APL позволяет:
-
Проверить идею за минуты, а не часы
-
Сократить 100 строк Python до 5 символов
-
Думать на уровне математики, а не синтаксиса
⍝ Кластеризация k-средних (упрощённо): k←3 ⋄ centroids←points[?⍨k] ⋄ {⍵⌷⍨⊂⍋↑⍵}⌺k ⊢ points
Попробуйте сделать это в Python так же быстро и непринуждённо алгебраично.
Так почему APL в тени?
Причины заката (1980–1990-е)
-
Проблемы маркетинга
-
Dyalog и IBM продвигали APL только для нишевых экспертов
-
Никакой работы над массовым образованием (язык остался «сектой для избранных»)
-
-
Технические барьеры
-
Символы: До эпохи Unicode ввод
⍋⍎⌈требовал специальных терминалов и прочих извращений -
Нет полноценных open-source сред
-
-
Конкуренция
-
MATLAB (1984): Украл научную нишу с более привычным синтаксисом
-
Python + NumPy (1995): Даже при меньшей эффективности выиграл за счёт сообщества
-
Excel: Подкупил бизнес-пользователей «понятностью»
-
-
Когнитивное сопротивление
-
Миф: «APL — это только для гениев»
-
Реальность: Язык просто требовал переключения мышления с процедурного на математическое
-
APL проиграл не потому, что был «плох», а из-за:
-
Отсутствия экосистемы (не было своего PyPI)
-
Когнитивного искажения («Это для избранных»)
-
Иннертности технологий (Unicode появился лишь в 2000-х)
-
Отсутствия толкового маркетинга и образовательных программ
И всё таки главная проблема в маркетинге
-
Dyalog (главный разработчик) не продвигает APL как современный инструмент (на самом деле уже продвигает, но всё ещё недостаточно)
-
IBM вовсе утратил интерес к APL и закрыл свой проект
-
Образовательных курсов по прежнему не хватает
-
Акцент на языке, как способе записи алгоритмов, утерян
-
Символьный синтаксис отпугивает новичков (хотя он логичнее, чем кажется — вспомните первое впечатление об математике или матанализе)
-
Не используется хайп вокруг «AI/ML», хотя APL идеален для быстрой проверки гипотез
«APL — это «как если бы математика стала языком программирования». Его трагедия в том, что мир выбрал «как если бы бухгалтерия стала языком программирования»»
APL должен быть в mainstream
Этот язык идеален для:
-
Обучения Computer Science (алгоритмы без синтаксического шума)
-
Инженерных расчётов (финансы, биоинформатика, физика)
-
Быстрого прототипирования (превью модели за час, а не за неделю)
APL — это суперсила, которую незаслуженно игнорируют. Если вы устали от многословных языков — попробуйте APL. Возможно, это ваш новый любимый инструмент.
Сейчас понемногу назревает ренесанс APL, благодаря усилиям Dyalog:
-
Бесплатная версия без ограничений, для некоммерческого использования
-
Co-dfns — компилятор подмножества APL для CPU и GPU, частично поддерживается сотрудниками Dyalog
-
Dyalog проводит локальные конференции, которым конечно не хватает размаха
-
Началась поддержка и продвижение opensource инициатив со стороных Dyalog
-
APL Challenge и APL Forge — слегка запоздалый, но всё же отличный способ мотивации. Кстати первый победитель APL Forge, парень написавший «Систему приёма радиолакационных сигналов»
-
В Dyalog есть Adám, который является «Head of Language Design» — он всегда отвечает на stackoverflow на вопросы с тегом «dyalog», даже если вопрос примитивный
-
Появился менеджер пакетов Tatin, начиная с Dyalog APL 19.0 он включён в базовую установку

Где APL и APL-мышление дадут явные преимущества в 2025 году
1. Быстрое прототипирование в AI/ML
Проблема 2025:
-
Время на проверку гипотез в ML сокращается (конкуренция в generative AI, small models)
-
Python-стек (PyTorch + Pandas) требует 100+ строк для базовых экспериментов
Решение APL:
-
Сжатые реализации алгоритмов:
⍝ KNN классификация: для каждой точки берём наиболее частый класс среди k ближайших knn←{k⊢↑⊃⍒↑+/¨(⍵∘.-⍺)*2} -
Преимущество:
-
Проверить идею за 1 час вместо недели на Python
-
Легко адаптировать под новые математические методы
-
Сферы:
-
Биоинформатика: Анализ CRISPR-данных (требует работы с разреженными матрицами)
-
Quant-трейдинг: Быстрая проверка рыночных аномалий
2. Edge Computing и IoT
Проблема 2025:
-
Устройства с ограниченными ресурсами (датчики, дроны) требуют лаконичного кода
-
Rust/Go/Zig хороши для продакшена, но медленны для прототипирования
Решение APL:
-
Крошечные прошивки: APL-код компилируется в нативный код через Co-dfns (аналог Zig, но с математическим синтаксисом)
-
Пример для датчика:
⍝ Фильтрация шумов (фильтр Калмана): ⎕IO←0 ⍝ Индексация с нуля KalmanFilter ← { ⍝ Параметры: F (динамика системы), Q (шум процесса), R (шум измерений) (F Q R) ← ⍺⍺ measurements ← ⍵ ⍝ Инициализация состояния и ковариации x ← measurements[0] ⍝ Начальная оценка состояния P ← Q ⍝ Начальная ковариация ⍝ Вспомогательная функция для обработки шагов Step ← { ⍝ 1. Прогноз x_pred ← F × x P_pred ← (F×P×F) + Q ⍝ 2. Коррекция K ← P_pred ÷ (P_pred + R) ⍝ Коэффициент Калмана x ← x_pred + K × (⍵ - x_pred) P ← (1 - K) × P_pred x ⍝ Возвращаем новое состояние } ⍝ Применяем ко всем измерениям x, Step¨ 1↓measurements }-
В 10 раз меньше кода, чем на С
-
Сферы:
-
Медицинские импланты: Алгоритмы обработки сигналов ЭЭГ/ЭКГ
-
Автономные дроны: Реал-тайм обработка сенсоров
3. Наука о данных (Beyond Pandas)
Проблема 2025:
-
Pandas не справляется с данными >100 ГБ (медленный, требует кластера)
-
Современные аналоги (Polars, Arrow) — всё ещё сложны для ad-hoc анализа
Решение APL:
-
Встроенные оптимизации:
-
Столбцовые операции без копирования данных (как в Apache Arrow, но без накладных расходов)
-
Пример агрегации 1 млрд строк:
stats←{(⍴⍵),⌈/⍵,⌊/⍵,+⌿⍵}-
Выполняется за секунды даже на ноутбуке.
-
-
Сферы:
-
Геномика: Анализ SNP (single nucleotide polymorphisms)
-
Финансы: Обработка тиковых данных без Spark
4. Образование (Computer Science 2.0)
Проблема 2025:
-
Современные курсы учат синтаксису, а не мышлению.
-
Студенты тратят 80% времени на борьбу с типами данных, а не на алгоритмы
Решение APL:
-
Курсы нового типа:
-
Линейная алгебра через
+.×(матричное умножение = 3 символа) -
Теория графов:
⍝ Проверка связности (матрица смежности → компоненты): connected ← {∧/, 1=∨.∧⍨⍣≡⍵} ⍝ Вычисление достижимости (∨.∧⍨⍣≡): ⍝ - ∨.∧ - это операция "логического матричного умножения": ⍝ -- Вместо умножения используется И (∧) ⍝ -- Вместо сложения используется ИЛИ (∨) ⍝ - ⍨ означает применение операции к матрице с самой собой (A ∨.∧ A) ⍝ - ⍣≡ - повторение до достижения фиксированной точки (когда результат перестаёт меняться) ⍝ Проверка условий (1=): ⍝ - Сравнивает каждый элемент результата с 1 ⍝ - Получаем матрицу из 1 (истина) и 0 (ложь) ⍝ Проверка связности (∧/,): ⍝ - , - преобразует матрицу в вектор ⍝ - ∧/ - логическое И по всем элементам ⍝ - Если все элементы равны 1 → граф связный (возвращает 1) ⍝ - Если есть хотя бы один 0 → граф несвязный (возвращает 0)
-
-
Преимущество:
-
Фокус на математической сути, а не языке
-
Плохие инструменты требуют, чтобы вы думали о них. Хорошие — позволяют думать о задаче.
Как попробовать APL?
В данный момент есть 3 основных реализации APL:
-
Dyalog APL (закрытый исходный код, бесплатна для некомерческого использования)
-
GNU APL (opensource, но сильно уступает Dyalog)
-
NARS2000 (представляет больше академический интерес)
Рекомендую начать знакомство с онлайн-интерпретатора Dyalog: https://www.tryapl.com. Там есть и большое количество примеров и краткий туториал.
Дополнительно можно отметить:
-
Экспериментальный компилятор Co-dfns: https://github.com/Co-dfns/Co-dfns
Для более глубоко знакомства с внутрянкой APL можно ознакомиться с:
-
Проект по написанию APL интерпретатора на Haskell: https://scharenbroch.dev/projects/apl-interpreter/
В качестве учебных материалов могу посоветовать:
-
Книгу от Dyalog: https://mastering.dyalog.com/README.html (доступна онлайн)
-
Мини-гайд APL Way: https://xpqz.github.io/learnapl/aplway.html
-
Для поиска примеров: https://aplcart.info
-
Для лучшего понимания самого смысла APL, Notation as a Tool of Thought, от создателя языка: https://www.jsoftware.com/papers/tot.htm
Русскоязычных материалов к сожалению не встречал, но планирую восполнить этот пробел, занявшись переводом основных материалов, а так же по тегу APL на хабре. Чтобы следить за новостями, можете подписаться на мой тг-канал.
P.S. Лично я использую APL для быстрого прототипирования и проверки идей, а потом переношу алгоритм в код для продакшена на Go/Rust/Zig или SQL.
P.P.S. А вы пробовали APL? Какой ваш любимый пример его использования?
ссылка на оригинал статьи https://habr.com/ru/articles/918590/
Добавить комментарий