2013-11-28 2 views
2

Я знаю, что java генерирует байт-код, но JVM нужно интерпретировать его каждый раз во время выполнения.Есть ли независимый от машины компилятор?

Существует ли компилятор, который генерирует независимый от машины код, скажем, для C. . Затем на целевой машине это постоянно преобразуется в свой локальный машинный код один раз вместо преобразования для каждого запуска?

Означает ли это, почему многие разработчики разрабатывают для окон, но нет Linux?

+4

Вы на самом деле не нужно. Java может это сделать, но это не очень хорошая идея. JVM может компилировать код не только для системы, в которой он включен, но и для ситуации, в которой он работает. То, как байт-код JITed сегодня, не обязательно будет таким же, как и завтра. Из-за этого (после разогрева) java может иногда превосходить C++ –

+0

. Общепринято иметь машинный независимый «интерфейс», а затем «back-end» выполняет преобразование из стекового или четырехъядерного обозначение команд конечной машины. Независимый от машины оптимизатор может застревать между ними. –

+0

@RichardTingle - Возможность JITCed Java работать быстрее, чем статически скомпилированный код, именно потому, что он не статически компилируется. Не имеет ничего общего с независимостью от машины. (Есть, на самом деле, JITC, которые построены так, как я описываю выше.) –

ответ

1

Это, безусловно, возможно, и interpreters exist для C и C++. Однако проекты, использующие эти языки, часто будут использовать код, специфичный для платформы (например, API Windows), который не позволяет переносить их. Интерпретированные языки обычно предоставляют платформенные независимые базовые библиотеки.

Современные компиляторы, такие как Clang, LLVM и GCC - все компилируют исходный код на промежуточный язык. Это означает, что одни и те же оптимизации на уровне кода могут быть применены к любому языку, который может конвертировать компилятор, а также включает такие инструменты, как Emscripten, которые могут эффективно скомпилировать C на JavaScript! Я считаю, что он использовался для последних JavaScript Unreal Engine demo.

2

Не совсем, но некоторые вещи приближаются.

C считается как можно более низким уровнем, будучи переносимым некоторыми. (Это, конечно, исключает все API). Компилятор GHC Haskell использует внутренне очень c-подобный язык в этом отношении c--, который может быть очень близок к машине в зависимости от кода, который вы ищете.

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

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

+0

Мейнфреймы IBM делают это. Код (например, C) скомпилирован на промежуточный язык и переводится на машинный код при установке. Они использовали типы указателей, используемые для промежуточного языка 128 бит в 16 и 32-битных днях (они переходят к размеру собственного указателя), что еще долго будет доказательством в будущем. – nos

0

Пример Java: Android 4.4 представила новую экспериментальную виртуальную машину реального времени, ART (Android Runtime).

ART опоясана интересное в середине земли между скомпилирован и интерпретируемый код, называемый вперед-оф-времени (АОТ) сборник. В настоящее время с приложениями для Android они интерпретируются во время выполнения (используя JIT) каждый раз, когда вы их открываете. Это медленно. (iOS-приложения, для сравнения, скомпилированы с помощью собственного кода, что намного быстрее). При включенном АРТ каждое приложение для Android скомпилировано в собственный код при его установке. Затем, когда пришло время запуска приложения, оно выполняется со всей готовностью собственного приложения.

Source

+0

Полезно знать, что в этом направлении есть определенный прогресс. Java всегда была медленной. – user3041058

+0

@ user3041058 Java обычно был медленнее, чем оптимизированный C/C++, но быстрее, чем большинство других языков. Производительность Java была оптимизирована для долгосрочных приложений, таких как серверы. Для Android-приложений важно время запуска и начальная производительность, поэтому хорошо видеть прогресс в этом направлении. – lbalazscs

Смежные вопросы