Обсуждение принципов работы современных компиляторов

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Absurd
Сообщения: 1228
Зарегистрирован: 26 фев 2004, 13:24
Откуда: Pietari, Venäjä
Контактная информация:

То есть всем этим операторам соответствует и один и тот же фрагмент кода и вернуть из операторов разные значения уже не возможно, однако стандарт требует возврата разных значений: префиксная форма должна возвращать новое значение, а постфиксная - старое.
Ну я и пишу - "vreg1 = add vreg0, 1". После этой инструкции виртуальный регистр vreg1 содержит новое значение, vreg0 - старое. Использование префиксного или постфиксного инкремента влияет только на то какой из них будет задействован в текущем контексте.
;t=i++;
и
Код cpp:
;t=++i;
соответствуют разным цепочкам инструкций,
Нет, после работы фронтенда компилятора будет одна IR инструкция в обоих случаях - add. После обработки IR бакендом может не быть ни одной.
2B OR NOT(2B) = FF
Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

Ну я и пишу - "vreg1 = add vreg0, 1". После этой инструкции виртуальный регистр vreg1 содержит новое значение, vreg0 - старое. Использование префиксного или постфиксного инкремента влияет только на то какой из них будет задействован в текущем контексте.
Выше утверждалось, что виртуальные регистры присваиваются ровно один раз и получают значения в зависимости от того, была ли инициализация.
Нет, после работы фронтенда компилятора будет одна IR инструкция в обоих случаях
Тогда каким образом

Код: Выделить всё

i=1;t=++i;
std::cout<<t<<std::endl;
и

Код: Выделить всё

i=1;t=i++;
std::cout<<t<<std::endl;
выведет разные значения? А тест показывает, что эти фрагменты выводят разные значения. И того же требует стандарт. И инструкция не add, а inc, этого требует идеология языка, так как в обоих случаях только inc гарантирует максимальную производительность. Но в одном случае сначала inc, потом mov, а в другом наоборот, или даже два раза mov и между ними inc.
После обработки IR бакендом может не быть ни одной.
Не смешно.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Absurd
Сообщения: 1228
Зарегистрирован: 26 фев 2004, 13:24
Откуда: Pietari, Venäjä
Контактная информация:

Ну я и пишу - "vreg1 = add vreg0, 1". После этой инструкции виртуальный регистр vreg1 содержит новое значение, vreg0 - старое. Использование префиксного или постфиксного инкремента влияет только на то какой из них будет задействован в текущем контексте.
Выше утверждалось, что виртуальные регистры присваиваются ровно один раз и получают значения в зависимости от того, была ли инициализация.
Ну да, присваиваются ровно один раз и навсегда. Получают в качестве значения либо литерал, либо результат операции над литералами и другими виртуальными регистрами, либо значение Ф-формы. А в чем вы нашли противоречие?
2B OR NOT(2B) = FF
Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

В том, что только что у одного уже было новое значение.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Absurd
Сообщения: 1228
Зарегистрирован: 26 фев 2004, 13:24
Откуда: Pietari, Venäjä
Контактная информация:

Тогда каким образом
...
выведет разные значения?
Еще раз, медленно и печально: при парсинге первого куска переменная t будет связана со значением виртуального регистра vreg1 который содержит новое значение, а при парсинге второго куска переменная t будет связана со значением виртуального регистра vreg0 который содержит старое значение. Я терпеливый, если нужно 100 мессаг чтобы это разжевать, будет 100 мессаг, нужно 1000 - будет тысяча.
В том, что только что у одного уже было новое значение.
Не могли бы указать точное место откуда вы это взяли?
2B OR NOT(2B) = FF
Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

То есть ты отрицаешь рантайм. Отлично.
Absurd писал(а):Не могли бы указать точное место откуда вы это взяли?
Ну я и пишу - "vreg1 = add vreg0, 1". После этой инструкции виртуальный регистр vreg1 содержит новое значение, vreg0 - старое.
Ромео, так кто читать не умеет? Даже свои же посты.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Absurd
Сообщения: 1228
Зарегистрирован: 26 фев 2004, 13:24
Откуда: Pietari, Venäjä
Контактная информация:

Ну я и пишу - "vreg1 = add vreg0, 1". После этой инструкции виртуальный регистр vreg1 содержит новое значение, vreg0 - старое.
Ромео, так кто читать не умеет? Даже свои же посты.
Потрудитесь доказать наличие логических противоречий у меня. Есть же нормальный научный подход:

Посылка 1, Посылка 2 ... Посылка N. Следствие 1, Следствие 2, Противоречие между следствием 1 и 2, вердикт - Absurd трепло.

Единственный изъян который я вижу, это то что не указана предкондиция - до этой инструкции регистра vreg1 не существует. Ссылаться на виртуальные регистры которые еще не сществуют, но появятся в дальнейшем позволяет только Ф-форма. Посткондиция ("После этой инструкции ...") же указана верно. Но это не ошибка, а умолчание одной из деталей.
То есть ты отрицаешь рантайм. Отлично.
Опять же, буду рад выслушать цепочку рассуждений которая привела вас к такому выводу.
2B OR NOT(2B) = FF
Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

Вообще то уже между посылками:
1. Виртуальный регистр присваивается ровно один раз.
2. Виртуальный регистр имеет новое значение.
Absurd писал(а):Опять же, буду рад выслушать цепочку рассуждений которая привела вас к такому выводу.
А какая здесь нужна цепочка? Переменная получает значение виртуального регистра, существующего только на этапе парсинга. Всё. Рантайму здесь уже просто нет места. А вместе с рантаймом отрицается уже и определение алгоритма, да и назначение процессора. О какой либо компиляции после этого можно уже забыть.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Absurd
Сообщения: 1228
Зарегистрирован: 26 фев 2004, 13:24
Откуда: Pietari, Venäjä
Контактная информация:

1. Виртуальный регистр присваивается ровно один раз.
2. Виртуальный регистр имеет новое значение.
Тут есть противоречие только если предположить что виртуальный регистр ранее содержал другое, старое, значение. Но я это нигде не писал.
2B OR NOT(2B) = FF
Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

А что же по-твоему означает "новое значение"? У всех нормальных людей именно то, что раньше было старое, а теперь оно другое.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Ответить