Zkušenosti s jazykem D

Re:jazyk D
« Odpověď #30 kdy: 24. 02. 2014, 14:50:02 »
Teď sem narazil na něco divného. Když sem se koukal na přetěžování operátorů v jazyce D, zjistil jsem že přetěžování operátorů new a delete je deprecated. Proboha proč, to si jako nepude napsat vlastní alokátor? Vysvětlení proč u toho nebylo. Taktéž sem někde viděl že scope proměnné budou též zrušeny. Hej, ty se s tím neserou, pro systémové programování je tendle jazyk tím pádem na nic (jo, OS s GC...). Sem trošku zklamaný, začal se mi líbit (x[] += y[] -> jak elegantní). Asi chtěj zabít RAII...
Samozrejme mozes pouzit vlastne allocatory, dokonca budu allocatory priamo v phobose: https://github.com/andralex/phobos/blob/allocator/std/allocator.d

Miesto pretaznia new pouzi emplace: http://dlang.org/phobos/std_conv.html#.emplace

scoped je depracted lebo totozna funkcionalita je v phobose: http://dlang.org/phobos/std_typecons.html#.scoped


Sten

Re:jazyk D
« Odpověď #31 kdy: 24. 02. 2014, 14:56:14 »
GC při zběru paměti freezne všechny vlákna (nevím jak sou na tom jiné GC, ale mám pocit že to de i bez freezu).

Až se váš pocit změní v jistotu tím že najdete implementaci GC která nebude potřebovat "stop the world" neboli zastavení všech vláken tak nám prosím dejte vědět.

Concurrent Garbage Collector

To je sice pěkný název, ale já jsem se ptal na konkrétní implementaci. Ve všech implementacích které měly v názvu slovo concurrent jsem bohužel zatím vždycky našel i fázi která "stop the world" potřebovala, i když obvykle na kratší dobu než implementace které v názvu slovo concurrent neměly.

Tak třeba CGC v .NETu. Pokud v době, kdy ten garbage collector markuje, nepotřebuje vlákno alokovat na haldě, tak se vůbec nezastaví.

Pavel Tisnovsky

Re:jazyk D
« Odpověď #32 kdy: 24. 02. 2014, 15:26:55 »
GC při zběru paměti freezne všechny vlákna (nevím jak sou na tom jiné GC, ale mám pocit že to de i bez freezu).

Až se váš pocit změní v jistotu tím že najdete implementaci GC která nebude potřebovat "stop the world" neboli zastavení všech vláken tak nám prosím dejte vědět.

Concurrent Garbage Collector

To je sice pěkný název, ale já jsem se ptal na konkrétní implementaci. Ve všech implementacích které měly v názvu slovo concurrent jsem bohužel zatím vždycky našel i fázi která "stop the world" potřebovala, i když obvykle na kratší dobu než implementace které v názvu slovo concurrent neměly.

SerialGC, ParallelOldGC, G1 i ted nove Shenandoah - vsechny maji STW chovani, i kdyz o ruzne dobe trvani (ty "lepsi" GC zastavuji jen ve fazi (paralelniho) markingu). Experimentuje se s rozdelenim STW na pozastavovani jednotlivych vlaken aplikace (mutatoru), ale jeste to neni ve stabilni fazi.

Kolemjdoucí

Re:jazyk D
« Odpověď #33 kdy: 24. 02. 2014, 15:44:22 »
Tak třeba CGC v .NETu. Pokud v době, kdy ten garbage collector markuje, nepotřebuje vlákno alokovat na haldě, tak se vůbec nezastaví.

