Delphi – C # – D
Delphi – Eiffel – Groovy
Java – Lisaac – Python – Ruby
Simula – SmallTalk
Visual Basic – WLANGUAGE

Lingue imperative

APL – ASP – Assembler (un assemblaggio di assemblaggio o un linguaggio assemblatore o semplicemente assemblatore per abuso di linguaggio, . ..)
BASE (nella programmazione, Basic è un acronimo per il codice di istruzioni simbolico al completo principiante. Chi …) – C (C ++ è un linguaggio di programmazione che consente la programmazione sotto più paradigmi …) – Cobol (Cobol è un linguaggio di programmazione di terza generazione creato nel 1959 …) – Natural (Natural è un linguaggio di programmazione semi-compilato, a cura della società …)
Forth – Fortran – Limbo
logo – Pascal – Perl – PHP (PHP (PHP Acronimo: Ipertext Preprocessore), è una lingua di SCR IPTS gratuiti principalmente …)

Lingue funzionali

Haskell – ml / ocaml
Lisp / Common Lisp (Lisp è la più antica famiglia di lingue imperativi e funzionali. Sviluppato …) Schema – Schema – XSLT

Lingue dichiarative

Clips – Prolog (Prolog è uno dei principali linguaggi di programmazione logica Inventato a …)

Lingue concorrenti

ADA 95 – ERLANG

Vedi anche

Design – codifica (generalmente una codifica consente di passare da una rappresentazione di …) Test – Test – Ottimizzazioni

in Programmazione del computer (Programmazione nel dominio del computer Sono tutte attività che consentono …), l’ottimizzazione è la pratica del tempo di riduzione del tempo (il tempo è un concetto sviluppato dall’essere umano per apprezzare l’esecuzione …) di una funzione, lo spazio occupato dai dati e dal programma, o Il consumo di energia (in senso comune l’energia significa tutto ciò che rende possibile eseguire un lavoro, fare …).

La regola numero uno (numero uno è un riferimento a un modello di caratteri fittizi del …) dell’ottimizzazione Dovrebbe intervenire solo una volta che il programma funziona e risponde alle specifiche funzionali. L’esperienza mostra che applicare ottime ottimizzazioni di codice prima che queste due condizioni vengano rese più spesso restituite a una perdita di tempo ed è dannosa per la chiarezza del codice e il corretto funzionamento del programma:

