ubuntuusers.de

Open Source Projekte: C vs. C++ (Allgemeine Frage...)

Status: Ungelöst | Ubuntu-Version: Nicht spezifiziert
Antworten |

Xubaso

Anmeldungsdatum:
14. März 2009

Beiträge: 23

Hallo,

ich habe schon ein paar Jahre Erfahrung als Anwendungsentwickler mit C#, möchte aber gerne auch C und/oder C++ lernen, um u.a. bei Open Source Projekten mithelfen zu können, sei es nun Bug-Hunting oder programmieren...

(Disclaimer: Ja, ich kenne Mono und nein, mir geht es wirklich darum, C und/oder C++ zu lernen)

Momentan lese ich das Buch "Die C++ Programmiersprache" von Bjarne Stroustrup und alter Schwede Däne, mir wird jetzt erst grob bewusst, wie kompliziert programmieren tatsächlich sein kann, wenn man eine Sprache mit vergleichsweise uneingeschränkten Möglichkeiten verwendet..

Laut http://www.blackducksoftware.com/oss/projects#languageos werden die meisten Open Source Projekte mit C (44%) entwickelt, gefolgt von C++ (13%)

Den Vorteil für C sehe ich darin, dass das Konzept der Sprache deutlich leichter zu verstehen ist, als das von C++ (Geringerer Sprachumfang → weniger Überraschungen...)

Der Vorteil von C++ wiederum ist, dass es auch alle für die Anwendungsentwicklung hilfreichen Techniken gibt (Klassen, Exceptions, Templates usw.)

Lange Einleitung, kurze Frage: Wie seht Ihr das?

Evtl. habt Ihr ja ein paar Praxistipps, Ratschläge oder Erfahrungen für mich..

Danke & Gruß, xubaso

Nefarius

Avatar von Nefarius

Anmeldungsdatum:
11. Dezember 2008

Beiträge: 1275

Hi,

ich bin auch hauptsächlich mit C# unterwegs (in der Windows Welt 😉) und habe mich vor ca. einem Jahr wieder intensiver mit C/C++ beschäftigt. Ich bin ein - für meine Verhältnisse - großes Projekt angegangen und habe mir eingebildet, dass es rein in C sein soll. Seit ner Woche schreibe ich alles was geht auf C++ um, objektorientierte Programmierung hat gegenüber prozeduraler dermaßen viele Vorteile, dass sich das Aneignen der wirren C++-Syntax bezahlt macht ☺ Soviel zu meinen Erfahrungen...

MfG
Nefarius

TraumFlug

Avatar von TraumFlug

Anmeldungsdatum:
16. Juli 2009

Beiträge: 999

Wohnort: zwischen den ohren

da hier sonst kaum jemand antwortet...vorab: ich bin nichtakademischer "Hobbyist" mit wenig erfahrung, kein experte...leg' nicht zuviel gewicht darauf was ich hier schwätze, ich hab' einfach langeweile... 😉

zunächst einmal muss man sehen, dass die open source/gnu/linux welt stark aufbauend auf bibliotheken ist. für jedes anwendungsgebiet gibt's quasi schon eine bibliothek, die einen gewissen funktionsumfang bereitstellt oder vereinfacht. anders als in der kommerziellen welt, wo man (wohl) lieber alles aus eigener hand macht, oder gekaufte lösungen mit dem produkt gleich mitliefert, gibt es innerhalb dieses speziellen kosmoses keine rechtlichen/finanziellen hürden, und es ist sogar erwünscht, im funktionsumfang möglichst wenig redundanzen und bibliothekskonflikte zu erzeugen. zumal die entwickler recht viel zeit und energie sparen können, wenn sie sich in bezug auf bestimmte funktionalitäten ihres programmes auf die betreuer der jeweilig dafür genutzten komponenten verlassen: hier klappt das zusammenspiel oft überraschend gut!

wenn nun jemand eine bibliothek bereitstellt, die einen begrenzten funktionsumfang für die eigentlichen anwendungen anbieten soll, so will derjenige natürlich, dass sie nicht nur unter c++ funktioniert, sondern auch unter reinem c, python, java, scala, ruby, assembler (für masochisten oder sudoku-fans...) und unter was nicht allem sonst noch, das genutzt werden kann, um programmlogiken zu definieren. dafür eignet sich nunmal reines c am allerbesten:

