LINUX.ORG.RU
ФорумTalks

Компиляция и преждевременная оптимизация


0

1

А никто не задумывался о том, что компиляция является примером преждевременной оптимизации? Например код:

a=1+2
do 3 times a
компилятор все равно соптимизирует. Конечно, время компиляции часто неважно, но если вспомнить языки высокого уровня, такие как JS, LISP, Python, Perl, это же определенно не так.Там ведь вполне может быть цикл компиляция, интерпретация, снова компиляция и тд. А тут уже пользователь ЯП терпеливо ждет.

Перемещено true_admin из development



Последнее исправление: phill (всего исправлений: 1)

что сказать то хотел?

TERRANZ ★★★★
()

А никто не задумывался о том, что компиляция является примером преждевременной оптимизации? Например код: a=1+2

и всё же, ты на звезду идёшь, или на толксы? Хватит уже тупняка.

emulek
()

Время неважна. Зима не будет. Можете переформулировать, пока что бессвязно?

Weres ★★★
()

То есть например gcc должен поддерживать еще и интерпретацию c++ дополнительно к компиляции.

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

В чем ты видишь тупняк? Ящетаю, что тупняк это вот это

Все очень просто. Допустим у тебя есть интерпретатор Х, который интерпретирует некоторую программу. Емулек говорит: берем эту некоторую программу и кладем ее текст в память. Теперь генерируем код, который вызывает ф-ю евал интерпретатора Х на этой программе. Получившуюся хуету он называется «скомпилированной программой».

Этот ведь ты утверждал?

Я может и туплю, но пытаюсь разобраться.

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

То есть например gcc должен поддерживать еще и интерпретацию c++ дополнительно к компиляции.

типа того. Он считает 1+2, и даже 4*sizeof(var). Ещё считает всякие array[index], как *((const char*)array+index*sizeof(*array))

Ещё gcc умеет переводить ⅓ == 0x55555555, т.е. заменять деление умножением(для i686)

И это не преждевременная оптимизация, т.к. компилятор это делает оптимальным способом для целевой платформы. В принципе, компилятор может даже наоборот сделать, например 3=((0+1)<<1)+1, если например константа 3 занимает 4 байта (32 бита), а команды однобайтовые. Тогда компилятор пишет

XOR EAX, EAX
INC EAX
ADD EAX, EAX
INC EAX
это короче, чем MOV EAX, 0x00000003, и может использоваться для -Os.

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

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

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

Емулек говорит

что тебе ещё Рабинович напел? Почему ты цитируешь не меня, а какого-то анона?

Я может и туплю, но пытаюсь разобраться.

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

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

Если оптимизировать нечего, это время уходит впустую, порождая тормоза.

по твоему, создать код, который считает 1+2 будет быстрее, чем сложить 1 и 2?

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

Почему ты цитируешь не меня, а какого-то анона?

Лень было искать. А что ты утверждал? Что анон не так понял в твоих словах?

На кой ляд компилятору создавать код, который множит 2 на 2?

Чтобы не вычислять его в цикле на каждой итерации, очевидно.

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

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

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

А не является ли преждевременной оптимизацией ваша забота о подобных конструкциях? Интерпретатору всё равно придётся разбирать программу, сколько из этого времени он тратит на оптимизацию? Без конкретных данных это всё глубокое теоретизирование.

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

по твоему, создать код, который считает 1+2 будет быстрее, чем сложить 1 и 2?

Что бы он не делал, будет этап анализа всего кода тайпчекером, оптимизатором и пр. Это занимает время.

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

Интерпретатору всё равно придётся разбирать программу

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

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

Лень было искать. А что ты утверждал? Что анон не так понял в твоих словах?

да он вообще какой-то бред написал. Давай ищи оригинал.

На кой ляд компилятору создавать код, который множит 2 на 2?

Чтобы не вычислять его в цикле на каждой итерации, очевидно.

компилятор по любому вынесет 2*2 из цикла. Хоть в виде 2*2, хоть в виде 4.

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

компилятор по любому вынесет 2*2 из цикла. Хоть в виде 2*2, хоть в виде 4.

Да, вынесет даже если это не нужно. А анализ занимает время.

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

по твоему, создать код, который считает 1+2 будет быстрее, чем сложить 1 и 2?

Что бы он не делал, будет этап анализа всего кода тайпчекером, оптимизатором и пр. Это занимает время.

вот и не тупи. Создать код, который складывает 1+2 ещё дороже, чем сложить 1+2, и создать код, который тупо 3 пишет. Пойми, команду сложения так или иначе придётся выполнить (или записать в выходной файл).

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

Прямо без построения дерева разбора? Всё равно придется разбирать текст, проверять на корректность, а потом только выполнять, совершая попутно ещё кучу дел.

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

компилятор по любому вынесет 2*2 из цикла. Хоть в виде 2*2, хоть в виде 4.

Да, вынесет даже если это не нужно. А анализ занимает время.

не понимаю. Твои предложения?

И да, если ты не знал, то 123, это для компилятора 1*10²+2*10¹+3*10⁰. Т.ч. ему по любому считать надо. Это уж если опускаться ниже плинтуса. Т.ч. твоё предложение вставлять 1+2 в код не считая, компиляцию не ускорит.

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

