Есть несколько классов, которые сотрудничают в составлении метода (или выражения), и, учитывая ваш интерес к предмету, я испытываю соблазн еще больше стимулировать вас в их изучении и понимании.
Вообще говоря, основными классами являются Сканер, Парсер, Компилятор и Кодировщик. В зависимости от диалекта они могут иметь несколько разные имена и реализации, но основная идея остается той же.
Сканер анализирует поток символов исходного кода и создает поток токенов. Затем эти токены анализируются парсером, который преобразует их в узлы AST (абстрактного синтаксического дерева). Затем компилятор посещает узлы AST для их семантического анализа. Здесь классифицируются все узлы переменных: аргументы метода, временные библиотеки методов, общие, аргументы блоков, временные структуры блоков и т. Д. Именно во время этого анализа все переменные связываются в соответствующей области. На этом этапе AST больше не является «абстрактным», поскольку он был аннотирован с информацией о привязке. Наконец, узлы повторно посещаются, чтобы сгенерировать буквальный фрейм и байт-коды скомпилированного метода.
Конечно, есть много вещей, которые я опускаю из этого резюме (прагмы, замыкания блоков и т. Д.), Но, имея в виду эти основные идеи, теперь вы должны быть готовы к отладке очень простого примера. Например, начните с
Object compile: 'm ^3'
чтобы усвоить процесс.
После некоторого шага и повторения вы дойдете до первого интересного фрагмента кода, которым является метод OpalCompiler >> #compile
. Если убрать блоки обработки ошибок, эти методы говорят сами за себя:
compile
| cm |
ast := self parse.
self doSemanticAnalysis.
self callPlugins.
cm := ast generate: self compilationContext compiledMethodTrailer
^cm
Сначала у нас есть сообщение #parse
, в котором создаются узлы синтаксического анализа. Затем у нас есть семантический анализ, о котором я упоминал выше, и, наконец, #generate:
производит кодирование. Вам следует отладить каждый из этих методов, чтобы глубже понять процесс компиляции. Учитывая, что вы имеете дело с деревом, будьте готовы пройти через множество посетителей.
Когда вы познакомитесь с основными идеями, вы можете попробовать более сложные, но простые примеры, чтобы увидеть, как другие объекты выходят на сцену.
person
Leandro Caniglia
schedule
02.03.2018