LINUX.ORG.RU

Интерпретация vs компиляция

 ,


0

3

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

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

Тогда, что же делает интерпретируемые языки мощными?

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

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

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

Ответ на: комментарий от terminator-101

Это от задачи зависит.

Вот и назови хотя бы одну такую задачу.

О скорости пока речи не было, это другой вопрос.

Это главный вопрос, вообще-то.

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

Сведи компилятор регулярных выражений к лени. Не переводи тему до тех пор, пока не осилишь.

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

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

Это главный вопрос, вообще-то.

Может он и главный, но тут он не обсуждается.

terminator-101
() автор топика
Ответ на: комментарий от terminator-101

Да любой компилятор ленив по-определению

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

Иначе ты будешь получать на обработку не выражение, а его значение в «верхнем» языке.

Ты больной. Наверное, шизофрения. Советую обратиться к специалистам.

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

Жду ленивую реализацию регулярных выражений, без макросов.

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

terminator-101
() автор топика
Ответ на: комментарий от terminator-101

Да это ты бредишь, по-ходу.

Знаешь, когда все вокруг «бредят», а ты один не бредишь, то это симптом. Срочно обращайся к специалистам.

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

Сам придумал себе аксиому, что макросы это лень, и теперь не понимаешь, как это оно может быть не так. Смешной ты. Лечись срочно!

А зачем тут макросы, помимо того, чтобы получить на обработку само выражение, а не значение?

Ты еще и какое-то свое определение лени себе придумал, похоже.

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

Семантически разницы нет никакой между функцией (interpret-stupid-regexp «бла-бла-бла») и макросом (compile-stupid-regexp «бла-бла-бла»), тогда как ленивые вычисления от энергичных отличаются семантикой.

Съел?

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

Мне надоело. Я для себы из этого бессмысленого спора ничего не извлеку все равно, а ты думай как хочешь. Ты даже не понимаешь, что основная «фича» тут не в оптимизации кода, как таковой. При наличии лени, код не обязатеьно сразу исполнять. Его можно и в рантайме получить как есть, оптимизировать, и лишь затем исполнить. Фишка в том, что при отсутствии лени, ты просто не сможешь получить его «как есть», соответственно, и оптимизировать нечего.

terminator-101
() автор топика
Ответ на: комментарий от terminator-101

Мне надоело.

Голоса в голове говорят тебе прекратить позориться? Правильно. Слил, так сливай уж сразу, не барахтайся.

Ты даже не понимаешь, что основная «фича» тут не в оптимизации кода, как таковой.

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

При наличии лени, код не обязатеьно сразу исполнять. Его можно и в рантайме получить как есть, оптимизировать, и лишь затем исполнить. Фишка в том, что при отсутствии лени, ты просто не сможешь получить его «как есть», соответственно, и оптимизировать нечего.

А это вообще шизофренический поток сознания. У меня на твоем бреде парсер ломается. Ты, недоумок, вообще не понимаешь, что такое лень. Да и что такое семантика ты тоже не понимаешь. И что такое порядок вычислений ты не понимаешь. Иди, лечись.

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

ЗЫ: так как аргумент тут строка, то еще и никакого quote не нужно.

А какая разница, это однох*нно. Да если у тебя в языке есть эвал, ты можешь иметь «такую» лень. В JS, например, так оно и есть. (только с одной оговоркой — eval должен иметь доступ к текущему окружению, поэтому CL и Scheme отпадают). Просто это не особо удобно, а так, да, можно.

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

terminator-101
() автор топика
Ответ на: комментарий от terminator-101

А какая разница, это однох*нно.

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

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

Засунь себе eval в жопу, шизофреник. Мы про макросы разговаривали. Здесь тебе никакой eval не поможет, потому как семантика вообще не меняется. Или ты интерпретируешь выражение на DSL в рантайме, или статически компилируешь его макросом, но для пользователя никакой видимой разницы, кроме скорости работы, нет и быть не может.

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

Ты соскочил

Но мне в любом случае не интересно. Засчитывай слив. 2 страницы треда, а ты до сих пор даже не понял что такое макросы.

terminator-101
() автор топика
Ответ на: комментарий от terminator-101

