Дейкстра: А как вы запишите более сложное выражение? Например, сумму всех элементов матрицы, которые равны сумме индексов соответствующих строк и столбцов.
Айверсон: + + / (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).
Справедливости ради необходимо упомянуть github.com/doublec/jsj
ограниченный в возможностях онлайн-интерпретатор J на Javascript.
А также J&+ www.fti.dn.ua/~metlov/jplus/ подмоножество языка 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.
Дополнительную информацию и помощь можно получить на:
- http://www.jsoftware.com/jwiki/System/Forums — список почтовых рассылок J.
- http://www.jsoftware.com/jwiki/FrontPage — официальная вики языка
На русском языке информации значительно меньше, однако кое-что все же есть:
- В первую очередь это, упоминавшийся ранее перевод словаря от К.Метлова.
- На форуме Дальневосточного федерального университета было опубликовано введение в язык J с примерами. Ссылка на web-archive форума http://web.archive.org/web/20110223064025/http://www.dvgu.ru/forum/thread.php?threadid=2033
- На форуме любителей еще одного замечательного языка Forth есть краткое введение в K с примерами http://fforum.winglion.ru/viewtopic.php?f=4&t=320
- Кроме того, вопросы, возникающие при изучении J, можно задавать на http://ru_declarative.livejournal.com/ и http://rsdn.ru/forum/decl/.
Продолжение следует…
Автор: basp