АПЛ означает A Programming Language (язык программирования), и несмотря на скромную аббревиатуру, это один из самых удивительных языков программирования, о котором вы, вероятно, никогда не слышали. Созданный Кеннетом Иверсоном в 1960-х годах, АПЛ остаётся одним из старейших языков программирования, всё ещё активно используемых сегодня, наряду с FORTRAN, Lisp и COBOL.

Но вот что делает АПЛ особенным: он не просто позволяет писать код по-другому — он заставляет вас думать по-другому о проблемах. Если вы потратили годы на борьбу с циклами, условными операторами и императивной логикой, АПЛ покажется вам открытием параллельного измерения, где операции с массивами текут как вода с горы.

Почему вам стоит обратить внимание на АПЛ в 2026 году?

Позвольте мне быть кратким. АПЛ не заменит Python для веб-разработки или Rust для системного программирования. Но он превосходно справляется с чем-то всё более важным: быстрой обработкой и анализом данных. Концепции, которые требуют нескольких строк кода на других языках, могут быть сведены к нескольким символам в АПЛ.

Рассмотрим пример из реальной жизни: АПЛ используется при профилировании ДНК, где код нужно писать быстро, не обязательно заботясь о его повторном использовании. Он также незаменим для финансового моделирования, научных вычислений и любой области, где вы работаете с массивами данных.

Секрет в специальном наборе символов АПЛ, насчитывающем около 200 буквенных символов и знаков. Каждый символ выполняет определённую задачу, делая программы чрезвычайно лаконичными — не за счёт «гольфа» кода, а за счёт фундаментального дизайна языка.

Основы: мышление справа налево

Здесь большинство разработчиков сталкиваются с первым ментальным препятствием при работе с АПЛ. АПЛ вычисляет выражения справа налево, без правил приоритета операторов, подобных PEMDAS.

Давайте рассмотрим пример:

5 + 4 × 2 ÷ 5 - 3

На большинстве языков это вычислялось бы так: 5 + ((4 × 2) ÷ (5 - 3)) = 5 + (8 ÷ 2) = 5 + 4 = 9 Но подождите — именно это происходит и в АПЛ! Не из-за приоритета операторов, а потому что АПЛ вычисляет строго справа налево: 5 + (4 × (2 ÷ (5 - 3))) = 9

Это другая ментальная модель, которая приводит к тому же результату здесь, но последствия глубоки, когда вы начинаете строить сложные выражения.

Монадические и диадические функции: двойственность

Вот элегантная концепция: в АПЛ у каждого оператора есть две формы — монадическая (один аргумент) и диадическая (два аргумента).

Возьмём оператор умножения ×:

  • Диадическая (два аргумента): 1 2 3 4 × 5 даёт 5 10 15 20 — простое умножение
  • Монадическая (один аргумент): × ¯4 ¯2 0 2 4 даёт ¯1 ¯1 0 1 1 — возвращает знак каждого числа

Один и тот же символ, совершенно разное поведение. Эта двойственность означает меньшую когнитивную нагрузку при запоминании отдельных имён функций. Элегантно, правда?

Ваши первые шаги с АПЛ

Настройка среды

Самый простой способ начать — через TryAPL, онлайн-интерпретатор, не требующий установки. Просто зайдите на tryapl.org, и вы готовы экспериментировать. Разместите TryAPL на половине экрана и следуйте этому руководству на другой половине.

Для серьёзной работы скачайте Dyalog APL, который предлагает бесплатную версию. Он доступен для Windows, macOS и Linux.

Основные операции с массивами

Давайте начнём с простого. В АПЛ всё является массивом:

⍝ Комментарии в АПЛ начинаются с ⍝
2 3e7 ¯4 50.3

Это создаёт список чисел (обратите внимание, что ¯ представляет отрицательный знак).

Теперь мощь АПЛ проявляется, когда вы применяете операции к этим массивам:

1 2 3 4 × 5
⍝ Результат: 5 10 15 20

Вы только что умножили весь массив на скаляр с помощью одного выражения. Никаких циклов, никаких лямбда-функций, никаких операций map — только оператор и данные.

Хотите работать с несколькими массивами?

1 2 3 4 × 5 6 7 8
⍝ Результат: 5 12 21 32

Поэлементное умножение происходит автоматически.

Работа с матрицами: оператор изменения формы

Оператор изменения формы делает массивы интересными:

4 3  12

Это создаёт матрицу 4×3, используя числа от 1 до 12. Оператор (йота) генерирует вектор натуральных чисел.

Чтобы увидеть размеры любого массива, используйте оператор изменения формы в монадической форме:

 (4 3  12)
⍝ Результат: 4 3

Практический пример: вычисление статистических показателей

Позвольте показать вам, почему программисты увлекаются АПЛ. Вот реальная задача: вычислить среднее значение (среднее арифметическое) списка чисел.

⍝ Определяем наши данные
A  10 60 55 23
⍝ Сумма с использованием сокращения (/ — сокращение)
+/A
⍝ Результат: 148
⍝ Длина
A
⍝ Результат: 4
⍝ Вычисляем среднее
(+/A) ÷ (A)
⍝ Результат: 37

Теперь создадим переиспользуемую функцию:

mean  {(+/)÷⍴}
mean A
⍝ Результат: 37

Вот и всё. Полное определение функции. Символ представляет правый аргумент (вход). Нет def, нет return, нет деклараций типов. Последнее выражение автоматически возвращается.

Сравните это с Python:

def mean(arr):
    return sum(arr) / len(arr)
mean([10, 60, 55, 23])  # 37

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

Операции сравнения: булева логика

АПЛ естественным образом выполняет сравнения и создаёт булевы массивы:

10 20 30 = 10 20 99
⍝ Результат: 1 1 0
⍝ (1 означает «истина», 0 означает «ложь»)
10 20 30 < 10 20 99
⍝ Результат: 0 0 1

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

Понимание общей картины

Вот диаграмма, показывающая, как модель вычисления АПЛ отличается от традиционных императивных языков:

graph LR A["Выражение: 5 + 4 × 2 ÷ 5 - 3"] --> B["Вычисление справа налево"] B --> C["Сначала: 5 - 3 = 2"] C --> D["Затем: 2 ÷ 2 = 1"] D --> E["Затем: 4 × 1 = 4"] E --> F["Наконец: 5 + 4 = 9"] style A fill:#e1f5ff style B fill:#fff3e0 style C fill:#f3e5f5 style D fill:#e8f5e9 style E fill:#fce4ec style F fill:#fff9c4

Традиционные языки используют приоритет операторов для определения порядка. АПЛ просто читает справа налево, что означает, что вам не нужно запоминать правила приоритета — вы просто читаете выражение, как будто сканируете временную шкалу в обратном направлении.

Присвоение значений и область видимости

Присвоение значений происходит просто:

⍝ Простое присвоение
X  42
⍝ Присвоение создаёт переменную в текущей области видимости
profit  revenue - expenses
⍝ Вы можете присвоить результат любого выражения
average_sales  (+/sales) ÷ sales

Имена переменных в АПЛ следуют стандартным соглашениям: они могут содержать буквы и цифры, но должны начинаться с буквы.

Мощность сокращения и сканирования

Одна из самых мощных функций АПЛ — оператор сокращения /. Он применяет оператор между последовательными элементами массива:

⍝ Суммируем все элементы
+/10 20 30 40