To je pěkný trik o kterém jsem nevěděl. Ale obávám se že to pomůže pouze speciálním aplikacím - pokud po celou dobu markování GC vlákna nepotřebují alokovat na haldě, je vysoká pravděpodobnost že alokací na haldě bude tak málo že GC vlastně nemá moc co dělat. Naopak typické aplikace na haldě alokují, takže je ten CGC v .NETu stejně bude zastavovat. :-(

RAII

Re:Zkušenosti s jazykem D
« Odpověď #34 kdy: 24. 02. 2014, 15:50:58 »
GC GC GC, to je snad ňáká mantra? v OOP není třeba GC (čas se s ním ale zabít dá no). Jo jinak mám další dojmy z Dčka. Slyšel jsem, že D bylo vytvořeno protože C++ je strašné a má strašnou syntaxi. Když se teď hrabu hloubš v D, C++ je proti tomu ráj. Pro příklad volaní konstruktoru a destruktoru:

C++: pointer->~jménoTřídy(); /* ... */
D:     destroy(object) /* Destroy je prosím knihovní funkce ... vnitřně asi používá obj.__dtor() ale fakt nevím, nikde o tom není ani zmínka */
C++: new (memoryChunk) jménoTypu(args);
D:     emplace!jménoTypu(memoryChunk, args) /* Opět knihovní funkce která vnitřně používá ňákej obj.__ctor(args) jež je nezdokumentovanej */

Smutné na tom je, že co by měla pokrývat syntaxe jazyka, pokrývá knihovna. A co by měla pokrývat knihovna pokrývá syntaxe (třeba sort u polí).  Teda když bych chtěl udělat bootloader s C++, nebude to problém, s D si asi budu muset portovat celou knihovnu (která často dělá to co by měly dělat konstrukty jazyka) a odhalit všechny možné nezdokumentované nechutnosti.


Re:Zkušenosti s jazykem D
« Odpověď #35 kdy: 24. 02. 2014, 16:21:20 »
GC GC GC, to je snad ňáká mantra? v OOP není třeba GC (čas se s ním ale zabít dá no). Jo jinak mám další dojmy z Dčka. Slyšel jsem, že D bylo vytvořeno protože C++ je strašné a má strašnou syntaxi. Když se teď hrabu hloubš v D, C++ je proti tomu ráj. Pro příklad volaní konstruktoru a destruktoru:

C++: pointer->~jménoTřídy(); /* ... */
D:     destroy(object) /* Destroy je prosím knihovní funkce ... vnitřně asi používá obj.__dtor() ale fakt nevím, nikde o tom není ani zmínka */
C++: new (memoryChunk) jménoTypu(args);
D:     emplace!jménoTypu(memoryChunk, args) /* Opět knihovní funkce která vnitřně používá ňákej obj.__ctor(args) jež je nezdokumentovanej */

Smutné na tom je, že co by měla pokrývat syntaxe jazyka, pokrývá knihovna. A co by měla pokrývat knihovna pokrývá syntaxe (třeba sort u polí).  Teda když bych chtěl udělat bootloader s C++, nebude to problém, s D si asi budu muset portovat celou knihovnu (která často dělá to co by měly dělat konstrukty jazyka) a odhalit všechny možné nezdokumentované nechutnosti.
Ved emplace/destroy je tu kvoly tomu aby si nemusel manualne volat konstruktory/destruktory cez __ctor, __dtor...
To ze miesto placement new sa pouzie emplace a miest ~Trieda() sa pouzie destroy je len detail.

Co sa tyka sort-u, ten bude tiez deprecated  :D.

Co sa tyka phobosu a alokacii, tak je to znamy problem. Momentalne sa caka na alokatory. Ked budu v phobose tak je v plane pouzit interne mallocator alebo nieco podobne. Dokonca su navrhy na atribut @nogc / @noheap ktore zakazu pre funkcie gc alokacie.

GC je v D hlavne kvoly tomu aby sa dalo v @safe kode garantovat memory safty a implementacia Slice-ov by bola bez GC problematicka.

JSH

Re:Zkušenosti s jazykem D
« Odpověď #36 kdy: 24. 02. 2014, 16:22:19 »
Smutné na tom je, že co by měla pokrývat syntaxe jazyka, pokrývá knihovna. A co by měla pokrývat knihovna pokrývá syntaxe (třeba sort u polí).  Teda když bych chtěl udělat bootloader s C++, nebude to problém, s D si asi budu muset portovat celou knihovnu (která často dělá to co by měly dělat konstrukty jazyka) a odhalit všechny možné nezdokumentované nechutnosti.
To, že konstruktory a destruktory jsou jen funkce se speciálním jménem není žádný problém. V C++ je to to samé, akorát je navrch trocha syntaktického cukru. Akorát jestli to není zdokumentované, tak je to na facku. Stejně tak v principu není třeba mít new a delete jako operátory, ale stačí knihovní funkce, které zavolají alokaci a pak konstruktor. Tyhle knihovní funkce ani není třeba při portování přepisovat, takže jsou podle mě OK prakticky vždycky. Místo přetěžování operátorů se jenom přetíží funkce, nebo ještě líp předá jiný alokátor. Přetěžování new a delete mi přijde jako jedna z nejzatemněnějších částí C++.

Dostalo mě, že D nemá vůbec specifikovaný paměťový model (aspoň podle tutoriálu). Ale prý můžeme předpokládat, že by mohl být podobný modelu C++. Hlavně že mají ve stadardní knihovně kopec vláknových věcí.

RAII

Re:Zkušenosti s jazykem D
« Odpověď #37 kdy: 24. 02. 2014, 19:10:51 »
No, například v dokumentace sem nikdy nenarazil na __ctor(), __dtor() přičemž ty slouží k vyvolání konstruktoru pod referencí na objekt. Zjistil sem to až na fóru, bůh ví kde ty informace berou. Právě proto mne pečou funkce jako emplace, protože když budu dělat něco low level a budu potřebovat obejít GC, nemůžu použít takřka (jo něco jo...) nic z knihovny ale budu si muset udělat takovýhle kraviny sám. Což v případě neexistující dokumentace je na změnu jazyka. Teď se peru s vlastním kontejnerem bez GC paměti (malloc free), odměnou je SIGSEGV, a debuguj šmoulo...

Sten

Re:jazyk D
« Odpověď #38 kdy: 24. 02. 2014, 20:18:28 »
Tak třeba CGC v .NETu. Pokud v době, kdy ten garbage collector markuje, nepotřebuje vlákno alokovat na haldě, tak se vůbec nezastaví.

To je pěkný trik o kterém jsem nevěděl. Ale obávám se že to pomůže pouze speciálním aplikacím - pokud po celou dobu markování GC vlákna nepotřebují alokovat na haldě, je vysoká pravděpodobnost že alokací na haldě bude tak málo že GC vlastně nemá moc co dělat. Naopak typické aplikace na haldě alokují, takže je ten CGC v .NETu stejně bude zastavovat. :-(

Oni tam mají ještě jeden trik. Pro markování je halda rozdělena na tři generace (dočasná, krátkodobá, dlouhodobá). GC pak blokuje alokace, pouze pokud se markuje nultá a první generace, což pro dlouho běžící programy nepředstavuje moc velký problém, protože ty většinou bývají malé s malým množstvím odkazů, takže se markují velmi rychle.

Inkvizitor

Re:Zkušenosti s jazykem D
« Odpověď #39 kdy: 25. 02. 2014, 06:48:15 »
Dotaz trochu off topic: někdo tady tvrdil, že "jazyk D nabírá na síle"; je tomu skutečně tak, že se D podařilo výrazně zvednout popularitu? Já mám pocit, že jazyků, které by mu mohly konkurovat (byť nejsou úplně stejné) je čím dál více, počínaje Go a konče Rustem a o D se moc nikde nepíše...

Pavel Tisnovsky

Re:Zkušenosti s jazykem D
« Odpověď #40 kdy: 25. 02. 2014, 09:47:13 »
Dotaz trochu off topic: někdo tady tvrdil, že "jazyk D nabírá na síle"; je tomu skutečně tak, že se D podařilo výrazně zvednout popularitu? Já mám pocit, že jazyků, které by mu mohly konkurovat (byť nejsou úplně stejné) je čím dál více, počínaje Go a konče Rustem a o D se moc nikde nepíše...

Podle analyzu serveru Ohloh je ten jazyk pro OS projekty zatim vyuzivan minimalne, samozrejme relativne vuci silne trojce C+Java+Python:

https://www.ohloh.net/languages/compare?measure=commits&percent=true&l0=c&l1=java&l2=python&l3=dmd&l5=dmd&commit=Update

I kdyz ma D nektere zajimave vlastnosti (prace s poli je dost luxusni v porovnani s Javou napriklad), tak za tech ~13 let uz ten jazyk mel dost casu se stat popularnejsim - tudiz se (AFAIK) nahrada C jakozto "vysokourovnoveho assembleru" nekona a pro praci s komplexnejsimi aplikacemi je tady rada jinych a uz zavedenych jazyku.

Bla

Re:Zkušenosti s jazykem D
« Odpověď #41 kdy: 25. 02. 2014, 11:08:03 »
I kdyz ma D nektere zajimave vlastnosti (prace s poli je dost luxusni v porovnani s Javou napriklad), tak za tech ~13 let uz ten jazyk mel dost casu se stat popularnejsim - tudiz se (AFAIK) nahrada C jakozto "vysokourovnoveho assembleru" nekona a pro praci s komplexnejsimi aplikacemi je tady rada jinych a uz zavedenych jazyku.

Tak tohle je pravda, když je to dobré, má to obvykle raketový nástup, proč ne jazyk D?
Možná protože není dramaticky lepší než něco z rodiny C (C/C++/C#...)

Rád bych zmínil mrtvy projekt Asyncro, který se taky nechytil a přitom mi připadal docela pěkný.

Int Y dogma {0 to 10}; //Y nemůže mít jinou hodnotu než 0 až 10
Sub Y Int Palce dogma {result:= Master * 2,54;};  //Y.Palce má vždy hodnotu Y*2,54
Int Z is {0 to 10} ow(Exception oOverlimit){Console.Printf("Ahoj");}; //Podobne jako prvni priklad, ale vyhodnoceni provedu sam
Int X1 evaluate {/* vola se pri uplne kazde zmene X */}; //Kdykoliv se X1 zmeni, chci vedet proc
Int X2 evaluate (%DEBUGMODE%) {/* vola se pri uplne kazde zmene X2 */}; //Vyhodnocuje se, jen kdyz se na programu pracuje
->
Y=10;
Y++;
Console.Printf (Y);
10
Console.Printf (Y.Palce);
25,4
Z=10
Z++;
:Ahoj

Ten jazyk nabízel řadu pěkných věcí, které jde udělat i v C# pres GET/SET, ale ten kód mi přišel čitelnější.

Bla

Re:Zkušenosti s jazykem D
« Odpověď #42 kdy: 25. 02. 2014, 11:22:16 »
Syntaxi mám možná špatně, narychlo jsem si jí vycucal z prstu vzpomněl, jak to asi vypadalo.

RAII

Re:Zkušenosti s jazykem D
« Odpověď #43 kdy: 25. 02. 2014, 13:12:41 »
No, teď se pokouším vytvořit vlastní object pool (uskladňuje a alokuje objekty pomocí malloc a free místo vestavěného GC). Teda celkem mordor, funguje ale ... jen díky pomoci na fóru a knihovním funkcím (!!). Z toho mě ale chytá rapl ... když bych chtěl v D dělat něco low level, nemůžu používat std knihovnu když si ji neportuju a právě takový object pool je dobrej jenom když dělám něco low level. D je tak jedině dobrý jako high level lang. Low level nikdy ... pak je to celkem pěknej jazyk. Někdy rychlejší než C++.

Kozzi

Re:Zkušenosti s jazykem D
« Odpověď #44 kdy: 25. 02. 2014, 15:59:15 »
I kdyz ma D nektere zajimave vlastnosti (prace s poli je dost luxusni v porovnani s Javou napriklad), tak za tech ~13 let uz ten jazyk mel dost casu se stat popularnejsim - tudiz se (AFAIK) nahrada C jakozto "vysokourovnoveho assembleru" nekona a pro praci s komplexnejsimi aplikacemi je tady rada jinych a uz zavedenych jazyku.

JJ presne tak. Hlavni problem jazyka D je to ze se primarne mel stat nahradou za jazyky C a C++, bohuzel v oblasti kde se jazyky C a C++ pouzivaji se mu nedari prave kvuli velke zavislosti na GC. Tim padem se zacal vyuzivat spis tam kde se dneska hodne dari jazykum jako je C# nebo Java, se kterymi zase nemuze konkurovat co se tyce rozsireni, existujicich navodu, knihoven, nastroju proste vseho.

Ale co se tyce rozsireni, tak se popravde dostava zase trochu navrchol. Nejvetsi podil na tom ma asi Andrei Alexandrescu. Jinak hodne jazyku D ubraly problemy z dob jazyka D1. Takze co se tyce tech 13let, tak ja bych to spis videl tak na jen na polovina 6-7 let, coz zase neni tak dlouha doba.