Pull to refresh

Язык программирования J. Взгляд любителя. Часть 1. Введение

Reading time 6 min
Views 21K
Дейкстра: А как вы запишите более сложное выражение? Например, сумму всех элементов матрицы, которые равны сумме индексов соответствующих строк и столбцов.
Айверсон: + + / (M = ?1 ^(o)+ ?1)M//
(Кеннет Айверсон — создатель языков APL и J)


1. Быстрый старт



Перед тем как APL получил свое название, он назывался «нотация Айверсона». Однако Кен считал, что название должно звучать просто как «Нотация». И в самом деле, мы же не говорим «трава Бога», мы говорим просто «трава».
Paul Berry


Отличительными особенностями языка программирования J можно назвать:
  • векторная арифметика
  • предельная лаконичность
  • обширная стандартная библиотека, предназначенная в частности для статистической обработки данных
  • наличие в стандартной библиотеке функций для рисования 2d графиков и 3d поверхностей, а также примитивов для создания графического интерфейса
  • подробнейшая и разнообразнейшая документация и примеры

Можно сказать, что J находится в той же нише, что и Matlab и R. Но есть одно «но» — синтаксис языка.
Приведем один из самых распространенных учебных примеров всех введений и туториалов J:

	mean =: +/%#

В данном примере определяется новая функция (на языке J это называется «глаголом») «mean», которая рассчитывает среднее значение в массиве чисел.

