промежуточный трёхадресный код
От: VjcheslavV  
Дата: 27.01.23 07:53
Оценка:
В разных книгах про промежуточный трёхадресный код читал...
Не догоняю как на нём написать, к примеру:
a[i+1]=&a[i+2];

Заранее спасибо...
Отредактировано 27.01.2023 8:11 VjcheslavV . Предыдущая версия .
Re: промежуточный трёхадресный код
От: 0x7be СССР  
Дата: 27.01.23 08:21
Оценка: 3 (1)
Здравствуйте, VjcheslavV, Вы писали:

VV>В разных книгах про промежуточный трёхадресный код читал

VV>Не догоняю как на нём написать к примеру
VV>
VV>a[i+1]=&a[i+2];
VV>

VV>Заранее спасибо...

Как-то так:

Операция      Arg1  Arg2  Arg3
-------------------------------
сложение      i     2     temp1 // вычисляем индекс массива в правой части
адрес-индекса a     temp1 temp2 // берём адрес элемента массива в правой части
сложение      i     1     temp3 // вычисляем индекс массива в левой части
адрес-индекса a     temp3 temp4 // берём адрес элемента массива в левой части
переместить   temp2 temp4       // присвоение.

Всё очень сильно завсит от выбранной архитектуры команд. Например, можно представить команду mov с такими режимами адресации аргументов, что вся задача в одну операцию уложится.
Отредактировано 27.01.2023 8:22 0x7be . Предыдущая версия .
Re[2]: промежуточный трёхадресный код
От: VjcheslavV  
Дата: 27.01.23 08:46
Оценка:
Здравствуйте, 0x7be, Вы писали:

0>[/asm]

0>Всё очень сильно завсит от выбранной архитектуры команд. Например, можно представить команду mov с такими режимами адресации аргументов, что вся задача в одну операцию уложится.

Как-то думал что трёхадресный код аппаратно независимый ...
А если архитектура позволяет делать всё что с регистром то и с памятью по адресу — то можно cщитать a[i] за один аргумент?

где-то слышал что есть аппаратно независимые оптимизации и представления внутри компиляторов ... дак это только абстрактносинтаксическое дерево только независимо?
Re[3]: промежуточный трёхадресный код
От: 0x7be СССР  
Дата: 27.01.23 11:25
Оценка:
Здравствуйте, VjcheslavV, Вы писали:

VV>Здравствуйте, 0x7be, Вы писали:


0>>[/asm]

0>>Всё очень сильно завсит от выбранной архитектуры команд. Например, можно представить команду mov с такими режимами адресации аргументов, что вся задача в одну операцию уложится.

VV>Как-то думал что трёхадресный код аппаратно независимый ...

VV>А если архитектура позволяет делать всё что с регистром то и с памятью по адресу — то можно cщитать a[i] за один аргумент?
VV>где-то слышал что есть аппаратно независимые оптимизации и представления внутри компиляторов ... дак это только абстрактносинтаксическое дерево только независимо?
Конечно он аппаратно-независимый, но какая-то архитектура команд у конкретной реализации трёхадресного кода должна быть.
Re[4]: промежуточный трёхадресный код
От: VjcheslavV  
Дата: 27.01.23 12:25
Оценка:
Здравствуйте, 0x7be, Вы писали:

VV>>А если архитектура позволяет делать всё что с регистром то и с памятью по адресу — то можно cщитать a[i] за один аргумент?


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


Всю жизнь сщитал что аппаратно-независимый — не связан с какой либо архитектурой ... В чём разница?
Re[5]: промежуточный трёхадресный код
От: 0x7be СССР  
Дата: 27.01.23 19:14
Оценка:
Здравствуйте, VjcheslavV, Вы писали:

VV>Всю жизнь сщитал что аппаратно-независимый — не связан с какой либо архитектурой ... В чём разница?

Аппаратно-независимый код не связан с архитектурой конкретного железа. Но у виртуальной машины тоже есть своя архитектура.
Вот, например: https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-6.html
Список инструкций виртуальной машины java. Он не привязан ни к какому железу, но он есть, и он является частью архитектуры JVM.
Re[2]: промежуточный трёхадресный код
От: VVVa  
Дата: 28.01.23 08:47
Оценка:
Здравствуйте, 0x7be, Вы писали:

