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

Idiomas imperativos

APL – ASP – montador (um conjunto de montagem ou linguagem montador ou simplesmente montador por abuso de linguagem, . ..)
básico (em programação, básico é um acrônimo para o código de instrução simbólico de todos os fins de iniciante. Quem …) – C (C ++ é uma linguagem de programação que permite a programação sob vários paradigmas …) COBOL (COBOL é uma linguagem de programação de terceira geração criada em 1959 …) – Natural (natural é uma linguagem de programação semi-compilada, editada pela empresa …) Forth – Fortran – Limbo
Logotipo – Pascal – Perl – PHP (PHP (PHP Acrônimo: Hypertext Pré-processador), é uma linguagem de SCR IPts gratuitos principalmente …)

idiomas funcionais

haskell – ml / ocaml
Lisp / Common Lisp (Lisp é a família mais antiga de idiomas imperativos e funcional. Desenvolvido …)
Scheme – XSLT

Idiomas declarativos

clipes – Prolog (Prolog é uma das principais linguagens de programação lógica inventado para …)

Idiomas concorrentes

ADA 95 – Erlang

ver também

Design – codificação (geralmente uma codificação permite alternar de uma representação de …)
testes – otimizações

em programação de computador (programação no domínio do computador são todas as atividades que permitem …), a otimização é a prática de reduzir o tempo (o tempo é um conceito desenvolvido pelo ser humano para apreender a …) Execução de uma função, o espaço ocupado pelos dados e pelo programa, ou O consumo de energia (em sentido comum A energia significa tudo o que torna possível realizar um emprego, fazer …).

A regra número um (número um é uma referência a um modelo de caracteres fictícios do …) de otimização Ele só deve intervir quando o programa funcionar e responder a especificações funcionais. A experiência mostra que a aplicação de otimizações de código baixo antes de essas duas condições são feitas mais frequentemente retornadas a uma perda de tempo e é prejudicial à clareza do código e o funcionamento adequado do programa:

