LINUX.ORG.RU

История изменений

Исправление SZT, (текущая версия) :

Исторически так сложилось, что компиляторы каких либо ЯП часто сперва компилируют в С, затем полученный код уже на живую платформу.

Нет. Так конечно делают, но это не является очень уж распространенной практикой.

А собственно, за счёт чего он (прирост производительности) при этом получается?

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

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

И вообще, язык Си не является чем-то таким фундаментальным, процессоры специально затачивают под Си, чтобы он там эффективно исполнялся (см. https://habr.com/ru/company/badoo/blog/420407/). Есть архитектуры, на которые язык Си плохо ложится с его последовательным исполнением, циклами и рекурсией. Dataflow-архитектуры по Си вообще не заточены. Под FPGA код на Си без кривых костылей не скомпилируешь.

Исходная версия SZT, :

Исторически так сложилось, что компиляторы каких либо ЯП часто сперва компилируют в С, затем полученный код уже на живую платформу.

Нет. Так конечно делают, но это не является очень уж распространенной практикой.

А собственно, за счёт чего он (прирост производительности) при этом получается?

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

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

И вообще, язык Си вообще не является чем-то таким фундаментальным, процессоры специально затачивают под Си, чтобы он там эффективно исполнялся. Есть архитектуры, на которые язык Си плохо ложится с его последовательным исполнением, циклами и рекурсией. Dataflow-архитектуры по Си вообще не заточены. Под FPGA код на Си без кривых костылей не скомпилируешь