0>Как-то так:


0>
0>Операция      Arg1  Arg2  Arg3
0>-------------------------------
0>сложение      i     2     temp1 // вычисляем индекс массива в правой части
0>адрес-индекса a     temp1 temp2 // берём адрес элемента массива в правой части
0>сложение      i     1     temp3 // вычисляем индекс массива в левой части
0>адрес-индекса a     temp3 temp4 // берём адрес элемента массива в левой части
0>переместить   temp2 *temp4       // присвоение.
0>


вроде ошибка затесалась * не хватает
Re[3]: промежуточный трёхадресный код
От: 0x7be СССР  
Дата: 28.01.23 09:35
Оценка:
Здравствуйте, VVVa, Вы писали:

VVV>Здравствуйте, 0x7be, Вы писали:


0>>Как-то так:


0>>
0>>Операция      Arg1  Arg2  Arg3
0>>-------------------------------
0>>сложение      i     2     temp1 // вычисляем индекс массива в правой части
0>>адрес-индекса a     temp1 temp2 // берём адрес элемента массива в правой части
0>>сложение      i     1     temp3 // вычисляем индекс массива в левой части
0>>адрес-индекса a     temp3 temp4 // берём адрес элемента массива в левой части
0>>переместить   temp2 *temp4       // присвоение.
0>>


VVV>вроде ошибка затесалась * не хватает

В смысле? Умножение на размер элемента массива у меня подразумевается в операции "адрес индекса". Она под капотом содержит вычисление смещения по индексу и размеру элемента и сложение с базовым адресом.
Но это, конечно, можно расписать более подробно.
Re[4]: промежуточный трёхадресный код
От: VVVa  
Дата: 28.01.23 12:46
Оценка:
Здравствуйте, 0x7be, Вы писали:

VVV>>вроде ошибка затесалась * не хватает

0>В смысле? Умножение на размер элемента массива у меня подразумевается в операции "адрес индекса". Она под капотом содержит вычисление смещения по индексу и размеру элемента и сложение с базовым адресом.
0>Но это, конечно, можно расписать более подробно.

Не понял Вроде в Arg3 переменные а в последнем случае нужно в адрес который в этой переменной ...
Re[5]: промежуточный трёхадресный код
От: 0x7be СССР  
Дата: 28.01.23 20:53
Оценка:
Здравствуйте, VVVa, Вы писали:


VVV>Не понял Вроде в Arg3 переменные а в последнем случае нужно в адрес который в этой переменной ...

Да, я там в плане разыменовывания указателей был неаккуратен.
Re[6]: промежуточный трёхадресный код
От: VVVa  
Дата: 05.02.23 13:11
Оценка:
Здравствуйте, 0x7be, Вы писали:

0>Да, я там в плане разыменовывания указателей был неаккуратен.


Блин !!! Совсем что-то не то получилось ...
Немного покурив бамбук вспомнил что переменные с которых берётся адрес или которые в регистре не помещаются вообще в 3 адресном коде не должны участвовать
тоесть там только 3 переменные должны быть
3 адресный код это только чтобы SAA представления сделать...
Re: промежуточный трёхадресный код
От: Pzz Россия https://github.com/alexpevzner
Дата: 05.02.23 13:27
Оценка:
Здравствуйте, VjcheslavV, Вы писали:

VV>
VV>a[i+1]=&a[i+2];
VV>


Выглядит, как бред...
Re[2]: промежуточный трёхадресный код
От: VVVa  
Дата: 05.02.23 14:16
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz>Здравствуйте, VjcheslavV, Вы писали:


VV>>
VV>>a[i+1]=&a[i+2];
VV>>


Pzz>Выглядит, как бред...


