J (мова програмування)

Не плутати з J + + або J #.

J - функціональний векторний мова програмування (Масивне програмування). Діалект АПЛ. На відміну від АПЛ не вимагає спеціальної розкладки клавіатури для введення математичних символів, оскільки використовує символи ASCII.

Мова програмування J був розроблений на початку 1990-х Кеннетом Айверсон і Роджером Хуеєм (Roger Hui) (англ.) як синтез APL (також розробленого Айверсон) і мов функціонального рівня FP (англ.) і FL (англ.), розроблених Бекуса. Основні його риси - це орієнтованість на MIMD інструкції, функціональний підхід ( змінні виключені взагалі, замість них діє механізм перейменувань і комбінатори).

Мова J поєднує в собі кілька ідей і парадигм. Він, в числі іншого, сильно орієнтований на обробку даних. J - чисто функціональна мова. Єдиними способами передачі значення є отримання його як результату виклику функції і передача його функції як параметр. Змінних в J немає.

Єдиний з розроблених повноцінний інтерпретатор J був у 1994-2010 рр.. невільним, однак після виходу сьомої версії, 6 березня 2011 р., його вихідні коди були відкриті під ліцензією GPL3 [1].


1. Поняття мови

Для опису елементів програмування, J використовує набір слів, що відноситься до граматики англійської мови. Ця термінологія не така дивна, як може здатися на перший погляд. "Дієслово" використовується в значенні, відповідному "функції" або "оператору" в C.

Відповідність термінів мови J термінам мови С.

Термін мови J Термін мови C
Дієслово Функція або оператор
Ім'я іменник Об'єкт
Дієслово-зв'язка Привласнення
Розділовий знак Роздільник
Прислівник (# Define macro)
Союз (# Define macro)

У кожного слова в реченні мови J є частина мови, аналог типу в мові C. Це дієслово, ім'я, іменник, дієслово-зв'язка, прислівник, сполучник чи розділовий знак. Головні частини мови це іменник, дієслово, прислівник і союз. Всі імена, які буде створювати програміст і всі імена, визначені в мові J (за винятком дієслів-зв'язок (=. Та = :) і розділових знаків), будуть ставитися до однієї з головних частин мови. Сутність ( англ. entity ) Це об'єкт, тип якого - одна з головних частин мови. Іншими словами, сутність це наріччя, іменник дієслово або союз. Сутності може бути дано ім'я, але більшість з них імені не мають і виникають посеред виконання вирази і зникають одразу після, в точності як проміжні результати обчислення виразу на мові С.

Іменник містить дані, дієслово виробляє дію над одним або двома іменниками з тим, щоб отримати в результаті іменник. Прислівник виробляє дію над дієсловом або іменником, отримуючи результатом сутність, союз оперує над двома іменниками або дієсловами, і має результатом сутність. Прислівники та спілки називаються модифікаторами. В С модифікатори можна представити в якості макросу препроцесора, який приймає імена функції і містить код викликає код функції.

Розділові знаки в мові J складаються з символів () 'і символу кінця рядка, а також обмежувача NB. і декількох спеціальних слів, таких як if. і case. Більше символів пунктуації в мові J немає. Навіть символи [],. "; {} Є дієсловами, а дужки [] і {} незалежні і використовуються по одній, а не парами.


2. Синтаксис

Виконуваною одиницею мови J є пропозиція, яка відповідає пропозиції в мові C. Обмежувачами пропозиції мови J є символ кінця рядка (LF) і керуючі слова, такі як if. Пропозиція включає всі символи між роздільниками, а оскільки символ LF є роздільником, пропозиції J повинні вписуватися в один рядок. Способів рознести пропозицію на два рядки немає.

Всі коментарі починаються з NB. і закінчуються кінцем рядка. Коментар в процесі виконання пропозиції ігнорується. У мові J виділяються такі типи лексем :

  1. Іменник
  2. Дієслово
  3. Прислівник
  4. Союз


Відносини між лексемами та частинами мови ілюструє діаграма на рис. - Лексеми мови J і частини мови. J lexem rus.png

Слова в реченні мови J діляться на ідентифікатори, примітиви, числа, знаки пунктуації і символьні константи. Розділяють слова прогалини і символ табуляції. У символів "." і ":" особливе значення.

Імена (ідентифікатори) в мові J подібними до таких у мові C. Вони починаються з букви латинського алфавіту, допускають нижнє підкреслення, розрізняють регістр і складаються тільки з алфавітно-цифрових символів і символу нижнього підкреслення. Імена, що закінчуються на символ підкреслення і містять у собі два символи підкреслення обробляються особливим чином, це пов'язано з поняттям локалі.

Графічні символи ASCII (наприклад "+") називаються примітивами або операторами.

Кожен графічний символ може утворити новий примітив, якщо до нього додати "." або ":". Оскільки всі примітиви - зарезервовані слова, в іменах "." і ":" не допускаються. Примітиви не обов'язково розділяти пробілами. Частина мови кожного примітиву є постійна для мови J. Приклади:

 + +. +: {{: {:: I. i: for. select. case. end. 

2.1. Порядок обчислення

Таблиці пріоритетів дій в мові J немає. Усі дієслова мови J мають однаковий пріоритет і праву асоціативність. Для визначення порядку можна використовувати дужки. Круглі дужки в мові J розуміються в точності як в математиці.

У разі, коли у дієслова зліва є іменник, він обчислюється як діадного. Якщо його немає, дієслово обчислюється як монадної з одним лише правим операндом. Потрібно знати частина мови символу, щоб зрозуміти порядок обчислення, наприклад у реченні

 result =. name1 verb2 5 

потрібно знати, чи є name1 дієсловом або іменником. У разі, коли він дієслово, порядок обчислення name1(verb2(5)), а якщо він іменник, verb2 - діадного і результат (name1 verb2 5).

Всі союзи і прислівники мають більш високий пріоритет у порівнянні з дієсловами і ліву асоціативність.


2.2. Іменники з дужками

У мові J кілька поруч стоять чисел сприймаються як одновимірний масив. У випадку, коли маються на увазі декілька роздільних іменників, слід використовувати дужки.


2.3. Граматика

J дозволяє побудову декількох синтаксичних дерев для однієї і тієї ж рядки коду. Тобто опису мови не повні, відсутня вичерпна специфікація. Мова J контекстно-залежний, і стандартні засоби для його опису (наприклад, граматика в формі Бекуса-Науер) не підходять. Поняття абстрактного синтаксичного дерева навіть втрачає своє значення, так як воно коректно лише в області контекстно-вільних мов.


Примітки

  1. J Source GPL - old.nabble.com/J-Source-GPL-p31045068s24193.html