C++ czy Delphi


(G3h0stx) #1

Witam, mam zamiar wziąć się za naukę języka programowania, tylko mam dylemat którego, zastanawiam się nad C++ albo Delphi.

Proszę o pomoc w wyborze, prosiłbym o wypowiedzi który wg was jest lepszy, prosiłbym bym też o podawanie argumentów ;p


(Winiarro) #2

Jeśli nigdy wcześniej nie miałeś styczności z programwaniem i nie wiesz zbytnio o co w tym biega to zacznij od Pascala. Większość ludzi tak zaczyna, bo to prosty język a pozwala na stosunkowo wiele (jest najlepszy do nauki). A potem oczywiście C++. Najlepszym kompilatorem pascala jest FreePascal: http://www.freepascal.org/. Delphi to według mnie półśrodek. Po pascalu tylko c++.


(Trance) #3

Nawiązując do poprzedniego postu, moim zdaniem za Pascala nie ma sensu się zabierać , na początek zdecydowanie c++


(Ostry2007) #4

Odradzam pascala - przestarzały, przestarzały i jeszcze raz przestarzały, do tego niewygodny. Pierwszym poznanym przeze mnie językiem był C++ i nie żałuję. W gamedevie np. jest on absolutnym standardem, a jeśli bardziej interesuje Cię projektowanie aplikacji okienkowych, warto może byłoby zwrócić uwagę na C# (jeśli programujesz pod windowsem ofc) - nowoczesny, całkowicie obiektowo zorientowany język.


(G3h0stx) #5

a co z Delphi jest nie tak :stuck_out_tongue: ??


(Pkolaczk) #6

Oba są dość przestarzałe. C++ jest standardem chyba tylko w gamedevie - ze swoimi plikami nagłówkowymi i zarządzaniem pamięcią, śmieszną biblioteką standardową tkwi w zeszłej epoce. Delphi rządzi chyba głównie tylko w jakiś biurowych aplikacjach bazodanowych małej wagi - obecnie coraz częściej wypierane przez Javę, C# i VB.NET. Nie mam osobiście nic do Delphi, ale firma, która je produkuje ma koszmarny marketing i beznadziejną politykę kadrową - stracili praktycznie wszystkich wartościowych ludzi. Raczej nic z tego już nie będzie.

Naucz się najpierw dobrze C, później Javy (znasz Javę, to prawie znasz C#), później czegoś nowoczesnego skryptowego np. Pythona lub Rubyego.


(Ostry2007) #7

Jeśli C++ jest przestarzałe, to C to dopiero antyk.

Opanuj b. dobrze C++ a kwestia przerzucenia się na C# (jak i na większość innych języków, nie licząc jakiś ezoterycznych dziwadeł) to kwestia przejrzenia byle tutorialu.

Jeśli po prostu chcesz zacząć programować, zobaczyć o co w tym biega, to C++ jest najlepszy przez wzgląd na zajebistą popularność, dużą dostępność tutoriali, książek itd.

Później, jak osiągniesz pewien stopień zaawansowania sam będziesz wiedział jaką drogą dalej podążać. Opanuj b. dobrze jeden obiektowy język, a poznanie następnych to kwestia paru godzin.


(G3h0stx) #8

Czekam na kolejne wypowiedzi :slight_smile:


(Darkvifon) #9

Część mnie pewnie wyśmieje, ale na początek polecam język skryptowy AutoHotkey. Kiedyś próbowałem się nauczyć C++, ale szło dość opornie. “Pobawiłem” się trochę AutoHotkey i teraz o wiele łatwiej mi idzie nauka C++ - mam już jakieś tam podstawy.


(Pkolaczk) #10

Nie. C nie jest przestarzałe. C jest dojrzałe i kompletne. Przestarzałość nie ma nic wspólnego z datą wymyślenia danego rozwiązania.

C jest przenośnym assemblerem i jak dotąd żaden inny język go w tym nie zastąpi, bo C bardzo dobrze spełnia swoje zadania (i notabene jest nadal jednym z najpopularniejszych języków programowania, wg wielu rankingów zdecydowanie popularniejszym niż C++).

C++ nie jest ani nowoczesnym językiem wysokopoziomowym,

ani “lepszym” C. Jest protezą języka wysokopoziomowego zrealizowaną na bazie C (ze względu na względy historyczno-społeczne, a nie technologiczne).

Konsekwencją tego jest niepotrzebnie skomplikowana składnia języka i dużo różnych mechanizmów, które się nawzajem gryzą. Ten język jest owszem, praktyczny w użyciu, ale są obecnie ładniejsze, lepiej zaprojektowane języki dla tych zastosowań, dla których do tej pory używało się C++ (w gamedevie coraz uważniej przyglądają się D, na desktopie coraz częściej Java i C#, aplikacje serwerowe i rozproszone głównie Java, na komórkach Java). I nie wyjeżdżajcie mi, że więcej kodu napisano w C++ niż w tych nowoczesnych językach, bo to nic nie znaczy. Prawdopodobnie w COBOLu powstało więcej kodu niż kiedykolwiek powstanie w C++. Ale obecnie w mało którym NOWYM projekcie, użycie C++ jest uzasadnione.

Pozostanie nauczenie się mechanizmów takich jak refleksja, introspekcja, adnotacje, lambda-wyrażenia, inny sposób łączenia modułów, parametry out, delegaty, serializacja, synchronizacja wątków itp. I do tego poznanie znacznie obszerniejszej biblioteki standardowej. To rzeczywiście przejrzenie tutorialu w jeden wieczór. Świat Javy i C# to zupełnie inny świat niż świat C++.

C++ jest złym językiem do edukacji bo jest niepotrzebnie skomplikowany, ma porąbaną składnię, a niektóre rzeczy są mocno niedorobione - np. nie zapewnia pełnej modularności. Tylko można się zniechęcić do programowania.


(pebal) #11

Możesz podać przykład, tej niby “porąbanej składni”?


(Pkolaczk) #12

Gramatyka jest niejednoznaczna, kontekstowa:

Przykład:

type_spec(i)++; // wyrażenie - rzutowanie i wywołanie operatora ++

type_spec(i); // deklaracja zmiennej

Do tego np. duplikujące się mechanizmy:

(type_spec) a; // rzutowanie w stylu C

type_spec (a); // rzutowanie w stylu funkcyjnym

reinterpret_cast(a); rzutowanie w stylu C++

Do tego dodajmy jeszcze bardzo złożony mechanizm dopasowywania implementacji funkcji do wywołania (wymagające obliczenia przecięcia zbiorów :D) i można stwierdzić, że “porąbane” to delikatnie powiedziane.

A na deser takie coś:

http://malcom.pinger.pl/m/1295220

Jak ktoś chce się serio uczyć C++, to niech sobie najpierw postudiuje to: http://yosefk.com/c++fqa/

i sam zadecyduje, czy warto się w to pakować. Ze swojej strony mogę powiedzieć, że ten tekst bardzo dobrze zgadza się z moim doświadczeniem zawodowym (ponad 5 lat programowania w C++).


(pebal) #13

Nikt nie każe Ci z tej gramatyki korzystać. To że język pozwala na pewną dowolność, nie jest jego wadą a zaletą.

type_spec i;

static_cast(i)++;

Trzeba poczytać co i jak można rzutować a nie będzie problemu z której wersji skorzystać.

Co ma dopasowywanie implementacji funkcji do składnią języka?

Zwyczajne okno z informacją o bieżącej ścieżce wykonywania, nie widzę tutaj nic dziwnego.

Jak najbardziej warto.


(Pkolaczk) #14

Jest dużą wadą. Z co najmniej kilku powodów:

  1. Kłopoty z implementacją kompilatorów i narzędzi (IDE). Niebawem wychodzi nowy standard, a większość kompilatorów nadal nie jest zgodna z poprzednią jego wersją, która ma już chyba 10 lat. Podobnie IDE do C++ pozostawiają bardzo wiele do życzenia względem IDE do C#, Javy czy Delphi (podpowiadanie składni).

  2. Powolne kompilatory C++. Nie, źle piszę. Koszmarnie powolne kompilatory C++.

  3. Wprowadźmy do języka polskiego dowolność w pisaniu rz i ż, ó lub u, ch i h itp. Łatwiej będzie pisać, co? Tylko że akurat to co się liczy najbardziej w językach programowania to czytelność i łatwość pielęgnacji kodu. 90% czasu kod jest czytany, a nie pisany.

  4. Dowolność powoduje, że kod poskładany z 10 bibliotek przez kilku programistów wygląda jak kupa g***a, niezależnie od wysiłków głównego architekta, kierownika projektu i pięciocyfrowych pensji programistów. Pod tym względem C++ cierpi na syndrom PHP.

  5. Brak dowolności i minimalizm jest jednym z głównych czynników sukcesu Javy. Brak dowolności szyku zdania powoduje, że łatwiej się nauczyć języka angielskiego niż polskiego (np. nie jest potrzebna większość odmian).

Tamte dalsze argumenty nie dotyczyły tylko składni, ale również semantyki. Ale generalnie ma trochę do składni, bo można sobie wyobrazić bardziej jednoznaczną składnię wywołania funkcji, oferującą więcej kontroli nad tym, która z przeciążonych implementacji zostanie wywołana. Obecny algorytm jest na tyle złożony, że nawet niektóre kompilatory mają z tym problemy - i albo generują niepotrzebnie błędy, albo wybierają złą implementację, niezgodnie ze standardem.

Nie ma żadnego problemu prócz bałaganu. Wszystkie wymienione przeze mnie są semantycznie równoważne. Inny jest zapis.

Nie ma to jak uczyć się 3 razy więcej niż trzeba (stąd 80% programistów C++ nie zna nawet 20% języka).

To wyjrzyj poza skorupę C++, bo takie komunikaty w świecie programowania to nie jest nic NORMALNEGO. Normalny stacktrace wygląda tak, że każde wywołanie mieści się w jednej linijce ekranu. Jeszcze gorzej wyglądają czasem komunikaty kompilatora na 20 linijek związane z wzorcami (akurat nie mam przykładu pod ręką). Notabene C# i Java też mają wzorce, a komunikaty dają ładne i zwięzłe.

Tylko jeśli ktoś chce się zajmować gamedevem lub pielęgnować stare projekty.


(pebal) #15

O niezgodnych ze standardem kompilatorach należy zapomnieć i używać zgodnych, których nie brakuje. Z dostępu do dobrych IDE, także nie ma żadnych problemów.

Jęzek C++ jest językiem typowanym statyczne co powoduje, że kompilator musi wykonać pracę, która w przypadkach innych języków jest wykonywana w trakcie działania aplikacji. Ciężka praca kompilatora C++ owocuje szybkim i przewidywalnym w działaniu kodem wynikowym.

Twoje porównanie jest nietrafione i z rodzimego języka bardziej pasuje tutaj takie:

To jest “kwiatek”.

Oto “kwiatek”.

Obydwa zapisy są równoważne i całkowicie zrozumiałe.

W każdym języku programowania można napisać kod, który wygląda jak kupa g***a, żaden to argument.

Sukcesem Javy jest jej przenośność a nie brak niedostępnych w niej mechanizmów.

Czy tylko język C++, pozwala na przeciążanie funkcji?

A kto każe Ci w języku C++, rzutować w stylu języka C?

Jak ktoś chce mieć bałagan, to będzie go miał.

Komunikaty nie maja być ładne, tylko użyteczne.

Jeżyk C++ wykorzystuje się do pisania wydajnych aplikacji. Niektórym się wydaje, że wydajne powinny być tylko gry, ale to nie jest prawda.


(Fiołek) #16

Też używam w głównej mierze C++(gamedev), ale muszę zgodzić się z JCoder-em.

Nie znam kompilatora który jest w 100% zgodny ze standardem. Nie znam również IDE które jest tak przyjemne w użyciu jak Visual C#. VC++ jest najlepszym(IMO), ale i tak Intellisense leży i kwiczy.

Java i C# też jest statycznie typowany, a kompilacja rozbudowanego projektu trwa chwilę. C++ leży pod tym względem.

Ale trzeba było się ich nauczyć, a to jest główna wada “dowolności”.

Tak, ale w C++ nie ma możliwości napisać ładnego i bardzo rozbudowanego kodu. Modułowość leży(potrzeba nagłówków) w porównaniu do C#/Javy.

Sukcesem Javy jest jej przejrzysta składnia i łatwość pisania, bo przecież C++ też jest przenośny.

Tylko, że ten komunikat nie jest ani ładny, ani użyteczny. Nic z niego nie da się zrozumieć. CallStack powinien być jak najkrótszy i mieć w sobie jak najwięcej informacji.


(G3h0stx) #17

Prosiłbym o porównania Delphi z C++ :stuck_out_tongue: omówić ich wady i zalety.

Z góry dziękuje :smiley:


(Fiołek) #18

Delphi - prawie brak wsparcia(tylko od Borlanda).

C++ - ogromne wsparcie.

Delphi - składnia podobna do Pascala której nie lubię.

C++ - składnia podobna do C, którą preferuje.

Delphi - w sumie to tylko Windows only,

C++ - wieloplatformowy(w dosłownym tego słowa znaczeniu, co prawda trzeba umieć pisać wieloplatformowo, ale jest to możliwe).


(Pkolaczk) #19

Pokaż mi choć jeden ogólnodostępny kompilator C++ (darmowy), który jest w 100% zgodny ze standardem. Ma być zgodny w 100% a nie “prawie zgodny”. Mam dosyć produktów, które są “prawie zgodne” lub “prawie działają”. Lista popularnych kompilatorów, które nie są zgodne: VC++, GCC, Borland C++, ICC. Jedyny (chyba) w 100% zgodny, to komercyjny Comeau, ale nie jest popularny i trochę kosztuje. Pokaż mi darmowe IDE do C++ w którym poprawnie działa refactoring, podpowiadanie oraz automatyczne naprawianie błędów (jak w Eclipse). Kiedy się niedawno bawiłem Eclipse CDT (darmowe) oraz Visual Studio (komercyjne), w żadnym z nich te rzeczy nie działały stabilnie (zresztą ani VS ani CDT nie mają z założenia refactoringu do C++). IDE do C++ są grubo w tyle za IDE do C#, VB, Object Pascala czy Javy.

Farmazony. Nie pisałeś chyba nic większego w C++ niż program na zaliczenie na uczelni. Sorry, ale nie przychodzi mi inne wytłumaczenie, jak można pisać takie rzeczy. Powolna kompilacja nie ma NIC wspólnego ze statycznym typowaniem. Java jest statycznie typowana, a programy podobnej wielkości kompilują się rzędy wielkości szybciej (np. Jboss > 100MB źródeł, czas kompilacji ~3 minuty, KDE 3.5 podobna wielkość - czas kompilacji ponad 10h). Programy w C++ kompilują się potwornie długo z 3 powodów:

  1. niejednoznaczna, nie LL(k) gramatyka - nie da się rozdzielić przebiegu analizy składniowej od semantycznej, nie da się użyć klasycznego parsera zstępującego.

  2. brak modularyzacji

  3. mechanizm konkretyzacji szablonów (razem z 2. powoduje eksplozję czasu kompilacji i potrzebnej pamięci).

Ale nie wnoszą nic do użyteczności języka, a utrudniają obcokrajowcom jego nauczenie się. Tak samo jak możliwość dowolnego szyku wyrazów w zdaniu (możliwego tylko dzięki odmianom). Musisz nauczyć się więcej, żeby rozumieć tyle samo.

No i co z tego? To NIE JEST KONTRARGUMENT. Z (A => B) nie wynika (~A => ~B). Napisałem, że niezależnie od wysiłków i umiejętności pisząc kod w C++ projekt będzie wyglądał jak kupa g**a, jeśli jest pisany przez więcej niż jednego programistę i korzysta z zewnętrznych bibliotek. W wielu innych językach to twierdzenie nie zachodzi.

Mit. 99% projektów pisanych w Javie nie potrzebuje i nie korzysta z przenośności. Głównym czynnikiem jest to, że koszt wytworzenia oprogramowania jest ok. 3 razy niższy (przy tych samych pensjach programistów) niż w C++. A do tego mocno przyczynia się prostota języka.

Nie, ale tylko w C++ jest to tak zagmatwane, że się kompilatory gubią, a co dopiero programiści.

Ten, kto pisał kod. 80% programistów C++ nie wie, że istnieją inne rzutowania niż te z C.

Ten nie jest ani ładny ani użyteczny. Komunikat jest po to, żeby pomóc zlokalizować błąd. Tu raczej szybciej zlokalizuję błąd nie patrząc na komunikat, tylko czytając kod, który go zgłosił.


(Ostry2007) #20

Czyżbym dostrzegł pewną nieścisłość? :roll:

Przyglądać się mogą, ale jeśli MS nie udzieli mu wsparcia to świetlanej przyszłości mu nie wróżę.