É realmente possível ter uma linguagem de programação 'útil' que Turing não esteja completa?


37

Onde é aceito que uma linguagem precisa ser completa de Turing para ser útil, é realmente possível ter uma linguagem de programação 'útil' que não seja completa de Turing?

Devo esclarecer que isso é especificamente sobre linguagens de 'programação' no sentido tradicional, e não sobre linguagens de marcação ou consulta.


3
@PhonicUK SQL não estava completo no início
Ryathal 30/10/12

4
@Ryathal SQL não é uma linguagem de programação, é uma linguagem de consulta.
yannis

2
@PhonicUK sua pergunta no comentário realmente vale a pena, mude a pergunta postada para essa ou ela será fechada por não ser construtiva. Na verdade, existem idiomas completos não-turing úteis, e eu estaria interessado em ouvir detalhes deles.
Jimmy Hoffa

5
O regex não está completo, mas é amplamente utilizado
catraca aberração

3
@DavidHammen As implementações reais são limitadas, sim, por causa dos limites do nosso universo físico (só pode criar memória finita, só pode executar a máquina por um tempo limitado antes de funcionar mal). Mas isso não significa que os idiomas sejam limitados. A especificação de uma linguagem completa de turing não exige que uma implementação imponha esses limites a um programa, enquanto uma linguagem não-TC requer, por exemplo, uma prova de rescisão.

Respostas:


48

Coq , Agda , HOL e ACL2 são linguagens muito úteis e extremamente poderosas, embora não sejam completas em Turing.

Um recurso comum que os torna não completos de Turing é o fato de que sempre é possível provar o término. Uma limitação muito simples é suficiente: chamadas recursivas são permitidas apenas em termos comprovadamente estruturalmente menores. Portanto, embora não seja possível implementar um intérprete para uma linguagem completa de Turing ou mesmo para a própria linguagem, muitas outras coisas úteis ainda são possíveis, como um compilador C certificado .


2
Para aqueles que não estão familiarizados com esses idiomas, você poderia entrar em mais detalhes sobre o que eles estão perdendo, o que os torna não completos de Turing, e alguns exemplos de coisas construídas com esses idiomas?
PhonicUK 30/10/12

8
@PhonicUK: um compilador C não é uma implementação C . É uma ferramenta que transforma código em um idioma (C) em outro (geralmente código de máquina). Isso não significa que o próprio compilador C seja equivalente a qualquer programa C aleatório.
Joachim Sauer

9
@PhonicUK, você não pode implementar um intérprete para um idioma completo de Turing em um idioma que não seja completo. Mas você pode implementar um compilador, é claro (já que uma CPU Turing-completa fará uma avaliação real).
SK-logic

11
@ SK-logic: "Claro?" Só é possível para C porque é uma linguagem bastante simples. Não é possível para C ++ porque um compilador precisa interpretar o código do modelo (que é Turing-complete no tempo de compilação).
MSalters

11
@MSalters Sim, se a compilação do idioma estiver concluída, um compilador deve ser escrito em um idioma completo. O que também é meio óbvio (para não dizer tautológico). No entanto, observe que o padrão C ++ permite limites nos programas de entrada, como uma profundidade máxima de avaliação para instanciações de modelo (e as implementações existentes têm essa liberdade). Se não me engano, isso significa que um compilador C ++ completo sem turing pode ser possível (exceto problemas não relacionados, é claro).

12

Eu pensaria que o termo "mini-idioma" de Yegge se refere ao fato de que geralmente é útil usar um idioma para problemas específicos, nos quais o idioma não exige perfeição para completar a tarefa, e isso vai ao cerne de como não aprender idiomas completos pode ser útil. https://sites.google.com/site/steveyegge2/language-grubbing

A Wikipedia responde muito bem, alinhada com o que meu intestino disse. Primeiro, eu estava pensando em matemática pura, depois me lembrei do regexp, e a Wikipedia lista o Epigram, que acredito estar na linha da 'matemática pura'.

