Učit se Javu nebo C++?

gamer

Re:Učit se Javu nebo C++?
« Odpověď #75 kdy: 05. 08. 2013, 18:41:11 »
C++ má interfacy, i když se jim tak ve standardu neříká.

Java dělá všude dynamic_cast, právě z tohoto důvodu.

To, že se dají v C++ interface nějak udělat, ještě neznamená, že C++ má interface :). Co mi brání v C++ v nějaké třídě IInterface implementovat nějakou metodu? Vůbec nic, úplně v klidu se to přeloží, bude se to jmenovat interface, ale nebude to interface. Podporu interface si představuju tak, že mi překladač řekne "implementace metody do interface opravdu nepatří".

static_cast v javě chybí hlavně z toho důvodu, že to není typově bezpečné a tvůrci javy si řekly (asi zcela správně) "nebudeme dávat těm neschopným programátorům do ruky nic nebezpečného"


JSH

Re:Učit se Javu nebo C++?
« Odpověď #76 kdy: 05. 08. 2013, 21:48:53 »
To, že se dají v C++ interface nějak udělat, ještě neznamená, že C++ má interface :). Co mi brání v C++ v nějaké třídě IInterface implementovat nějakou metodu? Vůbec nic, úplně v klidu se to přeloží, bude se to jmenovat interface, ale nebude to interface. Podporu interface si představuju tak, že mi překladač řekne "implementace metody do interface opravdu nepatří".
A je nějaký důvod, mimo jazykového fanatismu, proč by některé metody interface nemohly mít nějakou základní implementaci? Například sémantika nějaké metody je definovaná čistě pomocí jiných metod.
static_cast v javě chybí hlavně z toho důvodu, že to není typově bezpečné a tvůrci javy si řekly (asi zcela správně) "nebudeme dávat těm neschopným programátorům do ruky nic nebezpečného"
static_cast moc nebezpečný není. Naopak je to označení pro relativně bezpečná přetypování jako z potomka na předka. To může překladač zkontrolovat a nemusí se to ověřovat za běhu dynamic_castem. Asi si to pleteš s reinterpret_cast, který dovolí úplně všechno a z toho důvodu se používá docela málo.
BTW : Neschopný programátor je schopný zneužít nezneužitelné a zničit nezničitelné.

Waseihou

Re:Učit se Javu nebo C++?
« Odpověď #77 kdy: 05. 08. 2013, 22:31:58 »
Jednou z nevýhod interface v C++ mohou být problémy s binární kompatibilitou. Už jenom přidání členské proměnné může být problém, a přidání virtuální metody může být nemožné - zvláště pak pokud zákazník nechce ani slyšet o tom, že by se všechny dll soubory měly přepsat, protože s tím má špatnou zkušenost, třeba proto že měl staré verze dll knihoven a s novými se mu dostanou i změny které nechtěl.

Ale dokonce i při absenci těchto problémů nabízí C++ veselé problémy. Třeba při vícenásobné dědičnosti pokud se někdo v potomku pokusí předefinovat metodu která nebyla přiděděna v base line (tudíž první děděná třída ve vícenásobné dědičnost, ta nejvíce vlevo) tak tím změní tabulku virtuálních metod potomka. Pokud něco z něj dědí, tak je třeba to všechno překompilovat, což mohou být desítky až stovky dll knihoven. Tohle se málo ví, že při použití vícenásobné dědičnosti je nejlepší všechny zděděné metody předefinovat aby byly v base-line a šly v potomku předefinovat.

AAA.DLL:

class IFace1{
  virtual void method0() { }
 
  virtual void method1() = 0;
};

class IFace2{
    virtual void method2() = 0;

    virtual void method3() {

  }
};

class CBaseObject : public IFace1, public IFace 2 {
  void method1() {}
  void method2() {}
};

BBB.DLL

class MyReusableComponent : public CBaseObject {

  // předefinovat method0 je ok, protože je v base-line hierarchie dědičnosti
  virtual void method0() {
    ///....
  }

// předefinování method3 po té co bylo zkompilováno AAA.DLL, BBB.DLL a CCC.DLL
  // poruší tabulku virtuálních metod v CCC.DLL objektu MyObject, i když method3
  // už byla definována v předkovi CBaseObject...

  // souborů jako CCC.DLL je několik set a proces vyžaduje otestování celé oblasti
  // závislé na daném DLL, tudíž retestování celé aplikace, a na takový testing nejsou prostředky...
  //
  // moudrý ten, kdo neopoměl přidat dummy metodu do base line...  málokdo to zná
   void method3 () { CBaseObject::method3(); }
};

CCC.DLL

class MyObject : public MyReusableComponent {
  // ....
};

noef

  • *****
  • 897
    • Zobrazit profil
    • E-mail
Re:Učit se Javu nebo C++?
« Odpověď #78 kdy: 05. 08. 2013, 22:33:40 »
..ani v jave, ani v pythone, ani v ruby...vlastne, kde inde *je*?

Vícenásobná dědičnost je v Javě 8 (až tedy vyjde), Scale i Ruby. Diamond není problém, pokud se to navrhne dobře.

V Javě 8 to vyřešili jednoduše tak, že v interfacech stále nesmí být fieldy a v případě kolize metod je třeba explicitně říct, kterou ze zděděných implementací chci.

Scala má naproti tomu jasnou specifikaci pořadí přimixování traitů, takže trait díky tomu umí v podstatě všechno co abstraktní třída (fieldy, protected dědičnost), jenom mu chybí kontruktor.

V pripade Javy a Scaly (Ruby neznam) to ale neni vicenasobna dedicnost. wiki:
Citace
Multiple inheritance is a feature of some object-oriented computer programming languages in which a class can inherit characteristics and features from more than one superclass.
Trait ani interface neni trida.
Citace
Alternate methods of object composition not based on inheritance such as mixins and traits have also been proposed to address the ambiguity.
Citace
Mixins encourage code reuse and avoid well-known pathologies associated with multiple inheritance.
Citace
In object-oriented programming languages, a mixin is a class which contains a combination of methods from other classes. How such combination is done depends on language, but it is not by inheritance.

Natix

Re:Učit se Javu nebo C++?
« Odpověď #79 kdy: 05. 08. 2013, 23:33:22 »
..ani v jave, ani v pythone, ani v ruby...vlastne, kde inde *je*?

Vícenásobná dědičnost je v Javě 8 (až tedy vyjde), Scale i Ruby. Diamond není problém, pokud se to navrhne dobře.

V Javě 8 to vyřešili jednoduše tak, že v interfacech stále nesmí být fieldy a v případě kolize metod je třeba explicitně říct, kterou ze zděděných implementací chci.

Scala má naproti tomu jasnou specifikaci pořadí přimixování traitů, takže trait díky tomu umí v podstatě všechno co abstraktní třída (fieldy, protected dědičnost), jenom mu chybí kontruktor.

V pripade Javy a Scaly (Ruby neznam) to ale neni vicenasobna dedicnost. wiki:
Citace
Multiple inheritance is a feature of some object-oriented computer programming languages in which a class can inherit characteristics and features from more than one superclass.
Trait ani interface neni trida ...

To je ale jenom slovíčkaření. "Vícenásobná dědičnost" nemusí nutně znamenat, že dědím z více tříd. Můžu mít třeba pouze vícenásobnou typovou dědičnost (= klasické javovské interfacy). Traity, mixiny a spol. sice nejsou plnohodnotné třídy, ale to v zásadě nevadí, protože přece dědím typ (u dynamického Ruby tedy ne) i implementaci. A to většinou fakt stačí.

Scala jde u traitů tak daleko, že opravdu to jsou téměř plnohodnotné abstraktní třídy, pouze bez konstruktoru. Lze v nich definovat fieldy, abstraktní metody, konkrétní metody, dokonce lze i vynutit, že třída implementující daný trait musí zároveň být podtypem třídy XY. V podstatě 90% abstraktních tříd lze nahradit traitem. Kupříkladu scalovské collection API (které je ještě rozsáhlejší než Javovské) je implementováno hromadou traitů a jenom pár abstraktními a konkrétními třídami. To že se trait formálně nedá nazvat třídou, je ve výsledku jedno.



gamer

Re:Učit se Javu nebo C++?
« Odpověď #80 kdy: 05. 08. 2013, 23:41:36 »
A je nějaký důvod, mimo jazykového fanatismu, proč by některé metody interface nemohly mít nějakou základní implementaci? Například sémantika nějaké metody je definovaná čistě pomocí jiných metod.
Když to bude mít implementaci, tak už to není interface  ;)

static_cast moc nebezpečný není.
Kód: [Vybrat]
#include <algorithm>

class Base
{
};

class DerivedInt : public Base
{
public:
    void init()
    {
        a = 0;
    }

private:
    int a;
};

class DerivedArray : public Base
{
public:
    void init()
    {
        std::fill(array, array + sizeof(array) / sizeof(char), 0);
    }

private:
    char array[65536];
};

int main()
{
    Base* base = new DerivedInt;
    DerivedArray* derived = static_cast<DerivedArray*>(base);
    derived->init();
    delete base;
    return 0;
}
Ukázkový přepis paměti:
Kód: [Vybrat]
g++ -Wall main.cc
./a.out
*** glibc detected *** ./a.out: free(): invalid next size (fast): 0x0000000002194010 ***
======= Backtrace: =========
/lib/libc.so.6(+0x71e16)[0x7f359d27fe16]
/lib/libc.so.6(cfree+0x6c)[0x7f359d284b8c]
./a.out[0x40066a]
/lib/libc.so.6(__libc_start_main+0xfd)[0x7f359d22cc8d]
./a.out[0x400579]
Neúspěšně ukončen (SIGABRT)

noef

  • *****
  • 897
    • Zobrazit profil
    • E-mail
Re:Učit se Javu nebo C++?
« Odpověď #81 kdy: 06. 08. 2013, 10:29:03 »
..ani v jave, ani v pythone, ani v ruby...vlastne, kde inde *je*?

Vícenásobná dědičnost je v Javě 8 (až tedy vyjde), Scale i Ruby. Diamond není problém, pokud se to navrhne dobře.

V Javě 8 to vyřešili jednoduše tak, že v interfacech stále nesmí být fieldy a v případě kolize metod je třeba explicitně říct, kterou ze zděděných implementací chci.

Scala má naproti tomu jasnou specifikaci pořadí přimixování traitů, takže trait díky tomu umí v podstatě všechno co abstraktní třída (fieldy, protected dědičnost), jenom mu chybí kontruktor.

V pripade Javy a Scaly (Ruby neznam) to ale neni vicenasobna dedicnost. wiki:
Citace
Multiple inheritance is a feature of some object-oriented computer programming languages in which a class can inherit characteristics and features from more than one superclass.
Trait ani interface neni trida ...

To je ale jenom slovíčkaření. "Vícenásobná dědičnost" nemusí nutně znamenat, že dědím z více tříd. Můžu mít třeba pouze vícenásobnou typovou dědičnost (= klasické javovské interfacy). Traity, mixiny a spol. sice nejsou plnohodnotné třídy, ale to v zásadě nevadí, protože přece dědím typ (u dynamického Ruby tedy ne) i implementaci. A to většinou fakt stačí.

To je o spravnem pouzivani pojmu. Interface, trait, mixin - ty vsechny vznikly jako alternativy k vicenasobne dedicnosti (nejbezneji pouzivane v kontextu s tridami). Nazyvat trait vicenasobnou dedicnosti, kdyz vznikl proto, aby naopak neprebral negativni rysy vicenasobne dedicnosti mi prijde divne. Motorce taky nerikame auto, prestoze resi stejny problem. Stejne tak se mi nelibi, ze Java bude mit "interface" s implementaci (ale neprekvapuje me to, je to podobne doprasene jako generika - proste za kazdou cenu zachovat zpetnou kompatibilitu, i za cenu nesmyslu ci neefektivity).

PS: Ja nerikam, ze nelze dosahnout stejnych/podobnych vysledku pomoci traitu/mixinu/interfacu (napr. traity [a s tim spojene mixiny] ze Scaly se mi velmi libi). Jen zduraznuji, ze interface, trait ani mixin nejsou vicenasobna dedicnost, prestoze vysledek muze byt ekvivaletni.

Radek Miček

Re:Učit se Javu nebo C++?
« Odpověď #82 kdy: 06. 08. 2013, 11:08:20 »
Citace
To je o spravnem pouzivani pojmu.

S tím souhlasím. Abyste pojmy mohl správně používat, tak musíte vědět, co znamenají. A to je kámen úrazu. Podívejte se třeba na článek o dědičnosti na Wikipedii. Jak je tam dědičnost definována? Nijak, je to jen takové tlachání okolo.

JSH

Re:Učit se Javu nebo C++?
« Odpověď #83 kdy: 06. 08. 2013, 11:32:00 »
Když to bude mít implementaci, tak už to není interface  ;)
Psal jsem mimo jazykového fanatismu. No nic... Aspoň Waseihou poslal rozumnou odpověď.

noef

  • *****
  • 897
    • Zobrazit profil
    • E-mail
Re:Učit se Javu nebo C++?
« Odpověď #84 kdy: 06. 08. 2013, 11:43:22 »
Vychazel jsem ze specifictejsich clanku - Mixin a Trait, tam je pomerne jasne receno, ze mixin nevznika dedenim (takze nemuze jit o vicenasobnou dedicnost) a trait je mnozina metod, ktera umoznuje znovupouzivani kodu bez vicenasobne dedicnosti.

Bohuzel je pravda, ze se to asi hodne casto nepresne pouziva (i primo na wiki nektere vety pusobi sporne). Napr. o Scale jsem videl hodne clanku, ktere popisuji jak implementovala vicenasobnou dedicnost. Pritom na ofic strankach maji jasne:
Citace
"Classes are extended by subclassing and a flexible mixin-based composition mechanism as a clean replacement for multiple inheritance."

Když to bude mít implementaci, tak už to není interface  ;)
Psal jsem mimo jazykového fanatismu. No nic... Aspoň Waseihou poslal rozumnou odpověď.
Kdyz muzeme mit interface s implementaci, tak proc nezacit pouzivat pro konstantu pojem promenna? Meli ten interface prejmenovat, takhle to bude hodne matouci.

Traktorista

Re:Učit se Javu nebo C++?
« Odpověď #85 kdy: 07. 08. 2013, 23:22:25 »
Javu rozhodně ne.

C++ 0x11 a 0x14 http://en.wikipedia.org/wiki/C%2B%2B14.
Hlavně na začátku jazyk používat. Pak:
  • pořádně, ale opravdu pořádně, se naučit STL a boost.
  • Vykašlat se na ukazatele
  • Naučit se stack unwinding
  • Podívej se v jakém jazyku se dá psát pro iOS, Android, Windows, Linux, BSD.
  • Nešťourat moc do šablon (používat ano, vytvářet minimálně).
  • Naučit se RAII

JS

Re:Učit se Javu nebo C++?
« Odpověď #86 kdy: 08. 08. 2013, 06:47:24 »
C++ 0x11 a 0x14 http://en.wikipedia.org/wiki/C%2B%2B14.
Hlavně na začátku jazyk používat. Pak:
  • pořádně, ale opravdu pořádně, se naučit STL a boost.
  • Vykašlat se na ukazatele
  • Naučit se stack unwinding
  • Podívej se v jakém jazyku se dá psát pro iOS, Android, Windows, Linux, BSD.
  • Nešťourat moc do šablon (používat ano, vytvářet minimálně).
  • Naučit se RAII

Dobry napad! Ale narazi na fatalni prakticky problem - z ceho se to naucit? Ja mam doma Stroustrupa, 3. vydani (kde je skoro C++ 0x11) a STL od Josuttise. Presto pochybuji, ze tyhle 2 knizky uci vsechno, co popisujes.

Jakou knizku (nebo prinejmensim dobre napsany zdrojovy kod ke studiu) bys tedy doporucil, co tohle vsechno uci? Pochybuji, ze zacatecnik bude postupovat tak, ze si nejdriv precte specifikaci.. Stejne tak lze tezko ocekavat, ze bude nejakym zpusobem "syntetizovat" protichudne informace z vicero ucebnic (ruznych stylu).

Rad bych se mylil, ale obavam se, ze takto v soucasnosti neni mozne zacatecniky C++ ucit, protoze neni jak a kde. Myslim, ze lide zkratka nemaji dost zkusenosti na to napsat knihu pro zacatecniky v tomto stylu.

A pak taky prichazi otazka, pokud se nekdo tohle nauci, jestli bude opravdu "umet" C++. Bude schopen pouzivat Qt (coz povazuji za jednu ze zasadnich vyhod C++ ekosystemu)? Bude schopen pracovat na "legacy" C++ projektu?

omg

Re:Učit se Javu nebo C++?
« Odpověď #87 kdy: 08. 08. 2013, 08:48:11 »
Také si myslím, že nikdo neudělá chybu, když si dá epizodu třeba s čistým C a ASM na nějakém jednochipu. Zjistíte, jak funguje procesor a jak řešit problém s velmi omezenými zdroji.

To su len zbozne priania nedocenenych ludi, ktori sa ucili programovat v 80tych rokoch.
Moorovo pravidlo prestalo platit. S tim prijde i vetsi duraz na neco... ted je otazka na co. Jestli reziji JVM nebo algoritmu. Nebo se to bude resit hrubou silou jako doposud vse v komercni sfere. Tedy hrubou silou velkych poctu (ARM).

omg

Re:Učit se Javu nebo C++?
« Odpověď #88 kdy: 08. 08. 2013, 09:12:21 »
Citace
To je o spravnem pouzivani pojmu.

S tím souhlasím. Abyste pojmy mohl správně používat, tak musíte vědět, co znamenají. A to je kámen úrazu. Podívejte se třeba na článek o dědičnosti na Wikipedii. Jak je tam dědičnost definována? Nijak, je to jen takové tlachání okolo.

Kamen urazu je v tom, ze zaklad nazvoslovi vznikal v dobe, kdy kazdy programator vedel jak kompilator interne reprezentuje to co zrovna napise. A kazdy programator tak premyslel v podstate v C/ASM/Fortranu a spol. A dnes? Staci se podivat na vybrane casti velkych projektu treba kernelu. Je to v C, ale chova se to jako objektovy jazyk. A aby nedochazelo k nesmyslum v obfuskovanem a obcas i mezi vybranymi jazyky nekomatibilnim koliznim nazvoslovi, tak kazdy explicitne vidi jak to funguje. Tech 40 radek co by schoval kompilator do svych utrob a zavedl kvuli tomu 5 novych klicovych slov a 15 validnich vyrazovych spojeni do kterych je lze usporadat. Nez si projit timto obfuskacnim peklem, ktere hazi klacky pod nohy a pri kazde razantnejsi zmene prostredku prepisovat narazove kusy kodu jen pro overeni, ze jiny pristup bude fungovat lepe tak se vyuzije moznosti sahnout do obnazenych vnitrnosti, ktere nikdo neschovava. Ano je to reznicina, ale spickova.

JS

Re:Učit se Javu nebo C++?
« Odpověď #89 kdy: 08. 08. 2013, 09:35:58 »
Moorovo pravidlo prestalo platit.

Jsi si jisty? Existuji dva duvody, proc si ja jisty nejsem:

  • Stale jsme se nedostali na uroven lidskeho mozku, co se tyce pomeru spotreby a vypocetniho vykonu nebo pameti. Samozrejme, mozek funguje dobre jen na neco, ale tohle stale znamena, ze je patrne jeste mozne inovovat pocitacovou architekturu (a neurony jsou  v realu obrovske, ve srovnani s mikrocipy).
  • http://www.youtube.com/watch?v=QGw-cy0ylCc