Начи....
За мен проблема с "умните" компилатори до нейде съвпада с проблема за изкуствения интелект.
А проблемът с изкуствения интелект е този, че за него обикновено се говори там, където няма естествен такъв*.
В конкретно цитирания случай, дебело подчертавам - в конкретно цитирания, е дефинирана променлива, чиято стойност се ползва в условие на цикъл.
Заебете мултитрейдинга.
Тази променлива може да се промени от прекъсване.
Тази променлива може да е дефинирана като хардуерен сигнал примерно (при някои микроконтролерски компилатори).
Варианти много.
Компилаторът няма право да оптимизира стойността й с константа, нито да я държи в регистър през цялото време.
Т.е.
int a=1;
while (a==1)
по никакъв начин не бива да се компилира като да е
while (1)
или пък да се компилира до изцяло регистрова операция примерно:
ld R1, a
L1: cmp R1, #1
bne L2
blah
blah
blah
jmp L1
L2: blah
......
(така де, некъф квази-асемблер)
освен ако същият този компилатор не ползва този регистър единствено и само за тази променлива и тя да не е разположена в паметта на системата, но всяка функция, която се обръща към нея, модифицира съдържанието на същия този регистър.
Т.е. ако правите разделно компилиране и едната ръка не знае какво прави другата, подобно нещо (оптимизиране) трябва да е забранено. Под заплаха от разстрел.
Няма и обикновена логика. Който иска да напише безкраен цикъл, ще го дефинира като такъв, а не с променлива.
В смисъл - освен ако не е пълен идиот де.
Още повече - какво ще спечелите от подобно "оптимизиране"?
Една операция достъп до паметта?
Ебаси печалбата!
Да де, ако цикъла само се върти без да има нищо в тялото му, ще имате огромно ускорение на изпълнението на безсмислен код.
Щом нещото е дефинирано като променлива, когато се прави сравнение на същото това нещо, то трябва да се извлича от там, където се намира, а не да се държи в регистър.
Мога да се съглася, ако е b=a+a+a; израза, че са възможни двусмислици и необходимости от указания към компилатора, или взимане на специални мерки в кода (примерно да кажем - ако а се променя от прекъсване, а ние искаме да съберем 3 пъти едно и също число, ще трябва да забраним прекъсването. Чиста глупост впрочем, вече и микроконтролерите правят умножение за един такт, ама нейсе!), обаче в цитирания случай е просто уникално зле да се компилира цикъла с проверка на променлива, която се държи в регистър.
Не можеш ли ти да пишеш оптимален код - надай се компилатора да ти го компилира като такъв.
Мораль: Умните компилатори са направени за ползване от глупави програмисти*.
-------------------------------------------------------------------------------------
*Направете напълно дуракоустойчива система, и само пълни глупаци ще поискат да я ползват.
|