Byl představen programovací jazyk Solod (So), který poskytuje podmnožinu jazyka Go, transpileovanou do podoby jazyka C (C11), vhodnou pro kompilaci s kompilátory GCC, Clang a zig cc. Klíčovým rozdílem mezi Solod a Go a Tinygo je použití ručního řízení paměti, bez použití garbage collectoru, bez automatické alokace paměti a bez počítání odkazů. Transpiler pro Solod je napsán v jazyce Go a šíří se pod licencí BSD. Podporována je práce v Linuxu, macOS a Windows.
Jazyk podporuje struktury, metody, rozhraní, řezy, návrat funkci s více hodnotami (např. výsledek + chybový kód), generika a odložené volání (defer). Zjednodušení spočívá v tom, že jazyk nepodporuje kanály, souběžné programy a uzávěry. Při vývoji v jazyce Solod lze použít existující LSP servery, lintry, integrovaná vývojová prostředí a editory kódu podporující jazyk Go, stejně jako nástroje „go test“.
Kód napsaný v Solod může být integrován s aplikacemi napsanými v jazyce C (jazyk C může volat funkce v Solod a naopak) a nevyžaduje připojení runtime. Mezi hlavní oblasti použití patří systémové programování s možnosti blízkými jazyku C, ale se syntaxí ve stylu Go a zajištěním kontroly typů. Solod lze také použít pro portování Go knihoven pro využití v projektech v jazyce C. Do jazyka C byly portovány Go balíčky strings, io, bytes, mem, slices atd. Kromě portovaných Go knihoven lze v programech napsaných v jazyce Solod použít obálky nad standardní C knihovnou libc.
Ve výchozím nastavení je veškerá paměť alokována na zásobníku, ale prostřednictvím funkcí Alloc / Free standardní knihovny lze alokovat paměť na haldě. Garbage collector a počítání odkazů se nepoužívají, ale v Solod jsou k dispozici možnosti pro kontrolu typů a havarijní ukončení při přístupu mimo pole. Kontroly na vracení visících ukazatelů (dangling pointer) a chybějící uvolnění paměti se však neprovádějí. Jako hlavní způsob odhalování problémů s pamětí se zmiňuje použití AddressSanitizer (-fsanitize=address) v moderních kompilátorech.
Z hlediska výkonu jsou programy zkompilované v Solod ve většině případů rychlejší než programy napsané v Go. Například výkon funkcí z balíčku Byte je rychlejší o 1,5násobek při totožné spotřebě paměti. Práce s byty v bufferech je rychlejší o 1,3násobek při čtení a 2–4násobek při zápisu. V balíčku Map je vyhledávání podle celočíselného klíče rychlejší o 3,4násobek, ale modifikace klíčů je pomalejší o 1,6násobek. Vyhledávání podle řetězcových klíčů je na stejné úrovni jako v jazyce Go, ale modifikace je pomalejší o 1,5násobek. Parsování a formátování celých čísel je rychlejší o 2násobek, a u čísel s plovoucí desetinnou čárkou o 1,5/1,2násobek. Řetězcové funkce jsou rychlejší o 1,3násobek, a vytváření řetězců je rychlejší o 2–4násobek při snížení spotřeby paměti o 10–20%.
Zdroj: opennet.ru
