Хорошие API для анализаторов области
Я работаю над некоторыми инструментами генерации кода, и большая сложность связана с проведением анализа области видимости. Я часто чувствую, что хочу знать такие вещи, как
- Каковы свободные переменные функции или блока?
- Где объявлен этот символ?
- Что маскирует это объявление?
- Возможно ли такое использование символа перед инициализацией?
- Эта переменная потенциально экранирует?
и я думаю, что пришло время переосмыслить мою область видимости.
Я могу провести весь этот анализ, но я пытаюсь найти способ структурировать API-интерфейсы, чтобы его было легко использовать, а в идеале можно лениво выполнять достаточно работы.
С какими инструментами, подобными этим, люди знакомы, и что они делали правильно и неправильно в своих API?
1 ответ
Я немного удивлен этим вопросом, так как я выполнил тонны генерации кода, и редко возникает вопрос об области видимости (за исключением случая с желанием генерировать уникальные имена).
Чтобы ответить на ваши вопросы, приведенные в качестве примера, требуется серьезный анализ программы, выходящий далеко за рамки объема. Анализ побега сам по себе нетривиален. Использование перед инициализацией может быть тривиальным или нетривиальным в зависимости от целевого языка.
По моему опыту, API-интерфейсы для анализа программ сложны для разработки и часто зависят от языка. Если вы ориентируетесь на язык низкого уровня, вы можете извлечь что-то полезное из API Machine SUIF.
На вашем месте я бы соблазнил украсть чужие рамки для анализа программ. Джордж Некула и его ученики создали CIL, который, по-видимому, является текущим стандартом для анализа кода на языке Си. Группа Лори Хендрена создала несколько хороших инструментов для анализа Java.
Если бы мне приходилось работать самостоятельно, я бы меньше беспокоился об API и больше о действительно хорошем представлении деревьев абстрактного синтаксиса.
В очень ограниченной области анализа потоков данных (которая включает вопрос о неинициализированных переменных), Жоао Диас и я адаптировали несколько хороших работ Сорина Лернера, Дэвида Гроува и Крейга Чамберса. Только наши предварительные результаты публикуются.
Наконец, если вы хотите сгенерировать код на нескольких языках, это полная червь. Я сделал это плохо несколько раз. Если вы создаете что-то, что вам нравится, опубликуйте это!