Size: a a a

Compiler Development

2021 March 30

к

кана in Compiler Development
кана
call знает арность функции и закидывает N значений со стека в локальные переменные?
ток не очень понимаю какой смысл, локальные переменные это же тоже стек
источник

M

MaxGraey in Compiler Development
источник

Z

Zaner in Compiler Development
кана
ток не очень понимаю какой смысл, локальные переменные это же тоже стек
как вариант - для фиксированного доступа к локальным переменным, не всегда можно отсчитать от "esp"
источник

AT

Alexander Tchitchigi... in Compiler Development
Зависит от того какие инструкции есть в машине. У некоторых есть инструкции чтения произвольного элемента со стека. Но это уже не "чистая" стековая машина, а гибридная получается.
источник

IJ

Igor 🐱 Jirkov in Compiler Development
кана
ток не очень понимаю какой смысл, локальные переменные это же тоже стек
Локальные переменные в вм можно где угодно хранить. Стек совершенно не обязательно самое подходящее место. Можно выделять фреймы под локальные переменные функции в куче, а в каком-нибудь связном списке хранить адреса фреймов. Call тогда смотрит сигнатуру функции и скидывает нужное колмчество аргументов со стека в новый фрейм.
источник

AT

Alexander Tchitchigi... in Compiler Development
А можно, к стати, и через стек возврата передавать. 😉
источник

к

кана in Compiler Development
не понимаю как сделать стековый язык красиво

в данный момент у меня решение как раз такое как выше описано: у меня есть дата-стек, с которым работают все операции, и есть отдельный колстек, на котором лежат стекфреймы, где "стекфрейм" это адрес возврата + ссылка на собственную кучу для локальных переменных, куда идут все аргументы сразу при call

но это выглядит не очень красиво, потому что на каждую функцию собственная куча заводится, почему бы не использовать стек

но стек использовать я так понимаю нельзя, что с ebp/fp, что без него, потому что результат функции тоже возвращается через стек, регистров же нет, нельзя сбрасывать стек до ebp

вот текущее решение - https://gist.github.com/kana-sama/31a7dbcda0d434f0013e4f2227b8c895
источник

к

кана in Compiler Development
return stack я выкинул как ненужный из-за наличия локальной кучи
источник

AT

Alexander Tchitchigi... in Compiler Development
кана
не понимаю как сделать стековый язык красиво

в данный момент у меня решение как раз такое как выше описано: у меня есть дата-стек, с которым работают все операции, и есть отдельный колстек, на котором лежат стекфреймы, где "стекфрейм" это адрес возврата + ссылка на собственную кучу для локальных переменных, куда идут все аргументы сразу при call

но это выглядит не очень красиво, потому что на каждую функцию собственная куча заводится, почему бы не использовать стек

но стек использовать я так понимаю нельзя, что с ebp/fp, что без него, потому что результат функции тоже возвращается через стек, регистров же нет, нельзя сбрасывать стек до ebp

вот текущее решение - https://gist.github.com/kana-sama/31a7dbcda0d434f0013e4f2227b8c895
Во-первых, Вы смотрели как в Forth сделано? Тоже два стека и перекидывание данных между ними. Плюс общая память.
Во-вторых, Вы смотрели как сделано в Factor? 😊
источник

AT

Alexander Tchitchigi... in Compiler Development
В-третьих, действительно, зачем указатель на фрейм в куче, если можно прямо на стек положить под адресом возврата?
источник

к

кана in Compiler Development
как сделано в forth я видел, я так делал вчера, но сегодня я это разделал обратно

то есть у меня нет ручного return stack, у меня отдельный неуправляемый стек, в который вмка сама пишет неявно по call
источник

к

кана in Compiler Development
если положить под ардесом возврата, то когда будет вычищаться весь локальный стек, то результат тоже выкинется
источник

к

кана in Compiler Development
то есть нужно делать или отдельный ретурн стек как в forth, и требовать чтобы через него возвращался результат только

или делать отдельные кучи, которые не трогают стек
источник

AT

Alexander Tchitchigi... in Compiler Development
кана
если положить под ардесом возврата, то когда будет вычищаться весь локальный стек, то результат тоже выкинется
Это зачем? Не понял? Какой лайаут стека-то?
источник

AT

Alexander Tchitchigi... in Compiler Development
А кроме того, можно и регистр под возвращаемое значение завести.
источник

к

кана in Compiler Development
вот у нас пустой стек: []
мы закинули два аргумента
[1, 2]
мы сделали кол, в стек попал адрес возврата, и frame pointer, текуший стал FP = 4
[1, 2, CP+1, OLDFP]
мы аллоцировали в функции 3 переменных локальных
[1, 2, CP+1, OLDFP, 0, 0, 0]
мы положили на стек результат
[1, 2, CP+1, OLDFP, 0, 0, 0, 42]
мы вычистили все локальные переменные, сбросив все до FP
[1, 2, CP+1, OLDFP]
восстановили FP до OLDFP, вернулись на CP+1
[1, 2]
результат потерялся, аргументы в стеке
источник

к

кана in Compiler Development
регистр завести можно, но тогда это и не очень стековый язык какой-то
источник

RA

R A in Compiler Development
кана
не понимаю как сделать стековый язык красиво

в данный момент у меня решение как раз такое как выше описано: у меня есть дата-стек, с которым работают все операции, и есть отдельный колстек, на котором лежат стекфреймы, где "стекфрейм" это адрес возврата + ссылка на собственную кучу для локальных переменных, куда идут все аргументы сразу при call

но это выглядит не очень красиво, потому что на каждую функцию собственная куча заводится, почему бы не использовать стек

но стек использовать я так понимаю нельзя, что с ebp/fp, что без него, потому что результат функции тоже возвращается через стек, регистров же нет, нельзя сбрасывать стек до ebp

вот текущее решение - https://gist.github.com/kana-sama/31a7dbcda0d434f0013e4f2227b8c895
Никак. В реальности всё равно придётся стек раскладывать на регистры, а это никак красиво не сделать. Так что тут самое простое - смириться и ограничиться красотой снаружи.
источник

к

кана in Compiler Development
почему add какой-нибудь возвращает результат на стек, а функции в регистр какой-то
источник

Z

Zaner in Compiler Development
кана
регистр завести можно, но тогда это и не очень стековый язык какой-то
есть же разница между языком и его реализацией
источник