A resposta curta é: não sabemos , pergunte novamente em 100 anos. (Ainda podemos não saber então; possivelmente nunca saberemos.)
Em teoria, isso é possível. Pegue todos os programas já escritos, traduza-os manualmente para o código de máquina mais eficiente possível e escreva um intérprete que mapeie os códigos-fonte para os códigos de máquina. Isso é possível, pois apenas um número finito de programas já foi gravado (e, à medida que mais programas são gravados, mantenha as traduções manuais). Isso também é, obviamente, completamente idiota em termos práticos.
Por outro lado, teoricamente, linguagens de alto nível podem conseguir o desempenho do código de máquina, mas não o superam. Isso ainda é muito teórico, porque, em termos práticos, raramente recorremos à escrita de código de máquina. Esse argumento não se aplica à comparação de linguagens de nível superior: não implica que C deva ser mais eficiente que Python, apenas esse código de máquina não pode ser pior que Python.
Vindo do outro lado, em termos puramente experimentais, podemos ver que na maioria das vezes , as linguagens de alto nível interpretadas apresentam desempenho pior do que as linguagens de baixo nível compiladas. Tendemos a escrever código não sensível ao tempo em linguagens de alto nível e loops internos críticos no assembly, com linguagens como C e Python entrando no meio. Embora eu não tenha nenhuma estatística para apoiar isso, acho que essa é realmente a melhor decisão na maioria dos casos.
No entanto, existem instâncias incontestadas em que linguagens de alto nível superam o código que seria gravado realisticamente: ambientes de programação para fins especiais. Programas como Matlab e Mathematica costumam ser muito melhores na solução de certos tipos de problemas matemáticos do que o que meros mortais podem escrever. As funções da biblioteca podem ter sido escritas em C ou C ++ (que é um combustível para o campo “linguagens de baixo nível são mais eficientes”), mas isso não é da minha conta se estou escrevendo código do Mathematica, a biblioteca é uma caixa preta.
É teoricamente possível que o Python se aproxime, ou talvez até mais, do desempenho ideal que o C? Como visto acima, sim, mas estamos muito longe disso hoje. Por outro lado, os compiladores fizeram muito progresso nas últimas décadas, e esse progresso não está diminuindo.
Linguagens de alto nível tendem a automatizar mais as coisas, por isso têm mais trabalho a executar e, portanto, tendem a ser menos eficientes. Por outro lado, eles tendem a ter mais informações semânticas, portanto, pode ser mais fácil detectar otimizações (se você estiver escrevendo um compilador Haskell, não precisa se preocupar que outro segmento modifique uma variável sob o seu nariz). Um dos vários esforços para comparar diferentes linguagens de programação de maçãs e laranjas é o Computer Benchmark Game (anteriormente conhecido como shootout). Fortran tende a brilhar em tarefas numéricas; mas quando se trata de manipular dados estruturados ou comutação de encadeamento de alta taxa, F # e Scala se saem bem. Não tome esses resultados como evangelho: muito do que eles estão medindo é quão bom o autor do programa de testes em cada idioma foi.
Um argumento a favor de linguagens de alto nível é que o desempenho em sistemas modernos não está tão fortemente correlacionado com o número de instruções executadas, e menos com o tempo. Linguagens de baixo nível são boas correspondências para máquinas sequenciais simples. Se um idioma de alto nível executar duas vezes mais instruções, mas conseguir usar o cache de maneira mais inteligente, de maneira que ele faça a metade do número de erros de cache, poderá ser o vencedor.
Nas plataformas de servidor e desktop, as CPUs quase atingiram um platô em que não ficam mais rápidas (as plataformas móveis também estão chegando lá); isso favorece linguagens em que o paralelismo é fácil de explorar. Muitos processadores passam a maior parte do tempo aguardando uma resposta de E / S; o tempo gasto em computação é pouco comparado com a quantidade de E / S, e uma linguagem que permite ao programador minimizar as comunicações é uma vantagem.
Em suma, enquanto os idiomas de alto nível começam com uma penalidade, eles têm mais espaço para melhorias. Quão perto eles podem chegar? Pergunte novamente em 100 anos.
Nota final: frequentemente, a comparação não é entre o programa mais eficiente que pode ser escrito na língua A e o mesmo na linguagem B, nem entre o programa mais eficiente já escrito em cada idioma, mas entre o programa mais eficiente que pode ser escrito por um ser humano em um determinado período de tempo em cada idioma. Isso introduz um elemento que não pode ser analisado matematicamente, mesmo em princípio. Em termos práticos, isso geralmente significa que o melhor desempenho é um compromisso entre quanto código de baixo nível você precisa escrever para atingir as metas de desempenho e quanto código de baixo nível você tem tempo para escrever para cumprir as datas de lançamento.