Perl 6 - the future is here, just unevenly distributed

IRC log for #divine, 2017-03-18

| Channels | #divine index | Today | | Search | Google Search | Plain-Text | summary

All times shown according to UTC.

Time Nick Message
02:49 ilbot3 joined #divine
02:49 Topic for #divine is now DIVINE | http://divine.fi.muni.cz | http://irclog.perlgeek.de/divine/
18:50 yaqwsx mornfall: Podařilo se ti včera vymyslet něco spásného?
18:56 mornfall yaqwsx: spásného asi ne
18:57 yaqwsx mornfall: Tak i s nespásným sem!
18:57 mornfall chvíli jsem uvažoval jestli by nebylo jednodušší to spáchat virtuálníma metodama
18:58 yaqwsx Neříkali jsme tak dva týdny zpátky, že by to na horké cestě nemusel být nejlepší nápad?
18:59 mornfall říkali
18:59 mornfall problém je, že wrappery jsou podobnej problém
18:59 mornfall a inliner divinu docela škodí
18:59 mornfall teda inliner obecně, v tomto případě by spíš asi pomohl
19:00 mornfall občas je to těžký uhodnout
19:00 yaqwsx Pokud se to bude generovat, asi není problém vyzkoušet obě varianty.
19:01 mornfall nicméně pokud se držíme verze kde jeden wrapper 'rozbalí' stav a druhej 'rozbalí' va_list, tak body 7-9 můžou přijít do jednoho .cpp a potřebujou jen ten seznam (komponenta, jméno) jak jsme říkali
19:01 mornfall bod 6 jde řešit třeba bitem v errno nebo podobným mechanismem
19:03 yaqwsx Takže Perlem posbírat syscally, nagenerovat "syscall.def" na steroidech a z toho preprocesorem poskládat jednotlivé kousky?
19:03 mornfall nebo ještě jinak, pokud má existovat nějaký globální seznam syscallů, tak asi může existovat na jednom místě a nemusí se generovat, a od 5 dál jde všechno generovat preprocesorem
19:04 mornfall no, spíš na dietě než na steroidech
19:04 yaqwsx 6 bych řešil jako int __PDCLIB_syscall __PDCLIB_reschedule open( int fd );
19:05 mornfall reschedule nemůže být v pdclibu, ne? to nedává smysl
19:05 mornfall to je kernel-side věc
19:05 yaqwsx Dobře, tak to bude __DiOS_reschedule, ale bude to stejný mechanismus jako __PDCLIB_syscall.
19:06 mornfall ale musí to být v definici komponenty, ne libc wrapperu
19:08 yaqwsx Doteď to tam nebylo... I když je asi rozumnější, aby to to implementace mohla přímo vracet a zbavit se té tablky.
19:08 mornfall něco jako SYSCALL( int, open )( const char *path ) RESCHEDULE;
19:09 mornfall které se rozbalí na void __unwrap_open( ... ); int open( const char *path );
19:09 mornfall (pro účely překladu té hlavičky)
19:10 mornfall nevýhoda je, že perl musí nějak vykoumat jméno třídy ve který je ten SYSCALL(...) zavřený
19:10 yaqwsx Anebo 4) bude mít protyp int VFS::open( int& err, bool& reschedule, int fd )
19:10 yaqwsx Přijde mi jako celkem rovonocené, jestli sahám do tabulky, nebo tu hodnotu vyrobím při volání funkce.
19:11 mornfall žel není, pokud je ta tabulka statická tak to překladač přeloží na konstantu
19:11 yaqwsx Tabulka je statická, ale stejně to rozhodnutí neudělá staticky, ne?
19:12 mornfall vlastně asi ne
19:13 mornfall to by šlo kdyby ten kód co je teď v handle byl nagenerovaný v každým syscallu
19:14 mornfall a tam by to šlo nakonec nagenerovat explicitně bez ifu
19:15 yaqwsx Má to cenu dělat? Ani mi to nepřijde jako extra špinavé - tím, že se to generuje není riziko toho, že to někdo špatně implementuje.
19:15 mornfall on to nakonec může mít jako návratovou hodnotu, teď tam je void
19:17 yaqwsx A tím by se vlastně vyřešilo i EAGAIN
19:19 mornfall přiklonil bych se ale k verzi, kde existuje globální seznam (komponenta, jméno) v syscall.def, tím se aspoň získá nějaká statická kontrola toho že to je celkově konzistentní
19:19 mornfall (tzn. že lze prohlásit za chybu, když komponenta obsahuje syscall který není v globální tabulce)
19:20 mornfall (a taky lze jednoduše doplnit 'component bar is disabled, syscall foo not available' jako defaultní implementace syscallů)
19:21 yaqwsx Tzn chceš, aby Perl script prošustroval i hlavičky komponent a kontroloval, jestli byly někde definované jako syscall?
19:21 mornfall to co tam nemusí být jsou parametry, a zmizí tedy aj balast kolem SYSCALL[1-N]
19:21 mornfall ne, jen když se generuje __unwrap_foo() pro danou komponentu, aby se kontrolovalo ze to foo je v syscall.def
19:22 yaqwsx Zhruba tak nějak jsem to myslel.
19:23 mornfall tabulka jako taková se mění relativně málo často, i když možná trochu víc než prototypy v unistd.h a podobně
19:24 yaqwsx Moment - takže chceš zachovat jak syscall.def, tak i značkování syscallů v PDClibu?
19:25 mornfall ideálně asi jo, byl bych radši kdyby to co se #includuje fungovalo bez generovaných souborů
19:25 mornfall protože syscall.def by neobsahoval typy, ty se musí vzít z unistd.h
19:25 mornfall (takže tam musí být označené)
19:26 yaqwsx Tak nějak nevidím výhodu ručně napsaného syscall.def
19:26 mornfall výhoda je v tom, že můžu udělat checkout libc a vesele #includovat
19:27 mornfall když je syscall.def generované, musím to prvně přeložit, i když mám libc.a
19:28 yaqwsx Žádná z generovaných věcí ale nesahá na veřejné hlavičky.
19:28 mornfall syscall.def musíš includovat v syscall.h, jinak nemáš _SYS_foo (čísla)
19:29 mornfall nebo musíš ručně vyrobit to číslování
19:32 mornfall je teda otázka jestli je chceme, ale syscall(2) je věc která existuje a ty symbolický konstanty víceméně vyžaduje
19:35 mornfall nebo kompromisně, tohle se docela taky dělá -- mít skript který syscall.def generuje, ale pouštět ho ručně jen když se přidá nový syscall a syscall.def normálně držet v repu
19:35 mornfall (s varováním že je generovaný)
19:35 mornfall 4  * System call numbers.
19:35 mornfall 6  * DO NOT EDIT-- this file is automatically generated.
19:36 mornfall 7  * created from;        OpenBSD: syscalls.master,v 1.173 2016/06/27 16:50:07 jsing Exp
19:37 mornfall a syscalls.master vypadá nějak takto
19:37 mornfall 115 43      STD NOLOCK      { gid_t sys_getegid(void); }
19:37 mornfall (115 je číslo řádku, 43 číslo syscallu)
19:38 yaqwsx "/* Generated at libc build time from kernel syscall list.  */"
19:39 mornfall no, glibc
19:40 yaqwsx jj
19:42 yaqwsx Stále se mi nezdá, že by byl problém ten soubor generovat, že by to byla nějaká otrava nebo komplikace.
19:42 mornfall to jde přeložit aj nad hurdem :)
19:44 yaqwsx Huh, teď se nechytám.
19:44 mornfall musl má v repu syscall.h.in kde jsou ty čísla natvrdo napsaný
19:45 mornfall yaqwsx: glibc, musí jít přeložit aj nad hurdem, tak musí ty čísla syscallů zjistit nějak při konfiguraci/buildu
19:45 mornfall 'portable libc'
19:45 yaqwsx Ah, takhle. Ok, už se chytám.
19:47 mornfall systém glibc kde kvůli každé blbosti musím otevírat sekvenci hlaviček foo.h → sys/foo.h → arch/foo.h → bits/foo.h abych zjistil že to poslední není v repu ale někde se to vygeneruje ♥ :p
19:47 mornfall lidi chcou zdrojáky (zejména hlavičky) občas aj číst
19:47 yaqwsx :D Osobně moc nechápu, proč to tak je...
19:50 mornfall na linuxu je vždycky mega zmatek jestli je něco hlavička co přišla od kernelu nebo od libc
19:52 mornfall když se podíváš třeba do toho syscall.h z glibc, tak si všimneš ze tam actually žádný čísla nejsou, jen #define z SYS_foo na __NR_foo
19:52 mornfall to __NR_foo přijde z nějaký kernelový hlavičky, asi
19:53 mornfall (která žije v /usr/include/asm, protože proč ne)
20:01 yaqwsx mornfall: Nevím, jak to děláš, ale začínám si myslet, že ručně psané syscall.def je vlastně i dobrý nápad!
20:05 mornfall yaqwsx: přidávám fluor do pitné vody :p
20:07 yaqwsx Asi už začínám mít představu, zkusím něco spáchat.
20:09 yaqwsx Tak takovou odpověď jsem nečekal... Čekal jsem když tak něco jako veganské superschopnosti...
20:11 mornfall jinej film :-)
20:22 mornfall jen mě furt trochu straší struktura procesu, kam bude přispívat aj VFS aj Scheduler
20:22 yaqwsx Co mi uniká?
20:22 mornfall struct Process asi bude muset být součást konfigurace
20:22 mornfall tabulka filedeskriptorů možná?
20:22 mornfall (na to se lehce zapomene)
20:22 yaqwsx Neřeší to "process-aware" VFS?
20:23 mornfall je teda pravda že to jde řešit tak, že VFS bude mít mapu z pid-u na deskriptory
20:23 mornfall ono nakonec VFS stejně musí dostat echo že proces skončil a tak
20:23 mornfall (aby mohlo zavřít soubory a podobně)
20:24 mornfall ale jak si bude povídat scheduler s vfs nevím
20:31 yaqwsx Co kdyby scheduler a případně i ostatní komponenty podporovali registrací callbaků pro události?
20:32 mornfall vždy je tu možnost to teď neřešit a počkat s čím přijde blurry ;-)
20:33 mornfall callbacky budou asi dost bolet
20:34 yaqwsx V čem? Vždyť události jako proces umřel apod. nebudou moc frekventované.
20:36 mornfall v komplikovanosti kódu -- ke každé události bude muset být tabulka zaregistrovaných věcí, každá musí být něco jako std::function...
20:36 yaqwsx Ano, tak si vytvořit strutkuru pro událost a ta bude mít metodu fire...
20:36 mornfall virtuální, počítám :-)
20:37 yaqwsx tak std::function se asi nevyhneš (nebo něčemu podobnému)
20:37 mornfall ale jo, v princpu to všechno jde, jen s tím je spousta programování
20:38 yaqwsx Dobře, necháme to na blurry
20:43 mornfall hmm
20:43 mornfall kdyby ale Context nebyl tuple věcí ale tuple ukazatelů na věci
20:43 yaqwsx ...což je.
20:43 mornfall tak ty věci můžou celej ten context dostat jako šablonovej parametr
20:43 mornfall dokonce
20:44 mornfall a pak už to je skoro zadarmo
20:44 yaqwsx Resp. některé věci momentálně nejsou, ale to se dá vyřešit.
20:45 mornfall jo, to jak je to v standard.hpp to asi může klidně být
20:45 yaqwsx mornfall: Na tom se mi nelíbí, že komponenty si pak tahají závislosti... Tak jak je to teď (s tím generovným kódem), tak každá komponenta je hezky izolovaná.
20:46 mornfall yaqwsx: no, hezky... jen pak si spolu nemůžou vůbec povídat
20:47 mornfall ona tam ta závislost stejně je, a navíc je cyklická
20:48 mornfall kdyby nebyla tak to mohlo být parametrizovaný jako stromeček
20:48 mornfall (tzn. každá komponenta by svoje podkomponenty brala jako šablonový parametry a držela by si je jako složky, nebo vlastněný ukazatele, as appropriate)
20:53 mornfall hmm, ono možná stačí aby to byl DAG, pak to jde seskládat v topologickým pořadí jako C1< C2< C3< C4< End > > > > a každá komponenta vidí všechny pod sebou, jen by to muselo mít nějaký chytrý selektory
20:56 mornfall (a kdyby komponenta byla template< typename Next > C : Next { ... } tak ani nemusí mít selektory, stačí mít disjunktní množiny metod)
20:56 mornfall neříkám že to tak máš dělat, jen tak nahlas uvažuju
21:01 mornfall pokud tam je nějakej cyklus (a není jich moc), tak se musí ta zpětná hrana řešit metodou typu template< typename Self > void metoda( Self &, ... ) a volat jako this->metoda( *this, ... )
21:04 yaqwsx Tohle je hezké!
21:11 mornfall dokonce by pak mělo fungovat struct End { struct Process {}; }; template< typename Next > struct Scheduler : Next { struct Process : Next::Process { int pid; }; };

| Channels | #divine index | Today | | Search | Google Search | Plain-Text | summary