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.
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!
Respostas:
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!)
fonte
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:
Observe que a chamada por valor é não determinística: você pode optar por avaliar a função ou o argumento primeiro.
fonte
"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.
fonte