Uma linguagem de programação poderia funcionar tão bem sem declarações?

9

Como programação em JavaScript, notei que tudo o que pode ser feito com instruções e blocos pode ser feito apenas com expressões. Uma linguagem de programação pode funcionar bem apenas com expressões? E, se sim, por que as instruções são usadas?

MaiaVictor
fonte
2
Sim, existem muitas linguagens "tudo é uma expressão", como Ruby e todos os dialetos do Lisp.
Amara
@sparkleshy eu vejo, apenas um palpite: todos eles têm um operador analógico para a vírgula do JavaScript (ele executa duas instruções e retorna o valor da última)? Essa é geralmente a solução para executar duas instruções em sequência? Estou contando o progn do CL como analógico, acho, mesmo que funcione para> 2 expressões.
MaiaVictor
11
Tudo-é-uma-expressão não precisa parecer diferente de uma linguagem de declaração comum, declarações apenas ... têm valores. Se você fizesse expressões de instruções do javascript, todo o código existente seria completamente válido.
Amara
11
O CoffeeScript é uma linguagem do tipo tudo é uma expressão, que é compilada em JavaScript.
Spoike
11
relacionado (possivelmente uma duplicata): Que expressividade útil será impossível em um idioma em que uma expressão não é uma afirmação? "Por que tantas gramáticas fazem a distinção entre expr e stmt quando indicado nas respostas, não faz sentido".
mosquito

Respostas:

14

Certo. A maneira mais simples é atribuir um valor de resultado a cada construção que atualmente é uma instrução e, assim, transformá-la em uma expressão. Isso não é necessariamente útil ou significativo. O único ganho potencial é um pouco de simplicidade conceitual. No entanto, se você continuar removendo itens como ponto e vírgula e loops (exigindo encadeamento por meio de outros operadores e funções), os programas que usam muito as instruções se tornam feios.

Uma maneira mais radical, mas significativa, de fazer isso é projetar a linguagem de modo que quase tudo tenha um valor significativo e usá-la de uma maneira que você quase sempre use uma expressão para esse valor significativo, e não para outros efeitos. Linguagens de programação funcional fazem isso (até certo ponto; por exemplo, Haskell tem declarações, que não são expressões).

As declarações são usadas porque, no paradigma imperativo, existem muitas operações comuns que não têm um valor de resultado útil e porque a noção de instruções seqüenciais (em vez de cálculos) se encaixa muito bem nesse paradigma. Se uma grande porcentagem do seu programa está com estado de mutação, em vez de calcular novos valores, não faz sentido exigir a produção de um valor (qual é o resultado de um loop for?). Por outro lado, quando todo o seu paradigma (FP) é construído em torno do cálculo de valores, os valores extremos que não têm um valor de resultado não justificam uma exceção: em vez disso, você fornece a eles um resultado sentinela que não significa nada.


fonte
-1 isso não é verdade
amara
3
@sparkleshy Que parte não é verdadeira e como?
11
primeiro parágrafo: você duvida da ideia de que as declarações têm valores úteis de retorno (mas muitos sim), propõe uma coisa feia (por quê?). segundo parágrafo: declara que todas as linguagens de programação funcionais usam esse conceito de franja feia, o que é ridículo. terceiro parágrafo: false, temos que em {} blocos já o valor é ignorado e não causa nenhum problema, incorreto; você já está dando a eles a falta de valor do nulo, como é nulo menos significativo do que isso? geral: isso não é realmente verdade
amara
2
@sparkleshy - Nenhuma declaração tem valores de retorno úteis, é por isso que são declarações . Eles podem ter efeitos colaterais úteis (como atribuição), mas não é a mesma coisa. Este não é realmente um conceito marginal. É bem conhecido, se não totalmente prático, se levado ao N-ésimo grau. E esse valor de sentinela não é nulo ou nulo, é uma unidade que é sutilmente diferente de ambos. +1 para delnan para compensar isso.
Telastyn
4
@sparkleshy (1) Você pode confundir expressões (que podem ser o único componente de uma declaração) com declaração (que não são expressões e não têm valor de resultado). (2) o que? Qualquer advogado de PF confirmará isso (e argumentará que é uma coisa boa). Ou é apenas a parte "todos" à qual você se opõe? (3) {} blocos são do que estou falando ("noção de instruções seqüenciais"). E onde digo que algo causa algum problema? A diferença entre voide null/ unité que esses últimos são valores e podem ser passados ​​adiante, ao passo que voidé especial porque não há valor desse tipo.
5

Depende de como você define "instrução" e "expressão".

Uma definição muito estrita distinguiria entre declarações como "coisas que têm efeitos colaterais e talvez um valor de retorno" e expressões como "coisas que têm valores de retorno, mas não podem ter efeitos colaterais". Com essa definição, nenhum programa significativo pode ser escrito sem pelo menos uma declaração (que precisaria avaliar uma expressão e gerar seu valor de retorno) - apenas expressões puras não podem interagir com o mundo fora do programa. Uma linguagem sozinha ainda pode ser completamente pura (ou seja, não possui nenhuma declaração), se a parte impura for movida para fora da linguagem e entrar no ecossistema de suporte (que é exatamente o que Haskell faz, embora a linguagem tenha definições e expressões) .

Se, no entanto, você permitir efeitos colaterais em expressões, a distinção entre declarações e expressões se torna arbitrária e muito menos interessante - é claro que você pode inventar uma linguagem de programação que consiste apenas em expressões; a maioria dos dialetos Lisp funciona assim. Em tal situação, avaliar uma expressão para seus efeitos colaterais é praticamente o mesmo que executar uma instrução, e pode-se argumentar que, em uma linguagem, expressões e instruções são a mesma coisa. A diferença entre uma declaração e uma expressão, então, é apenas sintática.

Muitos idiomas ainda fazem essa distinção sintática, porque é útil não por razões técnicas, mas para facilitar a leitura. Transformar algo em uma expressão sinaliza que você está interessado em seu valor de retorno, menos nos efeitos colaterais; fazer uma declaração informa ao leitor que você pretende causar efeitos colaterais, e o valor de retorno pode ou não ser interessante.

tdammers
fonte
+1 para comentários sobre a legibilidade ... No final, os seres humanos precisam entender isso ...
mattnz
1

ATL e Xtend são linguagens de programação que funcionam bem sem declaração. Muitas linguagens funcionais também são sem declaração. Portanto, sim, uma linguagem de programação pode funcionar bem sem instruções. Eu acho que as declarações são, em muitas línguas, uma relíquia da programação imperativa. Eles ainda são usados ​​porque são amplamente conhecidos e, em alguns casos, tornam o código mais legível.

SpaceTrucker
fonte
1

Sim.

Linguagens funcionais (e linguagens de atribuição única) tudo é uma expressão. Exemplos são Haskal (e SISAL). Onde instruções if e loops retornam valores.

Existem outras classes de linguagens: a mais fácil que vem à mente são as linguagens declarativas (tenho certeza de que existem muitas outras que não dependem de declarações). Essas linguagens nem precisam de expressões (no mesmo sentido que você normalmente pensaria). Você declara o que é verdadeiro e pode obter vários resultados. O mais fácil aqui é prolog.

Martin York
fonte
Haskell tem declarações, elas não são expressões.
Janus Troelsen