Comments 7
Не уловил, каким образом proxy_on_memory_allocate
"превращается" для AssemblyScript
в:
/// Allow host to allocate memory.
export function malloc(size: i32): usize {
let buffer = new ArrayBuffer(size);
let ptr = changetype<usize>(buffer);
return __pin(ptr);
}
?
PS: Видимо, так:
На стороне хоста выполняется поиск malloc, если нет, то ищется proxy_on_memory_allocate
НО разработчики используют TinyGo, в котором сборщик мусора попроще и запускается когда недостаточно места в куче. Если между вызовом proxy_on_memory_allocate и моментом возврата владения в Go нет выделения памяти, то это условно безопасно.
Можно пример, как конкретно выглядит опасный сценарий при использовании go-pointer?
Опасный сценарий при НЕ использования чего-то подобного go-pointer'у. Количество ссылок на buf равно 0.
func proxyOnMemoryAllocate(size uint) *byte {
buf := make([]byte, size)
return &buf[0]
}
В общем случае GC может переиспользовать эту память, тогда хост при копировании данных что-то перетрет. Например стандартный компилятор вставляет преамбулу(Руководство по ассемблеру Go) в каждую функцию, в которой делает возврат в гошный рантайм, где может переключить горутину или сделать stack-split. Stack-split это когда текущего стека горутине не хватает, тогда идет увеличения стека. По хорошему нужно wasm2wat сделать и посмотреть на сгенеренный код TinyGo.
Тема интересная, что делать с языками с GC. Кто-то захотел SDK для C#.
Одно время, для расширения функциональности, использовали perl модули, экспортируя разные переменные, можно было выполнять какую-то работу на perl и запускать одну из функций из "бакенда" в конце, или просто возвращать какое-то значение, как фильтр.
Потом perl стал менее популярным, и запускать какой-то внешний python стало стильно/модно/молодёжно. Параллельно с этим некоторые проекты включали V8 для выполнения какой-то кастомной логики.
И получается, что следующее развитие - это WASM платформа, ведь в неё можно накомпилировать из чего угодно? Так можно было бы и просто джава-машину запускать, там бы и Jython работал.
Ждем когда будет доступен доклад Александра Боргардта Запускаем почти произвольный код через WebAssembly на backend-end.
WebAssembly объединит их всех