kostenloser Webspace werbefrei: lima-city


Die schönste Sprache der Welt

lima-cityForumProgrammiersprachenC/C++ und D

  1. Autor dieses Themas

    c****s

    Da ich ja in der kurzen Zeit, die ich in diesem Forum verbracht habe, schon habe feststellen müssen, dass es - und das ist gut so - hier sowohl Verfechter gibt, die C über Java stellen, als auch Vertreter, die Java über C stellen, möchte ich ein bisschen Werbung für C machen.

    C ist die schönste aller Sprachen, weil man so wunderbar leserlich Code schreiben kann. Vor allem Code ganz ohne reserved words wie "int", "return", "if", "while". Anbei ein kleines Progrämmchen aus meiner Feder, das das ganze veranschaulicht.

    ;_;__;___
    
    ()
    {
    	printf ("%d\n",_);
    	_+=__,_^=__,__^=_,_^=__,_<_/_<<(_/_<<(_/_<<(_/_<<_/_)))?___():_;
    }
    
    main()
    {
    	_^=_,__^=__,++__,___();
    }


    Das Ganze ist zu 100% konform mit der C-Sprach-Spezifikation und kompiliert auf ubuntu-Kernel mit gcc ohne Fehler (und 4 Warnungen).

    Ich bezweifle, dass man so augenscheinlichen und gut lesbaren Code in Java hinbekommt. OK, in Pearl wäre es noch schlimmer, aber das steht nicht zur Debatte, weil Pearl die einzige Write-Only-Language ist, da man dort grundsätzlichen seinen eigenen Code nicht lesen kann.
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. schrotti12

    Moderator Kostenloser Webspace von schrotti12

    schrotti12 hat kostenlosen Webspace.

    Soll das ganze jetzt einen Sinn haben? Wenn ja, hat er sich mir noch nicht erschlossen.
    Natürlich braucht man "reserved words" wie int und char, denn sonst könnte man keine Typkompatibilität gewährleisten. Auch if und while brauchts, sonst wären Abfragen und Schleifen nicht wirklich gut realisierbar. Außerdem verstehe ich nicht ganz, was dein Programm machen soll?!
  4. Autor dieses Themas

    c****s

    schrotti12 schrieb:
    Soll das ganze jetzt einen Sinn haben? Wenn ja, hat er sich mir noch nicht erschlossen.
    Natürlich braucht man "reserved words" wie int und char, denn sonst könnte man keine Typkompatibilität gewährleisten. Auch if und while brauchts, sonst wären Abfragen und Schleifen nicht wirklich gut realisierbar. Außerdem verstehe ich nicht ganz, was dein Programm machen soll?!


    Der Sinn davon ist einfach mal zu zeigen, dass (a) C auch anders aussehen kann, (b) was eine Minimalimplementierung ist und (c) das gängige Urban Myths wie zum Beispiel "ohne Typen geht es nicht" keinen Bestand haben.
    "int" und "char" braucht man, wenn man Typenkompatibilität gewährleisten will, und auch nur dann; wie man sieht geht es auch ohne.
    "if" braucht man nicht, da man den Ternary-Operator hat.
    "while" braucht man nicht, da man Rekursion hat.
    Das Programm berechnet die Fibonaccizahlen bis 1000. Einfach mal kompilieren und ausführen.

    gcc test.c
    ./a.out
  5. t*****b

    Es ist nicht Sinn und Zweck einer Sprache, unleserlichen Code zu schreiben. Es ist auch nicht Sinn einer Sprache, sie für etwas einzusetzen für was man sie nicht benötigt. Jede Sprache hat Vor- und Nachteile, welche man einsetzt muss man abwiegen.
  6. Sicher interessant und vermutlich für kaum jemanden ersichtlich, was dieses Programm denn nun überhaupt tut.
    Aber gerade dieses Hippe und sicherlich sehr komplexe Programmieren von Mathematischem Nonsens geht doch ganz klar über den Sinn und die eigentliche Idee einer Programmiersprache hinaus.
    Programmiersprachen sind imho dazu gedacht Abläufe am Computer formulieren zu können um damit zu einer Problemlösung oder Vereinfachung von real existierenden Problemen oder Abläufen beitragen zu können.
    Sicher mag man Spaß daran haben, derartig komplexe Befehlsstrukturen zu formulieren um o.g. Effekte des "Ui" und "boah ey" zu erzielen, aber du kannst mir nicht sagen, dass dies die eigentliche Funktion einer Programmiersprache ist, ausser vielleicht von ein paar mehr oder weniger exotischen Derivaten wie z.B. das weltbekannte "Brainfuck".

    Programmiersprachen sind aus meiner Sicht immer mit einem Zweck und einem Hintergrund verbunden, für den sie gedacht sind. Das ganze wird dann zwar meist erweitert, aber die Grund-Idee bleibt ja weiterhin bestehen.
    Und natürlich finde ich, ganz subjetiv, die Programmiersprache toll, mit der ich das meiste programmiere, ganz einfach aus dem Grund, da sie mir ohne viel Aufwand Probleme löst und ich sie zuverlässig auf bestimmte Aufgaben anwenden kann.

    Das ganze soll jetzt aber nicht meine Bewunderung für dieses Code-Snippet vertuschen, das ich gleich selber mal ausprobieren will :thumb:
  7. Autor dieses Themas

    c****s

    trueweb, Ich wollte hier auch nie den Anspruch erheben, dass das hier Zweck, Sinn und Ziel von C ist. . .
    Meine Absicht war lediglich einen - vielleicht auch zum Teil humoristischen - Anstoß zu geben, C mal von einer anderen Warte aus zu betrachten.

    Erasmuz, du hast Recht, dass das nicht die Funktion der Sprache ist, solchen Code zu erzeugen, aber ich habe vermutet, dass es hier -wie du schon geschrieben hast- im Forum Leser gibt, die auch den von dir genannten "Spaß" an C sehen und sich auch mal gerne ein Codesnippet anschauen, dass an die Grenzen eines Compilers gehen. Und Brainfuck ist eine schöne Implementiertung einer Touringmaschine.

    Das ganze war eher zur Unterhaltung gedacht und als Blick über den Tellerrand. Ich hoffe hier muss nicht alles bierernst sein.
  8. schrotti12

    Moderator Kostenloser Webspace von schrotti12

    schrotti12 hat kostenlosen Webspace.

    Löse komplexe Probleme mal rekursiv. Da geht der Speicherbedarf ins Uferlose...
    Aber irgendwie finde ich es so schon kompliziert genug, dass ich mir nicht über derartige Dinge Gedanken mache. Wozu auch?! Ich programmiere lieber sinnvolle Dinge... Zumal solche Sachen auch in einer feuchtfröhlichen Gesellschaft nicht zu einem Lacher führen, da sowas einfach keiner versteht.

    Ach ja, und als kompiliert und lauffähig bezeichne ich etwas erst, wenn der Compiler keine Warnings mehr auspuckt...
  9. Autor dieses Themas

    c****s

    schrotti12 schrieb:
    Löse komplexe Probleme mal rekursiv. Da geht der Speicherbedarf ins Uferlose...
    Aber irgendwie finde ich es so schon kompliziert genug, dass ich mir nicht über derartige Dinge Gedanken mache. Wozu auch?! Ich programmiere lieber sinnvolle Dinge... Zumal solche Sachen auch in einer feuchtfröhlichen Gesellschaft nicht zu einem Lacher führen, da sowas einfach keiner versteht.

    Ach ja, und als kompiliert und lauffähig bezeichne ich etwas erst, wenn der Compiler keine Warnings mehr auspuckt...


    Würden wir meines Erachtens immer nur sinnvolle Dinge tun, würden wir sehr schnell in eine wissenschaftliche Stagnation reinlaufen. Man muss auch mal Spielen dürfen. Ich meine, viele tolle Dinge wurden Dank des Spieltriebs des Entdeckers erreicht. Neben ein paar Serendipiditäten (z.B. Penicillin) die "einfach so" entdeckt wurden.

    Sorry, ich meinte wir wären hier nicht "in einer feuchtfröhlichen Gesellschaft", sonder in einem C-Forum. Mir ist schon klar, dass man beim dritten Bier keinen Witz erzählen braucht, der mit "Läuft ein Nabla-Operator durch die Fußgängerzone" beginnt. Geek-sein dahin, wo's hingehört.

    Kompiliert ist etwas, das aus dem Compiler rausfällt. Lauffähig ist etwas, das läuft.

    Und btw, ich hatte bereits erwähnt, dass das ganze kein Aufruf war, solchen Code zu schreiben oder vorzuziehen. Aber manchmal hilft auch wirrer Code, ein Fitzelchen neues Verständnis für den eigenen "normalen" Code zu entwickeln (und wenn es ist, dass man z.B. zum ersten Mal einen ternary operator sieht). Ich wollte mit dem Post niemandem auf die Füße treten, sondern habe nur gehofft, dass hier vielleicht auch ein Leser ist, der sich mal mit etwas Exotischem auseinandersetzen will.

    Nun mal ein ernster Beitrag: Es ist richtig, dass alle rekursiven Algorithmen auch iterativ dargestellt werden können und umgekehrt. Die Laufzeit der iterativen ist in der Regel besser und -ich stimme dir voll zu- der Speicherbedarf erheblich geringer und man vermeidet diese häßlichen Stapelüberläufe. Nur gerade bei den von dir genannten komplexen Problemen wird die Umwandlung eines rekursiven Problems (was i.d.R. die "natürlichere" Form ist) in ein iteratives ungemein aufwendig. Bedenkt man auch noch, dass immer mehr die Entwicklungszeit (aus wirtschaftlichen Interessen) mehr Gewicht gegenüber der Laufzeit gewinnt, ist eine iterative Lösung nicht automatisch die zu bevorzugende. Es hängt IMHO schlicht und ergreifend von der Gestaltung des einzelnen Problems und der Rahmenbedingungen ab, ob der rekursive oder der iterative Ansatz gewinnversprechnder ist.

    Beitrag zuletzt geändert: 4.6.2009 14:23:48 von census
  10. schrotti12

    Moderator Kostenloser Webspace von schrotti12

    schrotti12 hat kostenlosen Webspace.

    Na ja. Ich würde C nicht für sowas missbrauchen. Wenn es schon so schöne C-Spezialitäten, benutze ich die auch. Wenn ich was krankes suche, nehm ich Brainfuck...

    Ich verstehs nur einfach nicht, warum jemand seine Zeit in exotische/esoterische Implementierungen investiert.

    Und wir haben in der Schule schlechtere Noten bekommen, wenn gcc Warnings auswirft...
  11. Hm... nach nem Weilchen überlegen und rumtesten ist mir eigentlich alles klar geworden. Ich verstehe nur den Sinn dieser Sache nicht ganz:
    _<_/_<<(_/_<<(_/_<<(_/_<<_/_)))

    _/_ ist ja 1. Also, wenn man das einsetzt:
    _<1<<(1<<(1<<(1<<1)))

    Jetzt die Klammern auflösen:
    _<1<<(1<<(1<<(2)))
    _<1<<(1<<(4))
    _<1<<(16)
    _<131072 (2^17)

    Was das genau macht verstehe ich net...
  12. Autor dieses Themas

    c****s

    schrotti12 schrieb:
    Na ja. Ich würde C nicht für sowas missbrauchen. Wenn es schon so schöne C-Spezialitäten, benutze ich die auch. Wenn ich was krankes suche, nehm ich Brainfuck...

    Ich verstehs nur einfach nicht, warum jemand seine Zeit in exotische/esoterische Implementierungen investiert.

    Und wir haben in der Schule schlechtere Noten bekommen, wenn gcc Warnings auswirft...


    Die Sache mit den esoterischen Sprachen ist für mich persönlich einfach: Sie sind interessant. Brainfuck ist ganz nett, Befunge nochmal einen Schritt interessanter, da 2-Dimensional.

    Wer fremde Sprachen nicht kennt, weiß nichts von seiner eigenen.
    (cit. Johann Wolfgang v. Goethe)

    Warum ich in sowas Zeit investiere? Zum einen, hab ich ein allgemeines Interesse an Sprachen (aller Art) zum anderen, weil es einem hilft gewisse Scheuklappen abzuwerfen. Man muss ja nicht immer Golf fahren, sondern -wenn man schon die Möglichkeit haben sollte- auch mal einen 2CV, einen Hummer, einen Holzvergaser (mit Fahrzeug außenrum) und ein Quad. Desweiteren geben gerade diese "kranken" Sprachen doch den ein oder anderen interessanten Input zur Thematik Compiler-Bau, mit der ich mich auch auf Arbeit viel beschäftigen habe dürfen / müssen. Sprachen, Projekte oder Code-Styles die an die Extrema gehen, vermitteln eben andere Aspekte als das produktive C, das man auf Arbeit schreibt. Auch kann man an solchen Codeteilen den Compiler mal unter die Haube schauen, wie er mit grenzwertigen Dingen umgeht.

    Die Tatsache, dass ihr in der Schule schlechtere Noten bekommen habt, wenn gcc Warnings auswarf, macht mich ein bisschen neidisch. Da ich leider in der Schule nur Rechnen hatte, allerdings Informatik und Mathematik erst im Studium.

    nikic schrieb:
    Hm... nach nem Weilchen überlegen und rumtesten ist mir eigentlich alles klar geworden. Ich verstehe nur den Sinn dieser Sache nicht ganz:
    _<_/_<<(_/_<<(_/_<<(_/_<<_/_)))

    _/_ ist ja 1. Also, wenn man das einsetzt:
    _<1<<(1<<(1<<(1<<1)))

    Jetzt die Klammern auflösen:
    _<1<<(1<<(1<<(2)))
    _<1<<(1<<(4))
    _<1<<(16)
    _<131072 (2^17)

    Was das genau macht verstehe ich net...


    Das ist die Abbruchbedingung für die Rekursion:

    _<131072?___():_;


    Solange die Variable _ kleiner als 131072 ist, rufe die Routine ___ erneut auf, sonst kuck dir die Variable _ an und mach garnix damit.

    ;c;t;z;T(){++t,t<=c>>t/t?c/t*t-c?T():z:printf("%d\n",c);}C(){t^=t,++t;T(),++c;c<z?C():z;}main(){z^=z,z++,z<<=z,z<<=z,z++,z++,z*=z*z;c^=c,c++,c++,c,C();}


    Beitrag zuletzt geändert: 4.6.2009 16:35:37 von census
  13. census schrieb:
    Das ist die Abbruchbedingung für die Rekursion:

    _<131072?___():_;


    Solange die Variable _ kleiner als 131072 ist, rufe die Routine ___ erneut auf, sonst kuck dir die Variable _ an und mach garnix damit.

    Naja, das ist klar. So blöd bin ich auch nicht. Ich versteh nur nicht, was die 131072 soll...

    Ich hatte iwo mal ne drei Zeilen Implementierung der Mandelbrotmenge gesehen... bloß wieß ich net wo.

    Beitrag zuletzt geändert: 4.6.2009 16:46:34 von nikic
  14. Autor dieses Themas

    c****s

    nikic schrieb:
    Ich versteh nur nicht, was die 131072 soll...


    Das ist einfach nur ne Hausnummer. Frei erfunden. Da könnte auch 42 stehen oder UINT_MAX.
  15. Ich finde diesen Code sinnfrei, was willst du denn damit?
    In ein Progr. einbinden?


    Hast aber REcht, isst mal ganz lustig.


    Grüße.
  16. halo3 schrieb:
    Ich finde diesen Code sinnfrei, was willst du denn damit?
    In ein Progr. einbinden?


    Hast aber REcht, isst mal ganz lustig.


    Grüße.


    Alles, was er damit zeigen will ist, dass C auch mal anders aussehen kann. Mich persönlich hat es sehr gewundert, dass das mit Visual C++ problemlos kompiliert, nichtmaln Warning.

    Noch zwei Fragen:
    ;_;__;___
    [...]
    	_^=_,__^=__

    Hm... wofür das ; ganz am Anfang?
    Und dann noch: _^=_ sollte ja nullsetzen, oder? Aber afaik werden globale Variablen automatisch genullt, oder etwa nicht? Zumindest wenn ichs weggenommen habe gings noch.
  17. Autor dieses Themas

    c****s

    nikic schrieb:

    Hm... wofür das ; ganz am Anfang?
    Und dann noch: _^=_ sollte ja nullsetzen, oder? Aber afaik werden globale Variablen automatisch genullt, oder etwa nicht? Zumindest wenn ichs weggenommen habe gings noch.


    Das ; am Anfang sieht einfach nur hübsch aus. Das mit dem automatisch Nullen ist so eine Sache, einige OS machen das, andere nicht. Also lieber auf Nummer sicher gehen und per Hand auf Null setzen. Das mit XOR zu machen ist nur ein Andenken als Assembly, weil es dort erheblich schneller ging, ein Register mit sich selbst zu verxoren, als dorthinein eine 0 zu laden.
  18. Hm... ich hab mir das nochmal durch den Kopf gehen lassen: Das ist doch sichern fetter Hack, oder? Wenn man es sich so überlegt, printf ohne stdio... Normalerweise hätte das zu nem Fehler füren müssen...
  19. nikic schrieb:
    Normalerweise hätte das zu nem Fehler füren müssen...

    Richtig. Der Compiler(GCC) schmeißt jedoch nur eine Warnung. Es ist also kein wirklicher Hack, da der Compiler zu lasch ist. Wahrscheinlich kennt der Compiler einige Funktionen auch ohne die entsprechenden Header-Dateien, weil sie sehr häufig sind.
  20. bladehunter schrieb:
    nikic schrieb:
    Normalerweise hätte das zu nem Fehler füren müssen...

    Richtig. Der Compiler(GCC) schmeißt jedoch nur eine Warnung. Es ist also kein wirklicher Hack, da der Compiler zu lasch ist. Wahrscheinlich kennt der Compiler einige Funktionen auch ohne die entsprechenden Header-Dateien, weil sie sehr häufig sind.


    Hm, also bei VS hat er garnichts von sich gegeben. Aber sonst gibgt immer nen Error, wenn mans einfach so nutzt...
  21. nikic schrieb:
    bladehunter schrieb:
    Hm, also bei VS hat er garnichts von sich gegeben. Aber sonst gibgt immer nen Error, wenn mans einfach so nutzt...

    Nein. Im Falle von printf nicht.
    //hello.c
    int main( int argc, char ** argv ) {
            printf( "%d\n", 42 );
            return 0;
    }

    > gcc hello.c 
    hello.c: In Funktion »main«:
    hello.c:2: Warnung: Unverträgliche implizite Deklaration der eingebauten Funktion »printf«
  22. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!