Страницы

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

четверг, 2 января 2020 г.

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

#java #компиляция



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


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


Ответы

Ответ 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] Дальнейшие фазы компиляции разобьют это на определения классов, функций, и операции, проверят соответствие имён, привяжут имена к объектам, проверят на осмысленность, проведут оптимизацию и скомпилируют в байт-код. Лексический анализ — самая простая фаза компиляции. Да, теоретически можно (а иногда и приходится) строить компиляторы, в которых лексический анализ по сути совмещён с последующими фазами компиляции. В принципе, ничто не заставляет выделять авторов компилятора отдельную фазу лексического анализа, но всё же это общепринятая практика.

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

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