Czego się uczyć c++ czy c#

Zdecydowanie łatwiejszy.

C++:

a = b + c; // wywołuje po drodze 5 konstruktorów, 4 destruktory, 3 razy korzysta z new i raz zamazuje przypadkowy bajt na stercie

ASM:

XOR eax, eax; // to co widać

:stuck_out_tongue:

A kod binarny jeszcze łatwiejszy.

Ja wcale nie żartowałem.

http://www.yosefk.com/blog/low-level-is-easy.html

OK, ale dla takiego nooba, lamera itd., C++ jest bardziej przejżysty.

:o

Możesz rozwinąć, co Cię w C# przeraziło? Bo pierwszy raz się spotykam z taką opinią…

Właśnie na stronie Suse linux enterprise znalazłem infomacje

New in Suse Linux enterprise

Visual Studio targeting Linux

C# and Visual Basic developers can now run C# and Visual Basic programs (written and compiled in Visual Studio) on Linux. This enables them to leverage existing skills and the .NET toolchain to develop and maintain server and Web applications that run on Linux.

Czy to oznacza, że można pisać programy w c# i uruchamiać na linuxie ? Jak jest z przenoszeniem aplikacji napisanych w c# na linuxa ? Czy jest jakieś środowisko programistyczne dla c# w linux ?

No a nie?

http://www.mono-project.com

Można, ale nie jest to tak bezbolesne jak przenoszenie aplikacji w Javie (gdzie Linux ma oficjalne wsparcie). Mono jest zawsze nieco w tyle za .NET dla Windows.

No właśnie to mono mi nie odpowiada. Dziękuje bardzo za wszystkie odpowiedzi. Pomęczę się z c++ + biblioteka QT

Skype, KDE jest na tym zrobione więc możliwości są chyba bardzo duże :slight_smile:

Qt daje Ci do ręki potężne narzędzia, ale różne są opinie o przyjemności kożystania. Dla mnie akurat Qt jest miłe do tego, co mam okazje raz na jakiś czas, aplikacje srticte okienkowe, pod które sie wpisuje dane i program je mieli, korzysta czasem z bazy danych. Do czegoś takiego Qt spisuje sie dla mnie idealnie. Popiszesz troche, sam zobaczysz co będzie dla Ciebie wygodne.

WinAPI daje 95% dostepu do warstwy sprzetowej, ale trzeba sie pomeczyc… jak dobrze znasz WinAPI, to mozesz zrobic wszystkoz Windowsem :wink:

W innych systemach, zwlaszcza w Linuksie API systemowe jest bardziej restrykcyjne i nie masz dostepu do sprzetu. W Windows jest latwiej dobrac sie do sprzetu niz do jadra systemu. Trzeba tylko umiec wykorzystac pelne API.

Co do programowania proceduralnego, to ja go najczesciej uzywam piszac w C/C++, obiektowosc wykorzystuje raczej rzadziej (co z tego ze interfejs opisany obiektowo jest intuicyjny, zwlaszcza jak piszesz biblioteki, ale trudniej jest osiagnac efekt koncowy niz wykorzystujac proceduralne podejscie). Pelna obiektowosc staosuje w Javie i C#.

Obiektowosc ogranicza mi mozliwosc wstawiania kodu asemblerowego, co niekiedy jest nieocenione. Zanim ktos skrytykuje mnie, to powiem ze nie zamierzam pisac nieoptymalnych programow jak 98.98% programistow (pozostali to w wiekszosci tworcy sterownikow i/lub dobrzy programisci).


no nie do konca tak to ASM przetlumaczy, przynajmniej nie na prockach lepszych niz i386.

Ogolnie mnie przeraza kazdy jezyk ktory ma definicje, deklaracje zmiennych i funkcji, a do tego w skladni uzywa instrukcji wbudowanych dluzszych niz 5 znakowe :stuck_out_tongue:

ASM ma bardzo prosta skladnie, gorzej ze musisz znac budowe maszyny docelowej (procesora, organizacje pamieci etc.)


Wracajac do tematu. Polecam C++ najpierw bez obiektowosci, potem obiektowosc… nastepnie duuuzo pisac, pisac, pisac i pisac, i pisac … i pisac, by potem zabrac sie za C# lub Javę (o ile podpowiedzi IDE daja zludne wrazenie doskonalego poslugiwania sie jezykiem, to jednak obiektowosc jest bardzo trudna).

Podstawa jest oczywiscie algorytmika - bez tego nawet dobre IDE nie pomoze…

WYJASNIENIE:

C# wystepuje takze jako jezyk niezwiazany z platforma .NET/Mono i powiem ze jest ciezkostrawny, juz wole Jave.

Możesz rozjaśnić? Gdzie masz C# bez .NET i dlaczego tam jest ciężkostrawny?

“Optymalny” to słowo wytrych. Ale jeśli chodzi Ci o optymalny w znaczeniu wydajnościowym, to musze Cię nieco zmartwić:

98.98% użytkowników nie oczekuje optymalnych wydajnościowo programów.

Użytkownicy oczekują oprogramowania, które rozwiąże ich problemy. Wydajność jest tylko jedną z bardzo wielu cech, które się na to składają i najczęściej nie jest warta poświęcania innych istotnych aspektów dobrego oprogramowania: wygody użytkowania, przenośności, stabilności, bezpieczeństwa, łatwości pielęgnacji kodu itp.

Moja ścieżka nauki była mniej więcej taka : Pascal -> Delphi(Object Pascal) -> C -> C++ - > C#

Uważam, że każdy z tych języków ma swoje zastosowania, które też są uzależnione od czasu jaki mamy na wykonanie danego zadania oraz od oczekiwanej wydajności.

Tam gdzie jest potrzebny specyficzny program, którego wydajność odgrywa ważną rolę to zdecydowanie C, C++ są najlepszym wyborem. Warunkiem tego jest oczywiście fakt, że programista musi być świadom co robi. Wtedy produkt może być w pełni zoptymalizowany i wydajny. Zazwyczaj dużo trzeba robić wtedy samemu. Jest to pracochłonne ale opłacalne dla niektórych zastosowań.

Natomiast gdy trzeba napisać jakąś aplikację w bardzo krótkim czasie, która ma przede wszystkim działać a czas jej wykonania nie jest kluczowy to C# jest najlepszym wyborem. Prostota zbudowanie w nim aplikacji okienkowej jest zdumiewająca, szereg kontrolek umożliwia natychmiastowe wsparcie dla wielu współczesnych technologii.

A jeśli chodzi o rozwój oprogramowania to szybciej znajdziemy gotową kontrolkę dla C# niż jakąś bibliotekę dla C, która i tak będzie posiadała liczne błędy i wycieki pamięci.

W tym sek, ze nie ma praktycznie juz takich zastosowan, gdzie kilka % wydajnosci jest wazniejsze niz koszt programisty. Java i C# pod wieloma wzgledami umozliwia pisanie programow wydajniejszych niz w C, szczegolnie duzych, wielomodulowych programow.

Chyba majaczysz. Wydajniejsze od C może być tylko assembler i to pod warunkiem że programista C nie umie pisać programy albo pisze wg reguł somekind’a - najpierw piszemy potem ewentualnie zastanawiamy się czy to napisano optymalnie.

A ja sie wtrącę do rozmowy :slight_smile:

Tak w ogole to witam :slight_smile:

Co wybrać ? C? czy C++ ? czy C#?, a może jakieś inny język?

Ja przeszedłem moją scieżkę już parę lat temu zaczynając od Pascala przez Delphi, C, C++, Assebler, php, SQL, Java itp.