http://en.wikipedia.org/wiki/Turing_completeness#Non-Turing-complete_languages

Idiomas não completos de Turing

Existem muitas linguagens computacionais que não são completas de Turing. Um exemplo é o conjunto de linguagens regulares, mais comumente expressões regulares, geradas por autômatos finitos. Uma extensão mais poderosa, mas ainda não completa, de Turing de autômatos finitos é a categoria de autômatos de empilhamento e gramáticas sem contexto, que são comumente usadas para gerar árvores de análise em um estágio inicial da compilação do programa. Exemplos adicionais incluem algumas das versões anteriores das linguagens de sombreador de pixel incorporadas nas extensões Direct3D e OpenGL, ou uma série de fórmulas matemáticas em uma planilha sem ciclos. [Citação necessário] Na linguagem de programação funcional total, todas as funções são totais e devem ser rescindir, como Charity e Epigram. Charity usa um sistema de tipos e controla construções baseadas na teoria de categorias,

Linguagens de dados

A noção de completude de Turing não se aplica a linguagens como XML, JSON, YAML e expressões S, porque elas geralmente são usadas para representar dados estruturados, não para descrever a computação. Às vezes, elas são chamadas de linguagens de marcação ou mais apropriadamente como "linguagens de descrição de dados".

Ele também menciona que as representações da estrutura de dados não são linguagens, mas eu acho que o XSLT deve contar como uma representação da computação, XPath talvez não com base no que Yannis disse acima sobre o SQL ser uma linguagem de consulta e não uma linguagem de computação. Talvez T-SQL ou PL / SQL sejam contados como linguagens de computação, já que você pode fazer uma grande quantidade de cálculos usando seus agregados, onde a forma generalizada de SQL talvez não especifique agregados.


8

Entendo que o SQL é bastante popular entre os tipos de negócios


3
SQL é uma linguagem de consulta, não uma linguagem de programação.
PhonicUK

4
@ PhonicUK: e qual é exatamente a diferença entre uma linguagem de consulta e uma linguagem de programação?
Joachim Sauer

8
@PhonicUK - Tex é uma linguagem de marcação de texto e é Turing completa #
Martin Beckett

3
implementações modernas de sql, até onde eu sei, estão completas.
shabunc

6
@shabunc IIRC apenas com procedimentos armazenados. O argumento não conseguir um pouco circular, se não é Turing completa, então não é uma linguagem de programação -, portanto, todas as línguas "programação" são TC
Martin Beckett

5

É necessário garantir a integridade de Turing para que um idioma seja adequado para uso como um idioma de uso geral. Mas não é suficiente , ou seja, apenas porque é Turing completo, não é adequado para todos os domínios de problemas:

  • O espaço em branco é comprovado como Turing completo, mas obviamente não é adequado para qualquer domínio de problema fora do entretenimento do programador.
  • Os modelos C ++ foram comprovados como completos, mas você nunca escreveria programas inteiros com eles.

Por outro lado, uma DSL é adequada para o domínio do problema para o qual foi projetada (assumindo que foi de fato decentemente projetada), mesmo sem a integridade de Turing:

  • HTML * fornece uma maneira concisa de descrever uma árvore DOM. Enquanto o JavaScript é Turing completo e pode ser usado da mesma forma, é muito mais barulhento e pouco claro
  • XPath e outras linguagens de consulta, PCRE sem código incorporado e essas são ferramentas poderosas para o trabalho único para o qual foram projetadas

* IIRC foi provado que o HTML com animações CSS é Turing completo, usando-os para implementar o Jogo da Vida de Conway em uma variedade de caixas de seleção. Mas a utilidade do HTML é válida até em navegadores que não suportam animações CSS.


2
Você tem um link para a vida de Conway implementado em CSS?
RBerteig 30/10/12

Não conheço uma implementação CGOL em CSS, mas sei que a Regra 110 foi implementada. Parece que não consigo encontrá-lo, parece que ele foi movido.
Christian Mann


