En el que computa, la extensión en línea, o el inlining, es una optimización de recopilador que " expands" un sitio de la llamada de la función en una versión de la función se llama que. El intento de realizar esta optimización es mejorar funcionamiento runtime, en el coste posible de aumentar el tamaño del programa final.

Mientras que el inlining quita el coste de la llamada de función y de las instrucciones de vuelta, éstos son a menudo pequeños ahorros. Los ahorros principales vienen a menudo de las optimizaciones adicionales que llegan a ser posibles en el cuerpo inlined de la función (eg., un constante pasajero como discusión se puede propagar a menudo a todos los casos del parámetro que empareja). Inlining a menudo, pero no siempre, aumenta el tamaño del código generado. Esta extensión reduce de vez en cuando funcionamiento runtime, por ejemplo debido a la pérdida de lugar de la referencia .

Ordinariamente, cuando se invoca una función, el control es transferido a su definición por una rama o la instrucción de llamada; con inlining, la función es " in" empalmado; al llamador.

Algunas idiomas (e., C y C++ ) apoyan la palabra clave de inline, que al aparecer en una definición de función actúa como indirecta al recopilador que la función debe inlined. Los recopiladores utilizan una variedad de mecanismos, incluyendo indirectas de los reveladores, para decidir a qué llamadas de función deben inlined.

En el contexto de los lenguajes el de programación funcionales la extensión en línea se refiere a menudo como reducción beta, un término usado en el cálculo, el lenguaje formal de la lambda que es la base de estas idiomas.

Inlining se pudo realizar manualmente, como una vez solamente operación en el código fuente usar la copia y la goma que programaban . Sin embargo, otros métodos de controlar inlining (véase abajo) son preferibles, porque evitan la situación donde la copia-goma de a (modificada posiblemente) de una función se pasa por alto al intentar fijar un insecto en esa función.

Puesta en práctica

Una vez que el recopilador ha decidido en línea a una función particular, es generalmente algo fácil hacer tan. Dependiendo de si uno quiere funciones en línea en las diferentes lenguas, el inlining se puede hacer con una representación intermedia de alto nivel, como los árboles de abstract syntax o una representación intermedia baja. En cualquier caso, uno computa simplemente las discusiones, las almacena en las variables que corresponden a las discusiones de la función, y después inserta el cuerpo de la función en el sitio de la llamada.

La función inlining se puede también realizar en el acoplamiento-tiempo, que permite inlining de las funciones cuya fuente no está disponible por ejemplo funciones de biblioteca (véase la optimización del Acoplamiento-tiempo) y en el tiempo de pasada, que permite usar la información de perfilado dinámica tomar mejores decisiones sobre las cuales funcione en línea, como en el recopilador de los apuroses de Java.

Aquí está un ejemplo simple del " realizado extensión en línea; a mano " en el nivel de la fuente en el lenguaje de programación C: lang=" del la internacional pred (internacional x) { si (== 0 de x) vuelta 0; x de vuelta - 1; }

antes de inlining: lang=" del internacional f (internacional y) { volver pred (y) + pred (0) + pred (y+1); }

después de inlining: lang=" del internacional f (internacional y) { temp de la internacional = 0; si (== 0 de y) temp += 0; temp otro += y - 1; si (0 == 0) temp += 0; temp otro += 0 - 1; si (y+1 == 0) temp += 0; temp otro += (y + 1) - 1; temp de vuelta; }

Observar que esto es solamente un ejemplo; en un uso real de C, sería preferible utilizar una característica de lengua inlining tal como macros dadas parámetros o funciones en línea para decir al recopilador realizar esta transformación. Debajo, discutimos algunas de las optimizaciones que se pueden realizar en este código para simplificarlo.

Ventajas

La extensión en línea sí mismo es una optimización, puesto que elimina gastos indirectos de la llamada, pero es mucho más importante como permitiendo la transformación . Es decir, una vez que el cuerpo de la función se amplía en el contexto de su sitio de la llamada, a menudo con las discusiones que pueden ser los constantes fijos el código se abre en una variedad de nuevas optimizaciones que no eran posibles antes. Por ejemplo, una rama usar una discusión puede resultar ser siempre verdad o siempre falso en este un caso, no prohibiendo a la eliminación muerta del código, las declaraciones lazo-invariantes pueden ser movido fuera de un lazo, o una variable puede sentir bien a un candidato a la eliminación variable de la inducción. ¡

