Forum: PC-Programmierung Was ist modernes C?


von Christopher (Gast)


Lesenswert?

Hallo,

ein C Buch durchzuarbeiten und ein bisschen damit herumexperimentieren 
ist eine Sache, mit C ein richtiges Programm zu schreiben, eine ganz 
andere Sache. Mir fehlt es nicht an Verständnis sondern mir fehlt ein 
Konzept wie ich C benutzen soll. Wie sieht modernes C aus? Jeder kennt 
diese prähistorische prozeduralen C-Codebeispiele, aber das ist nicht so 
der Hit, wenn das Programm mal ein bisschen größer wird, leidet die 
Übersicht doch schnell darunter. Deshalb wurde wohl auch OOP und C++ 
erfunden. Oder ist PP immer noch konkurrenzfähig? Mir jedenfalls ist C++ 
überhaupt nicht sympatisch, zu überladen, zu hässlich (Template-Hölle), 
wird doch schnell unübersichtlich und die Kompilierzeiten sind ein 
Graus. Aber mit C++ kann man halt tolle Sachen machen, wie z.B. 
SmartPointer (RAII). Leider vermisst man doch schnell die guten Seiten 
von C++, sowas wie SmartPointer kann man in C einfach nicht so toll 
umsetzen, da fehlt einfach der automatische Destruktoraufruf. Sowas muss 
man in C halt selbst erledigen, wenn man das aber mal schnell vergisst, 
gibts gleich ein Speicherleck. Solche modernen Techniken fehlen mir in C 
einfach. Deshalb kann ich mich zwischen C und C++ nicht entscheiden.

Die Frage ist also, gibt es in C auch solche tollen Techniken/Tricks und 
wie sieht modernes C aus? Ich hab mir schon mal den Quellcode von 
Blender runtergeladen und angeschaut, um allerdings schlau daraus zu 
werden, muss man sich richtig hineinarbeiten.

Danke.

: Gesperrt durch User
von hunz (Gast)


Lesenswert?

Geht mir mit C++ genau so, deswegen bleib ich auch lieber bei C.
Ein schönes Beispiel ist z.B. DirectFB: 
http://directfb.org/index.php?path=Development%2FSource+Code%2FGIT+Access
SDL ist glaub ich auch recht sauber: 
http://www.libsdl.org/download-1.2.php

Habe mir auch angewöhnt, alles in verschiedene structs aufzuteilen die 
dann mit typedef definiert werden. Die Funktion bekommt dann immer nen 
Pointer auf ihren Kontext. Um das destroy muss man sich natürlich noch 
selber kümmern, aber so hat man nicht kiloweise globale Variablen und 
kann mehrere Instanzen anlegen.

von Jürgen (Gast)


Lesenswert?


von Christopher (Gast)


Lesenswert?

Danke hunz das sind wirklich gute Beispiele, die werd ich mir genauer 
anschauen.

Das Prinzip mit den Strukturen als Klasse habe ich mir auch schon 
angewohnt. Ich habe auch schon angefangen mir ein kleines Framework zu 
schreiben, dass mit solchen Strukturen funktioniert (Strings, etc.). 
Selbst ein Exceptionsystem habe ich eingefügt (TRY, CATCH, ENDTRY), 
funktioniert auch gut, nur der FINALLY Block fehlt noch. Die 
Funktionsspünge werden mithilfe von longjmp() realisiert. Ein throw() 
ohne TRY lässt das Programm mit abort() abbrechen. Sowas finde ich 
einfach praktisch, da man nicht ständig die Rückgabewerte prüfen muss, 
was sehr lästig sein kann. Was mir vorallem fehlt ist ein ausgeklügeltes 
Speichersystem, dass die Ressourcen automatisch freigibt wenn sie nicht 
mehr benötigt werden, sowas wie SmartPointer eben. Aber so wie es 
aussieht muss ich das per Hand machen, immer noch besser als C++. Ich 
habe auch versucht in jede "Klasse" einen Referenzzähler einzubauen, ist 
allerdings lästig bei jeder Klasse einen zu implementieren. Vielleicht 
fällt mir noch was ein.

von Christoph (Gast)


Lesenswert?

> Darauf kann es nur eine Antwort geben: Überflüssig.
So, in welcher Sprache programmierst du dann?
BASCOM, oder was?

von Sven P. (Gast)


Lesenswert?

Christopher schrieb:
> [...]
Ich kenne das Problem...

> immer noch besser als C++.
Das ist aber der falsche Ansatz. Du implementierst da Zeugs, das es 
schon gut getestet gibt. Benutze doch einfach C++. Es zwingt dich ja 
niemand, auch den ganzen STL-Krams mitzunehmen und so weiter.

Das wäre auch m.M.n. das Imageproblem von C++: Mit Templates und 
solcherlei kann man ganz wunderbar akademische Kuriositäten 
konstruieren, die STL fällt für mich auch darunter. Ich finds schon 
toll, was die Sprache alles zu leisten vermag und wie elegant man 
komplexe Algorithmen, ja sogar komplette formale Sprachen damit 
formulieren kann. Benutzen möchte ich die Ungetüme aber eigentlich 
nicht... siehe Boost, zum Bleistift. Warten/pflegen/debuggen möcht ich 
das schon dreimal nicht.

Muss ich ja auch nicht. Du auch nicht.

Mit deinen Longjumps da, das hab ich auch schonmal gemacht. Ist aber 
weder elegant noch effizient -- letztlich strickst du wieder Krempel mit 
Makros um irgendwelche for-Schleifen drumherum. Und umgehst damit wieder 
eine Sache, die du gleichzeitig an C++ ankreidest.


Ach und was C angeht: Es gibt Leute, die haben sich damit ernsthaft 
auseinandergesetzt und ein paar wichtige Gedanken dazu halbwegs 
begriffen. Für alle anderen ist C einfach nur blöd, wie immer.

von Sven P. (Gast)


Lesenswert?

Ja, du hast jetzt genug herumgetrollt, wir habens ja begriffen.
><((((º>)

von Joachim D. (Firma: JDCC) (scheppertreiber)


Lesenswert?

guenni schrieb im Beitrag #2883508:
> Dann bricht endlich die Ära von lauffähigen Programmen an, welche von
> redlichen und aufrichtigen Programmierern angefertigt werden und nicht
> von diesem lichtscheuen Kellergesindel mit heftigem Juckreiz im Schritt!

Dann kommt der BWLer mit einem Java ... :-)))

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Dieses Forum ist nicht dafür da, unstrukturiert in der Gegend 
herumzupinkeln, und deswegen habe ich das Getrolle entsorgt.

von Christopher (Gast)


Lesenswert?

Ich habe schon von Leuten gehört, welche Assembler vergöttern und C 
Gefrickel nennen, sonderbare Welt! ;)

Sven P. schrieb:
> Mit deinen Longjumps da, das hab ich auch schonmal gemacht. Ist aber
> weder elegant noch effizient -- letztlich strickst du wieder Krempel mit
> Makros um irgendwelche for-Schleifen drumherum. Und umgehst damit wieder
> eine Sache, die du gleichzeitig an C++ ankreidest.

Naja Exceptions sind nicht das, was C++ schlecht macht, nein ich finde 
sie sogar nützlich und sinnvoll. Ich habe vor kurzen versucht einen 
XML-Tokenizer zu schreiben, das ewige "if (c == EOF) ...;" hat dann 
genervt, deshalb habe ich mir gedacht sowas wie try, catch, etc. 
einzufügen. Das Problem ist wohl, dass ich aus C versuche C++ zu machen. 
Das ist natürlich nicht so sinnvoll. Aber es ist doch genial was alles 
mit C möglich ist, oder?

von Frank M. (aktenasche)


Lesenswert?

du musst erstmal definieren, was ein "richtiges" programm ist.
jede programmiersprache hat ihren anwendungsbereich.

ich würde spontan zB sagen

c -> hardwarenah/µC
c++ -> hardwarenah, bedingt GUI geeignet (qt: -= bedingt)
.net -> GUI, bedingt hardwarenah
java -> plattformunabhängig
php -> web

du scheinst ja profi zu sein, was C angeht, im gegensatz zu mir (eigtl 
c# only).
ich persönlich glaube, dass PP bzw C durchaus noch eine 
daseinsberechtigung hat, insbesondere wenn es um performance geht. für 
große projekte kann mans aber (als einzelperson) vergessen.

an programmen wie blender oder vlc arbeiten ja ein haufen leute, von 
denen jeder seinen fachbereich hat.

insbesondere "quick and dirty" geht mit neueren programmiersprachen 
wesentlich besser. der code ist auch besser von aussenstehenden wartbar, 
da diese kein großes tieferes verständnis (pointer etc) brauchen.

sorry dass ich die frage nicht beantwortet habe, wollte das einfach mal 
loswerden in dem kontext ^^

von Christopher (Gast)


Lesenswert?

Vom C Profi bin ich leider noch weit entfernt, ich kenn die C 
Standardbibliothek z.B. noch nicht auswendig.^^

Ja natürlich, jede Programmiersprache hat ihren Anwendungsbereich, mit C 
möchte ich lieber keine Datenbankanwendung schreiben, das mach ich dann 
doch lieber mit C# oder Java.
Das interessante ist, dass ich auch aus der C# Ecke stamme, schon damals 
hat mich der Low-Level Bereich fasziniert (OpenGL/DirectX). Mir ist 
öfters mal in den Sinn gekommen, mit C oder C++ anzufangen, da diese 
Sprachen ja quasi dafür geschaffen sind. Die konnten mich allerdings 
nicht überzeugen, ich sah den Sinn einfach nicht. Da ich das alles ja 
auch mit C# machen konnte und ich ein riesiges Framework zur Verfügung 
hatte. Später fing ich an zum Embedded/µC zu wechseln und da fing ich 
mit C richtig an. C wurde zu meiner Lieblingssprache, die ich jetzt auch 
auf den Computer nutze, jedenfalls wenns noch um Grafik oder andere 
Low-Level Dinge geht, ansonsten C#.

von Karl H. (kbuchegg)


Lesenswert?

Christopher schrieb:

> einzufügen. Das Problem ist wohl, dass ich aus C versuche C++ zu machen.

Genau das tust du gerade.
Und nein: ist nicht sinnvoll.
Da kannst du auch gleich einen C++ Compiler benutzen. Als besseren C 
Compiler.

> Das ist natürlich nicht so sinnvoll. Aber es ist doch genial was alles
> mit C möglich ist, oder?

Wenn man bedenkt, dass es C++ Compiler gibt, deren Output C ist (die 
also C++ auf C zurückführen um dann einen C-Compiler die Drecksarbeit 
machen zu lassen), dann ist das weit weniger verwunderlich als du jetzt 
denkst.

von Joachim D. (Firma: JDCC) (scheppertreiber)


Lesenswert?

Christopher schrieb:
> Vom C Profi bin ich leider noch weit entfernt, ich kenn die C
> Standardbibliothek z.B. noch nicht auswendig.^^

Mußt Du auch nicht, C ist eher eine Denkweise.

von Cyblord -. (cyblord)


Lesenswert?

Das was der TE sucht lernt man leider nicht in einem Forum. Man kann 
Programmiersprachen lernen in dem man ein Buch liest, aber niemals 
programmieren oder gar Softwareentwicklung. Wie bei vielem anderen auch, 
ist das Kunst und Handwerk in einem und kann nur durch Erfahrung und 
Übung erlernt werden.

gruß cyblord

von Vlad T. (vlad_tepesch)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Wenn man bedenkt, dass es C++ Compiler gibt, deren Output C ist (die
> also C++ auf C zurückführen um dann einen C-Compiler die Drecksarbeit
> machen zu lassen), dann ist das weit weniger verwunderlich als du jetzt
> denkst.

gibt es sowas noch?
kannst du einen nennen? ich hatte vor einer weile mal gesucht, bin aber 
nicht fündig geworden.

von Karl H. (kbuchegg)


Lesenswert?

Vlad Tepesch schrieb:


> gibt es sowas noch?
> kannst du einen nennen?

CFront fällt mir da als aller erstes ein.
Und wenn mich nicht alles täuscht, hat Greg seinen Compiler davon 
abgeleitet und weiter entickelt. Such mal nach Greg Comeau C++

von Christopher (Gast)


Lesenswert?

Ok, da frage ich mich doch was ist C?
Exception/Try,Catch,... ist kein C, das haben wir ja geklärt.
Aber was ist mit OOP? C ist ja eigentlich von Natur aus prozedural, hat 
allerdings auch Werkzeug mit den man sich Objekte basteln kann, 
Strukturen + Funktionen, schon hat man die Datenkapselung. Ich denke, 
dass C nicht auf PP beschränkt ist.

Was ich damit meine ist:
1
typedef struct Object
2
{
3
  int a, b;
4
};
5
6
Object* obj_create(int a, int b);
7
void obj_destroy(Object* obj);
8
int obj_foo(Object* obj, int bar);
Nur ein Beispiel.

Ist ein SmartPointer C? Klar das Konzept kommt, so denke ich, aus C++. 
Und gibt es eine gescheide Implementierung? Oder sollte ich einfach 
einen Refernzzähler in meine "Klassen" einbauen? Oder gar darauf 
verzichten und altes, bewährtes malloc/free (ich weiß darüber lässt sich 
streiten) nutzen?

cyblord ---- schrieb:
> Das was der TE sucht lernt man leider nicht in einem Forum. Man kann
> Programmiersprachen lernen in dem man ein Buch liest, aber niemals
> programmieren oder gar Softwareentwicklung. Wie bei vielem anderen auch,
> ist das Kunst und Handwerk in einem und kann nur durch Erfahrung und
> Übung erlernt werden.

Ja natürlich hast du da recht, Programmieren ist gute alte Handarbeit, 
aber ich habe leider keinen Lehrmeister/Professor der mir erklärt wie 
ich vorgehen soll.

von Christopher (Gast)


Lesenswert?

Ich seh grad, der Typ fehlt:
1
typedef struct Object
2
{
3
  int a, b;
4
} Object;

von Karl H. (kbuchegg)


Lesenswert?

Christopher schrieb:
> Ok, da frage ich mich doch was ist C?
> Exception/Try,Catch,... ist kein C, das haben wir ja geklärt.
> Aber was ist mit OOP? C ist ja eigentlich von Natur aus prozedural, hat
> allerdings auch Werkzeug mit den man sich Objekte basteln kann,
> Strukturen + Funktionen, schon hat man die Datenkapselung. Ich denke,
> dass C nicht auf PP beschränkt ist.

Natürlich kannst du das machen.
Das ist ja nicht die Frage. Aber um bei deinem Beispiel zu bleiben: 
Nimmst du einen C++ Compiler, dann schreibst du
1
struct Object
2
{
3
   Object( int a, int b );
4
   ~Object();
5
6
   int a, b;
7
8
   int obj_foo( int bar );
9
};

und hast #genau# das gleiche. D.h. fast. Denn in deinem C-Beispiel 
darfst #DU# nicht vergessen, die create bzw. destroy Funktion 
aufzurufen. In C++ KANNST du es nicht vergessen, weil sich der Compiler 
darum kümmert, dass der Constructor bzw. Destructor aufgerufen wird.
Aber ansonsten ist das 1:1 identisch zu deinem C-Beispiel.

> Ist ein SmartPointer C? Klar das Konzept kommt, so denke ich, aus C++.
> Und gibt es eine gescheide Implementierung? Oder sollte ich einfach
> einen Refernzzähler in meine "Klassen" einbauen? Oder gar darauf
> verzichten und altes, bewährtes malloc/free (ich weiß darüber lässt sich
> streiten) nutzen?

Der springende Punkt ist auch hier:
Damit das alles ordentlich funktioniert MUSST du deinen C-Programmierer 
in die Pflicht nehmen. Er DARF NICHT vergessen die entsprechenden 
Funktionen auch aufzurufen.
In C++ kümmert sich aber der Compiler darum, dass Ctor und Dtor 
aufgerufen werden. Und zwar IMMER. Wird ein Objekt erzeugt, wird ein 
Constructor aufgerufen. Wird ein Objekt zerstört, zb weil es aus dem 
Scope geht, wird der Destructor aufgerufen. Du kannst das nicht 
vergessen und hast damit einen Teil der Verantwortung an den Compiler 
übertragen, der das rigoros durchzieht. Der C++ Compiler kann dich in 
dem Sinne unterstützen, indem er dir stupide #MUSS# Regelungen abnimmt, 
die man als menschlicher Programmierer schon gerne mal vergisst.

Wenn du in diese Richtung gehen willst, dann würde ich dir sehr ans Herz 
legen, deinen C-Compiler beiseite zu legen und dir statt dessen einen 
C++ Compiler zu nehmen. Niemand sagt, dass du sofort mit Templates 
rummachen musst. Du kannst im wesentlichen erst mal so weiter 
programmieren, wie du es von C gewohnt bist. Nur eben mit den kleinen 
'Hilfen', die dir C++ zb in Form der Ctors und DTors an die Hand gibt.

In diesem Sinne programmierst du zwar immer noch so gesehen C, hast aber 
einen zusätzlichen Nutzen durch die Verwendung des C++ Compilers. Und im 
Laufe der Zeit, wirst du noch so manch andere Feature von C++ kennen und 
schätzen lernen.

Das man diese Dinge mit C auch machen kann, steht ausser Frage. 
Natürlich kann man. Aber es ist ein Unterschied ob ich als Programmierer 
dabei keinen Fehler machen darf, oder ob mir der Compiler die Dinge von 
vorne herein fehlerfrei implentiert, mich so entlastet und ich mich um 
das eigentliche Problem, die Programmlogik kümmern kann.

von Vlad T. (vlad_tepesch)


Lesenswert?

Karl Heinz Buchegger schrieb:
> CFront fällt mir da als aller erstes ein.
> Und wenn mich nicht alles täuscht, hat Greg seinen Compiler davon
> abgeleitet und weiter entickelt. Such mal nach Greg Comeau C++

das kostet ja geld

von Christopher (Gast)


Lesenswert?

Ja zum Einen bin ich von den C++ Features angetan und zum Anderen bin 
ich von C++ abgestoßen. Ich denke, dass ich C++ doch noch eine Chance 
geben sollte und dass es eigentlich sinnvoller wäre C++ zu nehmen.

von Georg A. (georga)


Lesenswert?

> und dass es eigentlich sinnvoller wäre C++ zu nehmen.

Genau. Zumindest um schon mal die //-Kommentare rechtmässig verwenden zu 
dürfen ;)

