C (lenguaje de programación), 2ª Parte, Tokens – Interfaz con el sistema operativo

C-gods-programming-language
C, God’s programming language (image, logo).

Tokens. Existen seis clases de componentes sintácticos o tokens en el vocabulario del lenguaje C: palabras clave, identificadores, constantes, cadenas de caracteres, operadores y separadores. Los separadores –uno o varios espacios en blanco, tabuladores, caracteres de nueva línea (denominados “espacios en blanco” en conjunto), y también los comentarios escritos por el programador– se emplean para separar los demás tokens; por lo demás son ignorados por el compilador. El compilador descompone el texto fuente o programa en cadauno de sus tokens, y a partir de esta descomposición genera el código objeto correspondiente. El compilador ignora también los sangrados al comienzo de las líneas.

PALABRAS CLAVE DEL C. En C, como en cualquier otro lenguaje, existen una serie de palabras clave (keywords) que el usuario no puede utilizar como identificadores (nombres de variables y/o de funciones). Estas palabras sirven para indicar al computador que realice una tarea muy determinada (desde evaluar una comparación, hasta definir el tipo de una variable) y tienen un especial significado para el compilador. El C es un lenguaje muy conciso, con muchas menos palabras clave que otros lenguajes. A continuación se presenta la lista de las 32 palabras clave del ANSI C, para las que más adelante se dará detalle de su significado (algunos compiladores añaden otras palabras clave, propias de cada uno de ellos. Es importante evitarlas como identificadores):

palablas_clave_ANSI_C
Palablas Clave ANSI C.

IDENTIFICADORES. Ya se ha explicado lo que es un identificador: un nombre con el que se hace referencia a una función o al contenido de una zona de la memoria (variable). Cada lenguaje tiene sus propias reglas respecto a las posibilidades de elección de nombres para las funciones y variables. En ANSI C estas reglas son las siguientes:

  • Un identificador se forma con una secuencia de letras (minúsculas de la a a la z; mayúsculas de la A a la Z; y dígitos del 0 al 9).
  • El carácter subrayado o underscore (_) se considera como una letra más.
  • Un identificador no puede contener espacios en blanco, ni otros caracteres distintos de los citados, como por ejemplo (*,;.:-+, etc.).
  • El primer carácter de un identificador debe ser siempre una letra o un (_), es decir, no puede ser un dígito.
  • Se hace distinción entre letras mayúsculas y minúsculas. Así, Masa es considerado como un identificador distinto de masa y de MASA.
  • ANSI C permite definir identificadores de hasta 31 caracteres de longitud.
    Ejemplos de identificadores válidos son los siguientes:
    tiempo, distancia1, caso_A, PI, velocidad_de_la_luz
    Por el contrario, los siguientes nombres no son válidos (¿Por qué?)
    1_valor, tiempo-total, dolares$, %final

En general es muy aconsejable elegir los nombres de las funciones y las variables de forma que permitan conocer a simple vista qué tipo de variable o función representan, utilizando para ello tantos caracteres como sean necesarios. Esto simplifica enormemente la tarea de programación y –sobre todo– de corrección y mantenimiento de los programas. Es cierto que los nombres largos son más laboriosos de teclear, pero en general resulta rentabletomarse esa pequeña molestia.

CONSTANTES. Las variables pueden cambiar de valor a lo largo de la ejecución de un programa, o bien en ejecuciones distintas de un mismo programa. Además de variables, un programa utiliza también constantes, es decir, valores que siempre son los mismos. Un ejemplo típico es el número p, que vale 3.141592654. Este valor, con más o menos cifras significativas, puede aparecer muchas veces en las sentencias de un programa. En C existen distintos tipos de constantes:

  • Constantes numéricas. Son valores numéricos, enteros o de punto flotante. Se permiten también constantes octales (números enteros en base 8) y hexadecimales (base 16).
  • Constantes carácter. Cualquier carácter individual encerrado entre apóstrofos (tal como ‘a’, ‘Y’, ‘)’, ‘+’, etc.) es considerado por C como una constante carácter, o en realidad como un número entero pequeño (entre 0 y 255, o entre -128 y 127, según los sistemas). Existe un código, llamado código ASCII, que establece una equivalencia entre cada carácter y un valor numérico correspondiente.
  • Cadenas de caracteres. Un conjunto de caracteres alfanuméricos encerrados entre comillas es también un tipo de constante del lenguaje C, como por ejemplo: “espacio”,”Esto es una cadena de caracteres”, etc.
  • Constantes simbólicas. Las constantes simbólicas tienen un nombre (identificador) y 4en esto se parecen a las variables. Sin embargo, no pueden cambiar de valor a lo largo de la ejecución del programa. En C se pueden definir mediante el preprocesador o por medio de la palabra clave const. En C++ se utiliza preferentemente esta segunda forma. Más adelante se verán con más detalle estos distintos tipos de constantes, así como lasconstantes de tipo enumeración.

