Серверные языки программирования нужны для реализации бизнес‑логики, то есть разработчик при помощи языка программирования описывает возможные сценарии использования сайта или веб‑приложения.
JIT-компиляция — совмещаем преимущества интерпретации и компиляции
Just-In-Time компиляция (JIT) или динамическая компиляция / трансляция (dynamic translation) — это гибридный подход выполнения кода, объединяющий преимущества интерпретации и компиляции. В отличие от статических компиляторов, которые переводят весь код в машинный заранее, или интерпретаторов, выполняющих код построчно, JIT работает «на лету» — наиболее часто используемые фрагменты кода компилируются непосредственно во время работы программы. На сегодняшний день JIT‑компиляция доступна практически для всех популярных интерпретируемых языках программирования — Ruby, Python, JavaScript и TypeScript, PHP, Java и не только в них. Однако, как и любой другой подход, она имеет свои сильные и слабые стороны.
Как работает JIT‑компиляция?
Интерпретация на старте и анализ «горячих точек». Изначально программа запускается в обычном режиме через интерпретатор, который выполняет код построчно. JIT‑компилятор отслеживает часто используемые функции и участки кода, они становятся кандидатами на динамическую коммпиляцию.
Динамическая компиляция. Выявленные в ходе анализа «горячих точек» фрагменты кода компилируются в машинный код, что ускоряет их выполнение. Компиляция производится непосредственно для процессора и операционной системы, на которых запущена программа.
Адаптивная оптимизация. На основе данных выполнения (например, частоты вызовов методов с разными типами параемтров) JIT может с учётом этой информации повторно перекомпилировать код для повышения эффективности его выполнения.
Достоинства JIT‑компиляции
Высокая производительность в долгосрочной перспективе. JIT анализирует поведение программы во время выполнения (например, частоту вызовов методов, типы данных) и применяет оптимизации, недоступные статическим компиляторам: применяется инлайнинг методов (замена вызова функции её inline‑реализацией), исключение неиспользуемого кода (удаление «мёртвых» ветвей), специализация типов (генерация машинного кода под конкретные типы данных для языков с динамической типизацией). Также JIT может «на лету» генерировать код, учитывающий особенности используемого процессора, например, поддержку векторных инструкций SSE/AVX.
Кроссплатформенность без потери скорости. Исходный код переносим, а машинный генерируется уже под конкретное окружение. Можно запускать один и тот же код на разных ОС и процессорах без ручной компиляции под каждую платформу.
Экономия памяти и ресурсов. Компилируются только «горячие» участки кода (часто выполняемые методы или участки кода), а не вся программа. Это снижает нагрузку на память по сравнению с предварительной компиляцией, когда весь код переводится в машинный в целевой среде при разворачивании.
Динамическая оптимизация под текущий контекст. JIT может перекомпилить код «на лету» при изменении условий. Если метод начинает вызываться с новым типом данных, то JIT генерирует более специализированную версию (очень актуально для нетипизированных языков). В браузерных движках V8 (Chrome) и SpiderMonkey (Firefox) оптимизируется JavaScript-код под конкретные сценарии — анимации или вычисления.
Упрощение разработки. Можно писать код на интерпретируемых языках, что проще и быстрее. Разработчикам не нужно учитывать все возможные аппаратные конфигурации — этим занимается JIT. Это ускоряет создание кроссплатформенных приложений.
Недостатки JIT‑компиляции
Накладные расходы на компиляцию. Программа начинает работу через интерпретатор, а компиляция запускается позже, что замедляет начальную загрузку. JIT хранит как исходный код, так и скомпилированные версии, что увеличивает использование оперативной памяти. Компиляция «горячих» методов может вызывать краткие задержки.
Непредсказуемая производительность. Адаптивные оптимизации зависят от данных выполнения, которые могут меняться. Это усложняет тестирование и прогнозирование производительности. В некоторых случаях JIT может выбрать неоптимальную стратегию компиляции, что приведёт к неидеальным результатам.
Ограничения для специфических задач. Для задач, где важна предсказуемость (например, научные расчёты), обычная статическая компиляция часто эффективнее. На устройствах с ограниченной памятью (микроконтроллеры) JIT может быть непрактичным из‑за накладных расходов.
Применимость JIT
Всё познаётся в сравнении. Стандартная Ahead-Of-Time компиляция для компилируемых языков меньше потребляет ресурсов на этапе запуска и моментально выходит на высокую производительность, но в этом случае нет адаптивных оптимизаций. Стандартная интерпретация обычно обеспечивает меньшее потребление памяти, но при этом и значительно более низкую производительность.
JIT‑компиляция — это компромисс между скоростью и гибкостью. Благодаря JIT можно получить неплохой баланс между скоростью компилируемых языков и гибкостью интерпретируемых. JIT‑компиляция прекрасно проявляет себя в средах, где важны и кроссплатформенность, и высокая производительность. Однако для коротких скриптов, для систем с минимальным количеством оперативной памяти или при высоких требованиях к времени отклика более предпочтительными могут быть классические AOT‑компиляция или интерпретация. Развитие технологий постепенно смягчает недостатки JIT‑компиляции, делая её ещё более универсальным инструментом. Также всё больше языков поддерживают JIT и поддержка с каждой их новой версией улучшается.
Тематические статьи
Ruby (ruby — рубин, руби) — интерпретируемый мультипарадигмальный язык программирования: динамический, объектно-ориентированный, рефлективный, императивный, функциональный. Активно используется в веб‑разработке, в системном администрировании и в работе операционных систем (Mac OS X, Linux, BSD).
Python — это высокоуровневый язык программирования общего назначения, который используется в том числе и для разработки веб‑приложений. Язык ориентирован на повышение производительности разработчика и читаемости кода.
Фреймворки — это программные продукты, которые упрощают создание и поддержку технически сложных или нагруженных проектов.
Фреймворк — это сочетание готовых программных компонентов с методологией их использования, облегчающее разработку программного продукта. Фреймворк, как правило, содержит только базовые программные модули, а все специфичные для проекта компоненты реализуются разработчиком на их основе. Готовая структура и базовые компоненты в сочетании с заложенными в методологию фреймворка парадигмами и лучшими практиками позволяют при разработке сосредоточиться на требуемой бизнес‑логике, а не фокусироваться на рутинных задачах. Благодаря использованию фреймворков достигается не только высокая скорость разработки, но и большая производительность, безопасность и надёжность решений.
С технической точки зрения любая функциональность может быть реализована или на CMS, или на фреймворке, или без использования каких‑либо платформ на чистом языке программирования.
Однако некоторые проекты проще сделать на CMS, некоторые — на фреймворке, а разработка без использования платформ редко бывает рациональным решением с точки зрения бизнеса. В большинстве случаев, выбор платформы стоит основывать на экономических критериях. В статье приведены основные критерии, которые позволят принять обоснованное решение по этому вопросу.
При выборе конкретной платформы для разработки часто возникают сложности. Бывает непросто принять взвешенное решение, в этом случае будет полезен следующий алгоритм выбора.
- При возможности найти готовые решения или продукты — используйте их. В большинстве случаев, оптимальная стратегия выбора: «чем проще — тем лучше».
- Если у вас есть команда разработчиков, то прислушайтесь к их мнению. Важны как возможности самой платформы, так и наличие у команды опыта работы именно с этим технологическим стеком.
- Заранее оцените «заточенность» выбранной платформы под ваши задачи. Не стоит на 100% доверять маркетинговым материалам вендора платформы.
Rails — это прежде всего среда разработки, которая великолепно подходит для создания любого типа веб‑приложений: систем для управления веб‑сайтами и платформ для ведения электронной торговли, программ для организации совместной работы и для веб‑сервисов для осуществления коммуникации, для учетных и ERP‑систем, статистических и аналитических систем.