Nie - z pewnością można skompilować języki dynamiczne.
Istnieje nawet kilka dynamicznych języków, które zawsze są kompilowane zgodnie z projektem (np. Clojure).
Pytanie dotyczy jednak ważnego pokrewnego punktu: chociaż można dynamicznie kompilować języki dynamiczne, często nie można kompilować dynamicznych języków do kodu, który jest tak wydajny jak język o typie statycznym . Wynika to z faktu, że istnieją pewne nieodłączne cechy dynamicznych języków, które wymagają sprawdzania czasu wykonywania, które byłyby niepotrzebne w statycznie skompilowanym języku.
Przykład: języki, które pozwalają na łatanie w czasie wykonywania obiektów (np. Ruby) często wymagają inspekcji obiektu (z wyszukiwaniem mieszającym lub podobnym) za każdym razem, gdy wywołujesz metodę na obiekcie. Nawet jeśli zostanie to skompilowane, kompilator będzie musiał wygenerować kod, aby wykonać wyszukiwanie metody w czasie wykonywania. W pewnym stopniu wyszukiwanie tej metody nie różni się od tego, co musiałby zrobić tłumacz.
Dodaje to znaczny narzut w porównaniu do wywołania metody w języku takim jak Java, gdzie poprawna metoda może zostać ustalona przez kompilator na podstawie definicji klasy i zredukowana do prostego wywołania funkcji w kodzie natywnym.
Uważam, że ten efekt bardziej niż cokolwiek innego powoduje, że dynamiczne języki mają średnio niższą wydajność niż ich statycznie skompilowane odpowiedniki. Jak widać z wadliwych testów , to języki o typie statycznym (C, Java, Fortran itp.) Są najszybsze w przypadku języków dynamicznych (Perl, Python, Ruby, PHP itp.) Na dole rankingu.