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

редактировать
J
J (язык программирования) icon.png
Разработано Кеннет Э. Айверсон, Роджер Хуэй
Разработчик JSoftware
Впервые появился 1990 ; 31 год назад ( 1990)
Стабильный выпуск J901 / 15 декабря 2019 г. ; 22 месяца назад ( 2019-12-15)
Печатная дисциплина динамичный
Операционные системы Кроссплатформенность : Windows, Linux, macOS, Android, iOS, Raspberry Pi
Лицензия GPLv3
Веб-сайт www.jsoftware.com
Основные реализации
J
Под влиянием
APL
Под влиянием
NumPy, Суперколлайдер

Язык программирования J, разработанный в начале 1990-х годов Кеннетом Э. Айверсоном и Роджером Хи, представляет собой язык программирования массивов, основанный в основном на APL (также разработанном Иверсоном).

Чтобы избежать повторения проблемы со специальными символами APL, J использует только базовый набор символов ASCII, прибегая к использованию точки и двоеточия в качестве перегибов для формирования коротких слов, подобных орграфам. Большинство таких первичных (или примитивных) J-слов служат математическими символами, при этом точка или двоеточие расширяют значение основных доступных символов. Кроме того, многие символы, которые в других языках часто должны быть объединены в пары (например, [] {} "" ``или lt;gt;), рассматриваются J как отдельные слова или, при склонении, как односимвольные корни многосимвольных слов.

J - очень сжатый язык программирования массивов, который больше всего подходит для математического и статистического программирования, особенно при выполнении операций с матрицами. Он также использовался в экстремальном программировании и анализе производительности сети.

Подобно языкам Джона Бэкуса FP и FL, J поддерживает программирование на уровне функций с помощью своих функций неявного программирования.

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

С марта 2011 года J является бесплатным программным обеспечением с открытым исходным кодом под Стандартной общественной лицензией GNU версии 3 (GPLv3). Можно также приобрести источник по договорной лицензии.

СОДЕРЖАНИЕ
  • 1 Примеры
  • 2 глагола и модификаторы
  • 3 Типы и структуры данных
  • 4 Отладка
  • 5 Документация
  • 6 Управляющие структуры
  • 7 См. Также
  • 8 ссылки
  • 9 Внешние ссылки
Примеры

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

"Hello, World!" программа в J

 'Hello, world!'

Эта реализация hello world отражает традиционное использование J - программы вводятся в сеанс интерпретатора J, и отображаются результаты выражений. Также возможно организовать выполнение J-скриптов как автономных программ. Вот как это может выглядеть в системе Unix :

 #!/bin/jc echo 'Hello, world!' exit ''

Исторически сложилось так, что APL использовалось /для обозначения складки, поэтому +/1 2 3было эквивалентом 1+2+3. Между тем, деление было представлено символом математического деления ( ÷). Поскольку ASCII не содержит символа деления как такового, J использует% для представления деления в качестве визуального приближения или напоминания. (Это частично иллюстрирует мнемонический характер токенов J и некоторые затруднения, возникающие при использовании ASCII.)

Определение J-функции с именем avgдля вычисления среднего числа чисел дает:

 avg=: +/ % #

Это тестовое выполнение функции:

 avg 1 2 3 4 2.5

#подсчитывает количество элементов в массиве. +/суммирует элементы массива.  %делит сумму на количество элементов. Выше, ср определяется с помощью поезда из трех глаголов ( +/, %и #) называется вилкой. В частности, (V0 V1 V2) Nyэто то же самое, (V0(Ny)) V1 (V2(Ny))что показывает некоторую силу J. (Здесь V0, V1 и V2 обозначают глаголы, а Ny обозначает существительное).

Некоторые примеры использования avg:

 v=: ?. 20 $100  NB. a random vector v 46 55 79 52 54 39 60 57 60 94 46 78 13 18 51 92 78 60 90 62 avg v 59.2
 4 avg\ v   NB. moving average on periods of size 4 58 60 56 51.25 52.5 54 67.75 64.25 69.5 57.75 38.75 40 43.5 59.75 70.25 80 72.5
 m=: ?. 4 5 $50  NB. a random matrix m 46 5 29 2 4 39 10 7 10 44 46 28 13 18 1 42 28 10 40 12
 avg"1 m    NB. apply avg to each rank 1 subarray (each row) of m 17.2 22 21.2 26.4

