Jump to content

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

(Перенаправлено с языка программирования J )
Дж
Парадигма Массив , функциональный , объектно-ориентированный ( на основе классов , на основе прототипов ), уровень функций , неявный
Разработано Кеннет Э. Айверсон , Роджер Хуэй
Разработчик JПрограммное обеспечение
Впервые появился 1990 год ; 34 года назад ( 1990 )
Стабильная версия
J9.5 / 20 декабря 2023 г .; 7 месяцев назад ( 20.12.2023 ) [1]
Дисциплина набора текста динамичный
ТЫ Кроссплатформенность : Windows , Linux , macOS , Android , iOS , Raspberry Pi. [2]
Лицензия лицензия GPLv3
Веб-сайт www .jsoftware
Основные реализации
Дж
Под влиянием
АПЛ
Под влиянием
НумПи , [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 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 в С.

Реализация быстрой сортировки из словаря 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 имеют семантику значений, но объекты и классы нуждаются в ссылочной семантике. [ нужна ссылка ]

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

Анализ последовательности Коллатца, начиная с 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.

См. также

[ редактировать ]
  1. ^ «Примечания к выпуску J9.5» .
  2. ^ «Jsoftware» .
  3. ^ Уэс МакКинни на встрече Python для анализа данных в 2012 году
  4. ^ Документация SuperCollider, Наречия для бинарных операторов
  5. ^ Личный взгляд на APL , эссе К. Э. Айверсона, 1991 г. (архивная ссылка)
  6. Обзор истории J Роджера Хуэя (19 марта 2002 г.)
  7. ^ J NuVoc Слова
  8. ^ Бассел, Брайан; Тейлор, Стивен (2006), «Разработка программного обеспечения как совместный письменный проект», Экстремальное программирование и гибкие процессы в разработке программного обеспечения, Оулу, Финляндия: Springer , стр. 21–31, ISBN.  978-3-540-35094-1 {{citation}}: Отсутствует или пусто |title= ( помощь )
  9. ^ Холт, Алан (2007), Анализ производительности сети: использование языка программирования J , Springer , ISBN  978-1-84628-822-7
  10. ^ Страница загрузки исходного кода Jsoftware.
  11. ^ Эрик Айверсон (1 марта 2011 г.). «J Source GPL» . Список рассылки по J-программированию . Архивировано из оригинала 23 сентября 2016 года . Проверено 24 июня 2015 г.
  12. ^ openj на GitHub
  13. ^ Политика снабжения Jsoftware
  14. ^ Глава 25: Объектно-ориентированное программирование.
[ редактировать ]

Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 2aa1794f7ed7a1f69331782bcf542e01__1719415140
URL1:https://arc.ask3.ru/arc/aa/2a/01/2aa1794f7ed7a1f69331782bcf542e01.html
Заголовок, (Title) документа по адресу, URL1:
J (programming language) - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)