Præsenteret programmeringssprog Solod (So), som tilbyder et delmængde af Go-sproget, der kan transkompileres til en C (C11) repræsentation, der er egnet til kompilatorer som GCC, Clang og zig cc. Den væsentligste forskel mellem Solod og Go er brugen af manuel hukommelsesstyring uden garbage collection, automatisk hukommelsestildeling og referenceoptælling. Transpilerer til Solod er skrevet i Go og distribueres licenseret under BSD. Understøtter drift på Linux, macOS og Windows.
Sproget understøtter strukturer, metoder, interfaces, slices, og returnerer funktioner med flere værdier (f.eks. resultat + fejlkode), generics og udsatte kald (defer). For at forenkle sproget understøttes ikke kanaler, co-rutiner og lukninger. Under udvikling i Solod kan eksisterende LSP-servere, linters, integrerede udviklingsmiljøer og kodeeditorer, der understøtter Go, samt værktøjet 'go test' anvendes.
Kode skrevet i Solod kan integreres med applikationer i C (C kan kalde funktioner i Solod og omvendt) og kræver ikke en runtime. Nøgleområder for anvendelse inkluderer systemprogrammering med C-lignende funktioner, men med Go-lignende syntaks og sikring af typekontrol. Solod kan også anvendes til at portere Go-biblioteker til brug i C-projekter. Følgende Go-pakker er porteret til C:
- strings
- io (antonz.org)
- bytes
- mem
- slices
og m.fl. Udover sættet af porterede Go-biblioteker i programmer på Solod kan anvendes binding over den standard C-bibliotek libc.
Som standard allokeres al hukommelse på stacken, men gennem funktionerne Alloc / Free i standardbiblioteket kan hukommelse allokeres på heapen. Garbage collection og referenceoptælling anvendes ikke, men Solod tilbyder muligheder for typekontrol og nødstop ved adgang uden for arrayet. Kontroller for hængende pegepinde og mangel på frigivelse af hukommelse foretages dog ikke. Den primære metode til at identificere hukommelsesproblemer nævnes som brug af AddressSanitizer -fsanitize=address i moderne kompilatorer.
Med hensyn til ydeevne er de kompilere programmer skrevet i Solod i de fleste tilfælde hurtigere end programmer skrevet i Go:
- Ydelsesfunktionen fra Byte-pakken er 1,5 gange hurtigere ved identisk hukommelsesforbrug;
- Arbejdet med byte-buffere er 1,3 gange hurtigere ved læsning og 2-4 gange hurtigere ved skrivning;
- I Map-pakken er udtrækningen efter heltalsnøglen 3,4 gange hurtigere, men modificeringen af nøglerne er 1,6 gange langsommere;
- Udtrækning efter strengenøgler er på niveau med Go-sproget, men modificeringen er 1,5 gange langsommere;
- Parsing og formatering af heltal er 2 gange hurtigere, mens det for flydende tal er 1,5/1,2 gange hurtigere;
- String-funktioner er 1,3 gange hurtigere, og oprettelsen af strenge er 2-4 gange hurtigere med et fald i hukommelsesforbruget på 10-20%.
Kilde: linux.org.ru
