Добавить в корзинуПозвонить
Найти в Дзене
Иосиф Дзеранов

В современном программировании существует куча языков. Их можно разделить на два типа: интерпретируемые и компилируемые. Например, такие

В современном программировании существует куча языков. Их можно разделить на два типа: интерпретируемые и компилируемые. Например, такие языки как C, C++, C#, Java, Kotlin и Go компилируются. На этапе компиляции происходит куча разных полезных штук: синтаксическая проверка, статический анализ кода, различные оптимизации и, конечно, сборка исполняемого файла. Именно на этапе компиляции где-то под капотом все наши файлы с кодом «сшиваются» в нечто цельное. А вот вопрос: как это происходит? Нельзя же просто весь код засунуть в один файл и сверху вниз начать его компилировать. Ведь у нас в программе есть зависимости одних функций от других. Значит необходимо все делать в какой-то последовательности. Надо как-то понять в какой. Заметим два простых факта. Первый - кусок кода можно компилировать тогда, когда код, от которого он зависит уже скомпилирован. Второй - если кусок кода ни от чего не зависит, его можно компилировать сразу. Теперь давайте найдем все куски, которые ни от чего не завися

В современном программировании существует куча языков. Их можно разделить на два типа: интерпретируемые и компилируемые. Например, такие языки как C, C++, C#, Java, Kotlin и Go компилируются. На этапе компиляции происходит куча разных полезных штук: синтаксическая проверка, статический анализ кода, различные оптимизации и, конечно, сборка исполняемого файла. Именно на этапе компиляции где-то под капотом все наши файлы с кодом «сшиваются» в нечто цельное.

А вот вопрос: как это происходит? Нельзя же просто весь код засунуть в один файл и сверху вниз начать его компилировать. Ведь у нас в программе есть зависимости одних функций от других. Значит необходимо все делать в какой-то последовательности. Надо как-то понять в какой.

Заметим два простых факта.

Первый - кусок кода можно компилировать тогда, когда код, от которого он зависит уже скомпилирован.

Второй - если кусок кода ни от чего не зависит, его можно компилировать сразу. Теперь давайте найдем все куски, которые ни от чего не зависят, скомпилируем их, далее скомпилируем тот код, который зависит от только что скомпилированного и так далее. Примитивный алгоритм работает именно так.

Внутри компиляторы строят граф зависимостей, в этом графе как раз и хранится информация что от чего зависит. А топологически отсортировав этот граф мы получим порядок компиляции, который учитывает все зависимости.

Подробнее об графе зависимостей можно почитать тут, а про топологическую сортировку тут.

Заметили что то схожее между всеми вопросами? 😂