Por que o F # tem um modo interativo, mas não o C #?


32

O F # sai da caixa com um REPL interativo. O C # não tem nada desse tipo e é de fato meio difícil de brincar sem a configuração de um projeto completo (embora o LINQpad funcione e também seja possível através do PowerShell).

Existe algo fundamentalmente diferente nas linguagens que permite ao F # ter o console interativo, mas dificulta sua implementação no C #?


Desde muitos anos depois, as pessoas ainda estão chegando a essa pergunta, devo observar que agora existem muitas opções. Você pode usar o PowerShell (pré-instalado em todas as máquinas modernas do Windows) para jogar com a estrutura .Net. Ou você pode usar o LINQpad para criar um protótipo de código c # arbitrário . Ou você pode usar ScriptCs ou um ambiente on-line do tipo jsfiddle, como Complify.net ou Jsil . Muitas opções.


4
C # faz ter um REPL. Chama-se Janela Imediata e está disponível há um bom tempo. Ele possui certas limitações, algumas das quais se tornaram cada vez mais visíveis desde o C # 3.0, pois os novos recursos de idioma não eram suportados por ele, mas, no entanto, é um REPL completo.
Allon Guralnek


Lembro-me do projeto Roslyn versão de demonstração por volta de 2012 tinha um REPL nele para VS2010
James

@DanielHakimi: Obrigado por este comentário, eu não tinha idéia de que isso foi incluído no VS2015, eu apenas pensei que você poderia usar a janela Imediata durante a depuração. O VS2015 agora contém a janela da ferramenta C # Interactive , acessível em Exibir -> Outras janelas -> C # Interactive, que parece ser um REPL completo baseado em Roslyn, separado do ambiente de depuração.
Lou

Respostas:


56

Existe algo fundamentalmente diferente nas linguagens que permite ao F # ter o console interativo, mas dificulta sua implementação no C #?

Sim.

O F # é um descendente da linguagem de programação ML, que por sua vez foi fortemente influenciada por linguagens como Lisp e Scheme. Esses idiomas foram projetados desde o primeiro dia para ter três boas propriedades.

Primeiro, esses idiomas não têm realmente instruções do jeito que você as pensa em C #. Em vez disso, quase tudo é uma expressão que tem um valor ; portanto, um mecanismo de avaliar e imprimir o valor faz sentido em quase todas as situações.

Segundo, esses idiomas desencorajam a programação com efeitos colaterais, para que você possa fazer avaliações sem se preocupar com a bagunça do estado global.

Terceiro, a maior parte do trabalho que você faz nessas línguas é "de nível superior"; normalmente não há "classe" ou "espaço para nome" ou outro contexto.

Por outro lado, o C # enfatiza o fluxo de controle de programação com instruções que produzem efeitos colaterais, e essas instruções estão sempre em vários contêineres aninhados - um espaço para nome, uma classe, um método e assim por diante.

Portanto, essas são todas as coisas que tornam mais difícil para o C # ter um REPL, mas certamente não é impossível . Apenas precisamos descobrir quais são as semânticas para declarações e expressões que aparecem fora do contexto usual e quais são as semânticas de mutações que alteram as ligações de nomes, e assim por diante.

Por que o F # tem um modo interativo, mas não o C #?

Porque a equipe do F # decidiu que ter um loop REPL era um cenário prioritário para eles. A equipe de C # historicamente não tem. Os recursos não são implementados, a menos que sejam os recursos de maior prioridade que se encaixam no orçamento; até agora, um C # REPL não estava no topo da nossa lista.

O projeto Roslyn possui um C # REPL (e eventualmente também terá um VB REPL, mas ainda não está pronto.) Você pode fazer o download de uma versão prévia para ver como você gosta em

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


7
O Python possui um bom REPL e possui instruções, efeitos colaterais e espaços para nome. E também Javascript, Bash, etc. Muitos idiomas que violam seus critérios têm o REPL muito bem.
Lie Ryan

