Guía de seguimiento dinámico de Solaris

Espacios de nombre de tipo

Esta sección analiza los espacios de nombre de D y los problemas de los espacios de nombre relacionados con los tipos. En los lenguajes tradicionales como ANSI-C, la visibilidad de tipo se determina atendiendo a si el tipo está anidado dentro de una función u otra declaración. Los tipos declarados en el ámbito exterior de un programa C están asociados con un espacio de nombre global y son visibles en todo el programa. Los tipos definidos en los archivos de cabecera de C se incluyen normalmente en este ámbito exterior. A diferencia de estos lenguajes, D proporciona acceso a tipos de varios ámbitos exteriores.

D es un lenguaje que facilita la observación dinámica en varias capas de una pila de software, incluido el núcleo del sistema operativo, un conjunto de módulos de núcleo asociados y procesos de usuarios en ejecución en el sistema. Un único programa D puede instanciar sondeos para recopilar datos de varios módulos de núcleo y otras entidades de software que se hayan compilado en objetos binarios independientes. Por tanto, puede haber más de un tipo de datos del mismo nombre, tal vez con distintas definiciones, en el universo de tipos disponibles para DTrace y el compilador de D. Para gestionar esta situación, el compilador de D asocia cada tipo con un espacio de nombre identificado por el objeto de programa que lo contiene. Se puede acceder a los tipos de un objeto de programa concreto especificando el nombre de programa y el operador de ámbito de comilla invertida (`) en cualquier nombre de tipo.

Por ejemplo, si un módulo de núcleo que se llame foo contiene la siguiente declaración de tipo de C:

typedef struct bar {
	int x;
} bar_t;

a continuación, a los tipos struct bar y bar_t se podría acceder desde D utilizando los nombres de tipo:

struct foo`bar				foo`bar_t

El operador de comilla invertida se puede utilizar en cualquier contexto donde sea apropiado un nombre de tipo, incluido cuando se especifica el tipo para las declaraciones de variable de D o expresiones de función en las cláusulas de sondeo de D.

El compilador de D también proporciona dos espacios de nombre de tipo incorporados que utilizan los nombres de C y D respectivamente. El espacio de nombre de tipo de C se rellena inicialmente con los tipos intrínsecos estándar de ANSI-C como int. Además, las definiciones de tipo adquiridas utilizando el preprocesador de C cpp(1) utilizando la opción dtrace -C se procesarán por el ámbito de C y se agregarán al mismo. Como resultado, puede incluir archivos de cabecera de C que contengan las declaraciones de tipo que estén visibles en otro espacio de nombre de tipo sin provocar un error de compilación.

El nombre de espacio de tipo de D se rellena inicialmente con valores intrínsecos de tipo de D como int y string así como los alias de tipo de D incorporados como uint32_t. Cualquier declaración de tipo nuevo que aparezca en el código fuente del programa D se agrega automáticamente al espacio de nombre de tipo de D. Si crea un tipo complejo como struct en el programa D que consista en tipos de miembro de otros espacios de nombre, la declaración copiará los tipos de miembro en el espacio de nombre de D.

Cuando el compilador de D encuentra una declaración de tipo que no especifica un espacio de nombre explícito utilizando el operador de comilla invertida, el compilador busca un conjunto activo de espacios de nombre de tipo para encontrar una coincidencia utilizando el nombre de tipo especificado. El espacio de nombre de C siempre se busca primero, seguido del espacio de nombre de D. Si el nombre de tipo no se encuentra en el espacio de nombre de C o D, los espacios de nombre de tipo de los módulos de núcleo activos se buscan en orden ascendente por el Id. de módulo de núcleo. Esta ordenación garantiza que los objetos binarios que forman el núcleo se buscan antes que cualquier módulo de núcleo cargable, pero no garantiza ninguna propiedad de orden entre los módulos cargables. Deberá utilizar el operador de ámbito al acceder a los tipos definidos en los módulos de núcleo cargables para evitar conflictos de nombres de tipo con otros módulos de núcleo.

El compilador de D utiliza la información de depuración de ANSI-C proporcionada con los módulos de núcleo de Solaris para acceder automáticamente a los tipos asociados con el código fuente del sistema operativo sin necesidad de acceder a los archivos de inclusión de C correspondientes. Es posible que la información de depuración simbólica no esté disponible para todos los módulos de núcleo de su sistema. El compilador de D notificará un error si intenta acceder a un tipo en el espacio de nombre de un módulo que no cuenta con información de depuración de C comprimida prevista para utilizarse con DTrace.