Esitatud on programmeerimiskeel Solod (So), mis pakub Go keele allkomplekti, mis transkompileeritakse C (C11) keeles esitusvormiks, mis sobib GCC, Clang ja zig cc kompilaatoritega. Solodi peamine erinevus Go ja Tinygo vahel on käsitsi mälu haldamine, mis töötab ilma prügikoristaja, automaatse mälu eraldamise ja viidete loendamiseta. Solodi transpiler on kirjutatud Go keeles ja levitatakse BSD litsentsi all. Toetatakse tööd Linuxis, macOS-is ja Windowsis.
Keel toetab struktuure, meetodeid, liideseid, lõike, mitme väärtuse tagastamist funktsioonidega (näiteks tulemus + veakood), geneerikat ja edasi lükatud kutsе (defer). Lihtsuse huvides ei toeta keel kanaleid, kerimisi ja sulgureid. Solodi arendamisel võivad kasutada olemasolevad LSP-serverid, linturid, integreeritud arenduskeskkonnad ja koodiredaktorid, mis toetavad Go keelt, samuti tööriistad "go test".
Solod keeles kirjutatud kood saab integreeruda C keele rakendustega (C keel saab kutsuda Solodi funktsioone ja vastupidi) ja ei vaja runtime'i. Peamised rakendusvaldkonnad hõlmavad süsteemiprogrammeerimist, pakkudes kokkuvõttes ligilähedasi võimalusi C-le, kuid Go stiilis süntaksiga ja tüüpide kontrollimise tagamisega. Solodi saab kasutada ka Go teekide portimiseks C projektidesse. C keelde on portitud Go pakette nagu strings, io, bytes, mem, slices jne. Lisaks portitud Go teekide kogumile saab Solodil kasutada ka vahetusi standardse C teegi libc üle.
Vaikimisi jaotatakse kogu mälu virna, kuid standardraamatukogu Alloc / Free funktsioonide kaudu saab mälu eraldada ka hunnikus. Prügikoguja ja viidatud arvestus ei ole kasutusel, kuid Solodis pakutakse tüübi kontrollimise ja mäluaadressi ületamise korral hädakorraks lõpetamise võimalusi. Samuti ei tehta kontrollimist rippuvate viideste (dangling pointer) ja vabastamata mälu osas. Peamiseks viisiks mäluga seotud probleemide tuvastamiseks mainitakse AddressSanitizerit (-fsanitize=address) kaasaegsetes kompilaatorites.
Tõhususe poolest on Solod eelseatud programmid enamikul juhtudel kiiremad kui Go-programmid. Näiteks on Byte paketi funktsioonide töötluse jõudlus pooleteise korra võrra parem sama mälu tarbimise juures. Bite-pufferite töötlemine on lugemisel 1,3 korda kiiremini ja kirjutamisel 2–4 korda kiiremini. Map paketis on tervikvõtme alusel andmete väljaotsimine 3,4 korda kiirem, kuid võtmete muutmine on 1,6 korda aeglasem. Stringivõtmete väljaotsimine on Go keelega samal tasemel, kuid muutmine on 1,5 korda aeglasem. Täisarvude analüüs ja vormindamine on 2 korda kiirem, samas kui liikuvate komade puhul on see 1,5/1,2 korda kiirem. Stringifunktsioonid on 1,3 korda kiirem, ja stringide loomine on 2-4 korda kiirem, samas kui mälu tarbimine väheneb 10-20%.
Allikas: opennet.ru
