Nie zgadzam się z dotychczasowymi odpowiedziami.
Głównym problemem do zrozumienia jest to, że kompilator C++ tworzy kod, który jest odpowiedni dla bardzo niemy środowiska. Nawet nowoczesny procesor nie wie o wirtualnych funkcjach, piekle, nawet funkcje są rozciągliwe. Procesor naprawdę nie dba o to, że kod obsługi wyjątków służący do rozwijania stosu znajduje się poza jakąkolwiek funkcją, na przykład. Obsługa procesorów w sekwencjach instrukcji, z przeskokami i zwrotami. Funkcje z pewnością nie mają nazw w odniesieniu do procesora.
W związku z tym wszystko, co jest potrzebne do obsługi koncepcji funkcji, umieszczane jest przez kompilator. Na przykład. vtables to tylko tablice o odpowiednim rozmiarze, z odpowiednimi wartościami z punktu widzenia procesorów. __func__
kończy się jako ciąg bajtów w tabeli smyczkowy, ostatni z których jeden jest 00.
Teraz nie ma nic, że mówi, że środowisko docelowe musi być głupi. Możesz zdecydowanie celować w JVM. Ponownie kompilator musi wypełnić to, co nie jest oferowane natywnie. Brak surowej pamięci? Następnie przydziel dużą tablicę bajtów i użyj jej zamiast niej. Bez surowych wskazówek? Po prostu użyj liczb całkowitych do tej wielkiej tablicy bajtów.
Głównym problemem jest to, że program C++ wygląda całkiem nierozpoznawalnie ze środowiska hostingowego. JVM nie jest głupia, wie o funkcjach, ale oczekuje, że będą członkami klasy. Nie spodziewa się, że mają one w swoich nazwach <
i >
. Możesz to omijać, ale to, na czym skończysz, to po prostu łamanie nazw. W przeciwieństwie do dzisiejszego maniaka nazw tego rodzaju wymazywanie nazw nie jest przeznaczone dla łączników C, ale dla inteligentnych środowisk. Tak więc jego silnik refleksyjny może przekonać się, że istnieje klasa c__plus__plus
z funkcją składową __namespace_std__for_each__arguments_int_pointer_int_pointer_function_address
i to nadal jest dobry przykład. Nie chcę wiedzieć, co się stanie, jeśli masz ciągi znaków do odwracania iteratorów.
Odwrotnie jest w sumie dużo łatwiej. Niemal wszystkie abstrakcje innych języków można wymasować w C++. Zbieranie śmieci? To jest już dozwolone w C++ dzisiaj, więc możesz to wspierać nawet dla void*
.
Jedną z rzeczy, do której jeszcze nie dotarłem, jest wydajność. Emulacja surowej pamięci w tablicy wielobajtowej? To nie będzie szybkie, szczególnie jeśli włożysz w nie podwójne. Możesz grać dużo sztuczek, aby przyspieszyć, ale za jaką cenę? Prawdopodobnie nie dostaniesz komercyjnie opłacalnego produktu. W rzeczywistości możesz używać języka, który łączy najgorsze części C++ (wiele nietypowych zachowań zależnych od implementacji) z najgorszymi częściami VM (wolno).
Szablony są wyłącznie konstruktorem czasu kompilacji. W przeciwieństwie do generycznych, nie potrzebują żadnej obsługi w czasie wykonywania. – Ferruccio