Was sind die Vorteile von C # vs F # oder F # vs C #? [geschlossen]


93

Ich arbeite für ein Technologieunternehmen, das mehr Prototyping als Produktversand betreibt. Ich wurde gerade gefragt, was der Unterschied zwischen C # und F # ist, warum MS F # erstellt hat und in welchen Szenarien es besser wäre als C #.

Ich benutze die Sprache jetzt schon eine Weile und ich liebe sie, damit ich leicht über die großartigen Funktionen von F # sprechen kann, aber mir fehlt die Erfahrung in C #, um zu sagen, warum wir eine über die andere verwenden sollten.

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


4
Mir scheint, dass es bereits einige Fragen zu SO gibt, die Ihre Frage zumindest teilweise beantworten. Haben Sie versucht, mit dem Schlüsselwort "[F #]" anstelle des Schlüsselworts "f #" zu suchen? ("[f #] Vorteile" zum Beispiel)
Benjol

Antworten:


86

Allgemeine Vorteile der funktionalen Programmierung gegenüber imperativen Sprachen:

Sie können viele Probleme in einer funktionalen Programmiersprache wie F # viel einfacher, näher an ihrer Definition und prägnanter formulieren, und Ihr Code ist weniger fehleranfällig (Unveränderlichkeit, leistungsfähigeres Typensystem, intuitive rekursive Algorithmen). Sie können codieren, was Sie meinen, anstatt was der Computer von Ihnen verlangt ;-) Sie werden viele Diskussionen wie diese finden, wenn Sie sie googeln oder sogar bei SO suchen.

Besondere F # -Vorteile:

  • Asynchrone Programmierung ist mit -expressions extrem einfach und intuitiv - Selbst mit ParallelFX ist der entsprechende C # -Code viel größerasync {}

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

  • Erweitern Sie die Sprache nach Bedarf: LOP

  • Maßeinheiten

  • Flexiblere Syntax

  • Oft kürzere und elegantere Lösungen

Schauen Sie sich dieses Dokument an

Die Vorteile von C # sind, dass es für "imperative" -Anwendungen (Benutzeroberfläche, imperative Algorithmen) häufig genauer ist als für eine funktionale Programmiersprache, dass das verwendete .NET-Framework zwingend entwickelt und weiter verbreitet ist.

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


16
Sie verbinden sich auf sehr seltsame Weise. Beispielsweise können Sie den Operator> in F # überladen. C # -Entwickler können es dann verwenden. F # -Entwickler können dies jedoch nicht. Richtig, F # kann Operatorüberladungen ausgeben, die es nicht verbrauchen kann.
Jonathan Allen

"Dieses Dokument" Link ist defekt ...
Eduardo Brites

36

Es ist wie zu fragen, was der Vorteil eines Hammers gegenüber einem Schraubenzieher ist. Auf einer extrem hohen Ebene tun beide im Wesentlichen dasselbe, aber auf der Implementierungsebene ist es wichtig, das optimale Werkzeug für das auszuwählen, was Sie erreichen möchten. Es gibt Aufgaben, die in c # schwierig und zeitaufwändig sind, in f # aber einfach - wie der Versuch, einen Nagel mit einem Schraubenzieher zu schlagen. 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 leuchtet und c # möglicherweise unhandlich sein kann. Auf der anderen Seite würde ich sagen, dass (im Allgemeinen) komplexe zustandsbehaftete Benutzeroberflächen in OO (c #) einfacher sind als in funktionalen (f #). (Es würde wahrscheinlich einige Leute geben, die damit nicht einverstanden sind, da es momentan "cool" ist, zu "beweisen", wie einfach es ist, irgendetwas in F # zu tun , aber ich stehe dazu). Es gibt unzählige andere.


22
Wenn Sie nur einen Hammer haben, sieht alles aus wie ein Nagel. -Maslow
Charlie Salts

20
Ich werde dies nicht weiter abstimmen, da es bis auf das eine Datenbeispiel keine wirklichen Einzelheiten enthält. Ich weiß, dass es verschiedene Werkzeuge sind. Ich frage, welche Jobs diese beiden Tools im Vergleich zueinander am besten und welche am schlechtesten sind. Ich weiß, dass ein Philips oft das beste Werkzeug für den Job ist, obwohl ein kleinerer Flachkopf funktioniert.
Gradbot

3
Wenn er dich nicht positiv bewertet, werde ich es tun. : P +1
Spencer Ruport

14
Wenn Sie nur einen Hammer haben, sieht alles wie ein Daumen aus.
Ed Power

6
Ich stimme Gradbot zu, dies ist eine gute Antwort, daher keine Ablehnung von mir, aber es geht nicht wirklich um die Besonderheiten der ursprünglichen Fragen. Diese Antwort ist nur eine vage konzeptionelle Erklärung, verfehlt aber wirklich den Punkt, die Frage genau zu beantworten.
Stan R.

27
  • F # hat eine bessere Leistung als C # in Mathe
  • Sie können F # -Projekte in derselben Lösung mit C # verwenden (und von einem zum anderen aufrufen).
  • F # ist wirklich gut für komplexe algorithmische Programmierung, finanzielle und wissenschaftliche Anwendungen
  • F # ist logischerweise sehr gut für die parallele Ausführung (es ist einfacher, F # -Code auf parallelen Kernen auszuführen als C #).

6
Über F # mit besserer Leistung als C # für Mathematik: Anscheinend stimmt das nicht. Siehe thoughtfulcode.wordpress.com/2010/12/30/...
Joh

3
@Joh: inlineist ein offensichtliches Beispiel für etwas, das massive Leistungsverbesserungen in F # bewirken kann, die C # nicht ausdrücken kann.
JD

@ Jon Harrop: Ich habe mich speziell auf Rinats Blogeintrag bezogen. Es scheint, dass die Timings zugunsten von F # auf suboptimalen C # -Code zurückzuführen sind.
Joh

27

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

Zuerst. Es ist nicht nur "funktional gegen OO". Es ist "Functional + OO versus OO". Die Funktionsmerkmale von C # sind ziemlich rudimentär. F # sind nicht. In der Zwischenzeit führt F # fast alle OO-Funktionen von C # aus. Zum größten Teil wird F # zu einer Obermenge der C # -Funktionalität.

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

  • Interop. Es gibt viele Bibliotheken, die sich mit F # einfach nicht so wohl fühlen. Vielleicht nutzen sie bestimmte C # OO-Dinge aus, die F # nicht gleich macht, oder sie verlassen sich auf Interna des C # -Compilers. Zum Beispiel Ausdruck. Während Sie ein F # -Zitat leicht in einen Ausdruck verwandeln 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 Reibungsverlusten führen.

    • Ich denke, Interop schließt auch ein, wenn Sie eine große vorhandene Codebasis haben. Es ist möglicherweise nicht sinnvoll, nur Teile in F # zu schreiben.

  • Design-Tools. F # hat keine. Das bedeutet nicht, dass es keine haben könnte , aber im Moment können Sie keine WinForms-App mit F # -Codebehind erstellen. Selbst wenn es unterstützt wird, wie auf ASPX-Seiten, erhalten Sie derzeit kein IntelliSense. Sie müssen also sorgfältig überlegen, wo Ihre Grenzen für generierten Code liegen. Bei einem wirklich winzigen Projekt, bei dem fast ausschließlich die verschiedenen Designer verwendet werden, lohnt es sich möglicherweise nicht, F # für den "Kleber" oder die Logik zu verwenden. Bei größeren Projekten ist dies möglicherweise weniger problematisch.

    • Dies ist kein intrinsisches Problem. Im Gegensatz zur Antwort des Rex M sehe ich an C # oder F # nichts Eigenes, das es besser macht, eine Benutzeroberfläche mit vielen veränderlichen Feldern zu erstellen. Vielleicht bezog er sich auf den zusätzlichen Aufwand, "veränderlich" schreiben zu müssen und <- anstelle von = zu verwenden.

    • Hängt auch von der verwendeten Bibliothek / dem verwendeten Designer ab. Wir lieben es, ASP.NET MVC mit F # für alle Controller zu verwenden und dann ein C # -Webprojekt, um die ASPX-Designer zu erreichen. Wir mischen den tatsächlichen ASPX "Code Inline" zwischen C # und F #, je nachdem, was wir auf dieser Seite benötigen. (IntelliSense versus 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 die Bibliotheken von F # nicht als Teil von .NET ausgeliefert, sodass Sie ein bisschen mehr zum Versenden haben.

  • Aber das Hauptproblem? Menschen. Wenn keiner Ihrer Entwickler F # lernen möchte oder, schlimmer noch, ernsthafte Schwierigkeiten hat, bestimmte Aspekte zu verstehen, dann stoßen Sie wahrscheinlich an. (Obwohl ich behaupten würde, dass Sie in diesem Fall sowieso anstoßen.) Oh, und wenn das Management nein sagt, könnte dies ein Problem sein.

Ich habe vor einiger Zeit darüber geschrieben: Warum NICHT F #?


6

Sie fordern einen Vergleich zwischen einer prozeduralen Sprache und einer funktionalen Sprache, damit Ihre Frage hier beantwortet werden kann: Was ist der Unterschied zwischen prozeduraler Programmierung und funktionaler Programmierung?

Die Frage, warum MS F # erstellt hat, lautet einfach: Durch das Erstellen einer funktionalen Sprache mit Zugriff auf die .Net-Bibliothek wurde lediglich die Marktbasis erweitert. Und da die Syntax fast identisch mit OCaml ist, war ihrerseits kein großer Aufwand erforderlich.


1
Obwohl ich denke, dass Ihre allgemeine Antwort richtig ist, dass die eigentliche Frage den Vergleich von Programmierparadigmen und nicht von Sprachen betrifft, bin ich der Meinung, dass die Antwort in der Frage, auf die Sie sich beziehen, etwas oberflächlich ist.
Jeroen Huinink

Sie können gerne eine andere Frage vorschlagen, wenn Sie eine bessere haben. Das ist die bestbewertete, die ich bei einer Google-Suche gefunden habe.
Spencer Ruport