-1 Muito interessante, mas não aborda a questão
mattnz

2
@mattnz: Errado. Dou exemplos concretos de linguagens não completas de Turing que são úteis, que considero uma resposta apropriada para "É realmente possível ter uma linguagem de programação 'útil' que não seja completa em Turing?", Não diferente de outra resposta aqui
Back2dos # 31/12

3

Na verdade, existem linguagens de programação, nas quais você só pode escrever programas "eficientes". Eficiente nesse sentido significa que todo programa escrito em um idioma representa um idioma em P. Bellantoni, Niggl e Schwichtenberg descrevem essa língua aqui .


1

O pré-processador C não é completo em Turing (por projeto), mas ainda pode implementar um intérprete para um idioma que é completo em Turing (a ordem do idioma, conforme descrito na documentação, é basicamente apenas uma moinho do tipo ML / Scheme puramente funcional e seria relativamente normal - provavelmente bastante agradável de usar - se não fosse a implementação incomum).

O truque subjacente é semelhante aos argumentos acima sobre a implementação de qualquer máquina de Turing em um universo físico finito: o pré-processador C não pode fornecer um número infinito de etapas, ou células de dados, para a linguagem, mas pode:

  1. fornecer um exageradamente grande número dinâmica (2 ^ 64 ou então por padrão), grande o suficiente para resolver a maioria dos problemas realistas usando um processo de expansão exponencial ( murmúrio murmúrio tempo de vida do universo murmúrio ).

  2. use um limite estático arbitrário para o número acima, ou seja, embora o número de etapas deva ser um número finito, você pode alterar qual é o limite específico no momento da "compilação" alterando as configurações estáticas do mecanismo do intérprete. Como não há limite (teórico) no valor real desse limite, ele pode (teoricamente) ser estendido para atender ao requisito de espaço para qualquer programa de encerramento.

Não se deve argumentar que Order é necessariamente "útil" por si só, ou que qualquer mecanismo implementado por CPP seria, mas é uma prova interessante de conceito. Também é supostamente digitado dinamicamente , o que é incomum para esta área.


Voto positivo por resmungar no meio da palestra.
jpaugh

-1

Sim, é possível ter uma linguagem útil que não seja completa para Turing. Veja aqui: http://tkatchev.bitbucket.org/tab/examples.html

Outro exemplo de uma linguagem incompleta útil de Turing é o SQL. (E ainda outra são planilhas como Gnumeric ou Excel, embora não sejam realmente linguagens de programação.)

Por que você desejaria uma linguagem que não seja Turing completa: porque isso permite que você faça algumas garantias fortes sobre o comportamento em tempo de execução.

Completar Turing, de maneira clara, significa ter capacidade de recursão. Ter recursão significa ter estruturas potencialmente ilimitadas na memória. Como no mundo real a memória não é infinita, a integridade de Turing requer gerenciamento de memória e / ou coleta de lixo.

Banir a recursão é uma ótima maneira de evitar o problema realmente difícil do gerenciamento de recursos.

Nota bene! Ser Turing incompleto não implica necessariamente que qualquer programa termine necessariamente. Uma linguagem incompleta de Turing pode permitir avaliar uma lista preguiçosa infinita.


-1

Uma "linguagem de programação sub-Turing" interessante não foi mencionada até agora, então vou adicioná-la.

É chamado "Crema" . Ele se descreve como:

Crema é um front-end do LLVM que visa executar especificamente no espaço completo de sub-Turing. Projetado para ser simples de aprender e prático para a maioria das tarefas de programação necessárias, o Crema pode restringir a complexidade computacional do programa ao mínimo necessário para melhorar a segurança.

É um nível bastante minimalista e bastante baixo.

Deve parecer meio familiar para os desenvolvedores C.

Foi inicialmente financiado pela Agência de Projetos de Pesquisa Avançada de Defesa (DARPA), mas parece bastante conservado no momento da redação. Mas talvez alguém esteja interessado, no entanto.

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.