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

158

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

OK, entiendo eso, pero por ejemplo, ¿qué hay dentro 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 biblioteca estándar de C funcionará en win32?

B.Gen.Jack.O.Neill
fuente

Respuestas:

71

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 de "lanzamiento" de tres tipos básicos de bibliotecas: de un solo subproceso (siempre enlazado estáticamente), de subprocesos enlazados estáticamente y de subprocesos enlazados dinámicamente (aunque, dependiendo de la versión del compilador que esté usando, algunos de ellos pueden no estar presentes).

Entonces, en el nombre "libcmt", "libc" es el nombre tradicional (más o menos) para la biblioteca C. El "mt" significa "multihilo". Una versión de "depuración" tendría una "d" agregada al final, dando "libcmtd".

En cuanto a qué funciones incluye, el estándar C (parte 7, si le importa) define un conjunto de funciones que debe proporcionar una implementación conforme (alojada). La mayoría de los proveedores (incluido Microsoft) agregan varias 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 no normalmente por el usuario final.

Si desea obtener una lista completa de las funciones en "libcmt" (para usar su ejemplo), puede abrir una de las instrucciones de comando de Visual Studio (en "Herramientas de Visual Studio", normalmente), cambie 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 de objetos en esa biblioteca. Esos no siempre corresponden directamente a los nombres de las funciones, pero generalmente darán una idea. Si desea ver un archivo de objeto en particular, puede usar lib -extractpara extraer uno de esos archivos de objeto, luego usar dumpbin /symbols <object file name>para encontrar qué función (es) está (n) en ese archivo de objeto en particular.

Jerry Coffin
fuente
37
¡No has dicho qué es la "biblioteca de tiempo de ejecución C"!
onmyway133
44
@entropy: Claro que me parece como lo hice, pero la respuesta corta es que es una colección de funciones, muchas (pero no necesariamente todas) de las cuales se especifican en la parte 7 del estándar C.
Jerry Coffin
3
Esta respuesta implica que las bibliotecas C son solo parte de las cadenas de herramientas del compilador. No es correcto.
jiggunjer
@JerryCoffin Pregunta: ¿la strcpyfunción de la biblioteca estándar de C, por ejemplo, tendría su implementación en la biblioteca de tiempo de ejecución, o simplemente tendría su código en archivos .c normales?
forumulator
@forumulator: normalmente habrá código fuente en un archivo .c que se compila para producir la biblioteca estándar propiamente dicha (el ..dll, lib, .a, .so, o lo que sea que se aplique al sistema que está usando) .
Jerry Coffin
57

Al principio, debemos entender qué es una biblioteca de tiempo de ejecución; y piense en lo que 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 podría actualizarse.

Cuando un compilador traduce el código fuente de un programa de computadora al idioma de destino respectivo, causaría una ampliación extrema del código del programa si cada comando en el programa y cada llamada a una función incorporada causara la generación in situ del código de programa respectivo completo en el idioma de destino cada vez. En cambio, el compilador a menudo usa funciones auxiliares específicas del compilador en la biblioteca de tiempo de ejecución que en su mayoría no son accesibles para los programadores de aplicaciones. Dependiendo del fabricante del compilador, la biblioteca de tiempo de ejecución a veces también contendrá la biblioteca estándar del compilador respectivo o estará contenida en ella.

Además, algunas funciones que solo se pueden realizar (o son más eficientes o precisas) en tiempo de ejecución se implementan en la biblioteca de tiempo de ejecución, por ejemplo, algunos errores lógicos, verificación de límites de matriz, verificación de tipo dinámico, 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 la sofisticada verificación en tiempo de compilación y las pruebas previas al lanzamiento. En este caso, el usuario final puede encontrar un mensaje de error en tiempo de ejecución.

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

El concepto de una 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 solo 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
fuente
3
La oración resaltada como una forma de distinguir de la biblioteca estándar es la primera respuesta concisa y precisa que he visto no calificada con "la mayoría" o "a veces".
nik.shornikov
@ nik.shornikov: Eso se debe a que otras descripciones intentan ser más precisas. Aunque es cierto que una biblioteca estándar es típicamente específica para un compilador y una plataforma, eso no siempre es cierto. Solo por ejemplo, al menos algunas versiones de Mingw y el compilador C ++ de Intel para Windows han utilizado la biblioteca estándar de Microsoft en lugar de suministrar la suya. Del mismo modo, Clang en Linux puede instalarse (y a menudo lo está) para usar la biblioteca estándar en una instalación existente de gcc en lugar de instalar otra por sí misma.
Jerry Coffin
Estoy razonablemente seguro de que es posible escribir implementaciones de las bibliotecas estándar C y C ++ que son portátiles en cualquier plataforma que admita POSIX.
Jerry Coffin
21

Solo pregunté esto y me lastimé el cerebro durante algunas horas. Todavía no encontré nada que realmente haga un punto. Todos los que escriben algo sobre un tema no pueden realmente "enseñar". Si desea enseñar a alguien, tome el lenguaje más básico que una persona entienda, para 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 idiomas pueden definir otras funciones donde se inicia el programa. Pero un procesador no conoce el main(). Un procesador solo 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, ..), debe decirle explícitamente al procesador dónde comenzar configurando la ProgramCounter(PC) que itera y salta (bucles, llamadas de función) dentro del comandos conocidos por el procesador. Debe saber qué tan grande es la RAM, debe 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 solo puede ejecutar un programa a la vez.

