@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.
Вы им говорите где лежат ваши исходники и они по-очереди вызывают компилятор со списком всех файлов и нужных флагов, ассемблер, линковщих и всё остальное. 🧵
Системы сборки автоматизируют шаги, которые иначе пришлось выполнять бы вручную. И, как побочный эффект, они умеют "собрать" все ваши файлы с исходниками в одну кучу и скормить их в нужном порядке компилятору. Сам компилятор этого не умеет. 🧵
Именно это я имел ввиду, когда сказал что ни компилятор ни линковщих не занимается "сбором" ваших исходных текстовых файлов вместе. Вы делаете это либо вручную, либо с помощью билд системы.
Надеюсь теперь у всех есть хотя бы поверхностное понимание и нет путаницы в терминах😘