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

У некоторых революционных языков наблюдалась четкая направленность, дифференцирующая их от большего количества собратьев общего назначения. LISP подходил для обработки списка. SNOBOL использовался для обработки текстовых данных. SIMSCRIPT помогал в моделировании. А язык APL предназначался для математики с акцентом на обработку множества.

APL (от А Programming Language — язык программирования) был разработан в 1957 г. профессором Гарварда Кеннетом Айверсоном (Kenneth Iverson), который в дальнейшем перешел работать в фирму IBM.



Кеннет Айверсон (1920 — 2004) — канадский ученый в области теории вычислительных систем, создатель языка программирования APL

Создание APL


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

Айверсон был нанят компанией IBM в 1960 году, чтобы работать с Адином Фалькоффом над его нотациями. Первая модифицированная версия языка с названием System/360 была реализована ими совместно с группой разработчиков IBM в 1966 г. Для этого использовали вычислительную систему IBM/360. Проект принес популярность языку программирования APL. После чего появились разные подмножества языка, как например APL/700.



Ранние разработчики языка APL, слева направо: Дик Лэтвелл, Кеннет Айверсон, Роджер Мур, Адин Фалькофф, Фил Абрамс, Ларри Брид

По этой ссылке можно скачать полную версию исходного кода для версии 1969-1972 «XM6» языка APL для System/360:
http://www.computerhistory.org/atchm/apl360-software-license-agreement/
Текстовый файл содержит 37,567 линий, который включают кодекс, макрос и глобальные определения. Чтобы получить доступ к этому материалу, нужно согласиться на условия лицензии, разрешающие только некоммерческое использование и не дающие право лицензировать его для третьих лиц, публикуя копии в сети.

Символы языка APL отличаются от других языков, они ближе к стандартной математике, чем к программированию. Кроме того, символы имеют два смысла — унарную и бинарную функции, которые могут быть непохожи. Например, символ ?, не /. Чтобы поддержать нетрадиционные символы, APL\360 использовал изготовленную на заказ клавиатуру со специальными символами в верхнем регистре.



Специальная клавиатура языка APL

Несмотря на это, в языке используются особо специфические знаки, которых нет на клавиатуре. Например, grade up изображают знаком ?.

Для печати программ Айверсон и Фолкофф убедили IBM спроектировать специальный «шар» для их 1050 и 2741 терминалов, использующих механизм пишущей машинки IBM Selectric.



«Шар»

Образец кода APL:

[6]    L<(L?':')vL<,L       ? drop To:
 [7]    L


После этого программы могли печатать и распечатывать. Пример печатной версии программы из Языкового руководства языка APL, которое вычисляет математический детерминант матрицы:


Книга Айверсона “Язык программирования” использует графическую нотацию, которую было бы сложно использовать непосредственно в качестве языка программирования. Автор считает его расширением матричной алгебры и пользуется общими математическими условными обозначениями.



Пример программы для сортировки чисел

Особенности APL


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

Независимо от ОС и архитектуры компьютера, язык APL ориентирован на решение проблемы и описание алгоритма. Он направлен на работу с массивами.

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

Выражения в языке APL подсчитывается справа налево и нет никакой иерархии предшествования функции. Например, печать выражения 2?4+3 заставляет компьютер мгновенно печатать получившееся значение 14.

Язык APL обеспечивает программиста большим набором разных функций. Они используются в соответствии с простым правилом приоритета: правый аргумент бинарной функции целиком выражен справа от нее. Возможно контролировать приоритет в ином виде используя скобки. Хотя чаще всего это не требуется. Такое правило делает анализ иерархической структуры выражений во многом проще. Общее правило состоит в том, что правый аргумент любой функции — это значение выражения с правой стороны от него.

В языке присутствуют скаляры (примитивные типы данных). Логические значения моделируются числами 0 для false и 1 для true. К слову, данный прием был впервые применен именно в APL. Массивы объединяют все структуры данных: одномерные векторы, двухмерные матрицы и многомерные мультитаблицы. Изначальная ориентация функций направлена на работу с массивами, но может применяться к скалярам. Благодаря развитой системы операций над массивами удается избегать применения явных команд управления потоком выполнения программы.

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

