REDGUY: určitě nejde o to, jak se jmenuje jaká podstatná věc. moje cíle nejsou tak vysoké, jaké má Go a Rust - naopak, sázím na to, že C nepřestane existovat, a že zpětná kompatibilita s C mi zajistí existenci (ostatní cílové platformy pak jsou určeny spíše než co jiného "na hraní" - benchmarkování, flamewary spříznivci těchto cílových platforem, a taky přenositelnost na místa, kde nemůžu přeložit nebo i jen deploynout binárku,...taková místa pokud vím stále existují...)
nicméně, tím že z toho půjde vygenerovat binárka, a že to bude mít nějakou podporu i pro uvažování z hlediska threadů, tím skutečně cílím _trochu_ tam, kam cílí Go a Rust. jenomže nemám tak velké ambice a na příkladu, který jsem uvedl, je vidět, že za nejobvyklejší využití threadů pokládám prostě paralení zpracování prvků nějaké sbírky/kontejneru.... naopak, kdybych tam měl strukturu, která _garantuje_ paralelní spuštění kódu, tak si tím znemožním využití třeba webového PHP jako cílové plaformy!
ačkoliv ty thready u mě půjde odstartovat za jakýmkoliv účelem, tak doporučeným pattern-designem bude právě pouštět je pro více prvky nějaké datové struktury, protože pak nemusíš řešit žádné zamykání, protože je jasně dané, že na jeden prvek si pustil jedno vlákno. dokonce si myslím, že tenhle design patter by mohl slušně řešit většinu věcí typu zamykání - max. pokud následně budeš chtít s prvky dělat něco jiného, dáš si na konci toho rozvětvení něco jako "wait all", což počká na doběhnutí všech spuštěných threadů... a nemusíš řešit semafory, zamykání, nic.
je to vlastně moje typický uvažování o těhle složitých věcech, kdy často univerzální nástroje jsou moc lowlevel a postrádají úplně základní intuitivní infrastrukturu (typicky "pusť tohle jako nový thread, pokud jich ale teda už neběží moc současně")
nicméně je třeba připustit, že část své několikaleté debaty si vyhrál, protože některé z těhle věcí si už fakt nedovedu představit, že bych jednoduše zapouzdřit do C knihovních funkcí a maker, aby to bylo fakt user friendly.
je dokonce možný, že abych z mnou požadovaných konstrukcí mohl jednoduše generovat C kód, tak budu muset všechny místní proměnné deklarovat uvnitř nějakých struktur, a to, co u mě budou anonymní funkce, bude v mezikódu definované jako funkce a budu tam muset předávat pointery na strukturu s proměnnými nadřazeného scope... tahle věc mi mimochodem vyřeší nejen thready, ale taky by mi docela elegantně vyřešila otázku dealokace paměti alokované uvnitř scope.
představ si to tak, že můj code generátor nebude proměnné mateřského jazyka implementovat jako lokální C proměnné, ale vždy pro každý scope vygeneruje strukturu místních proměnných, která vždy půjde předat jakékoliv funkci (protože mi všechny funkce faky vygeneruje code generátor, tak můžu pustit z hlavy délku zápisu). je to něco jako objektové programování, ale každý scope se takhle vlastně stává scope, do kterého můžou nahlížet funkce, které z něj zavoláš (trochu jako vypadalo programování v Pascalu, takže mi to umožní definice "lokálních funkcí", které uvidí do proměnných scope uvnitř kterého funkci defunuješ, ale hlavně mi to umožní generovat v mezikódu C funkci pro všechno,co bude v nadřazeném jazyce anonymní funkce (viz deklarace function() v Javascriptu), současně mi to umožní generovat mezikód bez globálních proměnných...
(asi už jsem tu kdysi psal psal o tom, že mi vzdáleně podobný trik kdysi v 90kách ukazovali v jedné francouzské firmě, která licencovala Arachne browser, s tím, že tam nepoužívání globálních používali jako trik nejen k "thread k safety", ale i možnosti poslepovat jakékoliv fragmenty kódu do jediné programu... každám main() funkce pak má strukturu s vlastními globálními proměnnými... oni ale pouze trvali na tom, aby se místo globálních proměnných používala prostě struktura, na kterou jde předat pointer. tuším stejně to řeší i transcompilery z C do C++...)
trik, kdy proměnné každé funkce se automaticky stávají objektem, na který jde předat pointer, se mi popravdě líbí, akorát znamená overhead tam, kde to není potřeba... a zase: od toho máme generátor kódu, který se může podívat, jestli to bude někde v překládaném zdrojáku potřeba a může tuhle feature zapnout jen pro ty scopes, ve ktrerých se vyskytne potřeba, aby to tak bylo! dtto alokace paměti - když překladač uvidí, že na alokovanou paměť žádná reference vůbec nemá šanci vzniknout, použije daleko tupější alokační strategii, než pro složitější kód, nebo stejně tak může v nadřazeném jazyce být zápis operací pro pole fixní délky a pro pole proměnné délky stejný - ale v mezikódu se můžou použít naprosto struktury...