Wie funktional ist C++11?



  • Shade Of Mine schrieb:

    Zeus schrieb:

    Du meinst die Compiletime gehört zu Laufzeit zu. Ohne Compiler will ich sehen wie sich Code zu eine Anwendung transformiert.

    Indem du zB jittest. Sobald du aktzeptierst dass es Just In Time Compiling gibt, wirst du erkennen dass Code in jedem Stadium transformiert werden kann.

    Sind wir bisschen blind, noch mal lesen und bitte verstehen!



  • Jede Sprache kann zu jedem Zeitpunkt Kompiliert werden. Deshalb ist deine Argumentation eben so engstirnig.

    Da gebe ich dir recht, aber ich wuerde gern Kompilieren,Linken, Deployment, c++ Interpreter, Jit herauslassen. Dann muss man ueber alles reden. Ueber alles kann man aber nicht reden, also muss man schweigen. Deswegen kann ich auch nicht auf diese Punkte eingehen.



  • knivil schrieb:

    Objektorientiert heißt (vereinfacht), es gibt Objekte von Klassen

    Bullshit! In C++ vielleicht. Es gibt sehr viele verschiedene Auffassungen von "objektorientiert". CLOS mit generischen Funktionen, basierend auf Prototypen wie in Javascript, Nachrichten/Methoden wie in C++ oder Smalltalk, Type classes wie in Haskell, ... aber das ist nicht Thema.

    Genau das ist dein Problem! Das sind alles keine Auffassungen, sondern Umsetzungen. Der Begriff "Klasse" hat auch erstmal wenig mit dem Schlüssenwort "class" in C++ zu tun. class in C++ bietet eine einfache Möglichkeit, eine "Klasse" aus der objektorientierten Programmierung abzubilden. In C kann ich auch Klassen abbilden, aber etwas umständlicher über Strukturen und Funktionspointer. In Haskell kann ich Typklassen erstellen und damit etwas umsetzen, was dem Klassen- und Vererbungskonzept aus der OOP sehr nahe kommt.
    Entsprechend weiter wird der Begriff "Objekt" in C++, C und Haskell mit Variablen abgedeckt. Das hat aber alles nichts mit Auffassungen zu OOP zu tun, sondern nur mit Umsetzungen.

    Ebenso gibt es diese Begriffe in der funktionalen Programmierung. Z.B. den Begriff "Funktion". Die C++-Funktionen eignen sich dafür nur bedingt, weil sie keine FCCs sind. Funktoren und Lambdas eignen sich aber. Ich muss also Kompromisse bei der Umsetzung eingehen (genauso wie ich nicht kompromisslos OOP in C umsetzen kann), aber ich kann es umsetzen.

    Ich zitiere nochmal aus dem Wikipedia-Artikel zu "Programmierparadigma": "Ein Programmierparadigma ist ein fundamentaler Programmierstil". Also ein Stil. Es geht nicht darum, ob die Sprache auf die Turingmaschiene oder das Lambda-Kalkül zurück ging, oder ob sie das "class"-Schlüsselwort besitzt oder nicht beseitzt, es geht nur darum, wie man einen bestimmten Stil in einer bestimmten Sprache umsetzen kann. Und das geht in vielen Sprachen mehr oder weniger gut. Es tut mir sehr leid, wenn dir das zu weit gefasst ist, aber so ist nunmal die Definition. Wäre die Frage "ist C++ eine funktionale Programmiersprache", wäre die Antwort ganz klar nein.

    knivil schrieb:

    Also mal Butter bei die Fische:

    Grundlage Lambda-Kalkül

    Nein.

    Egal.

    knivil schrieb:

    Funktionen als first class values

    Nein.

    Doch durch Funktoren und Lambdas.

    knivil schrieb:

    Funktionen höherer Ordnung

    Sehr beschraenkt.

    Doch mit Funktoren und Lamdas.

    knivil schrieb:

    Typsystem

    Hindley-Milner Type System? Nein.

    Ich wüsste ja nicht, dass ein Typsystem Voraussetzung wäre (z.B. LISP oder das Lambda-Kalkül haben beide keins), aber C++ hat ein Typsystem. Das es nicht so strikt wie Haskell ist, spielt keine Rolle.

    knivil schrieb:

    Typinferenz

    Sehr beschraenkt.

    Auch hier wüsste ich nicht, das das Voraussetzung ist

    knivil schrieb:

    Referentielle Transparenz

    Ja, moeglich. Wird aber nicht erzwungen oder kenntlich gemacht.

    Natürlich wird es nicht erzwungen, C++ ist eine Mehrparadigmensprache. Aber wie schon erwähnt ist funktionale Programmierung ein Stil, dem ich entweder folgen kann oder auch nicht.



  • @ipsec
    Es gibt zwei unterschiedliche konzeptuelle Modelle zur Objektorientierung. Klassenbasiert und Protypebasierend.

    Verstandnisfrage!
    Mit Hindley-Milner ist Typinferenz gemeint?



  • Es heißt übrigens der Lambda-Kalkül.
    Und noch was: Lisp basiert nicht wirklich auf dem Lambda-Kalkül, der gute John McCarthy hatte das damals nicht so richtig verstanden, als er seine anonymen Funktionen LAMBDA nannte. Im Lambda-Kalkül haben Variablen lexikalische Bindung, das war im Ur-LISP nicht so.



  • a) Scheme und Common Lisp haben lexical scoping. Ich sehe kein Problem. Aber schauen wir uns das Original an: http://www-formal.stanford.edu/jmc/recursive.html .

    we need a distinction between functions and forms and a notation for expressing this distinction. This distinction and a notation for describing it, from which we deviate trivially, is given by Church [3]

    3. A. CHURCH, The Calculi of Lambda-Conversion (Princeton University Press, Princeton, N. J., 1941).

    D.h. auch wenn das Ur-Lisp nicht lexical scoping umgesetzt hat, ist es doch stark im Lambda-Kalkuel verwurzelt.

    b) Ich bevorzuge Wikipedia-Artikel auf Englisch, da vieles in den deutschen Seiten "anfechtbar" ist:

    functional programming is a programming paradigm that treats computation as the evaluation of mathematical functions and avoids state and mutable data

    Waehrend ich Programmzustand in C++ durchaus verstecken kann, so ist es in C++ nicht moeglich (oder nur in trivialen Faellen), Berechnungen nicht als Evaluation von mathematischen Funktionen behandeln. Denn genau das macht das Lambda-Kalkuel. Es ist deshalb nicht egal. Selbst in der deutschen Version stosse ich auf:

    Die funktionale Programmierung entspringt der akademischen Forschung. In den 1930er Jahren arbeiteten verschiedene Personen am Lambda-Kalkül. Hierbei geht es um Funktionen und deren Auswertung.

    c)

    Doch durch Funktoren und Lambdas.

    Ja, Closures koennen mit Objekten nachgebaut werden, indem der Klammeroperator ueberladen wird. Aber: "Objects are a poor man's closures".

    d) Zum Artikel von Kalkuel: Ich bevorzuge das. http://www.duden.de/rechtschreibung/Kalkuel_Taktik_Strategie .



  • knivil schrieb:

    b) Ich bevorzuge Wikipedia-Artikel auf Englisch, da vieles in den deutschen Seiten "anfechtbar" ist:

    functional programming is a programming paradigm that treats computation as the evaluation of mathematical functions and avoids state and mutable data

    Waehrend ich Programmzustand in C++ durchaus verstecken kann, so ist es in C++ nicht moeglich (oder nur in trivialen Faellen), Berechnungen nicht als Evaluation von mathematischen Funktionen behandeln. Denn genau das macht das Lambda-Kalkuel. Es ist deshalb nicht egal.

    Ich bestreite nicht, dass funktionale Programmierung und allgemein funktionale Programmierpsrachen auf das Lambda-Kalkül zurückgehen. Du musst aber mal den Artikel zu Programmierparadigma lesen, diesmal auf Englisch: "A programming paradigm is a fundamental style of computer programming". Da haben wir wieder den Stil. Und diesen kann ich in C++ nachbauen. Ich muss mehr Arbeit leisten (nötiger Unterbau, der bei funktionalen Sprachen schon im Compiler steckt), ich muss teilweise Kompromisse eingehen ("Objects are a poor man's closures" ist schon richtig), der Compiler optimiert nicht in der Form, wie er es bei einer funktionalen Sprache machen würde, aber ich kann den funktionalen Stil umsetzen.
    Die Antwort "gar nicht" auf die Frage "Wie funktional ist C++" ist also so pauschal falsch.



  • knivil schrieb:

    D.h. auch wenn das Ur-Lisp nicht lexical scoping umgesetzt hat, ist es doch stark im Lambda-Kalkuel verwurzelt.

    Es basiert nur oberflächlich darauf. Er hat sich inspirieren lassen, es aber nicht richtig umgesetzt.

    d) Zum Artikel von Kalkuel: Ich bevorzuge das. http://www.duden.de/rechtschreibung/Kalkuel_Taktik_Strategie .

    Es gibt da nichts zu bevorzugen, das eine Wort ist sächlich ("ins Kalkül ziehen"), das andere männlich ("der Lambda-Kalkül"). So ähnlich wie bei der/das Modul. Oder sogar der/das Teil, der/das Schild.



  • http://de.wikipedia.org/wiki/Kalkül

    Das Wort Kalkül im logischen und mathematischen Sinn ist ein Maskulinum (der Kalkül). Kalkül im umgangssprachlichen Sinn wird auch als Neutrum verwendet (das Kalkül, deshalb auch „ins Kalkül ziehen“) und wird in der Bedeutung von „Berechnung“ oder „Überlegung“ verwandt.[1]



  • ipsec schrieb:

    Die Antwort "gar nicht" auf die Frage "Wie funktional ist C++" ist also so pauschal falsch.

    Also ist ein Still eine Spracheigenschaft?



  • Zeus schrieb:

    ipsec schrieb:

    Die Antwort "gar nicht" auf die Frage "Wie funktional ist C++" ist also so pauschal falsch.

    Also ist ein Still eine Spracheigenschaft?

    Nein, Eigenschaft des Programmierers.

    Und die Sprachen helfen dem Programmierer beim Umsetzen seines Stils/Paradigmas mal mehr und mal weniger gut.

    Man bedenke den Beruehmten Satz:
    Ein echter Programmierer kann in jeder Sprache FORTRAN schreiben.



  • Shade Of Mine schrieb:

    Zeus schrieb:

    ipsec schrieb:

    Die Antwort "gar nicht" auf die Frage "Wie funktional ist C++" ist also so pauschal falsch.

    Also ist ein Still eine Spracheigenschaft?

    Nein, Eigenschaft des Programmierers.

    Um so erstaunlicher ist es, dass er sich selbst wiederspricht.



  • Zeus schrieb:

    Shade Of Mine schrieb:

    Zeus schrieb:

    ipsec schrieb:

    Die Antwort "gar nicht" auf die Frage "Wie funktional ist C++" ist also so pauschal falsch.

    Also ist ein Still eine Spracheigenschaft?

    Nein, Eigenschaft des Programmierers.

    Um so erstaunlicher ist es, dass er sich selbst wiederspricht.

    Ein Stil ist nichts von beidem, sondern eine Art und Weise der Programmierung. Und eine Sprache kann bei der Umsetzung eines Stils mehr oder weniger unterstützend sein. Wo widerspreche ich mich?



  • Ich seh ein Konflikt zwischen

    Wäre die Frage "ist C++ eine funktionale Programmiersprache", wäre die Antwort ganz klar nein.

    Die Antwort "gar nicht" auf die Frage "Wie funktional ist C++" ist also so pauschal falsch.

    den beiden Aussagen.



  • Zeus schrieb:

    Ich seh ein Konflikt zwischen

    Wäre die Frage "ist C++ eine funktionale Programmiersprache", wäre die Antwort ganz klar nein.

    Die Antwort "gar nicht" auf die Frage "Wie funktional ist C++" ist also so pauschal falsch.

    den beiden Aussagen.

    Ich dachte das wäre deutlich 😕
    C++ ist definitiv keine funktionale Programmiersprache, trotzdem kann man mehr oder weniger gut funktional in C++ programmieren. Also kann man nicht sagen, C++ hätte keinerlei funktionalen Eigenschaften.



  • ipsec schrieb:

    C++ ist definitiv keine funktionale Programmiersprache, trotzdem kann man mehr oder weniger gut funktional in C++ programmieren. Also kann man nicht sagen, C++ hätte keinerlei funktionalen Eigenschaften.

    Und wo ist die Grenze um funktional zu sein?



  • @Zeus & ipsec:
    Ich glaube hier liegt ein Misverständnis vor.

    Man kann bei der Einteilung von Programmiersprachen entweder Schubladen machen, und dann jede Sprache in genau eine Schublade tun. Wenn man es so macht, dann landet C++ nicht in der "funktional" Schublade, sondern z.B. in der "multi paradigm" Schublade.

    Man kann aber auch Checkboxen machen, und für jede Sprache sämtliche Checkboxen markieren, die für die jeweilige Sprache passen. In dem Fall könnte man C++ ein "funktional" Hakerl verpassen (neben "imperativ" und noch vielen anderen).

    "Wie funktional ist C++" ist klar eine Checkboxen-Frage (mit "analogen Checkboxen", hihi), die Antwort "gar nicht" wäre daher falsch.

    "Ist C++ eine funktionale Programmiersprache" kann man aber sowohl als Schubladen-Frage als auch als Checkboxen-Frage verstehen.
    Du, ipsec, hast sie wohl als Schubladen-Frage verstanden, und du, Zeus, vermutlich als Checkboxen-Frage.



  • hustbaer schrieb:

    @Zeus & ipsec:
    Ich glaube hier liegt ein Misverständnis vor.

    Ja, aber am Maßstab, wieviel funktionale Aspekte ein Programmiersprache spielt keine Rolle, sondern ihre Integration zum Paradigma. C#, D, F# und Scala sind funktional (als CheckBox-Frage). Bei C# und D versteh ich es nicht ^^.



  • ipsec schrieb:

    Wäre die Frage "ist C++ eine funktionale Programmiersprache", wäre die Antwort ganz klar nein.

    Wie ihr alle Unrecht habt!
    Die Antwort ist ganz klar ja:

    <a href= schrieb:

    C++-Artikel in Wikipedia">Paradigmen: Multiparadigmen (imperativ, strukturiert, objektorientiert, generisch, funktional)

    </ironie>

    hustbaer schrieb:

    "Wie funktional ist C++" ist klar eine Checkboxen-Frage (mit "analogen Checkboxen", hihi), die Antwort "gar nicht" wäre daher falsch.

    Gut. Und was ist die Antwort auf "Wie funktional ist Assembler"? C++-Code macht das gleiche wie Assemblercode, also ist Assembler funktional. Und Brainfuck? Analog dazu ebenfalls funktional. Du kannst das für jede Sprache machen, die nur turing-vollständig ist. Wenn du mir folgen konntest, dann sag mir: Gibt es eine turing-vollständige Sprache, die irgendein Programmierparadigma (das von einer anderen turing-vollständigen Sprache unterstützt wird) nicht erlaubt? Nein.

    Das Problem ist, dass je nach dem, wie man den Begriff Paradigma versteht, eine andere Antwort herauskommt.

    Wenn man das Wort so versteht, wie es in der englischen Wikipedia steht, ein fundamentaler Programmierstil, dann muss man sagen: C++ kann funktional sein, aber der Stil ist nicht fundamental in der Sprache verankert. Daher gehört in der Checkbox ein "gar nicht" hin und der Eintrag in der – wohlgemerkt deutschen – Wikipedia gehört raus.



  • @Zeus:
    Tut mir leid, aber den Satz verstehe ich nicht 😕


Anmelden zum Antworten