Можно ли разработать динамический язык без значительной потери производительности? - PullRequest
4 голосов
/ 18 сентября 2010

Можно ли спроектировать что-то вроде Ruby или Clojure без значительной потери производительности во многих ситуациях по сравнению с C / Java?Играет ли аппаратный дизайн свою роль?

Редактировать: Имея в виду значительный, я имею в виду порядок, а не только десять процентов

Редактировать: я подозреваю, что delnan правильно со мной, имея в виду динамические языки, поэтому яизменил название

Ответы [ 5 ]

8 голосов
/ 18 сентября 2010

Производительность зависит от многих вещей. Конечно, семантика языка должна быть сохранена, даже если мы ее компилируем - вы не можете удалить динамическую диспетчеризацию из Ruby, это ускорит процесс, но это полностью разрушит 95% всего кода Ruby в мире. Но все же большая часть производительности зависит от того, насколько умна реализация.

Я полагаю, под "высоким уровнем" вы подразумеваете "динамический"? Haskell и OCaml являются чрезвычайно высокоуровневыми, но они скомпилированы изначально и могут опережать C # или Java, даже C и C ++ в некоторых случаях, особенно если в игру вступает параллелизм. И они, конечно, не были разработаны с целью производительности # 1. Но авторы компиляторов, особенно те, которые сосредоточены на функциональных языках, очень умные люди. Если вы или я начали язык высокого уровня, даже если мы использовали, например, LLVM, как бэкэнд для нативной компиляции, мы бы не приблизились к этой производительности.

Заставить динамические языки работать быстрее сложнее - они откладывают многие решения (типы, члены класса / объекта, ...) на время выполнения вместо времени компиляции, и хотя статический анализ кода иногда может доказать, что это невозможно в строках n и м, вам все еще нужно иметь передовую среду выполнения и делать довольно много вещей, которые компилятор статического языка может делать во время компиляции. Даже динамическая диспетчеризация может быть оптимизирована с помощью более умной виртуальной машины ( Inline Cache кто-нибудь?), Но это большая работа. То есть больше, чем мог бы сделать небольшой новый фанатский язык.

Также см. Динамические языки Стива Йегге наносят ответный удар .

И, конечно, что такое значительная потеря производительности? В 100 раз медленнее, чем С, читает как много, но, как мы все знаем, 80% времени выполнения тратится на 20% кода = 80% кода не окажет заметного влияния на воспринимаемую производительность всей программы. Для оставшихся 20% вы всегда можете переписать его на C или C ++ и вызвать его из динамического языка. Для многих приложений этого достаточно (для некоторых вам даже не нужно оптимизировать). В остальном ... ну, если производительность настолько важна, вы должны написать ее на языке, предназначенном для производительности.

1 голос
/ 18 сентября 2010

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

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

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

1 голос
/ 18 сентября 2010

Не путайте языковой дизайн с платформой, на которой он работает.

Например, Java - это язык высокого уровня. Он работает на JVM (как и Clojure - как указано выше, и JRuby - версия Ruby для Java). JVM будет выполнять анализ байт-кода и оптимизировать работу кода (с использованием анализа escape, компиляции точно в срок и т. Д.). Таким образом, платформа влияет на производительность, которая в значительной степени не зависит от самого языка (см. здесь для получения дополнительной информации о производительности Java и сравнениях с C / C ++)

0 голосов
/ 18 сентября 2010

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

0 голосов
/ 18 сентября 2010

Возможно, вы захотите взглянуть на то, что выдвинула инициатива DARPA HPCS . Было предложено 3 языка программирования: Sun's Fortress, IBM X10 и Cray's Chapel. Последние два находятся в стадии разработки. Соответствует ли какое-либо из них вашему определению high-level Я не знаю.

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

...