die programmiersprache c ist, wie du selbst schon angemerkt hast, sehr einfach gehalten in ihren sprachlichen werkzeugen, aber dabei durchaus mächtig. sie spiegelt den programmablauf im eigentlich ausgeführten maschinencode sehr gut wieder: es gibt wenig impliziertes verhalten - aus meiner sicht neben der eigentlichen übersetzung in maschinensprache samt optimierungen nur in etwa das, was die genutzen bibliotheken im hintergrund machen und die "calling convention" zwischen bibliotheks-/funktionsaufrufen. deswegen ist es sehr leicht, c-programme oder -bibliotheken auch in andere sprachen zu übernehmen, auch wenn deren grundkonzepte die objektorientierte programmierung nicht beinhalten.

c++ wiederum ist wie ein c, dass man um gewisse implikationen und stilmittel erweitert hat, um den eigentlichen akt der programmierung von mittleren bis grossen systemen zu beschleunigen und zu vereinfachen: templates (stark verbesserter macro-mechanismus um grundkonzepte mit einem schlag auf verschiedene anwendungsgebiete zu bringen), klassen und vererbung (vereinfachen objektorientiertes programmieren immens), operatoren und overloading (vereinfachen stark den quelltext in vielen anwendungsgebieten, auch die verständlichkeit dessen), namespaces (halten den raum für eindeutige variablen/funktionsnamen frei, wo man unter reinem c immer diffenrenzieren musste) und zuguterletzt ganz andere standardbibliotheken und die standard-templates, die oft genutzte standardfunktionen, und auch dinge, die man unter c von hand oder mit drittbibliotheken machen musste, in einer art und weise verpacken, die eine ganz andere programmierphilosophie wiederspiegeln als bei reinem c.

dabei kann man durchaus unter "c++" auch im c-stil programmieren, und auch die ganzen standardbibliotheken von c problemlos nutzen - haarspalter und puristen werden dann immer im sinne der portablität und sprachreinheit meckern, aber: "es funktioniert". wobei es dann natürlich immer den "nachteil" des "name-mangling" gibt, der wohl auch mit einer der gründe ist, dass grundbibliotheken eher in c als in c++ gehalten werden, um die anbindung zu vereinfachen.

genauso kann man eigentlich alles, was in c++ möglich ist, auch in c umsetzen. auch objektorientierte programmierung mit allen feinheiten. man muss nur eben wesentlich mehr fussarbeit leisten, und der code selbst wird schnell unübersichtlich und unintuitiv, und ausserdem von der textmenge her für aussenseiter/neueinsteiger des projektes unverständlich ohne lange, mühsame einarbeitung.

deswegen ist es oft so, dass c-bibliotheken von c++ "end"-anwendungen genutzt werden. die grundfunktionalitäten, die oft nicht so überragend komplex sind, dass sie erweiterte oder komplexe objektorientierung benötigten fliessen so in ein komplexeres rahmenwerk ein, dass die eigentliche anwendung darstellt. für viele populäre (c)-bibliotheken gibt es zudem c++-übersetzungsbibliotheken ("c++ wrapper"), die die funktionalität der bibliothek in mehr oder weniger guter objektorientierter c++-mentalität wiederspiegeln, so dass das c++ projekt nichtmal stilistisch auf dem "prozeduralen" pfad zwischenschritte machen muss. in den meisten einfacheren fällen, die mir bis jetzt so unter die augen gekommen sind, werden aber c-bibliotheken im c-stil benutzt, und in die objektorientierung eingegliedert: das ist ja das schöne, es schliesst sich nichts gegenseitig aus. je komplexer der zusammenhang aber ist (z.b. gtk als "komplexe" bibliothek gegen sowas wie libsndfile als "schlichter spezielfunktionsbereitsteller"), desto eher werden c++ programmierer danach trachten, die funktionalität der bibliothek im c++-stil in ihre anwendung zu integrieren.

