Почему F # имеет интерактивный режим, а не C #?

32

F # выходит из коробки с интерактивным REPL. C # не имеет ничего подобного, и на самом деле довольно сложно поиграть без настройки полноценного проекта (хотя LINQpad работает и его также можно сделать с помощью powershell).

Есть ли в языках что-то принципиально иное, что позволяет F # иметь интерактивную консоль, но затрудняет ее реализацию на C #?


Поскольку много лет спустя люди все еще приходят к этому вопросу, я должен отметить, что сейчас есть много вариантов. Вы можете использовать powershell (предварительно установленный на каждом современном компьютере с Windows) для работы с .Net framework. Или вы можете использовать LINQpad для создания прототипа произвольного кода на C # . Или вы можете использовать ScriptC или онлайн-среду типа jsfiddle, такую как Complify.net или Jsil . Много вариантов.

Джордж Мауэр
источник
4
C # делает есть REPL. Он называется « Немедленное окно» и был доступен довольно давно. У него есть определенные ограничения, некоторые из которых становятся все более заметными после C # 3.0, поскольку новые языковые функции не поддерживаются им, но, тем не менее, это полноценный REPL.
Аллон Гуралнек
Я помню, что у проекта Roslyn demo release около 2012 года был реплей для VS2010
Джеймс
@DanielHakimi: Спасибо за этот комментарий, я понятия не имел, что это было включено в VS2015, я только думал, что вы можете использовать окно Immediate во время отладки. VS2015 теперь содержит окно инструмента C # Interactive , доступное через View -> Other Windows -> C # Interactive, которое выглядит как полный REPL на основе Roslyn, отделенный от среды отладки.
Лу

Ответы:

56

Есть ли в языках что-то принципиально иное, что позволяет F # иметь интерактивную консоль, но затрудняет ее реализацию на C #?

Да.

F # является потомком языка программирования ML, который, в свою очередь, находился под сильным влиянием таких языков, как Lisp и Scheme. Эти языки были разработаны с первого дня, чтобы иметь три приятных свойства.

Во-первых, эти языки на самом деле не имеют операторов, как вы думаете о них в C #. Скорее, почти все является выражением, которое имеет значение , поэтому механизм оценки и затем печати значения имеет смысл практически в любой ситуации.

Во-вторых, эти языки препятствуют программированию с побочными эффектами, поэтому вы можете делать оценки, не беспокоясь о том, что вы испортите глобальное состояние.

В-третьих, большая часть работы, которую вы выполняете на этих языках, находится «на высшем уровне»; обычно нет включающего «класса», «пространства имен» или другого контекста.

В отличие от этого, C # подчеркивает поток управления программированием с помощью операторов, которые создают побочные эффекты, и эти операторы всегда находятся в нескольких вложенных контейнерах - пространстве имен, классе, методе и так далее.

Так что это все вещи, которые мешают C # иметь REPL, но, конечно, не невозможно . Нам просто нужно выяснить, что такое семантика для операторов и выражений, которые появляются вне обычного контекста, и какова семантика мутаций, которые изменяют привязки имен и так далее.

Почему F # имеет интерактивный режим, а не C #?

Потому что команда F # решила, что цикл REPL был для них приоритетным сценарием. Команда C # исторически не имеет. Функции не будут реализованы, если они не являются приоритетными функциями, которые вписываются в бюджет; до сих пор C # REPL не был в верхней части нашего списка.

Проект Roslyn имеет C # REPL (и в конечном итоге также будет иметь VB REPL, но он еще не готов.) Вы можете скачать предварительную версию этого, чтобы увидеть, как вам это нравится на

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

