Pourquoi F # a-t-il un mode interactif mais pas C #?


32

F # sort de la boîte avec un REPL interactif. C # n'a rien de tel et est en fait un peu difficile à jouer sans mettre en place un projet complet (bien que LINQpad fonctionne et qu'il soit également possible de le faire via PowerShell).

Y a-t-il quelque chose de fondamentalement différent dans les langages qui permet à F # d'avoir la console interactive mais qui rend difficile son implémentation pour C #?


Étant donné que de nombreuses années plus tard, les gens se posent encore cette question, je dois noter qu'il existe désormais de nombreuses options. Vous pouvez utiliser powershell (pré-installé sur toutes les machines Windows modernes) pour jouer avec le framework .Net. Ou vous pouvez utiliser LINQpad pour prototyper du code c # arbitraire . Ou vous pouvez utiliser ScriptCs ou vous pouvez utiliser un environnement en ligne de type jsfiddle comme Complify.net ou Jsil . Beaucoup d'options.


4
C # ne un REPL. Cela s'appelle la fenêtre immédiate et est disponible depuis un certain temps. Il a certaines limites, dont certaines sont devenues de plus en plus visibles depuis C # 3.0, car de nouvelles fonctionnalités de langage n'étaient pas prises en charge par lui, mais il s'agit néanmoins d'un REPL à part entière.
Allon Guralnek


Je me souviens que le projet de démo de Roslyn vers 2012 avait un REPL pour VS2010
James

@DanielHakimi: Merci pour ce commentaire, je n'avais aucune idée que cela était inclus dans VS2015, je pensais seulement que vous pouviez utiliser la fenêtre Immédiate pendant le débogage. VS2015 contient désormais la fenêtre de l'outil C # Interactive , accessible via Affichage -> Autres fenêtres -> C # Interactive, qui semble être un REPL complet basé sur Roslyn, séparé de l'environnement de débogage.
Lou

Réponses:


56

Y a-t-il quelque chose de fondamentalement différent dans les langages qui permet à F # d'avoir la console interactive mais qui rend difficile son implémentation pour C #?

Oui.

F # est un descendant du langage de programmation ML, qui à son tour a été fortement influencé par des langages comme Lisp et Scheme. Ces langues ont été conçues dès le premier jour pour avoir trois belles propriétés.

Tout d'abord, ces langages n'ont pas vraiment de déclarations comme vous les voyez en C #. Au contraire, presque tout est une expression qui a une valeur , donc un mécanisme d'évaluation et d'impression de la valeur a du sens dans presque toutes les situations.

Deuxièmement, ces langages découragent la programmation avec des effets secondaires, vous pouvez donc faire des évaluations sans vous soucier de gâcher l'état global.

Troisièmement, la plupart du travail que vous effectuez dans ces langues est «au plus haut niveau»; il n'y a généralement pas de «classe» ou «espace de noms» ou autre contexte.

En revanche, C # met l'accent sur le flux de contrôle de programmation avec des instructions qui produisent des effets secondaires, et ces instructions sont toujours dans plusieurs conteneurs imbriqués - un espace de noms, une classe, une méthode, etc.

Ce sont donc toutes des choses qui rendent plus difficile pour C # d'avoir un REPL, mais certainement pas impossible . Nous aurions juste besoin de comprendre quelle est la sémantique pour les instructions et les expressions qui apparaissent en dehors du contexte habituel, et quelles sont les sémantiques des mutations qui changent les liaisons de noms, etc.

Pourquoi F # a-t-il un mode interactif mais pas C #?

Parce que l'équipe F # a décidé qu'avoir une boucle REPL était un scénario prioritaire pour eux. Historiquement, l'équipe C # ne l'a pas fait. Les fonctionnalités ne sont pas implémentées à moins que ce ne soient les fonctionnalités les plus prioritaires qui correspondent au budget; jusqu'à présent, un C # REPL n'a pas été en haut de notre liste.

Le projet Roslyn a un REPL C # (et aura éventuellement un REPL VB aussi, mais il n'est pas encore prêt.) Vous pouvez télécharger un aperçu de celui-ci pour voir comment vous l'aimez sur

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


7
Python a une belle REPL, et il a des instructions, des effets secondaires et des espaces de noms. De même pour Javascript, Bash, etc. De nombreuses langues qui violent vos critères ont très bien REPL.
Lie Ryan

2
Bienvenue Eric! J'espère que nous verrons plus de réponses de votre part.
SolutionYogi

