Witam,
Czy każdy program napisany w języku C, da się przepisać i osiągnąć podobne wyniki w języku 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ł.
Zależy od badań. Są i takie, w których C# wyprzedza Javę.
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.
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.
Głównie szybkość tworzenia bugów i możliwość powstawania memleaków.
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).