Przedstawiony język programowania Solod (So), który dostarcza podzbiór języka Go, transkompilowany do postaci w języku C (C11), odpowiedniej do kompilacji przez kompilatory GCC, Clang i zig cc. Kluczową różnicą między Solod a Go jest ręczne zarządzanie pamięcią, działające bez użycia garbage collectora, bez automatycznego przydzielania pamięci i bez liczenia referencji. Transpiler dla Solod został napisany w języku Go i rozpowszechniany jest udostępniany na licencji BSD. Współpracuje z systemami Linux, macOS i Windows.
Język obsługuje struktury, metody, interfejsy, slajsy, zwracanie przez funkcje wielu wartości (np. wynik + kod błędu), generyki i opóźnione wywołania (defer). Aby uprościć, język nie obsługuje kanałów, współprogramów ani zamknięć. Przy programowaniu w języku Solod można korzystać z istniejących serwerów LSP, linterów, zintegrowanych środowisk programistycznych oraz edytorów kodu obsługujących język Go, a także narzędzi „go test”.
Kod napisany w Solod może integrować się z aplikacjami w języku C (język C może wywoływać funkcje w Solod i odwrotnie) i nie wymaga dołączenia runtime. Do kluczowych obszarów zastosowań należy programowanie systemowe z możliwościami zbliżonymi do C, ale z składnią w stylu Go oraz zapewnieniem sprawdzania typów. Solod może być również stosowany do portowania bibliotek Go do użytku w projektach w języku C. Do języka C zostały przeniesione pakiety Go:
- strings
- io (antonz.org)
- bytes
- mem
- slices
i i tym podobne. Oprócz zestawu przeniesionych bibliotek Go, w programach w języku Solod można wykorzystać oprawki nad standardową biblioteką C libc.
Domyślnie cała pamięć jest przydzielana na stosie, ale za pomocą funkcji Alloc / Free standardowej biblioteki można przydzielać pamięć na stercie. Garbage collector i liczenie referencji nie są używane, ale w Solod dostępne są możliwości sprawdzania typów oraz awaryjnego zakończenia przy odwołaniu poza granice tablicy. Nie przeprowadza się jednak sprawdzeń dotyczących zwracania wiszących wskaźników dangling pointer i braku zwolnienia pamięci. Jako główny sposób wykrywania problemów z pamięcią wymienia się użycie AddressSanitizer -fsanitize=address w nowoczesnych kompilatorach.
Pod względem wydajności skompilowane programy napisane w Solod w większości przypadków są szybsze niż programy w Go:
- wydajność pracy funkcji z pakietu Byte jest półtora raza szybciej przy identycznym zużyciu pamięci;
- praca z buforami bajtowymi jest szybsza 1,3 razy przy odczycie i 2-4 razy przy zapisie;
- w pakiecie Map wybór według klucza całkowitego jest szybszy 3,4 razy, ale modyfikacja kluczy jest wolniejsza 1,6 razy;
- wybór według kluczy tekstowych na tym samym poziomie co język Go, ale modyfikacja wolniejsza 1,5 razy;
- parsowanie i formatowanie liczb całkowitych jest dwukrotnie szybsze, a liczb zmiennoprzecinkowych — 1,5/1,2 razy;
- funkcje tekstowe są szybsze 1,3 razy, a tworzenie stringów jest szybsze 2-4 razy przy zmniejszeniu zużycia pamięci o 10-20%.
Źródło: linux.org.ru
