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

315
22 января 2017, 14:38

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

Что происходит в компиляторе с каждым из выделенных понятий? Что-то отсеивается или как-то видоизменяется?

Answer 1

Обычная практика при написании компилятора — разделение его на части. Традиционно, первая часть — лексический анализ, деление исходного текста на лексемы. Это означает, что код читается как последовательность символов, и представляется в виде последовательности токенов.

Токен состоит из типа токена и значения (упакованы в один класс).

При этом обычно пробелы (не являющиеся частью символьных/строковых литералов) отбрасываются, идентификаторы превращаются в токен типа «Идентификатор» со значением, равным строке с именем идентификатора. Литералы также превращаются в токены. Комментарии стадию лексического анализа обычно не проходят и просто отбрасываются. Разделители, наподобие скобок и знаков препинания, образуют каждый собственный тип токена. Ну и для ключевых слов тоже обычно выделяют по отдельному типу токена.

Пример:

Исходный текст

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]

Дальнейшие фазы компиляции разобьют это на определения классов, функций, и операции, проверят соответствие имён, привяжут имена к объектам, проверят на осмысленность, проведут оптимизацию и скомпилируют в байт-код.

Лексический анализ — самая простая фаза компиляции.

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

READ ALSO
Ограничена ли многомерность массива?

Ограничена ли многомерность массива?

Вот объявляется переменная двухмерного массива mas

322
Озвучить текст из TextView

Озвучить текст из TextView

Возможно ли озвучить текст который отображается в TextView?

284
Java. Как создать API для своей игры? [требует правки]

Java. Как создать API для своей игры? [требует правки]

У меня есть игры на JavaКак создать API, чтобы игроки могли создавать аддоны\моды? Его писать в саму игру или в отдельном проекте? Как его подключить...

339
Общие куки для всех браузеров selenium

Общие куки для всех браузеров selenium

Я создаю браузер, в котором логинюсь на сайте и считываю ссылки, для каждой ссылки мне нужно создать еще один браузер и при этом чтобы куки...

371