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

Limbi imperative

APL – ASP – asamblare (un ansamblu de asamblare sau un limbaj de asamblare sau pur și simplu asamblor prin abuzul de limbă, . ..)
Basic (în programare, de bază este un acronim pentru codul de instruire simbolic al începătorului. Cine …) – C (C ++ este un limbaj de programare care permite programarea în mai multe paradigme …) – Cobol (Cobol este un limbaj de programare din a treia generație, creat în 1959 …) – Natural (natural este un limbaj de programare semi-compilat, editat de companie …)
FORTRAN – Limbo
Logo – Pascal – Perl – PHP (PHP (acronim PHP: HyperText Preprocessor), este o limbă a SCR Free IPTS în principal …)

Limbi funcționale

Haskell – ml / OCAML
Lisp / Common Lisp (Lisp este cea mai veche familie de Limbi imperative și funcționale. Dezvoltat …)
Schema – XSLT

Limbi declarative

Clipuri – Prolog (Prolog este una dintre principalele limbi de programare logică Inventat la …)

Competitor Limbi

Ada 95 – Erlang

Vezi și

Design – codare (în general o codificare vă permite să treceți de la o reprezentare a …)
Teste – Optimizări

în programarea calculatorului (programare în domeniul calculatorului Sunt toate activitățile care permit …), optimizarea este practica reducerii timpului (timpul este un concept dezvoltat de ființa umană de a înțelege …) Executarea unei funcții, spațiul ocupat de date și de program, sau Consumul de energie (în bun simț energia înseamnă tot ceea ce face posibilă efectuarea unui loc de muncă, faceți …).

regula numărul unu (numărul unu este o referință la un model de caractere fictive din …) de optimizare Ar trebui să intervină doar odată ce programul funcționează și răspunde specificațiilor funcționale. Experiența arată că aplicarea optimizărilor de coduri scăzute înainte ca aceste două condiții să fie returnate cel mai adesea la o pierdere de timp și este dăunător pentru claritatea codului și buna funcționare a programului:

„Optimizarea prematură este sursa tuturor Inells. „, Donald Knuth (Donald Ervin Knuth () (10 ianuarie 1938 în Milwaukee, …) Citting Dijkstra

Cu toate acestea, acest citat, trunchiat, este foarte adesea interpretat greșit. Versiunea completă fiind:

Ar trebui să uităm mici optimizări locale, să spunem, 97% din timp: optimizarea prematură este sursa tuturor bolilor. (Despre este un termen de tâmplărie care desemnează sfârșitul de modă al unei …) Eficiență mică, spuneți despre 97% din timp: Optimizarea prematură este rădăcina tuturor răului.) „, Donald Knuth

Citatul original indică foarte clar că această regulă ar trebui să se aplice numai optimizărilor locale, la nivel scăzut (rescriere Asambl, buclă de relaxare etc.) și nu la optimizările la nivel înalt despre alegerea algoritmilor sau arhitecturii (arhitectura poate fi definită ca artă a clădirilor clădirilor.) Un proiect (un proiect este un angajament ireversibil al unui rezultat incert, non- reproductibil la …). Dimpotrivă, cu cât crește mai mult proiectul și mai multe optimizări la nivel înalt vor fi dificile și costisitoare (în ceea ce privește timpul, dificultatea și bugetul), dacă nu imposibil, să se efectueze.

Cele mai recente compilatoare practică automat. (Automatele face parte din științele ingineriei. Această disciplină se referă la …) un număr (noțiunea de număr lingvistic este tratată în articolul „numărul …) de optimizări ar fi plictisitoare să funcționeze manual și care ar face codul sursă (codul sursă (sau sursele sau sursele) este un set de instrucțiuni scrise într-un …) mai puțin lizibil.

Optimizarea Manualul local poate fi necesar în cazuri foarte specifice, dar Măsurătorile arată că, pe mașinile RISC care au un număr mare de registre și în cazul în care eficacitatea necesită gruparea instrucțiunilor identice pentru a beneficia de efectul conductei, optimizatorul unui compilator (un compilator este Un program de calculator care traduce o limbă, o limbă sursă, într-una …) C oferă adesea un cod mai eficient decât cel scris în asamblare de către un programator (în informatică, dezvoltator (sau programator) este un om de știință de calculator care realizează software-ul în …) cu experiență (care nu a fost niciodată cazul mașinilor CISC).Și din acest cod este mult mai ușor de întreținut, deoarece instrucțiunile C rămân într-o ordine legată de singura inteligibilitate a codului și nu cu specificul mașinii: în optimizatoarele curente, într-adevăr, mașinile comenzite asociate cu o instrucțiune ( O instrucțiune este o formă de informație comunicată că este atât o comandă, cât și o …) nu mai sunt neapărat în poziția contiguă, din motive de eficiență de execuție. Acest lucru face ca codul de asamblare să fie generat deosebit de indecnător.

