[Дивіться історію редагування для зовсім іншої відповіді, яка в основному застаріла.]
Так, є кілька компіляторів JIT для C та / або C ++.
CLing (як ви могли здогадатися з гри) заснований на Clang / LLVM. Він діє як перекладач. Тобто ви даєте йому якийсь вихідний код, даєте команду для його запуску, і він запускається. Акцент тут робиться насамперед на зручності та швидкому складанні, а не на максимальній оптимізації. Таким чином, хоча технічно це відповідь на саме запитання, це не дуже відповідає наміру ОП.
Інша можливість - NativeJIT . Це підходить до питання дещо інакше. Зокрема, він не приймає вихідний код C або C ++, а компілює його та виконує. Скоріше, це невеликий компілятор, який можна скласти у свою програму C ++. Він приймає вираз, який в основному виражається як EDSL у вашій програмі C ++, і генерує з цього фактичний машинний код, який ви можете потім виконати. Це набагато краще відповідає рамці, де ви можете скласти більшу частину програми за допомогою звичайного компілятора, але у вас є кілька виразів, про які ви не знатимете до часу виконання, які ви хочете виконати з чимось наближенням до оптимальної швидкості виконання.
Що стосується очевидного наміру оригінального запитання, я вважаю, що основний момент моєї оригінальної відповіді все ще стоїть: хоча компілятор JIT може адаптуватись до таких речей, як дані, що змінюються від одного виконання до іншого, або навіть динамічно змінюються під час одного виконання, реальність така, що це робить порівняно незначну різницю, принаймні як загальне правило. У більшості випадків запуск компілятора під час виконання означає, що вам потрібно відмовитись від оптимізації, тому найкраще, на що ви навіть сподіваєтесь, - це те, що він настільки ж швидкий, як і звичайний компілятор.
Хоча можливо постулювати ситуації, коли інформація, доступна компілятору JIT, могла б дати йому можливість генерувати значно кращий код, ніж звичайний компілятор, випадки цього на практиці здаються досить незвичними (і в більшості випадків, коли мені вдалося перевірити це відбувається, це було насправді пов’язано з проблемою у вихідному коді, а не зі статичною моделлю компіляції).