0 added
0 removed
Original
2026-01-01
Modified
2026-02-26
1
<p>В этом гайде вы узнаете о том, что такое компилятор и как он работает. Мы разберем этапы компиляции и от чего зависит выбор подходящего компилятора. Этот материал поможет лучше понять, как компьютер выполняет программный код и почему иногда код не компилируется.</p>
1
<p>В этом гайде вы узнаете о том, что такое компилятор и как он работает. Мы разберем этапы компиляции и от чего зависит выбор подходящего компилятора. Этот материал поможет лучше понять, как компьютер выполняет программный код и почему иногда код не компилируется.</p>
2
<h2>Содержание</h2>
2
<h2>Содержание</h2>
3
<ul><li><a>Зачем нужен компилятор?</a></li>
3
<ul><li><a>Зачем нужен компилятор?</a></li>
4
<li><a>Как работает компилятор?</a></li>
4
<li><a>Как работает компилятор?</a></li>
5
<li><a>На чем написан компилятор?</a></li>
5
<li><a>На чем написан компилятор?</a></li>
6
<li><a>Какие бывают компиляторы?</a></li>
6
<li><a>Какие бывают компиляторы?</a></li>
7
<li><a>Какие ошибки может определить компилятор?</a></li>
7
<li><a>Какие ошибки может определить компилятор?</a></li>
8
<li><a>Выводы и рекомендации</a></li>
8
<li><a>Выводы и рекомендации</a></li>
9
<li><a>Частые вопросы</a></li>
9
<li><a>Частые вопросы</a></li>
10
<li><a>Дополнительные материалы</a></li>
10
<li><a>Дополнительные материалы</a></li>
11
</ul><h2>Зачем нужен компилятор?</h2>
11
</ul><h2>Зачем нужен компилятор?</h2>
12
<p>Процессор - самая важная часть компьютера. Он обрабатывает информацию, выполняет команды пользователя и следит за работой всех подключенных устройств. Но процессор может разобрать только машинный код - набор 0 и 1, которые записаны в определённом порядке.</p>
12
<p>Процессор - самая важная часть компьютера. Он обрабатывает информацию, выполняет команды пользователя и следит за работой всех подключенных устройств. Но процессор может разобрать только машинный код - набор 0 и 1, которые записаны в определённом порядке.</p>
13
<p>Почему именно 0 и 1? В процессор поступают электрические сигналы. Сильный сигнал обозначается цифрой 1, а слабый - 0. Набор таких цифр обозначает какую-то команду. Процессор ее распознает и выполняет.</p>
13
<p>Почему именно 0 и 1? В процессор поступают электрические сигналы. Сильный сигнал обозначается цифрой 1, а слабый - 0. Набор таких цифр обозначает какую-то команду. Процессор ее распознает и выполняет.</p>
14
<p>Программы для первых компьютеров выглядели как огромные наборы 0 и 1. Чтобы записать такую программу, инженеры пользовались гибкими картонными карточками - перфокартами. Цифры на перфокарте записывались поочередно, в несколько строк. Чтобы записать 1, программист делал отверстие в карте. Места без отверстия обозначали 0.</p>
14
<p>Программы для первых компьютеров выглядели как огромные наборы 0 и 1. Чтобы записать такую программу, инженеры пользовались гибкими картонными карточками - перфокартами. Цифры на перфокарте записывались поочередно, в несколько строк. Чтобы записать 1, программист делал отверстие в карте. Места без отверстия обозначали 0.</p>
15
<p>Компьютер считывал перфокарту специальным устройством и выполнял записанную команду. Для одной программы составляли сотни перфокарт.</p>
15
<p>Компьютер считывал перфокарту специальным устройством и выполнял записанную команду. Для одной программы составляли сотни перфокарт.</p>
16
<p>Писать их было долго и сложно, поэтому инженеры стали создавать языки программирования, обозначая команды словами и знаками. Для того, чтобы процессор понимал, какие команды записаны в программе, программисты создали<strong>компилятор</strong>- программу, которая преобразует программный код в машинный.</p>
16
<p>Писать их было долго и сложно, поэтому инженеры стали создавать языки программирования, обозначая команды словами и знаками. Для того, чтобы процессор понимал, какие команды записаны в программе, программисты создали<strong>компилятор</strong>- программу, которая преобразует программный код в машинный.</p>
17
<h2>Как работает компилятор?</h2>
17
<h2>Как работает компилятор?</h2>
18
<p>Преобразование программного кода в машинный называется<em>компиляцией</em>. Компиляция только преобразует код. Она не запускает его на исполнение. В этот момент он "статически" (то есть без запуска) транслируется в машинный код. Это сложный процесс, в котором сначала текст программы разбирается на части и анализируется, а затем генерируется код, понятный процессору.</p>
18
<p>Преобразование программного кода в машинный называется<em>компиляцией</em>. Компиляция только преобразует код. Она не запускает его на исполнение. В этот момент он "статически" (то есть без запуска) транслируется в машинный код. Это сложный процесс, в котором сначала текст программы разбирается на части и анализируется, а затем генерируется код, понятный процессору.</p>
19
<p>Разберём этапы компиляции на примере вычисления периметра прямоугольника:</p>
19
<p>Разберём этапы компиляции на примере вычисления периметра прямоугольника:</p>
20
<p>После запуска программы компилятору нужно определить, какие команды в ней записаны. Сначала компилятор разделяет программу на слова и знаки -<em>токены</em>, и записывает их в список. Такой процесс называется<strong>лексическим анализом</strong>. Его главная задача - получить токены.</p>
20
<p>После запуска программы компилятору нужно определить, какие команды в ней записаны. Сначала компилятор разделяет программу на слова и знаки -<em>токены</em>, и записывает их в список. Такой процесс называется<strong>лексическим анализом</strong>. Его главная задача - получить токены.</p>
21
<p>Затем компилятор читает список и ищет токен-операторы. Это могут быть оператор присваивания(=), арифметические операторы(+,-,*,/), оператор вывода(printf()) и другие операторы языка программирования. Такие операторы работают с числами, текстом и переменными.</p>
21
<p>Затем компилятор читает список и ищет токен-операторы. Это могут быть оператор присваивания(=), арифметические операторы(+,-,*,/), оператор вывода(printf()) и другие операторы языка программирования. Такие операторы работают с числами, текстом и переменными.</p>
22
<p>Компилятор должен понять, какие токены в списке связаны с токен-оператором. Чтобы сделать это правильно, для каждого оператора строится специальная структура -<strong>логическое дерево</strong>или<strong>дерево разбора</strong>.</p>
22
<p>Компилятор должен понять, какие токены в списке связаны с токен-оператором. Чтобы сделать это правильно, для каждого оператора строится специальная структура -<strong>логическое дерево</strong>или<strong>дерево разбора</strong>.</p>
23
<p>Так операция P = 2*(a + b) будет преобразована в логическое дерево:</p>
23
<p>Так операция P = 2*(a + b) будет преобразована в логическое дерево:</p>
24
<p>Теперь каждое дерево нужно разобрать на команды, и каждую команду преобразовать в<strong>машинный код</strong>. Компилятор начинает читать дерево снизу вверх и составляет список команд:</p>
24
<p>Теперь каждое дерево нужно разобрать на команды, и каждую команду преобразовать в<strong>машинный код</strong>. Компилятор начинает читать дерево снизу вверх и составляет список команд:</p>
25
<ul><li>Взять переменную a, взять переменную b, сложить их</li>
25
<ul><li>Взять переменную a, взять переменную b, сложить их</li>
26
<li>Взять результат сложения, взять число 2 и найти их произведение</li>
26
<li>Взять результат сложения, взять число 2 и найти их произведение</li>
27
<li>Результат произведения присвоить (записать) в переменную P</li>
27
<li>Результат произведения присвоить (записать) в переменную P</li>
28
</ul><p>Компилятор еще раз проверяет команды, находит ошибки и старается улучшить код. При успешном завершении этого этапа, компилятор переводит каждую команду в набор 0 и 1. Наборы записываются в файл, который сможет прочитать и выполнить процессор.</p>
28
</ul><p>Компилятор еще раз проверяет команды, находит ошибки и старается улучшить код. При успешном завершении этого этапа, компилятор переводит каждую команду в набор 0 и 1. Наборы записываются в файл, который сможет прочитать и выполнить процессор.</p>
29
<h2>На чем написан компилятор?</h2>
29
<h2>На чем написан компилятор?</h2>
30
<p>В 1950-е годы группа разработчиков IBM под руководством Джона Бэкуса разработала первый высокоуровневый язык программирования<a>Fortran</a>, который позволил писать программы на понятном человеку языке. Помимо языка, инженеры работали и над компилятором. Он представлял собой программу с набором исполняемых команд, которая могла компилировать другие программы на Fortran, в том числе и улучшенную версию себя.</p>
30
<p>В 1950-е годы группа разработчиков IBM под руководством Джона Бэкуса разработала первый высокоуровневый язык программирования<a>Fortran</a>, который позволил писать программы на понятном человеку языке. Помимо языка, инженеры работали и над компилятором. Он представлял собой программу с набором исполняемых команд, которая могла компилировать другие программы на Fortran, в том числе и улучшенную версию себя.</p>
31
<p>В дальнейшем язык Fortran и его компилятор использовали, чтобы написать компиляторы для новых языков программирования. Такой подход используют программисты и в настоящее время. Писать машинный код долго и неудобно. К тому же, для современных процессоров он может отличаться. Придется писать несколько версий одного и того же компилятора для разных компьютеров. Быстрее и проще написать компилятор на существующем языке программирования. Для этого разработчики выбирают удобный язык и пишут на нем первую версию своего компилятора. Он будет более универсальным для компьютеров и легко скомпилирует улучшенную версию себя.</p>
31
<p>В дальнейшем язык Fortran и его компилятор использовали, чтобы написать компиляторы для новых языков программирования. Такой подход используют программисты и в настоящее время. Писать машинный код долго и неудобно. К тому же, для современных процессоров он может отличаться. Придется писать несколько версий одного и того же компилятора для разных компьютеров. Быстрее и проще написать компилятор на существующем языке программирования. Для этого разработчики выбирают удобный язык и пишут на нем первую версию своего компилятора. Он будет более универсальным для компьютеров и легко скомпилирует улучшенную версию себя.</p>
32
<h2>Какие бывают компиляторы?</h2>
32
<h2>Какие бывают компиляторы?</h2>
33
<p>Ни один компилируемый язык программирования не обходится без компилятора. Некоторые компиляторы работают с несколькими языками программирования. Но программист должен учитывать еще и параметры компьютера, на котором программа будет запускаться.</p>
33
<p>Ни один компилируемый язык программирования не обходится без компилятора. Некоторые компиляторы работают с несколькими языками программирования. Но программист должен учитывать еще и параметры компьютера, на котором программа будет запускаться.</p>
34
<p>Дело в том, что современные процессоры отличаются друг от друга устройством, поэтому машинный код для одного процессора будет понятен, а для другого нет. Это касается и операционных систем: одна и та же программа будет работать на Windows, но не запустится на Linux или MacOS. Поэтому нужно пользоваться тем компилятором, который работает с нужным процессором и операционной системой.</p>
34
<p>Дело в том, что современные процессоры отличаются друг от друга устройством, поэтому машинный код для одного процессора будет понятен, а для другого нет. Это касается и операционных систем: одна и та же программа будет работать на Windows, но не запустится на Linux или MacOS. Поэтому нужно пользоваться тем компилятором, который работает с нужным процессором и операционной системой.</p>
35
<p>Если программа будет работать на нескольких операционных системах, то нужен кросс-компилятор - компилятор, который преобразует универсальный машинный код. Например, GNU Compiler Collection(сокращенно GCC) поддерживает C++, Objective-C, Java, Фортран, Ada, Go и поддерживает разную архитектуру процессоров.</p>
35
<p>Если программа будет работать на нескольких операционных системах, то нужен кросс-компилятор - компилятор, который преобразует универсальный машинный код. Например, GNU Compiler Collection(сокращенно GCC) поддерживает C++, Objective-C, Java, Фортран, Ada, Go и поддерживает разную архитектуру процессоров.</p>
36
<p>Начинающие программисты даже не знают о наличии компилятора на компьютере. Они пишут программы в интегрированной среде разработки, в которую встроен компилятор, а иногда и не один. В этом случае, выбор компилятора делает среда, а не программист. Например, MS Visual Studio поддерживает компиляторы для операционных систем Windows, Linux, Android. Выбирая тип проекта, Visual Studio определяет процессор и операционную систему компьютера, и после этого выбирает подходящий компилятор.</p>
36
<p>Начинающие программисты даже не знают о наличии компилятора на компьютере. Они пишут программы в интегрированной среде разработки, в которую встроен компилятор, а иногда и не один. В этом случае, выбор компилятора делает среда, а не программист. Например, MS Visual Studio поддерживает компиляторы для операционных систем Windows, Linux, Android. Выбирая тип проекта, Visual Studio определяет процессор и операционную систему компьютера, и после этого выбирает подходящий компилятор.</p>
37
<h2>Какие ошибки может определить компилятор?</h2>
37
<h2>Какие ошибки может определить компилятор?</h2>
38
<p>Когда компилятор анализирует текст программы, он проверяет, соответствует ли запись оператора стандартам языка. Если найдено несоответствие, то компилятор выводит об этом информацию пользователю в виде<em>ошибки</em>. Когда вся программа разобрана, пользователь видит список ошибок, которые есть в коде, и может их исправить. Пока программист не исправит ошибки, компилятор не перейдет к следующему этапу - генерации машинного кода для процессора. Чаще всего компилятор показывает пользователю:</p>
38
<p>Когда компилятор анализирует текст программы, он проверяет, соответствует ли запись оператора стандартам языка. Если найдено несоответствие, то компилятор выводит об этом информацию пользователю в виде<em>ошибки</em>. Когда вся программа разобрана, пользователь видит список ошибок, которые есть в коде, и может их исправить. Пока программист не исправит ошибки, компилятор не перейдет к следующему этапу - генерации машинного кода для процессора. Чаще всего компилятор показывает пользователю:</p>
39
<ul><li>ошибки объявления переменных или отсутствие их начальных значений</li>
39
<ul><li>ошибки объявления переменных или отсутствие их начальных значений</li>
40
<li>ошибки несоответствия типов</li>
40
<li>ошибки несоответствия типов</li>
41
<li>ошибки неправильной записи операторов и функций</li>
41
<li>ошибки неправильной записи операторов и функций</li>
42
</ul><p>Иногда компилятор определяет код, который при выполнении дает неправильный результат. Но преобразовать такую программу в машинный код все-таки можно. В этом случае компилятор показывает пользователю<em>предупреждение</em>. Такая реакция компилятора больше похожа на рекомендации, но на них стоит обратить внимание. Программист сам решает оставить код с предупреждением или изменить программу. Анализируя текст программы, компилятор не только ищет ошибки, но еще и упрощает ее код. Такой процесс называется оптимизацией. Во время оптимизации компилятор изменяет программный код, но функции, которые выполняла программа, остаются прежними.</p>
42
</ul><p>Иногда компилятор определяет код, который при выполнении дает неправильный результат. Но преобразовать такую программу в машинный код все-таки можно. В этом случае компилятор показывает пользователю<em>предупреждение</em>. Такая реакция компилятора больше похожа на рекомендации, но на них стоит обратить внимание. Программист сам решает оставить код с предупреждением или изменить программу. Анализируя текст программы, компилятор не только ищет ошибки, но еще и упрощает ее код. Такой процесс называется оптимизацией. Во время оптимизации компилятор изменяет программный код, но функции, которые выполняла программа, остаются прежними.</p>
43
<h2>Выводы и рекомендации</h2>
43
<h2>Выводы и рекомендации</h2>
44
<p>Компилятор - переводчик между программистом и процессором. Он преобразует текст программы в машинный код, определяет ряд ошибок в программе и оптимизирует ее работу. Выбирая, где компилировать программу, важно помнить о том, что машинный код для процессоров и операционных систем будет разным, и подобрать правильный компилятор. Чем точнее компилятор определит команды, тем корректнее и быстрее будет работать программа. Для этого следуйте простым рекомендациям:</p>
44
<p>Компилятор - переводчик между программистом и процессором. Он преобразует текст программы в машинный код, определяет ряд ошибок в программе и оптимизирует ее работу. Выбирая, где компилировать программу, важно помнить о том, что машинный код для процессоров и операционных систем будет разным, и подобрать правильный компилятор. Чем точнее компилятор определит команды, тем корректнее и быстрее будет работать программа. Для этого следуйте простым рекомендациям:</p>
45
<ul><li>использовать простые, понятные команды;</li>
45
<ul><li>использовать простые, понятные команды;</li>
46
<li>помнить о соответствии типов данных;</li>
46
<li>помнить о соответствии типов данных;</li>
47
<li>внимательно набирать код, избегая синтаксических ошибок;</li>
47
<li>внимательно набирать код, избегая синтаксических ошибок;</li>
48
<li>избегать повторяющихся действий и бесполезных переменных.</li>
48
<li>избегать повторяющихся действий и бесполезных переменных.</li>
49
</ul><h2>Частые вопросы</h2>
49
</ul><h2>Частые вопросы</h2>
50
<h3>Чем компилятор отличается от интерпретатора?</h3>
50
<h3>Чем компилятор отличается от интерпретатора?</h3>
51
<p>Компилятор это программа, которая выполняет преобразование текста программы в другое представление, обычно машинный код, без его запуска, статически. Затем эта программа уже может быть запущена на выполнение.<a>Интерпретатор</a>сразу запускает код и выполняет его в процессе чтения. Промежуточного этапа как в компиляции нет.</p>
51
<p>Компилятор это программа, которая выполняет преобразование текста программы в другое представление, обычно машинный код, без его запуска, статически. Затем эта программа уже может быть запущена на выполнение.<a>Интерпретатор</a>сразу запускает код и выполняет его в процессе чтения. Промежуточного этапа как в компиляции нет.</p>
52
<h2>Дополнительные материалы</h2>
52
<h2>Дополнительные материалы</h2>
53
<ul><li><a>Компилятор</a></li>
53
<ul><li><a>Компилятор</a></li>
54
<li><a>ARM против x86: В чем разница между двумя архитектурами процессоров?</a></li>
54
<li><a>ARM против x86: В чем разница между двумя архитектурами процессоров?</a></li>
55
</ul>
55
</ul>