En el próximo ejemplo, el programa utiliza el proveedor profile de DTrace para implementar un contador simple basado en tiempo. El proveedor de perfiles (profile) puede crear nuevos sondeos basados en las descripciones que se encuentran en el programa D. Si crea un sondeo con el nombre profile:::tick-n sec para algún entero n, el proveedor de perfiles (profile) creará un sondeo que se activa cada n segundos. Escriba el siguiente código fuente y guárdelo en un archivo con el nombre counter.d:
/* * Count off and report the number of seconds elapsed */ dtrace:::BEGIN { i = 0; } profile:::tick-1sec { i = i + 1; trace(i); } dtrace:::END { trace(i); }
Al ejecutarlo, el programa cuenta el número de segundos transcurridos hasta que pulse Control-C y, después, se imprime el total al final:
# dtrace -s counter.d dtrace: script 'counter.d' matched 3 probes CPU ID FUNCTION:NAME 0 25499 :tick-1sec 1 0 25499 :tick-1sec 2 0 25499 :tick-1sec 3 0 25499 :tick-1sec 4 0 25499 :tick-1sec 5 0 25499 :tick-1sec 6 ^C 0 2 :END 6 # |
Las tres primeras líneas del programa son comentarios para explicar las acciones que lleva a cabo el programa. Al igual que en C, C++ y el lenguaje de programación Java, el compilador D omite los caracteres entre los símbolos /* y */. Los comentarios pueden utilizarse en cualquier ubicación de un programa D, incluido dentro y fuera de las cláusulas del sondeo.
La cláusula del sondeo BEGIN define una variable con el nombre i y le asigna el valor de entero cero mediante la instrucción:
i = 0;
A diferencia de C, C++ y el lenguaje de programación de Java, las variables del lenguaje D pueden crearse simplemente utilizándolas en una instrucción del programa; no es necesario utilizar declaraciones de variables explícitas. Cuando se utiliza por primera vez una variable en un programa, el tipo de la variable se define en función del tipo de su primera asignación. Cada variable sólo tiene un tipo durante la duración del programa, por lo que las referencias posteriores deben ajustarse al mismo tipo que la asignación inicial. En counter.d, a la variable i se le asigna primero la constante de entero cero, por lo que su tipo se define como int. D proporciona los mismos tipos de datos de enteros básicos que el lenguaje C, incluidos:
char |
Un carácter o un entero de un sólo byte |
int |
Entero predeterminado |
short |
Entero corto |
long |
Entero largo |
long long |
Entero largo ampliado |
El tamaño de estos tipos depende del modelo de datos del núcleo del sistema operativo, como se describen en el Capítulo 2Tipos, operadores y expresiones. D proporciona también nombres sencillos integrados para tipos de enteros con signo y sin signo de diversos tamaños fijos, así como miles de otros tipos definidos por el sistema operativo.
La parte central de counter.d es la cláusula del sondeo que incrementa el contador i:
profile:::tick-1sec { i = i + 1; trace(i); }
Esta cláusula asigna el nombre profile:::tick-1sec al sondeo, que indica que el proveedor profile va a crear un nuevo sondeo que se activa una vez por segundo en un procesador disponible. La cláusula contiene dos instrucciones, la primera asigna i al valor anterior más uno y la segunda realiza un seguimiento del nuevo valor de i. Todos los operadores aritméticos de C habituales están disponibles en D; puede encontrarse la lista completa en el Capítulo 2Tipos, operadores y expresiones. Al igual que en C, el operador ++ puede utilizarse como abreviatura para incrementar la variable correspondiente en uno. La función trace() utiliza cualquier expresión D como su argumento, por lo que puede escribir counter.d de forma más concisa de la siguiente forma:
profile:::tick-1sec { trace(++i); }
Si desea controlar de forma explícita el tipo de la variable i, puede poner entre paréntesis el tipo que desee al asignarlo para convertir el valor de entero cero en un tipo específico. Por ejemplo, si desea determinar el tamaño máximo de un char en D, puede cambiar la cláusula BEGIN de la siguiente forma:
dtrace:::BEGIN { i = (char)0; }
Después de ejecutar counter.d durante un periodo de tiempo, debe consultar el crecimiento del valor del que se ha realizado un seguimiento y restablecerlo a cero. Si, al restablecer el valor, la espera le resulta demasiado larga, intente cambiar el nombre del sondeo profile por profile:::tick-100msec para hacer que el contador aumente una vez cada 100 milisegundos o 10 veces por segundo.