von dvfgvxcvbx (Gast)


Lesenswert?

C++ ist bei Weitem komplexer als C!
Und dabei ist C ja schon nicht so einfach.

Nachdem ich nun seit einem halben Jahr in der Arbeit nur noch C++ 
programmiere, möchte ich nicht mehr zu C wechseln. Der Umstieg war hart, 
aber die Möglichkeiten von C++ sind doch viel größer.

Templates machen auch Sinn, genauso wie die STL absolut spitze ist - 
wenn man sich mal damit beschäftigt hat. vector<T> ist seitdem mein 
bester Freund geworden;-)
Mit malloc/free (new/delete) kommt man zum Glück auch seltener in 
Berührung durch Verwendung von boost::shared_ptr<T> und vector (oder ein 
anderer STL Container) als Ersatz für dynamsiche Arrays.

Insgesamt würde ich dir raten, dich nochmal mit C++ genau 
auseinanderzusetzen. Wenn du danach sagst, dass es nichts für dich ist, 
ok.
Aber nur mal schnell C++ überfliegen bringt nichts. Man muss sich schon 
mal ein paar Wochen hinsetzen und auch was programmieren, um die 
Grundprinzipien zu verstehen!

Buchtipp: "Der C++ Programmierer"

Jedenfalls lernst du mit C++ wirklich ordentlich programmieren, im 
Gegensatz zu solch komischen Erfindungen wie C#.

von Klaus W. (mfgkw)


Lesenswert?

Was viele einfach nicht verstehen wollen, ist:

C++ hat vieles, was man nicht nehmen MUSS - wenn es nicht angemessen 
ist.

Man kann sich von allen Features genau die nehmen, die gerade sinnvoll 
sind.
Nimmt man keine, heißt der Quelltext halt .cpp statt .c und fertig, 
keine Erweiterungen, keine Nachteile.

Echte OOP-Programmierung wird das erstmal nicht, aber dafür soviel 
Fortschritt gegenüber C wie man möchte.

Gerade bei uC-Programmierung pickt man sich das heraus, was dafür gut 
ist, und ignoriert einfach den ganzen Rest.
Wenn ein AVR nicht mit Exceptions und der STL zurecht kommt, wäre es 
borniert, deshalb auf Klassen und templates zu verzichten.

Von den vielen kleinen nicht-OOP-Verbesserungen ganz zu schweigen.
Ich kann nicht verstehen, daß Leute immer noch über reines C schimpfen, 
es aber trotzdem nehmen.

von Sven P. (Gast)


Lesenswert?

Vlad Tepesch schrieb:
> gibt es sowas noch?
> kannst du einen nennen? ich hatte vor einer weile mal gesucht, bin aber
> nicht fündig geworden.

Comeau. Das dürfte auch quasi der einzige C++-Compiler sein, der C++ 
wirklich nahezu vollständig unterstützt, einschließlich externer 
Templates. Da scheiter(te)n fast alle anderen nämlich dran.

von W.S. (Gast)


Lesenswert?

Klaus Wachtler schrieb:
> Ich kann nicht verstehen, daß Leute immer noch über reines C schimpfen,
> es aber trotzdem nehmen.

Dann erkläre ich es dir:
Die Leute benutzen C eben notgedrungen, weil nix besseres in greifbarer 
Nähe ist. Vor rund 25 Jahren ist in der Programmiererwelt ne 
Entscheidung für C und gegen Pascal gefallen und nun haben wir seitdem 
den Salat, aus dem die Welt auch nicht mehr herauskommt. Das ist 
schlichtweg bedauerlich und durchaus ein Grund, auf C zu schimpfen und 
es dennoch benutzen zu müssen.

Sag jetzt nicht, C++ oder C# wären eine grundlegende Verbesserung der 
Lage. Es ist immer nur Herumgefrickel an all den Unzulänglichkeiten von 
C, die damals den Programmierern ja so toll erschienen sind. C++ ist in 
meinen Augen keine Verbesserung, eher eine Verschlimmbesserung, weil es 
sämtliche Geburtsfehler und Seiteneffekte von C immer noch mit sich 
herumschleppt und noch zusätzliche Seiteneffekte mitbringt. Wie schön, 
wenn alloziierte Objekte beim Verlassen eines Blockes implizit wieder 
beseitigt werden und der Konstruktor den Namen seiner Klasse hat, aber 
das alles macht C++ Programme noch unleserlicher als sture C-Quellen.

Ich versuch's mal ganz deutlich zu formulieren: Je mehr wir in die 
Zukunft kommen, desto dringender wird es, daß eine Programmiersprache 
selbstdokumentierend wird, möglichst frei von Seiteneffekten ist und 
möglichst wenig zu erlernende (weil sich nicht durch LESEN erklärende) 
Bestandteile hat. Das wird derzeit mißachtet, wohl weil die Insider der 
Ansicht sind, daß die Lern- und Versteh-Schwelle ruhig ganz hoch sein 
darf, aber in zunehmendem Maße fällt es allen auf die Füße, weil genau 
dadurch immer mehr dilettantischer Code seinen Weg in die Produkte 
findet.

Vergleiche doch mal C++ mit Pascal, so wie es vor 10 Jahren als Sprache 
für Delphi 4..7 und derzeit von FreePascal definiert ist. Da macht C++ 
keine gute Figur. Bloß ne Reihe von oberfaulen Programmierern nörgeln, 
daß man dort ja "begin" schreiben muß und das ist ihnen zu aufwendig.

W.S.

von Klaus W. (mfgkw)


Lesenswert?

Was soll diese Diskussion hier? Du kannst doch Pascal nehmen, wenn du 
willst.
Ich halte es für eine tolle Sprache, aber nicht zum Programmieren, 
sondern zum Lernen. Aber jeder, wie er will.

Was Pascal ermöglicht, ist ein müder Witz gegen das, was in C geht - 
wenn man C kann.
Nichtsdestotrotz kann C++ mehr (vor allem mehr automatisieren) als C, 
also kann man das doch auch nutzen.

PS: mich stören begin und end überhaupt nicht. Ich schreibe nichtmal die 
geschweiften Klammern in C einzeln, sondern paarweise mit einer Taste im 
Editor meiner Wahl - dann stehen sie wenigstens paarweise da, in 
getrennten Zeilen und sauber eingerückt.
In Pascal würde ich mir halt begin und end auf diese Taste legen.

