Многопоточность в GScript3

Одна из ключевых новых фич GScript3, отличающих язык от предшественников — поддержка многопоточности. Если конкретнее, VM языка реализует гибридную кооперативно-вытесняющую многозадачность. В отличие от большинства языков, где многопоточность завязана на системные API, в GScript3 потоки — это встроенная фича VM. Они ближе к корутинам, но при этом управляются планировщиком, что делает их очень похожими на настоящие потоки, только без оверхеда ОС.

(далее…)

Арена-аллокатор в Dagon

Помимо встроенных в dlib механизмов управления памятью (New/Delete, ownership), Dagon теперь поддерживает арены (dagon.core.arena) — специально для случаев, когда ownership не подходит (в основном, это операции над строками). Арена — это аллокатор, который запрашивает память у системы одним большим блоком и размещает в нем объекты последовательно, пока он не заполнится. После этого запрашивает еще один блок и т.д. В моей реализации нет возможности удалять объекты индивидуально — память арены высвобождается только при удалении самой арены. Однако ее можно сбросить без высвобождения и переиспользовать.

Arena arena = New!Arena(10 * 1024); // первый блок в 10 Кб

// Записываем строку в арену:
string s1 = arena.store("This string is now stored in arena!");

// Можно создавать массивы, экземпляры классов и структур:
int[] arr = arena.create!(int[])(100);
Foo foo = arena.create!Foo(20);
MyStruct* stru = arena.create!MyStruct();

// Операции над строками - конкатенация, разбивка, объединение:
string s2 = arena.cat("Hello, ", "world", "!");
string[] parts = arena.split("one,two,three,four", ',');
string joined = arena.join(parts, " + ");

// Форматирование строк:
string s3 = arena.format("The answer is %d", 42);

// Замена:
string r = arena.replace("the quick brown fox jumps over the lazy dog", "the", "a");

Arena — это owned-объект, она может иметь владельца и автоматически удаляться, когда удаляется владелец. Это делает ее удобным хранилищем для временных данных, которые существуют лишь в рамках какого-то алгоритма и не нужны в общем контексте приложения (например, можно хранить в арене приватные данные worker-потока). А еще ее можно использовать как быструю фрейм-локальную память, очищаемую в конце каждого шага игрового цикла.