Porovnanie C# vs. C++

Michal Čižmár  /  17. 11. 2004, 00:00

Tento článok je stále ešte len uvodný k seriálu Programujeme v jazyku C#. Je vhodný hlavne pre programátorov v jazyku C++ ktorí stále nevedia, že na určité veci je oveľa vhodnejší jazyk C# .

C# a .NET je výtvor spoločnosti Microsoft. Veľmi dôležité je vedieť že kompilátor C# je voľne dostupný, existuje prostredie (link v minulom článku) kde môžete písať open source programy v tomto jazyku a zdrojáky .NET dal Microsoft vývojárom rôznych Linuxov, aby ho tam implementovali (myslím si , že je to dobrý ťah).

Existuje aj veľmi podobné riešenie od spoločnosti SUN , t.j. programovací jazyk Java a Java Virtual Machine. V Jave som nič zložité neprogramoval (skončil som u programu typu client – server). Nebudem tu porovnávať C# vs. Java. Prezradím len, že ide o veľmi podobne jazyky (obidva vychádzajú hlavne z C++). Pretože C# vznikol neskôr ako Java, poučil sa aj z jej chýb. Obidva tieto jazyky sa stále vylepšujú a myslím si, že konečné rozšírenie závisí aj od marketingových ťahov ich rodičovských spoločností.

Trochu musím spomenúť aj Visual Basic, pretože Microsoft hovorí, že jazyk C# sa snaží o spojenie sily C++ a jednoduchosti Visual Basicu. (Pre tých čo robia vo VB prezradím, že C# prevzal príkaz foreach.) Počul som už nadávať programátora v C++, že určité (teda niektoré) veci čo on urobí v C++ , urobí iný (tak isto dobrý) programátor vo VB za polovicu času . Nehovorím , že VB je lepší, ale má zopár dobrých nápadov.

Rozdiel z hľadiska implementácie premenných a objektov:

C++ môže vytvárať inštancie dátových typov (premenné, objekty) v zásobníku .
(pre tých, čo nevedia o čo ide, je podstatné vedieť že takto sa premenné vytvárajú rýchlo a aj je k ním rýchly prístup) a ďalej dynamicky pomocou operátora new.

C# sa typy delia na hodnotové (čísla, znaky, logické premenné, vytvárajú sa v zásobníku), referenčné (polia a delegáti, vytvárame ich pomocou new, o ich rušenie sa stará .NET a nie programátor !!!!!!!!!!!) a ukazovatele (majú ten istý význam ako v C++ ale nepoužívajú sa, jednoducho netreba, teraz si programátori v C++ asi hovoria, že to je potom nemožné programovať ale dá sa to v oblastiach kódu označených ako nechránené.

Porovnanie z hľadiska rýchlosti:

Mohlo by sa zdať, že C# je tu na to aby nahradil C++. Pokúsim sa ale túto logiku spochybniť. Každý z týchto jazykov má určité klady a zápory. Skôr by som povedal, že sa tieto jazyky dopĺňajú. Pre C++ je charakteristická rýchlosť a pre C# jednoduchosť. Takže, ak potrebujem vyhodnocovať výsledky pri nejakom vedeckom experimente alebo riadiť realtime nejaké zariadenie, použijem C++, ktorý bude pracovať možno aj viac ako o polovicu rýchlejšie ako C#. Ak mám urobiť nejaký kancelársky balík, alebo všeobecne povedané, program ktorý má byť užívateľsky príjemný a spracováva dáta rýchlosťou ako ich tam užívateľ zadáva (obrazne povedané) použijem C# a budem to mať napísané možno aj o polovicu rýchlejšie ako v C++ a za to Vás určite zamestnávateľ pochváli. Predpokladám, že v budúcnosti sa podarí tento rozdiel zmenšiť.

Porovnanie z hľadiska praktickosti:

C# v najnovšej verzii 2, zahŕňa generické programovanie (šablóny ako v C++) a iné zaujímavé veci ako anonymné funkcie, iterátory, čiastočné typy a schopnosti premenných (napr. je s nimi možné bezpečne pracovať aj keď ešte nie sú naplnené hodnotou, pomocou vlastnosti hasValue)

C# rozširuje možnosti tried o delegátov, vlastnosti, atribúty a udalosti. Niečo podobné je aj vo vývojovom prostredí C++ Builder, ale je to len pomocou knižníc (možno viete niečo o spojení Pascalu a C++ v prostredí C++ Builder) a nie je to priamo podporované v štandarde jazyka C++. Podobne sa C# rozširuje o vlákna objektového typu.

C# je čistý objektovo orientovaný jazyk. Žiadne globálne funkcie či premenné.

C# uľahčuje modulárny spôsob tvorby programov. Vytvoríte si jeden projekt, každú triedu dáte do jedného súboru (ale nemusíte) a kašlete na nejaké #include (pre pripájanie vlastných hlavičkových súborov v rámci projektu) ak jedna trieda využíva inú triedu. O vzájomnú spoluprácu a o to aby trieda bola deklarovaná pred použitím sa postará prekladač. Toto sa mne osobne veľmi páči. Niektoré moje programy v C++ začínali dlhým zoznamov direktív #include " .h" . Bolo to veľmi neprehľadné a viedlo to niekedy k dlhým chybám (môj vlastný pojem pre chyby, ktoré sa dlho hľadajú :-) ) .

C# nemá rozdelenie súborov na hlavičkové a implementačné ( .h a .cpp ). V C# majú všetky moduly príponu .cs . Má to určité nevýhody pretože trieda nie je najskôr deklarovaná ale hneď definovaná aj so všetkými metódami, vlastnosťami v jedných zložených zátvorkách ohraničujúcich triedu. Niečo ako by ste všetky metódy triedy napísali v C++ typu inline. Teraz to ale nemá nič spoločné s urýchľovaním behu programu. Ak ste nepochopili, v budúcom diely určite pochopíte. Jediné plus vidím v tom, že Vás to núti písať malé triedy, čo je vynikajúce z hľadiska čitateľnosti (porozumenia) Vášho kódu iným človekom.

To ešte nie je všetko, snažil som sa poukázať len na tie podstatné veci. V ďalších článkoch ešte veľa krát spomeniem C++, tak ako som sľúbil na začiatku. Takže ak ste náhodou niečomu nepochopili ste úplne normálni, veď toto je len úvod a nabudúce zľahka začneme programovať od tých najjednoduchších vecí.

Čo bude v ďalšom diely:
1) Ešte konkrétne neviem
2) Určite aspoň program „ahoj svet“ , ktorý napíšeme a skompilujeme krok po kroku.
3) Možno začneme robiť „gedanke experimente“ (myšlienkové experimenty, ako hovoril jeden srandista) o objektových princípoch programovania.

Vaše otázky píšte na e-mail: micitn@orangemail.sk a do diskusie.

SEE YOU !

Neprehliadnite: