Vzpomínky, vzpomínky... Kdysi v 90. letech jsem toužil po překladači C a objednal si (tuším přes tehdejší časopis Bajt nebožtíka L. Zajíčka) na disketě nějaký shareware C překladač pro DOS - byl omezený, plná verze se měla platit. Pak jsem si s velkou slávou za tehdejší strašlivou cenu cca 2300 korun koupli krabici s Borland C++ 3.0. No a pak přišel na můj desktop po čase Linux a měl jsem vše zdarma (gcc, egcs atd.).
Od C (i C++) jsem utekl, ale nostalgie zůstala.
Tak zrovna ten boehmgc muze fungovat i v modu, kdy kompletne nahradi malloc, takze se pak nemusite starat ani o uvolnovani pameti naalokovane knihovnami, ktere nebyly pro alokator napsany. Samozrejme jen za predpokladu, ze k uvolneni vsech zdroju neni potreba provest jeste nejakou dalsi operaci (treba zavolat close()).
no jasne, ale porad se do toho bude plest omezeni jazyka. Prikad, alokace v ramci funkce v cecku na zasobnikovem ramci a vraceni ukazatele - to je proste spatne, kdezto v jazycich typu Java nebo Go se to neresi (v Jave proto, ze je vsechno reference na heap nebo primitivni hodnota, v Go proto, ze to kompilator odhali a neda tu oblast na zasobnik, ale na heap).
V Cčku můžete ukazatele schovat hodně kreativními způsoby. Přetypování na int je ještě slabý odvar. Koukněte třeba na xor linked list. Nebo třeba NaN packing, kdy se celý ukazatel dá schovat do NaNu v doublu.
Tracing GC rozhodně není všemocný zázrak, který by se dal jednoduše nasadit bez zásadních důsledků.
22. 3. 2024, 11:12 editováno autorem komentáře
Takhle funguje management paměti v Postgresu. Je to nadstavba nad malloc - která vytváří hiearchii tzv paměťových kontextů. palloc alokuje paměť z vybraného nebo aktuálního kontextu, pfree může paměť uvolňovat. Paměťové kontexty mají definovanou životnost - transakce, query, výpočet řádku, výpočet výrazu. Na začátku je náročnější na to zvyknout - musíte vracet data ve správném kontextu, pak to funguje jak víno.
Hlavně je to relativně jednoduchý přímočarý mechanismus bez jakýkoliv jednoduchých nebo složitých (chytrých) heuristik. Jednoduché, ale chytré a roky s tím nejsou žádné problémy.
fajn článek
Chibicc tedy nejspíš moc praktických použití mít nebude. Maximálně jako reference.
Tcc se myslím využívá celkem často u toolingu prog. jazyků které kompilují/transpilují do C. Vlang ho používá určitě a myslím že i nim.
Hlavně pro windows uživatele to má výhody. Pokud jim chcete poskytnout vývojové nástroje tak než jim psát dokumentaci jak instalovat překladač z Visual Studia, tak jim prostě do zipu přibalíte i malinkou binárku tcc a pro vývoj je to naprostá pohodička.
nim těch backendů má celou řadu, tcc je jeden volitelných, je podle mě také ten nejrychlejší z nich, kdysi jsem zkoušel zig cc, ale to byla pomalost nad pomalost.
Mám rád tyhle komunitní věci, vlang je skvělý jazyk, z tcc těží jak to jde, škoda, že jeho compiler ještě pořád hází spousty syntax error, segmentation failů. Další zajímavá věc nad tcc je třeba https://bellard.org/jslinux. Z těch větších věcí je na něm třeba založený GNU Guix.
Ano, ten jslinux - to je založené na další jeho hodně populární věci - javascript engine https://bellard.org/quickjs/ malinký, embeddovatelný, umí es2023, a můžete s ním javascript "zkompilovat" do binárky. Prostě pecka
Ten chapík umí zajímavé a užitečné věci v C, co jsou ve výsledku většinou jedna malinká binárka, kterou pustíte všude.
21. 3. 2024, 21:12 editováno autorem komentáře
Tcc jsem pouzival pro opakovatelny/auditovatelnou binarku na vyrobu klicu kdy se auditoval i puvodni compiler (certifikacni pozadavky). Velka vyhoda je prave jednoduchy vystup, jednoducha auditovatelnost compileru i vysledneho spustitelneho kodu bez jakkekoliv optimalizace vysledne binarky.
V pedagogicke praxi to ma vyhodu ze na vysledne binarce dokazete studentum vysvetlit na disasembleru co se vse pri prekladu deje. A tim jak je ten preklad "hloupy" tak se neztratite v preoptimalizovanem kodu.