Jinak osobní názor (který se do článku nehodí): jako je to pěkné, některé myšlenky v C3 jsou zajímavé, ale C to myslím nenahradí. To ale zatím ani žádný jiný jazyk zmíněný v článku. Největším plusem je naprosto skvělá podpora C ABI, ale i autor C3 je obecně skeptický: https://c3.handmade.network/blog/p/8486-the_case_against_a_c_alternative
Nicméně pro psaní aplikací - na druhou stranu proč to nezkusit.
Nedávno jsem zrovna přepsal několik programů z C3 do Rustu jako takový experiment. Jeden mám dokonce veřejně (C3, Rust).
Ve výsledku mi přijde, že C3 má lepší error handling, lepší makra
a snáze se volají systémové funkce.
V Rustu jsem si o něco jistější, že nepřistupuji k nějaké paměti, co nemám, ale občas to bylo za cenu ošklivějšího kódu (například nemohu do nějaké funkce předat mut referenci na strukturu, pokud na field dané struktury mám referenci jinde, i když by mutable přístup ke struktuře neměnil field, co už jinde referencuji - tohle typový systém Rustu nezvládne zachytit).
Hlavní nevýhoda Rustu mi přijde složitost psaní vlastních datových struktur - dokážu ji napsat v unsafe kódu, ale už bohužel nedokážu vytvořit bezpečné rozhraní. Ta složitost Rustu je vidět například na node.rs ze standardní knihovny. Když jsem to přepsal do C3, tak se velikost zmenšila skoro na třetinu.
Chápu supbjektivní představu ošklivosti.
Chápu, že v Rustu se některé věci dělají složitě.
Když píšete, že jste "to přepsal do C3, tak se velikost zmenšila skoro na třetinu", bylo nebo nebylo to za cenu toho, že kompilátor ztratil přehled o zárukách?
Stejně jako je pro někoho důležité, aby kód byl stručný a krátký, tak pro mě je zase důležité, aby stroj poskytoval nějaké záruky. Podle mých informací je C3 unsafe by default, na rozdíl od Rustu, který je naopak safe by default. Chápu to správně?
> Když píšete, že jste "to přepsal do C3, tak se velikost zmenšila skoro na třetinu", bylo nebo nebylo to za cenu toho, že kompilátor ztratil přehled o zárukách?
Zrovna v tomto konkrétním souboru se asi o žádnou záruku nepřišlo anebo jich bylo naprosté minimum (jediné, co mě teď napadá je, že místo ukazatele NonNull používám v NodeRef.node normální ukazatel). I původní kód v Rustu používá hodně unsafe a věci jako MaybeUninit nebo ukazatele. Naopak v C3 nehrozí tolik chyb s aliasingem jako v Rustu, kde si celá implementace musí dát veliký pozor, aby např. nevrátila třeba 2 mut reference na tutéž věc.
Součástí implementace v Rustu jsou pak další soubory, které se snaží vybudovat safe rozhraní. Ty jsem také zahodil, ale ty do porovnání velikosti nepočítám. Moje implementace má totiž o dost flexibilnější rozhraní a dovoluje dělat věci, co safe implementace v Rustu neumí (např. moje porovnávací funkce nemusí porovnávat klíče stejného typu K).