J (язык программирования) - J (programming language)
Разработано | Кеннет Э. Айверсон, Роджер Хуэй |
---|---|
Разработчик | JSoftware |
Впервые появился | 1990 |
Стабильный выпуск | J901 / 15 декабря 2019 г.[1] |
Печатная дисциплина | динамичный |
Операционные системы | Кроссплатформенность: Windows, Linux, macOS |
Лицензия | GPLv3 |
Интернет сайт | www |
Главный реализации | |
J | |
Под влиянием | |
APL | |
Под влиянием | |
NumPy,[2] Суперколлайдер[3] |
В J язык программирования, разработанная в начале 1990-х годов Кеннет Э. Айверсон и Роджер Хуэй,[4][5] является программирование массива язык, основанный прежде всего на APL (также Айверсоном).
Чтобы избежать повторения проблемы со специальными символами APL, J использует только основные ASCII набор символов, прибегая к использованию точки и двоеточия в качестве интонации[6] формировать короткие слова, похожие на диграфы. Большинство таких первичный (или примитивный) J слова служат математическими символами, при этом точка или двоеточие расширяют значение основных доступных символов. Кроме того, многие символы, которые в других языках часто необходимо сопоставлять (например, [] {} "" ``
или <>
) обрабатываются J как отдельные слова или, если они изменяются, как односимвольные корни многосимвольных слов.
J очень лаконичный язык программирования массивов, и наиболее подходит для математический и статистический программирование, особенно при выполнении операций на матрицы. Он также использовался в экстремальное программирование[7] и производительность сети анализ.[8]
подобно Джон Бэкус языки FP и FL, J поддерживает программирование на функциональном уровне через его молчаливое программирование Особенности.
В отличие от большинства языков, поддерживающих объектно-ориентированного программирования, Гибкая иерархическая пространство имен схема (где каждое имя существует в определенном регион) можно эффективно использовать как основу для обоих основанный на классе и на основе прототипа объектно-ориентированного программирования.
С марта 2011 года J является бесплатное программное обеспечение с открытым исходным кодом под Стандартная общественная лицензия GNU версия 3 (GPLv3).[9][10][11] Можно также приобрести источник по договорной лицензии.[12]
Примеры
J разрешает безточечный стиль и функциональная композиция. Таким образом, его программы могут быть очень краткими и считается трудным для чтения некоторыми программистами.
В "Привет мир!" программа в J
'Привет мир!'
Эта реализация hello world отражает традиционное использование J - программы вводятся в сеанс интерпретатора J, и отображаются результаты выражений. Также возможно организовать выполнение J-скриптов как автономных программ. Вот как это может выглядеть на Unix система:
#! / bin / jc эхо 'Привет мир!' выход ''
Исторически APL использовали /
указать складывать, так +/1 2 3
был эквивалентен 1+2+3
. Между тем, деление было представлено математическим символ деления (÷
), который был реализован чрезмерный знак минус и двоеточие (на бумаге EBCDIC и ASCII текстовые терминалы ). Поскольку ASCII в целом не поддерживает переопределения независимо от устройства и не включает символ разделения как таковой, J использует% для обозначения деления в качестве визуального приближения или напоминания. (Это частично иллюстрирует мнемонический характер токенов J и некоторые затруднения, возникающие при использовании ASCII.)
Определение J-функции с именем средний
для вычисления среднего значения списка чисел дает:
средний=: +/ % #
Это тестовое выполнение функции:
средний 1 2 3 4
2.5
#
подсчитывает количество элементов в массиве. +/
суммирует элементы массива. %
делит сумму на количество элементов. Над, средний определяется с помощью цепочки из трех глаголов (+/
, %
, и #
) названный вилка. В частности (V0 V1 V2) Нью-Йорк
такой же как (V0 (Ny)) V1 (V2 (Ny))
который показывает некоторую силу J. (Здесь V0, V1 и V2 обозначают глаголы, а Ny обозначает существительное).
Некоторые примеры использования средний
:
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средний v
59.2
4 средний\ v
NB. скользящая средняя на периодах размером 458 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
м=: ?. 4 5 $50
NB. случайная матрицам
46 5 29 2 439 10 7 10 4446 28 13 18 142 28 10 40 12
средний"1 м
NB. применить среднее значение к каждому подмассиву ранга 1 (каждой строке) m17.2 22 21.2 26.4
Ранг является ключевым понятием в J. Его значение в J аналогично значению Выбрать
в SQL и из в то время как
в C.
Реализация быстрая сортировка, из J Dictionary дает:
сел=: наречие def 'u # [' быстрая сортировка=: глагол определить если. 1 >: #у делать. у еще. (быстрая сортировка у <сел е),(у =сел е),быстрая сортировка у >сел е=.у{~?#у конец. )
Ниже приведена реализация быстрой сортировки, демонстрирующая молчаливое программирование. Второй вариант включает в себя составление функций вместе без явной ссылки на какие-либо переменные. J поддерживает вилки и крючки определяет правила того, как аргументы, применяемые к этой функции, будут применяться к ее функциям-компонентам.
быстрая сортировка=: (($:@(<#[), (=#[), $:@(>#[)) ({~ ?@#)) ^: (1<#)
Сортировка в J обычно выполняется с помощью встроенных (примитивных) глаголов /:
(сортировка) и \:
(отсортировать). Пользовательские сортировки, такие как быстрая сортировка, описанные выше, обычно служат только для иллюстрации.
В следующем примере демонстрируется использование глагола со ссылкой на себя $:
для рекурсивного вычисления чисел Фибоначчи:
1:`($:@-&2+$:@<:)@.(>&2)
Эта рекурсия также может быть выполнена путем обращения к глаголу по имени, хотя это, конечно, возможно, только если глагол назван:
Фибоначчи=:1:`(Фибоначчи@-&2+Фибоначчи@<:)@.(>&2)
Следующее выражение показывает Пи с n цифрами и демонстрирует возможности повышенной точности J:
п=: 50
NB. установите n как необходимое количество цифр<.@о. 10x^п
NB. расширенная точность 10 до n-го * пи314159265358979323846264338327950288419716939937510
Глаголы и модификаторы
Программа или процедура - то, что принимает данные на входе и производит данные на выходе - называется глагол. J имеет богатый набор предопределенных глаголов, каждый из которых автоматически работает с несколькими типами данных: например, глагол я. поиск в массивах любого размера для поиска совпадений:
3 1 4 1 5 9 я. 3 1 NB. найти индекс первого появления 3 и 10 1 3 1 4 1 5 9 я: 3 1 NB. найти индекс последнего вхождения 3 и 10 3
Пользовательские программы можно именовать и использовать везде, где разрешены примитивы.
Сила J во многом определяется его модификаторы: символы, употребляющие существительные и глаголы как операнды и применяют операнды определенным образом. Например, модификатор / берет один операнд, глагол слева от него, и производит глагол, который применяет этот глагол между каждым элементом своего аргумента. Это, +/ глагол, определяемый как 'применять + между элементами вашего аргумента 'Таким образом, предложение
+/ 1 2 3 4 5
производит эффект
1 + 2 + 3 + 4 + 5 +/ 1 2 3 4 515
У J есть примерно две дюжины этих модификаторов. Все они могут применяться к любому глаголу, даже к глаголу, написанному пользователем, и пользователи могут писать свои собственные модификаторы. Хотя модификаторы сильны по отдельности, позволяя
- повторное выполнение, т.е. е. делать пока
- условное исполнение, т.е. е. если
- выполнение регулярных или нерегулярных подмножеств аргументов
некоторые из модификаторов управляют порядком, в котором выполняются компоненты, позволяя комбинировать модификаторы в любом порядке для создания неограниченного разнообразия операций, необходимых для практического программирования.
Типы и структуры данных
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. или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 также поддерживает буквальный (символьный) тип. Литералы заключаются в кавычки, например, 'а'
или 'b'
. Списки литералов также поддерживаются с использованием обычного соглашения о заключении нескольких символов в кавычки, например 'abcdefg'
. Обычно отдельные литералы имеют ширину 8 бит (ASCII), но J также поддерживает другие литералы (Unicode ). Числовые и логические операции не поддерживаются для литералов, но поддерживаются операции, ориентированные на сбор данных (например, поворот).
Наконец, есть упакованный тип данных. Обычно данные помещаются в поле с помощью <
операция (без левого аргумента; если есть левый аргумент, это будет меньше, чем операция). Это аналогично C с &
операция (без левого аргумента). Однако если результат C &
имеет ссылочную семантику, результат J's <
имеет семантику значений. Другими словами, <
это функция, и она дает результат. Результат имеет 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 также поддерживает объекты и классы,[13] но это артефакт способа именования вещей, а не типы данных. Вместо этого для ссылки на объекты (и классы) используются литералы в рамке. Данные J имеют семантику значений, но объектам и классам нужна ссылочная семантика.[нужна цитата ]
Другой псевдотип, связанный с именем, а не значением, - это файл с отображением в память.
Отладка
J имеет обычные возможности для остановки в случае ошибки или в определенных местах глаголов. Он также имеет уникальный визуальный отладчик, который называется Рассекать, который дает двухмерное интерактивное отображение выполнения одного предложения J. Поскольку одно предложение J выполняет столько же вычислений, сколько и вся подпрограмма в языках нижнего уровня, визуальное отображение весьма полезно.
Документация
Документация J включает толковый словарь, со словами в J, обозначенными как существительные, глаголы, модификаторы, и так далее. Основные слова перечислены в запас слов, в котором их соответствующие части речи обозначаются с помощью разметки. Обратите внимание, что глаголы имеют две формы: монадический (аргументы только справа) и диадический (аргументы слева и справа). Например, в '-1
'дефис - монадический глагол, а в'3-2
'дефис - диадический глагол. Монадическое определение в основном не зависит от диадического определения, независимо от того, является ли глагол примитивным глаголом или производным глаголом.
Структуры управления
J предоставляет управляющие структуры (подробности здесь) похож на другие процедурные языки. Основные контрольные слова в каждой категории включают:
утверждать.
перерыв.
Продолжать.
для.
goto_label.
если. еще. elseif.
вернуть.
Выбрать. кейс.
бросить.
пытаться. ловить.
в то время как. пока.
Смотрите также
- K (язык программирования) - еще один язык под влиянием APL
- Q - Язык KDB + и новая объединенная версия K и KSQL.
использованная литература
- ^ «Выпуск J901 15 декабря 2019 г.».
- ^ Уэс МакКинни на встрече с Python для анализа данных в 2012 году
- ^ Документация SuperCollider, Наречия для двоичных операторов
- ^ Личный взгляд на APL, Очерк К.Э. Айверсон (ссылка в архиве)
- ^ Обзор J History Роджер Хуэй (19 марта 2002 г.)
- ^ J NuVoc Words
- ^ Басселл, Брайан; Тейлор, Стивен (2006 г.), «Разработка программного обеспечения как проект совместного написания», Экстремальное программирование и гибкие процессы в разработке программного обеспечения, Оулу, Финляндия: Springer, стр. 21–31, ISBN 978-3-540-35094-1 Отсутствует или пусто
| название =
(Помогите) - ^ Холт, Алан (2007), Анализ производительности сети: использование языка программирования J, Springer, ISBN 978-1-84628-822-7
- ^ Страница загрузки исходного кода Jsoftware
- ^ Эрик Айверсон (1 марта 2011 г.). "J Source GPL". Список рассылки по программированию J.
- ^ openj на GitHub
- ^ Политика поставщиков Jsoftware
- ^ Глава 25: Объектно-ориентированное программирование
внешние ссылки
- Официальный веб-сайт - JSoftware, создатели J
- Openj на GitHub - Репозиторий
- Обучение J - Введение в язык программирования J от Роджера Стоукса