Разработано | Кеннет Э. Айверсон , Роджер Хуэй |
---|---|
Разработчик | JSoftware |
Впервые появился | 1990 |
Стабильный выпуск | J901 / 15 декабря 2019 г . [1] |
Печатная дисциплина | динамичный |
Операционные системы | Кроссплатформенность : Windows , Linux , macOS , Android , iOS , Raspberry Pi [2]. |
Лицензия | GPLv3 |
Веб-сайт | www |
Основные реализации | |
J | |
Под влиянием | |
APL | |
Под влиянием | |
NumPy , [3] Суперколлайдер [4] |
J язык программирования , разработанный в начале 1990 - х годов Кеннет Е. Айверсон и Roger Hui , [5] [6] является программирование массива язык , основанный прежде всего на APL (также Иверсона).
Чтобы избежать повторения проблемы специальных символов APL, J использует только базовый набор символов ASCII , прибегая к использованию точки и двоеточия в качестве перегибов [7] для формирования коротких слов, подобных орграфам . Большинство таких первичных (или примитивных ) J-слов служат математическими символами, при этом точка или двоеточие расширяют значение основных доступных символов. Кроме того, многие символы, которые в других языках часто должны быть объединены в пары (например, [] {} "" ``
или <>
), рассматриваются J как отдельные слова или, при склонении, как односимвольные корни многосимвольных слов.
J - это очень сжатый язык программирования массивов , который больше всего подходит для математического и статистического программирования, особенно при выполнении операций с матрицами . Он также использовался в экстремальном программировании [8] и анализе производительности сети . [9]
Подобно языкам Джона Бэкуса FP и FL , J поддерживает программирование на уровне функций с помощью функций неявного программирования .
В отличие от большинства языков, поддерживающих объектно-ориентированное программирование , гибкая схема иерархического пространства имен J (где каждое имя существует в определенной локали ) может эффективно использоваться в качестве основы как для объектно-ориентированного программирования на основе классов, так и на основе прототипов .
С марта 2011 года J является бесплатным программным обеспечением с открытым исходным кодом под Стандартной общественной лицензией GNU версии 3 (GPLv3). [10] [11] [12] Источник также можно приобрести по согласованной лицензии. [13]
Примеры [ править ]
J допускает безточечный стиль и функциональную композицию . Таким образом, его программы могут быть очень краткими, и некоторые программисты считают их трудными для чтения .
"Hello, World!" программа в J
'Привет мир!'
Эта реализация hello world отражает традиционное использование J - программы вводятся в сеанс интерпретатора J, и отображаются результаты выражений. Также возможно организовать выполнение J-скриптов как автономных программ. Вот как это может выглядеть в системе Unix :
#! / bin / jc echo 'Привет, мир!' выход ''
Исторически сложилось так, что APL использовалось /
для обозначения складки , поэтому +/1 2 3
было эквивалентом 1+2+3
. Между тем, деление было представлено символом математического деления ( ÷
), который был реализован путем переопределения знака минус и двоеточия (на терминалах для бумажных текстов EBCDIC и ASCII ). Поскольку 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. случайный векторv
46 55 79 52 54 39 60 57 60 94 46 78 13 18 51 92 78 60 90 62 59,2avg v
4 avg\ v
NB. скользящее среднее по периодам размером 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. случайная матрицаm
46 5 29 2 439 10 7 10 4446 28 13 18 142 28 10 40 12
avg"1 m
NB. применить среднее значение к каждому подмассиву ранга 1 (каждой строке) m 17,2 22 21,2 26,4
Ранг является важным понятием в J. Его значение в J похоже на значение select
в SQL и while
в C .
Реализация быстрой сортировки из J Dictionary дает:
sel =: наречие def 'u # [' quicksort =: глагол определить если. 1 >: # у делать. у остальное. ( быстрая сортировка y < sel e ) , ( y = sel e ) , быстрая сортировка y > sel e =. у {~? # у конец. )
Ниже приведена реализация быстрой сортировки, демонстрирующая неявное программирование . Последнее включает в себя составление функций вместе и без явной ссылки на какие-либо переменные. Поддержка J вилок и перехватчиков диктует правила того, как аргументы, применяемые к этой функции, будут применяться к ее компонентным функциям.
quicksort =: (( $: @ ( <# [ ) , ( = # [ ) , $: @ ( > # [ )) ( {~ ? @ # )] ^: ( 1 <# )
Сортировка в J обычно выполняется с помощью встроенных (примитивных) глаголов /:
(сортировка вверх) и \:
(сортировка вниз). Пользовательские сортировки, такие как быстрая сортировка, описанная выше, обычно служат только для иллюстрации.
В следующем примере демонстрируется использование глагола $:
со ссылкой на себя для рекурсивного вычисления чисел Фибоначчи:
1 : ` ( $: @ - & 2 + $: @ <: ) @. ( > & 2 )
Эта рекурсия также может быть выполнена путем обращения к глаголу по имени, хотя это, конечно, возможно только в том случае, если глагол назван:
Фибоначчи =: 1 : ` ( Фибоначи @ - & 2 + Фибоначи @ <: ) @. ( > & 2 )
Следующее выражение показывает число Пи с n цифрами и демонстрирует расширенные возможности точности J:
n=: 50
NB. установите n как необходимое количество цифр NB. увеличенная точность 10 до n-го числа * pi 314159265358979323846264338327950288419716939937510<.@o. 10x^n
Глаголы и модификаторы [ править ]
Программа или подпрограмма - то, что принимает данные на входе и производит данные на выходе, - называется глаголом . J имеет богатый набор предопределенных глаголов, каждый из которых автоматически работает с несколькими типами данных: например, глагол i. поиск в массивах любого размера для поиска совпадений:
3 1 4 1 5 9 и . 3 1 NB. найти индекс первого появления числа 3 и 1 0 1 3 1 4 1 5 9 i : 3 1 NB. найти индекс последнего появления 3 и 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. или 1 1 0 1 1 0 1 0
3 |, 1 0 1 1 0 0 1 1 1 1 1 NB. повернуть 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
- Q - язык KDB + и новая объединенная версия K и KSQL.
Ссылки [ править ]
- ^ "Выпуск J901 15 декабря 2019 г." .
- ^ https://www.jsoftware.com/#/README
- ^ Уэс МакКинни на встрече с Python для анализа данных в 2012 году
- ^ Документация SuperCollider, Наречия для двоичных операторов
- ^ Личный взгляд на APL , 1991 эссе KE Iverson (заархивированная ссылка)
- ^ Обзор истории J Роджером Хуэем (19 марта 2002 г.)
- ^ J Слова NuVoc
- ^ Басселл, Брайан; Тейлор, Стивен (2006), «Разработка программного обеспечения как совместный проект написания», Экстремальное программирование и гибкие процессы в разработке программного обеспечения, Оулу, Финляндия: Springer , стр. 21–31, ISBN 978-3-540-35094-1 Отсутствует или пусто
|title=
( справка ) - ^ Холт, Алан (2007), Анализ производительности сети: Использование языка программирования J , Springer , ISBN 978-1-84628-822-7
- ^ Страница загрузки исходного кода Jsoftware
- ↑ Эрик Айверсон (1 марта 2011 г.). "J Source GPL" . J программирование списка рассылки .
- ^ openj на GitHub
- ^ Политика поставщиков Jsoftware
- ^ Глава 25: Объектно-ориентированное программирование
Внешние ссылки [ править ]
- Официальный сайт - JSoftware, создатели J
- jsource на GitHub - Репозиторий
- Learning J - Введение в язык программирования J, Роджер Стоукс