Страницы

Поиск по вопросам

суббота, 20 апреля 2019 г.

Что происходит в компиляторе?

Исходный текст программ на Java состоит из совокупности пробелов, идентификаторов, литералов, комментариев, операторов, разделителей и ключевых слов.
Что происходит в компиляторе с каждым из выделенных понятий? Что-то отсеивается или как-то видоизменяется?


Ответ

Обычная практика при написании компилятора — разделение его на части. Традиционно, первая часть — лексический анализ, деление исходного текста на лексемы. Это означает, что код читается как последовательность символов, и представляется в виде последовательности токенов
Токен состоит из типа токена и значения (упакованы в один класс).
При этом обычно пробелы (не являющиеся частью символьных/строковых литералов) отбрасываются, идентификаторы превращаются в токен типа «Идентификатор» со значением, равным строке с именем идентификатора. Литералы также превращаются в токены. Комментарии стадию лексического анализа обычно не проходят и просто отбрасываются. Разделители, наподобие скобок и знаков препинания, образуют каждый собственный тип токена. Ну и для ключевых слов тоже обычно выделяют по отдельному типу токена.
Пример:
Исходный текст
public class Example { // пример public static void main(String[] args) { System.out.println(/* этот текст будет напечатан*/"hello world"); } }
производит такую последовательность лексических токенов:
[public-keyword] [class-keyword] [ident "Example"] [separator-left-brace] [public-keyword] [static-keyword] [void-keyword] [ident "main"] [separator-left-paren] [ident "String"] [separator-left-brack] [separator-right-brack] [ident "args"] [separator-right-paren] [separator-left-brace] [ident "System"] [separator-dot] [ident "out"] [separator-dot] [ident "println"] [separator-left-paren] [string-literal "hello world"] [separator-right-paren] [separator-semicolon] [separator-right-brace] [separator-right-brace]
Дальнейшие фазы компиляции разобьют это на определения классов, функций, и операции, проверят соответствие имён, привяжут имена к объектам, проверят на осмысленность, проведут оптимизацию и скомпилируют в байт-код.
Лексический анализ — самая простая фаза компиляции.

Да, теоретически можно (а иногда и приходится) строить компиляторы, в которых лексический анализ по сути совмещён с последующими фазами компиляции. В принципе, ничто не заставляет выделять авторов компилятора отдельную фазу лексического анализа, но всё же это общепринятая практика.

Комментариев нет:

Отправить комментарий