Pytanie jest mylące, ponieważ C i C ++ są językami , podczas gdy JVM jest maszyną wirtualną, a .Net platformą . Scala może być zaimplementowana w C lub C ++ i może generować kod maszynowy zamiast kodu bajtowego dla maszyny wirtualnej.
Odpowiedź na zadane pytanie:
Scala nie została zaimplementowana w C lub C ++, ponieważ Scala, język, w którym jest faktycznie zaimplementowany, jest znacznie lepszym językiem.
Dlaczego to jest lepsze? Cóż, przeczytaj o celach Oderskiego w języku Scala .
Odpowiedź na pytanie, które mogło być zamierzone:
Scala generuje przede wszystkim kod bajtowy JVM, ponieważ zapewnia doskonałą przenośność, a także takie funkcje, jak niezawodny i wydajny moduł wyrzucania elementów bezużytecznych, optymalizacje w czasie wykonywania oraz kompilacja „na czas” przez JVM .
Powtórzę tę ostatnią rzecz: JVM skompiluje się do kodów maszynowych w uruchomionym kodzie. To jest kompilacja, podobnie jak kompilatory C i C ++.
Dostępne są inne maszyny wirtualne, ale Odersky, twórca Scali, był już bardzo dobrze zaznajomiony z JVM. Zamierzał mieć CLR jako alternatywę, ale wysiłek, aby to osiągnąć, nie przyniósł jeszcze sukcesu.
Odpowiedź na pytanie, które mogło / powinno być zadane:
Kompilacja do kodu maszynowego nie zapewnia wystarczających korzyści w porównaniu z kompilacją do kodu bajtowego JVM.
Z pewnością możliwe jest generowanie mikrodruków w C lub C ++, które pobijają odpowiedniki JVM. Prawdą jest również, że wyjątkowo zoptymalizowany kod w C lub C ++ pobije wyjątkowo zoptymalizowany kod w Javie lub Scali. Różnica nie jest jednak aż tak duża w przypadku programu działającego długo.
Zauważ, że Scala nie jest szczególnie dobrym językiem skryptowym właśnie dlatego, że narzut dla krótkich programów jest zbyt duży.
Jednak w większości przypadków szybkość rozwoju i łatwość konserwacji są ważniejsze niż szybkość wykonania . W tych przypadkach, gdy ludzie są bardziej zainteresowani pisaniem bardzo wysokiego poziomu kodu, który jest łatwy do zrozumienia i zmiany, optymalizacje w czasie wykonywania zapewniane przez JVM mogą z łatwością pokonać optymalizacje w czasie kompilacji wykonane przez kompilatory C lub C ++, tworząc JVM (i CLR ) cel, który faktycznie wykona się szybciej.
Tak więc, bez względu na to, czy pytanie dotyczyło kompilatora Scala jako pliku wykonywalnego kodu maszynowego, czy programów Scala będących kodem maszynowym, potencjalne przyrosty prędkości niekoniecznie przekładają się na rzeczywiste przyrosty prędkości.
A przy okazji,
Dam ci kontrprzykład: Haskell. Haskell generuje kod maszynowy, a jednak programy Haskell gorzej wypadają w strzelaninie Debiana niż w Scali. Biorąc to pod uwagę, czy ktoś może być pewien, że programy Scala byłyby szybsze, gdyby były kompilowane bezpośrednio do kodu maszynowego?