Почему некоторые языки программирования быстрее других? - PullRequest
5 голосов
/ 08 июля 2011

Я знаю, что ASM в основном самый быстрый, который можно получить, но что делает HLL медленнее, чем ASM, абстракция? Под абстракцией я подразумеваю, что, например, в C ++ у вас есть класс, необходимо хранить данные о том, что хранится в классе, из чего он происходит, частные / публичные средства доступа и другие вещи. Когда этот код компилируется, существует ли фактический код сборки, который работает, чтобы выяснить информацию о классе? Как CPython построен на C, так что во время выполнения даже больше абстракций и инструкций, чем C. Является ли что-то из того, что я говорю, правдой? Я думаю, что ответил на свой вопрос, но я хотел бы получить ответ от более опытного человека, кроме меня.

РЕДАКТИРОВАТЬ: Я понимаю, что Python интерпретируется, но не будет ли он все еще медленнее, чем C, если бы он был скомпилирован?

Ответы [ 4 ]

5 голосов
/ 08 июля 2011

Это широкий вопрос.

По сути, скомпилированные языки переводятся в машинные инструкции (операционные коды) так же, как это делает ASM (ASM также является уровнем абстракции). Хороший компилятор, скорее всего, превзойдет результаты среднего ASM-кодера, потому что он может исследовать большой фрагмент кода и применять правила оптимизации, которые большинство программистов не могут сделать вручную (упорядочение инструкций для оптимального выполнения и т. Д.).

В связи с этим все скомпилированные языки созданы «равными». Однако некоторые более равны, чем другие. Насколько хорошо работает скомпилированный код, в основном зависит от того, насколько хорош компилятор, и гораздо меньше от конкретного языка. Некоторые функции, такие как виртуальные методы, приводят к снижению производительности (в прошлый раз, когда я проверял, виртуальные методы были реализованы с использованием таблицы указателей функций, хотя мои знания могут быть датированы здесь).

Интерпретируемые языки фундаментально исследуют понятный человеку язык во время выполнения программы, по существу требуя эквивалентных стадий компиляции и выполнения во время выполнения программы. Поэтому они почти всегда будут несколько медленнее, чем скомпилированный аналог. Интеллектуальные реализации будут постепенно интерпретировать части кода как выполненные (чтобы избежать интерпретации ветвей, которые никогда не попадут в кэш), и кэшировать результат так, что данная часть кода будет интерпретироваться только один раз.

Также существует золотая середина, в которой читаемый человеком язык переводится в псевдокод (иногда называемый P-кодом или байтовым кодом). Цель этого состоит в том, чтобы иметь компактное представление кода, который быстро интерпретируется, но при этом переносим во многие операционные системы (вам все еще нужна программа для интерпретации P-кода на каждой платформе). Java попадает в эту категорию.

2 голосов
/ 08 июля 2011

На самом деле ваша предпосылка не обязательно верна.

Многие скажут, что хороший оптимизирующий компилятор может превзойти сборку, написанную вручную.

Другие могут сказать, что компиляторы точно в срокподобно тем, что для Java и .Net, могут использовать эвристику во время выполнения и, следовательно, превосходить любой статически скомпилированный код.

Среди компиляторов и интерпретаторов, уверяю вас, есть , а не , обязательно любая корреляция между тем, насколько высокоУровень языка и эффективность во время выполнения. Очень языки высокого уровня могут создавать чрезвычайно эффективный код.

ИМХО ...

1 голос
/ 08 июля 2011

Когда вы говорите о скорости языка, первое, что нужно спросить, это если он скомпилирован или интерпретирован.Интерпретируемый язык обычно работает на один-два порядка медленнее, чем скомпилированный язык.

Но это может не иметь значения.У интерпретируемого языка могут быть и другие преимущества, и то, что вы хотите с ним сделать, может не требовать ослепительной скорости - если бы у него была скорость, вы бы этого не заметили.

Например, все языки оболочки командной строки - это всеинтерпретировать (насколько мне известно), и это нормально, потому что они просто выполняют одну трудоемкую команду операционной системы, а затем следующую.Циклы, возникающие при переходе между командами, никогда не будут замечены.

Даже на быстро скомпилированных языках программы, которые просто связывают воедино один вызов библиотеки, а затем другой, с небольшими манипуляциями с необработанными данными, становятся маловыиграйте от скорости языка, потому что все время тратится в подвале.

Где важна скорость языка в этом подвале.Если вы пишете только код более высокого уровня, скорость скомпилированного кода не имеет большого значения.Значение lot важно, если ваш код вызывает подчиненные процедуры больше, чем это действительно необходимо.Компилятор не может помочь вам с этим. Вот пример того, как решить эту проблему.

1 голос
/ 08 июля 2011

Как правило, чем более абстрактный (и обычно более удобный для программистов) язык, тем медленнее он будет.Компилятор AC сгенерирует ассемблерный код, поэтому он так зависит от системы.Такие языки, как Java, запускаются на виртуальной машине, которая сама является скомпилированной программой.Но эта абстракция в целом замедлит ход событий.

Но это не значит, что нет исключений.Как сказал paulsm4, языки высокого уровня могут оказаться более эффективными, чем языки низкого уровня, потому что они могут использовать различные шаблоны (я не знаю деталей).

...