Najgorszy język programowania na świecie

Matthew @ 2010-09-05 — Kategorie: Programowanie, Techblog

C++. I mógłbym w tym momencie zakończyć wpis, wszyscy by się ze mną zgadzali, a mała grupka fanatyków tego reliktu przeszłości by płakała po kątach jak to znowu wszyscy dyskryminują ich narzędzie pracy. Gdyby nie dwa ale. Pierwsze ale: jestem wrednym skurczybykiem, który czasami stara się wyjrzeć poza własne podwórko i przeważnie nie lubi się zgadzać z tym co gada tłum (bo tłum to bezmyślne stado baranów). Drugie ale: sam programuję C++ i lubię (nawet bardzo) ten „relikt przeszłości”. W ramach marudzenia na obecny stan rzeczy (jakikolwiek by nie był), postanowiłem naskrobać sobie ten nic nie wnoszący, beznadziejny, całkowicie niemerytoryczny wpis. Dla tych co potrzebują przeczytać coś mądrego zostawiam ostatni (a może dwa?) akapit. Enjoy.

Wszyscy narzekają na C++. Absolutnie wszyscy. Wielbicie C, że jest dla nich językiem zbyt wysokiego poziomu, pisanie w nim to lamerstwo a wydajność jest nieakceptowalna. Wielbiciele Javy, że nie widzą czy operator == to służy do porównywania referencji, adresów czy zawartości obiektu. Miłośnicy języków funkcyjnych, że nie wspiera paradygmatu funkcyjnego (w końcu to język programowania wieloparadygmatowego). Zwolennicy programowania obiektowego, że C++ z OOP niewiele ma wspólnego. Programiści C# (jak również Pythona i Javy), że nie ma tak rozbudowanej biblioteki standardowej, która by pozwalała na łatwe operacje po protokole HTTP czy przetwarzanie XML. Zapaleńcy Pythona, że C++ to w ogóle dziwny język jest, nieskładny gramatycznie, trudny to nauki. Wiedzą co mówią, w końcu ich jest tak doskonały, że z tej zajebistości musieli zaprojektować go jeszcze raz porzucając wsteczną kompatybilność (a co! Żeby nowym nie było za łatwo). Webmastery skrobiący w PHP/RoR/Django, że nie da się w nim łatwo pisać nowoczesnych stron internetowych. Pythonowcy piszący desktopowe aplikacji w Qt, że po co ktokolwiek jeszcze uczy się C++ i próbuje w tym programować okienka, skoro jest PyQt. Twórcy kompilatorów i IDE, że ciężko się go parsuje. W końcu sami programiści C++, że jest trudny w nauce, a nowy standard C++0x to wprowadza takie zamieszanie, że nic tylko schować się w kącie. I płakać nad tym, że nie słuchało się kolegów na studiach którzy programują w Javie/C#, bo teraz zamiast podjeżdżać do pracy w nowym czerwonym Ferrari, muszą pomykać rozklekotanym rowerkiem a ich boksy są w piwnicy bo nikt ich nie chce oglądać.

Tak więc, na C++ narzekają wszyscy. Nawet jego twórca. Cóż, trudno kochać takie kalekie dziecko. No bo jak to? Nie dość, że składnia jest trudna, momentami wręcz niespójna i pokręcona… to jeszcze trzeba ręcznie zarządzać pamięcią! Kto to widział? W XXI wieku! Gdzie bycie geekiem, jest niemal tak samo seksowne jak bycie wysportowanym, ociekającym testosteronem, miliarderem przechodzącym się po plaży w kąpielówkach uszytych ze studolarówek. Gdzie najsłabszy komputer kupiony w supermarkecie ma tyle pamięci, że nawet najnowszy Windows 8 się zgubi i nie będzie mógł się w niej odnaleźć. Ale kto to widział, żeby przy tych wszystkich udogodnieniach życia współczesnego, musieć się zajmować takim wrzodem na dupie, jak ręczne zarządzanie pamięcią? Kto by w dzisiejszych czasach przejmował się czymś takim jak wskaźniki i ich arytmetyka. Przecież to nawet gorsze niż nauka assemblera. Kto by pomyślał, że gwiazdka może służyć do czegoś innego niż mnożenie! Absolutny koniec świata.

