Sebbene non affrontino direttamente la domanda che hai posto, potresti trovare Benchmark di Stepanov alquanto interessante. Si occupa solo di una singola lingua (C ++) e della programmazione con diversi livelli di astrazione all'interno di quella lingua. Immagino che i livelli più alti di astrazione si adattino meglio alla tua idea di "praticamente espressivo".
Definisce i livelli da 0 a 12, a partire da un codice essenzialmente simile a C che utilizza loop scritti a mano che operano su puntatori e progredisce verso algoritmi pre-scritti che operano su iteratori, ecc.)
Un tempo, era comune vedere le penalità dell'ordine di 2: 1 (a volte anche di più) per i livelli più alti di astrazione, anche se era attentamente progettato in modo che un compilatore avrebbe dovuto essere in grado di produrre lo stesso output per tutti i casi.
Con la maggior parte dei compilatori moderni, è esattamente quello che ottieni. È necessario aumentare il numero di iterazioni per ottenere risultati significativi (ad esempio, cambiando ::iterations
da 25000 a 500000). Con questo cambiamento e un moderno compilatore con l'ottimizzazione abilitata, puoi praticamente contare su un rapporto di 1.0 per ogni livello di astrazione che definisce. A seconda della fortuna, potresti persino vedere i livelli di astrazione più alti che eseguono minuziosamente più veloci di quelli inferiori (l'ho visto, anche se sono abbastanza sicuro che non fosse significativo). / p>
Anche se questo non affronta direttamente la questione di una lingua piuttosto che un'altra, fa intuire l'idea che l'espressività non ha per portare una penalità. Allo stesso tempo, probabilmente vale la pena di aggiungere che anche il codice più astratto in questo benchmark è abbastanza prolisso rispetto a, per esempio, Perl.