Dlaczego F # ma tryb interaktywny, ale nie C #?

32

F # wychodzi z pudełka z interaktywnym REPL. C # nie ma nic w tym rodzaju i w rzeczywistości jest trochę trudny do zabawy bez przygotowania pełnego projektu (chociaż LINQpad działa i można to również zrobić za pomocą PowerShell).

Czy jest coś zupełnie innego w językach, które pozwalają F # mieć interaktywną konsolę, ale utrudniają jej implementację w C #?


Ponieważ wiele lat później ludzie wciąż przychodzą na to pytanie, powinienem zauważyć, że teraz jest wiele opcji. Za pomocą programu PowerShell (wstępnie zainstalowanego na każdym nowoczesnym komputerze z systemem Windows) można grać w środowisku .Net. Lub możesz użyć LINQpad do prototypowania dowolnego kodu c # . Możesz też użyć ScriptCs lub internetowego środowiska typu jsfiddle, takiego jak Complify.net lub Jsil . Wiele opcji.

George Mauer
źródło
4
C # nie ma rEPL. To się nazywa okno natychmiastowe i jest dostępne od dłuższego czasu. Ma pewne ograniczenia, z których niektóre stają się coraz bardziej zauważalne od C # 3.0, ponieważ nowe funkcje języka nie były przez nią obsługiwane, ale mimo to jest pełnoprawnym REPL.
Allon Guralnek
Pamiętam, że projekt wersji demonstracyjnej Roslyn około 2012 roku miał w sobie REPL dla VS2010
James
@DanielHakimi: Dzięki za ten komentarz, nie miałem pojęcia, że ​​zostało to uwzględnione w VS2015, myślałem tylko, że możesz użyć okna Natychmiastowego podczas debugowania. VS2015 zawiera teraz okno narzędzia C # Interactive , dostępne przez Widok -> Inne okna -> C # Interactive, które wydaje się być pełną REPL-em opartą na Roslyn, oddzieloną od środowiska debugowania.
Lou

Odpowiedzi:

56

Czy jest coś zupełnie innego w językach, które pozwalają F # mieć interaktywną konsolę, ale utrudniają jej implementację w C #?

Tak.

F # jest potomkiem języka programowania ML, który z kolei był pod silnym wpływem języków takich jak Lisp i Scheme. Te języki zostały zaprojektowane od pierwszego dnia, aby miały trzy ładne właściwości.

Po pierwsze, w tych językach tak naprawdę nie ma wyrażeń tak, jak myślisz o nich w języku C #. Raczej prawie wszystko jest wyrażeniem, które ma wartość , więc mechanizm oceny i wydrukowania wartości ma sens w prawie każdej sytuacji.

Po drugie, te języki zniechęcają do programowania z efektami ubocznymi, więc możesz dokonywać ocen bez obawy, że popsuniesz globalny stan.

Po trzecie, większość pracy wykonywanej w tych językach odbywa się „na najwyższym poziomie”; zazwyczaj nie ma obejmującej „klasy”, „przestrzeni nazw” lub innego kontekstu.

Natomiast C # kładzie nacisk na programowanie przepływu sterowania za pomocą instrukcji, które wywołują skutki uboczne, a te instrukcje są zawsze w wielu zagnieżdżonych kontenerach - przestrzeni nazw, klasie, metodzie i tak dalej.

Są to więc wszystko, co utrudnia CPL posiadanie REPL, ale z pewnością nie jest niemożliwe . Musimy tylko dowiedzieć się, co to jest semantyka dla wyrażeń i wyrażeń, które pojawiają się poza zwykłym kontekstem, i co to jest semantyka mutacji, które zmieniają powiązania nazw itp.

Dlaczego F # ma tryb interaktywny, ale nie C #?

Ponieważ zespół F # zdecydował, że posiadanie pętli REPL jest dla nich scenariuszem priorytetowym. Zespół C # historycznie nie. Funkcje nie zostaną wdrożone, chyba że są funkcjami o najwyższym priorytecie, które mieszczą się w budżecie; do tej pory CPL REPL nie było na szczycie naszej listy.

Projekt Roslyn ma CPL REPL (i ostatecznie będzie miał również VB REPL, ale nie jest jeszcze gotowy.) Możesz pobrać jego wersję zapoznawczą, aby zobaczyć, jak ci się podoba

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