von Rolf Magnus (Gast)


Lesenswert?

Klaus Wachtler schrieb:
> Was viele einfach nicht verstehen wollen, ist:
>
> C++ hat vieles, was man nicht nehmen MUSS - wenn es nicht angemessen
> ist.

Leider begreifen das auch so manche recht bekannte Leute wie Linus 
Torvalds nicht. Wenn der C++ öffentlich verteufelt, hat das natürlich 
eine gewisse Wirkung auf andere Entwickler. Der nennt unter anderem die 
Exceptions als Grund, warum seiner Meinung nach C++ in einem Kernel 
grundsätzlich nichts zu suchen hat. Alles, was er an Gründen nennt, ist 
fadenscheinig. Er mag einfach C++ nicht, oder er hat sich zuwenig damit 
beschäftigt, um es überhaupt beurteilen zu können. Meiner Meinung nach 
ist C++ prima für einen Kernel geeignet, und im Linux-Kernel werden zum 
Teil auch OOP-Konzepte verwendet, die in C++ viel eleganter umsetzbar 
wären.

Georg A. schrieb:
>> und dass es eigentlich sinnvoller wäre C++ zu nehmen.
>
> Genau. Zumindest um schon mal die //-Kommentare rechtmässig verwenden zu
> dürfen ;)

Die darf man in C seit 13 Jahren rechtmäßig verwenden, weil sie in C99 
offiziell in den Sprachumfang aufgenommen wurden. Es gibt aber wohl 
immer noch Compiler, die das unrechtmäßigerweise nicht können. C89/C90 
wurde offiziell abgeschafft und exstiert nicht mehr. Wenn ein Compiler 
nur dazu kompatibel ist, ist das im  Bezug auf Standard-Konformität also 
rein gar nichts wert. Das gilt inzwischen übrigens auch für C99, das 
inzwischen durch C11 ersetzt wurde.

von Christian B. (casandro)


Lesenswert?

1. "Modern" ist in der IT eher ein Schimpfwort, das bedeutet, dass was 
noch nicht durchdacht ist und man einfach einem Trend hinterherläuft.

2. Wenn Du Deinen Stil suchst, lese Dir doch mal "The Art of Unix 
Programming" durch. http://www.faqs.org/docs/artu/ Der legt da relativ 
fundierte Meinungen dar, die Du in Deinen Entscheidungsprozess mit 
einfließen lassen kannst.

von Christopher (Gast)


Lesenswert?

OK ich glaub C++ hat mich überzeugt.

Ich hab mal eine kleine Anwendung geschrieben, die ein Fenster mit der 
WinAPI öffnet und beim Fenster Schließen sich beendet. Dazu wurde eine 
eigene Fensterklasse geschrieben, in der man auch den Titel einstellen 
kann. Ich lass die Details mal aus.
Das Programm wurde in C und C++ vom Aufbau haargenau aufgebaut. 
Ausnahme: bei C++ wurde die STL benutzt.

Die Programmgröße:
C++ (VSC /O2): 15kB (bei /O1 14kB)
C (gcc -O3): 57kB !!!! auch bei -Os

Ich dachte C macht es sich zur Aufgabe kleine Programme zu erzeugen.
Zudem war es relativ mühselig die C-Variante zu schreiben. Dann kommt 
noch dazu, dass ich vergessen habe den Destruktor aufzurufen. Is zwar 
nicht so schlimm, da der sowieso am Programmende hätte kommen müssen und 
sich dann Windows drum kümmert, aber ihr wisst sicher was ich meine.
Bei C++ hab ich einfach std::unique_ptr<Window> benutzt und konnte 
nichts vergessen. Ich denke, dass ich meine Wahl getroffen habe.

Aber der riesen Unterschied der Programmgröße kann irgendwie nicht sein, 
die C++ Version habe ich einfach mit VS2012 erstellt (Win32-Anwendung).

Hier meine build.bat (C-Version):
1
gcc main.c Platform.c Window.c -o C_Test -lgdi32 -luser32 -lkernel32 -O3 -std=c99

Vielleicht liegts am Linkverfahren? VSC linkt dynamisch?

von (prx) A. K. (prx)


Lesenswert?

Christopher schrieb:
> Vielleicht liegts am Linkverfahren? VSC linkt dynamisch?

MS verwendet üblicherweise DLLs als Runtime Libs für die normalen 
Libfunktionen. GCC meist nicht.

von Christopher (Gast)


Lesenswert?

Stimmt. Habs in den Einstellungen gefunden.
C++: 70kB

Auch nicht so schlimm, ich bleib trotzdem bei C++.
Ist es zu empfehlen Vorkompilierte Header zu verwenden? Etwas Unbehagen 
hab ich schon, normalerweise gilt die Regel: Header einbinden wo es 
wirklich notwendig ist. Allerdings finde ich, dass Header bei C++ 
unnötig sind, da es Namespaces gibt. Ein Modulsystem täte C++ gut.

von Karl H. (kbuchegg)


Lesenswert?

Christopher schrieb:
> Stimmt. Habs in den Einstellungen gefunden.
> C++: 70kB
>
> Auch nicht so schlimm, ich bleib trotzdem bei C++.
> Ist es zu empfehlen Vorkompilierte Header zu verwenden?

Ja.
Die Compilezeiten sinken schon um einiges.


> Etwas Unbehagen
> hab ich schon, normalerweise gilt die Regel: Header einbinden wo es
> wirklich notwendig ist.

Das Problem sind nicht >deine< Header.
Das Problem sind die Windows Header. Da ziehst du dir erst mal 
Zig-Kilobytemässig immer gleiche Header Files rein, die praktisch 
gesehen in jedem CPP File durch den Präprozessor geschleust werden 
müssen. Und ich möchte hinzufügen: sinnloserweise, denn diese Header 
ändern sich ja nicht.

Dev Studio macht das schon richtig. In dem Punkt darfst du ihm 
vertrauen. Precompiled Header Files werden so verpackt, dass der 
Präprozessor den ganzen Wust, der damit zusammenhängt, nicht jedesmal 
neu begutachten muss.

> Allerdings finde ich, dass Header bei C++
> unnötig sind, da es Namespaces gibt.

Das eine hat mit dem anderen nichts zu tun.

> Ein Modulsystem täte C++ gut.
Das allerdings.

C++ aber auch C sind so ausgelegt, dass man keine IDE benötigt um 
trotzdem effizient arbeiten zu können. Daher dieses Header-File System. 
Ist zwar eine Krücke, aber funktioniert auch dann noch gut, wenn alles 
was du hast eine Command Line, ein Compiler, Linker und ein Make ist.

von Jürgen W. (lovos)


Lesenswert?

> C++ aber auch C sind so ausgelegt, dass man keine IDE benötigt um
> trotzdem effizient arbeiten zu können. Daher dieses Header-File System.

Verstehe ich nicht. Java hat kein Header-System, kann aber genauso ohne 
IDE auf der Console entwickelt werden, nämlich mit dem Befehl javac.

Das halte ich sogar effizienter, da man nicht *.h und *.c parallel 
pflegen muss.

von Karl H. (kbuchegg)


Lesenswert?

Jürgen W. schrieb:
>> C++ aber auch C sind so ausgelegt, dass man keine IDE benötigt um
>> trotzdem effizient arbeiten zu können. Daher dieses Header-File System.
>
> Verstehe ich nicht. Java hat kein Header-System, kann aber genauso ohne
> IDE auf der Console entwickelt werden, nämlich mit dem Befehl javac.

Ja. Heute.

Vor 40 Jahren (und soweit liegen die Wurzeln zurück) war das aber 
anders. Damals wurde die Taktfrequenz selbst von Grossrechnern noch im 
einstelligen Mega-Herz Bereich gemessen. Und von Hauptspeichergrößen, 
den Kosten dafür, Plattenzugriffszeiten bzw. was das Megabyte 
Plattenplatz gekostet hat, reden wir mal lieber nicht.
Was du heute wie selbstverständlich auf dem Schreibtisch stehen hast, 
hängt jedes Rechenzentrum von vor 30 Jahren aber locker ab. Und zwar in 
allen Belangen.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

A. K. schrieb:
> MS verwendet üblicherweise DLLs als Runtime Libs für die normalen
> Libfunktionen.

MS verwendet das, was bei den Linkeroptionen eingestellt ist, und kann 
daher problemlos auch statisch gelinkte Programme erzeugen.