Эрик Липперт
источник
7
У Python есть хороший REPL, и у него есть операторы, побочные эффекты и пространства имен. Как и Javascript, Bash и т. Д. На многих языках, которые нарушают ваши критерии, REPL просто отлично.
Ли Райан
2
С возвращением, Эрик! Я надеюсь, что мы будем видеть больше ответов от вас.
Решение
16
@LieRyan Я думаю, что вы пропустили весь смысл. Единственным «критерием» для интерактивного цикла REPL является то, что кто-то сел и написал один; в F # он был высокоприоритетным и относительно легким, в C # он был низкоприоритетным и относительно сложным, поэтому F # получил его раньше, а C # - нет.
KutuluMike
Интересный. Я хотел бы добавить, что опыт, накопленный при создании очень многих компиляторов для платформы .NET до выпуска VS2010 (я считаю четыре C #, четыре VB.NET, два J # и два C ++ / CLI), должен был повлиять на то, как новый компилятор для новый язык .NET был построен. Я уверен, что он был построен в стиле Roslyn-esque с большим количеством размышлений о том, как включить сценарий Compiler-as-a-Service, который выглядит как направление, в котором вы будете разрабатывать все будущие компиляторы .NET и ревизии компиляторов. Мне кажется, что эра, в которой родился F #, неизбежно сыграла роль в том, как был написан его компилятор.
Аллон Гуралнек
Отличный ответ. О языках Python против C #: {} синтаксические языки не очень хорошо подходят для REPL, здесь языки с отступами имеют большой успех. Никогда бы не подумал, что когда-нибудь подумаю или скажу: синтаксис отступа лучше синтаксиса {}. Для REPL, а также для читабельности кода. Таким образом, до тех пор, пока отсутствует метасинтаксис C #, который заменяет отступ на {}, опыт REPL никогда не будет таким гладким, как, например, в F # или Python.
citykid
22

Mono имеет C # repl: http://www.mono-project.com/CsharpRepl

Он даже имеет версию GUI, которая позволяет вам напрямую манипулировать графическими объектами или создавать виджеты Gtk #:

введите описание изображения здесь

подветренный
источник
Конечно, и это определенно возможно, но есть ли что-то в C #, что делает его сложнее?
Джордж Мауэр
2

Я считаю, что это в основном историческая вещь. Среды REPL всегда ассоциировались с функциональными языками, включая языки семейства ML, и F # остается верным этой традиции. Имейте в виду, что интерактивная среда - это то, что пользователи, исходя из функционального фона, воспринимают как должное, отсутствие такой функции поставило бы VS и, в свою очередь, F #, в невыгодное положение.

С другой стороны, в сообществе ООП такая особенность не была обычным явлением.

Однако существуют REPL для многих нефункциональных языков, включая C, Java или C #. Кроме того, хотя это далеко от полноценного REPL, функция Autos в VS показывает, что она, безусловно, выполнима с C #.

scrwtp
источник
1
Это самое правдоподобное объяснение, которое я видел. Вначале был Фортран и Лисп, и Лисп имел ответы. Лисп родил ... ну, вы поняли. Языки происхождения Лиспа имели ответы, а линии Фортрана - нет.
Аарон
@Aaron LISP - 1959, но REPL приписывают машинам LISP, 1973. К тому времени уже было много, много языков вокруг. В частности, PASCAL и Smalltalk.
Sprague
1

Я считаю, что C # в первую очередь объектно-ориентированный. Чтобы написать даже самый простой код, вы должны разделить его на несколько классов. Чтобы использовать REPL, вам нужно написать много кода.

F #, будучи в основном функциональным, не имеет этой проблемы, и вы можете легко написать даже сложный код простым способом и позже преобразовать его в объект (ы).

Проще написать одну строку функции, чем написать класс, который занимает много строк.

Euphoric
источник
1
Ничто не мешает вам использовать функции / классы, определенные во внешних файлах в операторах REPL. Тот факт, что ООП более многословен, сам по себе не препятствует функциональности REPL.
scrwtp
1
Python, достаточно объектно-ориентированный и имеющий синтаксически значимые разрывы строк, действительно имеет достойный REPL. Scala, будучи статически типизированным, скомпилированным и достаточно объектно-ориентированным, имеет REPL. REPL наиболее полезен для коротких вещей, таких как импорт существующих классов и вызов некоторых методов; многословие языка не является проблемой. Например, SQL довольно многословен, но каждая база данных SQL поставляется с REPL («инструмент запроса»).
9000