Size: a a a

Compiler Development

2020 February 20

AT

Alexander Tchitchigin in Compiler Development
Михаил Бахтерев
А сейчас как в Go?
Одним куском стек аллоцируют и переаллоцируют, если нужно. Оказалось, что так быстрее. Но всё равно в куче, конечно.
источник

Ɖ

Ɖrēw in Compiler Development
Ребят, всем привет
Недавно начал разбираться с LLVM
До этого работал только с CLR и CIL
Кто то может подсказать как там дела обстоят с интеропом с другими языками которые таргетятся на LLVM?
Например захотелось мне какую то либу заюзать для того чтобы написать веб фреймворк на своем языке, как мне это сделать?
источник

KR

K R in Compiler Development
Alexander Tchitchigin
Одним куском стек аллоцируют и переаллоцируют, если нужно. Оказалось, что так быстрее. Но всё равно в куче, конечно.
А то, что уже лежит на стеке? Это копируют?
источник

AT

Alexander Tchitchigin in Compiler Development
K R
А то, что уже лежит на стеке? Это копируют?
Конечно. Работает как std::vector в C++.
источник

KR

K R in Compiler Development
А указатели на данные на стеке там не протекают?
источник

AT

Alexander Tchitchigin in Compiler Development
K R
А указатели на данные на стеке там не протекают?
А в Go бывают указатели на данные на стеке? 😊
источник

KR

K R in Compiler Development
Alexander Tchitchigin
А в Go бывают указатели на данные на стеке? 😊
А указатели на локальные переменные же могут быть?
источник

KR

K R in Compiler Development
Я что-то базовое не понимаю.
источник

AT

Alexander Tchitchigin in Compiler Development
K R
А указатели на локальные переменные же могут быть?
Поскольку компилятор про них знает и перемещает в кучу, если они "убегают", то и при реаллокации стека явно может обновить.
источник

KR

K R in Compiler Development
Но реаллокация стека же зависит от глубины рекурсии. Как о ней может знать компилятор?
источник

МБ

Михаил Бахтерев in Compiler Development
K R
Но реаллокация стека же зависит от глубины рекурсии. Как о ней может знать компилятор?
Он знает об убегающих в кучу объектах. Просто сразу их там аллоцирует. Это, вроде, и в начальной реализации так было.
источник

Ɖ

Ɖrēw in Compiler Development
Ɖrēw
Ребят, всем привет
Недавно начал разбираться с LLVM
До этого работал только с CLR и CIL
Кто то может подсказать как там дела обстоят с интеропом с другими языками которые таргетятся на LLVM?
Например захотелось мне какую то либу заюзать для того чтобы написать веб фреймворк на своем языке, как мне это сделать?
Никто не может подсказать я так понял?)
источник

Ɖ

Ɖrēw in Compiler Development
Возможно вопрос глупый и кто то направит в нужную сторону
источник

KR

K R in Compiler Development
Михаил Бахтерев
Он знает об убегающих в кучу объектах. Просто сразу их там аллоцирует. Это, вроде, и в начальной реализации так было.
Всё равно непонятно:

func a() {
  i:= 1
  pi := &i
 

  b()

  *pi = 2
}

Как только взяли указатель на i, ее сразу в кучу?
источник

МБ

Михаил Бахтерев in Compiler Development
Ɖrēw
Возможно вопрос глупый и кто то направит в нужную сторону
Это называют foreign function interface, надо смотреть в эту сторону. Вообще, зависит от того, в каком формате библиотека подготовлена. Если это llvm-биткод, то линковщик без особых проблем слинкует.
источник

AT

Alexander Tchitchigin in Compiler Development
K R
Но реаллокация стека же зависит от глубины рекурсии. Как о ней может знать компилятор?
Реаллоцирует стек же не компилятор, а рантайм. А он понятно откуда будет знать. Для GC всё равно нужно знать где какой кадр лежит и к какой функции он относится. 🤷‍♀️
источник

МБ

Михаил Бахтерев in Compiler Development
K R
Всё равно непонятно:

func a() {
  i:= 1
  pi := &i
 

  b()

  *pi = 2
}

Как только взяли указатель на i, ее сразу в кучу?
Надо запустить 6g -m и посмотреть, что компилятор об этом думает. Вероятно, будет зависеть от оценок размера стека для b()
источник

KR

K R in Compiler Development
Alexander Tchitchigin
Реаллоцирует стек же не компилятор, а рантайм. А он понятно откуда будет знать. Для GC всё равно нужно знать где какой кадр лежит и к какой функции он относится. 🤷‍♀️
То есть, выделяя переменную на стеке, мы всё равно уведомляем о ней gc?
источник

AT

Alexander Tchitchigin in Compiler Development
K R
То есть, выделяя переменную на стеке, мы всё равно уведомляем о ней gc?
Ясен пень - как иначе GC должен догадаться это root или нет?
источник

DP

Dmitry Ponyatov in Compiler Development
Ɖrēw
Никто не может подсказать я так понял?)
чего там подсказывать? компильни С++ исходник шлангом с
-S -emit-llvm
, и посмотри в ASCII что выплевывается
источник