Ранг является важным понятием в J. Его значение в J похоже на значение selectв SQL и whileв C.

Реализация быстрой сортировки из J Dictionary дает:

 sel=: adverb def 'u # [' quicksort=: verb define if. 1 gt;: #y do. y else. (quicksort y lt;sel e),(y =sel e),quicksort y gt;sel e=.y{~?#y end.)

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

 quicksort=: (($:@(lt;#[), (=#[), $:@(gt;#[)) ({~ ?@#)) ^: (1lt;#)

Сортировка в J обычно выполняется с помощью встроенных (примитивных) глаголов /:(сортировка вверх) и \:(сортировка вниз). Пользовательские сортировки, такие как быстрая сортировка, описанная выше, обычно служат только для иллюстрации.

В следующем примере демонстрируется использование глагола $:со ссылкой на себя для рекурсивного вычисления чисел Фибоначчи:

1:`($:@-amp;2+$:@lt;:)@.(gt;amp;2)

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

fibonacci=:1:`(fibonacci@-amp;2+fibonacci@lt;:)@.(gt;amp;2)

Следующее выражение показывает число Пи с n цифрами и демонстрирует расширенные возможности точности J:

 n=: 50      NB. set n as the number of digits required lt;.@o. 10x^n     NB. extended precision 10 to the nth * pi 314159265358979323846264338327950288419716939937510
Глаголы и модификаторы

Программа или подпрограмма - то, что принимает данные на входе и производит данные на выходе, - называется глаголом. J имеет богатый набор предопределенных глаголов, каждый из которых автоматически работает с несколькими типами данных: например, глагол i. поиск в массивах любого размера для поиска совпадений:

 3 1 4 1 5 9 i. 3 1 NB. find the index of the first occurrence of 3, and of 1 0 1 3 1 4 1 5 9 i: 3 1 NB. find the index of the last occurrence of 3, and of 1 0 3

Пользовательские программы можно именовать и использовать везде, где разрешены примитивы.

Сила J в значительной степени зависит от его модификаторов: символов, которые принимают существительные и глаголы в качестве операндов и применяют операнды определенным образом. Например, модификатор / берет один операнд, глагол слева от него, и производит глагол, который применяет этот глагол между каждым элементом своего аргумента. То есть + / - это глагол, определяемый как «применять + между элементами вашего аргумента». Таким образом, предложение

 +/ 1 2 3 4 5

производит эффект

 1 + 2 + 3 + 4 + 5 +/ 1 2 3 4 5 15

У J есть примерно два десятка таких модификаторов. Все они могут применяться к любому глаголу, даже к глаголу, написанному пользователем, и пользователи могут писать свои собственные модификаторы. Хотя модификаторы сильны по отдельности, позволяя

  • повторное выполнение, т.е. do-while
  • условное исполнение, т.е. если
  • выполнение регулярных или нерегулярных подмножеств аргументов

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

Типы и структуры данных

J поддерживает три простых типа:

  • Числовой
  • Литерал (символ)
  • В штучной упаковке

Из них у числового больше всего вариантов.

Один из числовых типов J - бит. Есть два битовых значения: 0 и 1. Также биты могут быть сформированы в списки. Например, 1 0 1 0 1 1 0 0это список из восьми бит. Синтаксически синтаксический анализатор J рассматривает это как одно слово. (Пробел распознается как словообразующий символ между числовыми словами.) Поддерживаются списки произвольной длины.

Кроме того, J поддерживает все обычные бинарные операции над этими списками, такие как и, или, исключающее или, поворот, сдвиг, not и т. Д. Например,

 1 0 0 1 0 0 1 0 +. 0 1 0 1 1 0 1 0  NB. or 1 1 0 1 1 0 1 0
 3 |. 1 0 1 1 0 0 1 1 1 1 1    NB. rotate 1 0 0 1 1 1 1 1 1 0 1

J также поддерживает массивы битов более высокого порядка. Они могут быть сформированы в двумерные, трехмерные и т. Д. Массивы. Вышеупомянутые операции одинаково хорошо работают с этими массивами.

Другие числовые типы включают целое число (например, 3, 42), с плавающей запятой (3.14, 8.8e22), комплексное (0j1, 2.5j3e88), целое число повышенной точности (12345678901234567890x) и рациональную дробь (повышенной точности) (1r2, 3r4). Как и в случае с битами, они могут быть сформированы в виде списков или массивов произвольного размера. Как и в случае с битами, операции выполняются со всеми числами в массиве.

Списки битов можно преобразовать в целые числа с помощью #.глагола. Целые числа можно преобразовать в списки битов с помощью #:глагола. (При синтаксическом анализе J .(точка) и :(двоеточие) являются словообразующими символами. Они никогда не являются только токенами, если им не предшествуют символы пробела. )

J также поддерживает буквальный (символьный) тип. Литералы заключаются в кавычки, например, 'a'или 'b'. Списки литералов также поддерживаются с использованием обычного соглашения о заключении нескольких символов в кавычки, например 'abcdefg'. Обычно отдельные литералы имеют ширину 8 бит (ASCII), но J также поддерживает другие литералы ( Unicode ). Числовые и логические операции не поддерживаются для литералов, но поддерживаются операции, ориентированные на сбор данных (например, поворот).

Наконец, есть упакованный тип данных. Обычно данные помещаются в поле с помощью lt;операции (без левого аргумента; если есть левый аргумент, это будет операция « меньше»). Это аналогично тому, C «с amp;операцией (без левого аргумента). Однако, если результат C amp;имеет ссылочную семантику, результат J lt;имеет семантику значения. Другими словами, lt;это функция, и она дает результат. Результат имеет 0 измерений, независимо от структуры содержащихся данных. С точки зрения J-программиста, lt; помещает данные в блок и позволяет работать с массивом блоков (он может быть собран с другими блоками и / или из блока может быть сделано несколько копий).

 lt;1 0 0 1 0 +---------+ |1 0 0 1 0| +---------+

Единственный тип коллекции, предлагаемый J, - это массив произвольных размеров. Большинство алгоритмов можно очень кратко выразить с помощью операций с этими массивами.

Массивы J имеют однородную типизацию, например, список 1 2 3представляет собой список целых чисел, несмотря на 1то, что он немного. По большей части, подобные проблемы с типами прозрачны для программистов. Только некоторые специализированные операции обнаруживают различия по типу. Например, список 1.0 0.0 1.0 0.0будет обрабатываться большинством операций точно так же, как и список 1 0 1 0.

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

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

Другой псевдотип, связанный с именем, а не значением, - это файл с отображением в память.

Отладка
Рассечение последовательности Коллатца, начиная с 6

J имеет обычные возможности для остановки в случае ошибки или в определенных местах в глаголах. Он также имеет уникальный визуальный отладчик, называемый Dissect, который дает двухмерное интерактивное отображение выполнения одного J-предложения. Поскольку одно предложение J выполняет столько же вычислений, сколько вся подпрограмма на языках нижнего уровня, визуальное отображение весьма полезно.

Документация

Документация J включает словарь со словами в J, обозначенными как существительные, глаголы, модификаторы и т. Д. Основные слова перечислены в словаре, в котором соответствующие части речи указаны с помощью разметки. Обратите внимание, что глаголы имеют две формы: монадические (аргументы только справа) и диадические (аргументы слева и справа). Например, в " -1" дефис - монадический глагол, а в " 3-2" дефис - диадический глагол. Монадическое определение в основном не зависит от диадического определения, независимо от того, является ли глагол примитивным глаголом или производным глаголом.

Структуры управления

J предоставляет управляющие структуры (подробности здесь), аналогичные другим процедурным языкам. Знаменитые контрольные слова в каждой категории включают:

  • assert.
  • break.
  • continue.
  • for.
  • goto_label.
  • if. else. elseif.
  • return.
  • select. case.
  • throw.
  • try. catch.
  • while. whilst.
Смотрите также
использованная литература
внешние ссылки

Последняя правка сделана 2023-03-31 01:36:33
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте