Istnieje ogólny problem z tym pytaniem, ponieważ jest ono zbyt absolutne. Nie ma sensu mówić, że „język X jest szybszy niż język Y”. Sam język komputera nie jest „szybki” ani „wolny”, ponieważ jest jedynie sposobem wyrażenia algorytmu. Rzeczywiste pytanie powinno brzmieć w kolejności „dlaczego implementacja X1 języka X jest szybsza niż implementacja Y1 języka Y dla tej konkretnej dziedziny problemowej?”
Niektóre różnice prędkości z pewnością wypadną z samego języka, ponieważ niektóre języki są łatwiejsze do wdrożenia w niektórych domenach niż inne. Ale większość tego, co sprawia, że wdrożenie jest szybkie, nie jest językiem. Na przykład tak naprawdę nie można powiedzieć „Python jest wolniejszy niż Java” bez zastanowienia się, czy mówimy o CPython, IronPython czy PyPy. Jest to szczególnie prawdziwe w przypadku języków korzystających z maszyny wirtualnej, ponieważ na jej szybkość bezpośrednio wpłynie jakość maszyny wirtualnej.
Nawiasem mówiąc, pracuję z systemem, który z różnych powodów nie może używać JIT na naszym urządzeniu z bardzo popularną maszyną wirtualną JavaScript, która normalnie go obsługuje. Oznacza to, że nasz JavaScript działa znacznie, znacznie wolniej niż na komputerze PC z podobnym procesorem. Ta jedna zmiana, która nie jest bezpośrednio związana z samym językiem, powoduje, że JavaScript staje się „kilka razy wolniejszy niż C ++” do bycia „rzędami wielkości wolniejszymi niż C ++” w przypadku zadań, na których nam zależy.
Należy również wziąć pod uwagę fakt, że języki różnią się cechami wydajności w sposób, który nie jest bezpośrednio porównywalny. Zbyt wiele testów porównawczych po prostu tłumaczy program z języka A na język B i nie bierze pod uwagę, że języki różnią się tym, które funkcje są szybkie. (Możesz to zobaczyć w każdym rozsądnym porównaniu porównawczym, takim jak te, do których prowadzisz link, ponieważ często zawierają notatki typu „dzięki tak-a-tak za pokazanie mi, jak zaimplementować to w języku Foo.)
Na przykład weź ten kod Java:
for(int i=0;i<10;i++) {
Object o = new Object;
doSomething(o);
}
Kuszące byłoby „przepisanie” tego w C ++ i porównanie czasów wykonywania:
for(int i=0;i<10;i++) {
Object *o = new Object;
doSomething(o);
delete(o);
}
Chodzi o to, że każdy kompetentny programista C ++ od razu zobaczy, że w C ++ nie jest to najszybszy sposób na zrobienie czegoś. Możesz łatwo przyspieszyć, zmieniając go, aby był bardziej odpowiedni dla C ++:
for(int i=0;i<10;i++) {
Object o;
doSomething(&o);
}
Nie chodzi o to, że C ++ może być szybki, ale pisanie testów porównawczych w językach jest naprawdę bardzo trudne. Aby zrobić to odpowiednio, musisz być ekspertem w obu językach i pisać od zera w obu językach. Nawet wtedy możesz łatwo natknąć się na obszary, w których jeden język wyróżnia się w określonym zadaniu. Na przykład mogę napisać wersję Towers of Hanoi w C ++, która będzie działać szybciej niż Java na dowolnym rozsądnym kompilatorze. Mogę to zrobić, zasadniczo oszukując, używając szablonów C ++, ocenianych w czasie kompilacji (http://forums.devshed.com/c-programming-42/c-towers-of-hanoi-using-templates-424148.html)
Nie chodzi o to, że mógłbym powiedzieć, że „C ++ jest szybszy niż Java”, ponieważ mój program powrócił natychmiast, podczas gdy wersja Java działała przez kilka minut (i mam nadzieję, że nikt nie zauważył, że budowa mojego programu zajęła pół godziny.) Chodzi o to, że różnią się wąskimi literami, C ++ jest szybszy. W innych wąskich przypadkach może być na odwrót. Nie jest to więc „C ++ jest szybszy”, to „C ++ jest szybszy w przypadkach, w których można ocenić wyrażenie w czasie kompilacji za pomocą szablonów”. Mniej satysfakcjonujące, ale prawdziwe.
Różnice prędkości w językach dotyczą głównie implementacji. Języki skompilowane będą szybsze niż języki interpretowane. Kompilacja do kodu natywnego będzie szybsza niż kompilacja do kodu bajtowego. Będzie to miało o wiele większy efekt niż pytania, czy język jest wpisywany statycznie, czy nie. I oczywiście dobre wdrożenia będą szybsze niż złe.
I nie zapominaj, że dobrzy programiści będą produkować szybszy kod niż źli programiści, często w stopniu znacznie przewyższającym różnice językowe.