16
@LieRyan Je pense que vous avez raté tout le point. Les seuls "critères" pour une boucle REPL interactive sont que quelqu'un s'est assis et en a écrit un; en F # c'était une priorité élevée et relativement facile, en C # c'était une priorité faible et relativement difficile, donc F # en a obtenu un tôt et C # ne l'a pas fait.
KutuluMike

Intéressant. J'ajouterais que l'expérience acquise dans la création de nombreux compilateurs pour le framework .NET avant la sortie de VS2010 (je compte quatre C #, quatre VB.NET, deux J # et deux C ++ / CLI) a dû affecter la façon dont un tout nouveau compilateur pour un tout nouveau langage .NET a été créé. Je suis sûr qu'il a été construit dans un style Roslyn-esque avec beaucoup de réflexion sur la façon d'activer le scénario Compiler-as-a-Service, qui semble être la direction dans laquelle vous développerez tous les futurs compilateurs .NET et révisions du compilateur. Il me semble que l'ère de la naissance de F # a inévitablement joué un rôle dans l'écriture de son compilateur.
Allon Guralnek

Très bonne réponse. A propos de Python vs C #: les langages de syntaxe {} ne se plient pas bien pour les REPL, les langages basés sur l'indentation ont ici une grande avance. Je n'ai jamais pensé que je le penserais ou le dirais: la syntaxe d'indentation est meilleure que la syntaxe {}. Pour les REPL ainsi que pour la lisibilité du code. Donc, tant qu'il n'y a pas de métasyntaxe C # qui remplace l'indentation par {}, l'expérience REPL ne sera jamais aussi fluide que par exemple en F # ou Python.
citykid

22

Mono a une réplique C #: http://www.mono-project.com/CsharpRepl

Il a même une version GUI qui vous permet de manipuler directement des objets graphiques ou de créer des widgets Gtk #:

entrez la description de l'image ici


Bien sûr, et c'est certainement possible, mais y a-t-il quelque chose à propos de C # qui le rend plus difficile?
George Mauer

2

Je pense que c'est surtout une chose historique. Les environnements REPL ont toujours été associés aux langages fonctionnels, y compris les langages de la famille ML, et F # reste fidèle à cette tradition. Gardez à l'esprit que l'environnement interactif est quelque chose que les utilisateurs issus de l'arrière-plan fonctionnel tiennent pour acquis, le manque d'une telle fonctionnalité serait désavantagé VS et - par extension - F #.

D'un autre côté, aucune caractéristique de ce type n'est courante dans la communauté OOP.

Il existe cependant des REPL disponibles pour de nombreux langages non fonctionnels, notamment C, Java ou C #. De plus, bien que ce soit loin d'un REPL à part entière, la fonction Autos de VS montre que c'est certainement faisable avec C #.


1
C'est l'explication la plus plausible que j'ai vue. Au début, il y avait Fortran et il y avait Lisp, et Lisps avait des répliques. Lisp a engendré ... eh bien, vous avez l'idée. Les langues de la lignée Lisp avaient des réponses, contrairement à la lignée Fortran.
Aaron

@Aaron LISP date de 1959 mais REPL est attribué aux machines LISP, 1973. À ce moment-là, il y avait déjà beaucoup de langues. Notamment PASCAL et Smalltalk.
Sprague

1

Je crois que C # est principalement orienté objet. Pour écrire du code encore plus simple, vous devez le diviser en plusieurs classes. Pour utiliser REPL, vous devez écrire beaucoup de code.

F # étant principalement fonctionnel, il n'y a pas ce problème et vous pouvez facilement écrire du code même complexe en un mot simple et le convertir en objet (s) plus tard.

Il est plus facile d'écrire une seule ligne de fonction que d'écrire une classe, qui s'étend sur plusieurs lignes.


1
Rien ne vous empêche d'utiliser des fonctions / classes définies dans des fichiers externes dans les instructions REPL. Le fait que la POO soit plus verbeuse n'entrave pas en soi la fonctionnalité REPL.
scrwtp

1
Python, étant assez orienté objet et présentant des sauts de ligne syntaxiquement significatifs, a un REPL décent. Scala, étant typé statiquement, compilé et plutôt orienté objet, a un REPL. REPL est très utile pour des choses courtes comme l'importation de classes existantes et l'appel de certaines méthodes; la verbosité de la langue n'est pas une préoccupation. Par exemple, SQL est assez verbeux mais chaque base de données SQL est livrée avec un REPL (un «outil de requête»).
9000
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.