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.
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
antes de inlining: lang=" del
después de inlining: lang=" del
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.
En nuestro ejemplo de C, vemos que abundan las oportunidades de la optimización. Podemos reducirla en los pasos siguientes: lang=" del 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. 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. 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. .
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). de la condición
El == 0y+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: 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 :
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 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. Ver también
máquina para hacer chorizos
Macro
Evaluación parcial Random links: W. Brezo Robinson | Kate Seredy | Kalimba | Harald Sæverud | Crimesmith