Что такое компиляция на примере оливье?

Сегодня, прогуливаясь после обеда, я задумался о том, что у меня на рабочем браузере установлен небольшой самописный букмарклет, а его исходники хранятся только на домашнем компьютере, где настроен адекватный процесс сборки и деплоя в gist, откуда он поставляется в браузер. То есть букмарклет, по сути, это просто загрузчик основного рабочего модуля из gist. И этим букмарклетом иногда пользуются мои коллеги. Если бы кто-то из них попросил меня внести некоторые правки, я бы не смог этого сделать, т.к. код самого букмарклета и основного модуля минимизирован и не пригоден для осмысленного редактирования.

И тут я задумался - а как бы я объяснил это коллеге? То есть, почему, имея букмарклет на руках, я не могу его отредактировать? Далее в голову сразу полезла еда (т.к. я только что пообедал), а на место коллеги стала бабушка, как каноничный слушатель объяснений, предлагаемый на собеседованиях. Поэтому, финальный заголовок статьи должен был звучать так: "Как объяснить бабушке, что такое компиляция на примере оливье?" Но во благо СЕО его пришлось немного сократить.

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

Каждая программа представляет собой набор инструкций, которые ловкими руками программиста образуют связанный в единую систему программный код. Т.к. программы пишут люди, то в процессе разработки и поддержки код должен выглядеть читаемо. Поэтому, чаще всего, он содержит конструкции на английском языке, изобилует отступами для подчёркивания вложенности выражений, пустыми строчками для визуального отделения одной смысловой части программы от другой и т.д.

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

И тут возникает такой момент: компьютер - не человек, ему не нужно читать код в привычном человеку виде. Более того, компьютер сам по себе полностью лингво агностик, т.е. ему не важен язык, на котором написана программа. Ему важен лишь набор действий, который он должен выполнить. Получается, что программист имеет большой набор вариантов для производства кода, но отдать этот код компьютеру он должен всегда в одном и том же виде, понятном машине. Для этого и существуют такие процессы, как компиляция, транспиляция и прочие. Всё, что они делают, это переводят код с языка программиста на язык компьютера.

Похоже, всё объяснение можно было свести к фразе "Компилятор - переводчик с языка программиста на язык компьютера". Но есть один нюанс. Переводчик умеет переводить в обе стороны, компиляция же - процесс необратимый. Имея скомпилированную программу, мы лишаемся возможности (адекватной) отредактировать её. Поэтому, вернёмся к салату и начнём его готовить.

Выше я уже писал, что код программы состоит из ряда модулей, чью роль в нашем салате будут играть овощи. В исходном виде код представляет для человека понятный набор конструкций такой же очевидный, как отличие горошка от яйца. Однако, при сервировке стола, было бы не очень аппетитно просто выложить очищенные овощи, предложив гостям помочь себе самим. Поэтому, мы их (исходный код) мелко шинкуем (не гостей, а овощи), перемешиваем (компилируем) и помещаем внутрь блюда, чтобы организм (компьютер) смог переварить пищу. И как бы нам ни хотелось, но обратно собрать кусочки овощей в исходные продукты и что-то изменить в рецепте практически невозможно. Зато теперь салат (программа) готов для конечного потребителя - гостями (пользователями). А заправив всё это дело майонезом, мы получим аналогию следующей фазы преобразования кода - обфускации (преобразование кода с целью затруднить его анализ), что проявляется в восторженных отзывах гостей - "А что ты сюда добавил?". Затем можно столкнуться с проявлением реверс-инжиниринга (исследование с целью понять принцип работы), сопровождаемый словами "Хмм, это что, кусочки яблока?". Ну и финальное - "Срочно поделись рецептом (исходным кодом)", что является аналогией к приглашению в open source (совместная работа с кодом).

По-моему, меня немного понесло, поэтому вот вам итоговый рецепт:

  1. Картофель, морковь, яйцо, яблоко, курица, горошек, майонез = Исходный код (код программы)
  2. Мелко нарезаем, смешиваем и подаём на стол = Компиляция (преобразование исходного кода в машинный код)
  3. Заливаем майонезом = Обфускация (преобразование кода с целью затруднить его анализ)
  4. Доверившись вкусовым рецепторам, гости пытаются угадать, из каких ингридиентов состоит салат = Реверс-инжиниринг (исследование с целью понять принцип работы)
  5. Поделиться рецептом с друзьями и вместе его совершенствовать = Open source (совместная работа с кодом)