¿Qué es la biblioteca de tiempo de ejecución de C?

Resuelto B.Gen.Jack.O.Neill asked hace 14 años • 8 respuestas

¿Qué es realmente una biblioteca en tiempo de ejecución de C y para qué se utiliza? Estuve buscando en Google como un demonio, pero no pude encontrar nada mejor que el de Microsoft: "La biblioteca de tiempo de ejecución de Microsoft proporciona rutinas para programar para el sistema operativo Microsoft Windows. Estas rutinas automatizan muchas tareas de programación comunes que no son proporcionadas por los lenguajes C y C++."

Vale, lo entiendo, pero, por ejemplo, ¿qué hay en libcmt.lib? ¿Qué hace? Pensé que la biblioteca estándar de C era parte del compilador de C. Entonces, ¿ libcmt.libla implementación de Windows de las funciones de la biblioteca estándar de C funcionará en win32?

B.Gen.Jack.O.Neill avatar May 04 '10 21:05 B.Gen.Jack.O.Neill
Aceptado

Sí, libcmt es (una de varias) implementaciones de la biblioteca estándar C proporcionada con el compilador de Microsoft. Proporcionan versiones de "depuración" y "lanzamiento" de tres tipos básicos de bibliotecas: de un solo subproceso (siempre vinculadas estáticamente), de múltiples subprocesos vinculadas estáticamente y de múltiples subprocesos vinculadas dinámicamente (aunque, dependiendo de la versión del compilador que esté utilizando). algunos de ellos pueden no estar presentes).

Entonces, en el nombre "libcmt", "libc" es el nombre (más o menos) tradicional de la biblioteca C. El "mt" significa "multiproceso". A una versión de "depuración" se le agregaría una "d" al final, dando "libcmtd".

En cuanto a las funciones que incluye, el estándar C (parte 7, si le interesa) define un conjunto de funciones que debe proporcionar una implementación conforme (alojada). La mayoría de los proveedores (incluido Microsoft) agregan otras funciones (por compatibilidad, para proporcionar capacidades que las funciones estándar no abordan, etc.). En la mayoría de los casos, también contendrá bastantes funciones "internas" que utiliza el compilador. pero normalmente no por el usuario final.

La biblioteca de tiempo de ejecución es básicamente una colección de implementaciones de esas funciones en un archivo grande (o unos pocos archivos grandes; por ejemplo, en UNIX las funciones de punto flotante se almacenan tradicionalmente por separado del resto). Ese archivo grande suele tener el mismo orden general que un archivo zip, pero sin ningún tipo de compresión, por lo que básicamente son solo algunos archivos pequeños recopilados y almacenados juntos en un archivo más grande. El archivo normalmente contendrá al menos algo de indexación para que sea relativamente rápido/fácil encontrar y extraer los datos de los archivos internos. Al menos en ocasiones, Microsoft ha utilizado un formato de biblioteca con un índice "extendido" que el vinculador puede usar para encontrar qué funciones están implementadas en cuáles de los subarchivos, de modo que pueda encontrar y vincular las partes que necesita más rápido (pero eso es puramente una optimización, no un requisito).

Si desea obtener una lista completa de las funciones en "libcmt" (para usar su ejemplo), puede abrir uno de los símbolos del sistema de Visual Studio (en "Visual Studio Tools", normalmente), cambiar al directorio donde estaban sus bibliotecas. instalado y escriba algo como: lib -list libcmt.liby generará una lista ( larga ) de los nombres de todos los archivos objeto en esa biblioteca. Estos no siempre corresponden directamente a los nombres de las funciones, pero generalmente darán una idea. Si desea ver un archivo objeto en particular, puede usar lib -extractpara extraer uno de esos archivos objeto y luego usarlo dumpbin /symbols <object file name>para encontrar qué funciones hay en ese archivo objeto en particular.

Jerry Coffin avatar May 04 '2010 14:05 Jerry Coffin

Al principio, debemos entender qué es una biblioteca en tiempo de ejecución; y piense qué podría significar con "Microsoft C Runtime Library".

ver: http://en.wikipedia.org/wiki/Runtime_library

He publicado la mayor parte del artículo aquí porque es posible que se actualice.

Cuando un compilador traduce el código fuente de un programa de computadora al idioma de destino respectivo, se produciría una ampliación extrema del código del programa si cada comando en el programa y cada llamada a una función incorporada provocara la generación in situ. del código completo del programa respectivo en el idioma de destino cada vez. En su lugar, el compilador suele utilizar funciones auxiliares específicas del compilador en la biblioteca de tiempo de ejecución a las que, en su mayoría, no son accesibles para los programadores de aplicaciones. Dependiendo del fabricante del compilador, la biblioteca runtime a veces también contiene la biblioteca estándar del compilador respectivo o está incluida en ella.

Además, en la biblioteca de tiempo de ejecución se implementan algunas funciones que sólo se pueden realizar (o que son más eficientes o precisas) en tiempo de ejecución, por ejemplo, algunos errores lógicos, verificación de límites de matriz, verificación de tipos dinámicos, manejo de excepciones y posiblemente funcionalidad de depuración. Por esta razón, algunos errores de programación no se descubren hasta que el programa se prueba en un entorno "en vivo" con datos reales, a pesar de las sofisticadas comprobaciones en tiempo de compilación y las pruebas previas al lanzamiento. En este caso, el usuario final puede encontrar un mensaje de error de tiempo de ejecución.

