иерархия chomsky и языки программирования

Я пытаюсь изучить некоторые аспекты Иерархии Chomsky, которые связаны с языками программирования, и я все еще должен прочитать Книгу Дракона.

Я считал, что большинство языков программирования может быть проанализировано как контекстно-свободная грамматика (CFG). С точки зрения вычислительной мощности это равняется той pushdown недетерминированного автомата.Я прав?

Если это верно, то, как CFG мог содержать грамматику без ограничений (UG), которая является завершенным Тьюрингом? Я спрашиваю, потому что, даже если языки программирования описаны CFGs, они на самом деле используются для описания машин Тьюринга, и таким образом, через UG.

Я думаю поэтому о по крайней мере двух разных уровнях вычислений, первое, которое является парсингом CFG, фокусируется на синтаксисе, связанном со структурой (представление?) языка, в то время как другое внимание на семантическое (смысл, интерпретация самих данных?) связанный с возможностями языка программирования, который является завершенным Тьюрингом. Снова, действительно ли эти предположения являются правильными?

15
задан Brian Tompsett - 汤莱恩 26 May 2015 в 09:49
поделиться

3 ответа

Я читал, что большинство языков программирования можно анализировать как контекстно-свободную грамматику (CFG). По вычислительной мощности он равен мощности недетерминированного автомата с выталкиванием вниз. Я прав?

Технически да. Полезно - нет.

Есть по крайней мере два полезных способа подумать над этими вопросами:

  • Если вы думаете о наборе строк, у вас есть язык .
  • Если вы думаете об алгоритме определения того, является ли строка языком или нет, у вас возникает проблема принятия решения .

Сложность состоит в том, что хотя большинство языков программирования имеют базовую структуру, которая легко описывается контекстно-свободной грамматикой (интересным исключением является Tcl), многие предложения, описываемые контекстно-свободной грамматикой, на самом деле не являются «на языке» , где под «на языке» я имею в виду «действующая программа на рассматриваемом языке». Эти лишние предложения обычно исключаются некоторой формой статической семантики . Например, следующее высказывание является предложением в контекстно-свободной грамматике программ C, но оно не входит в набор допустимых программ C:

int f(void) { return n + 1; }

Проблема здесь в том, что n не входит в область . C требует «объявления перед использованием», и это свойство не может быть выражено с помощью контекстно-свободной грамматики.

Типичная процедура принятия решения для реального языка программирования является частью внешнего интерфейса компилятора или интерпретатора и состоит как минимум из двух частей: первая, синтаксический анализатор , является эквивалент по мощности принятия решения автомату с опусканием вниз; но второй выполняет дополнительные проверки, которые исключают многие высказывания как недействительные. Если для этих проверок требуется какое-либо свойство определения перед использованием, они не могут быть выполнены автоматом выталкивания или контекстно-свободной грамматикой.

Если это правда, то как CFG может содержать неограниченную грамматику (UG), которая является полной по Тьюрингу?

CFG ничего не «хранит» - он просто описывает язык.

... даже если языки программирования описываются с помощью CFG, они фактически используются для описания машин Тьюринга, то есть с помощью UG.

Здесь вы пропускаете важные уровни косвенного обращения.

Я думаю, что это связано как минимум с двумя разными уровнями вычислений, первый, который представляет собой синтаксический анализ CFG, фокусируется на синтаксисе, связанном со структурой (представлением?) Языка, в то время как другой фокусируется на семантике ( смысл, интерпретация самих данных?), связанных с возможностями языка программирования, который является полным по Тьюрингу. Опять же, верны ли эти предположения?

Они кажутся мне немного запутанными, но вы на правильном пути. Ключевой вопрос: «В чем разница между языком и языком программирования ?») Ответ заключается в том, что язык программирования имеет вычислительную интерпретацию .Вычислительные интерпретации бывают множества прекрасных разновидностей, и не все из них являются полными по Тьюрингу. Но магия заключается в интерпретации, а не в синтаксисе, поэтому иерархия Хомского здесь не очень актуальна.

Чтобы доказать мою точку зрения, приведу крайний пример: обычный язык [1-9] [0-9] * является полным по Тьюрингу при следующей интерпретации:

  • Язык SK-комбинаторов полон по Тьюрингу.
  • Есть только счетное количество программ SK.
  • Их легко однозначно и детерминированно перечислить.
  • Следовательно, мы можем связать каждое положительное целое число с программой SK.
  • Если мы интерпретируем последовательность цифр как положительное целое число стандартным образом, мы можем одинаково хорошо интерпретировать ту же последовательность цифр, что и программа SK, и, более того, любая программа SK может быть выражена с помощью конечная последовательность цифр.

Следовательно, язык целочисленных литералов является полным по Тьюрингу.

Если у тебя сейчас голова не болит, значит, должна.

23
ответ дан 1 December 2019 в 02:54
поделиться

Очень хорошим примером языка, не имеющего CFG для синтаксиса, является C ++. Вы, кажется, не совсем понимаете УГ. Универсальная грамматика - это проблема интерпретации, описываемая как язык слов, содержащих код машины Тьюринга и слово, которое принимается этой машиной Тьюринга. Таким образом, вы кодируете не сам язык (набор слов), а машину Тьюринга. А теперь самое главное - у вас может быть язык, состоящий из бесконечного количества слов, но не может быть слова из бесконечного числа символов. Это означает, что UG также содержит конечные слова и, следовательно, все описания машин Тьюринга конечны. Таким образом, описание машины Тьюринга (программы на языке программирования) имеет конечное число символов (операторов), поэтому язык описаний (синтаксическая грамматика языка программирования) может быть даже регулярным. Взгляните, например, на Бинарную комбинаторную логику .

1
ответ дан 1 December 2019 в 02:54
поделиться

Это абсолютно неправда. Большинство языков программирования имеют синтаксис, который можно описать с помощью CFG или BNG, но соответствие синтаксису не гарантирует законной программы. Есть всевозможные дополнительные условия, такие как «переменные должны быть объявлены перед использованием» или «типы в этом выражении должны быть объединены законным способом», которые не охватываются грамматикой, и именно это делает языки неконтекстно-свободными. (Это немного похоже на XML, который имеет формально проверяемое определение, но обычно также имеет дополнительные ограничения, которые анализатор не может проверить.)

1
ответ дан 1 December 2019 в 02:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: