F# vs IronPython: Wann ist eine bevorzugt, die andere?
Während die Sprachen F# und IronPython sind technisch unterschiedlich, es gibt große überschneidungen zwischen Ihre Nutzungsmöglichkeiten in meiner Meinung nach. Wann ist eine mehr anwendbar, als die anderen?
So weit es für mich Aussehen wie F# ist rechnerisch effizienter, während IronPython erbt eine bessere Bibliothek von Python. Ich bin glücklich, korrigiert werden.
Es ist ein etwas in Frage ist F#, IronPython/IronRuby als C# ist VB.NET? aber die meisten Antworten gibt es über die Sprache Paradigmen, anstatt Ihre tatsächliche Anwendbarkeit.
Bearbeiten: ich denke, ich sollte hinzufügen, ein bisschen mehr hintergrund. Ich habe gute Erfahrungen mit Python im Allgemeinen, und habe gerade gelernt F# nach ein paar zögerlichen funktionale Programmierung Schritte vor, vor allem in Erlang. Ich habe derzeit das Gefühl in der Lage, weiter zu verwenden, entweder Python oder F# in die Zukunft. Ich möchte entscheiden, welche ich verwenden soll und wo. Zum Beispiel:
- Python hat sehr gute Daten-Strukturen als Teil der standard-Bibliothek. Der andere Tag, ich brauchte ein äquivalent von Python
heap
- Modul und es ist nicht verfügbar in der standard-F#/.net-Bibliothek. Punkt für IronPython. - F# verwendet werden können, zu bauen bequemer Bibliotheken, einfacher Zugriff von anderen .Net-Sprachen. Also für ein .Net, die Ihren Wohnsitz Bibliothek, die ich lieber F#.
- Cross-Plattform-Entwicklung. IronPython ist hier besser. F#/Mono verwendbar ist, ist eine viel kleinere Palette von Plattformen und F#/OCaml-Kompatibilität ist nicht leicht zu pflegen, vor allem in Bezug auf Bibliotheken.
- Die IronPython-interaktive shell scheint mir einfacher als der fsi. YMMV.
Also die Frage hinausläuft: gibt es irgendwelche Gründe, abgesehen von einer Präferenz von einem Paradigma zu einem anderen oder einige team-oder corporate-Einstellungen, das würde Sie pick F# anstatt IronPython oder Umgekehrt? Vorausgesetzt, Sie sind ebenso zuversichtlich, in beide? Oder sind Sie genau äquivalent für alle praktischen Zwecke?
Bearbeiten: Ok, Jungs, es sieht Sie haben beurteilt, dass dies eine dumme Frage, downvoting es und die Antworten. Aber es ist wenigstens ehrlich. Also bitte einfach nur ein Hinweis. Ist es unmöglich, zwischen den beiden zu unterscheiden, oder bin ich die Eingabe in einige geheime Tabu durch diese Frage? Wenn es aussieht wie ein troll kann jemand bitte informieren Sie mich?
- Was bevorzugst du mehr (innerhalb der Grenzen Ihrer funktional-und politisch-Anforderungen)?
- Ich glaube nicht, dass es eine dumme Frage, aber es ist eine bizarre one. Sie sind sehr verschiedene Sprachen zu entwickeln, wie auch als eher Nische zu, und ich erwarte nicht, dass mehr als ein paar Menschen auf dem Planeten andere, als Sie jemals hatte, diese Entscheidung zu treffen. Wer hatte wohl gerade ging das mit der Sprache besser vertraut mit.
- Wenn Ihre Frage waren "ehrlich" Sie haben die Tatsache anerkannt, dass ich bereits widerlegt deinem ersten Punkt zweimal mit der Verweisung auf F#'s built-in
Set
Datenstruktur. - Blick. Sie haben nicht widerlegt, noch nichts. Ich habe gesagt, es gibt einen Unterschied zwischen einer Reihe und einer Warteschlange. Sie erwähnten gerade, dass F#
Set
nutzbar ist yest3erday, und Sie gab eine falsche beispielsweise der Nutzung, wo die Priorität ist für die Sortierung verwendet, das ist nicht der wichtigste Punkt. Dennoch, wenn Sie mich überzeugen kann oder andere davon zu überzeugen, Menschen auf die andere Frage, die F#Set
Funktionen als eine Priorität werde ich die Modifikation hier. - danke. Das ist eigentlich eine gute Antwort.
- noch nicht widerlegt, noch nichts. Ich habe gesagt, es gibt einen Unterschied zwischen einer Reihe und einer priority queue". Und ich habe gezeigt, dass der Unterschied unbedeutend ist, und Ihre Erklärung, warum mein benchmark war "falsch" ist falsch. Ich führte das Pferd zum Wasser, aber ich kann ihn nicht zwingen zu trinken...
- Oh, um Gottes Willen. Ich sage nicht, dass es einen performance-Unterschied. Ich sage, dass das zwei verschiedene Dinge tun. Wenn Sie wollen, finden die vollständige Reihenfolge der Daten, dann ist Ihre beste option ist eine sortierte Liste. Wenn Sie möchten, eine ungeordnete Liste verwenden Sie dann set. Wenn Sie möchten, eine A* - Suche, dann müssen Sie eine Warteschlange Priorität. Wenn Sie fügen Sie alle Punkte in einer Datenstruktur dann knallen Sie alle von Ihnen, die Sie tun, Sortieren. Versuchen Sie eine sortierte Liste und du wirst sehen was ich meine.
- In der Tat habe ich vor kurzem implementiert die A* - Algorithmus für ein Magazin-Artikel und verwendet die eingebaute
Set
als priority-queue. Ich dachte, Sie redeten über die Leistung, da Sie zitiert asymptotische Zeitkomplexität wie der Unterschied zwischen diesen abstrakten Datenstrukturen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Als ist in der Regel der Fall ist, "es hängt davon ab, was du tust", Aber da Sie gefragt haben, starten Sie hier:
Toolset Vielfalt
In meiner Sicht, IronPython ist im wesentlichen das gleiche wie C# mit einer etwas anderen syntax -- ich weiß, es ist eine grob verallgemeinernde Darstellung für zwei Sprachen mit völlig unterschiedlichen Systeme, aber Sie sind nicht viel anderes, das ich sagen kann, über ein weiteres Imperativ, OO-Sprache. Ob C# oder Java, oder C++, oder Python, lösen Sie Sprachen mit annähernd den gleichen Techniken, Redewendungen, Strategien, Stil, etc. Wenn Sie eine .NET-Entwickler sind, haben Sie fast sicher arbeitete mit C# oder VB.NET und Sie habe bereits schreiben von code in einer imperativen Stil, so lange wie Sie habe mit den Sprachen.
Der größte Pluspunkt von F# ist einfach, dass es fördert mehr funktionale Programmierung Stile, treibt Abstraktionen durch OO-Vererbung zu Gunsten von Funktion, Zusammensetzung, Unveränderlichkeit als Standard statt als ein nach Gedanke ist, und so weiter. Wenn Sie schreiben wollen, funktionalen code, den Sie brauchen, um eine funktionale Sprache.
Gewährt, Sie kann schreiben, funktionalen Stil in C# und Python, aber Funktionen sind veredelt auf wie ein nachträglicher Einfall. Python fehlt mehrzeilige Lambda-Ausdrücke, und C# ist auch die ausführliche und gelegentlich buggy zu nutzen, funktionalen Stil in den Orten, wo Sie wollen, es zu benutzen, C#, insbesondere, hat eine ganze Schiffsladung Fallstricke in Bezug auf die Delegierten und erfassen von lokalen Variablen, die beide Sprachen fehlen tail-call-Optimierungen fast überall, das Sie wollen, um Sie zu benutzen, C#'s type inference ist ein Witz im Vergleich zu F#. Ich habe versucht, mit C# als eine funktionale Sprache, die mit enorm schlechten Ergebnissen 🙂
Nun, die meisten Menschen könnten zugeben, dass die, die Probleme machen es schwierig, aber nicht unmöglich, das Programm in einem funktionalen Stil mit C# oder Python. Jedoch in meiner Erfahrung, es sind nicht die Sprachen, die es unmöglich machen, die die Programmierer im team. Du hast noch 10 oder 12 Leute schreiben von code in einer imperativen Sprache, die Sie nicht in der Lage sein, zur Durchsetzung einer funktionalen Stil für sehr lange-die Sprachen, die nicht alles tun, um zu entmutigen imperativen Stil. Und da die Programmierer bereits code in diesem Stil, das ist, was Sie bekommen. Es sei denn, Sie haben einige wirklich hardcore und leicht masochistische FP-Enthusiasten auf Ihr team, das denke ich nicht durchsetzen konnte, eine rein funktionale Programmierstil in einer imperativen Sprache für sehr lange.
Das beste argument für F# ist nicht unbedingt die funktionale Programmierung selbst, sondern wirklich die Vielfalt von Ihrem toolset. Sie bekommen einen größeren ROI Paarung F# und C# (verschiedene Programmier-Paradigma und ähnliche type system) als Paarung IronPython und C# (gleiche Programmier-Paradigma und die verschiedenen Typ-system).
Fallstudie von meiner Firma
Ok, also mit, dass gesagt wird, ich habe versucht zu drängen, F# in meiner Firma. Ich gehe nicht in eine riesige Menge an Details auf, was wir tun, aber im wesentlichen, meine Mannschaft führt den Benutzer durch den Prozess der Bestellung von Kabel-und Telefon-Dienstleistungen für Unternehmen wie Time Warner, ComCast und andere Kabel-Anbieter.
Seine wirklich eine komplizierter Prozess, als es klingt. Für einen start, es ist ein kompliziertes Regel-engine, die bestimmt die Verfügbarkeit von Produkten, Abhängigkeiten und AUSSCHLÜSSE zwischen den Produkten, etc. Wir gehen von der Regel-engine-Grafik und bauen Sie einen Entscheidungsbaum aus, dann übergeben wir den Baum an einen client, so können Sie die Anzeige der Benutzer und sammeln Benutzereingaben, client Karten-GUI zurück zu unserem Entscheidungsbaum-Struktur gehen wir den Baum und überprüfen alles, was gegen die Regeln-engine, etc.
Ich würde sagen 95% unserer code ist einfach die Navigation, Manipulation und Verarbeitung von baumartigen Datenstrukturen. Gerade jetzt, alles, was wir schreiben, ist C# und in Ihrer Art ein Durcheinander. Übrigens, einer der F#'s stärken ist die Manipulation von ASTs und symbolische Verarbeitung (hier finden Sie einen Vergleich der C# - und F# - code für die Verarbeitung von ASTs), und all das ist möglich, weil die Mustererkennung ist genial.
Pattern-matching ist ein echtes killer-feature, seine genau das, was unser C# - code braucht, um es zu säubern, und deshalb brauchen wir F#. Wir haben keine Verwendung für IronPython, weil Ihr nicht besser bei der symbolischen Verarbeitung als C#.
Zusammenfassung
Funktionale Programmierung-Paradigma und pattern matching sind zwei killer-features, die ich genießen mit F# jeden Tag. Ich könnte noch über die F#'s
async
threading-Modell, message passing Parallelität primitive, Unterstützung von Monaden, neuartige Funktionen wie active-Muster, und so weiter, aber die sind alle Punkt Kommentare. Für mich die zwei killer-features, die der Fall für F# über die Python-zumindest für meine eigenen Projekte.Der größte Unterschied zwischen F# und IronPython ist, dass:
F# ist eine statische Sprache
und
IronPython ist dynamisch.
Während in kleinen Stufen(z.B. 100-line-Skript), dynamische und statische Sprachen nicht viel Unterschied. Wenn es um software design/Komponenten-design, diese beiden Sprachen haben zwei verschiedene Denkmuster. Das Typ-system in F# ist auch viel mächtiger als Python ist.
strings
? Nur Erben, alles wird immer noch funktionieren!), aber auch zu einigen ziemlich fiesen bugs (oh, ich wollte multiplizieren von zwei ganzen zahlen aber, Hoppla, man ist eigentlich eine Liste, und jetzt Hilfe!!! Meine Liste hat wirklich große!). F# auf der anderen Seite, verwendet ML leistungsstarken Typ-system. Das bedeutet, dass es klappt die Typen, die die Dinge sein sollten, für Sie, und die Kontrollen an den compile-Zeit, dass alles OK ist. Das verhindert viele Fehler, aber kann ärgerlich sein, zu Zeiten.Die zwei wichtigsten Unterschiede zwischen F# und Iron Python sind:
Diese relativ großen Unterschiede, und Sie führen direkt zu den wichtigsten praktischen Gründen zu bevorzugen, die einen über den anderen.
Als Sie sagte, Iron Python ist langsamer als F# durch die fehlende statische Typisierung. In der Computer-Language-Benchmarks, Iron Python ist 25x im median und 120x langsamer, im schlimmsten Fall. Also, wenn Laufzeit-performance ist eine überlegung, F# ist wahrscheinlich vorzuziehen.
http://shootout.alioth.debian.org/u32/benchmark.php?test=all&lang=ironpy&lang2=fsharp
Da beide .NET, jeder kann Sie benutzen die Bibliotheken der anderen mit nur ein wenig Arbeit. Also ich sehe das nicht als ein großes Problem, obwohl ich denke, es ist möglich, SciPy in IronPython, während Sie wäre es langweilig aus F#, und das entsprechende besten Kostenlose Bibliothek für F# ist nicht ganz so gut.
Funktionale Programmierung kann einen sehr kraftvollen Stil, und erlaubt F#, um einige leistungsstarke Funktionen wie workflows, einschließlich asynchrone workflows, die sind gut unterstützt durch die F# - Bibliotheken. Sie könnte etwa emulieren solche Dinge in Iron Python, aber es würde nicht funktionieren, ganz so reibungslos, zum Teil, weil der Mangel an Unterstützung in den Bibliotheken.
Objekt-Orientierung ist mehr vertraut, zu viele Programmierer, und vielleicht lieber Python aus diesem Grund.
Statische Typisierung ermöglicht auch eine IDE zur besseren Unterstützung der Programmierer. Der Typ jeder variable kann berichtet werden, die der Programmierer über das schweben in der VS) und Hinweise auf Fehler gegeben werden können, während der code bearbeitet wird. Als Hochschullehrer kann ich sagen, dass dieses unmittelbare feedback ist sehr nützlich für meine Schüler, während Sie lernen F#. Dies ermöglicht Ihnen die Verwaltung komplexer Programme, als Sie es sonst könnten.
Dynamische Typisierung erlaubt es manchmal, dass kleine, einfache Programme geschrieben werden, etwas schneller. Wenn dies die einzige Codierung, die Sie tun werden dann Python vorzuziehen. Aber, wenn man die chance hat ein Programm wachsen, in etwas größeres, dann würde ich lieber F#.
Was bevorzugst du mehr (innerhalb der Grenzen Ihrer funktional-und politisch-Anforderungen)? Die eine erfordert mehr ursprüngliche Investition? Welchen Sie wollen zu halten (langfristige Investition)? Und welcher wird helfen, Ihr problem zu lösen(s) am besten?
IronPython ist, sowie Python. Das bedeutet auch, dass es deutlich mehr Dynamik -- das erhöht die Laufzeit-overhead-als F#. Wenn du lieber Python über F# und es läuft schnell genug für Sie, warum dann nicht nutzen? Wie du schon erwähnt hast, es hat 'besser' Python library " - Unterstützung, so dass, wenn Sie nutzen, zu Ihrem Vorteil, dann score IronPython.
Auf der anderen Seite, "nur" eingeschränkt die .NET (und F#-freundlich) Bibliotheken ist wirklich nicht so schlecht für eine Sprache wie F#, solange der Bibliotheken zu tun, was Sie tun müssen, gegeben sind oder ausgegrenzt werden.
Aber es wirklich nach unten kommen, um das Paradigma sowie der Präferenz und der Erfahrung der Entwickler.
Ich persönlich vermeide dynamische Sprachen, wo ich kann 🙂
Ironpython-dynamische interpretation glänzt als eine alternative zu den monotonen javascript im client browser-user-agents. F#s'statische Typ-überprüfung deckt benutzerdefinierte Typen können SI, oder ein solches mess-system portable Bibliothek, so dass back-end-Stufe abrufen von Daten aus Wolken kann es umzubauen als eine nützliche information mehr sinnvoll. Während wie in den meisten Programmiersprachen Sie austauschbar verwendet werden können, um diese und weitere Dinge, diese Zitate weisen insgesamt separates stärken der beiden in client-apps. F# spielt kritische Rolle in der composite-app, in der Erwägung, dass Ironpython spielt Rolle im user-agent-browser-basierte Interaktion.
F#s'statische Typ-überprüfung und Lambda-Ausdrücke vereinfachen könnte ASP.net auf mehrere Objekt-Orientierte Anlässe näher an der Ebene der klassischen ASP. Ironpython-Anwendung ermöglicht Erweiterbarkeit durch Anwender modifizierbare Skripte, die auch als 3rd-party-plug-in-Erweiterungen, die beliebt, nicht nur mit Browsern, aber media Player und Traum-Weber und anderen Autoren.
Ironpython vielleicht re-berücksichtigt in reinem python .Netto-abhängigen Teile vorauszusehen re-usability use-cases. F# so weit dient als funktionale Paradigma Gesicht des anderen-wise objektorientierten Paradigma basiert .net