Написать пост

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

Аватарка пользователя Елена Капаца

Разобрались на примерах, в чем отличие компилируемых языков от интерпретируемых и объяснили, почему те или иные языки обрели специфику.

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

Интерпретируемые языки

Интерпретация — это процесс пошагового выполнения кода с использованием специальной программы, интерпретатора. Он читает исходник построчно и выполняет запрашиваемые действия «на бегу».

Преимущества интерпретируемых языков:

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

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

ВРЕЗКА. Но в крупных компаниях (например, банковская система с Большими данными) заторможенность проявляется сильно. И специалисты в них прилагают немалые усилия, чтобы компенсировать разницу в скоростях. Например, перебирают сборки Python (Cython, Jython, CPython и т.д.).

Примеры интерпретируемых языков

  1. В Python программы выполняются строка за строкой. Потому бот с асинхронными функциями будет работать до тех пор, пока вы пользователь не «провалится» в ветку, где «залегает» ошибка. Это дает огромную экономию умственного ресурса при отладке: ведь теперь разработчик знает точнее, что именно привело к ошибке. И может изолировать / отключить проблемный участок, не касаясь остальных частей кода.  Поэтому на ноутбуках Jupyter и Google Colaboratory решили запускать программы по таком же принципу.
Интерпретируемый vs. компилируемый языки и почему это спрашивают на собеседованиях 1
  1. В JavaScript для сайтов код интерпретируется браузером и выполняется ресурсами конечного пользователя.  Вот почему вкладки в Chrome «вешают» операционную систему.

К представителям этой категории относят также PHP, Ruby, Perl, MATLAB.

Компилируемые языки

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

			static int calc(int a, int b) {
    return (int) Math.sqrt(Math.pow(a, 2) + Math.pow(b, 2));
}
		

В байт-код:

			static int calc(int, int);
  descriptor: (II)I
  flags: (0x0008) ACC_STATIC
  Code:
    stack=6, locals=2, args_size=2
       0: iload_0
       1: i2d
       2: ldc2_w        #3         // double 2.0d
       5: invokestatic  #5         // Method java/lang/Math.pow:(DD)D
       8: iload_1
       9: i2d
      10: ldc2_w        #3         // double 2.0d
      13: invokestatic  #5         // Method java/lang/Math.pow:(DD)D
      16: dadd
      17: invokestatic  #6         // Method java/lang/Math.sqrt:(D)D
      20: d2i
      21: ireturn
		

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

Преимущества компилируемых языков:

  • более высокая производительность. Сравнивать, сколько времени займет одна и та же программа на двух типах языков не стану, ибо тут же станет очевидно, что эксперимент спроектирован в корне неверно. Эта особенность проявится, когда вы поучаствуете в крупном проекте, где выбирают между двумя ЯП разного типа. Компилятор куда быстрее расправляется с итерирующими конструкциями, вот это действительно приятный бонус для тех, кто избегал цикла for в том же JavaScript;
  • бóльший контроль над железом (расход памяти и загрузка ЦПУ)

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

Примеры компилируемых языков:

1. C++. Язык, известный своей высокой производительностью, необходимой для системного программирования. Потому он так прижился в геймдеве, где одновременно рендерятся огромные ландшафты с множеством объектов.

2. Java. Программы компилируются в промежуточный байт-код и затем выполняются виртуальной машиной Java (JVM). Это обеспечивает переносимость программ между разными платформами и дарит Java репутацию языка для интернета вещей (IoT).

Другие представители семейства: C, Haskell, Rust и Golang, Kotlin, Flutter.

Резюмируем разницу

Вот напоследок сравнительная таблица, повторяющая основные отличия:

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

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

Следите за новыми постами
Следите за новыми постами по любимым темам
2К открытий4К показов