Не совсем, но некоторые вещи приближаются.
C считается как можно более низким уровнем, будучи переносимым некоторыми. (Это, конечно, исключает все API). Компилятор GHC Haskell использует внутренне очень c-подобный язык в этом отношении c--, который может быть очень близок к машине в зависимости от кода, который вы ищете.
Большинство современных компиляторов имеют такой промежуточный код, например LLVM. Существует даже ассемблер, подобный (так даже более низкий уровень, чем C) для этого. Но обратите внимание, что промежуточный код LLVM не переносится, например, размер указателя должен быть известен во время компиляции. (все размеры в C будут зафиксированы в это время)
Но есть более простое решение IMO: Скомпилируйте код для любой платформы, и если вы находитесь на другой платформе, вы будете динамическим рекомпилятором, таким как QEMU. Это все еще отрицательно сказывается на производительности.
Вы на самом деле не нужно. Java может это сделать, но это не очень хорошая идея. JVM может компилировать код не только для системы, в которой он включен, но и для ситуации, в которой он работает. То, как байт-код JITed сегодня, не обязательно будет таким же, как и завтра. Из-за этого (после разогрева) java может иногда превосходить C++ –
. Общепринято иметь машинный независимый «интерфейс», а затем «back-end» выполняет преобразование из стекового или четырехъядерного обозначение команд конечной машины. Независимый от машины оптимизатор может застревать между ними. –
@RichardTingle - Возможность JITCed Java работать быстрее, чем статически скомпилированный код, именно потому, что он не статически компилируется. Не имеет ничего общего с независимостью от машины. (Есть, на самом деле, JITC, которые построены так, как я описываю выше.) –