Medida de poder que não seja a perfeição de Turing


18

Inicialmente, tentei perguntar isso no StackOverflow, mas era muito subjetivo :-(. Estou interessado em métodos para definir o poder das linguagens de programação. A conclusão de Turing é uma delas, mas é quase universalmente satisfeita. O que seria bom é definir um medida de poder que discrimina as linguagens de programação realmente usadas.Por exemplo, alguém pode propor um método não subjetivo que discrimine entre assembly e Java?

Turing completude significa que uma linguagem é extremamente poderosa no que pode produzir (o que praticamente significa que pode fazer qualquer coisa fora do tempo com base no mundo real). Portanto, se queremos definir uma medida mais forte de poder, precisamos adotar outra abordagem. A falta foi sugerida na pergunta original, mas isso não é fácil de definir. Alguém tem outras sugestões?

Respostas:


24

A noção que você está procurando é chamada expressividade e Matthias Felleisen tem uma definição matematicamente rigorosa:

" Sobre o poder expressivo das linguagens de programação "

www.ccs.neu.edu/scheme/pubs/scp91-felleisen.ps.gz (versão PostScript)

A intuição por trás da idéia é que, se você tiver dois programas equivalentes em dois idiomas diferentes - digamos, programa A no idioma X e programa B no idioma Y - e se você fizer uma alteração local em A que exija uma mudança global em B , então X é mais expressivo que Y.

Um exemplo que Felleisen fornece é a atribuição: nas linguagens de programação Scheme, você pode remover o operador de atribuição e ainda ter uma linguagem completa de Turing. No entanto, em um idioma tão restrito, a adição de um recurso que seria localizado se a atribuição fosse permitida exigiria uma alteração global no programa sem atribuição.

Minha discussão simplificou alguns detalhes e você deve ler o documento em si para obter a conta completa.

Para responder sua outra pergunta: Você pode dizer que Java é mais expressivo que assembly, porque você pode adicionar uma nova classe ao seu programa Java e obter os benefícios do polimorfismo fazendo com que outras partes do seu programa chamem seus métodos sem modificação global. O tratamento de exceções é outro exemplo em que o Java é mais expressivo que o assembly: você simplesmente precisa escrever uma única throwinstrução para transferir o controle da pilha. Em um nível mais elementar, você também pode adicionar uma nova casedeclaração perto do início de uma switche não precisará se preocupar em recalcular qualquer compensação de salto manualmente.


Muito obrigado! Era exatamente isso que eu estava procurando!
Casebash 29/10

6

Se entendi sua pergunta corretamente, você ainda está procurando algo que seja relativamente mensurável e não apenas um julgamento subjetivo. Nesse caso, eu pessoalmente favoreceria a quantidade de tempo necessária para resolver qualquer problema específico (média sobre todos os problemas e todos os programadores). Nesta medida, pode ser necessário considerar não apenas a linguagem em si, mas também a estrutura / API usada com ela. A sintaxe sucinta é um fator muito pequeno: um fator muito mais importante é que a funcionalidade mais comumente necessária é facilmente acessível.

Se você está procurando algo mais subjetivo, eu diria como é divertido . Os programadores tendem a ser pessoas que desejam resolver problemas; portanto, uma linguagem de programação divertida para os programadores será inevitavelmente a que resolverá a maioria dos problemas. Essa medida leva em consideração que pessoas diferentes têm preferências diferentes sobre como usar as coisas; portanto, a “melhor” linguagem de programação será a mais atraente para a maior variedade de programadores. No entanto, talvez você precise considerar não apenas a linguagem de programação e a API aqui, mas também o ambiente (IDE), que é obviamente o que o programador realmente interage.


Eu diria que medir o tempo gasto também é subjetivo. Qual programador levou o tempo? Se você testar os tempos de ambas as línguas com o mesmo programador, qual idioma ele conhecia melhor? Existem maneiras estatísticas de lidar com isso, mas uma pessoa não poderia fazer isso sozinha.
John Fisher

1
@ John: Só porque algo só pode ser analisado estatisticamente não significa que é subjetivo.
David Thornley

@ David: Esse não era realmente o meu ponto. A questão era que, sem um estudo preexistente, o pesquisador seria incapaz de comparar o "poder" das línguas de que se importava - deixando-o subjetivo quando não analisado estatisticamente em um grande grupo.
John Fisher

1

Eu definiria o quão poderosa é uma linguagem pelo quão produtivo você pode ser com ela. Muitas pessoas tendem a falar sobre produtividade em termos de escrever código rapidamente, mas como a maior parte do ciclo de vida de um programa é de manutenção, não de desenvolvimento, uma medida melhor é a facilidade com que você pode ler e depurar o código, especialmente quando ele é escrito por alguém. outro. Os idiomas mais poderosos são os mais fáceis de ler e manter.


2
A dificuldade disso é que conhecer um idioma facilita para quem o conhece. Então, essa medida se torna subjetiva.
John Fisher

1

Você precisa definir melhor sua terminologia.

Turing completude não tem a ver com "poder" no sentido que você provavelmente quer dizer. Pelo contrário, é sobre computabilidade; ou seja, se um determinado idioma pode expressar qualquer programa que possa ser implementado usando uma máquina de Turing. Acontece que praticamente todas as linguagens de programação são Turing completas.

O que você provavelmente procura é uma medida do que é chamado de "expressividade" da linguagem de programação. Não tenho certeza se existe alguma medida, ou se existe, se é útil. Fundamentalmente, diferentes linguagens de programação são melhores para expressar soluções para diferentes tipos de problemas.

EDITAR

Apenas para esclarecer, as linguagens de programação não possuem uma propriedade conhecida como "poder". Existe um conceito conhecido como "expressividade" ou "poder expressivo" de uma linguagem de programação. Expressividade é em parte sobre como é fácil escrever programas sucintos para resolver problemas específicos. Mas há também uma medida considerável de como é fácil ler e escrever os programas. É como "beleza". Eu o saberei quando o vir, mas não me peça para defini-lo.

Simplesmente comparar a contagem de caracteres não fornece uma medida adequada de expressividade. Caso contrário, você poderia tornar uma linguagem mais expressiva compactando o código-fonte ... e isso não faz sentido. De fato, não conheço nenhuma medida objetiva de expressividade e suspeito fortemente que não exista. O que efetivamente torna a característica inútil e bastante desinteressante.


1
Eu sei que a integridade de Turing é sobre computabilidade. Sabemos que existem medidas menores na escala de computabilidade, como máquinas de estados finitos. Mas não podemos usar computability para definir um nível de potência acima disso, como Turing completude é maximamente poderoso em termos de computabilidade
Casebash

@ Casebash - você ainda não disse o que é "poder".
Stephen C

2
Isso porque eu não sei e esse é o ponto principal desta questão!
Casebash 5/09

Então, qual é o sentido da sua resposta? Deveria ter sido um comentário.
Reinierpost

@reinerpost - O objetivo da minha resposta é explicar em detalhes que a pergunta não tem sentido e por quê. Basicamente, a pergunta está perguntando "Existe algo chamado 'poder expressivo' - não sei o que é, mas você poderia me dizer como mensurá-lo?" E o ponto principal da minha resposta é que "poder expressivo" é um conceito / propriedade mal definido, e DEFINITIVAMENTE não é mensurável / quantificável. (E isso é claramente uma resposta e não um comentário Talvez você simplesmente não entende o que estou tentando dizer.?)
Stephen C
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.