von Frank M. (aktenasche)


Lesenswert?

W.S. schrieb:
> ag jetzt nicht, C++ oder C# wären eine grundlegende Verbesserung der
> Lage. Es ist immer nur Herumgefrickel an all den Unzulänglichkeiten von
> C, die damals den Programmierern ja so toll erschienen sind.

die da wären?

W.S. schrieb:
> desto dringender wird es, daß eine Programmiersprache
> selbstdokumentierend wird, möglichst frei von Seiteneffekten ist und
> möglichst wenig zu erlernende (weil sich nicht durch LESEN erklärende)
> Bestandteile hat.

moment, c++ und c# sind doch keine grundlegende verbesserungen oder? 
hust

von Lukas K. (carrotindustries)


Lesenswert?

Hat hier noch keiner erwähnt: 
http://de.wikipedia.org/wiki/Vala_%28Programmiersprache%29

Hat viele C++/C#/whatever Komfortfunktionen und wird vom Compiler in C 
umgebaut, womit sich dann der GCC befassen darf.

von Hurga (Gast)


Lesenswert?

Sven P. schrieb:
>><((((º>)

Das sieht ja fast aus wie Brainf u c k:
http://de.wikipedia.org/wiki/Brainf u c k
(Leerzeichen entfernen, da ForenSW schon wieder so schlau, dass dumm)

von Karl H. (kbuchegg)


Lesenswert?

> Die Leute benutzen C eben notgedrungen, weil nix besseres
> in greifbarer Nähe ist.

So ein Quatsch.
Sie benutzen es, vor allen Dingen in der µC Szene, weil es eine gesunde 
Mischung zwischen der Abstraktheit ist, die mit einer Hochsprache einher 
geht, und der Präzission die man mit Assembler hat.

Auf der einen Seite das Loslassen von den vielen kleinen Details, mit 
denen man sich in Assembler rumschlagen muss. Auf der anderen Seite aber 
noch nicht weit genug von Assembler entfernt, um die Kontrolle über die 
CPU vollständig aufzugeben.


Da draussen gibt es tausende Programmiersprachen. Und gegen viele davon 
kannst du mit deinem Pascal brausen gehen.

von Rolf Magnus (Gast)


Lesenswert?

Jürgen W. schrieb:
>> C++ aber auch C sind so ausgelegt, dass man keine IDE benötigt um
>> trotzdem effizient arbeiten zu können. Daher dieses Header-File System.
>
> Verstehe ich nicht. Java hat kein Header-System, kann aber genauso ohne
> IDE auf der Console entwickelt werden, nämlich mit dem Befehl javac.
>
> Das halte ich sogar effizienter, da man nicht *.h und *.c parallel
> pflegen muss.

Hmm, also ich empfinde es als Vorteil, Code und Interface sauber 
getrennt halten zu können und nicht sämtlichen Funktionscode in einem 
einzelnen großen File in die Klassendefinition reinverwursten zu müssen.

von Jürgen W. (lovos)


Lesenswert?

> und nicht sämtlichen Funktionscode in einem einzelnen großen File

Dass man Klassen nicht auf mehrere Dateien aufteilen kann, verstehe ich 
nicht. C# kann das.
Wobei es bei sauberem strukturiertem Code nicht oft diese 
"Riesenklassen" ohne Substrukturen gibt.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Jürgen W. schrieb:
> Dass man Klassen nicht auf mehrere Dateien aufteilen kann, verstehe ich
> nicht.

Warum sollte man das nicht können? Lediglich die Deklaration darf 
nicht aufgeteilt werden, die Implementierung aber kann in so viel 
Dateien untergebracht werden, wie es Memberfunktionen gibt.

von Jürgen W. (lovos)


Lesenswert?

Ich meinte, dass man es mit Java nicht kann.
http://stackoverflow.com/questions/2764234/partial-classes-partial-class-file

Aber es ging um das Headersystem, aber das Headersystem hat nichts mit 
der Frage zu tun, ob man eine Klasse auf mehrere Dateien aufteilen kann 
oder nicht.
Für mich war dies nie relevant, auch unter C# nicht.

von W.S. (Gast)


Lesenswert?

Frank Meier schrieb:
> die da wären?

Betriebsblind geworden, gelle?
Ich nenn mal ne Kleinigkeit: Datentypen, Seiteneffekte.

und...
Karl Heinz Buchegger schrieb:
> So ein Quatsch.
> Sie benutzen es, vor allen Dingen in der µC Szene, weil es eine gesunde
> Mischung zwischen der Abstraktheit ist, die mit einer Hochsprache einher
> geht, und der Präzission die man mit Assembler hat.

Du tust ja gerade so, als ob man heutzutage die Wahl hätte. Ich sag mal 
dazu: weltfremd. Für die allermeisten uC kriegst du nix anderes als C 
und Assembler - und das isses. Den "Quatsch" geb ich die postwendend 
zurück.

Jaja, man kann sich auch an C gewöhnen und es benutzen (wahrscheinlich 
wird C länger in dieser Welt sein als C++, C#, Java und sonstwas 
zusammen), aber halte es für ausgesprochen trollhaft, darüber zu 
vergessen, gelegentlich über den Tellerrand zu schauen und C nebst 
seinen Kindern mal mit dem nötigen kritischen Abstand zu sehen. Siehe 
oben: Betriebsblindheit. Teste dich mal selbst, indem du dich fragst, 
wie häufig du in derzeitigen C-Programmen bei Variablendeklarationen 
Bezeichnungen wie u32, uint8, uint16 oder wie sie auch immer heißen 
mögen gesehen und dabei "jaja, klar doch" gedacht hast. Hast du dich nie 
gefragt, warum dort nicht schlicht long, byte, int steht? Ja klar, es 
sind Workarounds um einen der Geburtsfehler von C bei den Datentypen 
herum. Das ist nur ne Kleinigkeit, die aber zeigt, wie sehr C-Quellen 
heutzutage mit Workarounds vollgestopft sind, die man schlichtweg 
benötigt (oder zu benötigen glaubt). Wenn du dies für ne gesunde 
Mischung aus Abstraktheit und Präzision hältst, dann machst du mich 
grausen.

W.S.

von Rohr Frei (Gast)


Lesenswert?

C ist out, AA ist der neue Hype!

von Yalu X. (yalu) (Moderator)


Lesenswert?

W.S. schrieb:
> Die Leute benutzen C eben notgedrungen, weil nix besseres in greifbarer
> Nähe ist.

Also ist C deiner Ansicht nach zwar nicht der Weisheit letzter Schluss,
aber das Beste, was derezeit verfügbar ist? Damit widersprichst du
vermutlich keinem der Threadteilnehmer.

> Vor rund 25 Jahren ist in der Programmiererwelt ne Entscheidung für C
> und gegen Pascal gefallen

Da die Entscheidung sehr einhellig war, muss es wohl triftige Gründe
dafür gegeben haben.

> und nun haben wir seitdem den Salat, aus dem die Welt auch nicht mehr
> herauskommt.

Warum sollte die Welt aus C nicht wieder herauskommen? Sie ist auch aus
Fortran (weitestgehend) herausgekommen, obwohl es lange Zeit nicht
danach aussah. Aber es muss halt erst ein Konkurrent kommen, der die
Softwareentwickler wirklich vom Hocker reißt. Bisher lässt er noch auf
sich warten.

> Ich versuch's mal ganz deutlich zu formulieren: Je mehr wir in die
> Zukunft kommen, desto dringender wird es, daß eine Programmiersprache
> selbstdokumentierend wird, möglichst frei von Seiteneffekten ist und
> möglichst wenig zu erlernende (weil sich nicht durch LESEN erklärende)
> Bestandteile hat.

Da hast du meine volle Zustimmung. Was wären denn deine Vorschläge?

Aber doch nicht etwa Pascal:

> Vergleiche doch mal C++ mit Pascal, so wie es vor 10 Jahren als Sprache
> für Delphi 4..7 und derzeit von FreePascal definiert ist.

Nein, an Pascal ist doch seit dessen Entstehung noch sehr viel mehr
herumgedoktert worden als an C. Nebeneffekte ("Seiteneffekt" soll man ja
nicht mehr sagen, habe ich vor kurzem gelernt) gibt es in Pascal genauso
wie in C, und vom Ziel, selbstdokumentierend zu sein, ist auch Pascal
noch Lichtjahre entfernt.

W.S. schrieb:
> Du tust ja gerade so, als ob man heutzutage die Wahl hätte. Ich sag mal
> dazu: weltfremd. Für die allermeisten uC kriegst du nix anderes als C
> und Assembler - und das isses.

Hmm, ich sehe da Pascal-Compiler für AVR, PIC, ARM, PPC, SPARC, x86 ...
Für die meisten davon gibt es sogar gleich mehrere zur Auswahl. Man
könnte sie nutzen, wenn man nur wollte. Außerdem gibt es noch Basic, und
für die größeren Controller, die gut mit Speicher ausgestattet werden,
kannst du dir fast jede Programmiersprache aussuchen, für die es eine
Community von mindestens ein paar tausend Leuten gibt.

> Teste dich mal selbst, indem du dich fragst, wie häufig du in
> derzeitigen C-Programmen bei Variablendeklarationen Bezeichnungen wie
> u32, uint8, uint16 oder wie sie auch immer heißen mögen gesehen und
> dabei "jaja, klar doch" gedacht hast.

Was soll an int8_t, uint16_t usw. schlecht sein? Das sind offzielle
Datentypen in C, die immer dann genutzt werden, wenn die tatsächliche
Bitbreite von Variablen von Bedeutung ist.

> Hast du dich nie gefragt, warum dort nicht schlicht long, byte, int
> steht?

Diese werden (mit Ausnahme von byte, das kein C-Datentyp ist) mindestens
genauso oft benutzt, je nach Verwendung der entsprechenden Variablen.

> Ja klar, es sind Workarounds um einen der Geburtsfehler von C bei den
> Datentypen herum.

Ich würde das weder als Geburtsfehler noch als Workarounds bezeichnen.
Es hat sich eben im Lauf der Zeit herausgestellt, dass insbesondere bei
der µC-Programmierung weitere Datentypen sinnvoll sind. Wo ist das
Problem? Nenne mir eine Programmiersprache, die von Anfang an perfekt
war und keinerlei Nachbesserungen bedurfte.


Rohr Frei schrieb:
> C ist out, AA ist der neue Hype!

Wie kommst du jetzt auf AA?

  http://en.wikipedia.org/wiki/Atlas_Autocode

Ich lese den Namen heute zum ersten Mal :)

von W.S. (Gast)


Lesenswert?

Yalu X. schrieb:
> Also ist C deiner Ansicht nach zwar nicht der Weisheit letzter Schluss,
> aber das Beste, was derezeit verfügbar ist?

Du sprichst mir so einigermaßen aus dem Herzen. Und ich dachte schon, 
hier treiben sich nur Fanboys herum. Ich würde es aber nicht "das Beste" 
nennen, so toll finde ich C nicht. Sag also lieber "benutzbar", das ist 
realistischer.

Und was Pascal versus C betrifft: Vergleiche mal K&R mit heutigem C++, 
da sind genauso große Unterschiede wie zwischen Wirth's erstem Entwurf 
und dem, was seit Delphi3 sich als Quasistandard etabliert hat. Trotzdem 
ist Pascal in sich konsistenter und hat auch das Erfinden der 
objektorientierten Programmschreiberei besser überstanden als C. Gelle? 
Nebenbei gefragt: Kann mir jemand irgendeine Aufgabe nennen, die man mit 
C besser als mit Pascal lösen kann? Aber Pascal war nur ein Beispiel für 
ne real existierende Alternative und ist nicht der Gegenstand der 
Diskussion.


Die Frage, was modernes C sei, kann man sehr einfach beantworten: RTND 
(read the newest document), aber ich denke, es steht eine ganz andere 
Frage dahinter:

"Wie soll es weiter gehen?"

Da sehe ich nämlich nichts, was wirklich weiterbringt. Ist C++ oder C# 
das 'bessere' C? oder kommt nächstes Jahr ein tolles C$$ heraus, was 
noch vieeeeel besser ist? Nee, das ist es alles NICHT - und so wie ich 
das sehe, gibt es bei C kein wirkliches Verbesserungspotential. Soll 
nicht heißen, daß C mittlerweile die ideale Programmiersprache ist, 
sondern daß man zum Einführen von echten Verbesserungen so viel von der 
bisherigen Substanz einreißen müßte, daß es wohl besser sein wird, ganz 
neu anzufangen. Vorschläge für nen neuen Sprachnamen sind willkommen...

So, ich hätte da schon einiges (zum Stänkern):

- Preprozessor abschaffen. Was es zu deklarieren und zu definieren geben 
soll, soll sich gefälligst in der Sprachkonstruktion finden und nicht 
irgendwelcher Text-Ersetzen-Akrobatik anheimgestellt werden.

- verläßliche Datentypen schaffen. Datentypen sollen von der Sprache 
definiert sein und nicht von der Maschine abhängen. Dafür sollten die 
Datentypen allerdings ne saubere Benennung haben und nicht 
zusammengestückelt werden müssen. unsigned long long ist ein Krampf - 
und das Mitschleppen von sowas wie struct ist ebenfalls ein Krampf. Wenn 
man schon einen Datentyp kreiert hat, dann sollte dessen Bezeichner im 
folgenden Text ausreichen. Sowas wie typedef ist dann überflüssig.

- Den Wert von Anweisungen abschaffen. Sowas wie "if(A=B)" wird aus 
gutem Grunde von fast jedem modernen Compiler beanstandet, weil es sich 
in vielen Jahren herausgestellt hat, daß es zu 99.9% ein Schreibfehler 
war und weil heutzutage ein Compiler viel besser optimieren kann als ein 
Quellcode-Schreiber. All diese scheinbar so tollen Optimierungen in der 
Quelle, die damals angedacht wurden (a+=b; ? Operator uvm.), weil man 
glaubte, damit dem Compiler die Arbeit zu erleichtern, sind heutzutage 
überflüssig wie ein Blinddarm.

- Case-Sensitivität abschaffen. Ich kenne Quellen, wo besonders tolle 
Gurus sowas bis zum Erbrechen zelebriert haben, nur um Nachfolgenden 
Generationen das Lesen ihrer Poeme zu erschweren.

- echte Strings und Abschaffung der bisherigen Krampflösung. Hat 
eigentlich schon mal jemand nachgedacht wie unsäglich oft strlen 
gebraucht wird und dann jedesmal wieder alle Zeichen im Puffer 
nachzählt? Ressourcenverschwendung auf höherem Niveau.

So, genug gemosert für heute Abend.

W.S.

von D. I. (Gast)


Lesenswert?

Klassische Desktop-Software mit GUI würde ich heutzutage nicht mehr 
unbedingt in C entwickeln wollen, ...

Da greife ich dann doch lieber zu einem von diesen Kandidaten:

C++/Qt
Java/Swing
C#/WPF

von Falk S. (falkschilling)


Lesenswert?

Moin,
da will ich auch mal meinen Senf dazugeben.
Ich kann überhaupt nicht verstehen, warum hier so viele was gegen C 
haben. Das ist eine wunderbare Programmiersprache mit nur wenigen 
reservierten Wörtern wodurch ein paar schöne Effekte entstehen:

• es kann mit vergleichsweise wenig Aufwand ein guter C-Compiler für 
fast jede Plattform erstellt werden
• klasse Geschwindigkeit für Programme und Libs
• in C ist auch OOP möglich, nur eben anders als von C++ gewohnt
(z.B. die Enlightenment Foundation Libraries (EFL) sind großartig 
designte C-Bibliotheken)
• Debuggen ist in C göttlich simpel, verglichen mit C++ mit virtuellen 
Methoden
• viele Laufzeitschweinereien die es in C++ gibt, entfallen, wenn man 
sich an die Programmierparadigmen der Programmiersprache C hält (z.B. 
Datenaustausch zwischen DLLs über STL-Container und 
Allokationen/Deallokationen über DLL-Grenzen hinweg)
• das ABI ist in C++ noch viel komplexer als in C, korrupte Interfaces 
durch veraltete Header/Lib-Kombinationen in verschiedenen Namespaces ist 
ganz großer Mist in C++
• mal versucht, C++-Exporte aus Namespaces aus DLLs heraus zu 
importieren? Viel Spaß! Und noch mehr Freude gibts, wenn die zu 
importierende C++-DLL mit'm Visual Studio und der Importer mit GCC 
erstellt wurde... dann sind Bißspuren im Keyboard ganz normales 
Programmiererverhalten.
• je näher es Richtung Treiber geht, desto besser muss mit Allokationen 
gehaushaltet werden (Paged/Non-Paged und der ganze Mist), ist man C 
gewohnt, keine große Umstellung
• mal Ada programmiert oder VHDL synthetisiert/implementiert? Was nützen 
tausend und fünf tolle Sprachkonstrukte wenn man sie seltenst gebraucht? 
Da ist ein kleiner Sprachkern wie in C herrlich. Geht fast bissl in die 
Richtung CISC vs. RISC (Hennessy/Patterson-Studie), nur eben auf 
Programmiersprachen-Ebene, also komplexer Sprachumfang vs. geringer 
Sprachumfang

Man kann ruhig über C schimpfen, es macht einen Haufen Arbeit, vor allem 
im String-Verhalten, wenn man den Komfort der STL-Container gewohnt ist 
oder in der C++-Templateprogrammierung mit einem geschickten Template 
eine generische/universelle Lösung für ein Problem finden kann oder 
Operatoren überlädt für eigene Datentypen. Und C alleine garantiert 
keinen effizienten Code.
Aber dennoch: C hat gegenüber C++ mitunter große Vorteile. Schaut man 
mal die SQLite, die ZBar oder die oben erwähnte EFL an, sind das 
Musterbeispiele für Cross-Platform-Bibliotheken auf Embedded-Systemen.

Ingesamt gesehen: auf PCs für den größten Teil der Anwendungsentwicklung 
ist Java oder .NET der Weg der Dinge, der in kürzerer Zeit wartbarere 
Resultat hervorbringt. Daher sollten schon die Anforderungen gescheit 
abgeschätzt werden und nicht so eine pauschale Diskussion a la: "Sprache 
A is viel schneller", "Sprache B ist scheiße", "Sprache N ist toll" oder 
ähnliches geführt werden. Entscheidend ist der Zweck und was dabei 
rauskommt, alles andere sind wohl akademische Eitelkeiten.

von Lukas K. (carrotindustries)


Lesenswert?

Falk (DB8FS) schrieb:
> Anwendungsentwicklung
> ist Java oder .NET
Kann mir mal wer die Java immer nachgesagte Bedeutung erklären? Ich hab 
mal meinen Paketmanager gefragt, was denn alles so von java abhängt:
$ pacman -Qi openjdk6
[...]
Required By    : funambol  funambol-admin

Also server-software.

von Cyblord -. (cyblord)


Lesenswert?

W.S. schrieb:


> - Preprozessor abschaffen. Was es zu deklarieren und zu definieren geben
> soll, soll sich gefälligst in der Sprachkonstruktion finden und nicht
> irgendwelcher Text-Ersetzen-Akrobatik anheimgestellt werden.
>
> - verläßliche Datentypen schaffen. Datentypen sollen von der Sprache
> definiert sein und nicht von der Maschine abhängen.

> - echte Strings und Abschaffung der bisherigen Krampflösung. Hat
> eigentlich schon mal jemand nachgedacht wie unsäglich oft strlen
> gebraucht wird und dann jedesmal wieder alle Zeichen im Puffer
> nachzählt? Ressourcenverschwendung auf höherem Niveau.

Mit den Punkten kannst du dann aber die hardwarenahe programmierung 
vergessen. Und genau da punktet C doch. Ohne Präprozessor kannst du auf 
Maschinen mit begrenztem Speicher nicht ordentlich programmieren.
Und das Datentypen eben doch von der Maschine abhängen ergibt sich aus 
der Realität. Und eine Strinverarbeitung auf dem Niveau von Java und C# 
kannst du eben auf kleinen Controllern auch nicht machen. C muss 
hardwarenah sein. Für alles andere kann man ja dann was anderes nehmen.

gruß cyblord

von Joachim D. (Firma: JDCC) (scheppertreiber)


Lesenswert?

Im Endeffekt wird der Maschinencode ausgeführt, nichts anderes.

Es geht darum diesen effizient zu erstellen. C ist da mE unschlagbar.
schnell, flexibel und es kann einfach alles ohne mich auszubremsen.

von kopfkratzer (Gast)


Lesenswert?

LOL
Programmiert doch in EIFFEL da kann man auch gleich die Varianten und 
Invarianten vom Compiler überprüfen lassen.
Achja der macht auch C-Code draus, teilweise mit echt 
"gewöhnungsbedüftigen" Konstruktionen.
Und dann gibt es da noch diverse UML Pakete die dann aus den grafischen 
Darstellungen JAVA/C++ oder anderen objektorientierten Code erzeugen.
Aber C ist schon schön "shoot yourself in the foot" -> BANG

von Christopher (Gast)


Lesenswert?

Falk (DB8FS) schrieb:
> • mal Ada programmiert oder VHDL synthetisiert/implementiert? Was nützen
> tausend und fünf tolle Sprachkonstrukte wenn man sie seltenst gebraucht?
> Da ist ein kleiner Sprachkern wie in C herrlich. Geht fast bissl in die
> Richtung CISC vs. RISC (Hennessy/Patterson-Studie), nur eben auf
> Programmiersprachen-Ebene, also komplexer Sprachumfang vs. geringer
> Sprachumfang

Da sprichst du mir aus der Seele, genau das ist was ich an C, AVR, RISC 
so mag, mit wenig Mitteln so ziemlich alles machen können.
Die "modernen" Sprachen werden ja auch immer fetter, da ist C++ das 
Paradebeispiel. C#, Java haben auch schon einen recht großen 
Sprachumfang, welcher stätig wächst. Vielleicht geht man da in die 
falsche Richtung. Ich denke, dass das genauso eine Diskussion sein 
könnte wie, sollte die Sprache den Programmierer dazu zwingen 
übersichtlichen Code zu schreiben (Pascal).

Mir jedenfalls hat es gut getan zuerst C# zu lernen und zu nutzen, da 
die Sprache schon ein bisschen dazu tendiert vorzugeben wie du deinen 
Code gestaltest. Dadurch weiß ich jetzt ungefähr was schlechter und was 
guter Quellcode ist, wenns um Übersichtlichkeit geht, darüber mach mir 
immer Gedanken.

Eine Sprache wie C mit vereinfachtem OO Ansatz, mit Exceptions und 
möglicherweise auch mit einfachen Templates oder Generika. Natürlich 
ohne C Subset und die C Fallstricke. Das wär DIE Programmiersprache für 
mich.

von Christopher (Gast)


Lesenswert?

Was der Sprache natürlich nicht fehlen darf: Referenzen.
Ich verstehe auch nicht warum C keine Referenzen kennt. Pascal ein paar 
Jahre zuvor hatte schon Referenzen.
Vielleicht, weil dadurch die wieder Verschleiert werden würde, was nach 
C Philosophie natürlich verboten ist. Aber das hätte so manchen Bug 
schon im Vorfeld ausradiert.

von Yalu X. (yalu) (Moderator)


Lesenswert?

W.S. schrieb:
> So, ich hätte da schon einiges (zum Stänkern):
>
> - Preprozessor abschaffen.
>
> - Den Wert von Anweisungen abschaffen. Sowas wie "if(A=B)"
>
> - echte Strings und Abschaffung der bisherigen Krampflösung.

Hast du dir mal Go angeschaut?

  http://golang.org/

Auf mich macht die Sprache einen ganz guten Eindruck, da sie zusätzlich
eine ähnliche Sicherheit wie Java bietet (keine Pointer-Arithmetik,
geringe Gefahr von Speicherlecks, Überprüfung von Array-Grenzen zur
Laufzeit usw.). Anders als in Java ist in Go aber hardwarenahe
Programmierung möglich. Da hardwarenahe Programmierung generell mit
Gefahren verbunden ist, sind die dafür erforderlichen Operationen in
einem Package mit dem warnenden Namen "unsafe" zusammengefasst, das
für die normale Anwendungsprogrammierung einfach weggelassen wird.

Ok, einige deiner Forderungen sind auch in Go nicht erfüllt:

> - verläßliche Datentypen schaffen. Datentypen sollen von der Sprache
> definiert sein und nicht von der Maschine abhängen.

Die maschinenabhängigen Typen int und uint gibt es auch in Go, aber die
muss man na nicht unbedingt nutzen. Wenn man sie aber doch braucht,
fehlen sie nicht.

> - Case-Sensitivität abschaffen.

Case-Insensitivität in Programmiersprachen ist eigentlich längst
abgeschafft, nicht nur in C. Sie war vielleicht zu Zeiten sinnvoll, wo
die Computer, Terminals, Drucker, Lochkartenstanzer usw. noch nicht
richtig mit Groß-/Kleinschrift umgehen konnten. Heute möchte man aber
nicht, dass jemand einen Variablennamen einmal "var" und ein paar
Code-Zeilen später als "VAR", "Var" oder gar "vAr"  schreibt. Gleiche
Namen sollten immer auch exakt gleich aussehen.


Christopher schrieb:
> Die "modernen" Sprachen werden ja auch immer fetter, da ist C++ das
> Paradebeispiel.

Das ist richtig. Vielleicht würde auch dir Go gefallen. Die Sprache ist
vom Sprachumfang nicht größer als C, aber sehr viel mächtiger.


Für alle die Go schnell mal ausprobieren möchten, gibt es hier eine
interaktive Einführung im Web-Browser:

  http://tour.golang.org/#1

Man erkennt da sehr schnell, ob man sich mit der Sprache anfreunden kann
oder nicht.


Vielleicht wird ja Go eines Tages das "moderne C"?

Auf 8-Bit-AVRs und ähnlich RAM-armen Controllern wird Go allerdings
nicht sinnvoll einzusetzen sein. Da werde ich weiterhin bei dem
"verzuckerten Assembler" C bleiben und habe ein gutes Gefühl dabei :)

von Cyblord -. (cyblord)


Lesenswert?

Wie soll man ohne Pointer maschinennah programmieren?

von Christopher (Gast)


Lesenswert?

Das sieht auf jeden Fall mal interessant aus. Die Syntax ist eine 
Mischung aus C und Pascal.

cyblord ---- schrieb:
> Wie soll man ohne Pointer maschinennah programmieren?
1
var pointer *Point3D = &Point3D{y: 1000}
Das sieht aber schwer nach Pointer aus.

von Yalu X. (yalu) (Moderator)


Lesenswert?

cyblord ---- schrieb:
> Wie soll man ohne Pointer maschinennah programmieren?

War das auf meinen letzten Beitrag bezogen oder generell gemeint?

Was Go betrifft: Ja, in Go gibt es Pointer (s. voriger Beitrag von
Christopher). Es verbietet nur Pointer-/Arithmetik/. Aber selbst diese
ist über das unsafe-Package möglich, da man damit beliebig zwischen
Pointern und Integers (uintptr) herumkonvertieren kann. Somit sind die
gleichen "Schweinereien" wie in C möglich. Wenn man in hardwareferneren
Programmmodulen das unsafe-Package weglässt, hat man dort eine deutlich
höhere Typsicherheit als in C. Man kann also die "gefährlichen" Aktionen
einer Software auf ganz wenige, hardwarenahe Module beschränken, was in
C nur mit viel Disziplin möglich ist.

Generell: Man braucht für die hardwarenahe Programmierung nicht
unbedingt Pointer. Manche Sprachen (auch manche C-Dialekte) erlauben es
bspw., gewöhnliche Variablen an absolute Adressen zu legen und sie damit
auf I/O-Register zu mappen. Im Vergleich zur Pointer-Methode in C ist
dieser Weg auf jeden Fall der elegantere.

von Christopher (Gast)


Lesenswert?

Du scheinst dich schon näher mit Go beschäftigt zu haben.

Ist das schon brauchbar? Oder sollte man warten? Meistens ist es so die 
Programmiersprache erst einmal reifen muss (z.B. C#).

Gibts über Go eventuell ein EBook? Hab bis jetzt noch nichts brauchbares 
gefunden, mit Übersichten kann man schlecht eine Programmiersprache 
lernen.

Hast du die go-ide ausprobiert? Oder programmierst du Go über einen 
Editor? Wie gut geht das?

von Gelegenheitsprogrammierer (Gast)


Lesenswert?

Aus dem FAQ von Go

" Why is my trivial program such a large binary?

The linkers in the gc tool chain (5l, 6l, and 8l) do static linking. All 
Go binaries therefore include the Go run-time, along with the run-time 
type information necessary to support dynamic type checks, reflection, 
and even panic-time stack traces.

A simple C "hello, world" program compiled and linked statically using 
gcc on Linux is around 750 kB, including an implementation of printf. An 
equivalent Go program using fmt.Printf is around 1.2 MB, but that 
includes more powerful run-time support. "

:)

von Yalu X. (yalu) (Moderator)


Lesenswert?

Christopher schrieb:
> Du scheinst dich schon näher mit Go beschäftigt zu haben.

"Näher" ist zuviel gesagt. Ich habe einen Compiler geschnappt (den von
Google) und ein Bisschen damit herumgespielt, das ist alles.

> Ist das schon brauchbar? Oder sollte man warten?

Für den sogenannten "produktiven Einsatz" würde ich es noch nicht ver-
wenden.

Immerhin wird an dem Teil schon fünf Jahre entwickelt, vor drei Jahren
wurde es der Öffentlichkeit vorgestellt, die Versionsnummer beginnt
mittlerweile mit einer 1, und es gibt zwei, den vollen Sprachumfang
abdeckende Compiler (den von Google und GCC). Auch die Package-Liste
erweckt nicht den Eindruck, dass man damit nur Hello-World-Programme
erstellen kann:

  http://golang.org/pkg/

Aber das muss natürlich alles nicht heißen ... :)

