Почему концепция байт-кода уже не столь актуальна, как была прежде

Введение

Компилируемые языки интерпретируемого типа — это те языки программирования, которые компилируются в некое промежуточное представление (иногда именуемым «байт-кодом«). Самый яркий пример — это JVM (виртуальная машина Java).

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


Причины возникновения

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

Sun Microsystems попытались соединить надёжность и высокую скорость работы компилируемых языков с переносимостью и лёгкостью использования интерпретируемых. В определённой степени задуманная идея осуществилась, ведь Java всё же стал наиболее распространённой технологией в построении высоконагруженных серверов.

Кроме всего прочего, было выдвинуто одно из главных требований платформы, позже ставшее слоганом — «Скомпилируй однажды, запускай везде!». Это означало, что программисту следовало лишь раз скомпилировать исходный код в так называемый байт-код, способный быть запущенным на любой системе, где установлена JVM.

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

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

Эпоха удалённых сервисов

«Зачем поставлять программы пользователям, если можно просто сделать сайт?» — этим вопросом задались крупные предприниматели, что позже вылилось в масштабную эмиграцию услуг во Всемирную сеть. Стандартные настольные программы начали утрачивать свою популярность, ведь намного проще и эффективнее сделать простенький (или не очень) веб-сайт.

Следовательно, отпала и необходимость так часто скачивать программы с Интернета. Открыть сайт и осуществить необходимые действия намного быстрее, чем скачивать мегабайты бинарных данных.

А тем временем Java обрела популярность в построении тех самых сайтов, ведь ничего удобнее на тот момент (и по сей день) не существовало. Исходные файлы стали компилироваться лишь под конкретную архитектуру сервера, следовательно, принцип «Скомпилируй однажды, запускай везде!» перестал иметь былое значение. Пользователи перестали скачивать программы, а разработчики стали компилировать лишь под конкретную архитектуру.

Эволюция языков

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

Языки программирования тоже не стояли на месте, и на свет вышли такие языки, как Rust и Golang, оба компилируемых, и оба обладают стандартной и множествами сторонних библиотек, предоставляющих независимый от архитектуры и операционной системы функционал. Кроме того, экосистема C/C++ тоже не стояла на месте.

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

Оставшаяся часть

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

В обоих случаях компиляция под сотню разных платформ не имеет смысла, так как в подавляющем большинстве случаев применяются лишь три всем известные операционные системы (GNU/Linux, Microsoft Windows и Mac OS) и одно семейство архитектур процессоров (x86).

Заключение

Итого мы имеем замедляющие работу виртуальные машины (в качестве сред исполнения байт-кода), утратившие свои основные преимущества вследствие двух вышеизложенных факторов:

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

    Дополнения

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

    Оставить комментарий