Само же выражение «+/%#» дословно означает следующую последовательность действий:
  • Взять сумму всех элементов массива (за это отвечает «+/»).
  • Вычислить длину массива (выражение «#»).
  • Разделить первое на второе («%»на языке J означает деление).


Вызывать данный глагол можно следующим образом:

	mean 1 2 3 4
2.5

где 2.5 – результат вычисления среднего на массиве целых чисел от 1 до 4. Обратим внимание, что в примерах с большим отступом указывается выражение, с меньшим — результат вычисления.

Добавим красок к нашему описанию языка J. Вот, к примеру, выражение, реализующее быструю сортировку (сортировку Хоара):

	quicksort=: (($:@(<#[) , (=#[) , $:@(>#[)) ({~ ?@#)) ^: (1<#)
	quicksort 3 4 1 2 4.1 _0.1
_0.1 1 2 3 4 4.1


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

Одной из самых сильных сторон J является его графическая подсистема. С примерами можно ознакомиться на http://www.jsoftware.com/jwiki/Studio/Gallery

Официальный сайт разработчиков языка и самого популярного (а, по совместительству, и единственного) транслятора языка J — http://www.jsoftware.com. Ключевые личности, принявшие участие в создании языка это: Кеннет Айверсон (Kenneth Iverson, скончался в 2004 году) и Роджер Хуэй (Roger Hui).

Справедливости ради необходимо упомянуть jsj — ограниченный в возможностях онлайн-интерпретатор J на Javascript. А также J&+ — подмножество языка J

Транслятор J является переносимым как между операционными системами, так и между архитектурами процессоров. Так, на официальном сайте доступны версии для Linux (32 и 64 бита), Windows (32 и 64 бита), Mac (32 бита и бета-версию для 64 бит) и PocketPC.

В данный момент предоставляется как 6я, так и 7я версии. В более стабильной 6й версии GUI для Linux сделан с помощью Java. В 7й версии графический интерфейс является полностью кроссплатформенным и сделан на основе gtk. Впрочем, эта версия является еще не вполне user-friendly и в бете 8й версии интерфейс вновь переделан уже на Qt

Для разработки на J можно использовать как «родную» среду разработки, так и Emacs (режим для редактирования исходных кодов на J находится по адресу http://j-mode.sourceforge.net).

До недавних пор J распространялся как freeware приложение, а исходные коды распространялись по коммерческой лицензии. Сейчас исходные коды 7й версии открыты под лицензией GPL3 (см. http://www.jsoftware.com/source.htm). Кроме того не существует лицензионных ограничений на собственные реализации трансляторов J.

2. Прошлое и настоящее


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


Прямым предком J является язык APL (APL расшифровывается как «A Programming Language»). Более того, автором и одного и другого является один и тот же человек – Кеннет Айверсон (истории из жизни Кеннета (т.н. «кенекдоты») можно прочитать по адресу http://keiapl.info/anec/. Эпиграфы к настоящей статье взяты именно оттуда). Интересной особенностью APL было использование в языке специальных символов, отсутствующих на привычных нам клавиатурах. Выпускались и специальные APL-совместимые клавиатуры. И, несмотря на почтенный возраст (год открытия APL — 1964 г.), этот язык развивается и используется до сих пор.

Временем же появления языка J считается 1990 год. Одним из основных отличий нового языка от APL было использование в именовании стандартных конструкций только ASCII символов.

Одну из ранних (1994 год) реализаций интерпретатора языка можно найти на http://keiapl.org/archive/j7.tar.gz. До открытия исходных кодов современной 7й версии языка это была последняя доступная версия исходных кодов языка J.

Транслятор J написан на языке Си с повсеместным («агрессивным» можно даже сказать) использованием препроцессора. И, как говорят сами авторы языка, интерпретатор J написан на J. А точнее — на том подмножестве языка J, которое можно получить силами препроцессора Си. В связи с этим для посторонних людей исходный код J выглядят практически нечитаемым. Кроме того, исходные коды «удачно» декомпозированы на отдельные файлы с такими говорящими названиями как a.c, b.c и т.д.

Современные версии языка J меняются достаточно медленно и изменения в последнее время не выглядят революционными. Хотя последняя версия 5ой ветки и нынешняя стабильная версия 6.02 являются не полностью совместимыми. Одним из интересных нововведений в версии 6.02 можно назвать выражение «M.», которое добавляет автоматическую мемоизацию указанной функции.

В данный момент идет активное развитие следующей версии интерпретатора J-7.0. В этой версии нет концептуальных изменений языка. Однако достаточно значительные изменения затронули инфраструктуру транслятора. Отметим некоторые из них:
  • GUI, как уже упоминалось, теперь и для Windows и для Linux написан с помощью библиотеки Gtk.
  • Теперь у J есть собственный пакетный менеджер. Например, графическая оболочка интерпретатора в стандартной поставке отсутствует и устанавливается с помощью пакетного менеджера.
  • В стандартной поставке появился написанный на J HTTP сервер.


Необходимо отметить, что, несмотря на то, что хотя уже в момент написания статьи бета-версия 7ой ветки и была объявлена стабильной, автором рекомендуется использовать 6ю ветку — в 7ой до сих пор присутствуют обидные баги и регрессии (особенно в части примеров и интерактивной документации).

3. Родственники


Кроме упомянутого ранее APL к ближайшим родственникам J можно отнести языки за авторством Arthur Whitney:
  • A+ (http://www.aplusdev.org). Последние несколько лет проект практически не развивается.
  • K (http://kx.com). Активно развивающийся и используемый в финансовых приложениях язык.


4. Литература


Документация доступна как из офлайн дистрибутива, так и по адресу http://jsoftware.com/help/index.htm:
  • Primer(Pri). Книга Эрика Айверсона (сына Кеннета Айверсона), в которой с помощью небольших примеров постепенно раскрываются возможности языка.
  • J for C Programmers(JfC). В книге излагаются все основные и интересные возможности языка. Примеры в первых главах даются с исходниками на Си. Одна из обязательных для чтения книг.
  • Learning J(LJ). Хорошее введение в язык.
  • Phrases(Phr). Сборник фраз-рецептов на самые разные темы за авторством Кеннета Айверсона, Роджера Хуэя и других.
  • Dictionary(Dic). Небольшое последовательное введение в язык J. Более формальное, чем LJ, но и более сжатое. Переведено на русский язык Константином Метловым. (http://www.fti.dn.ua/~metlov/dictionary/contents.htm).
  • Vocabulary(Voc). Словарь J. Описание стандартных функций языка с примерами и комментариями. Переведено на русский язык Константином Метловым. (http://www.fti.dn.ua/~metlov/dictionary/vocabul.htm)


На странице http://www.jsoftware.com/jwiki/Books находится несколько книг, посвященных языку J. Например:
  • Exploring Math. Автор Кеннет Айверсон. 135 стр. Введение в математику и J. Рекомендуется после ознакомления с основами языка.
  • Concrete Math Companion. Автор Кеннет Айверсон. 98 стр. В книге рассматриваются примеры, упорядоченные по главам в соответствии с книгой «Конкретная математика» Кнута, Грэма и Поташника.


Кроме того в стандартной поставке есть т.н. лабораторные и демо-примеры — аннотированные примеры основных возможностей языка и его библиотек. Среди них есть, например, лабораторная по написанию на J операторов нечеткой логики, несколько вводных курсов в язык, игра «жизнь» и многое другое.

5. Место в IT-сфере


Задавайте вопрос: «Кому это выгодно?»
Кеннет Айверсон


На момент написания статьи J занимает почетное 5 место в рейтинге языков проекта Эйлер http://projecteuler.net/languages.

J используется и в самых серьезных софтверных компаниях. Список можно получить на сайте jsoftware.com. Назовем лишь некоторые из них: Hewlett Packard, Intel, Korea Telecom, Microsoft, Novell, SAP.

Дополнительную информацию и помощь можно получить на:


На русском языке информации значительно меньше, однако кое-что все же есть:


Следующая статья цикла Язык программирования J. Взгляд любителя. Часть 2. Тацитное программирование
Tags:
Hubs:
+27
Comments 10
Comments Comments 10

Articles