En nuestro ejemplo de C, vemos que abundan las oportunidades de la optimización. Podemos reducirla en los pasos siguientes:
Las declaraciones del temp += 0 no hacen nada.
El == 0 de la condición 0 es siempre verdad, así que podemos utilizar apenas la rama verdadera (que no hace nada).
El == 0
de la condición y+1 es equivalente al == y -1.
El de la expresión (y + 1) - 1 reduce simplemente a y (la semántica envuelta asumida del desbordamiento)
Las expresiones y y y+1 no pueden ambo cero igual. Esto deja tres casos que podemos considerar explícitamente. Nuestra nueva función mira gusto:

lang=" del internacional f (internacional y) { si (== 0 de y) y de vuelta; /* o vuelven 0 * si (== -1 de y) y de vuelta - 1; /* o vuelven -2 * de vuelta y + y - 1; }

Problemas

El reemplazo de un sitio de la llamada por un cuerpo de la función ampliada puede presentar varios problemas que puedan hacer este " optimization" lastimar realmente el funcionamiento :

en usos donde está más importante el tamaño de código que apresura, por ejemplo muchos sistemas encajados inlining es generalmente desventajoso a excepción de funciones muy pequeñas.
El aumento de tamaño de código puede causar una sección pequeña, crítica del código a cabido no más en el escondrijo, causando faltas de escondrijo y la retardación.
Las variables agregadas del procedimiento inlined pueden consumir los registros adicionales, y en un área donde está ya alta la presión del registro ésta puede forzar derramarse, que causa accesos adicionales del RAM.
Una especificación de la lengua puede permitir que un programa haga asunciones adicionales sobre discusiones a los procedimientos que puede hacer no más después de que el procedimiento inlined.
Si el tamaño de código se aumenta demasiado, los apremios del recurso tales como tamaño del RAM se pueden exceder, llevando a los programas que o no puede ser funcionado o que de la causa que golpea . Hoy, esto es poco probable ser una edición con las computadoras de la mesa o de servidor excepto con niveles ridículos de inlining, pero puede todavía ser una edición para los sistemas encajados

Típicamente, un recopilador es consciente de estas ediciones y se esfuerza elegir qué funciones en línea de una manera tal que el funcionamiento se realce solamente en la mayoría de los casos.

Además, no es siempre posible en línea a una subrutina. Considerar el caso de una subrutina que se llame recurrentemente hasta que un pedazo particular de datos de entrada se reciba de un periférico. Porque el recopilador no es el omnisciente, no puede saber en general cuando este proceso terminará, así que nunca acabaría de inlining si fue diseñado a en línea cada sola invocación de la subrutina. Así, los recopiladores para las idiomas que apoyan la repetición deben tener restricciones en lo que elegirán automáticamente en línea, a evitar conseguir pegado en eso bueno de lazo inlining infinito.

Métodos de la selección y ayuda de la lengua

Muchas de los recopiladores funciones en línea agresivamente dondequiera que sea beneficioso hacer tan. Aunque esto pueda llevar a un más grande Executables esto sin embargo ha llegado a ser cada vez más deseable mientras que el crecimiento de las capacidades de memoria ha pasado el crecimiento de la velocidad de la CPU. Esto automática de inlining es una optimización crítica en las idiomas funcionales y los lenguajes el de programación orientado al objeto que confían en ella para dar bastante contexto a sus funciones típicamente pequeñas para hacer la optimización clásica eficaz.

En no-objeto-orientado, los lenguajes de programación imprescindible el acercamiento a las funciones en línea son absolutamente diferentes, puesto que las funciones son típicamente mucho más grandes. Generalmente las solamente funciones obvias o dominantes inlined, usar características de lengua como las funciones en línea - o en su ausencia, las construcciones simples del fuente-nivel tales como macros dadas parámetros (los macroprocesadores de tercera persona pueden ser utilizados cuando el lenguaje de programación no apoya macros). En cualquier caso, el programador elige qué funciones a en línea manualmente, aunque el recopilador pueda en algunos casos no ser capaz o que quiere en línea a una función marcada para inlining.

Ver también


máquina para hacer chorizos
Macro
Evaluación parcial

.

  • Zenithic
  • Capture CIS
    Random links:W. Brezo Robinson | Kate Seredy | Kalimba | Harald Sæverud | Crimesmith

  • © 2007-2008 enciclopediaespana.com; article text available under the terms of GFDL, from en.wikipedia.org
    ="http://pagead2.googlesyndication.com/pagead/show_ads.js">