Кстати да — просто не помнил что с массивами нужно делать — их в отдельное представление вроде выносят (на сколько я подразумеваю)
Например вызов функции с параметрами вроде тоже не 3 адресное представление
Или я ошибаюсь?
Отредактировано 05.02.2023 14:19 VVVa . Предыдущая версия .
Re[3]: промежуточный трёхадресный код
От: LaptevVV Россия  
Дата: 05.02.23 15:00
Оценка: 3 (1)
VVV>Кстати да — просто не помнил что с массивами нужно делать — их в отдельное представление вроде выносят (на сколько я подразумеваю)
VVV>Например вызов функции с параметрами вроде тоже не 3 адресное представление
VVV>Или я ошибаюсь?
Ошибаешься.
Можно придумать любую архитектуру машины.
Например JVM — стековая.
Можно сделать двух- или одно-адресную.
Для массивов — это просто адрес первого элемента в памяти.
А потом просто увеличивай адрес для перехода к следующему элементу.
Интел — это смесь стековой и 1-, 2-, 3- и безадресной архитектуры, да еще с регистрами.
Трехадресная — для арифметики: 1-й операндб 2-операнд, результат.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[3]: промежуточный трёхадресный код
От: Pzz Россия https://github.com/alexpevzner
Дата: 05.02.23 17:25
Оценка:
Здравствуйте, VVVa, Вы писали:

VVV>Или я ошибаюсь?


x = a + b;

У тебя в этом операторе три адреса: x, a и b.
Re[4]: промежуточный трёхадресный код
От: VjcheslavV  
Дата: 06.02.23 07:00
Оценка:
Здравствуйте, LaptevVV, Вы писали:
LVV>Ошибаешься.
LVV>Можно придумать любую архитектуру машины.
LVV>Например JVM — стековая.
LVV>Можно сделать двух- или одно-адресную.
LVV>Для массивов — это просто адрес первого элемента в памяти.
LVV>А потом просто увеличивай адрес для перехода к следующему элементу.
LVV>Интел — это смесь стековой и 1-, 2-, 3- и безадресной архитектуры, да еще с регистрами.
LVV>Трехадресная — для арифметики: 1-й операндб 2-операнд, результат.

Если всё так по разному в зависимости от архитектуры — то как потом в SSA переводят?
Слышал что массивы и те переменные у которых берётся адрес в SSA не переводят — это правда?
а что с ними делают?
Re[5]: промежуточный трёхадресный код
От: LaptevVV Россия  
Дата: 06.02.23 08:16
Оценка: 3 (1)
VV>Если всё так по разному в зависимости от архитектуры — то как потом в SSA переводят?
VV>Слышал что массивы и те переменные у которых берётся адрес в SSA не переводят — это правда?
VV>а что с ними делают?
1. Что такой SAA ?
2. Трехадресный код — это уже прямо перед генерацией целевого кода.
Так что массивы могут быть размещены в памяти этой виртуальной трехадресной машины.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[6]: промежуточный трёхадресный код
От: VjcheslavV  
Дата: 06.02.23 08:47
Оценка:
Здравствуйте, LaptevVV, Вы писали:
LVV>1. Что такой SAA ?
LVV>2. Трехадресный код — это уже прямо перед генерацией целевого кода.
LVV>Так что массивы могут быть размещены в памяти этой виртуальной трехадресной машины.
Static single assignment form https://ru.wikipedia.org/wiki/SSA
блин SSA
дак как в SSA переводят что в трёхадресный код не влазит?
Re[7]: промежуточный трёхадресный код
От: LaptevVV Россия  
Дата: 06.02.23 08:50
Оценка: 2 (1)
VV>дак как в SSA переводят что в трёхадресный код не влазит?
Почему не влазит?
Попробуй на интеле написать сумму массива на ассемблере.
Команды 0-1-2 адресные.
для массива просто указывается стартовый адрес в памяти, и потом он увеличивается.
А сумму можно накапливать в регистре сопроцессора (если числа дробные)...
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[8]: промежуточный трёхадресный код
От: VjcheslavV  
Дата: 06.02.23 13:35
Оценка:
Здравствуйте, LaptevVV, Вы писали:

VV>>дак как в SSA переводят что в трёхадресный код не влазит?

LVV>Почему не влазит?
LVV>Попробуй на интеле написать сумму массива на ассемблере.
LVV>Команды 0-1-2 адресные.
LVV>для массива просто указывается стартовый адрес в памяти, и потом он увеличивается.
LVV>А сумму можно накапливать в регистре сопроцессора (если числа дробные)...

Слышал что массивы не оптимизируют при помощи SSA. Это так? (просто там получается что трудно контролировать записи в ячейку массива как я полагаю)
Дак что их просто оставляют просто так... а как тогда если SSA перенесётся при оптимизации как-нибудь??? например перенесётся test eax,ebx и jnz m1 ?
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.