Вопрос

предыстория:- существуют формальные языки для выражения допустимой лексики и синтаксиса языка программирования - такие представления (напримеррегулярные выражения и контекстно-свободные грамматики) могут быть автоматически скомпилированы в анализаторы лексики / синтаксиса для некоторого языка программирования с использованием некоторых инструментов (напримерЛЕКС и YACC)

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

Примечания:- возможно, вы сочтете мой вопрос нереалистичным, ничего страшного… Я новичок в компиляторах?- под семантическим анализом я на самом деле подразумеваю сбор необходимой информации из исходного кода для следующих шагов оптимизации и генерации кода ... это должно включать проверку типов / границ ... и т. Д

я надеюсь, что я ясно выразился заранее большое спасибо

Это было полезно?

Решение

Существует множество схем для определения семантики языков программирования:денотационная семантика (которая отображает синтаксис в функции, вычисляющие состояние программы);операционная семантика (которая сводится к созданию интерпретаторов для вашего языка), трансформационная семантика (которая сводится к переводу вашего языка на другой язык, для которого уже существует некоторая другая семантика) и т.д.

Очень немногие из них в настоящее время приводят к системам, пригодным для реальных языков программирования.Один из других ответов здесь предполагает Centaur как систему, которая пытается это сделать.Семантика действия автор: Питер Мосс - одна из наиболее серьезных недавних попыток.

Для реальных систем в настоящее время наиболее эффективными являются более специальные методы.Они включают системы, в которых лексический и грамматический синтаксис может быть эффективно определен (как варианты LEX и YACC) и автоматически строить деревья.Атрибутивные грамматики допускают спецификацию вычислений по деревьям, которые позволяют определять некоторые виды анализа, такие как таблица символов построение или метрики (технически вы могли бы выполнить денотационную семантику таким образом).Большинство обычных языков (C, Java, C #, COBOL, ...) имеют относительно схожие структуры в отношении потока управления и потока данных, и, как следствие, можно создавать общие процедуры анализа потока чтобы позволить кому-то рассуждать о таких стандартных языках.

Наконец, вам нужна цель для вашего семантического анализа:какие факты именно вы хотите извлечь?Доступный статический анализ системы имеют гибридные методы, основанные на шаблонах / процедурном коде для сбора интересующих фактов синтаксиса, таблицы символов и потока для вычисления конкретных ответов на конкретные вопросы.

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

Одной из систем, которая следует более специальному подходу, описанному выше, является наша Инструментарий для Реинжиниринга программного обеспечения DMS, который также содержит общие семантические определения (синтаксис, таблицы символов, анализ потока данных), выполненные для реальных таких языков, как Java, C, C ++ и COBOL.DMS может применять преобразования от источника к источнику к ASTS, обусловленные различными процедурами сбора фактов, и это обеспечивает массовое преобразование кода надежным способом.

Другие советы

Существует множество формальных языков для программирования языковой семантики - посмотрите на запись в Википедии еще несколько терминов можно найти в Google.Я сделал небольшое количество Z в начале моей карьеры ( эта ссылка на formal methods wiki - еще одно возможное место для начала изучения ).Я бы предложил спросить на лямбда -предельный форум, поскольку люди там используют некоторые из них и могут подсказать, что использовать для любого варианта использования, который вы имеете в виду; этот документ кажется, это несколько связано с тем, что вы просили с точки зрения генерации компиляторов - для создания компилятора вам нужны как семантика языка, так и описание целевой машины.

Специально для статического анализа посмотрите на http://rw4.cs.uni-sb.de /~мартин/паг/

То, что вы описываете, - это именно то, о чем был проект Centaur:

http://www-sop.inria.fr/croap/centaur/centaur.html

На самом деле, вы могли бы очень далеко зайти в описании семантики вашего языка, вплоть до того момента, когда система смогла бы предоставить вам интерпретатор для этого языка (именно тогда вы полностью описали семантику).Но тебе не обязательно было идти до конца.Вы могли бы проделать меньше работы с описанием и при этом получить структурированный редактор и средство проверки типов за свои усилия.

Хотя работа над проектом прекратилась (насколько я могу судить), вы можете найти интересные статьи и скачать по ссылкам.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top