HTML Diff
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>