У APL более многомерная структура, которая автоматически производит расчет выражения, скаляры могут быть свободно смешаны. Например < 2 + 1 2 3 создает вектор 1 2 3, добавляет к нему скалярную величину 2 и создает переменную A, чтобы держать вектор, значение которого 3 4 5.

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

У языка APL есть богатый набор встроенных функций, которые воздействуют на скаляры, векторы, множества, более многомерные объекты и их комбинации. Например, выражение суммирует числа в вектор А +/A где / — оператор “сокращения”, заставляющий функцию слева быть последовательно примененной ко всем элементам операнда справа. Выражение для вычисления среднего числа А также использует примитивную функцию ?, чтобы определить сколько элементов находятся в A: (+/A) ? ?А.





Примеры таблиц с 1970 из “Руководства Пользователя APL\360” (таблица 1, 2 и 3)

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

(~T?T ?.?T)/T<1 v? R

Определение частного выражения
Частное выражение Значение, если R равняется 6
?R 1 2 3 4 5 6
T<1v 2 3 4 5 6
T?.?T 4 6 8 10 12
6 9 12 15 18
8 12 16 20 24
10 15 20 25 30
12 18 24 30 36
T? 0 0 1 0 1
~ 1 1 0 1 0
( )/T 2 3 5


В программе нет циклов. Операторы языка APL могут применять легкие способы ко всем видам вычислений, где обычно потребовались бы циклы. Например, выражение, определяющее число элементов вектора X, которые больше 100 будет +/X>100.
Но конечно, условные операторы и циклы иногда необходимы.

Похвала и критика языка APL


Как уже упоминалось, APL не был первоначально разработан как язык программирования. Вот, что сказал на эту тему Айверсон:

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

У языка APL есть преданные поклонники. Как например Алан Перлис (первый получатель Премии Тьюринга ACM, в 1966 г.):

Радует глаз изобретательное и красивое взаимодействие операции и контроля, которое в других языках программирования заметных только на некоторых страницах текста. Каждый начинает ценить появление и значение стиля. Многие получают свободу самовыражения в вольностях языка APL. Я раньше описывал Pascal, как «фашистский язык программирования», потому что он властный, четкий и имеющий рамки… Так вот, если Pascal фашистский, то язык APL — анархистский.

Одним из существенных минусах выделяют сложность расшифровки языка APL. Есть популярная шутка о том, что APL — это язык только для записи, потому что даже его автор с трудом может разобрать и понять код. Ниже представлены примеры двух различных «острот» от APL, которые реализуют версии Игры «Жизнь» — клеточного автомата, придуманного английским математиком Джоном Конвеем (1970 г.).

life<{^1 ??.?3 4=+/,?1 0 1?.??1 0 1?.???}



Шифр не для слабонервных

Голландский ученый и программист Эдсгер Дейкстра сказал:

Язык APL — ошибка, стремящаяся к совершенству. Это язык будущего для программных методов прошлого.



Популярность языка APL начала снижаться с середины 80-х, когда начали активно развиваться другие системы математических вычислений. Они оказались более интуитивными и смогли лучше удовлетворить потребности пользователей. Тем ни менее, язык APL и языки, которые появились на его основе (такие как APL2 и J), все еще используются в программировании. В наше время APL применяется в финансовых и математических приложениях. Он поддерживается практически на всех аппаратных платформах. По данному языку каждый год проходят конференции в рамках Association for Computer Machinery.


??По традиции, немного рекламы в подвале, где она никому не помешает. Напоминаем, что в связи с тем, что общая емкость сети нидерландского дата-центра, в котором мы предоставляем услуги, достигла значения 5 Тбит / с (58 точек присутствия, включения в 36 точек обмена, более, чем в 20 странах и 4213 пиринговых включений), мы предлагаем выделенные серверы в аренду по невероятно низким ценам, до конца месяца!