Z tego wszystkiego żałuję, że nie mam takiej wiedzy i doświadczenia, żeby znać wszystkie wady C++ i kilka innych języków. Może bym mógł rzucić kilkoma merytorycznymi argumentami dlaczego C++ nie jest takie złe. Może i ma miejscami zwaloną gramatykę a od patrzenia na C++0x włos się na głowie jeży. Ale czy mamy jakieś godne następstwo dla niego? Szczególnie w dobie silnie rozwijającego się rynku urządzeń wbudowanych i komórek? Poraża mnie też taki durny argument, że C++ nie ma w bibliotece standardowej obsługi np. sieci. Tylko jak ją zrealizować? Java ma za sobą maszynę wirtualną, która jest swoistą warstwą abstrakcji między systemem a programem napisanym w Javie, więc wszystko co może zrobić VM może też program, poprzez ładnie podane biblioteki. Z Pythonem podobnie. Za C# to w ogóle stoi cały .NET i ten to pozwala na robienie cudów. A w zasadzie to robi magię, tylko mało kto wie jaką. Ale w sumie może, bo go nie obchodzą implementacje na inne systemy. A za takim programem w C++ chowa się już tylko system operacyjny. Tylko jak dobrze zaprojektować bibliotekę do takiej obsługi, gdzie prawie każdy system operacyjny ma to zrealizowane w inny sposób? Boost::Asio ma w środku klasy osobno na POSIX i Windows. A i tak nie masz pewności, że uda się ją skompilować na jakimś egzotycznym systemie. Tak samo, jak na takich egzotycznych platformach nie ma maszyny wirtualnej Javy, interpretera Pythona, że o C# nie wspomnę.

Pojawiają się pytania czy warto się uczyć C++ i do czego on może się jeszcze przydać. Pisałem już o nauce języka. Czy konkretnie C++? Jak na każde pytanie, odpowiedź brzmi: zależy. Od tego na jakiej platformie sprzętowej czy software’owej. Od wydajności, od dostępnych implementacji innych języków. Czy wreszcie od tego co program który piszemy, ma robić. Nie sądzę, żeby ten język zginął do czasu aż pójdę na emeryturę. Chociaż może się mylę? Może za 20 lat przyjdzie mi programować w jakimś nowym cudownym języku, który rozwiąże problem głodu na świecie, skończy wojny między krajami i zaprowadzi pokój na świecie? Z C++ jest jak ze starym wyścigowym samochodem. Trudno się go prowadzi, nie ma elektroniki która wspomaga kierowcę. Gdy mu się przyjrzeć, jest brzydki. Jeżeli na pierwszej lekcji jazdy, spróbujesz wcisnąć gaz do dechy wchodząc zakręt to masz pewność, że to jest Twoja ostatnia przejażdżka. Jednak, gdy już go opanujesz, wiesz że żaden inny samochód nie da Ci większej frajdy i poczucia jak bardzo jesteś żywy, przy pokonywaniu zakrętu będąc milimetry od wjechania na autostradę na tamten świat. Parafrazując Linusa Torvaldsa: czy nie tęsknicie za czasami, kiedy mężczyźni byli prawdziwymi mężczyznami i sami zarządzali pamięcią?
Dla tych, którzy chcą choć trochę poznać dlaczego C++ wygląda jak wygląda, polecam wywiad z Bjarne Stroustrupa w ostatnim SDJ.

Komentarze:

Jakoś udało mi się zapomnieć wpleść do wpisu. Ostatnio widziałem poradnik czego nie należy robić w C#. Jedną z pozycji było robienie przeciążanie metod, gdzie jedna wywołuje drugą, ale z ustalonymi parametrami, dzięki czemu dostajemy metodę, która zachowuje się tak, jak w C++ metoda z domyślnymi parametrami. Ale żeby było zabawniej, takie coś jak „domyślne wartości argumentów metod” w C# istnieje! Ja rozumiem, że można część rzeczy zwalać na maszynę (jak zarządzanie pamięcią), ale takie ogłupianie programistów to już chyba lekka przesada. Swoją drogą Java do tej pory nie ma domyślnych wartości argumentów metod.

