El documento describe elementos básicos de los lenguajes de programación como léxico, sintaxis, constantes, variables y tipos de datos. Explica que el léxico se refiere a la forma visible del lenguaje mientras que la sintaxis describe las combinaciones posibles de símbolos. También define constantes como valores que no cambian durante la ejecución de un programa y variables como espacios en memoria con nombres simbólicos cuyos valores pueden cambiar.
1. 6
Elementos léxicos y sintácticos
Un lenguaje de programación es un idioma artificial diseñado para expresar
computaciones que pueden ser llevadas a cabo por máquinas como las
computadoras. Pueden usarse para crear programas que controlen el
comportamiento físico y lógico de una máquina, para expresar algoritmos con
precisión, o como modo de comunicación humana. Está formado por un conjunto
de símbolos y reglas sintácticas y semánticas que definen su estructura y el
significado de sus elementos y expresiones. Al proceso por el cual se escribe, se
prueba, se depura, se compila y se mantiene el código fuente de un
programa informático se le llama programación.
Dentro de los elementos del lenguaje de programación hablaremos de léxico y
sintaxis.
Léxico
Léxico es un lenguaje de programación didáctico en español que facilita el
aprendizaje y la enseñanza de la programación orientada a objetos.
A la forma visible de un lenguaje de programación se le conoce como sintaxis. La
mayoría de los lenguajes de programación son puramente textuales, es decir,
utilizan secuencias de texto que incluyen palabras, números y puntuación, de
manera similar a los lenguajes naturales escritos. Por otra parte, hay algunos
lenguajes de programación que son más gráficos en su naturaleza, utilizando
relaciones visuales entre símbolos para especificar un programa.
Sintaxis
La sintaxis de un lenguaje de programación describe las combinaciones posibles
de los símbolos que forman un programa sintácticamente correcto. El significado
que se le da a una combinación de símbolos es manejado por su semántica (ya
sea formal o como parte del código duro de la referencia de implementación).
Dado que la mayoría de los lenguajes son textuales, este artículo trata de la
sintaxis textual.
2. 7
La sintaxis de los lenguajes de programación es definida generalmente utilizando
una combinación de expresiones regulares (para la estructura léxico. Este es un
ejemplo de una gramática simple:
expresión ::= átomo | lista
átomo ::= número | símbolo
número ::= [+-]?['0'-'9']+
símbolo ::= ['A'-'Z'<nowiki>'</nowiki>a'-'z'].*
lista ::= '(' expresión* ')'
Constantes
En programación, una constante es un valor que no puede ser alterado durante la
ejecución de un programa. Corresponde a una longitud fija de un área reservada
en la memoria principal del ordenador, donde el programa almacena valores fijos.
El nombre de las constantes suele escribirse en mayúsculas en la mayoría de
lenguajes.
La palabra constante tiene en C++ dos connotaciones sutilmente diferentes
aunque relacionadas:
1.1 La primera es el sentido normal de la palabra constante en lenguaje natural; es
decir, datos (de cualquiera de los tipos posible) cuyos valores se han definido en el
momento de escribir el código del programa, y no pueden ser modificados más
tarde en tiempo de ejecución (lo que significa que sus valores deben ser resueltos
en tiempo de compilación). Dicho en otras palabras: el compilador sabe cuál es el
valor de los objetos declarados como constantes y en base a este conocimiento
puede hacer cuantas suposiciones sean válidas para conseguir la mayor eficiencia
en tiempo de ejecución.
En este sentido, el concepto constante es justamente el opuesto a variable, que
corresponde a aquellos objetos-dato que pueden recibir nuevas asignaciones de
valor a lo largo del programa. Dicho en otras palabras: entidades cuyo valor solo
es conocido en tiempo de ejecución.
1.2 La segunda connotación es la de tipo de objeto-dato. En este sentido podemos
afirmar que en C++ los enteros (variables) forman un tipo distinto de los enteros
3. 8
constantes (constantes enteras), y que los caracteres (variables) forman un tipo
distinto de las constantes carácter. Así pues, distinguimos entre un tipo char y un
tipo const char. Como prácticamente todos los tipos de objeto-dato posibles en
C++ puede declararse constantes, existe un universo de tipos C++, simétrico al de
los tipos de objetos variables, pero de objetos constantes.
Por ejemplo, un entero y una constante entera son tipos distintos y que una
constante entera C++ significa algo más que un entero al que no se le puede
cambiar su valor.
Lo que hace el compilador con los objetos declarados inicialmente como
constantes depende de la implementación. Esto significa que no está garantizado
que tales objetos tengan un Lvalue. Por ejemplo: en const int x = 5; no está
garantizado que el compilador le asigne a x un Lvalue, es decir, un espacio en
memoria determinado (que se permita modificar o no su valor es otra cuestión).
Puede ocurrir que, por razones de eficacia, sea simplemente una especie de
"define". Una especie de nemónico que hace que el compilador lo sustituya por un
5 en cada trozo de código donde aparezca x. Incluso en sitios donde aparezca
asociada a otras constantes puede estar resuelto el valor en tiempo de
compilación. Por ejemplo, si en otro sitio del programa aparece: const int z = 7; y
más tarde: int w = x + z + y; puede ocurrir que el compilador establezca
directamente: int w = 12 + y.
Por esta razón no está garantizado que el operador const_cast funcione con
objetos declarados inicialmente como constantes.
Variable
En programación, una variable está formada por un espacio en el sistema de
almacenaje (memoria principal de un ordenador) y un nombre simbólico
(un identificador) que está asociado a dicho espacio. Ese espacio contiene una
cantidad o información conocida o desconocida, es decir un valor. El nombre de la
variable es la forma usual de referirse al valor almacenado: esta separación entre
nombre y contenido permite que el nombre sea usado independientemente de la
información exacta que representa. El identificador, en el código fuente de la
4. 9
computadora puede estar ligado a un valor durante el tiempo de ejecución y el
valor de la variable puede por lo tanto cambiar durante el curso de la ejecución del
programa. El concepto de variables en computación puede no corresponder
directamente al concepto de variables en matemática. El valor de una variable en
computación no es necesariamente parte de una ecuación o fórmula como en
matemáticas. En computación una variable puede ser utilizada en un proceso
repetitivo: puede asignársele un valor en un sitio, ser luego utilizada en otro, más
adelante reasignársele un nuevo valor para más tarde utilizarla de la misma
manera. Procedimientos de este tipo son conocidos con el nombre de iteración. En
programación de computadoras, a las variables, frecuentemente se le asignan
nombres largos para hacerlos relativamente descriptivas para su uso, mientras
que las variables en matemáticas a menudo tienen nombres escuetos, formados
por uno o dos caracteres para hacer breve en su transcripción y manipulación.
El espacio en el sistema de almacenaje puede ser referido por distintos
identificadores diferentes. Esta situación es conocida entre los angloparlantes
como "aliasing" y podría traducirse como "sobre nombramiento" para los
hispanoparlantes. Asignarle un valor a una variable utilizando uno de los
identificadores cambiará el valor al que se puede acceder a través de los otros
identificadores.
Los compiladores deben reemplazar los nombres simbólicos de las variables con
la real ubicación de los datos. Mientras que el nombre, tipo y ubicación de una
variable permanecen fijos, los datos almacenados en la ubicación pueden ser
cambiados durante la ejecución del programa.
Las variables pueden ser de longitud:
Fija.- Cuando el tamaño de la misma no variará a lo largo de la ejecución del
programa. Todas las variables, sean del tipo que sean tienen longitud fija,
salvo algunas excepciones — como las colecciones de otras variables (arrays)
o las cadenas.
Variable.- Cuando el tamaño de la misma puede variar a lo largo de la
ejecución. Típicamente colecciones de datos.
5. 10
Tipos de datos fundamentals
Datos enteros: char, signed char, unsigned char, short, int, long, unsignet short,
unsigned unsigned long.
Datos reales: float, double long double.
Char indica que se trata de un carácter (una letra mayúscula o minúscula, un
dígito o un carácter especial,…). La palabra int indica que se trata de un
número entero, mientras que float se refiere a un número real (también llamado
de punto o coma flotante). Los números enteros pueden ser positivos o
negativos (signed) o bien esencialmente no negativos (unsigned); los
caracteres tienen un tratamiento muy similar a los enteros y admiten estos
mismos cualificadores. En los datos enteros, las palabras short y long hacen
referencia al número de cifras o rango de dichos números. En los datos reales
las palabras double y long apuntan en esta misma dirección, aunque con un
significado ligeramente diferente.
Caracteres (tipo char)
Las variables carácter (tipo char) contienen un único carácter y se almacenan
en un byte de memoria (8 bits). La declaración de variables tipo carácter
pueden tener forma:
Char nombre;
Char nombre1, nombre 2;
Se puede declarar más de una variable de un tipo determinado en una sola
sentencia. Se puede también inicializar la variable en la declaración. Por
ejemplo, para definir la variable carácter letra y asignarle el valor de a se puede
escribir:
6. 11
Char letra= ‘a’.
Números enteros (tipo int)
De ordinario una variable tipo int se almacena en 2 bytes (16 bits), aunque
algunos compiladores usan 4 bytes. Los compiladores de Microsoft para PCs
utilizan 2 bytes.
Con 16 bits se pueden almacenar 216
=65536 números enteros diferentes de 0
a 65535 para variables sin signo, y de -32768 al 32767 para variables con
signo. Este es el rango de las variables tipo int.
Números enteros (tipo long)
Existe la posibilidad de usar enteros con un rango mayor si se especifica como
tipo long en su declaración
Long int numero_grande;
El rango de un entero long puede variar según el computador o el compilador
que se utilice, pero de ordinario se utilizan 4 bytes (32 bits).
Números reales (tipo float)
En muchas aplicaciones hacen falta variables reales, capaces de representar
magnitudes que contengan una parte entera y una parte fraccionaria o decimal.
Estas variables se llaman también de punto flotante. De ordinario, en base 10 y
con notación científica, estas variables se representan por medio de la mantisa,
que es un número mayor o igual a 0.1 y menor que 1.0, y un exponente que
representa la potencia de 10.
Números reales (tipo double)
7. 12
Las variables tipo float tienen un rango muy limitado, insuficiente para la mayor
parte de los cálculos técnicos y científicos. Este problema se soluciona con el
tipo doublé, que utiliza 8 bytes para almacenar una variable.
Operadores y Precendencia
Al utilizar dos o más operadores en una sentencia, algunos operadores tienen
precedencia sobre otros operadores. La precedencia y asociatividad de los
operadores determina el orden en que se procesan los operadores. ActionScript
tiene una jerarquía que determina qué operadores se ejecutan antes que otros. Al
final de esta sección encontrará una tabla en la que se expone esta jerarquía.
Aunque para aquellos usuarios familiarizados con la programación aritmética o
básica puede parecer algo natural que el compilador procese el operador de
multiplicación (*) antes que el operador de suma (+), el compilador necesita
instrucciones explícitas sobre qué operadores debe procesar primero. Dichas
instrucciones se conocen colectivamente como precedencia de operadores.
Puede ver un ejemplo de precedencia de operadores al utilizar los operadores de
multiplicación y suma:
var mySum:Number;
mySum = 2 + 4 * 3;
trace(mySum); // 14
Observará que el resultado de esta sentencia es 14, ya que la multiplicación tiene
una precedencia de operador superior. Por consiguiente, se calcula primero 4 * 3 y
el resultado se suma a 2.
Puede controlar lo que debe ocurrir colocando las expresiones entre paréntesis.
ActionScript establece una precedencia de operadores predeterminada que puede
modificar utilizando el operador de paréntesis (()). Al colocar la expresión de suma
entre paréntesis, ActionScript calcula primero la suma:
8. 13
var mySum:Number;
mySum = (2 + 4) * 3;
trace(mySum); // 18
Ahora el resultado de esta sentencia es 18.
Los operadores también pueden tener la misma precedencia. En este caso, la
asociatividad determina el orden en que deben actuar los operadores. La
asociatividad puede ser de izquierda a derecha o de derecha a izquierda.
Observe de nuevo el operador de multiplicación. La asociatividad en este caso es
de izquierda a derecha, por lo que las dos sentencias siguientes son iguales.
var mySum:Number;
var myOtherSum:Number;
mySum = 2 * 4 * 3;
myOtherSum = (2 * 4) * 3;
trace(mySum); // 24
trace(myOtherSum); // 24
Pueden darse situaciones en las que dos o más operadores con la misma
precedencia aparezcan en la misma expresión. En estos casos, el compilador
utiliza las reglas de asociatividad para determinar qué operador se procesa
primero. Todos los operadores binarios, salvo los operadores de asignación,
tienen asociatividad desde la izquierda, lo que significa que los operadores de la
izquierda se procesan antes que los operadores de la derecha. Los operadores de
asignación y el operador condicional (?:) tienen asociatividad desde la derecha, lo
que significa que los operadores de la derecha se procesan antes que los
operadores de la izquierda. Para más información sobre operadores de
asignación, consulte Utilización de operadores de asignación. Para más
9. 14
información sobre el operador condicional (?:), consulte El operador condicional.
Piense, por ejemplo, en los operadores menor que (<) y mayor que (>), que tienen
la misma precedencia. Si ambos operadores se utilizan en la misma expresión, el
operador de la izquierda se procesará en primer lugar porque ambos operadores
tienen asociatividad desde la izquierda. Esto significa que las dos sentencias
siguientes generan el mismo resultado:
trace(3 > 2 < 1); // false
trace((3 > 2) < 1); // false
El operador mayor que (>) se procesa primero, lo que da como resultado el valor
true porque el operando 3 es mayor que el operando 2. El valor true se pasa al
operador menor que (<) junto con el operando 1. El operador menor que (<)
convierte el valor true en el valor numérico 1 y compara el valor numérico con el
segundo operando 1 para devolver el valor false (el valor 1 no es menor que 1).
Estudie el orden de los operandos del código ActionScript, especialmente si
establece condiciones complejas y conoce la frecuencia con la que dichas
condiciones son verdaderas (true). Por ejemplo, si sabe i va a ser mayor que 50
en su condición, deberá escribir primero i<50. De esta forma, se comprobará
primero, con lo que no será necesario comprobar la segunda condición con tanta
frecuencia.
En la tabla siguiente se muestran los operadores de ActionScript 2.0 por orden
decreciente de precedencia. Cada fila de la tabla contiene operadores de la misma
precedencia. Cada fila de operadores tiene precedencia superior a la fila que
aparece debajo de ella en la tabla. Para más información y directrices sobre el uso
de operadores y paréntesis, consulte Aplicación de formato a la sintaxis de
ActionScript.
Grupo Operadores
Primario [] {x:y} () f(x) new x.y x[y]
Sufijo x++ x--
10. 15
Unario ++x --x + - ~ ! delete typeof void
Multiplicativo * / %
Aditivo + -
Desplazamiento en modo bit << >> >>>
Relacional < > <= >= instanceof
Igualdad == != === !==
AND en modo bit &
XOR en modo bit ^
OR en modo bit |
AND lógico &&
OR lógico ||
Condicional ?:
Asignación = *= /= %= += -= <<= >>= >>>= &= ^= |=
Coma ,