> Meistens ist es so die Programmiersprache erst einmal reifen muss
> (z.B. C#).

C# ist natürlich auch ein extremes Beispiel für Bananensoftware (die
erst beim Kunden reift). Das liegt aber u.a. daran, dass C# eine sehr
"große" Sprache ist und MS damals bei der Veröffentlichung sehr unter
Zeitdruck stand. Seither gibt es im Mittel alle zwei Jahre eine neue
Sprachspezifikation (zum Vergleich: Bei C und C++ liegen die einzelnen
Versionen zehn Jahre und mehr auseinander).

Beide Probleme (Größe und Zeitdruck) treffen auf Go eher nicht zu. So
könnte ich mir durchaus vorstellen, dass es schon relativ "fertig" ist.

> Gibts über Go eventuell ein EBook?

Keine Ahnung. Es gibt halt die übliche Tutorials, die Sprachspezifika-
tion und die Dokumentation der Packages:

  http://golang.org/doc/

> Hast du die go-ide ausprobiert?

Nein.

> Oder programmierst du Go über einen Editor?

Ja, und zwar mit denselben, den ich auch für C, C++, Python, Bash-
Skripte, Haskell usw. nutze: Vim :)

> Wie gut geht das?

Sehr gut. Aber wie gesagt, ich habe noch nichts größeres in Go gemacht.


