Domanda

E 'possibile progettare qualcosa come Ruby o Clojure senza la perdita di prestazioni significative in molte situazioni rispetto a C / Java? Ha progettazione hardware giocano un ruolo?

Edit: Con significativa voglio dire in un ordine di grandezza, non solo dieci procent

Edit: Ho il sospetto che delnan è corretto con me significa linguaggi dinamici così ho cambiato il titolo

È stato utile?

Soluzione

Le prestazioni dipendono da molte cose. Naturalmente la semantica del linguaggio devono essere conservati anche se siamo compilarlo - non è possibile rimuovere la spedizione dinamica da Ruby, sarebbe accelerare le cose drmatically ma sarebbe totalmente rompere il 95% del tutto il codice Ruby in tutto il mondo. Ma ancora, la maggior parte delle prestazioni dipende da quanto intelligente è l'implementazione.

presumo, da "di alto livello", vuol dire "dinamico"? Haskell e OCaml sono estremamente di alto livello, ma si è compilato in modo nativo e possono sovraperformare C # o Java, anche C e C ++, in alcuni casi angolo - soprattutto se il parallelismo entra in gioco. E certamente non sono stati progettati per offrire prestazioni # 1 gol. Ma gli scrittori del compilatore, in particolare quelli focalizzati lingue onfunctional, sono un popolo molto intelligente. Se voi o ho iniziato un linguaggio di alto livello, anche se abbiamo usato per esempio LLVM come backend per la compilazione nativa, non avremmo avuto nessuna parte vicino a questa performance.

Fare linguaggi dinamici corrono veloci è più difficile - ritardano molte decisioni (tipi, membri di una classe / un oggetto, ...) a runtime invece di compiletime, e mentre l'analisi statica del codice a volte può dimostrare che non è possibile in linee n e m, si devono ancora svolgere un runtime avanzata intorno e fare un paio di cose bel compilatore di un linguaggio statico può fare a compiletime. Anche la spedizione dinamica può essere ottimizzato con un intelligente VM ( Inline Cache chiunque?), Ma è un molto lavoro. Più di un piccolo linguaggio nuovo fangeled potrebbe fare, ciò che è.

di Steve Yegge dinamici Lingue Strike Back .

E, naturalmente, ciò che è una notevole perdita peformance? 100 volte più lento di C si legge come un sacco, ma come tutti sappiamo, l'80% del tempo di esecuzione è trascorso in 20% del codice = 80% del codice non avrà notevole impatto sulle prestazioni percieved di tutto il programma. Per il restante 20%, si può sempre riscrivere in C o C ++ e chiamarlo dal linguaggio dinamico. Per molte applicazioni, ciò basta (per un po ', non è nemmeno necessario per ottimizzare). Per il resto ... beh, se le prestazioni sono critiche che, si dovrebbe propably scrive in un linguaggio progettato per le prestazioni.

Altri suggerimenti

Non confondere la progettazione del linguaggio con la piattaforma che può girare.

Per esempio, Java è un linguaggio di alto livello. Si corre sulla JVM (come fa Clojure - identificato in precedenza, e JRuby - una versione di Java di Ruby). La JVM eseguirà analisi byte-code e ottimizzare come il codice viene eseguito (facendo uso di analisi di fuga, compilatore just-in-time, ecc). Così la piattaforma ha un effetto sulle prestazioni che è in gran parte indipendente dal linguaggio stesso (vedi qui per maggiori informazioni sulle prestazioni e confronti Java per C / C ++)

Perdita rispetto a che cosa? Se avete bisogno di un garbage collector o chiusure allora ne avete bisogno, e si sta andando a pagare il prezzo a prescindere. Se una lingua li rende facile per voi per ottenere in, questo non significa che devi usare quando non hai bisogno di loro.

Se una lingua è interpretato invece compilato, che sta per introdurre un ordine di grandezza rallentamento. Ma tale linguaggio può avere un vantaggio di compensazione, come la facilità d'uso, indipendenza dalla piattaforma, e non dover compilare. E, i programmi che si scrivono in esse potrebbero non funzionare abbastanza a lungo per la velocità ad essere un problema.

Ci possono essere le implementazioni del linguaggio che introducono lentezza senza una buona ragione, ma quelli non devono essere utilizzati.

Si potrebbe desiderare di guardare a ciò che la DARPA HPCS iniziativa ha messo a punto. C'erano 3 linguaggi di programmazione proposti: Fortezza del Sole, X10 di IBM e la Cappella di Cray. Gli ultimi due sono ancora in fase di sviluppo. Se uno di questi si incontrano la tua definizione di di alto livello non so.

E sì, progettazione hardware fa certamente svolgere un ruolo. Tutti e 3 di queste lingue sono mirati al supercomputer con molti processori e presentare caratteristiche adeguate a quel dominio.

E 'certamente possibile. Ad esempio, Objective-C è un linguaggio dinamicamente tipizzato che ha prestazioni paragonabili a C ++ (anche se un pochino più lenta, in generale, ma ancora meno equivalente).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top