Ahí es donde entra 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 a las funciones del 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 (elmain()función en caso de C). Y esto es lo que supongo que se encuentra dentro de Runtime Library, y explica por qué 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 .dll están los archivos, incluso si se llama Biblioteca RUNTIME. La biblioteca de tiempo de ejecución debe estar vinculada estáticamente, porque se necesita al inicio de su programa. Runtime Library inyecta / conecta su programa personalizado en / a otro programa (el sistema operativo) en tiempo de ejecución. Esto realmente causa algo de cerebro ...

Conclusión: la biblioteca RUNTIME es un error al nombrar. Puede que no haya habido un.dll (enlace en tiempo de ejecución) en los primeros tiempos y el problema de comprender la diferencia simplemente no existía. Pero incluso si esto es cierto, el nombre está mal elegido.

Los mejores nombres para Runtime Library podrían ser: StartupLibrary / OSEntryLibrary / SystemConnectLibrary / OSConnectLibrary

Espero haberlo hecho bien, para corrección / expansión. salud.

Retumbar
fuente
1
Todavía no entiendo la ideia. ¿Por qué un programa necesita algo en tiempo de ejecución? ¿Por qué el código binario no puede ejecutarse, 100% solo, sin nada que lo admita en tiempo de ejecución? O en otras palabras: ¿es posible tener un código que se ejecute al 100% sin nada (incluido el sistema operativo)?
MarcioAB
55
En teoría, un programa no necesita un RTL. Sin embargo, ¿cómo mostrará su programa su resultado o tomará alguna entrada o solicitará memoria sin alguna cooperación del sistema operativo?
SN
16

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

Hay momentos en que no los quiere, por ejemplo, al trabajar con sistemas integrados, puede ser poco práctico tener malloc, por ejemplo. Solía ​​trabajar en la inserción de PostScript en impresoras y teníamos nuestro propio conjunto de bibliotecas de tiempo de ejecución que eran mucho más felices en los sistemas integrados, por lo que no nos molestamos con el "estándar".

pedestal
fuente
11
En realidad, los estándares C describen dos tipos de entornos C: "independientes" y "alojados", y, en los entornos alojados, las funciones descritas en los estándares se definen como disponibles. En los sistemas embebidos, el entorno C suele ser independiente, por lo que es posible que no tenga las rutinas de la biblioteca o que pueda evitar usar algunas y usar sus propios reemplazos.
10

La biblioteca de tiempo de ejecución es esa biblioteca que se compila automáticamente para cualquier programa C que ejecute. La versión de la biblioteca que usaría depende de su compilador, plataforma, opciones de depuración y opciones de subprocesamiento múltiple.

Una buena descripción de las diferentes opciones para las bibliotecas de tiempo de ejecución: http://www.davidlenihan.com/2008/01/choosing_the_correct_cc_runtim.html

Incluye aquellas funciones que normalmente no considera que necesitan una biblioteca para llamar:

  • malloc
  • enum, struct
  • abs, min
  • afirmar

Microsoft tiene una buena lista de sus funciones de biblioteca en tiempo de ejecución:

http://msdn.microsoft.com/en-us/library/2aza74he(VS.71).aspx

La lista exacta de funciones variará según el compilador, por lo que para iOS obtendrá otras funciones como dispatch_async () o NSLog ().

arinmorf
fuente
1
¿Es struct y enum realmente una biblioteca de tiempo de ejecución?
Dean P
6

Si utiliza una herramienta como Dependency Walker en un ejecutable compilado de C o C ++, verá que una de las DLL de las que depende es MSVCRT.DLL. Esta es la Biblioteca de Microsoft C Runtime. Si examina más a fondo MSVCRT.DLL con DW, verá que aquí es donde viven todas las funciones como printf (), put (0, gets (), atoi () etc.


fuente
66
Solo si al compilar ese ejecutable, el tiempo de ejecución de C se vinculó dinámicamente. Si estaba vinculado estáticamente, el caminante de dependencia mostrará nada
Eli Bendersky
4

Creo que la definición de Microsoft realmente significa:

La implementación de Microsoft de la biblioteca estándar de tiempo de ejecución C proporciona ...

Andrey
fuente
3

Hay tres formas de la biblioteca de tiempo de ejecución C que se proporciona con el SDK de Win32:

* LIBC.LIB is a statically linked library for single-threaded programs.
* LIBCMT.LIB is a statically linked library that supports multithreaded programs.
* CRTDLL.LIB is an import library for CRTDLL.DLL that also supports multithreaded programs. CRTDLL.DLL itself is part of Windows NT. 

La edición de Microsoft Visual C ++ de 32 bits también contiene estas tres formas, sin embargo, el CRT en una DLL se llama MSVCRT.LIB. La DLL es redistribuible. Su nombre depende de la versión de VC ++ (es decir, MSVCRT10.DLL o MSVCRT20.DLL). Sin embargo, tenga en cuenta que MSVCRT10.DLL no es compatible con Win32s, mientras que CRTDLL.LIB es compatible con Win32s. MSVCRT20.DLL viene en dos versiones: una para Windows NT y la otra para Win32s.

ver: http://support.microsoft.com/?scid=kb%3Ben-us%3B94248&x=12&y=9

Miguel
fuente