Интерпретируемые языки: чем выше уровень, тем быстрее? - PullRequest
20 голосов
/ 05 мая 2010

На данный момент я разработал около 5 экспериментальных языков и переводчиков для них, для образования, для хобби и для развлечения.

Одна вещь, которую я заметил: язык, подобный ассемблеру, показывающий только подпрограммы и условные переходы в виде структур, был намного медленнее, чем язык высокого уровня с поддержкой if, while и так далее. Я разработал их оба одновременно, и оба были переведенными языками. Я написал интерпретаторы на C ++ и постарался максимально ускорить выполнение кода.

Моя гипотеза: почти во всех случаях производительность интерпретируемых языков повышается с их уровнем (высокий / низкий).

  • Я в принципе прав с этим? (Если нет, то почему?)

РЕДАКТИРОВАТЬ: Я не упомянул слово скомпилировано здесь даже один раз, оно о интерпретации против интерпретации!

Ответы [ 9 ]

30 голосов
/ 05 мая 2010

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

12 голосов
/ 05 мая 2010

В конце концов, синтаксический анализ строки текста на вашем языке займет примерно столько же времени, независимо от того, говорим ли мы о сборке, а не о языке следующего важного (TNBL). Это не верно в буквальном смысле, но это верно в смысле Тьюринга, типа Big-O-Notation.

Если потребуется (опять же «примерно») столько же времени, чтобы определить, что это значит:

mov $3, $4, $5

как это:

print "foo"

... тогда давайте представим, что пишем Hello World на двух наших языках. У интерпретатора ассемблера будет гораздо более сложная программа для анализа. Скажем, длина n строк, что в n раз больше строк, чем у TNBL Hello Wolrld. Таким образом, ваши самые основные накладные расходы в n раза больше.

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

Я уверен, что вы увидите некоторых Java-программистов, которые не согласны с этим тезисом, но я хотел бы отметить, что у Java есть несколько преимуществ: промежуточный байт-код, который пытается получить код, максимально приближенный к аппаратного обеспечения, насколько это было возможно до его выполнения, и тысячи человеко-лет потратили на разработку этого языка во время компиляции и оптимизации. Они едва ли находятся на континууме с увлеченным языком. =]

4 голосов
/ 05 мая 2010

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

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

Таким образом, картина производительности не так проста, как может показаться.

1 голос
/ 06 мая 2010

Если бы у вас был интерпретируемый язык с одной командой: runMyEntireProgramNatively(), он был бы быстрее, чем интерпретируемый язык с большим количеством команд. Чем меньше делает каждая команда, тем больше отношение времени, затрачиваемого на интерпретацию, к фактическому выполнению.

1 голос
/ 05 мая 2010

Я бы сказал, что ты наполовину прав. Если вы изобразите скорость интерпретации с уровнем языка по оси X и скоростью выполнения по оси Y, вы получите кривую «ванны» - интерпретация языка очень низкого уровня может быть довольно быстрой, а интерпретация чрезвычайно высокой Уровень языка может быть довольно быстрым. Между ними интерпретация существенно медленнее.

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

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

Первоначально предполагалось, что большинство JVM, «управляемая» среда .NET, интерпретаторы байт-кода Smalltalk и т. Д. Будут соответствовать последнему случаю. Как быстро обнаружили большинство тех, кто пытался разработать их, сложно поддерживать затраты на интерпретацию на достаточно низком уровне для достижения этой цели. У каждого, кого я знаю о том, что он вписывается в этот класс, есть внутренний цикл, написанный на ассемблере вручную и обычно хорошим программистом на ассемблере. Я бы даже сказал, что если вы попытаетесь использовать язык более высокого уровня (даже C), он будет медленнее и, вероятно, значительно (если вы добавляете накладные расходы для каждые инструкция ввода, даже одна дополнительная инструкция во внутреннем цикле почти наверняка приведет к измеримому снижению скорости).

1 голос
/ 05 мая 2010

Ну, очевидно, это будет зависеть от того, как вы реализовали разные языки.

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

0 голосов
/ 05 мая 2010

Предполагается, что оба реализованы примерно одинаково, с языком низкого уровня неоптимизированным и языком высокого уровня, не расширенным до промежуточного кода нижнего уровня - 'вероятно'.

В таком случае, высокийПреимущество языка уровня заключается в том, что на каждую инструкцию умещается более скомпилированный (более быстрый) код.

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

Я скажу, что проще для реализации более быстрого языка высокого уровня.(в моем ограниченном опыте)

0 голосов
/ 05 мая 2010

Как вы делаете справедливое сравнение?

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

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

0 голосов
/ 05 мая 2010

Резюме : сравнительный анализ сложен. Вы не можете обобщать из анекдотов.

Это правило не подтверждается доказательствами.

Как вы настраиваете свой эксперимент, из которого вы делаете вывод «выше = быстрее»? У вас есть примеры реализации идентичных алгоритмов и наборов тестов, которые позволяют вам объективно сравнивать один интерпретируемый язык с другим?

Если вы просто создаете небольшие мини-тесты, очень высока вероятность того, что вы делаете вывод из слишком малого количества точек данных.

Например, если один интерпретируемый язык имеет оператор quicksort , вы можете подумать: «Ага! Быстрее!» чем язык, где вы должны осуществить сортировку вручную. Однако быстрая сортировка имеет худшую производительность O (n ^ 2). Если я передам вашей высокоуровневой операции пример набора данных для наихудшего случая, то другая реализованная вручную сортировка слиянием превзойдет ее.

...