Интерпретируемый vs. компилируемый языки и почему это спрашивают на собеседованиях
Разобрались на примерах, в чем отличие компилируемых языков от интерпретируемых и объяснили, почему те или иные языки обрели специфику.
3К открытий13К показов
Один из основных способов классификации языков программирования – это интерпретируемость / компилируемость, то есть способ запуска. Эти два подхода имеют существенные различия и как раз задают тон использования. Если вам когда-нибудь задавали такой вопрос о разности на собеседовании, давайте разберемся подробно, в чем же она заключается.
Интерпретируемые языки
Интерпретация — это процесс пошагового выполнения кода с использованием специальной программы, интерпретатора. Он читает исходник построчно и выполняет запрашиваемые действия «на бегу».
Преимущества интерпретируемых языков:
- изменения в коде проявляются сразу. Программа собирается для каждого пользователя по отдельности, и в случае обновления это стимулирует людей перейти на новую версию быстрее.
- более гибкая работа с динамической памятью и типами данных.
Но интерпретация может быть медленной, так как код выполняется в режиме реального времени. Первые попытки ускорить этот процесс были предприняты еще в 1960 году, и сегодня отличия в некрупных проектах до 100 тыс. строк без больших данных почти незаметны.
ВРЕЗКА. Но в крупных компаниях (например, банковская система с Большими данными) заторможенность проявляется сильно. И специалисты в них прилагают немалые усилия, чтобы компенсировать разницу в скоростях. Например, перебирают сборки Python (Cython, Jython, CPython и т.д.).
Примеры интерпретируемых языков
- В Python программы выполняются строка за строкой. Потому бот с асинхронными функциями будет работать до тех пор, пока вы пользователь не «провалится» в ветку, где «залегает» ошибка. Это дает огромную экономию умственного ресурса при отладке: ведь теперь разработчик знает точнее, что именно привело к ошибке. И может изолировать / отключить проблемный участок, не касаясь остальных частей кода. Поэтому на ноутбуках Jupyter и Google Colaboratory решили запускать программы по таком же принципу.
- В JavaScript для сайтов код интерпретируется браузером и выполняется ресурсами конечного пользователя. Вот почему вкладки в Chrome «вешают» операционную систему.
К представителям этой категории относят также PHP, Ruby, Perl, MATLAB.
Компилируемые языки
Компиляция — это процесс преобразования исходного кода в байт-код, который компьютер понимает. Посмотрите, как компилятор преобразует несложную человекочитаему функцию calc() — извлечение квадратного корня из суммы квадратов:
В байт-код:
Компиляция происходит перед запуском программы, и результатом является исполняемый файл.
Преимущества компилируемых языков:
- более высокая производительность. Сравнивать, сколько времени займет одна и та же программа на двух типах языков не стану, ибо тут же станет очевидно, что эксперимент спроектирован в корне неверно. Эта особенность проявится, когда вы поучаствуете в крупном проекте, где выбирают между двумя ЯП разного типа. Компилятор куда быстрее расправляется с итерирующими конструкциями, вот это действительно приятный бонус для тех, кто избегал цикла for в том же JavaScript;
- бóльший контроль над железом (расход памяти и загрузка ЦПУ)
Спустя семь лет в программировании у меня сформировалась привычка не принимать неизбежные ошибки близко к сердцу. Новички же нередко расстраиваются из-за них и даже бросают обучение. Здесь единовременная выдача всех проблем может неожиданно послужить как преимущество, если ваша психика готова к интенсивному обучению. Пройти в краткие сроки испытание многочисленными остановками программы может стать эффективным быстрым способом нарастить опыт и эмоциональную броню против таких событий.
Примеры компилируемых языков:
1. C++. Язык, известный своей высокой производительностью, необходимой для системного программирования. Потому он так прижился в геймдеве, где одновременно рендерятся огромные ландшафты с множеством объектов.
2. Java. Программы компилируются в промежуточный байт-код и затем выполняются виртуальной машиной Java (JVM). Это обеспечивает переносимость программ между разными платформами и дарит Java репутацию языка для интернета вещей (IoT).
Другие представители семейства: C, Haskell, Rust и Golang, Kotlin, Flutter.
Резюмируем разницу
Вот напоследок сравнительная таблица, повторяющая основные отличия:
А какой язык вы изучали первым? Поделитесь в комментариях.
3К открытий13К показов