Gelegenheitsprogrammierer schrieb:
> A simple C "hello, world" program compiled and linked statically using
> gcc on Linux is around 750 kB, including an implementation of printf. An
> equivalent Go program using fmt.Printf is around 1.2 MB, but that
> includes more powerful run-time support. "

Mit gccgo und dynamisch gelinkt braucht ein Hello-World 19,5kB. Das ist
auch nicht ganz wenig, aber für PCs und etwas größere ARM-Rechner schon
in Ordnung.

von Klaus Maus (Gast)


Lesenswert?

Hallo W.S.,

W.S. schrieb:
> Ich versuch's mal ganz deutlich zu formulieren: Je mehr wir in die
> Zukunft kommen, desto dringender wird es, daß eine Programmiersprache
> selbstdokumentierend wird, möglichst frei von Seiteneffekten ist und
> möglichst wenig zu erlernende (weil sich nicht durch LESEN erklärende)
> Bestandteile hat.

Python existiert.

Beste Grüße,
Klaus

von Klaus Maus (Gast)


Lesenswert?

Hallo Christoph,

Christopher schrieb:
> Allerdings finde ich, dass Header bei C++ unnötig sind, da es Namespaces
> gibt. Ein Modulsystem täte C++ gut.

Header machen vor allem in der kommerziellen Softwareentwicklung Sinn. 
Da kann ich meine Library als Binärcode ausliefern, und mit Hilfe der 
Header kann der Kunde sein Programm dagegen linken.

Beste Grüße,
Klaus

Dieser Beitrag ist gesperrt und kann nicht beantwortet werden.