Domyślne wartości są jeśli się nie mylę od c# 4.0, ale przeciążanie metod różni się od domyślnych wartości tym, że w 1. przypadku te wartości, są generowane po stronie samej biblioteki, a w 2. po stronie kodu z niej korzystającego.

A zawsze pozostaje wiara w język D.

Ja tam zawsze powtarzam że jak chcesz żeby coś działało szybko napisz to w C a jeżeli chcesz napisać to szybko to Python, Ruby czy inny Perl

@jakubmal: problem w tym, że ten język nie jest praktycznie używany. Microsoft ma swój C#. Apple Objective-C. W Linuksie C/C++, czasami coś innego. Jedyne praktyczne zastosowanie języka D które widziałem, to bodajże Worm.NET czy nawet całe rozszerzenia Worms Armagedon pisane przez programistów próbujących utrzymać tą grę przy życiu.

@XANi: poza obsługą wywołań metod wirtualnych (którą podobno programiści C i tak implementują na własną rękę) nie ma żadnych dowodów że C++ jest wolniejsze od C.

Zgadzam się z Tobą, a szczególnie z akapitem ostatnim. Może i kiedyś narzekałem na C++, ale gdy poznałem jego możliwości i przestałem popełniać głupie błędy, to mogę jedynie narzekać na skomplikowanie w słowach kluczowych np. static.

Niech ktoś wreszcie weźmie D (wersję 2.0), napisze mu porządną w pełni otwartą implementację i będzie po sprawie. Gdyby Walter Bright nie był takim starym pierdem i nauczył się wreszcie używać Gita to już dwa lata temu mielibyśmy piękny, powszechnie używany, naprawiony C++.

Na początku miał być rzucony flame za sam tytuł (fanatykiem nie jestem, ale to mnie ugodziło, jak się okazało – niesłusznie).
Co prawda to prawda: wszyscy narzekają na C++, ale ja nie zamierzam, a zwłaszcza na C++0x (lambda, mrr ^^). I przyznam, że gdyby nie bezpośredni dostęp do pamięci za sprawą wskaźników, to pewnie bym na Javie działał, choć nie cierpię jej bardziej niż Delphi. Otóż wskaźniki to potęga w programowaniu, przydaje się niezmiernie przy tworzeniu kontenerów, smart pointerów (i te całe garbage collectory z dotneta czy javy, mogą je w smart-pompki cmoknąć, zwłaszcza java, która nie raz krzaczy przez spieprzony GC).
Ostatni akapit – Wać dobrze prawisz, niechaj Ci Bóg w dzieciach wynagrodzi!
Więcej spamić zaletami c++ nie będę, bo wystarczyła tylko jedna, będąca przewagą nad innym ijęzykami – owe skromne, ale potężne wskaźniki :)

chyba płakała by po kĄtach, anie kONtach – pierwszy akapit

@PsichiX: lambda może i byłaby fajna w C++ (chociaż sam specjalnie nie czuję potrzeby jej używania) gdyby nie skomplikowana składnia… [](){} tak całkiem jasne w zapisie nie jest. Choć wygląda uroczo. ;D
I nie w dzieciach, ja jeszcze dziewczyny nie mam, żebym mógł mieć dzieci. ;P

@Niko: dzięki, poprawione

Na szczęście nie znam na tyle dobże języka c++ ,żeby znać jego wady. Gramatyka mi się podoba. Bardzo przyjemnie się pisze obiektowo, a wskażniki dają dużą swobodę. Jedyne ,za czym nie przepadam to Make, cmake qmake, imake i inne śmake-i ;)
(nie umiem go dobrze, ale cmake wydaje mi się najbardziej przejżysty)

Przydałoby się po napisaniu tego przeczytać i pomyśleć, czy wszystkie zdania mają sens. Niektóre zwroty są gramatycznie pozbawione sensu.

Właściwie mój powyższy komentarz z grubsza też :/ Tak to jest jak się w pośpiechu pisze. Pozdrawiam autora, tekst ciekawy.

