Objektorientiert Programmieren in C



  • Ich lese mir gerade Haßtiraden von Torvalds über C++ durch.

    http://harmful.cat-v.org/software/c++/linus

    An einer Stelle behauptet er, man könne mit C auch objektorientiert programmieren.

    you can write object-oriented code (useful for filesystems etc) in C,
    _without_ the crap that is C++.

    Wie soll man objektorientiert Programmieren können mit einer Sprache, die keine Klassen benutzt, von der man Objekte ableiten könnte?

    Abgesehen davon: gibt es Möglichkeiten, grafische Oberflächen in C zu programmieren oder ein Spiel wie beispielsweise Minecraft?


  • Mod

    Natürlich kann man in C auch objektorientiert programmieren. Aller professioneller C-Code ist so geschrieben. Objektorientierung beruht nicht auf Klassen, Klassen beruhen auf Objektorientierung. Objektorientierung ist in ein Konzept wie man Datenstrukturen definiert und wie man mit ihnen arbeitet.

    Natürlich kann man in C++ grafische Oberflächen und Spiele programmieren. Was denkst du, in welcher Sprache so ungefähr alle technisch anspruchsvollen Spiele geschrieben sind?



  • Ups, da hab ich mich verschrieben, ich meinte C...
    Gibt es auch dort Möglichkeiten effizient und Betriebssystem-unabhängig Spiele oder einfacher Programme mit grafischen Oberflächen zu schreiben?



  • Dexter1997 schrieb:

    Ich lese mir gerade Haßtiraden von Torvalds über C++ durch.

    Linus weiß bescheid. 🙂

    Dexter1997 schrieb:

    An einer Stelle behauptet er, man könne mit C auch objektorientiert programmieren.

    Aber sicher geht das. Siehe hier: https://www.cs.rit.edu/~ats/books/ooc.pdf


  • Mod

    Dexter1997 schrieb:

    Ups, da hab ich mich verschrieben, ich meinte C...
    Gibt es auch dort Möglichkeiten effizient und Betriebssystem-unabhängig Spiele oder einfacher Programme mit grafischen Oberflächen zu schreiben?

    Das alles geht auch in C, aber natürlich nicht systemunabhängig. Das geht in keiner Sprache, denn dazu müsste die Sprache die Unterschiede zwischen verschiedenen Systemen wegzaubern können.



  • Dexter1997 schrieb:

    Gibt es auch dort Möglichkeiten effizient und Betriebssystem-unabhängig Spiele oder einfacher Programme mit grafischen Oberflächen zu schreiben?

    OpenGL?



  • Alles klar, ich stand vor der Entscheidung C oder C++ zu lernen... Meine Wahl ist nun C. Scheint tiefgründiger und vernünftiger zu sein, C zu lernen, zumal ich sowieso von Winspy auf Linux umgestiegen bin



  • SeppJ schrieb:

    Dexter1997 schrieb:

    Ups, da hab ich mich verschrieben, ich meinte C...
    Gibt es auch dort Möglichkeiten effizient und Betriebssystem-unabhängig Spiele oder einfacher Programme mit grafischen Oberflächen zu schreiben?

    Das alles geht auch in C, aber natürlich nicht systemunabhängig. Das geht in keiner Sprache, denn dazu müsste die Sprache die Unterschiede zwischen verschiedenen Systemen wegzaubern können.

    Ich kenne eine Sprache die kann das. Ich habe öfter schon die Erfahrung gemacht, dass mittelschwere Programme in dieser Sprache unter Windows wie auch unter Solaris laufen, ohne auch nur eine einzige Codezeile zu ändern.

    Um welche Sprache es sich handelt, sage ich hier mal nicht, damit kein Flamewar ausbricht. 🙂


  • Mod

    Andromeda schrieb:

    Um welche Sprache es sich handelt, sage ich hier mal nicht, damit kein Flamewar ausbricht. 🙂

    Doch, sag an. Du meinst Java, oder? Und was meinst du, wie Java das macht? Weil Java jede Menge systemabhängigen Code enthält, den du dann in deinen Anwendungen aufrufst. Der systemabhängige Code ist da, du siehst ihn nur nicht. Das kannst du natürlich ebenso in C oder C++ machen und ist auch genau, was man normalerweise macht. Siehe z.B. OpenGL und seine Hilfswerkzeuge, mit denen man systemunabhängig anspruchsvollste Spiele entwickeln kann. Aber die eigentliche OpenGL-Implementierung ist natürlich hochgradig systemabhängig. Daher brauchst du für jedes System einen anderen Grafiktreiber (OpenGL) und eine andere JVM (Java).

    Denn, wie schon gesagt, Zauberei wurde noch nicht erfunden. Der Magier auf der Bühne hält bloß einen Vorhang vor die Sachen, die du nicht sehen sollst/brauchst.

    PS: Die JVMs sind übrigens gewiss nicht selber in Java geschrieben. Denk mal nach, warum.



  • SeppJ schrieb:

    Andromeda schrieb:

    Um welche Sprache es sich handelt, sage ich hier mal nicht, damit kein Flamewar ausbricht. 🙂

    Doch, sag an. Du meinst Java, oder? Und was meinst du, wie Java das macht? Weil Java jede Menge systemabhängigen Code enthält, den du dann in deinen Anwendungen aufrufst.

    Yepp, genau genommen liegt es nicht an der Sprache, sondern am Unterbau; an einer Laufzeitumgebung, die vieles wegabstrahiert und glattbügelt. Seit einiger Zeit geht man sogar noch einen Schritt weiter: https://de.wikipedia.org/wiki/Docker_(Software)

    Aber wie auch immer: C ist trotzdem geil. Es gibt wohl keine Sprache, die so alt und gleichzeitig so beliebt ist wie C. Die meisten anderen Sprachen steigen auf und verschwinden wieder in der Versenkung. Aber C nicht. C ist irgendwie unsterblich. C ist der absolute Evergreen unter den Programmiersprachen. 🙂



  • Andromeda schrieb:

    Aber wie auch immer: C ist trotzdem geil. Es gibt wohl keine Sprache, die so alt und gleichzeitig so beliebt ist wie C. Die meisten anderen Sprachen steigen auf und verschwinden wieder in der Versenkung. Aber C nicht. C ist irgendwie unsterblich. C ist der absolute Evergreen unter den Programmiersprachen. 🙂

    C ist schon okay, allerdings käme ich nicht auf die Idee die Sprache außerhalb von Erweiterungen für bereits vorhandene C-Projekte für irgendetwas komplett Neues zu verwenden. Der Hauptgrund dafür ist, dass man in C die Destruktoren manuell aufrufen muss - oder noch schlimmer und leider weit verbreitet: Man implementiert den Aufräumcode für verwendete Objekte werden in jeder Funktion neu. Nennt mich einen Chauvinisten, aber ich finde das unnötig unübersichtich und fehleranfällig (letzteres mag auch an meiner fehlenden C-Praxis liegen).

    Und übrigens @Dexter: Der Rant von Linus hat übrigens bei näherer Betrachtung sehr wenig Substanz, ich würde mich davon nicht zu sehr beeindrucken lassen. Der Text wird wohl nur wegen des Bekanntheit des Autors so oft zitiert. inhaltlich hat der nur unwesentlich mehr zu bieten als "Ich find C++ und besonders C++-Programmierer scheiße". Sowas sollte man nicht allzu ernst nehmen.



  • Finnegan schrieb:

    Und übrigens @Dexter: Der Rant von Linus hat übrigens bei näherer Betrachtung sehr wenig Substanz, ich würde mich davon nicht zu sehr beeindrucken lassen. Der Text wird wohl nur wegen des Bekanntheit des Autors so oft zitiert. inhaltlich hat der nur unwesentlich mehr zu bieten als "Ich find C++ und besonders C++-Programmierer scheiße". Sowas sollte man nicht allzu ernst nehmen.

    Doch, sollte man. Was jemand vom Format eines Linus erzählt, gerade auch in Hinsicht Programmierung, verdient besondere Beachtung.



  • Finnegan schrieb:

    Der Hauptgrund dafür ist, dass man in C die Destruktoren manuell aufrufen muss

    Und das ist ein Problem ... warum?

    Wir hatten die Diskussion schonmal. Am Ende kamen wir darauf, dass man am Liebsten einen nicht-redundanten, kritischen Aufräumpfad haben will, der über Labels am Ende der Funktion an beliebiger Stelle betreten werden kann und soll. Höhere Sprachen nehmen dem Programmierer die Verantwortung für das Erzeugen und Freigeben komplett weg, was für kleinere Projekte sinnvoll sein kann - aber für größere Projekte nur für mehr redundanten Code sorgt (ich rede hier nicht von verstecktem ctor- und dtor-Code, sondern von verschiedenen Codepfaden - ein Pfad benötigt eine bestimmtes, temporäres Objekt auf dem Stack, der andere nicht)..

    Im Grunde ist es ein Deppenschutz, ähnlich:

    if(KONSTANTE == variable)
    

    , nur um Sicherzustellen, dass der Gleichheitsoperator ja nie zur Zuweisung wird.

    Finnegan schrieb:

    oder noch schlimmer und leider weit verbreitet: Man implementiert den Aufräumcode für verwendete Objekte werden in jeder Funktion neu.

    Das ist natürlich komplett sinnlos. Aber genau deswegen macht man das ja objektorientiert - damit der Aufräumcode an einer Stelle steht und für ein Objekt gilt.



  • Andromeda schrieb:

    Doch, sollte man. Was jemand vom Format eines Linus erzählt, gerade auch in Hinsicht Programmierung, verdient besondere Beachtung.

    Beachtung findet es ja offensichtlich. Aber auch ein Linus kann Mist verzapfen. Und schon der erste Satz

    *YOU* are full of bullshit.

    diskreditiert den gesamten Beitrag und die Diskussion. Das ist ganz einfach ein Niveau auf dem ich mit niemanden anfange zu diskutierne. Egal ob der Linus Torvalds, ‎Bjarne Stroustrup oder wie auch immer heißt.

    Und, gute Leistungen heißt noch lange nicht, dass man jedes Word von denen für bare Münze nehmen sollte.



  • Schlangenmensch schrieb:

    Andromeda schrieb:

    Doch, sollte man. Was jemand vom Format eines Linus erzählt, gerade auch in Hinsicht Programmierung, verdient besondere Beachtung.

    Beachtung findet es ja offensichtlich. Aber auch ein Linus kann Mist verzapfen. Und schon der erste Satz

    *YOU* are full of bullshit.

    diskreditiert den gesamten Beitrag und die Diskussion.

    Das hätte auch von mir sein können.
    Linus ist eben auch nur ein Mensch. 😉



  • Nein, C ist nicht cool. Es ist ne ganz schlimme Seuche. U.a. deswegen weil es in C unvernünftig viel Aufwand ist bestimmte Dinge sauber zu machen, die eigentlich einfach sein sollten. Wie z.B. das ganze String-Handling. Was dazu führt dass Leute Abkürzungen nehmen und sich im Laufe der Zeit sogar gewisse fragwürdige Kompromisse (wie fixe Puffergrössen für quasi alles) als "das Mittel der Wahl" angewöhnen. Was zu viel schlechtem Code mit vielen Fehlern führt.

    Dummerweise gibt's für bestimmte Anwendungen keinen brauchbaren Ersatz. C++ wäre theoretisch für viele Dinge verwendbar, bloss sobald mal die Standard-Library verwenden möchte tritt man sich so viele Dependencies ein...



  • Schlangenmensch schrieb:

    Aber auch ein Linus kann Mist verzapfen. Und schon der erste Satz

    *YOU* are full of bullshit.

    diskreditiert den gesamten Beitrag und die Diskussion. Das ist ganz einfach ein Niveau auf dem ich mit niemanden anfange zu diskutierne.

    Naivling.
    Nur weil dir das Vokabular nicht passt, verschließt du dich seinen milliardenfach durch die Praxis bewiesenen Erkenntnissen.
    Torvalds hat es nicht nötig, mit irgendwem über C zu diskutieren.

    Schlangenmensch schrieb:

    Egal ob der Linus Torvalds, ‎Bjarne Stroustrup oder wie auch immer heißt.

    Torvalds ist ein Praktiker, der weiß also wovon er spricht und hat das milliardenfach durch die Praxis bewiesen.
    Stroustrup, Sutter und Co. sind Theoretiker, die wissen also nicht, wovon sie sprechen und haben auch diese ihre Unkenntnis durch die Nichtexistenz des Praxisbeweises nachgewiesen.

    Schlangenmensch schrieb:

    Und, gute Leistungen heißt noch lange nicht, dass man jedes Word von denen für bare Münze nehmen sollte.

    Torvalds ist der lebende Gott der C Praxis, ihm seine diesbezüglichen Aussagen nicht zu glauben, nur weil er sie nicht in diplomatische Worte fasst, ist naiv.

    Insofern gefällt mir die Bezeichnung "Anti-Visionär" für Torvalds ganz gut:
    https://www.nzz.ch/digital/25-jahre-linux-wie-die-pinguine-die-welt-eroberten-ld.111871



  • Die einzigen zwei Argumente, die er in der Email nennt, sind diese:

    - infinite amounts of pain when they don't work (and anybody who tells me
    that STL and especially Boost are stable and portable is just so full
    of BS that it's not even funny)

    - inefficient abstracted programming models where two years down the road
    you notice that some abstraction wasn't very efficient, but now all
    your code depends on all the nice object models around it, and you
    cannot fix it without rewriting your app.

    Der Rest ist eine Mischung aus 'C++ is Bullshit' und 'C is the only sane choice'.
    Nur mal so in den Raum gestellt


  • Mod

    dachschaden schrieb:

    Im Grunde ist es ein Deppenschutz, ähnlich:

    if(KONSTANTE == variable)
    

    Automatische Destruktoren sind kein Deppenschutz, sondern ein Sprachkonzept, welches dem Programmierer ganz neue Möglichkeiten gibt, die er in C nicht hat und auch mit egal wie viel Aufwand gar nicht haben kann. Wenn du wirklich so denkst, dann hat man dich für dumm verkauft.



  • SeppJ schrieb:

    Automatische Destruktoren sind kein Deppenschutz, sondern ein Sprachkonzept, welches dem Programmierer ganz neue Möglichkeiten gibt, die er in C nicht hat

    Zum Beispiel doppelten Code haben, oder noch mal eine Funktion zur Schnittstelle dazu, die sich um die eigentliche Allokation von Ressourcen kümmert? Danke, kenn ich schon. Bin ich nicht überzeugt von. Ich halte mir lieber das Recht vor, selbst bestimmen zu können, wann ich ein Objekt freigebe und wann nicht. Wenn es funktioniert, dann ist alles super. Wenn nicht, dann bin ich ein Depp. Mit beidem kann ich leben.


Anmelden zum Antworten