OPERADORES. Los operadores son signos especiales –a veces, conjuntos de dos caracteres– que indican determinadas operaciones a realizar con las variables y/o constantes sobre las que actúan en el programa. El lenguaje C es particularmente rico en distintos tipos de operadores: aritméticos (+, -, *, /, %), de asignación (=, +=, -=, *=, /=), relacionales (==, , =, !=), lógicos (&&, ||, !) y otros. Por ejemplo, en la sentencia: espacio = espacio_inicial + 0.5 * aceleracion * tiempo * tiempo; aparece un operador de asignación (=) y dos operadores aritméticos (+ y *). También los operadores serán vistos con mucho más detalle en apartados posteriores.

SEPARADORES. Como ya se ha comentado, los separadores están constituidos por uno o varios espacios en blanco, tabuladores, y caracteres de nueva línea. Su papel es ayudar al compilador a descomponer el programa fuente en cada uno de sus tokens. Es conveniente introducir espacios en blanco incluso cuando no son estrictamente necesarios, con objeto de mejorar la legibilidad de los programas.

COMENTARIOS. El lenguaje C permite que el programador introduzca comentarios en los ficheros fuente que contienen el código de su programa. La misión de los comentarios es servir de explicación o aclaración sobre cómo está hecho el programa, de forma que pueda ser entendido por una persona diferente (o por el propio programador algún tiempo después). Los comentarios son también particularmente útiles (y peligrosos…) cuando el programa forma parte de un examen que el profesor debe corregir. El compilador ignora por completo los comentarios.

Los caracteres (/*) se emplean para iniciar un comentario introducido entre el código del programa; el comentario termina con los caracteres (*/). No se puede introducir un comentario dentro de otro. Todo texto introducido entre los símbolos de comienzo (/*) y final (*/) de comentario son siempre ignorados por el compilador. Por ejemplo:

variable_1 = variable_2; /* En esta línea se asigna a variable_1 el valor contenido en variable_2 */

Los comentarios pueden actuar también como separadores de otros tokens propios del lenguaje C. Una fuente frecuente de errores –no especialmente difíciles de detectar– al programar en C, es el olvidarse de cerrar un comentario que se ha abierto previamente.

