Warum hat F # einen interaktiven Modus, aber kein C #?

32

F # wird mit einem interaktiven REPL ausgeliefert. C # hat nichts dergleichen und ist in der Tat ein bisschen schwierig zu spielen, ohne ein vollständiges Projekt einzurichten (obwohl LINQpad funktioniert und es auch über Powershell möglich ist).

Gibt es etwas grundlegend anderes an den Sprachen, das es F # ermöglicht, die interaktive Konsole zu haben, es aber schwierig macht, sie für C # zu implementieren?


Da sich viele Jahre später immer noch Menschen mit dieser Frage befassen, sollte ich beachten, dass es jetzt viele Möglichkeiten gibt. Sie können Powershell (vorinstalliert auf jedem modernen Windows-Computer) verwenden, um mit dem .Net-Framework zu spielen. Oder Sie können LINQpad verwenden, um beliebigen C # -Code zu prototypisieren . Oder Sie können ScriptCs verwenden oder Sie können eine Online-Umgebung vom Typ jsfiddle wie Complify.net oder Jsil verwenden . Viele Möglichkeiten.

George Mauer
quelle
4
C # hat eine REPL. Es heißt Immediate Window und ist seit einiger Zeit verfügbar. Es weist einige Einschränkungen auf, von denen einige seit C # 3.0 zunehmend auffallen, da neue Sprachfunktionen von C # 3.0 nicht unterstützt wurden, es sich jedoch dennoch um eine vollwertige REPL handelt.
Allon Guralnek
Ich erinnere mich an das Projekt Roslyn Demo Release um 2012 hatte eine REPL für VS2010
James
@DanielHakimi: Danke für diesen Kommentar, ich hatte keine Ahnung, dass dies in VS2015 enthalten war. Ich dachte nur, Sie könnten das Direktfenster beim Debuggen verwenden. VS2015 enthält jetzt das C # Interactive- Toolfenster, auf das über Ansicht -> Andere Fenster -> C # Interactive zugegriffen werden kann. Dabei handelt es sich anscheinend um eine vollständige Roslyn-basierte REPL, die von der Debugumgebung getrennt ist.
Lou

Antworten:

56

Gibt es etwas grundlegend anderes an den Sprachen, das es F # ermöglicht, die interaktive Konsole zu haben, es aber schwierig macht, sie für C # zu implementieren?

Ja.

F # ist ein Nachkomme der ML-Programmiersprache, die wiederum stark von Sprachen wie Lisp und Scheme beeinflusst wurde. Diese Sprachen wurden vom ersten Tag an so entworfen, dass sie drei schöne Eigenschaften haben.

Erstens haben diese Sprachen keine Aussagen, wie Sie sie in C # sehen. Vielmehr ist fast alles ein Ausdruck , der einen Wert hat , so dass ein Wertevaluierungs- und Druckmechanismus in fast jeder Situation Sinn macht.

Zweitens raten diese Sprachen von der Programmierung mit Nebenwirkungen ab, sodass Sie Auswertungen vornehmen können, ohne befürchten zu müssen, dass Sie den globalen Zustand durcheinander bringen.

Drittens ist die meiste Arbeit, die Sie in diesen Sprachen leisten, „auf höchstem Niveau“. In der Regel gibt es keine einschließenden "Klasse" oder "Namespace" oder anderen Kontext.

Im Gegensatz dazu betont C # den Ablauf der Programmiersteuerung mit Anweisungen, die Nebenwirkungen hervorrufen, und diese Anweisungen befinden sich immer in mehreren verschachtelten Containern - einem Namespace, einer Klasse, einer Methode usw.

Das sind also alles Dinge, die es für C # schwieriger machen , eine REPL zu haben, aber sicherlich nicht unmöglich . Wir müssen nur herausfinden, was die Semantik für Aussagen und Ausdrücke ist, die außerhalb des üblichen Kontexts erscheinen, und was die Semantik für Mutationen ist, die die Namensbindungen ändern, und so weiter.

Warum hat F # einen interaktiven Modus, aber kein C #?

Weil das F # -Team entschied, dass das Vorhandensein einer REPL-Schleife für sie ein vorrangiges Szenario war. Das C # -Team hat das historisch nicht. Funktionen werden nur implementiert, wenn sie die Funktionen mit der höchsten Priorität sind, die in das Budget passen. Bisher stand ein C # REPL nicht ganz oben auf unserer Liste.

Das Roslyn-Projekt hat eine C # -REPL (und wird eventuell auch eine VB-REPL haben, die jedoch noch nicht fertig ist.) Sie können eine Vorschauversion davon herunterladen, um zu sehen, wie es Ihnen gefällt

http://www.microsoft.com/en-us/download/details.aspx?id=27746

