🔥

Тред (Тимофей Плотников)


@jsunderhood @jin_nin > компилятор не собирает исходники, это делает gradle > линкер собирает модули, которые сгенерировал компилятор, но не занимается сборкой исходников. У кого каша то?
Вчера в теме про transpilers возникло недопонимание в терминах, а потом вскрылось непонимание процесса в общем. Дабы вас больше не вводили в заблуждение, вот небольшой тред про процесс сборки и компиляторы 🧵 Разберем на Си, потом замапим на JS twitter.com/touzoku/status…

Итак, в самом простейшем случае процесс компиляции ваших каракулей в исполняемый файл происходит в 3 стадии: - компиляция - сборка (assembly) - линковка В Си есть ещё препроцессинг, но мы его трогать не будем, он сейчас не так важен. 🧵

Этап 1. Компиляция. Этап компиляции сам состоит из нескольких этапов, задача которых перегнать ваш код на Си в код на ASM. Они включают в себя лексический, синтаксический, семантический анализы, генерацию кода и оптимизацию кода. На выходе у нас код на ASM 🧵

Этап 2. Сборка (assembly) Процессор не может выполнить код на asm, поэтому нам нужно запустить assembler и перегнать наш ASM в конкретные инструкции для выполнения процессором. На выходе мы получаем .obj-файл 🧵

Этап 3. Линковка У нас есть инструкции для компухтера в виде obj-файла, но мы всё ещё не можем их исполнить. Во-первых, наш код может ссылаться на другие obj-файлы и сторонние библиотеки. Во-вторых, для того, чтобы запустить нашу прогу, нам нужен исполняемый файл 🧵

Этим всем занимается линковщик. Он берет все ваши obj-файлы, статические библиотеки, ставит их в нужном порядке, связывает и генерирует исполняемый файл. Вуаля! Можно запускать свой говнософт 🥳 Это всё круто, скажете вы, но где тут Make/Gradle/gulp? 🧵

А вот где. Это абсолютно опциональные тулзы. Но без них вам будет очень больно. Проблема заключается в том, что все вышеописанные этапы нужно запускать отдельно 🧵

@jsunderhood Сборкой занимается линкер. Gradle — это тупо таск раннер типа gulp. @jin_nin все правильно пишет, нет такого понятия «транспиляция» в computer science, это обычная трансляция.
Сначала запускаете компилятор, передаете туда 100500 флагов и список всех ваших исходников В НУЖНОМ ПОРЯДКЕ ЧЕРЕЗ ЗАПЯТУЮ. Линковщик НЕ занимается собиранием всех ваших исходников в одно место чтобы компилятор их скомпилил, как выразился этот господин twitter.com/touzoku/status… 🧵

Дальше вы запускаете ассемблер, в который передаете столько же флагов и output компилятора, через запятую. И потом запускаете линковщих со всеми obj-файлами. Он уже всё собирает воедино. Короче ни в java ни в си вы не можете сказать compile src/*, хренушки 🧵

Тут-то вам на помощь и приходят системы сборки типа gradle/make/gulp. Вы им говорите где лежат ваши исходники и они по-очереди вызывают компилятор со списком всех файлов и нужных флагов, ассемблер, линковщих и всё остальное. 🧵

Системы сборки автоматизируют шаги, которые иначе пришлось выполнять бы вручную. И, как побочный эффект, они умеют "собрать" все ваши файлы с исходниками в одну кучу и скормить их в нужном порядке компилятору. Сам компилятор этого не умеет. 🧵

Именно это я имел ввиду, когда сказал что ни компилятор ни линковщих не занимается "сбором" ваших исходных текстовых файлов вместе. Вы делаете это либо вручную, либо с помощью билд системы. Надеюсь теперь у всех есть хотя бы поверхностное понимание и нет путаницы в терминах😘