Większość z Was pisze o strownikach i dostępie do sprzętu. Ale co nam daje dostęp do sprzętu ? jak pisał mój poprzenik pare postów wyżej, ponad 99% programistów nie potrzebuje dostępu do sprzętu. Co mnie obchodzi dostęp do sprzętu ? ma wydrukować, ma zapisać plik, ma zrobić co jest potrzebne zwykłemu śmiertelnikowi, nie potrzebuję pisać sterowników ani innych podobnych. Nie chce mi się poświęcać całego życia na pisanie w systemie szesnastkowym (Assembler) bo nie lubie (albo mi się nie chce).

Tak samo wielu z Was pisze o wydajności. Czym jest wydajność teraz ? kiedyś można było się zastanawiać czy mój program zajmie 6 MB RAMu czy może 15 MB RAMu a może 32 MB RAMu. Teraz ? teraz nikt się tym nie przejmuje. Mamy 1GB RAMu, 4 GB RAMu, a za chwilę będzie 1 TB RAMu. Co do prędkości, kiedyś mieliśmy procesory 300 MHz, 400 MHz to był szał. Teraz ? 2GHz, 3GHz do tego dochodzą dodatkowe rdzenie itd. Czy mój algorytm skończy się o 10 milisekund krócej czy dłużej to mnie nie obchodzi.

Skalowalność? ok tutaj się zgodzę, że pisząc w C i C++ Twoje programy mogą być kompilowane dla Windowsa, Uniksa itd. Ale i tak 99% przedsiębiorstw wykorzystuje Windowsa. Nie będę już tutaj wchodził dlaczego Windows, ale tak jest i nikt temu nie zaprzeczy mimo, że nie lubi Microsoftu.

Zresztą dla mnie nagonka na Microsot za to że jest jaki jest, jest bez sensu. Ludzie nie lubią Microsoftu, bo nie i koniec. Bo usłyszeli, że Linuks jest dla “hackerów” i to jest najważniejsze. Ale spojrzcie na biedne panie w firmach które mają problem z dwuklikiem. Jak one mają poradzić sobie z Uniksem (Linuksem).

Czym dla mnie jest programowanie? Bawię się już w to od kilku lat i pisze aplikacje dla firm. Dla mnie teraz liczy się prędkość wykonania projektu, a co za tym idzie klient płaci mniej za projekt. Prosty przykład, po co tworzyć w c++ dodatkową metodę do sortowania jak w C# już to mam w Freamworku ? Szybkość wykonania projektu, jest teraz najważniejsza. Co z tego, że program wykonuję się 2 sekundy krócej niż jak bym go napisał w C++?

Można się teraz domyśleć, że jestem programistą C#. Nie neguje w żadnym wypadku innych jężyków. Podziwiam C za to co zrobił, C++ za to jak rozszerzył C, Assemblera za to co potrafi. Ale w dzisiejszych czasach wydajność już nie ma takiego znaczenia jak kiedyś. Dzisiaj, dla nas programistów, liczy się prostota napisania aplikacji, przez co skracamy koszt oprogramowania i co naważniejsze klient płaci za to mniej!.

Idę dalej… C# jest bardzo podobny do C++, ucząc się C# tak samo jest możlilwość przeniesienia swoich umiejętności na inny język. Ucząc się c# mamy za jednym zamachem: aplikacje konsolowe, aplikacje okienkowe (Windows Forms jak i WPF), aplikacje www (które pisze się o niebo lepiej niż w PHP), do tego zaraz dochodzi Silverlight. Apropo Silverlighta od razu mówie, że na dzień dzisiejszy jeszcze się nie przekonałem do tego, zbyt mała rzesza przeglądarek obsługujących go. Podobnie skalowalność, jest projekt Mono, na który zresztą niecały miesiąc temu Microsoft dał, że tak się wyraże “błogosławieństwo”. Tak więc jak się chce to i można te aplikacje uruchomić na Uniksie (nie testowałem :slight_smile: ).

Moim zdaniem jeśli chce się zacząc programować to dlaczego nie zacząć od C#, przyjemnie, fajnie i dzieki niemu można wieeele rzeczy zrobić za jednym zamachem.

Pozdrawiam

Bo najpierw się pisze, a później się optymalizuje. Nigdy odwrotnie. I optymalizuje się tylko to, co wykazuje profiler, że trzeba zoptymalizować.

C i assembler są wydajniejsze tylko przy założeniu, że dysponujesz nieograniczonym budżetem na wykonanie projektu i ponadprzeciętnymi programistami. W przypadku ograniczenia budżetu do rozsądnych takich samych wartości, i średnio zdolnym zespole programistycznym, jeśli kierujesz się maksymalizacją wydajności, języki programowania należy rozważać w następującej kolejności:

  1. Java, C#

  2. C++

  3. C

  4. assembler

Po prostu programiści Javy ukończywszy projekt będą mieli jeszcze trochę czasu na optymalizacje wysokopoziomowe, które dają zyski zwykle po kilkaset % (w przeciwieństwie do maksymalnie kilkunastu % strat, które powoduje runtime Javy względem najlepszych kompilatorów C++) . W tym czasie koledzy programujacy w C/C++ będą walczyli z segfaultami i wyciekami pamięci, żeby w ogóle spełnić wymagania projektu, a później jak to zrobią będą pisali własne alokatory pamięci, w których znowu będą szukali segfaultów (C++ nie jest w stanie dorównać Javie wydajnością BEZ używania niestandardowych technik jak np. własne alokatory, bo standardowe ręczne new/delete jest mocno niewydajne w porównaniu z GC Javy/C# - patrz przypadek Firefoxa i problemy z fragmentacją). A programiści assemblera… no cóż, będą gdzieś w 1/10 drogi.

No i co z tego? To tak jak mówić, że 99% ludzi jeździ tramwajem (bo jechało choć raz w życiu). A prawda jest taka, że większość tych Windowsów to desktopy, które mają małe znaczenie biznesowe. Na rynku serwerów Windows w 2007 roku miał raptem 38% [1]. Reszta to wszelkiej maści Unixy :wink:

[1] http://www.linux-watch.com/news/NS5369154346.html

Ostatnio przepisywałem program po pewnym gamoniu o podobnym myśleniu. Program miał wyliczać kilka danych statystycznych z pewnego bardzo długiego ciągu liczb. Gamoń ładował całość do pamięci (co nie zawsze się udawało) a potem puszczał kilka funkcji każda z których przelatywała całość i wyliczała te wartości statystyczne. Założę się że żaden profiler nie wskaże że można to zoptymalizować obliczając wszystkie niezbędne dane statystyczne w jednym przebiegu nie gromadząc danych do pamięci.

W wyniku czego kolejny zadowolony klient pytał - jak to jest możliwe że ten pierwotny program napisany w C# który to: nie dla każdego zbioru danych działał, ładował się do pamięci jakieś 30 sek przy pierwszym uruchomieniu, obrabiał plik danych średnio 20 min - kosztował go 500 zł; natomiast moja wersja: lądująca się błyskawicznie, obrabiająca plik tyle czasu co jego skopiowanie a nawet trochę mniej, łykająca każdy plik niezależnie od rozmiaru - kosztuje tylko 120 zł.

Co mogę odpowiedzieć w takim przypadku? Że nie każdy kto nazywa siebie programistom jest nim? Że C# jest narzędziem właśnie dla takich gości?

Wszytko zależy od definicji “przeciętny programista” - jeżeli przyjąć że to oznacza ktoś kto najpierw piszę a później ewentualnie myśli to się z tobą zgodzę. Przy innej definicji “przeciętny programista” to co napisałeś wyżej to bzdura.

Jeszcze jeden mistrz logiki :smiley:

Co z tego że serwery więcej kosztują i maja większy cenowy udział w rynku? Większość zamawianych aplikacji piszę się właśnie pod desktopy.

Gratuluje podjęcia mądrej decyzji…

http://www.joelonsoftware.com/articles/ … 00069.html

Kodu się nie przepisuje, kod się poprawia. Poprawianie kodu jest dużo łatwiejsze w językach zarządzanych, gdzie są do tego dobre narzędzia. Być może pisząc jedynie w C++ i Delphi nie miałeś okazji się o tym przekonać. Inna rzecz, że pomyliłeś optymalizację kodu z optymalizacją architektury. Projektu architektury zwykle nie powierza się szeregowym programistom, i tak, architekturę projektuje się PRZED napisaniem kodu z uwzględnieniem m.in. kwestii wydajności.

Znam paru ponadprzeciętnych programistów i wyobraź sobie, że żaden z wyboru nie koduje w C++[1]. Ponad 70% błędów w aplikacjach C++ nie da się popełnić w językach zarządzanych. Ponadprzeciętni programisci są zbyt drodzy, aby tracili czas na ręczne poprawianie wycieków pamięci i segfaultów [2] , walcząc przy tym z ograniczeniami języka za pomocą brzydkich hacków (np. Boost::lambda, albo preprocesor moc w QT). Poza tym chyba nie pracowałeś nigdy w żadnej firmie nad poważnym projektem (takim za który klient płaci >500.000 zł). Nigdy nie jest tak, że cały zespół to super wymiatacze z doktoratami. Takie podejście się nie opłaca, bo na każdego trzebaby wydać conajmniej 15000 zł / mies. Zatrudnia się 10 przeciętniaków i jednego lub dwóch lepszych łebków do projektowania / zarządzania / refactoringu / implementacji trudniejszych fragmentów. Język C++, z wyjątkiem gier 3D i projektów “legacy” [3] nie ma w takich projektach racji bytu, bo nie oferuje żadnej przewagi nad Javą/C#, a wad ma wiele.

[1] preferują Javę, Pythona, LISP, Prolog

[2] Mam wrażenie, że znaczna część błędów i dziur w systemach powstaje przez programistów, którym wydaje się, że nie potrzebują GC oraz potrafią programować wielowątkowo.

[3] Większość popularnych aplikacji desktopowych to kod legacy.

To z tego, że generują ZYSK przedsiębiorstwom, w przeciwieństwie do pierdułek typu 45 wersja programu do przyspieszania Windows XP sprzedawana za 10 zł na Allegro. Zresztą, jeśli już liczymy na sztuki, to aplikacji w PHP jest więcej niż pisanych w innych językach. Podobnie mikrokontrolerów 8 i 16-bitowych jest na świecie więcej niż dekstopów. Desktopy zdecydowanie i w tym zestawieniu przegrywają. Tylko nie bardzo widzę sens liczenia udziału rynku “na sztuki”. Jest za tym jakaś głębsza myśl, niż tylko socjotechnika mająca na celu (błędne) wykazanie, że desktopy rządzą?

Do autora oryginalnego postu:

Nie daj się nigdy nabrać na stwierdzenia, że jak ktoś pisze w C++, to już od razu nie wiadomo jakim super programistą jest (a trochę tak wynika z postów alexa, a może nie?). 99% programistów C++ uważających programistów C# za lamy nie poradziłoby sobie z napisaniem względnie standardowego projektu jak np. silnika relacyjnej bazy danych z optymalizacją zapytań SQL. Tak samo jak sam fakt używania Linuxa nie powoduje od razu że stajesz się hackerem. Znam kilku wybitnych programistów, którzy potrafią napisać świetny program obojętnie czy w C++ czy w C#. Tak naprawdę, poza wygodą i czasem tworzenia produktu, język nie ma aż tak dużego znaczenia na końcową JAKOŚĆ produktu.