Контекстно чутливі граматики та типи


25

1) Який, якщо такий є, зв’язок між статичним набором тексту та формальними граматиками?

2) Зокрема, чи вдасться лінійно обмеженим автоматом перевірити, чи правильно було набрано програму C ++ або SML? Вкладений автомат стеків?

3) Чи існує природний спосіб виразити статичні правила набору тексту у формальній граматиці?

Відповіді:


20

Для лінійно обмежених автоматів неможливо перевірити, чи є програми C ++, і навряд чи можливо для LBA перевірити, чи добре набрані програми SML. C ++ має систему типу Тюрінга, оскільки ви можете кодувати довільні програми як шаблонні метапрограми.

SML цікавіше. У нього є рішуча перевірка типу, але проблема є EXPTIME-завершеною. Отже, навряд чи LBA зможе це перевірити, якщо тільки в ієрархії складності не буде дуже дивного колапсу. Причиною цього є те, що для SML необхідний висновок про тип, і є сім'ї програм, розмір яких тип зростає набагато швидше, ніж розмір програми. Як приклад, розглянемо таку програму:

fun delta x = (x, x)        (* this has type 'a -> ('a * 'a), so its return value
                               has a type double the size of its argument *)

fun f1 x = delta (delta x)  (* Now we use functions to iterate this process *)
fun f2 x = f1 (f1 x)        
fun f3 x = f2 (f2 x)        (* This function has a HUGE type *)

Для легших систем типу, таких як C або Pascal, я вважаю, що LBA може це перевірити.

У перші дні досліджень мов програмування люди іноді використовували граматики ван Вінгардена (також дворівневі граматики) для визначення типів систем для мов програмування. Я вважаю, Algol 68 був визначений таким чином. Однак, як мені кажуть, ця техніка була відмовлена ​​з по суті прагматичних причин: людям виявилося досить складно писати граматики, які вказували, що вони думають, що вони конкретизували! (Зазвичай, граматики, які люди писали, створювали більші мови, ніж вони планували.)

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

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


4

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

Я знаю, що основні генератори компіляторів допускають довільні предикати для правил, які не дозволяють виконувати правило, якщо предикат не оцінює true, наприклад { type(e1) == type(e2) } (expression e1) '+' (expression e2). Це поняття легко формалізувати; відповідні обмеження щодо дозволених предикатів можуть призвести до визначуваності LBA.

кк+1

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