Was sind die Vorteile der Verwendung von C # vs F # oder F # vs C #?

Ich arbeite für ein Technologieunternehmen, das mehr Prototypen als Produktversand macht. Ich wurde gerade gefragt, was ist der Unterschied zwischen C # und F #, warum hat MS F # erstellt und welche Szenarien wären besser als C #?

Ich benutze die Sprache schon seit einer Weile und ich liebe es, so dass ich leicht über die großartigen Features von F # sprechen kann. Allerdings fehlt mir die Erfahrung in C #, um zu sagen, warum wir eins über das andere verwenden sollten.

Was sind die Vorteile von C # vs F # oder F # vs C #?

    Allgemeine Vorteile der funktionalen Programmierung über Imperativsprachen:

    In einer funktionalen Programmiersprache wie F # können Sie viele Probleme einfacher, näher an ihrer Definition und prägnanter formulieren und Ihr Code ist weniger errorsanfällig (Unveränderlichkeit, leistungsfähigeres Typsystem, intuitive rekursive Algorithmen). Sie können programmieren, was Sie meinen und nicht, was der Computer von Ihnen verlangt 😉 Sie werden viele Diskussionen wie diese finden, wenn Sie sie googlen oder sogar nach SO suchen.

    Besondere F # -Nutzen:

    • Asynchrone Programmierung ist extrem einfach und intuitiv mit async {} -Ausdrücken – Auch bei ParallelFX ist der entsprechende C # -Code wesentlich größer

    • Sehr einfache Integration von Compiler-Compilern und domänenspezifischen Sprachen

    • Erweitern Sie die Sprache, wie Sie es brauchen: LOP

    • Maßeinheiten

    • Flexiblere Syntax

    • Oft kürzere und elegantere Lösungen

    Schauen Sie sich dieses Dokument an

    Die Vorteile von C # liegen darin, dass es oft “imperativer” Anwendungen (User-Interface, imperative Algorithmen) genauer ist als eine funktionale Programmiersprache, dass das verwendete .NET-Framework zwingend ausgelegt ist und es weiter verbreitet ist.

    Darüber hinaus können Sie F # und C # in einer einzigen Lösung zusammenfassen, sodass Sie die Vorteile beider Sprachen kombinieren und dort einsetzen können, wo sie benötigt werden.

    Es ist, als würde man fragen, was ein Hammer über einen Schraubenzieher bringt. Auf einer extrem hohen Ebene machen beide im Wesentlichen dasselbe, aber auf der Implementierungsebene ist es wichtig, das optimale Werkzeug für das zu wählen, was Sie erreichen möchten. Es gibt Aufgaben, die in c # schwierig und zeitraubend sind, aber in f # einfach sind – wie wenn man einen Nagel mit einem Schraubenzieher schlägt. Sie können es sicher tun – es ist einfach nicht ideal.

    Datenmanipulation ist ein Beispiel, auf das ich persönlich hinweisen kann, wo f # wirklich scheint und c # möglicherweise unhandlich sein kann. Auf der anderen Seite würde ich sagen (allgemein gesprochen), dass komplexe Stateful UI in OO (c #) einfacher ist als in funktionalen (f #). (Es würde wahrscheinlich einige Leute geben, die damit nicht einverstanden sind, da es gerade “cool” ist, “zu beweisen”, wie einfach es ist, irgendetwas in F # zu machen, aber ich stehe dazu). Es gibt unzählige andere.

    • F # hat bessere performance als C # in Math
    • Sie könnten F # -Projekte in der gleichen Lösung mit C # verwenden (und von einem zum anderen rufen)
    • F # ist wirklich gut für komplexe algorithmische Programmierung, finanzielle und wissenschaftliche Anwendungen
    • F # logisch ist wirklich gut für die parallele Ausführung (es ist einfacher, F # Code auf parallelen coreen auszuführen, als C #)

    Um Ihre Frage zu beantworten, wie ich es verstehe: Warum C # verwenden? (Sie sagen, Sie sind bereits auf F # verkauft.)

    Erst einmal. Es ist nicht nur “funktional gegen OO”. Es ist “functional + OO gegen OO”. C # ‘s functionsmerkmale sind ziemlich rudimentär. F # sind nicht. In der Zwischenzeit macht F # fast alle OO-functionen von C #. In den meisten Fällen endet F # als eine Obermenge der C # functionalität.

    Es gibt jedoch einige Fälle, in denen F # nicht die beste Wahl ist:

    • Interop. Es gibt viele Bibliotheken, die von F # einfach nicht zu komfortabel sind. Vielleicht verwerten sie bestimmte C # OO-Dinge, die F # nicht gleich macht, oder vielleicht sind sie auf Interna des C # -Compilers angewiesen. Zum Beispiel, Ausdruck. Während Sie ein F # -Zitat einfach in einen Ausdruck umwandeln können, ist das Ergebnis nicht immer genau das, was C # erzeugen würde. Bestimmte Bibliotheken haben ein Problem damit.

      • Ja, Interop ist ein ziemlich großes Netz und kann bei einigen Bibliotheken zu etwas Reibung führen.

      • Ich betrachte Interop auch, wenn Sie eine große Codebasis haben. Es macht vielleicht keinen Sinn, Teile in F # zu schreiben.

    • Entwurfswerkzeuge. F # hat keine. Es bedeutet nicht, dass es keine haben könnte , aber gerade jetzt können Sie keine WinForms-App mit F # -Codebehind erstellen. Auch wenn es unterstützt wird, wie in ASPX-Seiten, erhalten Sie IntelliSense derzeit nicht. Sie müssen also sorgfältig überlegen, wo Ihre Grenzen für den generierten Code liegen. Bei einem wirklich kleinen Projekt, das fast ausschließlich die verschiedenen Designer verwendet, lohnt es sich nicht, F # für den “Kleber” oder die Logik zu verwenden. Bei größeren Projekten könnte dies weniger problematisch werden.

      • Dies ist kein intrinsisches Problem. Im Gegensatz zur Antwort von Rex M sehe ich nichts intrinsisches an C # oder F #, was sie besser dazu macht, eine Benutzeroberfläche mit vielen veränderbaren Feldern zu erstellen. Vielleicht bezog er sich auf den zusätzlichen Aufwand, “mutierbar” zu schreiben und < - statt = zu verwenden.

      • Kommt auch auf die verwendete Bibliothek / den verwendeten Designer an. Wir lieben ASP.NET MVC mit F # für alle Controller, dann ein C # -Webprojekt, um die ASPX-Designer zu bekommen. Wir mischen den eigentlichen ASPX-Code inline zwischen C # und F #, je nachdem, was wir auf dieser Seite benötigen. (IntelliSense- gegenüber F # -Typen.)

    • Andere Werkzeuge. Sie erwarten möglicherweise nur C # und wissen nicht, wie sie mit F # -Projekten oder kompiliertem Code umgehen sollen. Außerdem werden F # ‘s Bibliotheken nicht als Teil von .NET ausgeliefert, also haben Sie ein bisschen extra zu versenden.

    • Aber das Problem Nummer eins? Menschen. Wenn keiner deiner Entwickler F # lernen will, oder schlimmer noch, schwere Schwierigkeiten haben bestimmte Aspekte zu verstehen, dann bist du wahrscheinlich Toast. (Obwohl, ich würde behaupten, dass Sie in diesem Fall sowieso Toast sind.) Oh, und wenn das Management nein sagt, könnte das ein Problem sein.

    Ich habe vor einer Weile darüber geschrieben: Warum nicht F #?

    Sie fragen nach einem Vergleich zwischen einer prozeduralen Sprache und einer funktionalen Sprache. Ich bin der Meinung, dass Ihre Frage hier beantwortet werden kann: Was ist der Unterschied zwischen prozeduraler Programmierung und funktionaler Programmierung?

    Warum MS die F # -function erstellt hat, ist einfach: Die Erstellung einer funktionalen Sprache mit Zugriff auf die .Net-Bibliothek hat einfach ihre Marktbasis erweitert. Und da die Syntax mit OCaml fast identisch ist, hat sie wirklich nicht viel Mühe gekostet.

    F # ist noch keine Programmiersprache, wenn Sie es mit C #, C ++, VB vergleichen. C #, C, VB sind alle imperative oder prozedurale Programmiersprachen. F # ist eine funktionale Programmiersprache.

    Zwei Hauptvorteile von funktionalen Programmiersprachen (im Vergleich zu imperativen Sprachen) sind 1. dass sie keine Nebenwirkungen haben. Dies erleichtert das mathematische Nachdenken über Eigenschaften Ihres Programms. 2. dass functionen erstklassige Bürger sind. Sie können functionen als Parameter an andere functionen übergeben, genauso einfach wie andere Werte.

    Es gibt sowohl imperative als auch funktionale Programmiersprachen. Obwohl ich noch keine ernsthafte Arbeit in F # geleistet habe, implementieren wir derzeit eine Planungskomponente in einem unserer Produkte basierend auf C # und werden ein Experiment durchführen, indem wir den gleichen Scheduler in F # programmieren, um zu sehen, ob die Korrektheit des Implementierung kann einfacher validiert werden als mit dem C # -Äquivalent.

    F # ist im Wesentlichen das C ++ funktionaler Programmiersprachen. Sie behielten fast alles von Objective Caml, einschließlich der wirklich dummen Teile, und warfen es so auf die .NET-Laufzeitumgebung, dass es alle schlechten Dinge von .NET mit einbrachte.

    Mit Objective Caml erhalten Sie beispielsweise einen Typ von Null, die Option . Mit F # erhalten Sie drei Arten von Null, Option , Nullable und Referenznull. Das heißt, wenn Sie eine Option haben, müssen Sie zuerst prüfen, ob es “None” ist, dann müssen Sie überprüfen, ob es “Some (null)” ist.

    F # ist wie der alte Java-Klon J #, nur eine Bastardsprache, nur um Aufmerksamkeit zu erregen. Einige Leute werden es lieben, ein paar von denen werden es sogar benutzen, aber am Ende ist es noch eine 20 Jahre alte Sprache, die an die CLR angeheftet ist.

    Einer der Aspekte von .NET, die ich am meisten mag, sind Generika. Selbst wenn Sie in F # prozeduralen Code schreiben, profitieren Sie trotzdem von der Typinferenz. Es macht das Schreiben von generischem Code einfach.

    In C # schreiben Sie standardmäßig konkreten Code, und Sie müssen etwas mehr arbeiten, um generischen Code zu schreiben.

    In F # schreiben Sie standardmäßig generischen Code. Nach mehr als einem Jahr Programmierung in F # und C # finde ich, dass der Bibliothekscode, den ich in F # schreibe, sowohl prägnanter als auch generischer ist als der Code, den ich in C # schreibe, und daher auch wiederverwendbar ist. Ich vermisse viele Möglichkeiten, generischen Code in C # zu schreiben, wahrscheinlich weil ich von den obligatorischen Typ-Annotationen geblendet bin.

    Es gibt jedoch Situationen, in denen die Verwendung von C # bevorzugt ist, abhängig von Geschmack und Programmierstil.

    • C # legt keine Deklarationsreihenfolge zwischen Typen fest, und es ist für die Reihenfolge, in der Dateien kompiliert werden, nicht empfindlich.
    • C # hat einige implizite Konvertierungen, die F # aufgrund von Typinferenz nicht leisten kann.