Яка нетеоретична, практична мова програмування не має зарезервованих ключових слів?


22

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

Я працюю над мовою програмування для моєї власної побудови та розваг, і мені ще не потрібно було включати жодні ключові слова, саме це привело мене до пошуку та питання:

Я не вважаю зручність для компілятора як важливої ​​для кінцевого користувача мови. Комп'ютери зараз досить потужні, щоб можна було виводити значення з контексту. Не більше, ніж письменник повинен маркувати іменники, дієслова тощо, коли пише роман, чому програміст повинен мітити функції та змінні за допомогою function x() {}або set x = 1або var x = 1тощо; коли я можу зробити висновок із контексту висловлювань про те, що це оголошення функції або виклик, або що мітка - це присвоєння значенню чи посилання на це значення міток?

Ось конкретний приклад того, що робить мій поточний аналізатор, немає необхідності в зарезервованих ключових словах для підтримки загальних речей, які, як правило, мають чимало шуму на кшталт funcабо, functionчи decні.

Декларація функції

sum3(a,b,c) -> a + b + c.

Функція виклику

x = sum3(1,2,3).

Анонімна функція з назвою x

x = (a,b,c) -> a + b + c.
y = x(1,2,3).

Мені хотілося б знати, чому ключові слова важливі для успішної мови програмування?


8
Forth досить практичний, і в ньому немає ключових слів.
SK-логіка

4
@JamesAnderson, ні, це просто слова, такі ж, як і всі інші слова. Ніякого особливого значення не має.
SK-логіка

7
Чи вважають оператори та розділові знаки "ключовим словом"? якщо так, то жодної мови не може бути, оскільки не може бути визначений синтаксис.
Еміліо Гаравалья

2
@ SK-логіка: зазвичай. Але що таке "ідентифікатори", якщо ви ще не використовуєте токенізацію? Оскільки маркер - це "будь-яка впізнавана жала", "int", "myvalue" та "+", не відрізняються, перш ніж було задано правило синтаксису. Якщо "+" не визначено як оператор, це може бути просто назвою для речі, як і будь-якого іншого рядка з однозначним символом unicode. Оператори за чистою синтаксичною позицією - це не що інше, як "ключові слова з одним символом".
Еміліо Гаравалья

2
У цьому контексті що таке ключове слово? Це ідентифікатор, який має особливе значення для компілятора? Це ідентифікатор, який програміст не повинен використовувати як змінну чи щось таке? Чи вважається це ключовим словом, якщо ключові слова повинні бути спеціально призначені? (Довгий час тому я бачив систему ALGOL, де ключові слова потрібно було цитувати.)
Девід Торнлі

Відповіді:


12

MUMPS є дуже успішним, широко застосовується в страхуванні та охороні здоров'я і не має зарезервованих слів. Я б сказав, що вони допомагають з точки зору написання більш чіткого коду, але вони суворо не потрібні. APL - ще один приклад. APL бачить використання одноразових сценаріїв в ядерній промисловості серед інших. J , член сім'ї APL також не має ключових слів.

Ключові слова допомагають авторам-компіляторам легше реалізувати розбір. APL є відомим правильним асоціативом. Вони також сприяють зміцненню конвенцій та покращенню читабельності. APL не відомий тим, що він читає більшість з них.


2
+1 для "Ключові слова допомагають авторам-компіляторам легше реалізувати аналіз". Я думаю, що це майже все. Ключові слова були винайдені, щоб зменшити кількість контексту, який повинен зберігати аналізатор, коли весь компілятор плюс його робочий набір повинен був вміститися в десяток КБ оперативної пам’яті.
Йорг W Міттаг

2
Простіше написати парсер для APL, ніж майже будь-яку іншу мову! Врахуйте, що перша реалізація інтерпретатора APL була здійснена за допомогою транзисторів та діодів.
Джеймс Андерсон