“a otimização prematura é a fonte de todos Ills. “, Donald Knuth (Donald Ervin Knuth () (10 de janeiro de 1938 em Milwaukee, …) Custting Dijkstra

No entanto esta citação, truncada, é muito frequentemente mal interpretada. A versão completa sendo:

” Devemos esquecer as pequenas otimizações locais, digamos, 97% do tempo: a otimização prematura é a fonte de todos os males. (Devemos esquecer (sobre é um termo de carpintaria designando a finalização de uma eficiência pequena, dizendo sobre 97% do tempo: otimização prematura é a raiz de todo mal.) “, Donald Knuth

A cotação original indica muito claramente que esta regra só deve ser aplicada às otimizações locais, baixo nível (reescrita em Montador, desonificação de loop, etc.) e não as otimizações de alto nível sobre a escolha de algoritmos ou arquitetura (arquitetura pode ser definida como a arte de construir edifícios.) Um projeto (um projeto é um compromisso irreversível do projeto de resultado incerto, não reprodutível para …). Pelo contrário, quanto mais o projeto cresce e mais estas otimizações de alto nível serão difíceis e caras (em termos de tempo, dificuldade e orçamento), se não impossível, para executar.

Prática mais recente dos compiladores automaticamente. (O automático faz parte das ciências da engenharia. Esta disciplina lida com o …) Um número (a noção de número linguístico é tratado no artigo “número …) das otimizações seria tedioso para realizar manualmente e que faria o código-fonte (o código-fonte (ou fontes ou fontes) é um conjunto de instruções escritas em um …) menos legível.

Otimização Manual local pode ser necessário em casos muito específicos, mas o As medições mostram que em máquinas RISC que possuem um grande número de registros e onde a eficácia exige que o agrupamento das instruções idênticas se beneficie do efeito do pipeline, o otimizador de um compilador (um compilador é Um programa de computador que traduz um idioma, linguagem de origem, em um …) C muitas vezes fornece um código mais eficaz do que o escrito em montador por um programador (em ciência da computação, desenvolvedor (ou programador) é um cientista de computador que realiza software em …) experimentado (que nunca foi o caso em máquinas CISC).E a partir deste código é muito mais fácil de manter, porque as instruções C permanecem em uma ordem relacionada à única inteligibilidade do código e não às especificidades da máquina: nos atuais otimizadores, de fato, as máquinas ordens associadas a uma instrução ( Uma instrução é uma forma de informação comunicada que é tanto um comando quanto um …) não estão mais necessariamente na posição contígua, por razões de eficiência de execução. Isso torna o código assembler gerado particularmente indecoprável.

Prática de otimização

primeira abordagem

antes de iniciar a otimização, você precisa saber como medir a velocidade (nós distinguimos 🙂 Código. Para isso, você precisa escolher um parâmetro (um parâmetro é no sentido amplo, um item de informação a ser levado em conta …), de preferência simples, mensurável. Isso pode, por exemplo, o tempo de processamento em um jogo de dados (em tecnologia da informação (TI), um dado é uma descrição básica, muitas vezes …) precisa, ou o número de imagens exibidas por segundo (o segundo é o feminino do Segundo adjetivo, que vem imediatamente após o primeiro ou quem …), ou o número de solicitações processadas por minuto (primeira forma de um documento: certo: um minuto é o original de ‘A …).

Uma vez que o parâmetro de medição medido, você tem que medir o tempo gasto (o passado é o primeiro de todo um conceito relacionado ao tempo: consiste no todo..) Em cada partes do programa. Não é incomum que 80% a 90% do tempo seja dedicado à execução de 10% do código (loops críticos). Os números variam dependendo do tamanho e da complexidade (a complexidade é uma noção usada em filosofia, epistemologia (por …) de projetos. Devemos localizar esses 10% do código para ser o mais lucrativo em suas otimizações. Esta etapa de localização pode ser feito usando ferramentas de instrumentação especializada (a instrumentação da palavra é usada em vários domínios 🙂 dos perfis de código nomeados. Eles são responsáveis por contar o número de execuções de cada função e ciclos do microprocessador (um microprocessador é um processador cujos componentes foram suficientemente …) correspondente durante a execução.

Então faz parte da seção de consumidores mais recursos, quantas vezes for necessário este loop:

  • otimização de uma parte do Código
  • Medição do ganho de desempenho

segunda abordagem

um programa:

  • no nível algorítmico (no nível algorítmico O algoritmo) pode ser otimizado Ique é todas as regras e técnicas envolvidas …), escolhendo um algoritmo de menor complexidade (no sentido (significado (estratégias de senescência negável projetada) é um projeto científico que visa …) e adaptado estruturas de dados,
  • no nível de linguagem de desenvolvimento, ordenando as instruções e usando bibliotecas disponíveis,
  • Usando localmente um idioma de baixo nível localmente (uma linguagem de baixo nível é uma linguagem que requer que o programador se preocupe com conceitos próximos …), que pode ser a linguagem C ou, para as necessidades mais críticas, a linguagem montadora.

só vamos no nível de otimização superior uma vez As possibilidades de um nível foram esgotadas. O uso de uma linguagem de baixo nível em todo (em teoria dos conjuntos, um conjunto intuitivamente denota uma coleção …) de um projeto por razões de velocidade é um dos erros mais comuns e mais caro do que fazer um projeto industrial .

Otimização de código (em programação de computadores, otimização é a prática que geralmente consiste …) é considerado por muitos desenvolvedores amadores como uma arte não é mágica e, por esse motivo, como uma das mais excitantes partes da programação (programação no campo do computador são todas as atividades que permitem …). Isso os leva a acreditar que um bom programador é uma pessoa que otimiza o programa imediatamente. No entanto, a experiência mostra que não pode dobrar um design inicial ruim. É no design que a experiência do desenvolvedor desempenha (a bochecha é a parte do rosto que cobre a cavidade oral, fechada pela …) mais. Além disso, em maioridade e número crescente de casos, o “bom programador” é menos aquele que escreve o código inteligente (o otimizador fará mais frequentemente melhor do que ele) do que o código escrito escrito e fácil de manter.

Um bom conhecimento de técnicas estruturais de dados, bem como algoritmos (mesmo sem ir às considerações teóricas da complexidade algorítmica) é muito mais fértil do que a de uma linguagem de montagem.Quando o algoritmo mais apropriado foi determinado, as otimizações mais eficazes podem ser obtidas usando o seguinte caminho:

  • código crítico em uma linguagem de alto nível (uma linguagem de alto nível na ciência da computação é Uma linguagem de programação que permite ao programador …) (como esquema ou lisp comum),
  • Aplicação de transformações matemáticas (matemática é uma área de conhecimento abstrata construída usando …) Sucessivo que preservar a especificação do programa Tudo (tudo incluído como um conjunto do que existe é muitas vezes interpretado como o mundo ou …) reduzindo o consumo de recursos,
  • Tradução de código transformada em uma linguagem de baixo nível (linguagem C).

Na prática, o desempenho das máquinas atuais faz com que os aplicativos com muitas saídas de saída lentas possam salvar estas três etapas e gravar diretamente em Uma linguagem como Haskell. O conhecido aplicativo da NGget, que colhia sistematicamente as imagens publicadas nos fóruns da Usenet, tinham em sua primeira implementação (a palavra implantação pode ter vários significados 🙂 Verão escrito em Haskell. A versão C foi apenas uma tradução que não revela mais eficiente para este tipo de aplicação. Uma aplicação limitada principalmente pela CPU e pela velocidade da memória (em geral, a memória é o armazenamento da informação. É também a memória …) Por contras pode ganhar muito a ser escrito em uma linguagem como C ou C ++.

Otimização automática

Os compiladores costumam fazer otimizações locais, para as quais nenhum desenvolvedor pensaria na primeira abordagem.

para a linguagem C, Isso pode considerar:

  • variáveis e registradores locais
  • as funções não implementadas no montador como uma função
  • o comutador, que são ótimos.

No entanto, o compilador pode ajudar muito, declarando as variáveis com as palavras-chave const e / ou restringir quando possível. Caso contrário, o compilador não pode saber se uma área de memória é acessível por outras referências e desativar as otimizações (fenômeno chamado aliasing de memória).

Exemplos

Uso de variáveis locais para evitar o aliasing de memória

o próximo código C ++ geralmente será pouco otimizado pelo compilador porque muitas vezes é incapaz de saber se o código do loop modifica ou não o contador de iteração: um ponteiro ou uma referência pode modificá-lo.

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

nesta versão, é claro que existe uma série de iterações fixadas antecipadamente e que não mudará, permitindo que o compilador faça mais agressivo Otimizações:

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

Uma especificidade do binário: o deslocamento

Uma de todas as primeiras otimizações foi a da divisão (a divisão é uma lei de composição que em dois números associa o produto do primeiro por …) e o multiplic (A multiplicação é uma das quatro operações da aritmética elementar …) por uma potência (a palavra de energia é usada em vários domínios com um determinado significado 🙂 de 2.

de fato, computador (informática – Contração da informação e automática – é a extensão de …) é baseada no binário, uma vez que utiliza como um elemento básico o transistor (e historicamente, antes do relé) que n. autoriza que dois valores diferentes.

Então, nós implementamos logicamente na linguagem da máquina (a linguagem da máquina é a sequência de bits que é interpretada pelo processador do computador …) As operações de deslocamento à esquerda e deslocam à direita.

Na verdade, no binário, o deslocamento de um número de um entalhe para a esquerda multiplica por 2.

assim, 2 (102) O deslocamento de 1 bits dar 4 (1002). (1012) Deslocamento de 2 bits dá 20 (101002): 5 * 22 = 20.

Isso funciona (a pé (o pleonasmo de pé também é usado) é um …) também para a divisão, deslocando Os pedaços para a direita.

100 (11001002) mudou de 3 bits para a direita dá 100/23 = 12,5 assim 12 (11002) porque trabalhamos em números inteiros.

A divisão (fora deste caso e casos patológicos) é uma instrução cara na máquina do tempo, e ainda não está disponível na vasta maioria dos processadores RISC.

A palavra-chave (no sentido limpo, A chave ou chave (as duas grafias estão corretas) é um dispositivo removível …) C

código c próximo:

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

Uma compilação com 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)" 

O que poderia traduzir, para uma melhor compreensão, pelo seguinte código 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; } 

Pode ser notado Por exemplo, que a função ‘F’ não foi gerada, mas que seu código foi incorporado diretamente ao ‘g’ (a palavra-chave “inline ‘torna possível forçar este tipo de otimização C)

Este artigo te agradou? Compartilhe em redes sociais com seus amigos!

Leave a comment

O seu endereço de email não será publicado. Campos obrigatórios marcados com *