Poder expressivo é definido pela Wikipedia como:
.. a amplitude de idéias que podem ser representadas e comunicadas nesse idioma.
"Idéias" se referem às coisas (operações, estruturas, algoritmos, etc.?) Que podemos comunicar à máquina ? Ou refere-se aos conceitos "humanos" que podem ser capturados e comunicados com a linguagem a outros humanos?
Como o poder expressivo é avaliado e medido?
Por exemplo, se adotássemos uma linguagem como JavaScript e impuséssemos uma restrição estranha nos nomes de variáveis, como variável/^_[0-9]{8}$/
, esse número deveria ser um número de 8 dígitos, precedido por um sublinhado, correspondente , perderíamos poder expressivo?
Ou isso seria apenas absurdo e irritante?
Esclarecer:
O poder expressivo é medido pelas idéias gerais inerentes à linguagem:
- números inteiros e seqüências de caracteres
- rotações
- condicionais
Ou o número de idéias específicas e únicas que o idioma pode representar:
- os inteiros 1, 2 ... 2 ^ 32
- strings contendo "o que a raposa diz?" e "o que pah pah pah pah pah pow"
- para cada sapo na minha coleção de sapos
- se sapo é verde ou algo assim, faça algo
fonte
Respostas:
O artigo de referência sobre expressividade é Sobre o poder expressivo das linguagens de programação de Matthias Felleisen (1991) . Ele contém uma definição matematicamente rigorosa de expressividade da linguagem.
Intuitivamente, se todo programa que pode ser escrito no idioma A também puder ser escrito no idioma B com apenas transformações locais, mas existem alguns programas escritos no idioma B que não podem ser escritos no idioma A sem alterar sua estrutura global (ou seja, não apenas com puramente transformações locais), então a linguagem B é mais expressiva do que a linguagem A .
Uma boa propriedade dessa definição é que ela admite a possibilidade de que existem pares de idiomas em que existem programas em X que não podem ser expressos em Y e programas em Y que não podem ser expressos em X e, portanto, os idiomas são distintos, mas nenhum a linguagem é mais expressiva que a outra. Isso se encaixa bem com a nossa experiência no mundo real de que existem algumas línguas que são boas em algumas coisas e outras que são boas em outras coisas, e nem geralmente é "melhor" que o outro.
fonte
Point
s usando uma matriz de matrizes 2D. Porém, A tem a vantagem de me deixar expressar aPoint
como um conceito mais legível por humanos. A é mais expressivo?map
,filter
, primeira classe tipos / métodos / funções, talvez um poucoeval
, deixe a magia sozinho metaclass ou tipos criados dinamicamente etc.Vamos reler essa página. Uma das primeiras coisas a se notar é que diz "linguagem", não "linguagem de programação", e a maioria de seus exemplos não são linguagens de programação, por exemplo, o primeiro exemplo dado é uma comparação de OWL2 EL e OWL2 RL, que são ontologia línguas.
Pode-se aplicar o conceito às linguagens de programação, mas também aos idiomas de correspondência de padrões, linguagens de marcação, linguagens de consulta, idiomas da folha de estilo visual, expressões regulares (e todas as linguagens regulares a que se referem) e assim por diante. Pode-se até se referir ao poder expressivo de idiomas naturais como o inglês, que geralmente é feito de maneira informal, mas com mais seriedade ao considerar os problemas relacionados ao processamento de idiomas naturais.
Refere-se ao que pode ser expresso nessa linguagem, considerado puramente uma coisa em si.
Por exemplo, (usarei o javascript em todos os meus exemplos, porque sua pergunta indica que é um dos idiomas que você conhece) considere a instrução javascript:
Isso representa que a soma dos valores 3 e 4 é calculada e o valor associado a um rótulo
x
dentro de um determinado escopo de espaço para nome.Se destruíssemos todos os computadores do mundo e escrevêssemos esse código em um pedaço de papel, continuaria sendo que, em javascript, ele ainda teria o mesmo significado; não poderíamos executar esse código em nada, mas a definição abstrata da linguagem ainda é algo que poderíamos falar.
Isso pode parecer pedante, mas é realmente muito importante que as línguas sejam coisas que possam ser discutidas em abstrato sem considerar computadores reais. Por um lado, as pessoas que raciocinam sobre pontos teóricos das linguagens de computador que ainda não eram viáveis na prática são uma das coisas que nos levaram aonde estamos hoje; os computadores precisam de ciência da computação, mas a ciência da computação não precisa de computadores, apenas a idéia de uma computação.
Obviamente, usamos computadores no mundo real e hoje em dia muitas pessoas os usam na prática, em vez de alguns especialistas discutindo-os em teoria. A página à qual você vinculou diz:
Desses dois usos do termo, o impacto prático do primeiro diz respeito apenas ao que pode ser transmitido ao computador.
O segundo refere-se mais à compreensão humana tanto na leitura quanto na escrita, embora o grau em que faz isso difira muito entre os usos, uma vez que são informais e, como tal, não são rigidamente definidos.
Pela definição formal, não perdemos poder expressivo: estamos restritos a 100.000.000 de variáveis, mas se realmente precisássemos contornar isso, criando objetos para armazenar mais variáveis dentro do namespace recém-criado. Como tal, qualquer programa escrito em javascript hoje pode ser reescrito nesta nova forma, sendo igualmente expressivo.
Pela definição informal, perdemos um pouco, mas o quanto depende de quão informal estamos sendo, o que variará porque, novamente, você não pode dizer qual é "a regra" sobre o uso informal. Podemos dizer que perdemos uma pequena quantia, porque programas com mais de 100.000.000 de variáveis no mesmo espaço para nome precisam ser reescritos além de uma simples substituição. Um uso ainda mais informal novamente se referiria ao impacto mental de nomes tão desajeitadamente variáveis sobre a abrangência humana.
Também vale a pena notar que as pessoas considerarão informalmente coisas que não fazem parte estritamente da linguagem. Considere as alterações no Javascript desde a sua criação até hoje.
Pela definição mais formal, houve expressividade bastante inalterada; afinal, Turing estava completo.
Por uma definição mais informal, tornou-se consideravelmente mais expressivo em certas coisas, como manipulação de array, manipulação de exceções e (talvez acima de tudo) na inclusão de expressões regulares. Eles não fazem nada que não pudesse ser feito em javascript antes, embora possam fazer algo em poucas linhas e um tempo de execução de subsegundos que levaria kilobytes de código para escrever em javascript1.0 e demoraria muito tempo para ser executado.
Por uma definição muito mais informal novamente, a alteração do primeiro uso do javascript nos navegadores (capaz de alterar os valores das entradas do formulário,
document.write
enquanto a página está sendo analisada pela primeira vez e movida para um novo local ou para voltar ou avançar na história, mas bastante muito mais nada hoje em dia (capaz de mudar praticamente qualquer coisa na página, inclusive com base nos dados das chamadas do servidor) é absolutamente imenso, embora a maioria não esteja relacionada ao javascript, mas aos modelos de objetos e APIs criados disponível, em vez do idioma (por exemplo, o vbscript no IE se beneficiou dessas alterações igualmente).Na minha opinião, esse último uso é tão informal que não está realmente correto, mas esse é o problema das definições informais.
Pela definição formal, realmente não se tornou mais expressivo.
fonte
fishies
do tipoFish
.Eu não acho que as regras de nomeação de variáveis realmente capturam o que se entende por "expressividade". Eu acho que "expressividade" se refere a coisas mais fundamentais. Considere C # com Linq versus C # antes de Linq, por exemplo. Após a adição do Linq, tornou-se possível escrever consultas semelhantes a SQL diretamente no C #. Isso é muito mais elegante do que as alternativas anteriores, por exemplo, colocar SQL em literais de string e depois passá-lo para o servidor ou iterar sobre uma coleção usando "for".
Outro bom exemplo pode ser a linguagem com herança baseada em protótipo. Nessas linguagens, é possível simplesmente adicionar novos métodos a uma instância ou mesmo a uma classe (por qualquer nome que uma "classe" possa ter em um determinado idioma ...) em tempo de execução. Você realmente não pode fazer isso em C ++ ou C #. Eles não têm esse grau de expressividade em comparação com as linguagens baseadas em protótipos. (O C # tem o conceito de métodos de extensão, e certamente se pode dizer que estes acrescentam expressividade.)
fonte
Conforme mencionado no artigo da Wikipedia, poder expressivo refere-se ao conjunto de programas que podem ser expressos no idioma. Tudo o que você considera uma "linguagem de programação" (JavaScript, LISP, C #, Perl etc.) é essencialmente Turing completo, o que significa que eles podem expressar qualquer coisa que se diga "computável".
No entanto, deve ficar bem claro que expressões regulares não são tão expressivas quanto a linguagem de programação regular. Além disso, os curingas de shell são um pouco menos expressivos que as expressões regulares.
Uma versão do SQL com expressões de tabela comuns é mais expressiva do que uma versão sem, porque os CTEs permitem representar consultas recursivas que, de outra forma, seriam impossíveis de serem expressas no SQL.
fonte
Existe uma maneira mais simples e direta de entender o poder expressivo, mas primeiro precisamos estabelecer o que entendemos por idiomas. Existem duas disciplinas que estudam idiomas: lingüística e autômato. Ambos concordariam que a linguagem é um conjunto de palavras (seqüências finitas) construídas a partir de algum alfabeto finito usando concatenação. Tipicamente, linguagens interessantes (por interessante, quero dizer aquelas linguagens que podemos interpretar de uma maneira útil) também têm um conjunto de regras que governam quais palavras estão na linguagem e quais não. Observe que a expressividade só pode existir quando houver interpretação.
Por interpretação, quero dizer a existência de uma função que, dada uma palavra em uma linguagem, seleciona um objeto de algum conjunto de objetos (isso é obviamente discutível para linguagens naturais).
Não se deixe enganar pelo uso de "palavra". Um programa Java é uma palavra na linguagem Java (embora possa abranger vários arquivos contendo várias cadeias de caracteres separadas por espaços).
Seria contraproducente usar linguagens complicadas como as linguagens de programação modernas para lidar com esse conceito relativamente simples; é por isso que prefiro usar fórmulas matemáticas.
Vamos definir o idioma A para todas as fórmulas que envolvem adição de número inteiro.
Vamos definir o idioma B como o idioma de todas as fórmulas envolvendo multiplicação de números inteiros.
Nos dois casos, proibimos o uso do elemento de identidade. Assim, o idioma A contém as palavras "1 + 1", "1 + 2", "1 + 3", "2 + 3" e assim por diante. O idioma B contém as palavras "2 * 2", "2 * 3", "2 * 4", "3 * 4" e assim por diante. Também atribuímos interpretações usuais a "*" e "+" (adição e multiplicação de números inteiros) aos respectivos símbolos. Portanto, a interpretação de "1 + 1" é 2 e a interpretação de "2 * 2" é 4.
Observe agora que a linguagem A é estritamente mais expressiva que a linguagem B, pois em números inteiros é verdade que a multiplicação pode ser convertida como adição repetida, mas não há como representar adição como multiplicação em geral.
Para resumir: a linguagem A pode ser considerada mais expressiva que a linguagem B quando suas funções de interpretação compartilham co-domínio, mas a imagem da função de interpretação de B é um subconjunto apropriado da imagem da função de interpretação de A.
fonte
TLDR: se um recurso estiver ausente, mas puder ser expresso de outras maneiras, não haverá falta de expressividade. Se você pode imaginar um algoritmo em sua mente ou mesmo implementá-lo em um idioma, mas outro idioma é de alguma forma estruturado de uma maneira que impossibilita a implementação do algoritmo, é um problema de expressividade *.
As restrições de nomenclatura variável não reduzem a expressividade (a menos que haja tão poucos nomes que não seja possível expressar mais todos os algoritmos e nem falsificar variáveis com algo como matrizes + índices).
Um exemplo simples de falta de poder expressivo é o seguinte: você precisa
do_homework
ebring_down_trash
. Isso é facilmente escrito no código:Essa solução parece bem direta, mas na verdade
do_homework
ebring_down_trash
não é ordenada, também se pode escrever:O que é igualmente impreciso porque não expressa que não tínhamos a intenção de fazer cumprir uma ordem. Também não queremos usar threads. Queremos dizer algo assim:
Tanto quanto sei, isso é muito difícil de se expressar em qualquer linguagem de programação.
Um exemplo que me incomoda sem fim é que é impossível em Java ter uma matriz de objetos. Você pode fazer uma série de ponteiros para objetos, mas que não tenham o mesmo layout de memória (eficiência de fala).
Tomando um exemplo de outra resposta : C ++ não oferece suporte à adição de métodos a uma classe ou instância . Isso é verdade, no entanto, não limita a expressividade do C ++.
Esta é uma classe à qual você pode adicionar, remover e chamar um número arbitrário de funções-membro para instâncias e a classe. Tecnicamente, o C ++ é provavelmente mais expressivo nesse aspecto do que as linguagens de programação que realmente oferecem suporte a esse recurso, pois no C ++ você pode escolher como armazenar as funções (vetor versus array vs forward_list).
* Alguns idiomas têm uma falta de expressividade como um recurso. Normalmente, eles tornam impossível escrever loops infinitos. Isso pode resolver o problema da parada e permitir provas automáticas de correção.
fonte