2
Я думаю, що основна причина ключових слів полягає в тому, щоб людині було легше розбирати мову. Комп'ютери були б щасливішими, якби мова повністю складалася з чисел і бітових моделей, як і їх машинний код.
Джеймс Андерсон

6
Що APL не вистачає в ключових словах, це більше, ніж компенсує необхідність власного шрифту.
Blrfl

@Blrfl Це суть J, K та Q. Всі вони є в тій чи іншій мірі, APL в ASCII.
Світовий інженер

9

Одна відома мова без ключових слів - це Lisp. Найбільш близьким до ключових слів є так звані спеціальні форми - їх кількість може змінюватись в діалектах - які отримують особливе звернення від перекладача. Крім того, що вони не відрізняються від звичайних функцій за термінами їх використання, за винятком того, що їх неможливо переосмислити (принаймні, з мене знайомий Ліппс).

Це призводить до простого (але важко для батьків) синтаксису, і є однією з речей, які дозволили Lisp мати таку потужну макросистему. З іншого боку, про Ліса часто кажуть, що важко читати. APL і MUMPS, тим більше, я бачив, як описано як на півдорозі до Brainf * ck. Ключові слова допомагають у цьому відділі та полегшують читання коду і для нас, людей.

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


1
IIRC Lisp не має ключових слів. До спеціальних форм компілятор повинен звертатися спеціально, але їх назви є звичайними символами.
Ян Худек

2
Ключові слова - це особливість синтаксису, якого немає і у Ліспа. Я не думаю, що навіть має сенс говорити про ключові слова в Lisp, насправді.
Йорг W Міттаг

2
Я згоден з Йоргом. Я думаю, що можна говорити про ключові слова, коли мова має лексеми, які повинні бути чітко визначені як особливі, щоб їх відрізняти від лексем зі схожою структурою. Різні лексеми призводять до різних синтаксичних дерев. Наприклад, ifу C був би дійсний ідентифікатор, якби він не був визначений як спеціальний (ключове слово). Це означає, що ifне є ідентифікатором і if = 10дає синтаксичну помилку. Якщо я не помиляюся, мінімальний синтаксис Lisp не виділяються defunз f, x, yі +в (defun f (x y) (+ x y)).
Джорджіо

@Giorgio, зокрема if , дійсне ім’я змінної у Common Lisp (та інших Lisp-2) (defparameter if nil)нічого не порушить, і його можна використовувати у таких формах, як(unless if (setf if t))
tobyodavies

На цій же ноті, правда, (defun if ...)не вдасться. Взяв до уваги коментарі з коментарів і відредагував відповідь. Я можу погодитись, що спеціальні форми - це не ключові слова на тому ж рівні, як, наприклад, у С, все-таки вони є найближчим ділом, яке має Лісп.
scrwtp

8

TCL не має ключових слів, і лише 12 синтаксичних правил. в той час як його не так популярно, як це було раніше, він має свою нішу з очікуванням і вбудований в ECAD і маршрутизатори, тому це, безумовно, вважається практичним для мене.

Я також думаю, що це може показати, чому багато мов не йдуть цим маршрутом. Так, цілком можливо написати TCL-аналізатор (можливо, простіше, ніж багато інших мов), проте ви не можете написати дуже корисну граматику BNF для цієї мови, і багато людей, схоже, мають проблеми з вивченням мови. Я підозрюю, що це хоча б частково через відсутність ключових слів.


2
У цьому плані Tcl дуже схожий на Lisp, за винятком того, що замість "все - це список" у нього є "все є рядком". Список - це просто рядок з пробілом у ньому, а виклик процедури - це лише список, перший елемент інтерпретується як ім'я процедури, а решта інтерпретується як його аргументи. Це по суті Lis-S-вираз.
Йорг W Міттаг

так, вони обидва використовують польські позначення і є гомо-знаковими, тому мають досить схожу семантику
jk.

5

Комп'ютери зараз досить потужні, щоб можна було виводити значення з контексту.

Це означає, що ви хочете граматики, яка не є контекстною? Удачі.

Це не питання бути потужним чи ні. Існують вічні, незмінні правила щодо мов - математичні. Це та той факт, що мова програмування має бути синтаксично простим, змусять CFG управляти протягом кількох десятиліть.

До речі., У сискесі Haskell, як синтаксис, ти просто пишеш щось на кшталт

f x y = (x+1)*(y-1)

визначити функцію. Але зауважте, що "ключовим словом" у цьому випадку є "=". Якщо ви пропустите це, у аналізаторі відбудуться жахливі речі.

Але це момент, коли я погоджуюся з вами, я вважаю це набагато інтуїтивнішим, ніж усі ключові слова def, dcl, fun, fn, function чи що - не такі, що запроваджують функції іншими мовами.

Тим не менш, ця граматика може бути написана простим старим LALR (1), жодне значення тут не виводиться з контексту.


1
+1 для вирішення цього твердження (Комп'ютери зараз досить потужні, щоб можна було виводити значення з контексту). Я думаю, що причина, чому граматики CFG є кращими, полягає в тому, що вони дозволяють індуктивно визначати структуру програми. Я не бачу, чому б хотілося це змінити навіть за 100 років, можливо, мені просто бракує фантазії?
Джорджіо

2
CFG є досить мертвими та мертвими десятиліттями. JavaScript всередині HTML, навіть рядки формату C всередині C, навіть вкладені коментарі, скажімо, OCaml - все це не є контекстним. І чому ви хочете обмежитися таким довільним обраним формалізмом зараз, у епоху PEG та GLR?
SK-логіка

1
@Ingo, так, ти маєш рацію, неправильний вибір прикладу. Я мав на увазі змішану та розширювану граматики високого порядку, тобто не CFG.
SK-логіка

2
@ SK-логіка: Я не знаю, звідки у вас інформація про те, що CFG досить мертві. Я спілкувався з колишнім моїм колегою, який викладав конструктор компіляторів протягом останніх 20 років, і CFG, здається, далеко не мертвий.
Джорджіо

1
@Ingo: Наскільки я пам’ятаю, аспекти, що не стосуються CF, обробляються згодом шляхом семантичного аналізу дерева розбору. Наприклад, { int x = 0; x = "HELLO"; }слід створити дерево розбору, але коли компілятор шукає x у другому призначенні, він бачить, що він оголошений як int та видає помилку типу. Таким чином, програма відхиляється, навіть якщо її структура CF правильна.
Джорджіо

4

Наскільки я знаю, Smalltalk - це мова, яка має найменше ключових слів (якщо я не рахую таких мов, як Brainfuck). Smalltalk ключові слова true, false, nil, self, superі thisContext.

Я створив багаж, натхненний маленькими розмовами, у яких не було ключових слів. Але через деякий час його використання я закінчила додавати кілька ключових слів, переважно синтаксичного цукру.

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


Якщо Smalltalk мав підтримку передачі повідомлень із неявним приймачем, то, принаймні true, falseі це nilможна було б визначити як методи на цьому неявному приймачі, і, зважаючи на можливості відображення, інші три, ймовірно, також.
Йорг W Міттаг

1
Це не ключові слова, вони псевдозмінні. «Псевдо» , тому що true, falseі nilдобре відомі значення , що надаються середовищем і self, superі thisContextє змінними , ви не можете встановити , але значення яких змінюються в результаті виконання.
Френк Ширар

3

Ви, здається, працюєте за помилковим припущенням, що ключові слова є для полегшення компілятора. Хоча вони і полегшують компілятор, вони мають набагато важливішу перевагу: вони полегшують людину, яка читає код .

Так, ви можете переглядати купу контексту і зрозуміти, що ви дивитеся на декларацію функції чи змінну заяву, але залежно від контексту та складності коду, що займається, це може зайняти багато часу, щоб з'ясувати . Або там у вас може бути зручне ключове слово, як функція або var , і ви відразу знаєте, на що дивитесь.

Так, вони роблять код складнішим для запису , але враховуючи, що програми витрачають набагато більше часу на обслуговування, ніж на виробництво, і що їх код читається, налагоджується та підтримується набагато більше, ніж створено, намагаючись спроектувати вашу мову на полегшити писання замість легкого для читання є класичним випадком шкідливої ​​передчасної оптимізації.

Крім того, не нехтуйте концепціями, які полегшують роботу компілятора. Чим простіше розбирати, тим швидше буде компілюватися ваш код, а це означає, що цикли редагування-збирання-налагодження стають швидшими, а значить, ваша продуктивність зростає.

Якщо у вас є велика, складна база коду, це може означати нетривіальну різницю в продуктивності. Наприклад, там, де я працюю, у нас є програма, яка становить близько 4 мільйонів рядків Delphi. У нас є ще один модуль, який становить близько 300 000 рядків C ++. Їм обом потрібно приблизно однаковий проміжок часу для складання. (Близько 3 хвилин.) Якби у нас було 4 мільйони рядків С ++, на його побудову пішло б годину!


Всі чудові бали. +1

якби кожний іменник, дієслово, прислівник та прикметник у романі були позначені як такі, це зробило б ХОРОШО читати не простіше!

@JarrodRoberson: Звичайно, так, але код - це не роман. Природні мови сильно відрізняються від мов програмування. Природна мова розуміється інтуїтивно, тоді як мова програмування має формальну семантику. Методи, які використовуються для її читання та розуміння сенсу, дуже різні, і помилка намагатися зрівняти двох, як ви.
Мейсон Уілер

Я сказав, що письменник-компілятор відрізняється від компілятора . Компілятори стають швидшими на швидше обладнання, письменники-компілятори люди, ми не дотримуємося закону Мура!

основи коду, з якими я прагну працювати, на порядок більше, ніж у романів, більшість -> 1 000 000+ рядків коду, більшість найдовших романів - <2 000 000 слів ! І подібно до романів, які вони читають люди, насправді більше часу витрачається на читання коду, ніж на його написання! З огляду на кодову базу, яка становить> 10 років та 1 000 000+ рядків, кількість разів, яку вона читає розробникам за 10 років, що спочатку визначає час, необхідний для створення.

2

Є кілька рідкісних прикладів.

APL використовує лише символи - але їх дуже багато! Для використання мови потрібна спеціальна клавіатура.

Дивіться цю статтю у Вікіпедії

CORAL 66 - мав ключові слова, але розпізнавав їх лише у тому випадку, коли вони цитувались окремими цитатами.

PL / 1 також мав ключові слова - але ви також можете використовувати їх як назви змінних або процедур.

Загалом, хоча ваше запитання трохи схоже на запитання "чому розмовні мови мають слова?".


Просто додамо, що якщо вам подобається зовнішній вигляд APL, але ви не хочете купувати нову клавіатуру, то J - це лише річ.
АакашМ

0

Основна причина полягає в тому, що і людям, і комп'ютерам простіше розібратися. Розбір складної мови без ключових слів вимагає багатьох символів як синтаксису, і це було б масово і зайво заплутаним. Це набагато простіше читати, functionніж $!{}. І контекст не вирішує всіх неясностей.


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

1
@Jarrod Roberson: Леонардо да Вінчі: "Простота - це найвища витонченість", Антуан де Сент Екзюпері: "Здається, досконалості досягається не тоді, коли не залишається нічого додати, а коли немає нічого, що можна забрати".
Джорджіо

1
@Jarrod: Усі багатозначні виразні комп'ютерні мови є складними.
DeadMG

1
@DeadMG: Схема дуже проста і в той же час дуже виразна. На жаль, наскільки я знаю, йому не вистачає стандартизованої бібліотеки.
Джорджіо

Ерланг дуже виразний і не складний синтаксично. Я думаю, що всі функціональні мови виявляються більш виразними з менш зарезервованими ключовими словами.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.