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

Idiomas imperativos

APL – ASP – Ensamblador (un conjunto de ensamblaje o lenguaje ensamblador o simplemente ensamblador por abuso de lenguaje, ..)
básico (en programación, básico es un acrónimo para el código de instrucción simbólico de uso múltiple para principiantes. Quien …) – C (C ++ es un lenguaje de programación que permite la programación en múltiples paradigmas …) – COBOL (COBOL es un lenguaje de programación de tercera generación creado en 1959 …) – Natural (natural es un lenguaje de programación semi-compilado, editado por la empresa …)
Fuerto – Fortran – Limbox> Logo – Pascal – Perl – PHP (PHP (PHP Acrónym: Hypertext Preprocessor), es un idioma de SCR IPTS gratis principalmente …)

Idiomas funcionales

Haskell – ML / OCAML
LISP / LISP común (Lisp es la familia más antigua de Idiomas imperativos y funcionales. Desarrollado …)
Esquema – XSLT

Lenguas declarativas

Clips – Prolog (Prolog es uno de los principales lenguajes de programación lógicos Inventado en …)

Idiomas de la competencia

ADA 95 – ERLANG

Ver también

Diseño: codificación (generalmente una codificación le permite cambiar de una representación de …)
Pruebas – Optimizaciones

En la programación de la computadora (programación en el dominio de la computadora Es todas las actividades que permiten …), la optimización es la práctica de reducir el tiempo (el tiempo es un concepto desarrollado por el ser humano para detener la ejecución de una función, el espacio ocupado por los datos y el programa, o El consumo de energía (en común sentido común, la energía significa todo lo que hace posible realizar un trabajo, hacer …).

La regla número uno (el número uno es una referencia a un modelo de caracteres ficticios de la …) de la optimización Solo debe intervenir una vez que el programa funcione y responda a las especificaciones funcionales. La experiencia muestra que la aplicación de optimizaciones de código bajo antes de que se realicen estas dos condiciones, la mayoría de las veces se devuelve a una pérdida de tiempo y es perjudicial para la claridad del código y el funcionamiento correcto del programa:

«La optimización prematura es la fuente de todos Mals. «, Donald Knuth (Donald Ervin Knuth () (10 de enero de 1938 en Milwaukee, …) Citando Dijkstra

Sin embargo, esta cita, truncada, es muy a menudo malinterpretada. La versión completa es:

» Debemos olvidar las pequeñas optimizaciones locales, digamos, el 97% del tiempo: la optimización prematura es la fuente de todos los males. (Debemos olvidarnos de (sobre el término de la carpintería que designa al final de la moda de una …) una pequeña eficiencia, digamos acerca de El 97% del tiempo: la optimización prematura es la raíz de todo mal). «, Donald Knuth

La cita original indica claramente que esta regla solo debe aplicarse a las optimizaciones locales, un nivel bajo (reescritura en Ensamblador, corte de bucle, etc.) y no a optimizaciones de alto nivel sobre la elección de algoritmos o arquitectura (la arquitectura se puede definir como el arte de los edificios de la construcción). Un proyecto (un proyecto es un proyecto compromiso irreversible del resultado incierto, no reproducible para …). Por el contrario, cuanto más el proyecto crece y más estas optimizaciones de alto nivel serán difíciles y costosas (en términos de tiempo, dificultad y presupuesto), si no imposibles, para realizar.

La práctica más reciente de los compiladores automáticamente. (La automática es parte de las ciencias de la ingeniería. Esta disciplina trata con el …) un número (la noción de número lingüístico se trata en el artículo «Número …) de las optimizaciones sería tedioso para realizar manualmente y cuáles Haría el código fuente (el código fuente (o las fuentes o fuentes) es un conjunto de instrucciones escritas en un …) menos legible.

El manual local de optimización puede ser necesario en casos muy específicos, pero el Las mediciones muestran que en las máquinas RISC que tienen un alto número de registros y cuando la efectividad requiere la agrupación de las instrucciones idénticas para beneficiarse del efecto de la tubería, el optimizador de un compilador (un compilador es Un programa de computadora que traduce un idioma, un lenguaje de origen, en uno …) C a menudo proporciona un código más efectivo que el escrito en el ensamblador por un programador (en informática, desarrollador (o programador) es un científico informático que realiza el software en …) experimentado (que nunca fue el caso en las máquinas CISC).Y de este Código es mucho más fácil de mantener, porque las instrucciones C permanecen en un orden relacionado con la única inteligibilidad del código y no a las especificidades de la máquina: En los optimizadores actuales, de hecho, las máquinas de pedidos asociadas con una instrucción ( Una instrucción es una forma de información comunicada que es tanto un comando y un …) ya no están necesariamente en la posición contigua, por razones de eficiencia de ejecución. Esto hace que el código del ensamblador se haya generado particularmente indecroducable.

Práctica de optimización

Primer enfoque

Antes de iniciar la optimización, debe saber cómo medir la velocidad (distinguimos 🙂 Código. Para ello tiene que elegir un parámetro (un parámetro está en el sentido amplio, un elemento de información que se debe tener en cuenta …), preferiblemente simple, medible. Esto puede, por ejemplo, el tiempo de procesamiento en un juego de datos (en tecnología de la información (IT), un DATOS es una descripción básica, a menudo …) precisa, o el número de imágenes que se muestran por segundo (segundo es el femenino de la Segundo adjetivo, que viene inmediatamente después de la primera o la OMS …), o el número de solicitudes procesadas por minuto (primera forma de un documento: Derecha: un minuto es el original de ‘a …).

Una vez que el parámetro de medición medido, debe medir el tiempo empleado (el pasado es el primero en todo un concepto relacionado con el tiempo: consiste en la totalidad.). En cada parte del programa. No es raro que el 80% al 90% del tiempo se dedica a la ejecución del 10% del código (bucles críticos). Los números varían según el tamaño y la complejidad (la complejidad es una noción utilizada en la filosofía, la epistemología (por …) de los proyectos. Debemos localizar a estos 10% del código para ser el más rentable en sus optimizaciones. Este paso de localización puede hacerse utilizando herramientas de instrumentación especializadas (la palabra instrumentación se usa en múltiples dominios 🙂 de los perfiles de código nombrado. Son responsables de contar el número de ejecuciones de cada función y ciclos del microprocesador (un microprocesador es un procesador cuyos componentes han sido suficientemente …) correspondientes durante la ejecución.

Luego, es parte de la sección de mayor consumo de recursos, ya que muchas veces, según sea necesario, este bucle:

  • optimización de una parte de la parte del Código
  • Medición de la ganancia de rendimiento

segundo enfoque

Un programa:

  • en el nivel algorítmico ( El algoritmo) puede ser optimizado. Ices son todas las reglas y técnicas que están involucradas …), al elegir un algoritmo de menor complejidad (en el sentido (significado (Estrategias para la senescencia negable de ingeniería) es un proyecto científico que apunta a …) Matemáticas) y adaptada Estructuras de datos,
  • a nivel de lenguaje de desarrollo, al ordenar las instrucciones y utilizar las bibliotecas disponibles,
  • usando localmente un idioma de bajo nivel localmente (un idioma de bajo nivel es un idioma que Requiere que el programador se preocupe por los conceptos cercanos …), que puede ser el idioma C o, para las necesidades más críticas, el lenguaje del ensamblador.

Solo vamos en el nivel de optimización superior una vez Las posibilidades de un nivel se han agotado. El uso de un lenguaje de bajo nivel en general (en teoría de los conjuntos, un conjunto denota intuitivamente una colección …) de un proyecto por razones de velocidad es uno de los errores más comunes y más caros que hacer un proyecto industrial. .

optimización del código (en la programación informática, la optimización es la práctica que generalmente consiste …) es considerada por muchos desarrolladores aficionados como un arte que no es mágico y, por esta razón, como uno de los más emocionantes. Partes de la programación (la programación en el campo de la computadora son todas las actividades que permiten …). Esto los lleva a creer que un buen programador es una persona que optimiza el programa de inmediato. Sin embargo, la experiencia muestra que no puede doblar un mal diseño inicial. Es en el diseño que la experiencia del desarrollador juega (la mejilla es la parte de la cara que cubre la cavidad oral, cerrada por el …) más. Par ailleurs, dans un nombre majoritaire et grandissant de cas, le » bon programmeur » est moins celui qui écrit du code astucieux (l’optimiseur s’en chargera le plus souvent mieux que lui) que celui qui écrit du code lisible et aisé à maintenir.

Une bonne connaissance des techniques de structures de données ainsi que des algorithmes (même sans aller jusqu’aux considérations théoriques poussées de la complexité algorithmique) se montre bien plus féconde que celle d’un langage d’ Ensamblaje.Cuando se ha determinado el algoritmo más apropiado, las optimizaciones más efectivas se pueden obtener utilizando la siguiente ruta:

  • La escritura de código crítico en un idioma de alto nivel (un idioma de alto nivel en la ciencia informática es Un lenguaje de programación que permite al programador …) (como esquema o lisp común),
  • Aplicación de transformaciones matemáticas (Mathematics es un área de conocimiento abstracta creado usando …) sucesivo que preserva la especificación del programa Todos (todo incluido como conjunto de lo que existe a menudo se interpreta como el mundo o …) al reducir el consumo de recursos,
  • la traducción del código se transforma en un lenguaje de bajo nivel (idioma C).

En la práctica, el rendimiento de las máquinas actuales hace que las aplicaciones con muchas salidas de salida lentas puedan guardar estos tres pasos y escribir directamente en Un idioma como Haskell. La conocida aplicación de NGET, que recolectó sistemáticamente las imágenes publicadas en los foros de Usenet, tuvo en su primera implementación (la palabra implantación puede tener varios significados 🙂 Verano escrito en Haskell. La versión C fue solo una traducción que no revela más eficiente para este tipo de aplicación. Una solicitud limitada principalmente por la CPU y la velocidad de la memoria (en general, la memoria es el almacenamiento de la información. También es la memoria …) por parte, puede obtener mucho que escribir en un idioma como C o C ++.

Optimización automática

Los compiladores a menudo pueden hacer optimizaciones locales, a las que ningún desarrollador pensaría en primer enfoque.

para el idioma C, Esto puede considerar:

  • Variables y registros locales
  • Las funciones no implementadas en el ensamblador como función
  • el interruptor, que son óptimos.

Sin embargo, el compilador puede ayudar en gran medida al declarar las variables con las palabras clave const y / o restringir cuando sea posible. De lo contrario, el compilador no puede saber si se puede acceder a un área de memoria por otras referencias, y deshabilite las optimizaciones (fenómeno llamado aliasing de memoria).

Ejemplos

Uso de las variables locales para evitar el aliasing de la memoria

El siguiente código C ++ generalmente será pequeño optimizado por el compilador porque a menudo no puede saber si el código del bucle modifica o no el contador de iteración: un puntero o una referencia podría modificarlo.

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

En esta versión, está claro que hay una serie de iteraciones fijas con anticipación y que no cambiará nunca, permitiendo que el compilador se haga más agresivo Optimizaciones:

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

Una especificidad del binario: el desplazamiento

Una de las primeras optimizaciones fue la de la división (la división es Una ley de composición que en dos números asocia el producto de la primera por …) y la multiplicidad. (La multiplicación es una de las cuatro operaciones de la aritmética elemental …) por una potencia (la palabra de poder se usa en varios dominios con un significado particular 🙂 de 2.

de hecho, computadora (informática – La contracción de la información y la automática, es la extensión de …) se basa en el binario, ya que utiliza como un elemento básico el transistor (e históricamente, antes del relé) que n. Autoriza a dos valores diferentes.

Por lo tanto, hemos implementado lógicamente en el lenguaje de la máquina (el lenguaje de la máquina es la secuencia de bits que interpreta por el procesador de la computadora …) las operaciones de compensación a la izquierda y el turno a la derecha.

De hecho, en binario, el desplazamiento de una serie de muesca a la izquierda lo multiplica por 2.

SO, 2 (102) Desplazamiento de 1 bit Da 4 (1002). (1012) El cambio de 2 bits da 20 (101002): 5 * 22 = 20.

Esto funciona (caminar (el pleonismo que camina a los pies también se usa a menudo) es un …) también para la división, cambiando Los bits a la derecha.

100 (11001002) desplazado de 3 bits a la derecha proporciona 100/23 = 12.5 así 12 (11002) porque trabajamos en enteros.

La división (fuera de este caso y casos patológicos) es una instrucción costosa en la máquina del tiempo, y aún no está disponible en la gran mayoría de los procesadores RISC.

La palabra clave (en el sentido limpio, La tecla o la llave (los dos deletreos son correctos) es un dispositivo extraíble …) En línea C

Código C Siguiente:

 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 compilación con gcc -o4 -s da:

 .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é podría traducir, para una mejor comprensión, por el siguiente 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; } 

Se puede notar Por ejemplo, la función ‘F’ no se ha generado, pero que su código se ha incorporado directamente en el ‘G’ (la palabra clave «en línea ‘hace posible forzar este tipo de optimización C)

este artículo te ha complacido? ¡Compartelo en las redes sociales con sus amigos!

Dejar un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *