LINUX.ORG.RU

Почему интерпретатор медленный?


0

2

Я не совсем понимаю, откуда берутся тормоза в интерпретаторе. Допустим у нас есть сторока

expression1 expression2;
где expression2 является аргументом (поступает на вход) expression1. Ведь если даже у нас интерпретация, expression2, сначала компилируется, потом выполняется, потом поступает на вход expression1, насколько я понимаю. А при компиляции, они скомпилируются за один раз.

Все равно же, все представляется в машинных кодах.

То есть, основные тормоза создаются тем, что при интерпретации у нас больше фаз исполнения? Это связано с пропускной способностью шин процессора? Или с другими особенностями железа? Или еще с чем-то?


Интерпретатор исполняет больше машинного кода для того же действия. Разница в количестве то есть.

abacaba
()
Ответ на: комментарий от KRoN73

Циклы [...] Интерпретатор транслирует на каждой итерации

Да ну.

Кстати, ты же близко знаком с Forth? В треде забыли упомянуть про шитый код (threaded code).

В википедии пишут «However, a program small enough to fit fully in a computer processor's cache may run faster than a larger program that suffers many cache misses»

То есть не все так однозначно

Deleted
()
Ответ на: комментарий от Deleted

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

anonymous
()
Ответ на: комментарий от foo

То есть, получается, что, если не будет динамической типизации, разницы в скорости вообще не будет?

Посмотри на интерпретацию forth.

x3al ★★★★★
()
Ответ на: комментарий от x3al

То есть, получается, что, если не будет динамической типизации, разницы в скорости вообще не будет?

Посмотри на интерпретацию forth

Можем наоборот, сделай JIT-компилятор для C++ (не байткода LLVM, а именно текста на C++). Сравним скорость. :-) Особенно на программе, использующей boost.

monk ★★★★★
()
Ответ на: комментарий от foo

А почему бы не спросить почему все так медленно работает - ведь электроны бегают очень быстро? Ведь в конечном итоге всю работу производят именно они!

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

saibogo ★★★★
()
Ответ на: комментарий от monk

Но ведь C++ не нужен! Если нужен пруфлинк, то смотреть куда-нибудь в сторону C++FQA.

x3al ★★★★★
()
Ответ на: комментарий от comp00

А вообще, про «основную особенность» тоже было бы интересно услышать. Жги!

anonymous
()
Ответ на: комментарий от anonymous

чем компилятор от интерпретатора отличается

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

comp00 ★★★★
()
Ответ на: комментарий от Deleted

Да ну.

Ну да.

Кстати, ты же близко знаком с Forth?

А он при чём? В нём режимы компиляция/интерпретация прямо переключаются и циклы (и условия) в режиме интерпретации по стандарту вообще не работают.

То есть не все так однозначно

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

KRoN73 ★★★★★
()
Ответ на: комментарий от comp00

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

anonymous
()
Ответ на: комментарий от Virtuos86

Так ведь как раз технологии и тырят. Нафиг мне прибор? Он сломается и что я буду делать например? А технология - это штука порядка повыше.

nanoolinux ★★★★
()
Ответ на: комментарий от foo

Машкод исполняется. Интерпретатор, грубо говоря, компилирует в машкод и исполняет. При каждом запуске программы. Да, есть JIT, но это не панацея. Так понятнее?

Pinkbyte ★★★★★
()
Ответ на: комментарий от yyk

Ну блин, если человек не понимает, пока не начинаешь жевать совсем уж сопли...

Pinkbyte ★★★★★
()

Ведь если даже у нас интерпретация, expression2, сначала компилируется

иди в школу

rogerw
()

Ведь если даже у нас интерпретация, expression2, сначала компилируется,

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

Sectoid ★★★★★
()
Ответ на: комментарий от anonymous

dispatch

Я уж думал это слово никто так и не произнесет, уйдет школоло зотролленым.

anonymous
()
Ответ на: комментарий от monk

Тупорылый страйфорвард жит всегда сливает интерпретатору, кроме случаев, когда тот сам на питоне. Проблемы и вины житов лежат на уровне трейс-шедулинга блоков и выходов, только на этом бывает существенный отрыв. Так что пробовать пейсать жит ради тестов — полная глупость.

anonymous
()

Большинство интерпретируемых ЯП - динамически типизированы, что тоже вносит немалый вклад в тормоза.

rand
()

a = b;

mov &a, *b;

vs

push &ptr_a push *val_b call some_func_to_mov

fijiol
()
Ответ на: комментарий от anonymous

Тупорылый страйфорвард жит всегда сливает интерпретатору, кроме случаев, когда тот сам на питоне

Racket доказывает обратное. Ни одного интерпретатора Scheme быстрее Racket (который на JIT) нету.

monk ★★★★★
()

Ничего он не компилирует. Он уже скомпилирован. И просто перебирает функции, а выражения преобразует (как калькулятор). Поэтому и тупит так. Скажем, в сях напишешь sin(x*x+y*y), gcc единожды это преобразует в вычисление скобок и вызов библиотечной функции синуса, и все будет радостно и весело работать. А интерпретатор каждый раз, натыкаясь на эту строчку, будет не сразу же запускать нужный код, а сначала выполнять анализ внутрискобочного выражения, вычислять его, затем анализировать функцию, вызывать библиотечную sin и т.п. И, понятное дело, если у тебя gcc может кое-что соптимизировать, то в интерпретаторе фиг какой оптимизации!

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от monk

Тупорылый страйфорвард жит всегда сливает интерпретатору, кроме случаев, когда тот сам на питоне

Racket доказывает обратное

На динамически типизированном языке тупорылый JIT точно не обгонит интерпретатор - накладные расходы собственно интерпретации невелики. Так что... в Racket достаточно умный JIT.

tailgunner ★★★★★
()
Ответ на: комментарий от Eddy_Em

Ты про оптимизацию говоришь. Это тут не при чем

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.