[Zobacz historię edycji, aby uzyskać zupełnie inną odpowiedź, która jest teraz zasadniczo przestarzała.]
Tak, istnieje kilka kompilatorów JIT dla C i / lub C ++.
CLing (jak można się domyślać z gry) jest oparty na Clang / LLVM. Działa jak tłumacz. To znaczy, dajesz mu kod źródłowy, wydajesz komendę do uruchomienia i działa. Nacisk kładziony jest przede wszystkim na wygodę i szybką kompilację, a nie maksymalną optymalizację. Jako taka, choć technicznie odpowiedź na samo pytanie, tak naprawdę nie odpowiada to celom PO.
Inną możliwością jest NativeJIT . To pasuje nieco do pytania. W szczególności nie akceptuje kodu źródłowego C lub C ++, kompiluje go i wykonuje. Jest to raczej mały kompilator, który można skompilować w programie C ++. Akceptuje wyrażenie, które jest zasadniczo wyrażone jako EDSL w twoim programie C ++ i generuje z niego rzeczywisty kod maszynowy, który następnie możesz wykonać. To znacznie lepiej pasuje do frameworka, w którym można skompilować większość programu za pomocą normalnego kompilatora, ale ma kilka wyrażeń, których nie poznasz do czasu wykonania, które chcesz wykonać z czymś, co zbliża się do optymalnej szybkości wykonania.
Jeśli chodzi o pozorną intencję pierwotnego pytania, myślę, że podstawowy punkt mojej pierwotnej odpowiedzi nadal jest zasadny: podczas gdy kompilator JIT może dostosowywać się do takich rzeczy, jak dane, które różnią się od jednego wykonania do drugiego, a nawet zmieniają się dynamicznie podczas jednego wykonania, w rzeczywistości jest to stosunkowo niewielka różnica, przynajmniej z zasady. W większości przypadków uruchomienie kompilatora w czasie wykonywania oznacza, że musisz zrezygnować z dość dużej optymalizacji, więc najlepszym, na co zwykle masz nadzieję, jest to, że jest on tak szybki, jak mógłby to zrobić konwencjonalny kompilator.
Chociaż można postulować sytuacje, w których informacje dostępne dla kompilatora JIT mogłyby pozwolić mu wygenerować znacznie lepszy kod niż konwencjonalny kompilator, przypadki tego typu w praktyce wydają się dość niezwykłe (iw większości przypadków, w których udało mi się zweryfikować tak się dzieje, tak naprawdę było to spowodowane problemem w kodzie źródłowym, a nie statycznym modelem kompilacji).