“Ottimizzazione prematura è la fonte di tutti Ils. “, Donald Knuth (Donald Ervin Knuth () (10 gennaio 1938 a Milwaukee, …) CITTING DIJKSTRA

Tuttavia questa citazione, troncata, è molto spesso interpretata erroneamente. La versione completa è:

” Dovremmo dimenticare le piccole ottimizzazioni locali, diciamo, il 97% delle volte: l’ottimizzazione prematura è la fonte di tutti i mali. (Dovremmo dimenticare (circa è un termine di carpenteria che designa la fine della forma …) piccola efficienza, diciamo 97% del tempo: l’ottimizzazione prematura è la radice di tutto il male.) “, Donald Knuth

La citazione originale indica molto chiaramente che questa regola dovrebbe applicarsi solo alle ottimizzazioni locali, a basso livello (riscrittura in Assembler, loop Lavorazione ecc.) E non ad ottimizzazioni di alto livello sulla scelta di algoritmi o architettura (l’architettura può essere definita come l’arte degli edifici edilizzi). Un progetto (un progetto è un progetto un impegno irreversibile di risultato incerto, non- riproducibile per …). Al contrario, più il progetto cresce e più queste ottimizzazioni di alto livello saranno difficili e costose (in termini di tempo, difficoltà e budget), se non impossibile, da eseguire.

Pratica dei compilatori più recenti automaticamente. (L’automatico fa parte delle scienze ingegneristiche. Questa disciplina si occupa del …) Un numero (la nozione del numero linguistico è considerata nell’articolo “numero …) delle ottimizzazioni sarebbe noioso per eseguire manualmente e quale renderebbe il codice sorgente (il codice sorgente (o fonti o fonti) è un insieme di istruzioni scritte in un …) meno leggibile.

Ottimizzazione Il manuale locale può essere necessario in casi molto specifici, ma il Le misurazioni mostrano che sulle macchine RISC che hanno un numero elevato di registri e in cui l’efficacia richiede il raggruppamento delle istruzioni identiche per beneficiare dell’effetto della pipeline, l’ottimizzatore di un compilatore (un compilatore è Un programma per computer che traduce una lingua, una lingua di origine, in uno …) C spesso fornisce un codice più efficace di quello scritto in Assembler da un programmatore (in Computer Science, Developer (o Programmer) è uno scienziato informatico che realizza software in …) esperto (che non è mai stato il caso delle macchine CISC).E da questo codice è molto più facile da mantenere, poiché le istruzioni C rimangono in un ordine relative all’unica intelligibilità del codice e non alle specificità della macchina: negli attuali ottimizzatori, effettivamente, le macchine degli ordini associate a un’istruzione ( Un’istruzione è una forma di informazione comunicata che è sia un comando che un …) non è più necessariamente nella posizione contigua, per motivi di efficienza di esecuzione. Questo rende il codice Assembler generato particolarmente indecorabile.

pratica dell’ottimizzazione

Primo approccio

Prima di iniziare l’ottimizzazione, è necessario sapere come misurare la velocità (distingueremo 🙂 codice. Per questo è necessario scegliere un parametro (un parametro è in senso ampio, una voce di informazioni da prendere in considerazione …), preferibilmente semplice, misurabile. Questo può, ad esempio, il tempo di elaborazione su un gioco di dati (in tecnologia dell’informazione (IT), un dato è una descrizione di base, spesso …) precisa o il numero di immagini visualizzate al secondo (secondo è il femminile del Secondo aggettivo, che viene immediatamente dopo il primo o quello …) o il numero di richieste elaborate al minuto (prima forma di un documento: DESTRA: un minuto è l’originale di “A …).

Una volta il parametro di misurazione misurato, devi misurare il tempo trascorso (il passato è prima di tutto un concetto relativo al tempo: consiste nel tutto…) In ogni parte del programma. Non è raro che l’80% al 90% del tempo è dedicato all’esecuzione del 10% del codice (loop critici). I numeri variano a seconda delle dimensioni e della complessità (la complessità è una nozione utilizzata nella filosofia, dell’epistemologia (da …) dei progetti. Dobbiamo individuare questi il 10% del codice per essere il più redditizio nelle sue ottimizzazioni. Questo passaggio di localizzazione può essere eseguiti utilizzando strumenti di strumentazione specializzati (la strumentazione della parola viene utilizzata in più domini 🙂 dei profili del codice denominati. Sono responsabili del conteggio del numero di esecuzioni di ciascuna funzione e dei cicli del microprocessore (un microprocessore è un processore i cui componenti sono stati sufficientemente …) corrispondente durante l’esecuzione.

Quindi fa parte della sezione di consumo più risorsa tutte le volte che è necessario questo loop:

  • ottimizzazione di una parte del Codice
  • Misurazione del guadagno delle prestazioni

Secondo approccio

Un programma:

  • al livello algoritmico ( L’algoritmo) può essere ottimizzato IQUE è tutte le regole e le tecniche che sono coinvolte …), scegliendo un algoritmo di bassa complessità (nel senso (significato (strategie per la senescenza negativa ingegnerizzata) è un progetto scientifico che mira a …) Matematica) e adattata Strutture dati,
  • A livello di linguaggio di sviluppo, ordinando le istruzioni e utilizzando le librerie disponibili,
  • utilizzando localmente un linguaggio di basso livello localmente (una lingua di basso livello è una lingua Richiede il programmatore di preoccuparsi dei concetti vicini …), che può essere la lingua C o, per le esigenze più critiche, il linguaggio dell ‘assembler.

Andiamo solo una volta il livello di ottimizzazione superiore Le possibilità di un livello sono state esaurite. L’uso di un linguaggio di basso livello nel complesso (in teoria dei set, un set denota intuitivamente una collezione …) di un progetto per motivi di velocità è uno degli errori più comuni e più costoso che fare un progetto industriale .

Ottimizzazione del codice (nella programmazione del computer, l’ottimizzazione è la pratica che generalmente consiste …) è considerata da molti sviluppatori amatoriali come un’arte un non magico e, per questo motivo, come uno dei più eccitanti Parti della programmazione (la programmazione nel campo del computer è tutte le attività che consentono …). Questo li porta a credere che un buon programmatore sia una persona che ottimizza immediatamente il programma. Tuttavia, l’esperienza mostra che non può piegare un brutto design iniziale. È nel design che l’esperienza dello sviluppatore gioca (la guancia è la parte del viso che copre la cavità orale, chiusa dal …) di più. Inoltre, in una maggioranza e nel numero crescente di casi, il “buon programmatore” è meno colui che scrive il codice intelligente (l’ottimizzatore farà molto meglio di lui) rispetto al codice scritto scritto e facile da mantenere.

Una buona conoscenza delle tecniche strutturali dei dati e gli algoritmi (anche senza andare alle considerazioni teoriche della complessità algoritmica) è molto più fertile di quello di un linguaggio di assemblaggio.Quando è stato determinato l’algoritmo più appropriato, le ottimizzazioni più efficaci possono essere ottenute utilizzando il seguente percorso:

  • codice critico scrivendo in un linguaggio di alto livello (una lingua di alto livello in informatica è Un linguaggio di programmazione che consente al programmatore …) (come schema o Lisp comune),
  • Applicazione delle trasformazioni matematiche (la matematica è un’area della conoscenza astratta costruita utilizzando utilizzando …) il successivo che conservare la specifica del programma tutto (tutto compreso come un insieme di ciò che esiste è spesso interpretato come il mondo o …) riducendo il consumo di risorse,
  • traduzione del codice trasformato in un linguaggio di basso livello (linguaggio C).

In pratica, le prestazioni delle macchine correnti fanno che le applicazioni con un sacco di uscite di uscita lenti possono salvare questi tre passaggi e scrivere direttamente in Una lingua come Haskell. La nota applicazione nget, che ha sistematicamente raccolto le immagini pubblicate nei forum dell’Usenet, ha avuto nella sua prima implementazione (l’impianto di parola può avere diversi significati 🙂 estate scritta a Haskell. La versione C era solo una traduzione che non rivela più efficiente per questo tipo di applicazione. Un’applicazione limitata principalmente dalla CPU e dalla velocità della memoria (in generale, la memoria è la memoria delle informazioni. È anche la memoria …) per contro può ottenere molto da scrivere in una lingua come c o C ++.

Ottimizzazione automatica

I compilatori sono spesso in grado di effettuare ottimizzazioni locali, a cui nessun sviluppatore penserebbe nel primo approccio.

per la lingua C, Questo può considerare:

  • Variabili e registri locali
  • Le funzioni non implementate in Assembler come funzione
  • L’interruttore, che è ottimale.

Tuttavia, il compilatore può aiutare notevolmente dichiarare le variabili con le parole chiave con cost e / o limitare quando possibile. Altrimenti il compilatore non può sapere se un’area di memoria è accessibile da altri riferimenti e disabilita le ottimizzazioni (fenomeno chiamato aliasing di memoria).

Esempi

Uso delle variabili locali per evitare aliasing di memoria

Il successivo codice C ++ sarà generalmente piccolo ottimizzato dal compilatore perché spesso non è in grado di sapere se il codice del ciclo modifica o non il contatore di iterazione: un puntatore o un riferimento potrebbe modificarlo.

 void MyClass::DoSomething() const { for( int i=0; im_nbrElements; ++i ) { void *ptr = GetSomePtr(); .... } } 

In questa versione, è chiaro che c’è un numero di iterazioni fissate in anticipo e che non cambierà mai, consentendo al compilatore di rendere più aggressivo Ottimizzazioni:

 void MyClass::DoSomething() { const int nbrElements = m_nbrElements; for( int i=0; inbrElements; ++i ) { .... } } 

Una specificità del binario: l’offset

Una di tutte le prime ottimizzazioni era quella della divisione (la divisione è Una legge di composizione che a due numeri associa il prodotto del primo da …) e il moltiplica (La moltiplicazione è una delle quattro operazioni dell’aritmetico elementare …) con un potere (la parola di potenza viene utilizzata in diversi domini con un significato particolare 🙂 di 2.

Infatti, computer (informatica – Contrazione di informazioni e automatiche – è l’estensione del …) Si basa sul binario, dal momento che utilizza come elemento base il transistor (e storicamente, prima del relè) che n. autorizza che due valori diversi.

Così abbiamo logicamente implementato nel linguaggio della macchina (il linguaggio della macchina è la sequenza di bit interpretati dal processore del computer …) le operazioni offset a sinistra e spostamento a destra.

Infatti, in binario, l’offset di un numero di una tacca a sinistra si moltiplica di 2.

SO, 2 (102) Offset di 1 bit Dare 4 (1002). (1012) Lo spostamento di 2 bit dà 20 (101002): 5 * 22 = 20.

Queste opere (camminare (a piedi (il pleonasmo a piedi è spesso usato spesso) è un …) anche per la divisione, spostando I bit a destra.

100 (11001002) spostati da 3 bit a destra dà 100/23 = 12.5 SO 12 (11002) perché lavoriamo su interi.

La divisione (al di fuori di questo caso e custodie patologiche) è un’istruzione costosa nella macchina del tempo e non è ancora disponibile sulla stragrande maggioranza dei processori RISC.

La parola chiave (nel senso pulito, La chiave o la chiave (le due ortografie sono corrette) è un dispositivo rimovibile …) Inline C

Codice C successivo:

 inline int f(int a, int b) { return a * b; } int g (int a) { switch (a) { case 10: return f(a, a); case 11: case 12: return f(a - 2, a); case 1200: return f(a - 2, a); default: return f(a, a); } } 

Una compilation con GCC -O4 -S dà:

 .file "opt.c" .text .p2align 4,,15 .globl g .type g, @function g: pushl %ebp movl %esp, %ebp movl 8(%ebp), %edx cmpl $12, %edx jg .L14 leal -2(%edx), %eax cmpl $11, %edx jge .L15 movl $100, %eax cmpl $10, %edx .L17: je .L2 movl %edx, %eax .L15: imull %edx, %eax .L2: popl %ebp ret .p2align 4,,7 .L14: movl $1437600, %eax cmpl $1200, %edx jmp .L17 .size g, .-g .section .note.GNU-stack,"",@progbits .ident "GCC: (GNU) 3.3.2 (Mandrake Linux (Au sens strict, Linux est le nom du noyau de système d'exploitation libre, multitâche,...) 10.0 3.3.2-6mdk)" 

Cosa potrebbe tradurre, per una migliore comprensione, dal seguente codice C:

 int g(int a) { int eax, b; if (a > 12) /* cas a == 1200 */ goto (L’instruction goto (de l’anglais go to, en français aller à) est une...) L14; eax = a - 2; if (a >= 11) /* cas a == 11 ou a == 12 */ goto L15; eax=100; /* = 10 * 10 */ b=10; L17: if (a == b) /* cas a == 10 */ goto L2; /* cas "default" */ eax=a; L15: eax=eax*a; L2: return eax; L14: eax = 1437600; /* = 1200*(1200-2) */ b = 1200; goto L17; } 

Può essere notato Ad esempio che la funzione “F” non è stata generata, ma che il suo codice è stato direttamente incorporato nel “G” (la parola chiave “inline” consente di forzare questo tipo di ottimizzazione C)

Questo articolo ti ha soddisfatto? Condividilo sui social network con i tuoi amici!

Leave a comment

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *