Как компьютер понимает код: про компиляцию и интерпретацию

Как компьютер понимает код: про компиляцию и интерпретацию08:31

Информация о загрузке и деталях видео Как компьютер понимает код: про компиляцию и интерпретацию

Автор:

Merion Academy

Дата публикации:

20.11.2023

Просмотров:

76.5K

Транскрибация видео

Mirion Academy.

Платформа доступного образования.

А спонсор сегодняшнего видео – влажные салфетки под терака и телеграм-канал Mirion Academy.

Подписывайся.

О чём задумался лягушонок?

Не о том ли, как компьютеры понимают код, который пишут программисты?

Как удачно, ведь мы как раз хотели об этом рассказать.

Сначала давай узнаем, как работают комплюкторы.

Вот у нас есть процессор, который в компе самый главный и всем тут управляет.

Он состоит из миллиардов транзисторов.

Эдаких переключателей, которые могут находиться в двух состояниях, пропускать ток или нет.

Условно говоря, либо да, либо нет, либо единица или ноль.

Вот мы и получили бит, минимальную единицу информации.

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

Вспоминай уроки информатики, лягушачий.

Тебя там учили всяким логическим и, или, правда-ложь, болево-алгебра, ну и вот это вот всё.

Так вот, чтобы процессор делал то, что мы хотим, надо ему сообщить, какую операцию выполнить в данный момент.

но только на языке, понятном ему, на машинном языке.

То есть нам нужно передать ему последовательность нулей и единиц, которую называют бинарным кодом.

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

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

Изначально с компьютерами можно было общаться только так.

Но прогресс не стоял на месте.

Производители старались упихнуть в процессоры всё больше транзисторов и мерились тем, у кого он...

Меньше.

Схемы становились сложнее, и ученые почесали репу и поняли, что дальше так дело не пойдет.

Мы тут скоро поедем кукухой, если будем и дальше ноликами и единичками все операции зашифровывать.

А представь, какие все времена были код-ревью.

Поэтому была придумана абстракция над машинным кодом, который называется ассемблер, где комбинации нулей и единиц заменились буквами и короткими словами по типу add, sub и mo.

И кожаным мешкам стало полегче.

А как компьютер понимает эти слова?

Это же не нули и единички.

Ну, к этому времени они научились худо-бедно хранить что-то в памяти.

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

Вот так просто.

Правда, есть нюанс.

Раз процессоры сделаны по-разному, то для каждой архитектуры нужно писать программу на ассемблере по-разному.

Но такие мелочи не остановят прогресс.

Ну а дальше стало понятно, что можно делать языки, которые будут удобными для программистов.

И понеслась.

Fortran, Algol, Lisp, Basic, Pascal, C, Python, Java и конечно же JavaScript с его постоянными общедомовыми отключениями.

Добавляй кучу конструкций, прикручивай OOP, делай языки максимально близкими к человеческой речи, а главное в конце переводи в машинный код и все будет тип-топ.

Есть несколько подходов, чтобы перевести твой свеженаписанный исходный код в машинный.

Первый — это компиляция.

Это когда у нас есть исходный код, и он пихается в специальную программуленку, которая выполняет роль переводчика.

Это и называется компилятор.

Он, в свою очередь, возьмёт весь исходный код и начнёт пыхтеть, анализировать всё, что понаписали программисты, проверит синтаксис, подтянет все подключаемые файлы, а затем переведёт это всё в машинный код, понятный процессору, и создаст исполняемый файлик.

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

Ого, говорите, что найдёт ошибки?

Так это чё, получается и тесты не нужны?

Компилятор сразу скажет, что где неправильно написано?

Во-во, попридержи коней.

Компилятор покажет только те ошибки, которые не дадут запуститься программе.

Например, пропущенная точка с запятой, незакрытая скобка, неправильно переданные аргументы в функции.

Но за всю логику программы всё равно придётся отвечать тебе.

Так что тут пока без чудес Амиго.

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

Да-да, у одного языка еще и несколько компиляторов может быть.

Но не боись, есть и кросс-компиляторы для нескольких архитектур и языков, например, GCC.

А используют компиляцию такие языки, как C, C++, Go, Rust, Swift.

Возможно, у тебя появится вопрос, а как пишут эти самые компиляторы?

На других языках дружочек.

Но после этого можно написать новую версию компилятора уже на нужном языке и скомпилировать первым компилятором.

Кстати, пиши в комментариях, сколько раз в день ты обычно компилируешь.

Теперь давай посмотрим на второй вид перевода в этот ваш бездушно-машинный.

Интерпретацию.

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

В отличие от компилятора, интерпретатор на диете, и мы скармливаем ему не весь код, а по ложечке.

Строчку за строчкой, которую он переводит в машинный и сразу же выполняет, а затем идет к следующему куску.

Разница с компиляцией в том, что там мы заранее генерируем машинный код для всего написанного нами кода и получаем файл, который можно запускать.

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

Отсюда и вытекают все плюсы и минусы.

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

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

Зато язык не зависит от системы, код легко запустится на другой операционке, главное, чтобы там был интерпретатор.

На самом деле, интерпретаторов у одного языка также может быть несколько.

Помнишь, в видосе про FrontEnd мы говорили про движки?

Вот это оно и есть.

У Chrome, Mozilla и Safari они свои.

Ну и сами интерпретаторы тоже зависят от платформы, где они выполняют код.

А интерпретацию используют такие языки, как PHP, Python, JavaScript, Ruby.

Чтобы закрепить разницу между компилятором и интерпретатором, лови пример из жизни.

Представь, что ты решил приготовить топовую пиццу.

Это которая без ананасов.

Ну вот незадача.

Рецепт на итальянском.

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

Это будет компиляция.

Либо ты можешь позвать его в гости, чтобы он сидел рядом и переводил рецепт строчка за строчкой, а ты занимался бы готовкой.

Тогда это будет интерпретация.

Ты, наверное, мог заметить, что мы не упоминали язык программирования Java, хотя он один из самых популярных.

Если ты смотрел наш видос про Java, то понимаешь почему.

У Java есть особенность.

Её код тоже компилируется, но только не в машинный код с нулями и единицами, а в так называемый bytecode, который является инструкциями о том, как интерпретировать и выполнять исходный код.

То есть уже не исходный код, но ещё не машинный.

Ладно-ладно, можно сказать и машинный, но для другой машины, виртуальной, которая называется Java Virtual Machine или JVM.

По сути, это программа, которая ставится на компьютер и позволяет запускать код на Java.

И вот такой подход позволяет не перекомпилировать код под разные платформы.

Главное, чтобы там была JVM и все заработает.

Кстати, а ты знал, что Python на самом деле тоже компилируется в байт-код?

Про то, как это происходит и про то, как Python работает под капотом, мы рассказываем на нашем продвинутом курсе Python Advanced.

Курс специально разработан для тех, кто хочет углубить свои навыки Python, чтобы совершить быстрый рост от Junior до Middle Grade.

Приходи, чтобы узнать про аннотации типов, системы контроля зависимостей и интроспекцию.

Освоить асинхронное и метапрограммирование, изучить профилирование и написать собственное приложение на FastAPI.

И потом это все рассказать своему лиду или на собеседовании, чтобы у них там челюсть отвисла от того, как ты крут.

Ссылочка ты сам знаешь где.

Ах да, C-Sharp.

Тоже компилируется в промежуточный код, но он называется CIL.

И имеет свои нюансы, поэтому подписывайся на канал, чтобы не пропустить подробное видео про шарпы.

Еще есть такая штука, которая называется just-in-time-компиляция.

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

И это происходит во время выполнения программы.

JIT-компилятор анализирует этот байт-код и компилирует его в машинный код.

Вот такая вот и компиляция, и интерпретация получилась.

Еще JIT-компиляция используется в движках JavaScript.

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

Вот такие пироги.

Ну и напоследок, вот тебе еще один неоднозначный факт.

Несмотря на то, что мы говорим, что одни языки используют компиляцию, а другие — интерпретацию...

Это не совсем точно.

На самом деле, любой язык может быть скомпилирован или интерпретирован, если очень захотеть, и такие проекты существуют.

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

Вот так-то.

Так, а какой язык выбрать, с компиляцией или интерпретацией?

Всё, как всегда, зависит от твоих целей и от того, находится ли Венера в Скорпионе или Живовне, амиго.

Если тебе важна скорость работы программы и ты печешься в оптимизации ресурсов и безопасности, то смотри в сторону компилируемых языков.

А если тебе важно быстро писать скрипты и легко их обновлять, то в сторону интерпретируемых.

Ну и под конец традиционный вопрос.

Ассемблер из начала видео до сих пор жив и используется.

Как ты думаешь, где и как?

Ответ пиши в комменты.

Кстати, по статистике, те, кто ставит нам лайки, показывают видео друзьям, подписаны на наш YouTube и Telegram канал, становятся обворожительнее и неотразимее в среднем на 1,46%.

Покедова.