LINUX.ORG.RU

Вопрос про компиляцию в динамических языках


0

1

Возник такой вопрос. Допустим, есть выражение

fu=function(x){exit}
fu(long_calculation())
Вычисленя энергичные.

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

Будет ли компилятор производить подстановку икса? Ведь чтобы узнать используется ли x он должен сначала зайти внутрь выражения, и, в общем случае не ясно, что дешевле, узнавать, используются ли выражения в телах функций или вычислять их сразу. Для чисто компилируемых ЯП этот вопрос не стоит, время компиляции не важно, как считается. Но в динамических языках время компиляции и перекомпиляции входит во время ожидания пользователя, насколько я понимаю.

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

UPD проверил в JS сейчас, вычисления происходят.

☆

Последнее исправление: anonimous (всего исправлений: 1)
Ответ на: комментарий от g0t0

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

anonimous ☆
() автор топика

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

Да, именно поэтому многие [создатели] предпочитают чисто интерпретируемые динамические ЯП

buddhist ★★★★★
()

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

anonymous
()

Ты идиот? С какого хера среда исполнения будет догадываться о сайд эффектах в long_calculation?

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

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

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

Дело в том, что long_calculation не нужно вычислять.

Еще раз повторюсь, ты идиот. У нас функции в общем случае не чистые.

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

В этом вызове абсолютно ясно, что вычисление не нужно.

Это ясно только умственно отсталым.

hint: rename long_calculation to long_calculate_and_print_result.

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

Ну так нахрена тогда инерпретируемые языки компилируют?

Оставлю тебя в тьме неведения. Бу-га-га!

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

Ради скорости

Вот скорость то как раз сомнительна, поскольку компиляция/перекомпиляция входит в ожидание пользователя. Это, в данном случае, не отдельные фазы.

базовой проверки синтаксиса

На этапе разработки?

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

Все равно спасибо. Ты мне предыдущим ответом открыл глаза на суть чистоты, и на то, почему на нее на самом деле(ТМ) так дрочат.:)

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

Вот скорость то как раз сомнительна

Не придется заново парсить, например, тело функции, которую вызывают >1 раза.

На этапе разработки?

Не понял. Какой ещё «разработки»? Файл, который подаётся интерпретатору, должен быть синтаксически верным.

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

Ты мне предыдущим ответом открыл глаза на суть чистоты, и на то, почему на нее на самом деле(ТМ) так дрочат.:)

О, нет! Что я наделал! Теперь лор ожидает очередная волна тупых тредов.

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

должен быть синтаксически верным

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

Не придется заново парсить, например, тело функции, которую вызывают

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

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

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

ОК.

Не парсить, а вычислять, ты хотел сказать?

Нет, именно парсить, т.е. определять, что print("Hello") — это вызов функции print с аргументом "hello", и преобразовывать в какое-то внутреннее представление, чтобы в следующий раз этим не заниматься.

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

На v8 смотри, жалкое ничтожество. Он интерпретирует в первый раз, но компилирует то, что выполняется внутри цикла сотни раз.

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

А насколько надо быть тупым, чтобы писать подобную ахинею

while(condition) 1+1
Это что единственный профит? Слабоватый аргумент.

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

Почему? Встречая print(hello), интерпретатор понимает, что нужно вызвать функцию print с аргументом-переменной hello. А её значение может меняться со временем.

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

Почему? Встречая print(hello), интерпретатор понимает, что нужно вызвать функцию print с аргументом-переменной hello. А её значение может меняться со временем.

Вот именно, что он не сможет скомпилировать, так-как не знает в какое значение вычислять хелло

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

Чего? Запоминает (компилирует?) он не значение, а «вызвать ф-ю print с текущим значением hello». И когда он встречает такую запись, он берёт текущее значение hello и подсовывает в качестве аргумента print.

//Насколько я понимаю.

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

Вот именно, что он не сможет скомпилировать, так-как не знает в какое значение вычислять хелло

Еще немного и тебе откроется суть интерпретации.

bj ★
()

Стандарт чётко определяет поведение. Сначала будут вычислены все аргументы слева направо, затем буде произведён вызов функции. Любое другое поведение было бы чревато двусмысленностями.

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

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

anonimous ☆
() автор топика
Ответ на: комментарий от korvin_

просто дай ему время, он себя еще покажет

anonymous
()

Вопрос про компиляцию в динамических языках

Какая «компиляция»? В байткод? JIT-компиляция?

Если у тебя

Вычисленя энергичные.

то каким образом ты задаешь такой вопрос:

Будет ли компилятор производить подстановку икса?

Энергичный порядок вычисления потому так и называется, что вычисляет всё, что ему попадается, сразу и до конца, не откладывая на потом. Другое дело, что если у тебя fu(long_calculation1(), long_calculation2(), long_calculation3()), порядок вычисления аргументов может быть не определен. Но раз уж речь идет о сферических языках динамических, зачем всё усложнять.

Но в динамических языках время компиляции и перекомпиляции
перекомпиляции

это что ещё такое, смешались в кучу конелюди...

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