йерархия на Чомски и езици за програмиране

Опитвам се да науча някои аспекти на йерархията на Чомски, които са свързани с езиците за програмиране, и все още трябва да прочета Книгата на дракона.

Четох, че повечето езици за програмиране могат да бъдат анализирани като граматика без контекст (CFG). По отношение на изчислителната мощност той се равнява на този на недетерминиран автомат с натискане надолу. Прав ли съм?

Ако е вярно, тогава как може CFG да съдържа неограничена граматика (UG), която е завършена по Тюринг? Питам, защото дори езиците за програмиране да са описани от CFG, те всъщност се използват за описание на машини на Тюринг и така чрез UG.

Мисля, че това се дължи на най-малко две различни нива на изчисление, първото, което е парсването на CFG, се фокусира върху синтаксиса, свързан със структурата (представяне?) на езика, докато другото се фокусира върху семантиката ( смисъл, интерпретация на самите данни?), свързани с възможностите на езика за програмиране, който е завършен. Отново, верни ли са тези предположения?




Отговори (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 програма може да бъде изразена с помощта на краен последователност от цифри.

Следователно езикът на целочислените литерали е пълен по Тюринг.

Ако сега не те боли главата, трябва.

person Norman Ramsey    schedule 01.06.2010
comment
За информация, вие можете да направите BNF за Tcl. Просто е по-малко информативен, отколкото в повечето езици, защото обичайните рекурсивни термини (if, while, програмни блокове като цяло) са дефинирани изцяло на семантично ниво. Тоест, те са стандартни библиотечни функции, нищо повече. (Обратната страна на това е, че е наистина лесно да се вграждат чужди синтаксиси в Tcl програми, при условие че са балансирани в скоби. На практика всичко е...) - person Donal Fellows; 01.06.2010
comment
@Donal: Да, освен че всяка програма може динамично да добавя произволни нови продукции към граматиката. Наличието на анализатор не е много полезно на практика --- не можете наистина да анализирате Tcl програма --- и Tcl няма много анализатор. Но вграждането на странности е наистина много, много много лесно. - person Norman Ramsey; 01.06.2010
comment
Много благодаря ! Това беше отговорът, който търсех. Не съм сигурен, че всичко е ясно, но е по-ясно. И мисля, че разбрах смисъла, магията е в интерпретацията, не в синтаксиса. - person dader; 01.06.2010
comment
Добре, вече всичко е ясно. SK-комбинаторните програми, преобразувани в цели числа, са толкова мощен пример, предполагам, че това е повече или по-малко номериране на Godel. благодаря ти Рамзи! - person dader; 16.02.2014
comment
Ключов въпрос е каква е разликата между език и език за програмиране? Отговорът е, че езикът за програмиране има изчислителна интерпретация. -- Това е мнението на лингвистите за езика, но е погрешно. Изреченията на говорим език не генерират просто дърво за анализ или структура от данни. Те имат изчислителна интерпретация, иначе не биха имали ефект върху слушателите си. Това очевидно е вярно за императивите. - person Phil Goetz; 12.06.2015
comment
Няма BNF за Perl, защото той умишлено е проектиран да бъде чувствителен към контекста. Всъщност има части от кода на компилатора (като за интерпретиране на оператора smartmatch и нотация на косвен обект), които се опитват да отгатнат какво иска програмистът. За съжаление това не дава на езика повече изчислителна мощ; просто го прави по-труден за използване. - person Phil Goetz; 12.06.2015

Това абсолютно не е вярно. Повечето езици за програмиране имат синтаксис, който може да бъде описан от CFG или BNG, но спазването на синтаксиса не гарантира законна програма. Има всякакви допълнителни условия като "променливите трябва да бъдат декларирани преди употреба" или "типовете в този израз трябва да бъдат комбинирани по законен начин", които не са обхванати от граматиката, и това е какво прави езиците безконтекстни. (Това е малко като XML, който има формално проверима дефиниция, но обикновено също и допълнителни ограничения, които анализаторът не може да провери.)

person Kilian Foth    schedule 28.05.2010

Много добър пример за език, който няма CFG за своя синтаксис, е C++. Изглежда не разбирате точно UG. Универсалната граматика е проблем на интерпретацията, описан като език на думи, които съдържат код за машина на Тюринг и дума, която се приема от тази машина на Тюринг. Така че вие ​​не кодирате самия език (набор от думи), а машината на Тюринг за него. Сега идва моментът - можете да имате език от безкрайни думи, но не можете да имате дума от безкрайни символи. Това означава, че UG също съдържа крайни думи и следователно всички описания на машините на Тюринг са крайни. Следователно описанието на машината на Тюринг (програма на език за програмиране) има краен брой символи (изявления), така че езикът на описанията (граматиката на синтаксиса на езика за програмиране) може да бъде дори правилен. Вижте например Двоичната комбинаторна логика.

person Gabriel Ščerbák    schedule 30.05.2010