J (язык программирования)

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску
J
Семантика функциональный
Класс языка язык программирования, язык функционального программирования, динамический язык программирования, function-level language[d], векторный язык программирования[d], tacit programming language[d], объектно-ориентированный язык программирования, мультипарадигмальный язык программирования и интерпретируемый язык программирования
Тип исполнения интерпретатор
Появился в 1990
Автор Кеннет Айверсон и Роджер Хуэй
Разработчик Кеннет Айверсон[1] и Роджер Хаи[d][1]
Расширение файлов .ijs
Выпуск J903 (16 декабря 2021; 2 года назад (2021-12-16))
Тестовая версия J904 (декабрь 2021; 2 года назад (2021-12))
Система типов динамическая
Испытал влияние АПЛ, FP, FL
Повлиял на K
Лицензия GNU GPL
Сайт jsoftware.com
Не путать с J++ или J#.

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

Разработан в начале 1990-х создателем APL Кеннетом Айверсоном и Роджером Хуэем (англ. Roger Hui) с применением идей из языков комбинаторного программирования FP[en] и FL[en] Джона Бэкуса. Основные его черты — это ориентированность на MIMD-инструкции, функциональный подход (переменные исключены вообще, вместо них действует механизм переименований и комбинаторы).

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

Единственный из разработанных полноценный интерпретатор J был в период 1994—2010 годов несвободным, 6 марта 2011 года исходные коды 7-й версии были открыты под лицензией GPL3[2].

Понятия языка[править | править код]

Для описания элементов программирования, J использует терминологию грамматики естественных языков, например, термин «глагол» используется в смысле, соответствующем «функции» или «оператору» в Си.

Соответствие терминов языка J терминам языка Си:

Термин языка J Термин языка C
Глагол Функция или оператор
Имя существительное Объект
Глагол-связка Присваивание
Знак препинания Разделитель
Наречие (#define macro)
Союз (#define macro)

У каждого слова в предложении языка J есть часть речи, аналог типа в языке C. Это глагол, имя существительное, глагол-связка, наречие, союз или знак препинания. Главные части речи это существительное, глагол, наречие и союз. Все имена, которые будет создавать программист и все имена, определённые в языке J (за исключением глаголов-связок (=. и =:) и знаков препинания), будут относиться к одной из главных частей речи. Сущность (англ. entity) это объект, тип которого — одна из главных частей речи. Другими словами, сущность это наречие, существительное глагол или союз. Сущности может быть дано имя, но большинство из них имени не имеют и возникают посреди выполнения выражения и исчезают сразу после, в точности как промежуточные результаты вычисления выражения на языке С.

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

Знаки препинания в языке J состоят из символов () ' и символа конца строки, а также ограничителя NB. и нескольких специальных слов, таких как if. и case. Больше символов пунктуации в языке J нет. Даже символы [ ] , . " ; { } являются глаголами, а скобки [ ] и { } независимы и используются по одной, а не парами.

Синтаксис[править | править код]

Исполняемой единицей языка J является предложение, которое соответствует выражению в языке C. Ограничителями предложения языка J являются символ конца строки (LF) и управляющие слова, такие как if. Предложение включает все символы между разделителями, а поскольку символ LF является разделителем, предложения J должны вписываться в одну строку. Способов разнести предложение на две строки нет.

Все комментарии начинаются с NB. и заканчиваются концом строки. Комментарий в процессе выполнения предложения игнорируется. В языке J выделяются такие типы лексем:

  1. Существительное
  2. Глагол
  3. Наречие
  4. Союз

Отношения между лексемами и частями речи иллюстрирует диаграмма на рис. — лексемы языка J и части речи.

Слова в предложении языка J делятся на идентификаторы, примитивы, числа, знаки пунктуации и символьные константы. Разделяют слова пробелы и символ табуляции. У символов «.» и «: » особое значение.

Имена (идентификаторы) в языке J подобны таковым в языке C. Они начинаются с буквы латинского алфавита, допускают нижнее подчёркивание, различают регистр и состоят только из алфавитно-цифровых символов и символа нижнего подчёркивания. Имена, заканчивающиеся на символ подчеркивания и содержащие в себе два символа подчёркивания обрабатываются особым образом, это связано с понятием локали.

Графические символы ASCII (например «+») называются примитивами или операторами.

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

  + +. +: { {: {:: i. i: for. select. case. end.

Порядок вычисления[править | править код]

Таблицы приоритетов действий в языке J нет. Все глаголы языка J имеют одинаковый приоритет и правую ассоциативность. Для определения порядка можно использовать скобки. Круглые скобки в языке J понимаются в точности как в математике.

В случае, когда у глагола слева есть существительное, он вычисляется как диадный. Если его нет, глагол вычисляется как монадный с одним лишь правым операндом. Нужно знать часть речи символа, чтобы понять порядок вычисления, например в предложении

  result =. name1 verb2 5

нужно знать, является ли name1 глаголом или существительным. В случае, когда он глагол, порядок вычисления name1(verb2(5)), а если он существительное, verb2 — диадный и результат (name1 verb2 5).

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

Существительные со скобками[править | править код]

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

Грамматика[править | править код]

J позволяет построение нескольких синтаксических деревьев для одной и той же строки кода. То есть описания языка не полны, отсутствует исчерпывающая спецификация. Язык J контекстно-зависимый, и стандартные средства для его описания (например, грамматика в форме Бэкуса-Науэра) не подходят. Понятие абстрактного синтаксического дерева даже теряет своё значение, так как оно корректно лишь в области контекстно-свободных языков.

Примечания[править | править код]

Литература[править | править код]

  • Holt, A. Network Performance Analysis: Using the J Programming Language. — Springer, 2007. — 232 p. — ISBN 9781846288234.
  • Norman D. Thomson. J, the Natural Language for Analytic Computing. — Research Studies Press, 2001. — 310 с. — ISBN 978-0-86380-275-1.

Ссылки[править | править код]