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 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.