ti-enxame.com

Medida de potência diferente da integridade de Turing

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

Completude de Turing significa que uma linguagem é maximamente poderosa no que pode produzir (o que significa que pode fazer qualquer coisa não baseada no tempo no mundo real). Portanto, se quisermos definir uma medida mais forte de poder, precisamos adotar outra abordagem. A abreviação foi sugerida na pergunta original, mas isso não é nada fácil de definir. Alguém tem alguma outra sugestão?

18
Casebash

A noção que você está procurando se chama 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 ideia é que se você tiver dois programas equivalentes em duas línguas diferentes - digamos, o programa A na linguagem X e o programa B na linguagem Y - e se você fizer uma alteração local em A que requer uma mudança global em B , então X é mais expressivo do 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 de Turing completa. No entanto, em um idioma tão restrito, adicionar um recurso que seria localizado se a atribuição fosse permitida exigiria uma mudança global no programa sem atribuição.

Minha discussão simplificou alguns detalhes, e você deve ler o próprio artigo para o relato completo.

Para responder à sua outra pergunta: Você pode dizer que Java é mais expressivo do que Assembly porque você pode adicionar uma nova classe ao seu programa Java, e então obter o benefícios do polimorfismo por ter outras partes de seu programa chamando seus métodos sem modificação global. O tratamento de exceções é outro exemplo onde Java é mais expressivo que Assembly: Você simplesmente precisa escrever um único throw instrução para transferir o controle para cima da pilha. Em um nível mais elementar, você também pode adicionar uma nova instrução case perto do início de switch e você não terá que se preocupar em recalcular qualquer deslocamento de salto manualmente.

25
Macneil

Se entendi sua pergunta corretamente, você está procurando algo que seja relativamente mensurável e não apenas um julgamento subjetivo. Se sim, eu pessoalmente favoreceria a quantidade de tempo gasto para resolver qualquer problema em particular (média de todos os problemas e de todos os programadores). Nessa medida, você pode precisar 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 por algo mais subjetivo, eu diria como é divertido. Os programadores tendem a ser pessoas que querem problemas resolvidos, portanto, uma linguagem de programação divertida para os programadores usarem será, inevitavelmente, a que resolverá a maioria dos problemas. Essa medida leva em consideração que diferentes pessoas têm diferentes preferências sobre como usar as coisas, então a “melhor” linguagem de programação será aquela que mais atraia a mais ampla gama 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, com o que o programador realmente interage.

6
Timwi

Você precisa definir melhor sua terminologia.

A integridade de Turing não tem a ver com "poder" no sentido que você provavelmente quer dizer. Em vez disso, é sobre computabilidade; ou seja, se uma dada linguagem pode expressar qualquer programa que pode ser implementado usando uma máquina de Turing. Acontece que quase todas as linguagens de programação são Turing completa.

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

EDITAR

Só para esclarecer, as linguagens de programação não têm uma propriedade conhecida como "poder". Existe um conceito comumente conhecido como "expressividade" ou "poder expressivo" de uma linguagem de programação. A expressividade diz respeito, em parte, à facilidade de escrever programas sucintos para resolver problemas específicos. Mas também existe uma medida considerável de quão fácil é ler e escrever os programas. É uma espécie de "beleza". Eu saberei quando vir, mas não me peça para definir.

A simples comparação da contagem de caracteres não dá uma medida adequada de expressividade. Caso contrário, você poderia tornar uma linguagem mais expressiva compactando o código-fonte ... e isso é um absurdo. Na verdade, não conheço nenhuma medida objetiva de expressividade e suspeito fortemente que não exista nenhuma. O que efetivamente torna a característica inútil e bastante desinteressante.

1
Stephen C

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 é manutenção, não desenvolvimento, uma medida melhor é a facilidade com que você pode ler e depurar o código, especialmente quando ele é escrito por alguém outro. As linguagens mais poderosas são as mais fáceis de ler e manter.

1
Mason Wheeler