Practica optimizării

Prima abordare

Înainte de a începe optimizarea, trebuie să știți cum să măsurați viteza (distingem 🙂 cod. Pentru aceasta trebuie să alegeți un parametru (un parametru este în sens larg, un element de informație care trebuie luat în considerare …), de preferință simplu, măsurabil. Acest lucru poate, de exemplu, timpul de procesare pe un joc de date (în tehnologia informației (IT), o descriere de bază este o descriere de bază, adesea …) precisă sau numărul de imagini afișate pe secundă (al doilea este femininul Al doilea adjectiv, care vine imediat după primul sau care …) sau numărul de solicitări procesate pe minut (prima formă a unui document: Drept: un minut este originalul „A …).

Odată ce parametrul de măsurare măsurată, trebuie să măsurați timpul petrecut (trecutul este în primul rând un concept legat de timp: este alcătuit din ansamblu..) În fiecare parte a programului. Nu este neobișnuit de 80% până la 90% din timp este dedicat executării a 10% din cod (bucle critice). Numerele variază în funcție de dimensiunea și complexitatea (complexitatea este o noțiune utilizată în filosofie, epistemologie (de …) de proiecte. Trebuie să localizăm aceste 10% din cod să fie cele mai profitabile în optimizările sale. Această etapă de localizare poate Fike folosind instrumente de instrumente specializate (instrumentația cuvântului este utilizat în mai multe domenii 🙂 a profilurilor de cod numit. Ele sunt responsabile pentru numărarea numărului de execuții ale fiecărei funcții și cicluri ale microprocesorului (un microprocesor este un procesor al cărui componentă au fost suficient …) corespunzătoare în timpul executării.

Apoi face parte din secțiunea cea mai bună a consumatorilor de câte ori este necesar această buclă:

  • Optimizarea unei părți din Cod
  • Măsurarea câștigului de performanță

A doua abordare

un program:

  • la nivelul algoritmului ( Algoritmul) poate fi optimizat IQue este toate regulile și tehnicile care sunt implicate …), prin alegerea unui algoritm de complexitate inferioară (în sens (sensul (strategiile de senescență negificientă) este un proiect științific care urmărește …) matematică) și adaptat Structuri de date,
  • La nivelul limbajului de dezvoltare, prin ordonarea instrucțiunilor și utilizarea bibliotecilor disponibile,
  • utilizând la nivel local un limbaj de nivel scăzut (un limbaj de nivel scăzut este o limbă care impune programator să vă faceți griji cu privire la conceptele apropiate …), care poate fi limba C sau, pentru cele mai critice nevoi, limba de asamblare.

Mergem doar la nivelul superior de optimizare o dată Posibilitățile unui nivel au fost epuizate. Utilizarea unui limbaj de nivel scăzut în ansamblu (în teoria seturilor, un set intuitiv denotă o colecție …) dintr-un proiect din motive de viteză este una dintre cele mai frecvente greșeli și mai scumpe decât pentru a face un proiect industrial .

Optimizarea codului (în programarea calculatoarelor, optimizarea este practica care constă în general …) este considerată de mulți dezvoltatori amatori ca o artă nu magică și, din acest motiv, ca una dintre cele mai interesante Părți de programare (programarea în câmpul calculatorului sunt toate activitățile care permit …). Acest lucru îi determină să creadă că un programator bun este o persoană care optimizează imediat programul. Cu toate acestea, experiența arată că nu poate îndoi un design inițial rău. Este în proiectarea că experiența dezvoltatorului joacă (obrazul este partea din față care acoperă cavitatea orală, închisă de …) cel mai mult. În plus, într-un număr majoritar și în creștere de cazuri, „Programatorul bun” este mai mic cel care scrie codul inteligent (optimizatorul va face cel mai adesea mai bun decât el) decât codul scris scris și ușor de întreținut.

O bună cunoaștere a tehnicilor structurale de date, precum și algoritmii (chiar și fără a merge la considerațiile teoretice ale complexității algoritmice), este mult mai fertilă decât cea a unei limbi de asamblare.Atunci când a fost determinat cel mai adecvat algoritm, cele mai eficiente optimizări pot fi obținute utilizând următoarea cale:

  • Codul critic Scriere într-un limbaj de nivel înalt (o limbă de nivel înalt în domeniul informaticii este Un limbaj de programare care permite programatorului …) (cum ar fi schema sau LIS comună),
  • Aplicarea transformărilor matematice (Matematica este o zonă de cunoștințe abstractă construită folosind …) succesiv care păstrează specificația programului Toate (all inclusive ca un set de ceea ce există este adesea interpretat ca lumea sau …) prin reducerea consumului de resurse,
  • Traducerea codului transformată într-un limbaj de nivel scăzut (limba C). /li>

În practică, performanța mașinilor curente face ca aplicațiile cu o mulțime de ieșiri lente, pot salva acești trei pași și pot scrie direct în O limbă ca Haskell. Cunoasa aplicație NGGET, care a recoltat sistematic imaginile publicate în forumurile Usenet, a avut în prima sa implementare (cuvântul implantare poate avea mai multe sensuri 🙂 Vara scrisă în Haskell. Versiunea C a fost doar o traducere care nu dezvăluie mai eficientă pentru acest tip de aplicare. O aplicație limitată în principal de CPU și viteza de memorie (în general, memoria este stocarea informațiilor. Este, de asemenea, memoria …) Prin contra poate câștiga mult pentru a fi scris într-o limbă cum ar fi C sau C ++.

Optimizarea automată

Compilatoarele sunt adesea capabile să facă optimizări locale, la care nici un dezvoltator nu ar gândi în prima abordare.

pentru limbă C, Acest lucru poate lua în considerare:

  • variabile și registre locale
  • Funcțiile care nu sunt implementate în asamblare ca funcție
  • comutatorul, care sunt optime. /li>

Cu toate acestea, compilatorul poate ajuta foarte mult prin declararea variabilelor cu cuvintele cheie const și / sau restricționarea atunci când este posibil. În caz contrar, compilatorul nu poate ști dacă o zonă de memorie este accesibilă prin alte referințe și dezactivează optimizările (fenomenul numit aliasing de memorie).

Exemple

Utilizarea variabilelor locale pentru a evita aliasingul de memorie

Următorul cod C ++ va fi, în general, puțin optimizat de compilator, deoarece este adesea incapabilă să știe dacă codul buclei modifică sau nu contorul de iterație: un indicator sau o referință ar putea să o modifice.

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

În această versiune este clar că există o serie de iterații fixate în avans și care nu se va schimba vreodată, permițând compilatorul să facă mai agresiv Optimizări:

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

O specificitate a binarului: Offset

Una dintre primele optimizări a fost cea a diviziei (divizia este O lege a compoziției care la două numere asociază produsul primului de …) și multiplicul (Multiplicarea este una dintre cele patru operațiuni ale aritmeticii elementare …) de o putere (cuvântul de putere este utilizat în mai multe domenii cu un anumit sens 🙂 de 2.

într-adevăr, calculator (Informatică – Contracția informațiilor și automată – este amploarea …) se bazează pe binar, deoarece utilizează ca element de bază tranzistor (și istoric, înainte de releu) care n. autorizează că două valori diferite.

Așadar, am implementat logic în limba mașinii (limba mașinii este secvența de biți care este interpretată de procesorul calculatorului …) Operațiile offset din stânga și deplasarea din dreapta.

Într-adevăr, în binar, compensarea unui număr de o notă în stânga înmulțiți-l cu 2. astfel, 2 (102) Decalajul de 1 biți dați 4 (1002). (1012) Schimbarea a 2 biți dă 20 (101002): 5 * 22 = 20.

Aceste lucrări (mersul pe jos (Pleonasmul de mers pe jos este adesea folosit) este un …) și pentru diviziune, prin schimbarea Biturile din dreapta.

100 (11001002) deplasate de la 3 biți la dreapta dă 100/23 = 12,5S01 (11002) pentru că lucrăm la numere întregi.

Divizia (în afara acestui caz și cazurile patologice) este o instrucțiune costisitoare în mașină și nu este încă disponibilă pe marea majoritate a procesoarelor RISC.

Cuvântul cheie (în sensul curat, Cheia sau cheia (cele două ortografii sunt corecte) este un dispozitiv detașabil …) Inline C

Cod C. Următorul:

 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); } } 

O compilație cu 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)" 

ce ar putea traduce, pentru o mai bună înțelegere, prin următorul cod 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; } 

Se poate observa De exemplu, că funcția „F” nu a fost generată, dar că codul său a fost încorporat direct în „g” (cuvântul cheie „inline” face posibilă forțarea acestui tip de optimizare C)

Acest articol ți-a plăcut? Împărtășiți-l pe rețelele sociale cu prietenii dvs.

Leave a comment

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *