Programy zaimplementowane w C a w C++

Witam,

Czy każdy program napisany w języku C, da się przepisać i osiągnąć podobne wyniki w języku C++?

Z teoretycznego punktu widzenia: tak.

O ile nie użyto żadnych wygibasów to ten sam plik bez przeróbek się skompiluje. Tyle że nie będzie to zgodne ze standardami, tylko zadziała “na litość”.

Do najważniejszych różnic należą:

[*] cstdio, cstdlib, cmath, ctime zamiast stdio.h, stdlib.h itd.

[*] Wszystkie standardowe funkcje są w przestrzeni std (niezbyt lubiany “ficzer”, dlatego większość kompilatorów toleruje je też poza tą przestrzenią)

[*] Inaczej troszkę się używa struktur (tzn. prościej, ale o ile dobrze pamiętam to to jest kompatybilne ze stylem C)

Poza tym zawsze można użyć extern “C” i powinno działać.

na pewno nie każdy…

A jeżeli chodzi o C++ i C# to C++ ma dużo większe możliwości? Wiem, że C# jest dobry językiem do pisania programów okienkowych dla Windows(pomijam projekt mono). Chodzi mi o możliwości pisania na różne platformy np. konsole, telefony czy inne programy do połączeń między komputerami.

Znów, z teoretycznego punktu widzenia: takie same. Natomiast faktycznie C++ ma implementacje na większą liczbę platform (nawet uwzględniając mono to nadal pozostaje prawdą, tak myślę). Trzeba pamiętać tylko, że jeden język na każdą platformę nie wystarczy. C i C++ na pewno warto znać, ale na telefonach dla przykładu pisze się m.in. w Javie.

Faktycznie “takie same” bo mnie C# kojarzy się z aplikacjami okienkowymi ale można napisać aplikację konsolową “taką samą” jak w C++.

Ale C++ większe możliwości “dostosowania” do potrzeb np. zarządzanie pamięcią.

Jesteś pewien, że zarządzasz w kodzie C/C++ pamięcią lepiej, niż robi to GC w C#? :]

W C/C++ masz nad tym władzę. W wielu przypadkach jest to wygodniejsze od GC. Zarówno GC jak i jego brak ma wady i zalety.

A do c++ teć jest GC w formie biblioteki, którą bardzo łatwo użyć.

Co do pisania na inne platformy to większym problemem jest zapoznanie się z samym API platformy. Java to niby Java, a programowanie pod PC (lub Androida) w Java SE, a na telefony w j2me to 2 różne sprawy. a Java EE to już całkiem inna bajka. A stosowany język w każdym ten sam.

Ogólnie warto znać C, C++ i Javę, bo to najpowszechniejsze języki

Poza tym, że C# służy pewno w większości do programowania aplikacji WWW, to masz rację.

No, jeśli się zapomni o PHP, VB i C# to masz rację.

PHP - rozwiązania www, zastępowalne przez Javę, Pythona, C#. Dla programisty desktopowego zupełnie bezużyteczny, a to dział programowanie, a nie webmastering.

C# - w pełni zastepowalny przez javę, poza tym, tylko windows (pomijając mono). Pomijam też fakt, że C# to Java by microsoft

VB - język dla dzieci, początkujących i sekretarek, tylko windows.

Wygodniejsze? Z pewnością nie, wygoda z definicji to ułatwianie pewnych czynności. Istnienie GC upraszcza pracę, a nie utrudnia ją. Nie bardzo też rozumiem po co GC w C++, skoro w C# jest OOTB, działa dobrze i cały framework jest zbudowany wokoło GC, a nie każdy lib w C/C++ będzie z GC poprawnie działał. :slight_smile:

Zależy od badań. Są i takie, w których C# wyprzedza Javę. :wink:

Pomińmy w ogóle wszystkich programistów, którzy nie piszą w Javie i nie mieszkają w Koziej Wólce. Albo się da pisać w C# na platformy inne niż Windows, albo się nie da. Mono istnieje i ma się całkiem nieźle, usilne negowanie tego stanu nie zaczaruje rzeczywistości.

Znam wielu deweloperów, którzy by się obrazili. :slight_smile:

Z jednej strony zastosowanie frameworka dla C# ułatwia wiele rzeczy np. technologia LINQ czego C++ nie ma ale z drugiej strony często jest tak, że to co “robi się” za nas nie jest “idealnie” zrobione.

I tak jak w przypadku zarządzania pamięcią, należy sobie zadać pytanie: napiszesz coś z palca idealnie? Albo przynajmniej lepiej, niż jest to zaimplementowane we frameworku? :]

Czasem żeby coś działało tak jak chcemy, trzeba zejść na niższy poziom i obok gotowego rozwiązania napisać własne.

Kiedy potrzebujesz coś wykonać w momencie usuwania obiektu, to finalize() nie zawsze wykona się dokładnie wtedy kiedy chcesz, tylko w losowym momencie, kiedy GC zechce się uruchomić.

Jak już pisałem: zarówno GC jak i jego brak mają wady i zalety. GC daje wygodę, a jego brak daje szybkość i możliwości.

Ale wracając do tematu: C jest ojcem niemal wszystkich języków wysokiego poziomu. Jak nie “biologicznym”, to chrzestnym.

Składnia pomijając oczywiście te wygibasy ze wskaźnikami, strukturami jest niemal identyczna jak w większości współczesnych języków, te same niemal pętle (niektóre bardziej rozwinięte jak for w javie), pisownia…

Jest jeszcze jego wróg: Pascal, który też doczekał się małej rodzinki pascalopochodnych i wyjątkowy Python, który jest wyjątkowo pedantyczny (intend-sensitive, wrażliwy na wcięcia).

Wyjątkiem jest tu COBOL, który dziś jest uważany przez wielu za zakałę całego programowania (“ADD A TO B GIVING C”).

A skompilowany kod do biblioteki można bez problemu użyć w C++ bez żadnych przeróbek (tylko ten extern “C”).

Jeśli chcesz coś wykonać w momencie usuwania obiektu, implementujesz IDisposable i wywołujesz .Dispose() wtedy, kiedy chcesz zwolnić zasoby. Nie gwarantuje Ci to natychmiastowego zwrotu pamięci do puli, ale gwarantuje, że wszelkie wiszące referencje przestaną być poprawne. Mechanizm, o którym piszesz, że nie istnieje w C# - istnieje.

Ponadto C nie jest ojcem prawie każdego języka wysokiego poziomu, bo ewolucja postępowała w kilku kierunkach i tam mamy np. Algola, który dał nam Basica, Pascala, Pythona, Ruby i Smalltalka. Co więcej wiele obiektowych języków pochodnych C czerpie z doświadczeń ze Smalltalkiem (Objective-C, Java, C#). Jest też jedna zupełnie niezależna, wywodząca się z Lispa gałąź języków, która dała nam Erlanga i Haskella. Więc nie, C nie jest ojcem niemal wszystkich języków wysokiego poziomu.

To, że skompilowany do kodu maszynowego spakowanego do przenośnej biblioteki (.lib, .a) kod C można dołączyć do C++ nie jest żadnym dowodem pokrewieństwa. Można to samo zrobić z kodem w Pascalu. Kompatybilność jest zamierzoną cechą stosowanych tollchainów a nie implikowaną cechą “dziedziczących” po sobie języków.

To dział programowanie, a PHP to język programowania.

Rozumiem, że aplikację ASP.NET czy Silverlight, grę na XBoxa czy program na Windows Mobile bądź Windows Phone też jesteś w stanie w Javie napisać?

Jest bardzo wielu programistów VB (może nawet tylu, ile Javy), powstaje w nim produkcyjny soft, jest ciągle wspierany, pisane są o nim książki. Co i komu próbujesz wmówić?

To akurat jasne. :slight_smile:

Głównie szybkość tworzenia bugów i możliwość powstawania memleaków. :wink:

A pięć miliardów odmian Basica, to gdzie? A cała rodzina ML? A Fortran? A Scheme czy Prolog, które są jeszcze czymś innym? Zresztą sam C wywodzi się z języka B, ten zaś z CBL, który z kolei czerpie z ALGOLA, a ten z Fortrana.

BTW - for w Javie wcale nie jest bardziej rozwinięty, tego typu pętla do poruszania się po kolekcjach istnieje w wielu językach. Twórcom Javy po prostu nie chciało się (albo nie umieli) jej inaczej nazwać.

Są jakieś konkretne “dziedziny” gdzie używa się C++ zamiast C#? Nie chodzi mi o jakieś wielkie komercyjne programy ale mniejsze gdzie można wykorzystać na przykład programowanie strukturalne zamiast OOP.

Język to tylko narzędzie które się wybiera w zależności od potrzeb. W Javie i C# pisze się łatwo i szybko, programy w C++ są szybsze. Więc zwykła aplikacja okienkowa zżerająca max 5% CPU może być śmiało napisana w Javie, C# czy też innym czymś, a coś gdzie liczy się prędkość, czy też bezpośredni dostęp do systemu/sprzętu, to C/C++ (lub też napisana warstwa w C/C++ i używana w javie, C# czy czymś tam)

Większość gier i desktopowych programów użytkowych, sterowniki, oprogramowanie telekomunikacyjne, itp.

C# to język dla .NET Frameworka, a ten jest platformą do tworzenia aplikacji na potrzeby firm, na specjalne zamówienie (custom software). Programów, których nigdy nie widzi na oczy nikt, poza ich twórcami i pracownikami firm, w których te programy są używane. Wydaje mi się, że tego typu oprogramowanie stanowi większość zapotrzebowania. (Oczywiście nie tworzy się go tylko w C#/.NET, ale też w Javie).