⚠️ Минутка матчасти! Эта статья создана для расширения кругозора и повышения разрешения в мире компьютерных технологий. В ней мало практической пользы кроме развития вашего интеллекта.
Здесь мы говорим о двух типах компьютерных языков: условно говоря, языков скриптования (интерпретируемые языки) и языков программирования (компилируемые языки). Это деление — не самое верное и не самое полное с точки зрения опытных программистов, но статья рассчитана на тех, кто только начинает.
Скриптовые, или интерпретируемые, языки
Обычно примеры кода в наших статьях работают по такому принципу:
- Скопировал текст.
- Запустил в браузере.
- Получил результат.
Браузер берёт наш код, проверяет его на ошибки и, если ошибок нет, — выполняет команды по очереди в нужной последовательности. Или даже выполняет без проверки, а если в процессе появится ошибка — остановится.
Чтобы такие скрипты работали, нужна какая-то программа, которая будет выполнять команды скрипта, — их называют интерпретаторами. В нашем случае это браузер: Chrome, Safari, Firefox, Яндекс-браузер и т. д. Отсюда и название — интерпретируемые языки.
Пример скриптового языка, который вы уже знаете, — JavaScript. На скриншоте ниже он вписан внутрь веб-страницы. Сам код из одной строки прописан между тегами <script> и </script>: браузер будет рисовать страницу, в какой-то момент увидит этот скрипт, выполнит его и пойдёт дальше рисовать страницу.
Ещё один популярный пример интерпретируемого языка — Python. Он работает по тому же принципу, только вместо браузера Python использует собственный интерпретатор команд. Когда мы в среде разработки запускаем скрипт на питоне, то интерпретатор шаг за шагом выполняет команды.
👉 В интерпретируемых языках сам скрипт — это и есть готовая программа, но для её запуска и работы нужен внешний интерпретатор, который выполнит команды. Без интерпретатора скрипт не запустится.
Программные, или компилируемые, языки и машинный код
Другой подход к разработке: программные, или компилируемые, языки. Они устроены так: программист пишет исходный код программы, а потом прогоняет её через компилятор. Компилятор берёт исходный код целиком, анализирует его и создаёт машинный код.
Компиляция — это превращение программного кода в исполняемый код для процессора: на входе было то, что могли прочитать вы, а на выходе — то, что может прочитать и исполнить компьютер. Если скрипт — это сценарий для актёра на сцене, то компиляция — это отснятый фильм на киноленте.
Машинный код — последовательность байтов, которая даёт инструкции напрямую процессору. Для человека такой код выглядит как просто набор знаков, но компьютер его понимает.
Чтобы вы понимали, чем исходный код отличается от машинного, держите пример. Вот исходный код на Swift, который выводит сообщение «Hello, world»:
А вот так выглядит фрагмент машинного кода, который получился после работы компилятора:
Как так получилось: компьютер взял исходный код из двух строк и преобразовал его в набор символов на несколько тысяч строк. Размер машинного кода вырос за счёт того, что компилятор добавил в него много нужных и обязательных функций: научил выводить сообщения на экран, рассказал, как обращаться к памяти и что делать после запуска. Кода стало больше, зато теперь он работает без посторонней помощи.
Примеры компилируемых языков: С, С++, Pascal, Swift и ещё десятки других. Ассемблер, кстати, тоже компилируемый язык — процессор не умеет понимать его исходный код без посторонней помощи.
👉 Результат работы компилятора — самостоятельная программа в виде машинного кода, которая потом может работать сама, без компилятора. Один раз скомпилировал — и потом можно запускать её самостоятельно, без внешних программ.
Особенности компилируемых языков
У машинного кода есть один недостаток: он работает только с определёнными процессорами и компьютерами. Если программа написана для Виндоус, запустить на макбуке без специальных ухищрений не получится. Программа для телефона на компьютере заработает только при особых условиях — например, поддержка приложений Android появилась только в Windows 11, а приложения iOS научили запускаться на MacOS только в 2020 году.
Дело в том, что у разных компьютеров разный тип процессора, а машинный код знает, как работать только со своим типом. Чтобы запустить приложение iOS на Mac OS, операционка должна «обернуть» приложение в эмулятор мобильного устройства, и только потом — запустить.
Снова про снобизм
Некоторые любители программных языков считают скриптовиков ненастоящими программистами. Мол, они пишут программы, которые сами по себе не работают и которым нужен интерпретатор. Если вы такое слышите, то знайте, что перед вами — программист-сноб.
Настоящие разработчики знают, что главное — решить задачу. Если она скриптом решается лучше, чем машинным кодом, значит, в этой ситуации лучше сработает скрипт, и наоборот.