Там, скорей всего, идет перекомпиляция в рантайме.

Не идет.

После раскрытия макроса, он перестает существовать.

Не перестает.

Давай ты не будешь выдумывать?

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

А как свести любую спец форму?

Никак, все правильно.

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

Просто завернуть значение в лямбду.

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

Да любой компилятор ленив

У тебя в голове путаница. Компилятор с ленью никак не связан. Ты путаешь лень с квотированием.

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

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

Лень не нужна, макросы - нужны. Вообще почти всегда когда нужны макросы лень не нужна.

А зачем тут макросы, помимо того, чтобы получить на обработку само выражение, а не значение?

Как раз за тем чтобы получить на обработку само выражение. Лень такого не дает.

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

Его можно и в рантайме получить как есть, оптимизировать, и лишь затем исполнить.

При чем тут лень? Получение кода вместо значения никак не связано с ленью.

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

Но мне в любом случае не интересно. Засчитывай слив. 2 страницы треда, а ты до сих пор даже не понял что такое макросы.

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

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

Как же ты всех заебало!

Но мне в любом случае не интересно.

Чудик, хватит тут срать. Никому уже не интересно, что ты еще _не_ можешь понять.

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

Ну вырази мне aif через лень


(define-macro (aif  a b c) (let (it a) (if (eval a) (eval b) (eval c))))

(aif false (println it '_foo) (println it '_bar))
(aif 'foo (println it '_foo) (println it '_bar))

terminator-101
() автор топика
Ответ на: комментарий от terminator-101

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

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

Оппа. Да у нас пердак защемило, за макросы обидно стало, малыш? Вытри слезы, в жизни всякое встречается. Это newlisp, если чо.

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

Все, это была последняя капля

То есть ты не знаешь, что такое лень, не знаешь, что такое макросы, но посмел высказывать свое некомпетентное мнение? Все с тобой ясно.

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

А что такое лень? Никакой универсальной лени нет, это сленг. Тут, тупо, аргументы не вычисляются.

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

А что такое лень? Никакой универсальной лени нет, это сленг. Тут, тупо, аргументы не вычисляются.

Именно, в случае лени аргументы не вычисляются и вместо них идет санка. А у него в define-macro все аргументы вычислены. Где же тут лень?

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

А у него в define-macro все аргументы вычислены

Ты че идиот? Где они вычислены? Они вычисляются внутри eval.

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

(let ([it 5]) (aif #t (displayln it) (void)) - должно вывести 5.

Это как-раз таки, косяк твоего лиспа. Aif — это анафора, он должен хапать контекст. А у тебя этот контекст перетирается. тоесть, внутри let aif просто не работает.

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

Ты че идиот? Где они вычислены? Они вычисляются внутри eval.

Передан кусок АСТ, который вполне вычислен. Евал уже делает собственно евал - то есть преобразует вполне вычисленный кусок АСТ к какому-то объекту.

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

Это как-раз таки, косяк твоего лиспа.

Нет, это необходимое требование для анафор. Макрос не должен перекрывать введенную руками переменную, иначе будет ломаться все.

А у тебя этот контекст перетирается. тоесть, внутри let aif просто не работает.

Он и не должен, да.

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

Передан кусок АСТ, который вполне вычислен. Евал уже делает собственно евал - то есть преобразует вполне вычисленный кусок АСТ к какому-то объекту.

(define-macro (f  a b c) (println a b c))
(f x y z) ; xyz

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

terminator-101
() автор топика
Ответ на: комментарий от terminator-101

Разупорись

Не понял где разупороться? Разве в твоем случае на вход f не идут вычисленные куски кода 'x, y' и 'z? Где тут лень?

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

Да ладно, чо, лоханулся я.

Ну это-то ладно, но при чем тут eval вообще в твоем коде?

f=function(arg){
   var a = 1
   console.log(eval(arg))
}

f("a") // 1
Вот реальный пример.

terminator-101
() автор топика

Господа, я тут ничего не понял из вашего спора, но полыхает знатно. Зачем eval() в компилируемых языках, если он может быть заменен указателем/ссылкой/интерфейсом? И выглядеть будет вполне прилично.

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