Для линейных ограниченных автоматов невозможно проверить, являются ли программы на 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 может проверить это.
В первые дни исследования языков программирования люди иногда использовали грамматики Ван Вингардена (или двухуровневые грамматики) для определения систем типов для языков программирования. Я считаю, что Алгол 68 был указан таким образом. Тем не менее, мне сказали, что от этой техники отказались по существу по прагматическим причинам: людям оказалось довольно сложно писать грамматики, в которых указывалось, что, по их мнению, они указывали! (Как правило, написанные грамматики генерируют языки большего размера, чем предполагалось.)
В наши дни люди используют правила схематического вывода для определения систем типов, что по сути является способом указания предикатов в качестве наименее фиксированной точки совокупности предложений Хорна. Удовлетворенность для теорий Рога первого порядка вообще неразрешима, поэтому, если вы хотите охватить все, что делают теоретики типов, то любой выбранный вами грамматический формализм будет сильнее, чем это действительно удобно.
Я знаю, что была проделана определенная работа по использованию грамматик атрибутов для реализации систем типов. Они утверждают, что для этого выбора есть некоторые преимущества разработки программного обеспечения: а именно, грамматики атрибутов очень строго управляют потоком информации, и мне сказали, что это облегчает понимание программы.