Aparte del concepto Dll que proporciona la capacidad de cargar o descargar métodos o funciones en tiempo de ejecución, me pregunto si un compilador alguna vez puede decir algo así como, esta parte del código ocupa una cantidad considerable de espacio en el segmento de código y nunca volverá a usarse después de este punto durante la ejecución del programa, sería bueno generar algún código para descargar esa parte del segmento de código después de alcanzar ese punto particular durante la ejecución del programa, de modo que el espacio total tomado por segmento de código se haga más pequeño. ¿Es algo simplemente ficticio o puede que eso suceda?¿Puede un compilador generar código para descargar partes del segmento de código durante la ejecución?
Respuesta
Un compilador puede hacer lo que quiera, siempre que eso no viole el estándar. Si puede descubrir que el código nunca vuelve a llamarse, puede deshacerse por completo.
Incluso podría reemplazarlo con una función de trozo más pequeña que volvería a cargar el código, si fuera necesario.
Pero es muy poco probable que lo veas en un sistema operativo moderno, ya que el sistema operativo proporciona esa capacidad bajo las cubiertas.
Los sistemas operativos (al menos los comunes) intercambiarán sus páginas físicas cuando la memoria se agota, y no se volverán a cargar hasta que se necesiten (generalmente por un error de página al intentar acceder a ellas).
No conozco un compilador que haga esto, pero no hay ninguna regla que lo prohíba. Si el compilador puede probar que hacerlo no cambiará la semántica del programa, entonces está permitido bajo la regla de si.
Sin embargo, generalmente no es necesario, porque el código no utilizado ya puede ser intercambiado como parte del mecanismo de archivo de paginación asociado a la memoria virtual. (y porque probablemente solo guarde unos pocos KB de espacio en la memoria)
Sure. Hay una técnica llamada overlaying que carga diferentes códigos en el mismo espacio de direcciones en diferentes momentos. A veces se hacía manualmente, otras veces los compiladores ayudaban. A veces la carga se realiza en software, a veces en hardware (con multiplexación de direcciones, de modo que, por ejemplo, durante el arranque, un bit de espacio de direcciones se lee desde un chip ROM, pero después del arranque cambia a RAM de direcciones o una ROM diferente).
La superposición fue mucho más común cuando las computadoras tenían menos memoria, p. en los primeros días de DOS donde tenías 640K en el mejor de los casos y muchas veces ni siquiera eso. En la actualidad, todavía tiene aplicaciones para sistemas integrados en los que la memoria y/o el espacio de direcciones son una prioridad.
Sí, los controladores de dispositivos de Windows utilizan esta técnica. El formato LE file tiene ciertos segmentos de código marcados como descartables. El sistema operativo también puede tomar esa decisión en ciertas ocasiones para intercambiar segmentos de código que no se han utilizado durante mucho tiempo.
Hablando a la ligera, sin embargo, este no es el área para jugar con el compilador. Es principalmente el linker/loader/OS que afecta esto.
Segmentos de código descartable también existe en el formato PE más común utilizado por EXE y DLL. El compilador ciertamente tiene un papel aquí; coloca funciones en segmentos específicos. Pero tiene poco sentido, como notó: un SO puede descartar todas las páginas de solo lectura que son recargables, y descartará las páginas que no se han tocado últimamente. – MSalters
- 1. Información de informes durante la ejecución del código: mejor diseño
- 2. Forzar el compilador .NET JIT para generar el código más optimizado durante la puesta en marcha de la aplicación
- 3. ¿Puede la memoria caché (u otras variables) cambiar durante la ejecución del código?
- 4. ¿Biblioteca de código abierto para generar tipos concretos de interfaces durante el tiempo de ejecución?
- 5. ¿El compilador solo compilará el código que se puede ejecutar?
- 6. código java para descargar un archivo del servidor
- 7. ¿Qué desencadena la ejecución del código JavaScript?
- 8. C# Tamaño del código y tiempo de ejecución del código
- 9. Ejecución de liquibase dentro del código Java
- 10. Al generar código, ¿qué lenguaje debe generar?
- 11. Herramientas para la ejecución del fragmento de código
- 12. ¿Cómo detener la ejecución del código VBA?
- 13. ¿Usar la afeitadora para generar el código?
- 14. Retraso sincrónico en la ejecución del código
- 15. ¿Hay un compilador nativo de código de máquina para JavaScript?
- 16. Código PHP para generar íconos
- 17. Ejecución segura del código Haskell no confiable
- 18. Generar, compilar y usar código Java en tiempo de ejecución?
- 19. donde descargar el código fuente del muelle?
- 20. ¿Cómo se puede hacer la compilación del código C# para que requiera un idioma determinado o la versión del compilador?
- 21. Compilación de Java: ¿hay alguna manera de decirle al compilador que ignore partes de mi código?
- 22. Ver código ampliado del compilador - C++
- 23. La optimización del compilador rompe el código de subprocesos múltiples
- 24. código de Google descargar fuente
- 25. ¿El mejor diseño para generar código de un AST?
- 26. Ejecución del código de tiempo en Android
- 27. C# Cómo generar código a partir del código
- 28. dónde descargar para la base de código abierto de apple?
- 29. StringTemplate para el gen del código de tiempo de ejecución?
- 30. ¿Es esto un error del compilador o es mi código?
+1 pregunta interesante – delnan