aber abseits davon sehe ich das mitlerweile so, dass die sprache fast egal ist...die funktionskonzepte in der "maschine", die man zusammenbaut sind viel wichtiger! und nicht nur wie sie eigentlich funktioniert, sondern auch wie man den bauplan (= quellcode, build-environment...) organisiert. da steckt meiner ansicht nach, neben der erfindung von besonders effizienten algorithmen für bestimmte problemlösungen, das hauptgenie eines wirklich guten programmierers. und das kriegt man selten gut vermittelt. ich denke etwa 60% an der arbeit an einem etwas grösseren programm sind schon getan, wenn man programmstruktur, schnittstellen und modularisierung sauber durchgeplant hat. tut man's nicht, und hackt einfach d'rauf los, erlebt man schnell frustrationen und überraschungen, und muss die planungsarbeit im zweifel "am lebenden objekt" nachholen, mit allen kompromissen, neuanpassungsarbeit und zeitverlust, der damit verbunden ist.

Xubaso

(Themenstarter)

Anmeldungsdatum:
14. März 2009

Beiträge: 23

Hi, erstmal Danke für eure Antworten an Nefarius und TraumFlug. Für den Anfang halte ich es wie Nefarius und lerne erstmal C++, damit ich die gewohnten OOP Elemente weiterverwenden kann. Aus TraumFlugs Antwort kann ich ein wenig erahnen (Mensch hast du eine Menge geschrieben ^^) warum trotzdem C noch so viel mehr als C++ verwendet wird... da gehört bestimmt einige Erfahrung zu das aus dieser Perspektive sehen zu können.

Nefarius

Avatar von Nefarius

Anmeldungsdatum:
11. Dezember 2008

Beiträge: 1275

Hi,

versteh mich nicht falsch, ich habe sehr wohl auch C sowie C++ gelernt, nur habe ich bei meinem aktuellen Projekt festgestellt, dass ich viel produktiver bin, wenn ich gewisse Teile in Klassen packe, Vererbung, Singletons usw. anwende. Trotzdem finden sich noch einige Teile wieder, die in C gehalten sind (ich gehöre auch zu dem Pack, das die Sprachen mischt 😉) und sehr gut zusammenspielen. Eins noch: der Debugger ist dein Freund, nicht dein Feind 😀

MfG
Nefarius

der_alex1980

Anmeldungsdatum:
7. November 2007

Beiträge: 112

Xubaso schrieb:

ich habe schon ein paar Jahre Erfahrung als Anwendungsentwickler mit C#, möchte aber gerne auch C und/oder C++ lernen, um u.a. bei Open Source Projekten mithelfen zu können, sei es nun Bug-Hunting oder programmieren...

Ich würde den umgekehrten Weg gehen. Such dir ein Projekt, das dich interessiert und lern dann die entsprechende Programmiersprache.

DeJe

Anmeldungsdatum:
2. Januar 2008

Beiträge: Zähle...

Sehr erstaunlich, das noch so viele Projekte mit C erstellt und sogar gestartet werden.

Ich programmiere seit Jahren in C und C++. Dabei aber immer die jeweilige Sprache für die jeweilige "Anwendung". Gut, ich komme aus der System-Ecke. Treiber verbleiben im C-Space. Tools und UI mit C++. Das ist vielleicht etwas altmodisch, aber ich habe insbesondere im Kernel (egal ob Linux, AVR oder Windows) gern Kontrolle darüber, was gerade passiert. Und nach Assembler hat C den kleinsten Overhead.

C++ ist dagegen sehr bequem. Für Tools oder UI spielt es auch weniger eine Rolle ob der MM gerade mal der Meinung ist, zum unpassenden Zeitpunkt seinen Speicher aufzuräumen oder der Callstack ganze Bücher füllt. 😉

Lange Rede kurzer Sinn, für alles über Kernel-Space würde ich C++ nehmen. Aber man sollte sich nicht täuschen, C++ schränkt mehr ein als C. C ist letztlich ein "lesbarer" Assembler-Code. Machbar ist mit C Alles. Halt teilweise umständlicher, fehleranfälliger, undurchsichtiger, ... Möchtest du auch in den Kernel-Space abtauchen, lerne C, wenn nicht dann lieber C++.

Antworten |