Poder expressivo é definido pela Wikipedia como:
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.
"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?
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:
var x = 3 + 4;
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:
O termo poder expressivo pode ser usado com uma gama de significados. Pode significar uma medida das idéias expressáveis nesse idioma:
O primeiro sentido domina em áreas da matemática e da lógica que lidam com a descrição formal das línguas e seu significado, como teoria da linguagem formal, lógica matemática e álgebra de processos.
Nas discussões informais, o termo geralmente se refere ao segundo sentido, ou a ambos. Esse é geralmente o caso ao discutir linguagens de programação. Foram feitos esforços para formalizar esses usos informais do termo
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.
Por exemplo, se adotássemos uma linguagem como JavaScript e impuséssemos uma restrição estranha nos nomes de variáveis, como variável, seria um número de 8 dígitos precedido por um sublinhado, correspondente /^_[0-9]{8}$/
, perderíamos poder expressivo?
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.