Eric Lippert
źródło
7
Python ma niezłą REPL i ma instrukcje, efekty uboczne i przestrzenie nazw. Podobnie jak Javascript, Bash itp. Wiele języków, które naruszają twoje kryteria, mają REPL w porządku.
Lie Ryan,
2
Witaj ponownie, Eric! Mam nadzieję, że zobaczymy więcej odpowiedzi od ciebie.
Rozwiązanie
16
@LieRyan Myślę, że przegapiłeś cały punkt. Jedynymi „kryteriami” dla interaktywnej pętli REPL jest to, że ktoś usiadł i napisał jedną; w F # miał wysoki priorytet i stosunkowo łatwy, w C # miał niski priorytet i stosunkowo trudny, dlatego F # dostał jeden wcześnie, a C # nie.
KutuluMike,
Ciekawy. Dodam, że doświadczenie zdobyte przy tworzeniu tak wielu kompilatorów dla platformy .NET przed wydaniem VS2010 (liczę cztery C #, cztery VB.NET, dwa J # i dwa C ++ / CLI) musiało mieć wpływ na to, jak nowy kompilator dla zbudowano nowy język .NET. Jestem pewien, że został on zbudowany w stylu Roslyn z dużą ilością przemyślenia na temat włączenia scenariusza Kompilator jako usługa, który wydaje się być kierunkiem, w którym będziesz rozwijać wszystkie przyszłe kompilatory .NET i wersje kompilatora. Wydaje mi się, że era, w której narodził się F #, nieuchronnie odegrała rolę w sposobie pisania jego kompilatora.
Allon Guralnek
Świetna odpowiedź. Języki składni Python vs C #: {} nie wyginają się dobrze w REPL, języki oparte na wcięciach mają tutaj duży postęp. Nigdy nie myślałem, że kiedykolwiek pomyślę lub powiem: składnia wcięcia jest lepsza niż składnia {}. Dla REPL, a także dla czytelności kodu. Tak długo, jak nie ma metasyntaxu C #, który zastąpiłby wcięcie {}, doświadczenie REPL nigdy nie będzie tak płynne, jak na przykład w F # lub Python.
citykid
22

Mono ma replikę C #: http://www.mono-project.com/CsharpRepl

Ma nawet wersję GUI, która pozwala bezpośrednio manipulować obiektami graficznymi lub tworzyć widżety Gtk #:

wprowadź opis zdjęcia tutaj

Zawietrzny
źródło
Jasne, i to zdecydowanie możliwe, ale czy jest coś w C #, co sprawia, że ​​jest trudniej?
George Mauer,
2

Wierzę, że to głównie historyczna rzecz. Środowiska REPL zawsze były kojarzone z językami funkcjonalnymi, w tym językami rodziny ML, a F # pozostaje wierny tej tradycji. Należy pamiętać, że środowisko interaktywne jest czymś, co użytkownicy pochodzący z tła funkcjonalnego uważają za coś oczywistego, brak takiej funkcji oznaczałby VS i - w związku z tym - F #, w niekorzystnej sytuacji.

Z drugiej strony żadna taka funkcja nie była powszechna w społeczności OOP.

Dostępne są jednak REPL dla wielu języków niefunkcjonalnych, w tym C, Java lub C #. Chociaż jest to dalekie od pełnego REPL, funkcja Autos w VS pokazuje, że z pewnością można to zrobić za pomocą C #.

scrwtp
źródło
1
To najbardziej prawdopodobne wyjaśnienie, jakie widziałem. Na początku był Fortran i Lisp, a Lisps miał repliki. Lisp spłodził ... cóż, masz pomysł. Języki rodowodu Lisp miały repliki, a rodowód Fortran nie.
Aaron,
@Aaron LISP ma rok 1959, ale REPL jest przypisywany maszynom LISP, 1973. Do tego czasu istniało już wiele języków. Szczególnie PASCAL i Smalltalk.
Sprague,
1

Uważam, że C # jest przede wszystkim zorientowany obiektowo. Aby napisać nawet najprostszy kod, należy podzielić go na wiele klas. Aby użyć REPL, musisz napisać dużo kodu.

F # jest przede wszystkim funkcjonalny, nie ma tego problemu i możesz łatwo napisać nawet skomplikowany kod w prostym stylu i przekonwertować go na obiekt / y później.

Łatwiej jest napisać pojedynczy wiersz funkcji niż napisać klasę, która obejmuje wiele wierszy.

Euforyk
źródło
1
Nic nie stoi na przeszkodzie, abyś używał funkcji / klas zdefiniowanych w plikach zewnętrznych w instrukcjach REPL. Fakt, że OOP jest bardziej szczegółowy, sam w sobie nie ogranicza funkcjonalności REPL.
scrwtp,
1
Python, który jest dość zorientowany obiektowo i zawiera znaczące składniowo łamanie linii, ma przyzwoitą REPL. Scala, będąc statycznie wpisanym, skompilowanym i raczej obiektowym, ma REPL. REPL jest najbardziej przydatny do krótkich rzeczy, takich jak importowanie istniejących klas i wywoływanie niektórych metod; gadatliwość języka nie stanowi problemu. Np. SQL jest dość gadatliwy, ale każda baza danych SQL ma REPL („narzędzie zapytań”).
9000