Комментарии (15)


  1. NeoCode
    16.01.2016 21:22
    -1

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


    1. gbg
      16.01.2016 22:18
      +3

      Согласно Закону Линуса, в любом случае, все эти символы пошли бы на создание прикольных смайликов image


    1. ivlis
      18.01.2016 09:40

      Совершенно согласен. После Mathematica, где у каждого символа 4 шрифта, греческие буквы и ещё куча спецсимволов программировать только в ASCII невероятно скучно.


  1. bachin
    16.01.2016 22:22
    +11

    Ох. В программе нет петель — это меня убило.
    Вообще-то это слово в словаре программиста всегда было «цикл», а не «петля».
    Так что если пользуетесь подстрочным автоматическим переводом — ну не ленитесь же вычитывать!
    Я могу еще смириться с «Текстовый файл содержит 37,567 линий» (хотя всё-таки обычно считают в строках)
    (Пойду напишу программу с петлями)


    1. Elena_sm
      16.01.2016 23:14
      -7

      Прошу прощения за погрешности в переводе. Но смею заверить — это не «подстрочный автоматический перевод», а сугубо авторский. Просто автор не математик и не программист…


      1. Scratch
        17.01.2016 00:06
        +15

        Жаль, что статьи на хабр стали писать «не математики и не программисты». Обычно с автором даже перевода есть что обсудить в комментариях. А с вами о чем говорить?


        1. Elena_sm
          17.01.2016 00:44
          -7

          А разве статьи должны писать исключительно программисты и математики? Да и к счастью, я не одна на хабре могу комментировать...:)


          1. khim
            17.01.2016 01:24
            +6

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

            На Хабре бывает интересно поспорить с автором перевода. Обычно он не во всём с автором согласен (всё-таки люди разные, на 100% мнения редко совпадают), но, так как статья ему очевидна близка (а иначе зачем бы он её переводил?), то расхождений в типичном случае немного.

            А о чём говорить с человеком, который о теме статьи ничего не знает?


          1. random1st
            17.01.2016 12:12
            +1

            Ну по-крайней мере, прежде чем публиковать подобный материал, дайте прочитать кому-нибудь в теме. Или Вы тематику статей с потолка берете?


      1. pehat
        17.01.2016 12:00
        +2

        Как живой человек, обремененный интеллектом, может перевести в статье про язык программирования слово «code» как «кодекс»? Я в это отказываюсь верить.


        1. kstep
          17.01.2016 16:40
          +3

          Чтобы переводчику стало понятнее, речь идёт про это предложение:

          Текстовый файл содержит 37,567 линий, который включают кодекс, макрос и глобальные определения.


          линии = lines = строки (устоявшийся технический термин и его перевод)
          макрос — думаю, что всё же максросы (macro ед.ч., macros мн.ч., русская калька «макрос» в роли единственного числа взята из необычности звучания слова «макро» в русском, т.к. это больше похоже на приставку, чем на полноценное слово)
          кодекс = code = код (в смысле «код программы», а не в смысле «свод законов», это не юриспруденция)

          Смею предположить, что автор перевода имеет юридическое образование.
          Советую в будущем консультироваться с людьми, компетентными в той области, из которой взят текст для перевода.
          И пожалуйста, ради Б-га, не беритесь за перевод инструкции к медицинской технике! Пожалейте пациентов!


          1. pehat
            17.01.2016 19:03
            +1

            Смею предположить, что автор перевода имеет юридическое образование.

            Классика
            Текст представляет собой имитацию машинного перевода фрагмента хелпа Win95 с медицинским, коммерческим и юридическим словарями, выполненную студентами Бауманки по заказу «злобных конкурентов».


  1. kstep
    16.01.2016 22:27
    +9

    В программе нет петель.

    Я прозреваю, что здесь в оригинале был «loop», то есть цикл. Цикл, Карл!

    это язык только одного написания

    Write-only language, «язык только для записи».

    Ужасный перевод.


    1. Elena_sm
      16.01.2016 23:15
      -2

      Спасибо, исправила.


  1. AndersonDunai
    16.01.2016 22:54
    +7

    Кошмар.