Eric Lippert
quelle
7
Python hat eine nette REPL, und es hat Anweisungen, Nebenwirkungen und Namespaces. Und so auch Javascript, Bash usw. Viele Sprachen, die Ihre Kriterien verletzen, haben REPL in Ordnung.
Lie Ryan
2
Willkommen zurück, Eric! Ich hoffe, wir werden weitere Antworten von Ihnen sehen.
SolutionYogi
16
@LieRyan Ich denke, Sie haben den ganzen Punkt verpasst. Das einzige "Kriterium" für eine interaktive REPL-Schleife ist, dass sich jemand hinsetzte und eine schrieb. in F # war es eine hohe Priorität und relativ einfach, in C # war es eine niedrige Priorität und relativ schwer, daher bekam F # eine früh und C # tat es nicht.
KutuluMike
Interessant. Ich möchte hinzufügen, dass die Erfahrung, die mit der Erstellung so vieler Compiler für das .NET-Framework vor der Veröffentlichung von VS2010 gemacht wurde (ich zähle vier C # -, vier VB.NET-, zwei J # - und zwei C ++ / CLI-Compiler), die Auswirkungen auf die Funktionsweise eines brandneuen Compilers haben muss Es wurde eine brandneue .NET-Sprache erstellt. Ich bin sicher, dass es in einem Roslyn-ähnlichen Stil gebaut wurde, mit vielen Überlegungen, wie das Compiler-as-a-Service-Szenario zu aktivieren ist. Dies scheint die Richtung zu sein, in der Sie alle zukünftigen .NET-Compiler und Compiler-Revisionen entwickeln werden. Mir scheint, dass die Ära, in der F # geboren wurde, unweigerlich eine Rolle bei der Erstellung des Compilers spielte.
Allon Guralnek
Gute Antwort. Informationen zu Python vs C #: {} Syntaxsprachen lassen sich für REPLs nicht gut biegen. Sprachen, die auf Einrückungen basieren, haben hier große Fortschritte gemacht. Ich hätte nie gedacht, dass ich jemals darüber nachdenken oder es sagen würde: Die Syntax von Einrückungen ist besser als die von {}. Für REPLs sowie für die Lesbarkeit von Code. Solange es keine C # -Metasyntax gibt, die Einrückung durch {} ersetzt, wird die REPL-Erfahrung niemals so reibungslos sein wie zum Beispiel in F # oder Python.
Stadtkind
22

Mono hat eine C # -Antwort: http://www.mono-project.com/CsharpRepl

Es gibt sogar eine GUI-Version, mit der Sie Grafikobjekte direkt bearbeiten oder Gtk # -Widgets erstellen können:

Bildbeschreibung hier eingeben

Lee
quelle
Sicher, und es ist definitiv möglich, aber gibt es etwas an C #, das es schwieriger macht?
George Mauer
2

Ich glaube, es ist größtenteils eine historische Sache. REPL-Umgebungen wurden immer mit funktionalen Sprachen in Verbindung gebracht, einschließlich der ML-Familiensprachen, und F # bleibt dieser Tradition treu. Beachten Sie, dass eine interaktive Umgebung für Benutzer mit funktionalem Hintergrund eine Selbstverständlichkeit darstellt. Das Fehlen einer solchen Funktion würde VS und - im weiteren Sinne - F # benachteiligen.

Auf der anderen Seite war ein solches Feature in der OOP-Community nicht alltäglich.

Es gibt jedoch REPLs für viele nicht funktionsfähige Sprachen, einschließlich C, Java oder C #. Auch wenn es weit von einer vollwertigen REPL entfernt ist, zeigt die Autos-Funktion in VS, dass es mit C # durchaus machbar ist.

scrwtp
quelle
1
Dies ist die plausibelste Erklärung, die ich je gesehen habe. Am Anfang gab es Fortran und Lisp, und Lisps hatte Antworten. Lisp zeugte ... nun, Sie haben die Idee. Lisp-Stammsprachen hatten Antworten, Fortran-Stammsprachen nicht.
Aaron
@Aaron LISP ist 1959, REPL wird jedoch LISP-Maschinen aus dem Jahr 1973 zugeordnet. Zu diesem Zeitpunkt gab es bereits viele, viele Sprachen. Insbesondere PASCAL und Smalltalk.
Sprague
1

Ich glaube, C # ist in erster Linie objektorientiert. Um auch einfachsten Code zu schreiben, sollten Sie ihn in mehrere Klassen unterteilen. Um REPL zu verwenden, müssten Sie viel Code schreiben.

F # ist in erster Linie funktional und hat dieses Problem nicht. Sie können problemlos auch komplexen Code in einfacher Weise schreiben und ihn später in Objekte konvertieren.

Es ist einfacher, eine einzelne Funktionszeile zu schreiben, als eine Klasse, die viele Zeilen umfasst.

Euphorisch
quelle
1
Nichts hindert Sie daran, Funktionen / Klassen zu verwenden, die in externen Dateien in REPL-Anweisungen definiert sind. Die Tatsache, dass OOP ausführlicher ist, behindert die REPL-Funktionalität nicht.
Scrwtp
1
Python, das sehr objektorientiert ist und syntaktisch signifikante Zeilenumbrüche aufweist, hat eine anständige REPL. Scala, statisch typisiert, kompiliert und eher objektorientiert, hat eine REPL. REPL ist am nützlichsten für kurze Dinge wie das Importieren vorhandener Klassen und das Aufrufen einiger Methoden. Ausführlichkeit der Sprache ist kein Problem. Zum Beispiel ist SQL ziemlich ausführlich, aber jede SQL-Datenbank enthält eine REPL (ein 'Abfragetool').
9000,