1
Ich denke, er hat versucht, freundlich zu sein, dass du wie ein Arsch klingst, weil du gesagt hast, dass F # von Micrsoft nicht viel Mühe erfordert hat.
Matthew Whited

+1 für Marktbasis-Kommentar. Einfach und hat etwas Wahres.
Gradbot

1
Ich kaufe mir diesen anderen Link nicht ein, um meine Frage zu beantworten. C # unterstützt viele funktionale Konstrukte in neueren Versionen.
Gradbot

5

F # ist keine weitere Programmiersprache, wenn Sie es mit C #, C ++, VB vergleichen. C #, C, VB sind alle imperativen oder prozeduralen Programmiersprachen. F # ist eine funktionale Programmiersprache.

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

Sowohl imperative als auch funktionale Programmiersprachen haben ihre Verwendung. Obwohl ich noch keine ernsthafte Arbeit in F # geleistet habe, implementieren wir derzeit eine Planungskomponente in einem unserer Produkte, die auf C # basiert, und werden ein Experiment durchführen, indem wir denselben Planer auch in F # codieren, um festzustellen, ob die Richtigkeit der Die Implementierung kann einfacher validiert werden als mit dem C # -Äquivalent.


4
-1. F # ist eine Multi-Paradigma-Sprache (OO + FP). Nur rein funktionale Sprachen haben keine Nebenwirkungen (wie Haskell), aber F # ist nicht rein.
Mauricio Scheffer

5

F # ist im Wesentlichen das C ++ der funktionalen Programmiersprachen. Sie haben fast alles von Objective Caml ferngehalten, einschließlich der wirklich dummen Teile, und es so auf die .NET-Laufzeit geworfen, dass es auch alle schlechten Dinge von .NET einbringt.

Mit Objective Caml erhalten Sie beispielsweise einen Nulltyp, die Option <T>. Mit F # erhalten Sie drei Arten von Nullen, Option <T>, Nullable <T> und Referenznullstellen. Dies bedeutet, wenn Sie eine Option haben, müssen Sie zuerst überprüfen, ob sie "Keine" ist, und dann überprüfen, ob sie "Einige (null)" ist.

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


2
+1, Dies mag die kalte, harte Wahrheit sein, aber ich bin immer noch ziemlich froh, dass ich eine funktionale Sprache in VS mit .NET verwenden kann
gradbot

1
Ich bin damit einverstanden, dass Nullable <T> den Compiler dazu bringen sollte, ein magisches Aliasing für uns durchzuführen. Ich bin mir nicht sicher, ob es immer funktionieren würde, wenn "Some null" gleich "None" ist - ein Interop-Code könnte sich darauf stützen. Aber Referenz null? Wie können Sie ein großes Loch in .NET umgehen? Jeder Referenztyp in eine Option einschließen? In der Praxis scheint dies nur bei bestimmten Interop-Szenarien ein Problem zu sein.
MichaelGG

12
FWIW, ich habe mehrere Jahre professionell in F # programmiert (länger als fast jeder andere auf der Welt) und ich habe dieses Problem oder den Code Some nullin keinem F # -Code irgendwo gesehen. Von allen Dingen , die Menschen meckern über könnten, hat dies sein waaay auf der Liste nach unten ...
JD

1
Der Vergleich von F # mit C ++ ist etwas weit hergeholt. Viele Teile von C ++ haben eine undefinierte oder unklare Semantik. F # ist einfach und gut definiert. Die Qualität der .NET-Laufzeit kann nicht gegen F # gehalten werden, da jede .NET-Sprache dieselben Probleme aufweist.
Joh

1
In über 2 Jahren professioneller F # -Programmierung wie @Jon habe ich noch nie ein Problem im Zusammenhang mit 'Some null' gesehen. Andererseits habe ich immens von den Funktionen des .Net-Frameworks profitiert.
Marc Sigrist

5

Einer der Aspekte von .NET, die mir am besten gefallen, sind Generika. Selbst wenn Sie prozeduralen Code in F # schreiben, profitieren Sie dennoch von der Typinferenz. Es macht das Schreiben von generischem Code einfach.

In C # schreiben Sie standardmäßig konkreten Code, und Sie müssen zusätzliche Arbeit leisten, um generischen Code zu schreiben.

In F # schreiben Sie standardmäßig generischen Code. Nachdem ich über ein Jahr lang sowohl in F # als auch in C # programmiert habe, finde ich, dass Bibliothekscode, den ich in F # schreibe, sowohl prägnanter als auch allgemeiner ist als der Code, den ich in C # schreibe, und daher auch wiederverwendbarer ist. Ich vermisse viele Möglichkeiten, generischen Code in C # zu schreiben, wahrscheinlich weil ich von den obligatorischen Typanmerkungen geblendet bin.

Es gibt jedoch Situationen, in denen die Verwendung von C # je nach Geschmack und Programmierstil vorzuziehen ist.

  • C # legt keine Deklarationsreihenfolge zwischen Typen fest und ist nicht abhängig von der Reihenfolge, in der Dateien kompiliert werden.
  • C # hat einige implizite Konvertierungen, die sich F # aufgrund von Typinferenz nicht leisten kann.
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.