Не должен. Можно интерпретировать IR (для тех же constexpr).

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

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

ну там наша с ним ветка началась с вот этого твоего утверждения

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

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

А оригинал хз где искать, это обобщение было, видимо.

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

команду сложения так или иначе придётся выполнить (или записать в выходной файл).

Да, ее придется, в данном случае, без компиляции выполнить 3 раза. Если у нас программа, где больше нечего оптимизировать кроме этого сраного цикла (а может и его нет), то время на анализ текста вылетает в трубу.

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

компиляцию не ускорит

А я что про ускорение компиляции говорю? Я про то, что выкинуть ее вообще из высокоуровневых ЯП.

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

Прямо без построения дерева разбора? Всё равно придется разбирать текст, проверять на корректность, а потом только выполнять, совершая попутно ещё кучу дел.

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

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

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

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

что тебе ещё Рабинович напел? Почему ты цитируешь не меня, а какого-то анона?

А, ну вот твоя цитата, практически о том же

чем ты недоволен? «выходной текст» интерпретатора == бинарный код, который выполняет CPU

Любая строка представлена бинарным кодом, только не любая является строкой текста на конкретном ЯП, вот в чем проблемка.

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

Программа это не машинные коды, которые можно сразу взять и выполнить

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

Про тикль почитаю, а ещё языки использующие чистую интепретацию,

shell, newlisp, picolisp.

или литературу про неё?

Гы, сам бы с удовольствием почитал. Это табу сейчас, хрен найдешь.

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

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

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

Строка текста не является машинными кодами, процессор не понимает текст, написанный на шелле

Я не сказал является, я сказал представлена. Есть строка «foo» с точки зрения проца она является «101111101....», ее он и выполняет. Но это тоже учловно. Можно и ниже опуститься. Цифры тоже на физическом уровне не выполняются. Электрические сигналы — это более менее то, что действительно существует реально.

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

Строка «foo» может являться текстом в составе строкового литерала а, может и именем переменной. От этого зависит то, как она представлена для процессора. Без хотя бы минимального разбора отличить одно от другого нельзя, в случае с переменной нужно ещё и понять, на какой участок памяти она ссылается. Поэтому мне так трудно представить себе «чистый» интерпретатор.

Weres ★★★
()

Интересно, а какое соотношение идьетов к тем людям, которые таки правильно поняли, что именно Кнут говорил про оптимизацию?

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

Строка «foo» может являться текстом в составе строкового литерала а, может и именем переменной

Чем бы она не являлась, она представлена для проца машкодом. Твоя программа — это просто кусок текста, что там чем считать — это отдается на откуп исполнителя.

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

Чтобы правильно ответить на вопрос, надо сначала узнать, кто это такой, а стоит ли узнавать про Васю Пупкина который всю свою жизнь положил на разработку малюсенькой тулзы, для чертилок формул. Нынче оффисный планктон выбирает ms-office, и правильно делает, кстати. А Ъ — это текст.

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

Отлично показал свой интеллектуальный уровень, но было уже поздно - все всё поняли и так. Может перестанешь постить тупняк?

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

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

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

И что ты называешь интелектуальным уровнем тоже не понятно. Это может у вас, кнутообразных он оценивается числом прочитанных кнктокнижек, но IQ какбэ намекает нам...

phill
() автор топика

Маленько почитал тред. Выводы сделал такие:
1. При одноразовом (или редком) выполнении программы больше времени уйдёт на написание и отладку кода.
2. При многоразовом использовании разницы в скорости выполнения не будет, если стоимость трансляции из исходника в машкод — ноль циклов процессора (круто, да?).
3. Nuff said.

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

Ты смотри внимательно, что он пишет. Для него нет никакой проблемы в том, чтобы назвать компиляцией следующий процесс. Компилятор вызывает интерпретатор, тот выполняет код, возвращает некую строку. Все, это скомпилированная программа. А что он там пишет про eval (змея, пожирающая свой хвост) facepalm.png. Лучше уж быть адептом Великого Маниту, чем Emulek'a c плюсами головного мозга.

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

Не, я про то что Emulek пишет, а не Бургер:)

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

С чего вдруг? На вход интерпретатору подается текст программы, это текст ACII или Юникод, не важно. Далее, отдельные структурные элементы этого текста нужно распознать и представить в удобоваримом для машины виде. Этот «foo» останется текстом, этот var foo станет ссылкой на участок в памяти, а это for ... развернется в определенное количество команд машкода. Только после этого программа сможет выполниться. Если бы процессор мог «пережевать» программу без её разбора и обработки, то интерпретатор вообще был бы не нужен.

Мне кажется, что то ли я вас не понимаю, то ли вы меня.

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

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

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

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

С текстом программ всё ещё сложнее, так как текст он и есть текст, его вывод зависит только от мета-информации (шрифт, размер, цвет), а текст в программе может иметь совершенно разное значение в зависимости от того, где он расположен и что его окружает.

Компьютер не понимает текст. Он может только в арифметику и дергать вызовы другого оборудования. Да и арифметику для него тоже надо готовить.

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