¿Existe una distinción significativa entre implementaciones independientes y alojadas?
c99 c11 (2)
La pregunta que tengo está relacionada principalmente con la sección cuatro, párrafo seis .
Las dos formas de implementación conforme son alojadas e independientes. Una implementación hospedada conforme deberá aceptar cualquier programa estrictamente conforme.
Según tengo entendido, esto constituye el entorno de aplicación típico, con sistemas de archivos, memoria asignada y subprocesos ...
Una implementación independiente conforme deberá aceptar cualquier programa estrictamente conforme en el que el uso de las características especificadas en la cláusula de la biblioteca (cláusula 7) se limite al contenido de los encabezados estándar
<float.h>
,<iso646.h>
,<limits.h>
,<stdalign.h>
,<stdarg.h>
,<stdbool.h>
,<stddef.h>
,<stdint.h>
y<stdnoreturn.h>
.
... y esto constituye el núcleo típico y / o el entorno mínimo incrustado que no tiene sistemas de archivos estándar, memoria asignada o subprocesos (entre otras cosas).
Una implementación conforme puede tener extensiones (incluidas funciones de biblioteca adicionales), siempre que no alteren el comportamiento de ningún programa estrictamente conforme.
Parece que esto le da a una implementación alojada la libertad de llamarse a sí misma una implementación alojada o independiente, y cuando se trata de sistemas de archivos, memoria asignada o subprocesos (entre otras cosas), estos pueden caer en la categoría de extensión para que simplemente pueda implementar Una interfaz que devuelve un valor que indica errores cada vez. Sólo para nombrar unos pocos:
-
fopen
,fgets
ymalloc
pueden devolverNULL
-
fprintf
,fscanf
,fputc
yfgetc
pueden devolverEOF
-
thrd_create
puede devolverthrd_error
(lo que indica que "la solicitud no se pudo cumplir")
Esto implica que la distinción que se da en la sección cuatro, párrafo seis, no tiene prácticamente sentido. ¿Hay algún requisito que garantice algún nivel real de funcionalidad para estas funciones en implementaciones alojadas e independientes? Por ejemplo, ¿se requiere que esas funciones anteriores puedan devolver algo distinto de sus valores de falla correspondientes?
El párrafo citado ya lo dice bastante bien.
Un entorno de ejecución alojado también es independiente, pero no al revés. Un compilador solo necesita proporcionar una implementación independiente. gcc, por ejemplo, es estrictamente hablando solo independiente, ya que la biblioteca estándar no está incluida. Sin embargo, se supone que está disponible al compilar para un entorno alojado (el valor predeterminado), suponiendo que la lib esté disponible en el sistema (como glibc). Ver here
En pocas palabras, independiente es solo el idioma. No es necesario admitir ninguna biblioteca y solo unos pocos encabezados (principalmente para tipos comunes y cosas específicas de implementación como límites numéricos, etc.). Esto implica que la biblioteca estándar no necesita existir, ni tampoco los encabezados correspondientes. La razón es un entorno independiente que probablemente no tendrá instalaciones como archivos, pantallas, etc. Se utiliza para núcleos, incrustaciones de metal desnudo, etc.
Tenga en cuenta que, por ejemplo, gcc, si compila para un entorno alojado (
-fhosted
), asumirá que las funciones utilizadas en la biblioteca estándar tienen el significado correspondiente y podrían aplicar optimizaciones muy agresivas (tiene muchas de esas funciones integradas).
Para independiente, en realidad no lo hace, por lo que puede usar una función
strcmp
por ejemplo, con una semántica completamente diferente.
Sin embargo, supone que las funciones mem ...- existen, ya que se utilizan para el código normal, por ejemplo, la asignación de estructura.
Por lo tanto, si está construyendo para metal desnudo, siempre debe pasar
-ffreestanding
.
Si una implementación alojada se llama a sí misma independiente , obviamente ya no es una implementación alojada . Sin embargo, una vez que se llama a sí mismo alojado , tiene que proporcionar todas las facilidades requeridas por el estándar y no solo se le permite implementar dummies, sino que debe proporcionar la semántica como se define en el estándar.
Solo para aclararlo: la sección citada permite que un entorno independiente omita todas las funciones de la biblioteca, excepto los pocos encabezados enumerados. Por lo tanto, puede suministrar cualquier otra biblioteca y usar los mismos nombres, pero haga lo que quiera. Como esa no sería la biblioteca estándar, no hay necesidad de cumplimiento.
5.1.2.1
establece además que "Cualquier instalación de biblioteca disponible para un programa independiente, que no sea el conjunto mínimo requerido por la cláusula 4, está definida por la implementación".
Eso apoya mi declaración.
Nota al margen: tampoco requiere
main()
como punto de entrada al programa.
Existen muchos tipos de implementaciones de C, dirigidas a muchos tipos de plataformas de ejecución diferentes, muchas de las cuales pueden proporcionar una variedad de características útiles y garantías que otros no pueden. Los autores del Estándar decidieron que, en la mayoría de los casos, debería ser suficientemente obvio qué tipo de características y garantías deberían proporcionar las implementaciones dirigidas a diversas plataformas y campos de aplicación, y cómo deberían proporcionarse, que no habría necesidad de tener un estándar preocuparse por tales detalles. Por otro lado, la cantidad de aplicaciones que requerirían cosas como E / S de archivos y la cantidad de plataformas que podrían proporcionarlas fueron suficientes para justificar el reconocimiento como "especiales" de aquellas implementaciones que incluían tales características.
En general, las implementaciones diseñadas para uso independiente se podrán utilizar en plataformas que no podrían manejar de manera útil una implementación alojada. Si bien el Estándar impone algunos requisitos más allá de lo que sería práctico en algunas de las plataformas C más pequeñas, algunas implementaciones de C casi conformes pueden emplearse de manera bastante útil en procesadores con solo suficiente almacenamiento para contener 256 instrucciones y 16 bytes de variables. Si algo como un dispositivo de termómetro / temporizador digital de cocina no tiene un sistema de archivos o una consola, ¿por qué debería desperdiciar el almacenamiento en cosas como descriptores para stdout?
Además, debido a que el Estándar no define ningún medio estándar por el cual las aplicaciones independientes pueden realizar E / S, y debido a que las diferentes plataformas manejan las E / S de manera diferente, las aplicaciones independientes se orientarán a una plataforma o rango de plataformas objetivo particular. Una implementación alojada que no exponga las características naturales o las garantías que proporcionaría la plataforma subyacente podría ser útil para ejecutar programas que no requieren tales características o garantías. Sin embargo, no es posible que un programa incrustado haga mucho de nada sin usar características y garantías específicas de la plataforma, y por lo tanto, una implementación independiente que no permitiera el acceso de un programador a tales cosas sería incapaz de hacer mucho. Las implementaciones de calidad deberían permitir a los programadores usar cualquier característica o garantía que pueda ayudarlos a lograr lo que necesitan hacer, aunque algunas pueden requerir el uso de opciones de compilación para asegurarse de que no hagan nada raro. Por alguna razón, se ha puesto de moda considerar una decisión del Comité de Estándares de que podría haber algunas implementaciones y campos de aplicación donde el valor de una característica o garantía no justificaría el costo, como una indicación de que los programadores no deben esperar implementaciones Proporcionar una característica o garantía que sería útil en la programación de bajo nivel y que la plataforma proporcionaría como costo esencialmente cero.