Своевременная компиляция, похожая на запоминание?

#compiler-construction #jit #memoization

#построение компилятора #jit #запоминание

Вопрос:

Я пытаюсь понять компиляцию / интерпретацию точно в срок и начало компиляции времени? Правильно ли я буду сказать, что Just in time — это что-то вроде запоминания? в том смысле, что он повторно использует «решения», то есть машинный или байтовый код, частей, которые он распознает как повторяющиеся?

Комментарии:

1. en.wikipedia.org/wiki/AOT_compiler и en.wikipedia.org/wiki/Just-in-time_compilation должно помочь

2. Я посмотрел на это, это было немного выше моего понимания, так что JIT уместен только для интерпретируемых языков?

3. Оба метода используются для промежуточных языков, JIT-компиляция — это процесс постепенного перевода промежуточного языка на родной язык во время выполнения приложения, то есть, когда вызывается часть промежуточного языка, JITter проверяет, была ли она скомпилирована ранее, если нет, он компилирует ее в машинный код на лету и помечает эту часть IL-кода как скомпилированную, чтобы в следующий раз она была выполнена напрямую. С другой стороны, компиляция AOT — это процесс перевода всего IL-кода в машинный код перед запуском приложения во время компиляции или во время выполнения

Ответ №1:

Нет, это было бы неправильно.

Давайте посмотрим, что делают эти инструменты, когда вы добавляете в них некоторый байт-код. (В очень простых терминах)

Интерпретатор

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

Компилятор AOT

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

JIT-компилятор:

Идея JIT заключается в том, что большая часть времени в вашей программе тратится на циклы. Итак, когда у вас есть цикл, состоящий из 100 итераций, и на каждой итерации вы добавляете что-то, интерпретатор должен каждый раз смотреть на то, что вы хотите сделать, и делать это. JIT смотрит на цикл и говорит: «Мне не нужно выяснять, что это делает 100 раз в прошлом. Я просто собираюсь скомпилировать этот фрагмент кода. Затем он делает то, что делает обычный компилятор, генерирует некоторый собственный код и запускает его.

JIT часто работает вместе с интерпретатором. Интерпретатор обнаруживает, что что-то является циклом, а затем передает это JIT, и после цикла он продолжает интерпретировать.

Реализации Java и .NET не используют интерпретатор, это тоже возможно. у luajit, pypy и реализации JS в firefox действительно есть интерпретатор.

(Должен ли у вас быть интерпретатор или нет, является предметом обсуждения)

Надеюсь, это поможет.