Просто о сложном: как устроен компилятор

Просто о сложном: как устроен компилятор

Что вы знаете о компиляторе? У многих людей (и даже студенты соответствующих специальностей не являются исключением!) этот термин ассоциируется с какой-то сверхсложной компьютерной системой, разобраться с которой невозможно. Что уж говорить о разработке компилятора или его частей своими силами! А в действительности компилятор — это всего лишь компьютерная программа, и каждый, кто хорошо владеет языком программирования, способен написать свой собственный небольшой компилятор.

Прежде всего, стоит понять, что компилятор — это разновидность транслятора. Транслятором, в свою очередь, называют программу, которая переводит тексты с одного языка на другой. Наверняка транслятором пользовался каждый.

Компилятор — это особый вид транслятора, который переводит тексты с языка программирования высокого уровня (т. е. с того языка, которым пользуется программист при написании текста программы) на машинный язык (т. е. в машинный код, который понятен компьютеру).

Принцип работы компилятора

Принцип работы компилятора ничем не отличается от работы обычного транслятора. Что мы делаем, когда переводим текст, например, с незнакомого нам языка (например, итальянского) на русский?

Лексический анализ

Прежде всего, мы пытаемся найти в словаре все слова текста и выписать их значение. Если какое-то слово будет написано с ошибкой, то мы не найдем его в словаре. Так и компилятор. На первом этапе (он называется лексический анализ) компилятор проверяет правильность написания всех «слов» (лексем) в тексте программы. Если обнаруживается ошибка, то выдается соответствующее сообщение.

Синтаксический анализ

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

Читайте также:  Виртуальный DOM в React

Семантический анализ

После того, как мы выписали из словаря все слова, мы пытаемся связать их в предложения так, чтобы каждое предложение имело некоторый смысл. Если это нам не удается, мы возвращаемся к словарю и пытаемся обнаружить другое значение выписанных слов. Это этап семантического анализа. На этом заканчивается первая фаза перевода — аналитическая часть, посвященная изучению и анализу исходного текста.

Синтез, оптимизация и генерация машинного код

Когда нам удалось составить черновой вариант текста, мы пытаемся его оформить, базируясь на правилах русского языка, и выстраиваем фразы так, чтобы они были не только понятны читателю, но и отличались благозвучием. Таким образом, мы начинаем синтезировать новый текст, начинается вторая фаза перевода — синтез. Компилятор разбивает эту фазу на три этапа: синтез промежуточного кода, оптимизация и генерация машинного кода. Этап оптимизации необходим для того, чтобы уменьшить объем машинного кода, что позволит увеличить скорость работы программы. Следует отметить, что этап оптимизации реализован не во всех компиляторах. На выходе компилятор выдаст машинный код исходной программы, который будет понятен компьютеру.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Scroll to top