Delphi – C # – D
Delphi – Eiffel – Groovy
Java – Lisaac – Python – Ruby
Simula – Smalltalk
Visual Basic – WLanguage

Idiomes imperatius

APL – ASP – assemblador (un muntatge de muntatge o un llenguatge assemblador o simplement muntador per abús de llenguatge, . ..)

Bàsic (en programació, bàsic és un acrònim del codi d’instrucció simbòlica de propòsit de principiants. Qui …) – C (C ++ és un llenguatge de programació que permet programar sota múltiples paradigmes …) – COBOL (COBOL és un llenguatge de programació de tercera generació creat el 1959 …) – Natural (natural és un llenguatge de programació semi-compilat, editat per l’empresa …)
Forth – Fortran – Limb> Logotip – Pascal – Perl – PHP (PHP (Acrònim PHP: hipertext preprocessador), és un llenguatge de SCR Lliure d’IPT principalment …)

Idiomes funcionals

Haskell – ml / ocaml
Lisp / Common Lisp (Lisp és la família més antiga de Impertius de llengües i funcionals. Desenvolupat …)
esquema – XSLT

Idiomes declaratius

Clips – Prolog (Prolog és un dels principals llenguatges de programació lògica inventat a …)

Idiomes de competidors

Ada 95 – Erlang

Vegeu també

Disseny – Codificació (generalment una codificació us permet canviar d’una representació de …)
Proves – Optimitzacions

En programació informàtica (programació al domini de l’ordinador Totes les activitats que permeten …), l’optimització és la pràctica de la reducció del temps (el temps és un concepte desenvolupat per l’ésser humà per capturar …) l’execució d’una funció, l’espai ocupat per les dades i el programa, o El consum d’energia (en sentit comú l’energia significa tot el que permet realitzar una feina, fer …).

La regla número u (número u és una referència a un model de caràcters ficticis de la …) d’optimització Només hauria d’intervenir un cop el programa funciona i respon a les especificacions funcionals. L’experiència demostra que aplicar optimitzacions de codi baix abans que aquestes dues condicions es tornin més sovint a una pèrdua de temps i sigui perjudicial per a la claredat del codi i el bon funcionament del programa:

“L’optimització prematura és la font de tots ILLS. “, Donald Knuth (Donald Ernuth () (10 de gener de 1938 a Milwaukee, …) Citting Dijkstra

No obstant això, aquesta cita, truncada, és molt mal interpretat. La versió completa que és:

” Hem d’oblidar les petites optimitzacions locals, per exemple, el 97% de l’època: l’optimització prematura és la font de tots els mals. (Hem d’oblidar-nos de (sobre és un terme de fusteria que designa el final de la moda …) petita eficiència, per exemple 97% de l’època: l’optimització prematura és l’arrel de tot el mal.) “, Donald knuth

La cita original indica molt clar que aquesta regla només hauria d’aplicar-se a les optimitzacions locals, al nivell baix (reescriptura) Assembler, de bucle desenrotllament, etc.) i no optimitzacions d’alt nivell sobre l’elecció d’algoritmes o arquitectura (l’arquitectura es pot definir com l’art dels edificis de la construcció.) Un projecte (un projecte és un projecte compromís irreversible del resultat incert, no) reproduïble a …). Al contrari, més el projecte creix i més aquestes optimitzacions d’alt nivell seran difícils i costoses (en termes de temps, dificultat i pressupost), si no impossible, realitzar.

Pràctica de compiladors més recents Automàticament (l’automàtica forma part de les ciències de l’enginyeria. Aquesta disciplina tracta de la …) un nombre (la noció de nombre lingüístic és tractat en l’article “El número”) de les optimitzacions seria tediós per realitzar manualment i que Faria el codi font (el codi font (o fonts o fonts) és un conjunt d’instruccions escrites en un …) menys llegible.

El manual local d’optimització pot ser necessari en casos molt específics, però el Les mesures mostren que a les màquines RISC que tenen un gran nombre de registres i on l’eficàcia requereix l’agrupació de les instruccions idèntiques per beneficiar-se de l’efecte de canonades, l’optimitzador d’un compilador (un compilador és Un programa informàtic que tradueix un llenguatge, idioma d’origen, en un …) C sovint proporciona un codi més eficaç que el que l’escrit en assemblador per un programador (en informàtica, desenvolupador (o programador) és un informàtic que realitza el programari a …) experimentat (que mai va ser el cas de les màquines CISC).I des d’aquest codi és molt més fàcil de mantenir, ja que les instruccions C es mantenen en un ordre relacionat amb l’única intel·ligibilitat del codi i no a les especificitats de la màquina: en els optimitzadors actuals, de fet, les màquines de comandes associades a una instrucció ( Una instrucció és una forma d’informació comunicada que és un ordre i un …) ja no són necessàriament en la posició contigua, per motius d’eficiència d’execució. Això fa que el codi assemblador generi especialment indecopable.

Pràctica d’optimització

Primera aproximació

Abans de començar l’optimització, cal saber com mesurar la velocitat (distingim 🙂 Codi. Per això, heu de triar un paràmetre (un paràmetre està en sentit ampli un element d’informació que cal tenir en compte …), preferiblement simple, mesurables. Això pot, per exemple, el temps de processament en un joc de dades (en tecnologia de la informació (IT), les dades són una descripció bàsica, sovint …) precisa, o el nombre d’imatges que es mostren per segon (el segon és el femení de la Segon adjectiu, que ve immediatament després del primer o qui …), o el nombre de sol·licituds processades per minut (primera forma d’un document: correcte: un minut és l’original de ‘a …).

Un cop el paràmetre mesurable, has de mesurar el temps dedicat (el passat és el primer de tot un concepte relacionat amb el temps: consisteix en el conjunt)..) A cada part del programa. No és estrany per al 80% al 90% del temps es dedica a l’execució del 10% del codi (bucles crítics). Els números varien en funció de la mida i la complexitat (la complexitat és una noció utilitzada en la filosofia, epistemologia (per …) de projectes. Hem de localitzar aquests 10% del codi per ser el més rendible en les seves optimitzacions. Aquest pas de localització pot Fer utilitzar eines d’instrumentació especialitzades (la instrumentació de paraules s’utilitza en diversos dominis 🙂 dels perfils de codi anomenat. Són responsables de comptar el nombre d’execucions de cada funció i cicles del microprocessador (un microprocessador és un processador que ha estat components Suficientment …) corresponent durant l’execució.

Llavors és part de la secció de consumidors més recursos tantes vegades com sigui necessari aquest bucle:

  • optimització d’una part de la pàgina Codi
  • Mesura de rendiment guany

Segon enfocament

Un programa:

  • al nivell algorítmic ( l’algorisme) es pot optimitzar Ique és totes les normes i tècniques que participen …), escollint un algorisme de menor complexitat (en el sentit (significat (estratègies de la senescència negible en enginyeria) és un projecte científic que té com a objectiu …) Matemàtiques) i adaptat Estructures de dades,
  • a nivell de llenguatge de desenvolupament, demanant les instruccions i utilitzant biblioteques disponibles,
  • utilitzant localment un llenguatge de nivell baix (un llenguatge de baix nivell és un llenguatge que Requereix que el programador es preocupi dels conceptes propers …), que pot ser la llengua C o, per a les necessitats més crítiques, la llengua assembladora.

Només anem al nivell d’optimització superior una vegada Les possibilitats d’un nivell s’ha esgotat. L’ús d’un llenguatge de baix nivell en general (en teoria dels conjunts, un conjunt denota intuïtivament una col·lecció …) d’un projecte per raons de velocitat és un dels errors més habituals i els més cars que fer un projecte industrial .

Optimització de codis (en programació informàtica, l’optimització és la pràctica que en general consisteix …) és considerada per molts desenvolupadors aficionats com un art a no màgic i, per aquest motiu, com un dels més emocionants Parts de programació (programació al camp de l’ordinador són totes les activitats que permeten …). Això els porta a creure que un bon programador és una persona que optimitza immediatament el programa. No obstant això, l’experiència demostra que no pot doblegar un disseny inicial dolent. És en el disseny que l’experiència del desenvolupador juga (la galta és la part de la cara que cobreix la cavitat oral, tancada per la …) la majoria. A més, en major i creixent nombre de casos, el “bon programador” és menys el que escriu el codi intel·ligent (l’optimitzador farà més sovint que ell) que el codi escrit escrit i fàcil de mantenir.

Un bon coneixement de les tècniques estructurals de dades, així com algorismes (fins i tot sense anar a les consideracions teòriques de la complexitat algorítmica) és molt més fèrtil que la d’un llenguatge de muntatge.Quan s’ha determinat l’algorisme més adequat, es poden obtenir les optimitzacions més efectives mitjançant el camí següent:

  • Codi crític escrivint en un llenguatge d’alt nivell (un llenguatge d’alt nivell en informàtica és Un llenguatge de programació que permet al programador …) (com a esquema o LISP comú),
  • Aplicació de transformacions matemàtiques (matemàtiques és una àrea de coneixement abstracta construïda utilitzant …) successiva que preservi l’especificació del programa Tots (tot inclòs com a conjunt del que existeix sovint s’interpreta com a món o …) reduint el consum de recursos,
  • Traducció de codis transformada en un llenguatge de baix nivell (llenguatge C).

A la pràctica, el rendiment de les màquines actuals fa que les aplicacions amb moltes sortides de sortida lentes puguin estalviar aquests tres passos i escriure directament Una llengua com Haskell. La coneguda aplicació de Nget, que va recol·lectar sistemàticament les imatges publicades als Fòrums Usenet, va tenir en la seva primera implementació (la paraula implantació pot tenir diversos significats 🙂 Estiu escrit a Haskell. La versió C era només una traducció que no revela més eficient per a aquest tipus d’aplicacions. Una aplicació limitada principalment per la CPU i la velocitat de la memòria (en general, la memòria és l’emmagatzematge de la informació. També és la memòria …) per contra, pot obtenir molt que s’escriurà en un idioma com C o C ++.

Optimització automàtica

Els compiladors són sovint capaços de fer optimitzacions locals, a les quals cap desenvolupador no pensaria en el primer enfocament.

per al llenguatge C, Això es pot considerar:

  • Variables locals i registres
  • Les funcions no implementades en l’assemblador com a funció
  • el commutador, que és òptim.

Tanmateix, el compilador pot ajudar-se en gran mesura per declarar les variables amb les paraules clau constata i / o restringir quan sigui possible. En cas contrari, el compilador no pot saber si una àrea de memòria és accessible per altres referències i desactiveu les optimitzacions (fenomen anomenat Memory Aliasing).

Exemples

Ús de variables locals per evitar l’aliasing de memòria

El següent codi C ++ generalment estarà poc optimitzat pel compilador perquè sovint no es pot saber si el codi del bucle modifica o no el comptador d’iteració: un punter o una referència podria modificar-la.

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

En aquesta versió, és clar que hi ha una sèrie d’iteracions fixades amb antelació i que mai no canviarà, permetent que el compilador faci més agressiu Optimitzacions:

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

Una especificitat del binari: l’offset

Una de totes les primeres optimitzacions va ser la de la divisió (la divisió és Una llei de composició que en dos nombres associa el producte de la primera per …) i el multiplic (La multiplicació és una de les quatre operacions de l’aritmètica elemental …) per una potència (la paraula d’alimentació s’utilitza en diversos dominis amb un significat concret 🙂 de 2.

De fet, ordinador (informàtica – La contracció de la informació i automàtica – és l’extensió de …) es basa en el binari, ja que s’utilitza com a element bàsic del transistor (i històricament, abans del relé) que n. autoritza a dos valors diferents.

Per tant, hem implementat lògicament en llenguatge màquina (el llenguatge de la màquina és la seqüència de bits interpretats pel processador de l’ordinador …) les operacions offset a l’esquerra i el desplaçament a la dreta.

De fet, en binari, el desplaçament d’una sèrie d’una osca a l’esquerra la multiplica per 2.

Així, 2 (102) compensació d’un bit donen 4 (1002). (1012) Shift of 2 bits dóna 20 (101002): 5 * 22 = 20.

Això funciona (caminant (la caminada de peu a peu també s’utilitza sovint) és una …) també per a la divisió, canviant Els bits a la dreta.

100 (11001002) desplaçat de 3 bits a la dreta dóna 100/23 = 12,5 SO 12 (11002) perquè treballem en enters.

La divisió (fora d’aquest cas i casos patològics) és una instrucció costosa en la màquina del temps i encara no està disponible a la gran majoria dels processadors de RISC.

La paraula clau (en el sentit net, La clau o clau (les dues ortografies són correctes) és un dispositiu extraïble …) Inline C

Codi C següent:

 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 recopilació amb gcc -o4 -s dóna:

 .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)" 

Què podria traduir, per a una millor comprensió, pel següent codi 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; } 

Es pot notar Per exemple, la funció ‘f’ no s’ha generat, sinó que el seu codi ha estat incorporat directament al ‘g’ (la paraula clau “inline ‘fa possible forçar aquest tipus d’optimització C)

Aquest article us ha agradat? Comparteix-ho a les xarxes socials amb els teus amics!

Leave a comment

L'adreça electrònica no es publicarà. Els camps necessaris estan marcats amb *