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?
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?
Respostas:
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.
void
e 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.
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.
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.
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
.