Qual é a diferença entre um cálculo e uma linguagem de programação?


13

Acho que estou bastante confuso sobre o que é chamado de cálculo e o que é chamado de linguagem de programação.

Costumo pensar, e pode ter sido dito, que um cálculo é um sistema formal de raciocínio sobre a equivalência de programas. Os programas têm uma semântica operacional especificada por uma máquina, que deve (eu acho?) Ser determinística. Dessa maneira, um cálculo (correto) para uma linguagem é um método de prova para equivalência de programa.eu

Parece-me uma divisão razoável, mas esse é o significado comumente aceito? Ou talvez até esteja errado?

Relacionado, por que algumas semânticas operacionais não são determinísticas (suponha que seja confluente)? O que é ganho ao deixar em aberto a escolha da estratégia?

Eu realmente aprecio alguns esclarecimentos sobre isso; e referências concretas ainda mais! Obrigado!


3
São palavras diferentes para diferentes maneiras de ver a mesma coisa.
Raphael

1
@Raphael, como ele responde à pergunta? Este não é o lugar para fazer filosofia.
Fade2black 13/06

4
Às vezes, um pouco de filosofia é necessária, em qualquer lugar.
André Souza Lemos

Respostas:


10

O significado das palavras não é fixo, mas posso lhe dar minha interpretação.

Um cálculo é algo com o qual calculamos no sentido de equações de malabarismo (pense na manipulação das séries de Taylor ou no cálculo de integrais na análise). Um cálculo nos diz quais são as regras de manipulação, mas não quais devemos usar em uma determinada situação.

Uma linguagem de programação é algo que nos diz como calcular. Ele nos diz exatamente como usar as regras. Normalmente, deixamos o computador usar as regras, pois é muito mais rápido. As regras podem ser não determinísticas e pode haver boas razões para serem não determinísticas. Pode ser da natureza do cálculo que ele não é determinista (pense em processos de comunicação simultâneos) ou a fixação de uma estratégia específica pode ser prejudicial às técnicas de implementação e otimização.

Por exemplo, o cálculo é uma teoria equacional . Existem expressões e equações nos dizendo quando as expressões são iguais. As equações não nos dizem como aplicá-las, embora as pessoas usem agendas ocultas e apresentem as equações para que mais tarde possam derivar estratégias úteis de avaliação. Mas, em sua essência, o λ- cálculo é um monte de equações. Não é uma linguagem de programação.λλ

Por outro lado, o ML padrão é uma linguagem de programação. É dado em termos de semântica operacional, isto é, regras de computação. Existem noções derivadas de igualdade (equivalência contextual, equivalência observacional etc.) que podemos colocar em cima dela para pensar nela como uma espécie de cálculo.

Obviamente, existem frequentemente conexões úteis entre um cálculo e sua manifestação como uma linguagem de programação. A normalização de confluentes é apenas uma maneira de passar do cálculo para a linguagem de programação (embora, infelizmente, algumas pessoas tenham feito disso uma espécie de religião). A interação entre os cálculos e as linguagens de programação é importante: as linguagens de programação podem realmente ser usadas, mas os cálculos explicam o que são os programas.

Apenas para irritar as pessoas, deixe-me também afirmar que fingir que não há diferença entre um cálculo e sua manifestação operacional às vezes leva a visões distorcidas da programação e mini-religiões na comunidade de programação. Você pode tentar adivinhar qual idioma eu tenho em mente. (É uma linguagem muito legal!)


Então, uma linguagem de programação é um cálculo equipado com um sistema de estratégia / reescrita compatível com ela?
xavierm02

ppp=p

π

Você pode apresentar equações que falam não apenas sobre o programa, mas também sobre seu ambiente (estado ou transições). Mas eu não diria que isso é um cálculo. Pelo contrário, é um modelo algébrico.
Andrej Bauer

Muito obrigado, Andrej, isso faz sentido para mim. Sei que pode variar de pessoa para pessoa, mas estou aceitando essa resposta, já que (acho) é a melhor.
Guido

2

O objetivo do cálculo não é apenas estudar equivalências de programas, é estudar programas. Um exemplo de cálculo sofisticado é este onde a estratégia (chamada por valor ou chamada por nome) é determinada localmente. Ele pode ser implementado algum dia em uma linguagem de programação, mas é estudado pela primeira vez como um cálculo. Você também usa cálculos para estudar sistemas de tipos (com alguns cálculos como o da teoria dos tipos de Martin-Löf também computando tipos).


Acredito que a principal diferença é que os cálculos devem ser (relativamente) fáceis de estudar formalmente, enquanto as linguagens de programação devem ser (relativamente) fáceis de usar. Isso leva às seguintes diferenças:

Os cálculos tendem a ser minimalistas, enquanto os PLs tendem a ter redundância (loop for quando você já possui loop while, alterna quando já possui if, ...) para facilitar a expressão do que você deseja.

Os cálculos têm semântica totalmente especificada, enquanto uma semântica de PLs é frequentemente descrita por um interpretador / compilador padrão.


Algumas semânticas operacionais são não determinísticas porque permitem:

  • Para provar coisas sobre todas as "sub-semânticas".
  • Permitir que a implementação escolha e, portanto, (talvez) acelerar as coisas.
  • Porque, às vezes, você tem uma operação "radnom ()" e, se você não se importa com probabilidades, mas apenas com o que é possível, o não-determinismo é uma boa maneira de representá-lo.

Observe que a chamada por valor é não determinística: você pode optar por avaliar a função ou o argumento primeiro.


Não, eu discordo que se trata de nível de formalização ou sofisticação.
Andrej Bauer

2

"Linguagem de programação" e "cálculo" são termos polissêmicos, ou seja, significam coisas diferentes, dependendo do contexto.

Em alguns contextos, linguagens de programação e cálculos convergiram para se referir ao mesmo conceito, o de um sistema de reescrita baseado em um conjunto de regras formais que podem ser aplicadas "mecanicamente".

A razão pela qual essa convergência é ocasionalmente enigmática para nós (mas não para desenvolvedores de software ou matemáticos) é que nosso trabalho é conceber linguagens de programação concretas como se fossem cálculos e incorporar fisicamente cálculos em linguagens de programação concretas.

Para responder sua pergunta diretamente, a confusão entre cálculos e linguagens de programação (na medida em que existe) não é um acidente, mas um projeto. Nosso projeto. É uma prova do nosso relativo sucesso como disciplina científica.

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.