J (язык программирования)
Парадигма | Массив , функциональный , объектно-ориентированный ( на основе классов , на основе прототипов ), уровень функций , неявный |
---|---|
Разработано | Кеннет Э. Айверсон , Роджер Хуэй |
Разработчик | JПрограммное обеспечение |
Впервые появился | 1990 год |
Стабильная версия | J9.5
/ 20 декабря 2023 г [1] |
Дисциплина набора текста | динамичный |
ТЫ | Кроссплатформенность : Windows , Linux , macOS , Android , iOS , Raspberry Pi. [2] |
Лицензия | лицензия GPLv3 |
Веб-сайт | www |
Основные реализации | |
Дж | |
Под влиянием | |
АПЛ | |
Под влиянием | |
НумПи , [3] СуперКоллайдер [4] |
Язык J программирования , разработанный в начале 1990-х годов Кеннетом Э. Айверсоном и Роджером Хуэем , [5] [6] — это язык программирования массивов, основанный в первую очередь на APL (также разработанный Айверсоном).
Чтобы избежать повторения проблемы со специальными символами APL, J использует только базовый набор символов ASCII , прибегая к использованию точки и двоеточия в качестве флексий. [7] образовывать короткие слова, похожие на орграфы . Большинство таких первичных (или примитивных ) слов J служат математическими символами, при этом точка или двоеточие расширяют значение доступных основных символов. Кроме того, многие символы, которые в других языках часто должны быть парными (например, [] {} "" ``
или <>
) рассматриваются J как отдельные слова или, при изменении, как односимвольные корни многосимвольных слов.
J — очень краткий язык программирования массивов , наиболее подходящий для математического и статистического программирования, особенно при выполнении операций над матрицами . Он также использовался в экстремальном программировании. [8] и анализ производительности сети . [9]
Подобно Джона Бэкуса языкам FP и FL , J поддерживает программирование на уровне функций посредством своих функций неявного программирования .
В отличие от большинства языков, поддерживающих объектно-ориентированное программирование J , гибкая иерархическая схема пространства имен (где каждое имя существует в определенной локали ) может эффективно использоваться в качестве основы для объектно-ориентированного программирования как на основе классов , так и на основе прототипов .
С марта 2011 года J является бесплатным программным обеспечением с открытым исходным кодом под лицензией GNU General Public License версии 3 (GPLv3). [10] [11] [12] Можно также приобрести исходный код по договорной лицензии. [13]
Примеры
[ редактировать ]J допускает бесточечный стиль и композицию функций . Таким образом, его программы могут быть очень краткими, и некоторые программисты считают их трудными для чтения.
Программа «Привет, мир!» программа на языке J:
'Hello, World!'
Эта реализация hello world отражает традиционное использование J — программы вводятся в сеанс J-интерпретатора, и отображаются результаты выражений. Также возможно организовать выполнение J-скриптов как отдельных программ. Вот как это может выглядеть в системе Unix :
#!/bin/jc
echo 'Hello, world!'
exit ''
(Обратите внимание, что текущие реализации j устанавливают либо jconsole
или (потому что jconsole используется Java), ijconsole
и, вероятно, установите его в /usr/bin или какой-либо другой каталог (возможно, каталог приложений в OSX). Итак, здесь есть системная зависимость, которую пользователю придется решать.)
Исторически сложилось так, что APL использовалась /
чтобы указать складку , поэтому +/1 2 3
был эквивалентен 1+2+3
. При этом деление обозначалось математическим символом деления ( ÷
).
Поскольку ASCII не включает символ деления как таковой , J использует % для обозначения деления в качестве визуального приближения или напоминания. (Это иллюстрирует мнемонический характер токенов J и некоторые затруднения, возникающие при использовании ASCII.)
Определение функции J с именем avg
для расчета среднего значения списка чисел дает:
avg=: +/ % #
+/
суммирует элементы массива.#
подсчитывает количество элементов в массиве.%
делит сумму на количество предметов.
Это тестовое выполнение функции:
avg 1 2 3 4
2.5
Выше avg определяется с помощью группы из трех глаголов ( +/
, %
, и #
) называется вилкой . Конкретно, (V0 V1 V2) Ny
то же самое, что (V0(Ny)) V1 (V2(Ny))
что демонстрирует некоторую силу J. (Здесь V0, V1 и V2 обозначают глаголы, а Ny обозначает существительное.)
Некоторые примеры использования avg
:
v=: ?. 20 $100
NB. a random vectorv
46 55 79 52 54 39 60 57 60 94 46 78 13 18 51 92 78 60 90 62avg 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 matrixm
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
в С.
Реализация быстрой сортировки из словаря J дает:
sel=: adverb def 'u # ['
quicksort=: verb define
if. 1 >: #y do. y
else.
(quicksort y <sel e),(y =sel e),quicksort y >sel e=.y{~?#y
end.
)
Ниже приведена реализация быстрой сортировки, демонстрирующая неявное программирование . Последнее предполагает объединение функций без явного обращения к каким-либо переменным. Поддержка J разветвлений и перехватчиков диктует правила того, как аргументы, примененные к этой функции, будут применяться к функциям ее компонентов.
quicksort=: (($:@(<#[), (=#[), $:@(>#[)) ({~ ?@#)) ^: (1<#)
Сортировка в J обычно осуществляется с помощью встроенных (примитивных) глаголов. /:
(сортировать) и \:
(сортировать). Пользовательские сортировки, такие как быстрая сортировка, описанная выше, обычно предназначены только для иллюстрации.
В следующем примере показано использование глагола самореференции. $:
для рекурсивного вычисления чисел Фибоначчи:
1:`($:@-&2+$:@<:)@.(>&2)
Эту рекурсию также можно осуществить, обратившись к глаголу по имени, хотя это, конечно, возможно только в том случае, если глагол назван:
fibonacci=:1:`(fibonacci@-&2+fibonacci@<:)@.(>&2)
Следующее выражение представляет число Пи с n цифрами и демонстрирует возможности расширенной точности J:
n=: 50
NB. set n as the number of digits required<.@o. 10x^n
NB. extended precision 10 to the nth * pi 314159265358979323846264338327950288419716939937510
Глаголы и модификаторы
[ редактировать ]Программа или подпрограмма — то, что принимает данные в качестве входных данных и выдает данные в качестве выходных данных — называется глаголом . J имеет богатый набор предопределенных глаголов, каждый из которых автоматически работает с несколькими типами данных: например, глагол я. ищет совпадения в массивах любого размера:
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 поддерживает все обычные бинарные операции над этими списками, такие как и , или , исключающее или , вращать , сдвиг , не и т. д. Например,
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 ). Числовые и логические операции с литералами не поддерживаются, но поддерживаются операции, ориентированные на коллекции (например, поворот).
Наконец, есть коробочный тип данных. Обычно данные помещаются в поле с помощью <
операция (без левого аргумента; если есть левый аргумент, это будет операция «меньше» ). Это C аналогично &
операция (без левого аргумента). Однако там, где результат C &
имеет ссылочную семантику, результат J <
имеет семантику значений. Другими словами, <
это функция, и она дает результат. Результат имеет 0 измерений независимо от структуры содержащихся данных. С точки зрения J-программиста, <
помещает данные в ящик и позволяет работать с массивом ящиков (его можно скомпоновать с другими ящиками или сделать из ящика больше копий).
<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 также поддерживает объекты и классы, [14] но это артефакт способа именования вещей, а не типы данных. Вместо этого для ссылки на объекты (и классы) используются литералы в штучной упаковке. Данные J имеют семантику значений, но объекты и классы нуждаются в ссылочной семантике. [ нужна ссылка ]
Другой псевдотип, связанный с именем, а не со значением, — это файл, отображаемый в памяти.
Отладка
[ редактировать ]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.
См. также
[ редактировать ]- K (язык программирования) - еще один язык, созданный под влиянием APL.
- Вопрос – Язык KDB+ и новая объединенная версия K и KSQL.
Ссылки
[ редактировать ]- ^ «Примечания к выпуску J9.5» .
- ^ «Jsoftware» .
- ^ Уэс МакКинни на встрече Python для анализа данных в 2012 году
- ^ Документация SuperCollider, Наречия для бинарных операторов
- ^ Личный взгляд на APL , эссе К. Э. Айверсона, 1991 г. (архивная ссылка)
- ↑ Обзор истории J Роджера Хуэя (19 марта 2002 г.)
- ^ J NuVoc Слова
- ^ Бассел, Брайан; Тейлор, Стивен (2006), «Разработка программного обеспечения как совместный письменный проект», Экстремальное программирование и гибкие процессы в разработке программного обеспечения, Оулу, Финляндия: Springer , стр. 21–31, ISBN. 978-3-540-35094-1
{{citation}}
: Отсутствует или пусто|title=
( помощь ) - ^ Холт, Алан (2007), Анализ производительности сети: использование языка программирования J , Springer , ISBN 978-1-84628-822-7
- ^ Страница загрузки исходного кода Jsoftware.
- ^ Эрик Айверсон (1 марта 2011 г.). «J Source GPL» . Список рассылки по J-программированию . Архивировано из оригинала 23 сентября 2016 года . Проверено 24 июня 2015 г.
- ^ openj на GitHub
- ^ Политика снабжения Jsoftware
- ^ Глава 25: Объектно-ориентированное программирование.
Внешние ссылки
[ редактировать ]- Официальный сайт – JSoftware, создатели J
- jsource на GitHub — репозиторий исходного кода
- Джей Вики
- Изучение J – Введение в язык программирования J, Роджер Стоукс
- Семейство языков программирования APL
- Языки программирования массивов
- Языки программирования на основе классов
- Динамически типизированные языки программирования
- Языки функционального уровня
- Функциональные языки
- Мультипарадигмальные языки программирования
- Языки числового программирования
- Объектно-ориентированные языки программирования