У цьому питанні є загальна проблема в тому, що вона занадто абсолютна. Насправді немає сенсу говорити "мова X швидша за мову Y". Мова комп'ютера сама по собі не є "швидкою" чи "повільною", оскільки це лише спосіб вираження алгоритму. Справжнє питання повинно бути чимось порядком "чому реалізація X1 мови X швидша, ніж реалізація Y1 мови Y для цієї конкретної проблемної області?"
Деякі відмінності у швидкості, безумовно, випадуть із самої мови, оскільки певні мови легше реалізувати певні домени, ніж інші. Але багато з того, що робить імплементацію швидкою, - це не мова. Наприклад, ви дійсно не можете сказати, що "Python повільніше, ніж Java", не враховуючи, чи говорите ви про CPython, IronPython або PyPy. Особливо це стосується мов, які використовують VM, оскільки швидкість буде безпосередньо впливати на якість VM.
Як осторонь, я працюю із системою, яка з різних причин не може використовувати JIT на нашому пристрої з дуже популярною JavaScript VM, яка зазвичай підтримує його. Це означає, що наш JavaScript працює набагато повільніше, ніж на ПК з аналогічним процесором. Ця зміна, яка безпосередньо не пов'язана з самою мовою, вимагає того, щоб JavaScript не був "в кілька разів повільнішим за С ++" до "на порядок повільнішим за С ++" для завдань, які нас цікавлять.
Також слід врахувати, що мови відрізняються за характеристиками продуктивності способами, які безпосередньо не порівнянні. Забагато орієнтирів просто перекладають програму з мови A на мову B і не враховують, що мови відрізняються тим, що функції швидко. (Ви можете бачити це в будь-якому розумному порівнянні порівняльних показників, наприклад, з тими, на які ви посилаєтесь, оскільки вони часто мають примітки на кшталт "завдяки так собі і тому, що показали мені, як реалізувати це мовою Foo."
Наприклад, візьміть цей код Java:
for(int i=0;i<10;i++) {
Object o = new Object;
doSomething(o);
}
Було б заманливо "переписати" це на C ++ і порівняти час виконання:
for(int i=0;i<10;i++) {
Object *o = new Object;
doSomething(o);
delete(o);
}
Вся справа в тому, що будь-який грамотний програміст на C ++ відразу побачить, що в C ++ це не найшвидший спосіб зробити щось. Ви можете легко пришвидшити речі, змінивши їх на більш придатні для C ++:
for(int i=0;i<10;i++) {
Object o;
doSomething(&o);
}
Справа не в тому, що C ++ може бути швидким, а замість того, щоб писати орієнтири для порівняння мов, це дуже, дуже важко. Щоб зробити це належним чином, ви повинні бути експертом в обох мовах і писати з нуля на обох мовах. Вже тоді ви можете легко натрапити на області, де одна мова перевершує певне завдання. Наприклад, я можу написати версію Towers of Hanoi в C ++, яка працюватиме швидше, ніж Java, на будь-якому розумному компіляторі. Я можу це зробити, по суті, обманом, використовуючи шаблони C ++, оцінені під час компіляції (http://forums.devshed.com/c-programming-42/c-towers-of-hanoi-using-templates-424148.html)
Справа не в тому, що я міг би сказати, що "C ++ швидше, ніж Java", тому що моя програма повернулась миттєво, поки версія Java працювала хвилин (і сподіваючись, що ніхто не помітив, що на мою програму пішло півгодини.) Справа в тому, що для цього варіюється вузький регістр, C ++ - швидше. Для інших вузьких випадків це може бути навпаки. Отже, це не "C ++ швидше", це "C ++ швидше в тих випадках, коли ви можете оцінити вираз під час збирання за допомогою шаблонів." Менш задовольняє, але правда.
Перепади швидкості в мовах здебільшого стосуються реалізації. Мови, що складаються, будуть швидшими, ніж інтерпретовані. Компіляція до рідного коду буде швидшою, ніж компіляція в байт-код. Це матиме набагато більший ефект, ніж питання, наприклад, чи є мова статично набраною чи ні. І звичайно, хороші реалізації будуть швидшими, ніж погані.
І не забувайте, що хороші програмісти створюють швидший код, ніж погані програмісти, часто в такій мірі, що значно переважає мовні відмінності.