2
Bem-vindo de volta, Eric! Espero que possamos ver mais respostas suas.
SolutionYogi

16
@LieRyan Eu acho que você perdeu todo o argumento. O único "critério" para um loop REPL interativo é que alguém se sentou e escreveu um; no F # era de alta prioridade e relativamente fácil, em C # era de baixa prioridade e relativamente difícil, portanto, o F # recebeu um no início e o C # não.
KutuluMike

Interessante. Eu acrescentaria que a experiência adquirida na construção de tantos compiladores para a estrutura .NET antes do lançamento do VS2010 (conto quatro C #, quatro VB.NET, dois J # e dois C ++ / CLI) deve ter afetado como um compilador novo para uma nova linguagem .NET foi criada. Tenho certeza de que foi construído no estilo de Roslyn, com muita reflexão sobre como habilitar o cenário Compilador como Serviço, que parece a direção em que você estará desenvolvendo todos os futuros compiladores .NET e revisões do compilador. Para mim, parece que a era em que o F # nasceu inevitavelmente desempenhou um papel na forma como seu compilador foi escrito.
Allon Guralnek

Ótima resposta. Sobre as linguagens de sintaxe Python vs C #: {} não se inclinam muito bem para REPLs, as linguagens baseadas em recuo têm um grande avanço aqui. Nunca pensei que eu pensaria ou diria: a sintaxe de indentação é melhor que a {} sintaxe. Para REPLs, bem como para legibilidade do código. Portanto, desde que não haja metassintaxe de C # que substitua a indentação por {}, a experiência do REPL nunca será tão suave quanto, por exemplo, no F # ou no Python.
Citykid


2

Eu acredito que é principalmente uma coisa histórica. Os ambientes REPL sempre foram associados a linguagens funcionais, incluindo as linguagens da família ML e o F # permanece fiel a essa tradição. Lembre-se de que o ambiente interativo é algo que os usuários provenientes de background funcional consideram um dado adquirido; a falta desse recurso pode colocar o VS e, por extensão, o F # em desvantagem.

Por outro lado, esse recurso não é comum na comunidade OOP.

No entanto, existem REPLs disponíveis para muitas linguagens não funcionais, incluindo C, Java ou C #. Além disso, embora esteja muito longe de um REPL completo, o recurso Autos no VS mostra que é certamente possível com o C #.


1
Esta é a explicação mais plausível que eu já vi. No começo, havia Fortran e Lisp, e Lisps tinha repls. Lisp gerou ... bem, você entendeu. Os idiomas da linhagem Lisp tiveram repls, e a linha Fortran não.
Aaron

O @Aaron LISP é 1959, mas o REPL é atribuído às máquinas LISP, 1973. Até então, já havia muitos e muitos idiomas por aí. Notavelmente PASCAL e Smalltalk.
Sprague

1

Eu acredito que o C # é principalmente orientado a objetos. Para escrever um código ainda mais simples, você deve dividi-lo em várias classes. Para usar o REPL, você precisará escrever muito código.

O fato de o F # ser principalmente funcional não tem esse problema e você pode escrever facilmente códigos complexos mesmo em uma classe simples e convertê-los em objetos posteriormente.

É mais fácil escrever uma única linha de função do que escrever classe, que abrange muitas linhas.


1
Não há nada que o impeça de usar funções / classes definidas em arquivos externos nas instruções REPL. O fato de o OOP ser mais detalhado não prejudica a funcionalidade do REPL por si só.
scrwtp

1
O Python, sendo bastante orientado a objetos e apresentando quebras de linha sintaticamente significativas, possui um REPL decente. Scala, sendo digitado estaticamente, compilado e bastante orientado a objetos, possui um REPL. O REPL é mais útil para coisas curtas, como importar classes existentes e chamar alguns métodos; a verbosidade da língua não é uma preocupação. Por exemplo, o SQL é bastante detalhado, mas todo banco de dados SQL vem com um REPL (uma 'ferramenta de consulta').
9000
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.