Por lo general, la biblioteca en tiempo de ejecución realiza muchas funciones accediendo al sistema operativo. Muchos lenguajes de programación tienen funciones integradas que no necesariamente tienen que implementarse en el compilador, pero pueden implementarse en la biblioteca en tiempo de ejecución. Por lo tanto, el límite entre la biblioteca en tiempo de ejecución y la biblioteca estándar depende del fabricante del compilador. Por lo tanto, una biblioteca en tiempo de ejecución es siempre específica del compilador y de la plataforma.

El concepto de biblioteca en tiempo de ejecución no debe confundirse con una biblioteca de programas ordinaria como la creada por un programador de aplicaciones o entregada por un tercero o una biblioteca dinámica, es decir, una biblioteca de programas vinculada en tiempo de ejecución. Por ejemplo, el lenguaje de programación C requiere sólo una biblioteca de tiempo de ejecución mínima (comúnmente llamada crt0) pero define una biblioteca estándar grande (llamada biblioteca estándar C) que cada implementación debe entregar.

fantagons avatar Dec 21 '2012 09:12 fantagons

Yo mismo me lo pregunté y estuve doliendo mi cerebro durante algunas horas. Todavía no encontré nada que realmente tenga sentido. Todo el que escribe algo sobre un tema no puede realmente "enseñar". Si desea enseñarle a alguien, utilice el lenguaje más básico que la persona comprenda, de modo que no tenga que preocuparse por otros temas cuando maneje un tema. Así que llegué a una conclusión que parece encajar bien en todo este caos.

En el lenguaje de programación C, cada programa comienza con la main()función. Otros lenguajes pueden definir otras funciones donde comienza el programa. Pero un procesador no conoce el main(). Un procesador sólo conoce comandos predefinidos, representados por combinaciones de 0y 1.

En la programación de microprocesadores, al no tener un sistema operativo subyacente (Microsoft Windows, Linux, MacOS,...), es necesario decirle explícitamente al procesador por dónde empezar configurando el ProgramCounter(PC) que itera y salta (bucles, llamadas a funciones) dentro del Comandos conocidos por el procesador. Necesita saber qué tan grande es la RAM, necesita establecer la posición de la pila del programa (variables locales), así como la posición del montón (variables dinámicas) y la ubicación de las variables globales (supongo que se llamaba SSA ?) dentro de la RAM. Un único procesador sólo puede ejecutar un programa a la vez.

Ahí es donde entra en juego el sistema operativo. El sistema operativo en sí es un programa que se ejecuta en el procesador. Un programa que permite la ejecución de código personalizado. Ejecuta múltiples programas a la vez cambiando entre los códigos de ejecución de los programas (que se cargan en la RAM). Pero el sistema operativo ES UN PROGRAMA, cada programa está escrito de manera diferente. Simplemente poner el código de su programa personalizado en la RAM no lo ejecutará, el sistema operativo no lo sabe. Debe llamar funciones en el sistema operativo que registra su programa, decirle al sistema operativo cuánta memoria necesita el programa, dónde se encuentra el punto de entrada al programa (la main()función en el caso de C). Y esto es lo que supongo que se encuentra dentro de la Biblioteca de tiempo de ejecución y explica por qué se necesita una biblioteca especial para cada sistema operativo, porque estos son solo programas en sí mismos y tienen diferentes funciones para hacer estas cosas.

Esto también explica por qué NO está vinculado dinámicamente en tiempo de ejecución como lo .dllestán los archivos, incluso si se llama Biblioteca RUNTIME. La biblioteca en tiempo de ejecución debe estar vinculada estáticamente, ya que es necesaria al iniciar su programa. La biblioteca en tiempo de ejecución inyecta/conecta su programa personalizado a otro programa (el sistema operativo) en TIEMPO DE EJECUCIÓN. Esto realmente causa algo de dolor cerebral...

Conclusión: La biblioteca RUNTIME falla al nombrar. Es posible que no hubiera habido .dll(un enlace en tiempo de ejecución) en los primeros tiempos y la cuestión de comprender la diferencia simplemente no existía. Pero aunque esto sea cierto, el nombre está mal elegido.

Mejores nombres para la biblioteca en tiempo de ejecución podrían ser: StartupLibrary/OSEntryLibrary/SystemConnectLibrary/OSConnectLibrary

Espero haberlo hecho bien, pendiente de corrección/ampliación. salud.

Rumble avatar Feb 21 '2017 05:02 Rumble

C es un lenguaje y, en su definición, no es necesario que haya funciones disponibles. Sin IO, sin rutinas matemáticas, etc. Por convención, hay un conjunto de rutinas disponibles que puede vincular a su ejecutable, pero no es necesario utilizarlas. Sin embargo, esto es algo tan común que la mayoría de los enlazadores ya no le piden que se vincule a las bibliotecas de tiempo de ejecución de C.

Hay ocasiones en las que no los desea; por ejemplo, al trabajar con sistemas integrados, puede resultar poco práctico tener malloc, por ejemplo. Solía ​​​​trabajar integrando PostScript en impresoras y teníamos nuestro propio conjunto de bibliotecas de tiempo de ejecución que eran mucho más adecuadas en sistemas integrados, por lo que no nos molestamos con el "estándar".

plinth avatar May 04 '2010 14:05 plinth