Uważam, że zawsze trzeba dobierać odpowiedni język do danego zadania. C++ nadal króluje w domenie gier komputerowych, czy zaawansowanych aplikacji desktopowych. Warto zwrócić uwagę na tzw. managed C++ na platformie .NET, tam bibliotek jest pod dostatek, jest jeszcze Qt i Boost.

„teraz zamiast podjeżdżać do pracy w nowym czerwonym Ferrari, muszą pomykać rozklekotanym rowerkiem a ich boksy są w piwnicy bo nikt ich nie chce oglądać.”

Widziałem niedawno kilka ofert w Motoroli dla osób ze znajomością C/C++ i systemów wbudowanych, jakoś nie spodziewam się, że ci ludzie będą jeździć rowerami (a Ferrari to mają raczej np. ludzie znający C++ w QNX’ie niż wszędobylscy programiści C#/.NET).

Uważam, że nie ma większego sensu porównywać np. C++ i Java’y, ten ostatni język nadaje się np. do tworzenia usług sieciowych, czy pisząc ogólniej tzw. back-end’u klasy enterprise (Java EE, Spring, EJB itd.).

Replacement dla C++ się znajdzie (D choćby, a byłoby więcej, gdyby poszukać). Czemu się świat nie przerzuca na D? Bo C++ ma dwie zasadnicze wady:

a) Za dużo się w nim da. :) Brakuje delegatów? Wrzucamy FastDelegate i są – ktoś już napisał! Biblioteka standardowa uboga? Mamy masę cudów-wianków w Booście – też ktoś napisał! Czy nawet: Wolno się kompiluje? Ktoś wymyślił PCH, przebudujmy toolchain budujący pod PCH, jest nadal wolno, ale jakby ciut szybciej! Przez to, że pięciu ludzi na świecie rozumie szablony w C++ i robi metaprogramowe cuda, reszta jest pozbawiona luksusu konieczności przerzucenia się na nowszy język, który brakujące ficzery ma w standardzie.

b) Legacy systems. Nic dodać, nic ująć. Narzędzia do D można byłoby przy niedużym budżecie skończyć w miesiąc-dwa, by przegoniły toolchainy C++, ale nikt tego nie robi, bo i tak nie przeskoczy się faktu, że do C++ jest masa bibliotek i w C++ napisano już wielomilionowe rzeczy, których nikt dla samej wygody języka nie przepisze, bo szkoda pieniędzy na to.

Smutne :)

Z D jest taki problem, że wciąż stosunkowo mało osób, które mogłyby faktycznie pomóc w jego rozwoju, o nim słyszało. Przecież nawet była taka sytuacja, że rok po jego wydaniu Microsoft ogłosił, że robi „Język D do lepszego oprogramowywania sterowników czy czegośtam” i dopiero grupka programistów im uświadomiła, że ta nazwa jest już od dłuższego czasu zajęta i muszą wymyślić inną. Wsparcie komercyjne? Prawie zerowe. Wsparcie ze strony środowisk akademickich? Gdy wspominałem prowadzącym na uczelni, że istnieje takie coś, robili tylko wielkie oczy i pytali „O, a co to takiego?”

A szkoda, bo to pierwsza poważna próba przełamania hegemonii C++.

Fajny artykuł. W C++ piszę od około 3 lat i jest to język, który jak na razie mnie nie zawiódł. Raz, że szybki jeśli odpowiednio go używamy a z tego co widzę wiele osób ma z tym problem. Po drugie, robię w nim co chcę i jak chcę a jeśli czegoś naprawdę nie mogę to np. robię wstawkę z kodem asemblera. Mamy coś takiego jak wskaźniki, które pomimo swej prostoty są tak cholernie przydatne czego wiele osób bez doświadczenia nie rozumie, że później jak programista C++ przechodzi na C# czy Javę narzeka na ich brak. No ale programuję też czasem w C# i też bardzo lubię ten język szczególnie do aplikacji okienkowych, które pisze się szybko i przyjemnie.:)

Grzesiek Sz @ 16 grudnia 2010 o 01:51:

W Javie wskaźniki są w pewnym sensie wbudowane w sam język, ale na trochę innej zasadzie jak w C/C++ tzn. przez zmienne obiektowe, czyli referencje do obiektów. Przekazywanie parametrów do metody (funkcji składowej z C++) odbywa się na zasadzie przekazywania referencji przez wartość. Przykładowo przy przekazywania tablicy 100-elementowej do metody de facto kopiowana jest tylko referencja (czyli ten „wskaźnik”), co odpowiada przekazywaniu przez wskaźnik (nie referencję !) rodem z C/C++.

@waldeQ Jeśli piszesz pod Visual C++, to mogę polecić wtyczkę Visual Assist X, wprowadza wiele usprawnień, dzięki której pisze się mnie szybciej/sprawniej np. refaktoring z prawdziwego zdarzenia, podpowiadanie/uzupełnianie składni, snippety, tooltipy, innymi słowy „cywilizacja” w pisaniu kodu ;)

O C# może najlepiej świadczyć fakt, że kompletnie nie znając tego języka metodą „Google search” i „przeciągnij i upuść” w Windows Forms pisałem w jeden/dwa wieczory aplikacje do (nietrywialnych) metod numerycznych włącznie np. z wykresami.

W Visual C++ 2008 używałem wtyczki Visual Assist X. Niestety jednak trzeba za nią płacić jeśli chce się być uczciwym. W Visual C++ 2010 poprawiono naprawdę dużo jeśli chodzi o IntelliSense, nie denerwuje już tak swoją niestabilnością. To jednak wciąż nie jest to co mamy w Visual C# a o Visual Assist X już nie będę wspominał bo tam kod wygląda bajecznie i również bajecznie się go pisze oraz modyfikuje. :)

To ja tylko przypomnę, że Microsoft Microsoftem, ale Eclipse CDT 7 ma w standardzie pełny parser C++ pod maską i nie boi się z niego korzystać: dobrze działające podpowiedzi to najbardziej oczywista z jego korzyści (a z drobnostek – choćby osobne kolorowanie przeciążonych operatorów; niby nic, a takie drobne kwiatki cieszą :)). Za pół roku wyjdzie CDT 8, który będzie też robił analizę semantyczną w locie – kolorował i pozwalał poprawiać wiele błędów podczas pisania. Czekamy na odpowiedź MS :)

Grzesiek Sz @ 17 grudnia 2010 o 12:04:

Jak najbardziej miałem na myśli wersje „kupną” (zawsze można to potraktować jako inwestycję w narzędzie pracy). C# jest znacznie łatwiejszy do parsowania/analizy niż C++ (ew. do tego pierwszego jest jeszcze wtyczka Resharper).

@Kos A istnieje możliwość podpięcia kompilatora cl.exe pod CDT ? Eclipse bardzo cenię np. jako IDE do Javy (JDT), gdzie refaktoring, zarządzanie importami, generowanie akcesorów/mutatorów, formatowanie kodu etc. jest „od ręki” plus masa przydatnych plugin’ów.

Na bazie Eclipse powstało też np. IDE QNX Momentics Tool Suite (właśnie dla C/C++).

Stary ten temat, ale i tak dodam komentarz.

Niejakiej javy próbowałem się uczyć nie powiem ile czasu, i bez kopiowania ‚komend’ niewiele mogłem zdziałać.

W końcu postanowiłem przeżucić się na coś innego. Uczyłem się wielu języków. Delphi, php i html(na podstawach skończyłem). W końcu nadeszła pora na c++. I moge powiedzieć jedno. Nie trzeba znać całego by napisać przydatny program. Będę się uczyl tego języka nadal, tego jestem pewien. Polecam ten język kazdemu przyszłemu programiscie.

Na Windows 8 to najlepiej pisać w C++. Puki co do lamusa nie odejdzie.

autorze czemu az tak sie snobujesz?

Do kwietnia tego roku C++ 4 na liście najpopularniejszych języków świata. Stary ale jary :P Artykuł ciekawy ;)

Pingback: Najgorszy język programowania na świecie? | matura rozszerzona – informatyka

Dodaj komentarz:

 

Subscribe without commenting