Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
MD
Založen: 29. 07. 2007 Příspěvky: 437 Bydliště: Praha
|
Zaslal: 14. květen 2009, 20:39:07 Předmět: Templates, generics a spol. - Jak na ne? |
|
|
Ahoj, premyslim o zapracovani tempatu do sveho jazyka Krkal C.
Presto, ze se obavam, ze to nebude nic jednoducheho, je to vec velmi uzitecna, takze se ji chystam nejakym stylem implementovat. Zatim pripravuju specifikaci a sbiram inspiraci, takze vse je otevreno.
Bude to spise jako template v C++, Makra v C, generic v C# nebo prototyp ve VRML? Kazdy pristup ma sve a kazdy je uplne jinak komplikovany na implementaci. Ja samozrejme pozaduju implementaci co mozna nejjednodussi, ale zda mi staci textova makra, nevim nevim Jeste nevim zda pouziju templaty jen v datovych souborech (ty si predstavte jako xml nebo vrml soubor - tam to potrebuju urcite) a nebo i ve skriptech (kdyz uz bych ty templaty mel, tak proc si nenapsat knihovnu generickych kolekci? )
Jestli me nekam nasmerujete budu moc rad. Setkali jste se s tim nekdo? Znate najakou ctivou literaturu? Pro me je tohle tema celkem slozity, nedokazu si uvedomit vsechny nastrahy. (treba rekurze pri kompilaci...fuj!) _________________ - play with objects - www.krkal.org - |
|
Návrat nahoru |
|
|
nou
Založen: 28. 07. 2007 Příspěvky: 1047
|
Zaslal: 14. květen 2009, 20:58:48 Předmět: |
|
|
akurat som minule narazil na clanok o templatoch v C++. http://ubiety.uwaterloo.ca/~tveldhui/papers/2003/turing.pdf pise sa v nom ze C++ templaty su Turing kompletny a daju sa tam napisat napr ratenie faktorialu uz v dobe kompilacie. _________________ Najjednoduchšie chyby sa najtažšie hľadajú. |
|
Návrat nahoru |
|
|
Marek
Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 15. květen 2009, 00:08:12 Předmět: |
|
|
Rekurzi při kompilaci můžeš po nějaké době utnout.
V C# jsou generika trochu omezenější, na ty kolekce to stačí.
V C++ se šablony dají použít i k zajímavějším věcem, např. ke generování kódu, rozvinutí cyklu, generování obsahu polí za běhu kompilace. Škoda jen, že parametrem šablony mohou být ze základních typů jen celá čísla (int). Kdyby šlo používat stringy, dokážu si představit i generování konečných automatů za běhu kompilace prostým zadaním regexpu do parametru šablony. Také dost pomáhají zamezit redundantnímu kódu, když něco má být hodně rychlé např. pokud máš více podobných variant nějakého algoritmu, není nic jednoduššího než udělat parametr šablony <int Algorithm> a pak používat v kódu if (Algorithm == FASTER_METHOD) ... compiler pak tuto podmínku vyhodnotí během kompilace a vygeneruje optimalizovaný kód zvlášť pro každou použitou sadu parametrů šablon.
Doporučuju si odzkoušet, co všechno C++ umí, a podle toho si vybrat, co bys chtěl implementovat. _________________ AMD Open Source Graphics Driver Developer |
|
Návrat nahoru |
|
|
adragon
Založen: 23. 08. 2007 Příspěvky: 72 Bydliště: Praha
|
Zaslal: 15. květen 2009, 11:08:08 Předmět: |
|
|
Spis bych doporucoval vzit si problemy, ktere bys chtel v Krkalovi pomoci template resit a zkusit si napsat jak by to reseni melo fungovat. Pokud to jde resit i jinak, nebo template neprinese zadny uzitek (vykonove / vetsi vychytani moznych chyb), tak bych od nich upustil. Maly ukolove orientovany jazyk me prijde daleko lepsi, nez nejaky velky zmetek co ma od vseho neco a nic neumi poradne . |
|
Návrat nahoru |
|
|
MD
Založen: 29. 07. 2007 Příspěvky: 437 Bydliště: Praha
|
Zaslal: 15. květen 2009, 13:53:36 Předmět: |
|
|
Ja tyhle veci znam z pohledu uzivatele. A tedy vim, jake vsechny silenosti se pomoci toho daji delat. A prave proto mam husi kuzi z toho, ze bych pro to mel napsat kompilator
Ta uzivatelska znalost bohuzel neni dostatecna na to, abych znal kazdy detail, kazdou mezni situaci, coz je samozrejme pro psani kompilatoru nutnost. Hnusny veci se daji delat i s beznymi makry, natoz s C++ templaty. Zajimave jsou i ty generiky v C# (treba se mi tam povedlo udelat tridu, ktera pracuje s potomkem sebe sama (class DagNode<T> where T : DagNode<T> ))
Takze samozrejme hledam neco jednoducheho, ale uzitecneho, abych dosahl toho co chci, pripadne za malou cenu aby se to dalo hezky zobecnit i na dalsi veci. A taky nechci zavest neco, co by bylo pro uzivatele prilis temne.
Hlavni duvod proc to potrebuju je zamezeni CopyPaste praktik v data fajlech. Nejaky druh DF ma asi kazdy engin. Slouzi na konfiguraci veskerych veci, ktere se nepopisuji primo skripty. Dost casto jsou to xmlka. Hierarchicka struktura je typicka.
Rekneme, ze v DF popisujete nejakou 3D geometrii (neco jako VRML). Geometrii tedy popisete pomoci stromove struktury. V koreni je treba uzel "Scena" a na listech je zakladni geometrie. A po ceste jsou nejruznejsi uzly ktere predstavuji transformace, pridavaji materialy, meni parametry, seskupuji prvky do celku, rozhoduji, ktere prvky se pouziji a ktere ne (treba LOD nobo nejaky druh variability podle zadanych podminek). Tak a tyhle data chci zadavat bez copypastovani. Co s tim?
1) Muhu mit kazdy uzel pojmenovan identifikatorem a pak misto opisovani uzlu pouziju pouze odkaz (treba strom s milionem listu). Nevyhoda je, ze touto jednoduchou technikou uzel pouze duplikuju a nemenim zadny jeho parametr (vsechny listy budou stejne). (Zatim jedina vec, se kterou urcite pocitam)
2) Nektere parametry mohu predavat "globalne". Ve VRML je to transformacni matice. Tady mam uzel Transform, ktery zpusobi ze vsechny deti budou patricne transformovany. Na tohle nepotrebuju templaty, ale musim to podorovat v samotnem systemu. Prima, takze listy na strome uz mam sparvne umistene, ale kdybych chtel menit i jejich barvu, tak mam asi smulu.
3) template - tedy uzel nekde nadefinuju a zvolim, ze ma nekolik konfigurovatelnych parametru: treba Barvu listu
Ale muzou se tim delat i zajimavejsi veci. Predstavte si, ze mate vetev stromu jako template. Tak samozrejme: pripojite ji na nejaky strom a zadate par parametru, treba jak moc huste se vetvi. Jenze vetev ma i potomky, listy a to hned 27 druhu (rekneme 27 ruznych modelu listu). Skupinu listu je treba zadat pro kazdy strom jinou (smrk versus dub). Muzeme to delat po jednom, ale to je nepohodlne. Takze co treba umistit stromy do namespacu:
kód: |
template<int hustotaVetveni> vetev { ... List1, List2, /* vetev pracuje s identifikatory, ktere oznacuji listy */ ...}
namespace Dub {
... implement vetev<5>; // po rozvinuti vetev sama zalozi nebo pouzije identifikatory Dub.List1, Dub.List17, ...
} |
Tak a pro tuto chvili radeji skoncim, jinak mi to odmitnete cist _________________ - play with objects - www.krkal.org - |
|
Návrat nahoru |
|
|
MD
Založen: 29. 07. 2007 Příspěvky: 437 Bydliště: Praha
|
Zaslal: 15. květen 2009, 14:06:08 Předmět: |
|
|
Jeste pro inspiraci upozorneni na rozdily v ruznych implementacich (tach co znam ja )
Jak moc kompiltor templatove predloze rozumi (do jake miry ji analyzuje jeste pred vznikem instance) - Vubec (jen tam pak nahradi par textu) - Makro. Temer na 99% - generiky v C#
Existuji templety i v prelozenem kodu, pracuje s nimi runtime?
Jak ma vznikat instance? Manualne nebo automaticky? Dokaze kompilator sloucit stejne instance z ruznych mist? Dokaze sloucit funkcne stejne instance? (To jsou treba ty, kde T je trida, ale ruzna. I presto ze je to ruzna trida, tak kod je stejny a proto se da pouzit jeden)
Jake zvolit limity pro rekurzi? Muzu ji treba uplne zakazat (Tedy uvnitr templety bude zakazano instanciovat jinou templatu. Bude to vadit nebo ne?)
... _________________ - play with objects - www.krkal.org - |
|
Návrat nahoru |
|
|
frca
Založen: 28. 07. 2007 Příspěvky: 1558
|
Zaslal: 15. květen 2009, 14:13:02 Předmět: |
|
|
MD: Fakt si myslis, ze to nekdo vyuzije? _________________ www.FRANTICWARE.com |
|
Návrat nahoru |
|
|
MD
Založen: 29. 07. 2007 Příspěvky: 437 Bydliště: Praha
|
Zaslal: 15. květen 2009, 14:27:40 Předmět: |
|
|
frca napsal: |
MD: Fakt si myslis, ze to nekdo vyuzije? |
Ja? Pro ty Data Fajly jsou templaty fakt uzitecna vec. Ja tam sice nemam listnaty stromy, ale neco hodne podobnyho. Ted pracuju i s wme a tam je to naprosto stejna situace. Proc mam neustale copypastovat tri-strankovy popis nejake postavicky? A v Krkaolovi: Proc kdyz napisu rozhodovaci pravidlo, jak na sebe bude navazovat kamenna stena (jaky obrazek se nakonec pouzije), proc musim tohle pravidlo kopirovat znovu, kdyz delam jinou stenu?
Ale pokud me nakonec napadne nejake reseni bez tamplatu, tak taky dobry. _________________ - play with objects - www.krkal.org - |
|
Návrat nahoru |
|
|
adragon
Založen: 23. 08. 2007 Příspěvky: 72 Bydliště: Praha
|
Zaslal: 15. květen 2009, 17:46:37 Předmět: |
|
|
MD napsal: |
frca napsal: |
MD: Fakt si myslis, ze to nekdo vyuzije? |
Ja? Pro ty Data Fajly jsou templaty fakt uzitecna vec. Ja tam sice nemam listnaty stromy, ale neco hodne podobnyho. Ted pracuju i s wme a tam je to naprosto stejna situace. Proc mam neustale copypastovat tri-strankovy popis nejake postavicky? A v Krkaolovi: Proc kdyz napisu rozhodovaci pravidlo, jak na sebe bude navazovat kamenna stena (jaky obrazek se nakonec pouzije), proc musim tohle pravidlo kopirovat znovu, kdyz delam jinou stenu?
Ale pokud me nakonec napadne nejake reseni bez tamplatu, tak taky dobry. |
V podstate v tom nevidim moc template, ale spis parametrizovane datove struktury. Template podle me parametrizovany datovy typ a tady v podstate staci parametrizovana instance.
V Javasriptu se podobny problem resi pomoci prototypu, tedy u dubu se stanovi, ze je vytvaren ze Stromu a nastavi se prislusny parametr deleni vetvi. (podobne to ma resene i Lua). Tento system by mel umet nejen doplnovat parametry, ale i je predefinovavat a pripadne rusit.
Osobne bych zvolil toto reseni. Nevyhodu vidim v pomalejsim dotazovani (stejne jako v dynam. jazycich)
Pokud ovsem kompiler prevede vse do jedne datove struktury, tak se zbavis moznosti menit chovani vsech odvozenych objektu za behu. Ale zas by ti stacili jednoducha makra. |
|
Návrat nahoru |
|
|
|