Google Chrome 136 byl prohlášen za stabilní. Nejnovější stabilní verze 136.0.7103.59 přináší řadu novinek z hlediska uživatelů i vývojářů. Podrobný přehled v poznámkách k vydání. Opraveno bylo 8 bezpečnostních chyb. Vylepšeny byly také nástroje pro vývojáře.
Homebrew (Wikipedie), správce balíčků pro macOS a od verze 2.0.0 také pro Linux, byl vydán ve verzi 4.5.0. Na stránce Homebrew Formulae lze procházet seznamem balíčků. K dispozici jsou také různé statistiky.
Byl vydán Mozilla Firefox 138.0. Přehled novinek v poznámkách k vydání a poznámkách k vydání pro vývojáře. Řešeny jsou rovněž bezpečnostní chyby. Nový Firefox 138 je již k dispozici také na Flathubu a Snapcraftu.
Šestnáctý ročník ne-konference jOpenSpace se koná 3. – 5. října 2025 v Hotelu Antoň v Telči. Pro účast je potřeba vyplnit registrační formulář. Ne-konference neznamená, že se organizátorům nechce připravovat program, ale naopak dává prostor všem pozvaným, aby si program sami složili z toho nejzajímavějšího, čím se v poslední době zabývají nebo co je oslovilo. Obsah, který vytvářejí všichni účastníci, se skládá z desetiminutových
… více »Richard Stallman přednáší ve středu 7. května od 16:30 na Technické univerzitě v Liberci o vlivu technologií na svobodu. Přednáška je určená jak odborné tak laické veřejnosti.
Jean-Baptiste Mardelle se v příspěvku na blogu rozepsal o novinkám v nejnovější verzi 25.04.0 editoru videa Kdenlive (Wikipedie). Ke stažení také na Flathubu.
TmuxAI (GitHub) je AI asistent pro práci v terminálu. Vyžaduje účet na OpenRouter.
Byla vydána nová verze R14.1.4 desktopového prostředí Trinity Desktop Environment (TDE, fork KDE 3.5, Wikipedie). Přehled novinek i s náhledy v poznámkách k vydání. Podrobný přehled v Changelogu.
Bylo vydáno OpenBSD 7.7. Opět bez písničky.
Nedávno jsem to znovu počítal, a ejhle, krize středního věku je tu! I já jsem patrně smrtelný a z toho vyplývá, že nebudu schopen zabývat se během života vším, čím bych si přál se zabývat.
Psychologické faktory jsou různé, v podstatě jde o kombinaci syndromu dítěte v cukrárně (rád poznávám nové, nesouvisející věci, naposledy laškuji s Haškellem) a syndromu analýzy paralýzou (tak dlouho jsem hledal vhodný parser pro subjekt tohoto článku, až jsem došel k závěru, že se na ten Parsec prosté podívat musím). Zkrátka, nejsem stvořen pro úspěch, ale koho to zajímá, když je všude kolem tolik čokolády?
Rozhodl jsem se tedy, že se podělím o některé nápady, většinou věci, které si podle mého soudu zaslouží vzniknout, ale na které bohužel nemám dost soustředění. Je to samozřejmě potupné, protože správný chlap si věci dělá sám, a pozná se podle činů, nikoli slov. Ale aspoň ta diskuse bude věcná (i po deseti letech na Ábíčku může člověk věřit..) A možná se najde (kde jinde než zde?) nějaký šikovný matfyzák, který z toho vyškrtá naivní hlouposti, přidá svoje vlastní podle chuti a především, bude ochoten překonat všechny související překážky, protože k úspěchu stvořen je.
A první z těch věcí je programovací jazyk. Je jich už tolik, kdo by nechtěl mít vlastní? V zásadě mi jde o propojení několika hru-měnících vzorců myšlení (integration of game-changing paradigms):
Více tyto vlastnosti (a jak spolu souvisí) rozeberu dál. Jinak by šlo o jazyk:
Programovací jazyk je v podstatě uživatelské rozhraní pro programátora. Pokud chceme prozkoumat nové vzorce myšlení, nezbyde nám než přijmout poslední bod jako nutnost. Optimální uživatelské rozhraní je výsledek mnoha experimentů, a snaha zachovat kompatibilitu experimentům až nepříjemně brání.
Vlastnosti tohoto nového jazyka (nějak ho pracovně pojmenujme, třeba Crisp z anglického "CRazy lISP") vyžadují v mnoha směrech dynamickou analýzu programu na testovacích datech. Moje základní představa je taková, že se program nejprve přeloží obecněji, než by bylo nutné, ale s instrumentací, spustí se na testovacích datech, a výsledky měření nám dají informaci o tom, jak program více konkretizovat a lépe instrumentovat, a toto se opakuje ad nauseam, dokud nedostaneme rozumný program. Tím se dostáváme k první nové vlastnosti.
Nejprve syntaktická odbočka. Základní syntaxe by byla Lispová, tedy (spousty forem ((se spoustou) závorek)), ve formě (operátor argument1 argument2 ..)
. Operátory jsou tří druhů - speciální formy (vestavěné konstrukce), makra (byla-li by) a funkce. Jak operátory, tak argumenty mohou být další formy. Speciální formy mají vlastní pravidla vyhodnocení, funkce vyhodnocují všechny argumenty striktně (pokud nedojde k jiné magii). Oproti Lispu by byl rozdíl v tom, že syntaxe forem by nebyla speciální zápis S-výrazů (tedy formy s tečkou (a . b)
by neexistovaly, tečka v Crispu by měla jiný význam). Nad tímhle lze vymyslet mnoho syntaktického cukru, nicméně pro tuto chvíli je podstatné ještě jedno rozšíření syntaxe - anotace (které by narozdíl od všeho dalšího nebyly jen syntaktický cukr, ale nezávislé větvení syntaktického stromu).
Ke každé formě či atomu by bylo totiž možné přidat jednu či více anotací ve tvaru (forma parametr1 parametr2) ^(anotace1 anotace2 ..)
, přičemž každá anotace by mohla být jak atom, tak forma, a na jejich pořadí by nezáleželo. Skrze anotace by programátor vyjadřoval například:
Naopak, kompilátor by mohl také doplňovat určité druhy anotací (patrně jako odkaz na konkrétní sadu testů), a vyjadřovat tak:
Obecně by se dalo říct, že smyslem anotací je ukládat informace, které nemají vliv na to, co bude program dělat, ale jak to bude dělat, jak efektivně a s jakými nároky na zdroje, a pomáhat programátorovi programu porozumět. Samozřejmě, z výše uvedených příkladů je patrné, že to rozdělení nelze vést striktně a je otázkou citu; v zásadě by ale mělo platit, že program přeložený s odstraněním všech anotací by zůstal funkční. (Cílem částečně je oddělit anotace, které mohou být doménou různých utilit, od samotného programu, který ať si vypadá jak programátor chce.)
Prostřednictvím anotací by tedy probíhal onen slíbený dialog (po kterém všichni tolik toužíme) s kompilátorem. V první implementaci bych si představoval, že bude existovat IDE (říkejme mu třeba Emacs), které bude schopné
Zkusíme malý příklad v pseudo-Crispu:
(defun add (a b) (+ a b)) (print (add 2 2))
Toto by se přeložilo a spustilo. Na začátku kompilátor neví nic o typech parametrů a a b, takže volání funkce add přeloží totálně genericky, jako v dynamicky typovaném jazyce (dostane parametr každého typu jako součást hodnoty). Výsledkem (kromě výsledku) bude, že dostaneme modifikovaný zdroják (patrně po analýze runtime dat nějakým dalším nástrojem), vypadající nějak:
(defun add (a^(!?+Type:int) b^(!?+Type:int)) (+ a b)) (print (add 2 2))
Přitom anotace u a a b budou skryté v IDE (bude vidět jen ^ indikující, že tam nějaká anotace je). K čemu ony "!?+" před jménem anotace? Vykřičník udává, že jde o tvrzení kompilátoru; další dva znaky pak souvisí s naším pohledem na tvrzení. První znak je názor programátora, ten zatím není známý, proto otazník. Druhý znak je názor kompilátoru. V tomto případě (řekněme) dospěl na základě dynamické analýzy, tedy pozorováním, že typem je vždy int. Pokud by k tomu pozorování dospěl na základě statické analýzy, tedy logickou úvahou, pak by tam byl jiný znak (dejme tomu "=").
Programátor může nyní anotaci otevřít a onu hypotézu potvrdit nebo vyvrátit; tím se první otazník změní na "+" nebo "-" podle toho, zda je hypotéza podle programátora pravdivá či nikoli. (Existují i další možnosti, programátor může například říct, je sice pravdivá, ale radši to vždycky za běhu otestuj. Nebo je nepravdivá, ale testy jsou špatně. A tak všelijak.) Takže se rozhodne udělat třeba změnu:
(defun add (a^(!++Type:int) b^(!++Type:int)) (+ a b)) (print (add 2 2)) (print (add "Ahoj" "svete!"))
A.. program selže. Protože nyní funkce add očekává vždy typ int, ale dostane v druhém volání typ string (dejme tomu). Dostaneme pak zpět:
(defun add (a^(!+-Type:int) b^(!+-Type:int)) (+ a b)) (print (add 2 2)) (print (add "Ahoj" "svete!"))
Druhý znak "-" v anotaci nyní indikuje, že tvrzení o typu bylo kompilátorem pozorováno jako nepravdivé (tedy není bez dalšího známo, jaký typ může parametr a nebo b nabýt). Jak je vidět, jakým způsobem se program přeloží závisí na kombinaci znaků u anotovaných tvrzení, především na tom prvním.
Pro hnípaly dodávám, že mi nešlo ani tak o přesnou sémantiku anotací tvrzení (sám to nemám moc rozmyšlené, bude to předmětem dalších úvah, a tyhle věci by právě chtělo spíš podrobit experimentování než úvahám), chci především ilustrovat, jak by probíhal onen dialog.
Na závěr trochu filozofie o korektnosti programu. Zastánci typových systémů si představují, že ideálně problém namodelujeme v typové doméně, a výsledkem překladu (kdy dojde k typové kontrole) bude sémanticky správný program. To je možné (teoreticky, v praxi typové systémy běžných jazyků nejsou dostatečně silné) díky něčemu, čemu ja nerozumím a říká se tomu Curry-Howard correspondence. Možná bychom ale mohli postupovat obráceně, z korektního (nebo částečně korektního) programu pozorováním určit typy, a na jejich základě program ověřit. Jazyk Crisp by nám takovou možnost dával.
Podobně, kompilátory většinou neprovádějí optimalizace, které nejsou podložené statickou analýzou (a tedy jistotou, že výsledný program bude běžet správně). Crispový kompilátor by se takto omezovat nemusel - dal by nám prostřednictvím dialogu na vědomí, kde provedl potenciálně nekorektní optimalizaci, a dovolil by nám ji otestovat, nebo prohlásit, že ve skutečnosti korektní je. Takto by bylo možné volit např. mezi rychlostí a robustností programu. (Ano, je to tenký led, ale zajímavě tenký.)
V příštím pokračování (snad - určitě mi pomůže, pokud projevíte zájem) budu pokračovat v popisu dalších vlastností jazyka.
P.S. Je mi jasné, že tahle celá myšlenka má asi dva miliony nedostatků. Pokud jsou zřejmé, není třeba sdělovat mi je v diskusi, pokud současně nemáte řešení.
Tiskni
Sdílej:
Myslím, že se držíš příliš při zemi a zbytečně se svazuješ vymýšlením syntaxe pro popis. Takováhle věc nebude bez pořádného grafického editoru použitelná tak jako tak.No, napsal jsem to tak, jak bych k tomu pristoupil ja. Myslim, ze pouzit Emacs je schudnejsi nez psat si cele vlastni IDE (existuje takovy podobny pokus pro Clojure, ale ten ma jine cile nez ja). Ale mozna se pletu, mozna to nekdo udela v tom hnusnem Eclipse. Jinak samozrejme nejakou syntax jsem pro ilustraci zvolit musel.
Co si slibuješ od "dotazovacího jazyka v rámci jazyka"?Jde o to, ze bych rad nad daty v pameti pouzival stejne konstrukty, jako nad databazi, a mozna dokonce eliminoval tim potrebu mit treba embedded aplikacni databaze a tak. Druhy duvod je automaticka volba datovych struktur, ktera uz z principu vyzaduje vyssi uroven abstrakce (neni snadne toto delat na nespravne urovni abstrakce, kterou jsou v soucasnosti pouzivane slozene datove typy). Vice (i kdyz asi ne o moc) o tom jeste napisu.
Jde o to, ze bych rad nad daty v pameti pouzival stejne konstrukty, jako nad databazi, [...]Tedy něco jako je LINQ v C# ?
Pokud narazis na to, ze ten navrhovany jazyk pouziva Lispovou syntaxi, pak je to trefa do cernehoNarazel jsem na to, ze zavedeni takove funkcionality v LISPu neni problem, kdezto v C# kvuli LINQu zavadeli treba "var", coz mi u jazyku tohoto typu prijde jako zverstvo.
jak by ta makra interagovala s temi anotacemi. Je to jeden z obtiznych problemuMakra s anotacemi mohou pracovat bez problemu. Z opacne strany je to horsi. Uzivatel by musel pracovat s expandovanymi makry, coz by bylo na ukor citelnosti a srozumitelnosti.
Narazel jsem na to, ze zavedeni takove funkcionality v LISPu neni problem, kdezto v C# kvuli LINQu zavadeli treba "var", coz mi u jazyku tohoto typu prijde jako zverstvo.Uprimne, var mi az tak nevadi, zverstvo by bylo spis tam ten typ muset psat.
Z opacne strany je to horsi. Uzivatel by musel pracovat s expandovanymi makry, coz by bylo na ukor citelnosti a srozumitelnosti.Ano, to je ten problem. Jak anotace relevantni k expandovanemu makru prednest zpet uzivateli? Leda, ze by to makro definovalo nejaky mechanismus, jakym ty anotace slucovat nebo transformovat. Ovsem to by byl zase problem, protoze pokud muzou byt anotace zcela obecne, pak by musely mit take moznost ten mechanismus ovlivnit. Chce to proste vyzkouset ruzne bezne pripady a na zaklade toho analyzovat, jak na to.
Jak anotace relevantni k expandovanemu makru prednest zpet uzivateli? Leda, ze by to makro definovalo nejaky mechanismus, jakym ty anotace slucovat nebo transformovatTohle by mozna slo resit u hygienickych maker. Anotace by byly navazany u pravidel a tak by se resila komunikace makro <-> expandovane makro.
Uprimne, var mi az tak nevadi, zverstvo by bylo spis tam ten typ muset psat.A co prosakování abstrakce? Můžu chtít použít obecnější typ.
(defun add (a^(!+-Type:int) b^(!+-Type:int)) (+ a b))Imho je toto prehladnejsie
function add (int a, int b) { return a + b; }Next-gen jazyk sa musi hlavne dobre citat.
(defun add (a^ b^) (+ a b))Samozrejme, muze se ti nelibit Lispovy zapis, ale ten ma prave tu vyhodu, ze lze tu anotaci umistit k libovolnemu uzlu syntaktickeho stromu (a konzistentne - tudiz je snadne napsat pravidla, ktera umozni tomu IDE to schovat). Sice pises, ze se to musi hlavne dobre cist, ale v tomto smeru jsme uz myslim narazili na limit. Nejde provest dalsi prulom pokud se nejprve neslevi nekde jinde, to je povaha prulomovych technologii.
Stejně jako já tu taky nepíšu o tom co jsem nakonstruoval ale bavím se o CADu...Zkus někdy napsat. Když k tom přidáš fotky, myslím že jednak zlepšíš názor na vlastní osobu a jednak tím ukážeš něco zajímavého.
Vzdyt se staci podivat na jeho stranky..To je něco trochu jiného, než formou článku nějak popsat zajímavý projekt. Programátoři to dělají každou chvíli, tak nevím, proč by to nemohl udělat i strojař.
Jinak ja si myslim, ze jak se snazi financovat vyvoj podpurnych nastroju pro CAD, to je dobra vec.Neříkám opak.
treba v Pythonu jsem hodne casu travil praci s ruznymi adhoc datovymi strukturamiMuzes dat nejaky priklad? Osobne si nedokazu predstavit, jak by me volba dat. struktur kompilatorem pomohla, respektive jak by to realne vypadalo. Vetsinou delam v Jave a vyber datovych struktur je asi tak na 20. miste v seznamu veci, ktere mi delaji problemy.
Nechci, aby to fungovalo pro vsechny datove struktury, ale tak pro minimalne 90% beznych pripaduNedokazu si moc dobre predstavit, jak by to melo fungovat. Protoze z datove struktury se odviji algoritmy. To mi spis prijde realnejsi, aby si prekladac upravoval algoritmy ze znalosti dat a datovych struktur.
Asi jako ty SQL databaze.Toto neni moc dobry priklad. SQL ma pevne dane datove struktury a pak se na to snazi napasovat nejakou kombinaci dejme tomu 10 pevne danych algoritmu, ktere zna. K tomu se pouziva obrovska cerna magie souvisejici s odhadem, jak vypadaji data, jak ktera operace bude probihat, atd. Otazka je, jestli zkusebnim behem jdou sesbirat relevantni data.
(locally (declare (optimize (speed 3))) (defun add (a b) (+ a b)))=>
; in: DEFUN ADD ; (+ A B) ; ; note: unable to ; optimize ; due to type uncertainty: ; The first argument is a NUMBER, not a RATIONAL. ; The second argument is a NUMBER, not a FLOAT. ; ; note: unable to ; optimize ; due to type uncertainty: ; The first argument is a NUMBER, not a FLOAT. ; The second argument is a NUMBER, not a RATIONAL. ; ; note: unable to ; optimize ; due to type uncertainty: ; The first argument is a NUMBER, not a SINGLE-FLOAT. ; The second argument is a NUMBER, not a DOUBLE-FLOAT. ; ; note: unable to ; optimize ; due to type uncertainty: ; The first argument is a NUMBER, not a DOUBLE-FLOAT. ; The second argument is a NUMBER, not a SINGLE-FLOAT. ; ; note: forced to do GENERIC-+ (cost 10) ; unable to do inline float arithmetic (cost 2) because: ; The first argument is a T, not a DOUBLE-FLOAT. ; The second argument is a T, not a DOUBLE-FLOAT. ; The result is a (VALUES NUMBER &OPTIONAL), not a (VALUES DOUBLE-FLOAT ; &REST T). ; unable to do inline float arithmetic (cost 2) because: ; The first argument is a T, not a SINGLE-FLOAT. ; The second argument is a T, not a SINGLE-FLOAT. ; The result is a (VALUES NUMBER &OPTIONAL), not a (VALUES SINGLE-FLOAT ; &REST T). ; etc.Špatné optimizace:
(locally (declare (optimize (speed 3) (debug 2))) (defun add2 (a b) (declare (fixnum a b)) (the fixnum (+ a b)))) (add2 most-positive-fixnum 1)=>
The value 4611686018427387904 is not of type FIXNUM. [Condition of type TYPE-ERROR]Bez kontrol:
(locally (declare (optimize (speed 3) (safety 0) (debug 0))) (defun add3 (a b) (declare (fixnum a b)) (the fixnum (+ a b)))) (disassemble #'add3)=> nic nekontrolující a rychlé
; disassembly for ADD3 ; 02E37316: 84042500000021 TEST AL, [#x21000000] ; no-arg-parsing entry point ; 1D: 4801FA ADD RDX, RDI ; 20: 488BE5 MOV RSP, RBP ; 23: F8 CLC ; 24: 5D POP RBP ; 25: C3 RET
the
a declare
? (hmm, to si možná udělám)
Ty hlášky jsou signal-ované noty daného typu, takže není problém je odchytávat a zpracovat - otázka je kam ty deklarace automaticky přidávat (pokud je třeba lambda v letu v casu/condu/ifu v defunu, kam má deklarace přijít?); ale to je problém principiální, který stejně budete muset řešit.
Na ukázce s těmi primitivními typy to vypadá zajímavě1 – ale co složitější struktury? Dejme tomu, že v systému budu chtít evidovat osoby a u nich jejich rodné číslo, jméno, příjmení atd. Jak teď zapíšu funkci, která má jako argument přijímat osobu (a odmítnout třeba zvíře nebo věc)?
A co ten dotazovací jazyk – fungoval by jen nad kolekcemi v paměti nebo i nad nějakým trvalým úložištěm?
[1] i když nevím, jestli bych chtěl tolik svazovat program s ukázkovými daty
Do budoucna mam v planu udelat prekladac, ktery funguje na podobne bazi, co tu navrhujes, s tim rozdilem, ze pokud udela chybnou hypotezu o datovem typu a dostane neodpovidajici data, sam to rozezna a nove prekompiluje kod.Skvele!
Ten napad s ^ a anotacemi se mi libi, asi si jej vypujcim. ;-]Do toho.
Mel by pocitac mit pravo upravovat zdrojovy kod, a jak moc?Tohle je podle me slepa cesta, obzvlast v situaci, kdy vetsinu casu clovek stravi udrzbou stareho kodu. Predstava, ze do toho kodu jeste bude hrabat pocitac, je desiva.
Spatne argumenty nebo vstupy do funkce
Interni logicke chybyVyjimky, jejichz vyvolani znamena chybu v kodu, bych normalne vubec neosetroval. Myslel jsem spis vyjimecne stavy okolniho prostredi, jako prave selhani disku nebo network timeout.
Nebo by mohlo byt mozne pustit program jen jednou, a nechat si zobrazit jen ty casti, ktere se skutecne provedly (tim by se odstranila velka cast kodu pro reseni chybovych stavu).Tohle mi uprimne receno prijde strasne fragilni, mozna ze by to vetsinou fungovalo, ale nebudu mit jistotu. Pripomina mi to programovani stylem ze neco rychle napisu, zkusim jestli to funguje, pokud ne, neco nahodne zmenim, zkusim zase atd.
Nejvic se mi libi jak resi vyjimky Go, pomoci vice navratovych hodnot.Vice navratovych hodnot je samozrejme uzitecna vlastnost. Ale trochu jina nez signaly.
Vyjimky, jejichz vyvolani znamena chybu v kodu, bych normalne vubec neosetroval. Myslel jsem spis vyjimecne stavy okolniho prostredi, jako prave selhani disku nebo network timeout.A kdyz nastane chyba pri zpracovani pozadavku, znamena to, ze se shodi cely server na neosetrenou vyjimku?
Tohle mi uprimne receno prijde strasne fragilni, mozna ze by to vetsinou fungovalo, ale nebudu mit jistotu. Pripomina mi to programovani stylem ze neco rychle napisu, zkusim jestli to funguje, pokud ne, neco nahodne zmenim, zkusim zase atd.Javisti chteji mit porad jistotu.
A kdyz nastane chyba pri zpracovani pozadavku, znamena to, ze se shodi cely server na neosetrenou vyjimku?Tady bych pouzil stejny pristup jako v Jave - tenhle typ vyjimek (v Jave RuntimeException) by programator za normalnich okolnosti neosetroval, ale mel by moznost to udelat. Takze napriklad kontejner ve kterem bezi webova sluzba by tyto vyjimky osetroval.
Ale o tom to prece je - takhle by melo programovani vypadat. Akorat tady ti kompilator da zpetnou vazbu, jestli co jsi napsal dava smysl, takze po tom, co se to vyrobi se to da prohlednout na dalsi mozne chyby.Tak v tomhle se vubec neshodneme
Ja vidim statickou analyzu jako diminishing returns.Staticka analyza je u netrivialnich projektu strasne uzitecna, hlavne pri refaktorovani.
Myslel jsem spis vyjimecne stavy okolniho prostredi, jako prave selhani disku nebo network timeout.Jinak me pripada, ze by ani nebyl problem tyto veci automaticky metodicky resit (aspon tedy v jazyce, ktery umi treba makra apod.). Potiz je v tom, ze vetsinou chceme v techto situacich informovat uzivatele, a musime mu smysluplne sdelit, v jakem stavu se program nachazi, a na jakou prekazku v praci narazil. A prave tohle prevadeni do lidske reci je na tom to pracne; protoze to zadny kompilator sam od sebe neudela (protoze nechape relevantni kontext cele situace).
Tomu pred-prekladu moc nerozumim. Mozna bys to mohl trochu rozvest. Znamena to, ze by se ten zdrojovy kod nejak permanentne poznamenal?Nevím, jestli jsem to pochopil správně, ale myslím, že se zdrojovýk kódem by se nic nedělalo, výsledek by byl analogický např. prohnáním zdrojového kódu v C preprocesorem, kde se expandují všechna makra, tedy až na to, že by se převedla všechna jména z relativcních jmenných prostorů na absolutní (podobně jako je kanonizace cesty v souborovém systíému) a otestovala, jestli jsou unikátní v globálnímu jmennému (nad)prostoru zahrbnujícím všechny použité knihovny a "netřískají se" navzájem. Takže vlastně by to bylo něco úplně jiného než expanze maker preprocesorem v C, ale výsledkem by také nejspíš byl nový sobvor, protože mít ve zdrojáku jména všecho v absolutní podobě by nejen nepohodlné, ale vypadalo to hůř než Win32 API na tripu
Na to přece stačí jmenné prostory a zásada, že každý přidává struktury jen do svých jmenných prostorů, jinak riskuje konflikt, ne?
Nepřijde mi, že by v tom byl nějaký problém – v Javě třeba běžně implementuješ cizí rozhraní nebo rozšiřuješ cizí třídy, ale svůj kód dáváš do svých balíčků.
A taky bych rozlišoval balíčky a moduly. Balíčky vytvářejí hierarchii jmenných prostorů, tříd/rozhraní a zajišťují globální jedinečnost. Modul pak může zastřešovat související funkcionalitu z různých jmenných prostorů a od různých autorů.
Já v tom tedy smysl vidím. Ten jmenný prostor má vlastně dvě části: organizaci/autora a produkt/komponentu:
cz.frantovo.…
).Už jen tohle vyžaduje minimálně dvouúrovňovou hierarchii. Jasně, šlo by sice hierarchii formálně nemít, NS by byl jen textový řetězec oficiálně bez vnitřního členění. A pak by se používala nějaká konvence – třeba oddělovat části podtržítkem. Ale pak by to museli dělat všichni stejně a konvenci dodržovat, aby ti např. IDE mohlo ukazovat hezký strom balíčků a neměl jsi to všechno nasypané na jedné hromadě.
A zvlášť, když se vymýšlí nový jazyk, tak by se to mělo udělat pořádně, mít podporu hierarchie rovnou v něm, nějakým standardním způsobem a ne to tam dodatečně dobastlovat pomocí nějaké konvence – to se hodí leda pro legacy prostředí, kde se na to v době návrhu zapomnělo a teď už to tam pořádně dodělat nejde.