Программирование: Что такое компилятор и зачем он нужен
Чтобы перевести код успешно, он должен быть написан по правилам, которые составляют синтаксис языков программирования. Компилятор не может исправить ваш код, ведь он лишь программа, которая следует строго определенным алгоритмам.
Что происходит, когда компилируется код?
Сложность компиляции зависит от синтаксиса языка программирования и от того, насколько сильно этот язык использует абстракции. Например, компилятор для C гораздо проще, чем для C++ или C#. Кстати, если вы, вдруг, плохо знаете английский язык, но вам нужно найти ответ на свой технический вопрос, то вам поможет сайт CodeRoad - вопросы/ответы по программированию. Здесь переводят на русский язык самые популярные вопросы со StackOverflow.
Лексический анализ
Сначала компилятор читает все символы исходного кода, затем создает описания для этих символов. Например, код на C++: int A = (B*C) + 15; может быть описан так:
• Тип «int»; значение «C»; равно; левая скобка; значение «A»; умножить; значение «B»; правая скобка; плюс; литерал «15».
Синтаксический анализ
Далее идет синтаксический анализ, который использует определенные грамматические правила и определяет, является ли ввод действительным или нет.
Если значения «B» и «C» были раннее объявлены и находятся в доступной области видимости, компилятор скажет:
• «B»: объявленный идентификатор.
Если переменные были объявлены, но им не присвоено значение, то компилятор выдаст предупреждение:
• Локальное значение «B» использовано без инициализации.
Не игнорируйте предупреждения компилятора. Ошибки, приводящие к возникновению предупреждений, могут сломать ваш код.
Один проход или два?
Некоторые языки имеют компиляторы, которые читают код только один раз. Pascal — один из таких языков. Другие требуют минимум двух проходов. Это происходит из-за того, что в них вы можете предварительно объявить классы и функции, но не описывать их.
Так, например, можно сделать в С++. Компилятору неизвестно, сколько памяти нужно классу, поэтому, когда он доходит до его описания, он компилирует тело класса, а потом перечитывает исходный код.
Генерация машинного кода
После успешных лексического и синтаксического анализов начинается финальная стадия — генерация машинного кода. Этот процесс еще более сложен на современных процессорах из-за многопоточности.
Скорость скомпилированного кода должна быть максимально возможной. Она может изменяться в зависимости от качества кода и его оптимизации.
Генерация кода — это сложно
Программисты, пишущие компилятор, сталкиваются с множеством проблем. Чтобы ускорить обработку кода они используют:
• Instruction pipelining
• Внутренний кэш
Если все инструкции цикла хранятся в кэше процессора, то цикл выполняет гораздо быстрее, чем когда инструкции приходится извлекать из оперативной памяти. Кэш центрального процессора — это блок памяти, встроенный в чип ЦП. Доступ к кэшу процессора осуществляется в разы быстрее, чем к ОЗУ.
Кэши и очереди
Большинство процессоров имеют функцию предварительной выборки очереди, когда процессор сначала переносит инструкции в кэш, а потом выполняет их. Многие процессоры имеют отдельные части для выполнения таких операций:
• Целочисленная арифметика (целые числа)
• Арифметика с числами с плавающей точкой (дробные числа)
Эти операции часто выполняются параллельно, чтобы ускорить работу кода.

Комментарии читателей Оставить комментарий