El lenguaje ANSI C permite también otro tipo de comentarios, tomado del C++. Todo lo que va en cualquier línea del código detrás de la doble barra (//) y hasta el final de la línea, se considera como un comentario y es ignorado por el compilador. Para comentarios cortos, esta forma es más cómoda que la anterior, pues no hay que preocuparse de cerrar el comentario (el fin de línea actúa como cierre). Como contrapartida, si un comentario ocupa varias líneas hay que repetir la doble barra (//) en cada una de las líneas. Con este segundo procedimiento de introducir comentarios, el último ejemplo podría ponerse en la forma:

variable_1 = variable_2; // En esta línea se asigna a

// variable_1 el valor

// contenido en variable_2

Lenguaje C. En las páginas anteriores ya han ido apareciendo algunas características importantes del lenguaje C. En realidad, el lenguaje C está constituido por tres elementos: el compilador, el preprocesador y la librería estándar. A continuación se explica brevemente en qué consiste cada uno de estos elementos.

COMPILADOR. El compilador es el elemento más característico del lenguaje C. Como ya se ha dicho anteriormente, su misión consiste en traducir a lenguaje de máquina el programa C contenido en uno o más ficheros fuente. El compilador es capaz de detectar ciertos errores durante el proceso de compilación, enviando al usuario el correspondiente mensaje de error.

PREPROCESADOR. El preprocesador es un componente característico de C, que no existe en otros lenguajes de programación. El preprocesador actúa sobre el programa fuente, antes de que empiece la compilación propiamente dicha, para realizar ciertas operaciones. Una de estas operaciones es, por ejemplo, la sustitución de constantes simbólicas. Así, es posible que un programa haga uso repetidas veces del valor 3.141592654, correspondiente al número p. Es posible definir una constante simbólica llamada PI que se define como 3.141592654 al comienzo del programa y se introduce luego en el código cada vez que hace falta. En realidad PI no es una variable con un determinado valor: el preprocesador chequea todo el programa antes de comenzar la compilación y sustituye el texto PI por el texto 3.141592654 cada vez que lo encuentra. Las constantes simbólicas suelen escribirse completamente con mayúsculas, para distinguirlas de las variables.

El preprocesador realiza muchas otras funciones que se irán viendo a medida que se vaya explicando el lenguaje. Lo importante es recordar que actúa siempre por delante del compilador (de ahí su nombre), facilitando su tarea y la del programador.

LIBRERÍA ESTÁNDAR. Con objeto de mantener el lenguaje lo más sencillo posible, muchas sentencias que existen en otros lenguajes, no tienen su correspondiente contrapartida en C. Por ejemplo, en C no hay sentencias para entrada y salida de datos. Es evidente, sin embargo, que ésta es una funcionalidad que hay que cubrir de alguna manera. El lenguaje C lo hace por medio de funciones preprogramadas que se venden o se entregan junto con el compilador. Estas funciones están agrupadas en un conjunto de librerías de código objeto, que constituyen la llamada librería estándar del lenguaje. La llamada a dichas funciones se hace como a otras funciones cualesquiera, y deben ser declaradas antes de ser llamadas por el programa (más adelante se verá cómo se hace esto por medio de la directiva del preprocesador #include).

Ficheros. El código de cualquier programa escrito en C se almacena en uno o más ficheros, en el disco del ordenador. La magnitud del programa y su estructura interna determina o aconseja sobre el número de ficheros a utilizar. Como se verá más adelante, la división de un programa en varios ficheros es una forma de controlar su manejo y su modularidad. Cuando los programas son pequeños (hasta 50»100 líneas de código), un solo fichero suele bastar. Para programas más grandes, y cuando se quiere mantener más independencia entre los distintos subprogramas, es conveniente repartir el código entre varios ficheros.

Recuérdese además que cada vez que se introduce un cambio en el programa hay que volver a compilarlo. La compilación se realiza a nivel de fichero, por lo que sólo los ficheros modificados deben ser compilados de nuevo. Si el programa está repartido entre varios ficheros pequeños esta operación se realiza mucho más rápidamente.

Recuérdese también que todos los ficheros que contienen código fuente en C deben terminar con la extensión (.c), como por ejemplo: producto.c, solucion.c, etc.

Lectura y escritura de datos. La lectura y escritura (o entrada y salida) de datos se realiza por medio de llamadas a funciones de una librería que tiene el nombre de stdio (standard input/output). Las declaraciones de las funciones de esta librería están en un fichero llamado stdio.h. Se utilizan funciones diferentes para leer datos desde teclado o desde disco, y lo mismo para escribir resultados o texto en la pantalla, en la impresora, en el disco, etc.

Es importante considerar que las funciones de entrada y salida de datos son verdaderas funciones, con todas sus características: nombre, valor de retorno y argumentos.

Interfaz con el sistema operativo. Hace algún tiempo lo más habitual era que el compilador de C se llamase desde el entorno del sistema operativo MS-DOS, y no desde Windows. Ahora los entornos de trabajo basados en Windows se han generalizado, y el MS-DOS está en claro restroceso como entorno de desarrollo. En cualquier caso, la forma de llamar a un compilador varía de un compilador a otro, y es necesario disponer de los manuales o al menos de cierta información relativa al compilador concreto que se esté utilizando.

De ordinario se comienza escribiendo el programa en el fichero fuente correspondiente (extensión .c) por medio de un editor de texto. MS-DOS dispone de un editor estándar llamado edit que puede ser utilizado con esta finalidad. En Windows 3.1 o Windows 95 puede utilizarse Notepad.

Existen también entornos de programación más sofisticados que se pueden utilizar desde Windows, como por ejemplo el Visual C++ de Microsoft, o el C++ de Borland. Estos programas ofrecen muchas más posibilidades que las de un simple compilador de ANSI C. En cualquier caso, lo que hay que hacer siempre es consultar el manual correspondiente al compilador que se vaya a utilizar. Estos sistemas disponen de editores propios con ayudas suplementarias para la programación, como por ejemplo criterios de color para distinguir las palabras clave del lenguaje C.

Dejo un pequeña galería:

Un Saludo.

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s