Я искал практический язык программирования, у которого нет зарезервированных ключевых слов, но мне не повезло найти его.
Я работаю над языком программирования для своего собственного назидания и развлечения, и мне еще не нужно было включать какие-либо ключевые слова, вот что привело меня к поиску и к вопросу:
Я не считаю удобство для автора компилятора важным для конечного пользователя языка. В наши дни компьютеры достаточно мощны, чтобы иметь возможность выводить значения из контекста. При написании романа не более, чем писателю нужно помечать существительные, глаголы и тому подобное, почему программист должен маркировать функции и переменные с помощью 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).
Я хотел бы знать, почему ключевые слова так важны для успешного языка программирования?
Ответы:
MUMPS очень успешен, широко используется в страховании и здравоохранении и не имеет зарезервированных слов. Я бы сказал, что они помогают с точки зрения написания более понятного кода, но они не являются строго необходимыми. APL является еще одним примером. APL видит использование для одноразовых сценариев в ядерной промышленности среди других. J , член семейства APL, также не хватает ключевых слов.
Ключевые слова помогают авторам компилятора легче выполнять синтаксический анализ. APL отлично правая ассоциация. Они также помогают укрепить условные обозначения и улучшить читаемость. APL не очень хорошо читается большинством.
источник
Один из известных языков без ключевых слов - это Лисп. Самое близкое к ключевым словам это так называемые специальные формы - их число может варьироваться в зависимости от диалекта - которые получают особый подход от переводчика. Кроме того, они неотличимы от обычных функций с точки зрения того, как они используются, за исключением того, что они не могут быть переопределены (по крайней мере, в Лиспе, с которым я знаком).
Это приводит к простому (но непростому) синтаксису и является одной из вещей, которые позволили Лиспу иметь такую мощную систему макросов. С другой стороны, часто говорят, что Лисп трудно читать. APL и MUMPS, тем более, я видел, как оба описали как на полпути к Brainf * ck. Ключевые слова помогают в этом отделе и облегчают чтение кода для нас, людей.
Поэтому я бы не сказал, что ключевые слова необходимы для успешного языка, но они, безусловно, помогают языку стать успешным.
источник
if
в C был бы действительный идентификатор, если бы он не был определен как специальный (ключевое слово). Это означает, чтоif
это не идентификатор иif = 10
выдает синтаксическую ошибку. Если я не ошибаюсь, минимальный синтаксис Lisp не выделяютсяdefun
изf
,x
,y
и+
в(defun f (x y) (+ x y))
.if
является допустимым именем переменной в Common Lisp (и других Lisp-2)(defparameter if nil)
, ничего не сломает, и его можно использовать в таких формах, как(unless if (setf if t))
(defun if ...)
получится. Принимал заметки из комментариев к учету и редактировал ответ. Я могу согласиться с тем, что специальные формы не являются ключевыми словами на том же уровне, что и в C, например, тем не менее, они наиболее близки к Lisp.TCL не имеет ключевых слов, и в действительности только 12 правил синтаксиса. хотя он не так популярен, как раньше, он имеет свою нишу с ожиданиями и встроен в ECAD и маршрутизаторы, поэтому, на мой взгляд, он считается практичным.
Я также думаю, что это может показать, почему многие языки не идут по этому пути. Да, вполне возможно написать синтаксический анализатор TCL (возможно, проще, чем многие другие языки), однако вы не можете написать очень полезную грамматику BNF для языка, и многие люди, кажется, испытывают проблемы с изучением языка. Я подозреваю, что это хотя бы частично из-за отсутствия ключевых слов.
источник
Означает ли это, что вам нужна грамматика, не зависящая от контекста? Удачи.
Вопрос не в том, могущественен он или нет. Есть вечные, неизменные правила о языках - математические. Это и тот факт, что язык программирования должен быть синтаксически легким, заставят CFG управлять в течение нескольких десятилетий.
Кстати, в Haskell, как синтаксис, вы просто пишете что-то вроде
определить функцию. Но обратите внимание, что «ключевое слово» в этом случае - «=». Если вы пропустите это, в парсере произойдут ужасные вещи.
Но это тот момент, когда я согласен с вами, я нахожу это гораздо более интуитивным, чем все ключевые слова def, dcl, fun, fn, function или what-not, которые вводят функции в других языках.
Тем не менее, эта грамматика может быть написана простым старым LALR (1), здесь нет никакого значения, «выведенного из контекста».
источник
{ int x = 0; x = "HELLO"; }
должно генерироваться дерево разбора, но когда компилятор ищет x во втором присваивании, он видит, что оно было объявлено как int, и выдает ошибку типа. Таким образом, программа отклоняется, даже если ее структура CF правильная.Насколько я знаю, Smalltalk - это язык с наименьшим количеством ключевых слов (если я не считаю такие языки, как Brainfuck). Smalltalk ключевые слова
true
,false
,nil
,self
,super
иthisContext
.Я разработал язык, вдохновленный smalltalk, в котором не было ключевых слов. Но после некоторого времени использования я добавил несколько ключевых слов, в основном для синтаксического сахара.
Итак, я считаю, что язык без ключевых слов возможен, но он не очень практичен, и именно поэтому все популярные языки имеют ключевые слова.
источник
true
,false
иnil
мог бы быть определен как методы для этого неявного получателя, и, учитывая возможности отражения, возможно, что остальные три также.true
,false
иnil
являются общеизвестными значениями, предоставленными средой иself
,super
иthisContext
являются переменными, которые вы не можете установить, но чьи значения изменяются в результате выполнения.Похоже, вы работаете с ложным предположением, что ключевые слова существуют, чтобы упростить компилятору работу. Хотя они действительно упрощают компиляцию, они имеют гораздо более важное преимущество: они облегчают работу человека, читающего код .
Да, вы могли бы взглянуть на кучу контекста и понять, что вы смотрите на объявление функции или объявление переменной, но в зависимости от контекста и сложности используемого кода, это может занять много времени, чтобы выяснить, , Или у вас может быть удобное ключевое слово, например, функция или переменная , и вы сразу узнаете, на что обращаете внимание.
Да, они делают код более сложным для написания , но, учитывая, что программы тратят гораздо больше времени на обслуживание, чем на производство, и что их код читается, отлаживается и обслуживается намного больше, чем он создается, пытаясь спроектировать ваш язык так, чтобы облегчить написание, а не на прочтение - классический случай вредной преждевременной оптимизации.
Кроме того, не пренебрегайте концепциями, которые облегчают работу компилятора. Чем проще разобрать, тем быстрее будет компилироваться ваш код, что означает, что циклы edit-build-debug становятся быстрее, а значит, ваша производительность повышается.
Если у вас большая и сложная кодовая база, это может привести к нетривиальной разнице в производительности. Например, там, где я работаю, у нас есть работающая программа, которая насчитывает около 4 миллионов строк Delphi. У нас есть еще один модуль, который содержит около 300 000 строк C ++. Они оба занимают примерно одинаковое время для компиляции. (Около 3 минут.) Если бы у нас было 4 миллиона строк C ++, сборка могла бы занять час!
источник
Есть несколько редких примеров.
APL использует только символы - но их много! Вам нужна специальная клавиатура, чтобы использовать язык.
Смотрите эту статью в Википедии
CORAL 66 - имел ключевые слова, но распознавал их, только если они были заключены в одинарные кавычки.
В PL / 1 также были ключевые слова, но вы также можете использовать их в качестве имен переменных или процедур.
В целом, хотя ваш вопрос немного напоминает вопрос: «Почему в разговорных языках есть слова?».
источник
Основная причина в том, что и людям, и компьютерам легче разбирать. Устранение неоднозначности сложного языка без ключевых слов потребовало бы много символов в качестве синтаксиса, и это было бы массово и излишне запутанно. Это намного легче читать,
function
чем$!{}
. И контекст не решает всех двусмысленностей.источник