Una instrucción o enunciado en lenguaje C se puede definir como una expresión que tiene alguna consecuencia, generalmente la consecuencia se ve reflejada en el cambio del valor que está almacenado en las variables. De acuerdo con su estructura sintáctica se pueden clasificar en dos tipos: simples y compuestas.
Las instrucciones simples se distinguen porque terminan con punto y coma “;”. La sintaxis es:
<instrucción>;
Como ejemplo de instrucciones simples tenemos la declaración de variables, la llamada de funciones y la asignación.
int x;
x = 2*y;
printf(“Hola”);
En cambio, las instrucciones compuestas son un conjunto de instrucciones que se escriben entre llaves “{…}”, para formar lo que conocemos como un bloque de instrucciones. La sintaxis es:
En general, “un programa es una secuencia de instrucciones mediante las cuales se ejecutan diferentes acciones de acuerdo con los datos que se estén procesando (López, 2005)”.
En la unidad 1 se explicó que un programa puede ser ejecutado por una computadora solamente si está escrito en lenguaje de máquina, pero existen lenguajes de programación, que son fáciles de entender para los seres humanos, mediante los cuales se pueden escribir programas más legibles conocidos como programas fuente–en lenguaje C los programas fuente tiene extensión .c–, que son traducidos a lenguaje de máquina mediante compiladores o traductores. En el caso de C es un lenguaje compilado, por lo que se genera un programa ejecutable con extensión .exe, que puede ser ejecutado cada vez que se desee sin necesidad de volver a compilar el programa fuente, a menos que se realice algún cambio.
De acuerdo con su creador, un programa fuente en lenguaje C, cualquiera que sea su tamaño, consta de funciones y variables. Una función contiene un conjunto de instrucciones, también llamadas preposiciones o enunciados, que especifican las operaciones que la computadora debe realizar; en tanto, las variables son los espacios de memoria donde se almacenan los valores utilizados en dichas operaciones (Kernighan y Ritchie, 1991, p. 6).
Uno de los componentes principales de un programa en lenguaje C, es la colección de funciones o biblioteca, la cual hace referencia a un conjunto de subprogramas que forman parte del lenguaje, es decir “los programas en C usan siempre funciones de propósito general que están almacenadas en una biblioteca. Ejemplos de estas funciones son las de impresión en pantalla, la lectura del teclado, matemáticas, etcétera” (Muñoz y Palacios, 2006, p.13)
Por convención y con el fin de aprender cómo funciona un nuevo lenguaje, el primer programa que se escribe por lo general es “hola mundo”, así que a continuación se muestra cómo se implementa este programa en lenguaje C.
/*Directivas de preprocesador*/
#include<stdio.h>
/* Definición de función
Principal */
main( )
{
printf(“Hola mundo… n”);
}
Código en lenguaje C
Descripción
/Directivas de preprocesador/
El texto que se encuentra entre los signos /* */ son comentarios largos. Los comentarios sirven para documentar o describir las líneas de código subsecuentes y no son instrucciones que interprete la computadora.
#include<stdio.h>
De todas las bibliotecas del lenguaje C en esta instrucción se está indicando que la librería que se requiere utilizar es la biblioteca básica de entrada y salida. Es una (entre otras) instrucción especial que indica las directivas del preprocesador antes de la compilación del programa, se distingue porque inicia con el símbolo gato “#”, en este caso, esta instrucción le indica al compilador que debe incluir la información que está definida en el archivo de biblioteca stdio.h, en el cual se encuentran todas las funciones de salida y entrada, como printf.
/* Definición de función Principal */
Es un comentario que describe la función principal del programa.
main( ) { printf(“Hola mundo… n”); }
Definición de función Principal del programa. Donde: Main(): La palabra main seguida de paréntesis es la función principal que siempre debe aparecer en algún lugar del programa ya que es el punto desde el cual se inicia la ejecución del mismo. { } : Las instrucciones que corresponden al cuerpo de la función van encerradas entre llaves de agrupamiento las cuales indican el inicio y fin de la misma. Printf: es una función que se ejecuta o llama al nombrarla, es decir, escribiendo su nombre y, dentro de los paréntesis, se menciona la lista de argumentos, separados por comas. En otras palabras, los argumentos son los valores que una función necesita para realizar la tarea que tiene encomendada. En este ejemplo, esta función tiene como finalidad imprimir la Código en lenguaje C Descripción /Directivas de preprocesador/ El texto que se encuentra entre los signos /* */ son comentarios largos. Los comentarios sirven para documentar o describir las líneas de código subsecuentes y no son instrucciones que interprete la computadora. #include<stdio.h> De todas las bibliotecas del lenguaje C en esta instrucción se está indicando que la librería que se requiere utilizar es la biblioteca básica de entrada y salida. Es una (entre otras) instrucción especial que indica las directivas del preprocesador antes de la compilación del programa, se distingue porque inicia con el símbolo gato “#”, en este caso, esta instrucción le indica al compilador que debe incluir la información que está definida en el archivo de biblioteca stdio.h, en el cual se encuentran todas las funciones de salida y entrada, como printf. /* Definición de función Principal */ Es un comentario que describe la función principal del programa. main( ) { printf(“Hola mundo… n”); } Definición de función Principal del programa. Donde: Main(): La palabra main seguida de paréntesis es la función principal que siempre debe aparecer en algún lugar del programa ya que es el punto desde el cual se inicia la ejecución del mismo. { } : Las instrucciones que corresponden al cuerpo de la función van encerradas entre llaves de agrupamiento las cuales indican el inicio y fin de la misma. Printf: es una función que se ejecuta o llama al nombrarla, es decir, escribiendo su nombre y, dentro de los paréntesis, se menciona la lista de argumentos, separados por comas. En otras palabras, los argumentos son los valores que una función necesita para realizar la tarea que tiene encomendada. En este ejemplo, esta función tiene como finalidad imprimir la Código en lenguaje C Descripción /Directivas de preprocesador/ El texto que se encuentra entre los signos /* */ son comentarios largos. Los comentarios sirven para documentar o describir las líneas de código subsecuentes y no son instrucciones que interprete la computadora. #include<stdio.h> De todas las bibliotecas del lenguaje C en esta instrucción se está indicando que la librería que se requiere utilizar es la biblioteca básica de entrada y salida. Es una (entre otras) instrucción especial que indica las directivas del preprocesador antes de la compilación del programa, se distingue porque inicia con el símbolo gato “#”, en este caso, esta instrucción le indica al compilador que debe incluir la información que está definida en el archivo de biblioteca stdio.h, en el cual se encuentran todas las funciones de salida y entrada, como printf. /* Definición de función Principal */ Es un comentario que describe la función principal del programa. main( ) { printf(“Hola mundo… n”); } Definición de función Principal del programa. Donde: Main(): La palabra main seguida de paréntesis es la función principal que siempre debe aparecer en algún lugar del programa ya que es el punto desde el cual se inicia la ejecución del mismo. { } : Las instrucciones que corresponden al cuerpo de la función van encerradas entre llaves de agrupamiento las cuales indican el inicio y fin de la misma. Printf: es una función que se ejecuta o llama al nombrarla, es decir, escribiendo su nombre y, dentro de los paréntesis, se menciona la lista de argumentos, separados por comas. En otras palabras, los argumentos son los valores que una función necesita para realizar la tarea que tiene encomendada. En este ejemplo, esta función tiene como finalidad imprimir la cadena de caracteres que recibe como parámetro; en este caso el texto “Hola mundo”. n: es una secuencia de caracteres que realiza o inserta un salto de línea. “Hola mundo…” : el texto que se encuentra entre comillas al dispositivo de salida básico que en este caso es el monitor “Hola mundo”.
Los compiladores de lenguaje C ofrecen distintas directivas, sin embargo, las que utilizaremos son: • #define, que sirve para definición de constantes y/o macros. • #include, que se usa para incluir otros archivos.
El lenguaje de programación C, fue desarrollado por Dennis M. Ritche en el año de 1972, en los laboratorios Bell de la AT&T, posteriormente fue estandarizado por un comité del ANSI (por sus siglas en Inglés American National Standard Institute) dando lugar al ANSI C, a través del cual se garantiza que cualquier programa creado bajo este estándar pueda ser ejecutado en cualquier computadora (Kernighan y Ritchie, 1991).
Los elementos básicos del lenguaje de programación C son: tipos de datos, variables y constantes, operadores lógicos y aritméticos, funciones de manejo de datos, entre otras funciones.
Un lenguaje de programación siempre sigue un paradigma de programación, aunque también podemos encontrar lenguajes con la influencia de dos paradigmas, tal es el caso del lenguaje C++, que surgió bajo el paradigma procedimental y se transformó al paradigma orientado a objetos, de tal manera que puede soportar ambos paradigmas.
Los paradigmas más importantes son:
Paradigma imperativo o procedural
Es el método de programación tradicional, donde los programas describen la forma de solucionar un problema a partir de una lista de instrucciones que se ejecuta de forma secuencial, a menos que se trate de estructuras de control condicionales o repetitivas, o bien, saltos de secuencia representados por la instrucción GOTO 1 . La programación imperativa se define a partir del cambio de estado de las variables que se produce por la ejecución de las instrucciones, por ejemplo, el programa 1.1, que calcula el área de un rectángulo, es un ejemplo de un programa imperativo, ya que describe paso a paso como solucionar el problema y el resultado corresponde al estado final de la variable area. Sin embargo, el lenguaje en el que está escrito no corresponde a ningún lenguaje de programación real, pero el lenguaje de máquina es un ejemplo de este paradigma. Otros lenguajes imperativos son: Fortran, Cobol, Pascal, Basic, Ada y C.
Paradigma declarativo
En contraste con el paradigma imperativo, el objetivo de este paradigma no es describir como solucionar un problema, sino describir un problema mediante predicados lógicos o funciones matemáticas. Dentro de este paradigma se encuentran los lenguajes de programación funcionales y los lenguajes de programación lógicos. Los primeros representan el problema utilizando funciones matemáticas, por ejemplo, un programa que calcule el área de un rectángulo utilizando un lenguaje funcional se vería así:
areaRectangulo(b,h)= b * h
De tal manera que para calcular el área de un rectángulo de base igual a 5 unidades y altura igual a 10 unidades, se ejecuta la función con los parámetro 5,10, es decir, areaRectángulo(5,10), la cual devuelve como resultado 50.
Los lenguajes de programación más representativos del paradigma funcional son: Lisp, ML y Haskell. En el caso de los lenguajes lógicos la solución se representa a través de un conjunto de reglas, por ejemplo:
Esta regla dice que el valor de la variable area corresponde al área del rectángulo con base b y altura h sólo si area es el resultado de multiplicar b por h. Estamos suponiendo que se ha definido el predicado multiplicación(a, b, c).
En este caso para calcular el resultado se utiliza el principio de razonamiento lógico para responder a las preguntas planteadas, por ejemplo si se desea calcular el área del mismo rectángulo, la pregunta sería la siguiente:
?areaRectangulo(5,10x)
Y después de que se realicen los cálculos (en este caso llamadas inferencias) el resultado que arrojaría sería:
X = 50
El lenguaje más representativo del paradigma lógico es Prolog.
Paradigma orientado a objetos
En este caso la solución de un problema se plantea en términos de objetos y relaciones entre ellos. Está basado en varias técnicas, incluyendo herencia, polimorfismo, modularidad y encapsulamiento. En este caso se definen clases que son las plantillas para crear objetos, por ejemplo, si se quiere un programa orientado a objetos que calcule el área de un rectángulo, se debe definir una clase rectángulo que contenga un método encargado de calcular el área. El lenguaje Java y C#, que actualmente son los más utilizados, son ejemplos de este paradigma.
Independientemente del paradigma que se elija y del lenguaje que se utilice para programar, existe un conjunto de fases que deben seguirse para realizar un programa de computadora que constituyen una metodología (Levine, 2001):
Fases de la metodología de programación
Planteamiento del problema Es la primera fase del ciclo, consiste en seleccionar y plantear el problema que se quiere resolver para poder comenzar su análisis. Es muy importante tener bien claro y delimitar desde un inicio el problema a resolver pues de esto dependerá el éxito de las siguientes fases del proceso. En el planteamiento del problema se deben considerar los insumos (datos de entrada) que se necesitan para resolver el problema; los pasos a seguir para su solución y el producto final (datos de salida).
Análisis del problema En esta fase se determina ¿qué hace el programa? Por lo cual debe definirse de manera clara y concisa el problema en cuestión, se debe establecer el ámbito del problema, las características, limitaciones y modelos de lo que se desea resolver. Este paso debe conducir a una especificación completa del problema en donde se describa cuáles son los datos requeridos para resolverlo (datos de entrada) y cuál es el resultado deseado (salida).
El análisis del ejemplo es muy simple y se resume en la siguiente tabla:
¿Cuál es la salida deseada?
El área de un rectángulo, la cual identificaremos como área
¿Qué método(s) se pueden utilizar para llegar a la solución?
El área de un rectángulo se puede calcular con la siguiente fórmula: Área = Base por Altura
¿Qué datos de entrada se requieren?
Por el planteamiento del problema y dado el método anterior, los únicos datos que se requieren son: la medida de la base que se representa por b y la medida de la altura indicada por h
¿Qué datos o información adicional es necesaria para solucionar el problema?
En este caso no se requiere más información.
¿Existe algún problema o condiciones que deban cumplirse?
Las únicas restricciones son que las medidas de la base y altura sean mayores a cero.
Diseño del algoritmo En esta fase se define ¿cómo el programa resuelve el problema? Para ello, se describe paso a paso la solución del mismo, lo cual se conoce como algoritmo.
Cuando el problema es grande se recomienda dividirlo en problemas más pequeños y resolver por separado cada uno de ellos. A esta metodología se le conoce como diseño descendente (top-down) o modular. Existen diferentes formas de representar un algoritmo, algunas formales como una fórmula matemática, o informales, como es el caso del lenguaje natural.
Para continuar con el desarrollo del programa ejemplo, se planteará la solución como una secuencia de pasos conocida como pseudocódigo:
Calcula el área de un rectángulo
Obtener la medida de la base (b) y la altura (h)
Cálcular: área = b por h
Imprimir el resultado (área)
Los algoritmos en la programación. Como ya se mencionó, las computadoras necesitan recibir indicaciones en un formato entendible para ellas, con el fin de que realicen las acciones deseadas. Las indicaciones u órdenes se agrupan en un programa, al conjunto de programas se le conoce como software. Para analizar la estructura de un programa, éste “se puede dividir en dos partes que son: el formato de representación interno del programa, que constituye el lenguaje máquina o código ejecutable, y el formato de presentación externa, que es un archivo o un conjunto de archivos, que puede o no estar en un formato que puede ser leído por el usuario (es decir, en un formato que respeta las reglas)” (Juganaru, 2014, p.2).
Para que la computadora realice las acciones deseadas, es necesario elegir el software más adecuado para escribir un programa que realice la acción deseada., a esta acción se le denomina programación, con ello, no se afirma que la programación es sólo la escritura de código, la programación implica “un conjunto de tareas que se deben cumplir, a fin de que el código que se escribió resulte correcto y robusto, y cumpla con el objetivo o los objetivos para los que fue creado.” (Ibídem) Para ello, es preciso realizar dos acciones dependiendo del tipo de problema a resolver o acciones a realizar:
• “Conocer las herramientas, los formalismos y los métodos para transformar un problema en un programa escrito en un lenguaje (que posiblemente no será el lenguaje máquina), y para que dicho programa pueda ser transformado en un código ejecutable.
• Saber transformar el problema inicial en un algoritmo y luego en un programa” (Ibídem)
Para los casos de problemas muy generales, existen métodos conocidos que solo se adaptan a un problema en particular, el método es por lo general un algoritmo o una técnica de programación.
La palabra algoritmo proviene del nombre de un matemático persa conocido como Mohammad Al-KhoWârizmi, nacido alrededor del 780 d. c. en KhoWârizm, de ahí su seudónimo. Se considera como el padre de la algoritmia porque definió las reglas paso a paso para sumar, restar, multiplicar y dividir números decimales. La traducción al latín de Al-Khwārizmī es algoritmi, que da origen a la palabra algoritmo (Joyanes & Zohanero, 2005). Según la RAE (2016) un algoritmo es un “Conjunto ordenado y finito de operaciones que permite hallar la solución de un problema”, y también es “Método y notación en las distintas formas del cálculo”.
Formalmente, en programación, un algoritmo se define como una secuencia finita de instrucciones precisas y eficaces para resolver un problema, que trabaja con uno o más datos (entrada) y devuelve un resultado (salida) (Viso & Peláez, 2007).
Para llegar a la solución de un problema se requiere creatividad, ya que el programador sólo cuenta con la especificación del problema y su experiencia en resolverlos de una forma estructurada de inicio a fin.
Existen dos maneras de representar un algoritmo: una gráfica, conocida como diagramas de flujo; y otra, similar a un lenguaje humano, la cual se denomina pseudocódigo.
Los diagramas de flujo son una representación totalmente gráfica de un algoritmo que utiliza símbolos para representar las instrucciones y flechas para unirlas e indicar el orden en el que deben ejecutarse llamadas líneas de flujo, lo anterior hace más fácil seguir la secuencia de la ejecución de las instrucciones. Dichos símbolos fueron normalizados por el Instituto Norteamericano de Normalización ANSI (American National Standards Institute, por sus siglas en inglés).
Algunos de los símbolos más utilizados se muestran en el siguiente cuadro:
A continuación, se muestra el diagrama de flujo del problema que hemos tomado como ejemplo en esta Unidad y que consiste en calcular el área de un rectángulo:
El pseudocódigo es un lenguaje de especificación formal de algoritmos. La solución de un problema se representa de manera narrativa utilizando palabras claves, generalmente verbos, escritos en un lenguaje natural, que en nuestro caso será español. Es una de las representaciones de algoritmos más utilizadas por su parecido con el lenguaje natural y porque su codificación en un lenguaje de programación estructurado y modular como C es directa. En el ejemplo anterior se muestra el pseudocódigo escrito en solución al problema de calcular el área de un rectángulo.
Un algoritmo también se puede expresar mediante una fórmula matemática, en el caso del ejemplo que hemos tratado, esta fórmula es:
área = base por altura
Se puede utilizar cualquiera de las dos representaciones para diseñar un algoritmo, pues en cualquiera de las dos se puede expresar un algoritmo estructurado, de tal manera que la más conveniente depende del estilo de cada programador.
La forma de evaluar el correcto funcionamiento del pseudocódigo es a través de una prueba de escritorio. La prueba de escritorio consiste en que el programador siga los pasos descritos en el pseudocódigo simulando el comportamiento de la computadora. Para ello requiere definir un conjunto de datos de prueba que le permita evaluar todos los posibles resultados que se obtendrán una vez que se lleve a cabo todos los pasos descritos en el pseudocódigo. Para fines de comprobación y de familiarización del funcionamiento de un pseudocódigo se recomienda utilizar un número finito de datos y escribir las variables en una hoja de papel, para el caso de un problema simple, para el desarrollo de sistemas más complejos existen herramientas más acordes para realizar esta comprobación.
A continuación, se expone un ejemplo de prueba de escritorio considerando los datos del problema anterior.
Datos de entrada
Operación o instrucción a realizar
Resultado
Base, altura
Área=base*altura
Área
5, 10
5*10
50
En este ejemplo no se muestran variables porque se trata de un pseudocódigo; en el caso de verificar el funcionamiento del código de un programa, será necesario desglosar cada una de las variables que intervienen en el proceso.
Implementación (codificación)
El algoritmo no puede ser ejecutado por una computadora, por ello debe traducirse a un lenguaje de programación (como por ejemplo el lenguaje C) para obtener un programa fuente que se traduzca a lenguaje de máquina que pueda ser ejecutado por la computadora.
En el siguiente cuadro se muestra la codificación del algoritmo en lenguaje C, por el momento no profundizaremos en la estructura y los componentes de este lenguaje, simplemente se expone este código a manera de ejemplo de lo que se produce en la fase de implementación o codificación.
#include<stdio.h>
#include<stdlib.h>
main()
{
int b,h, area;
printf("Ingresa la base y altura:");
scanf("%d %d", &b,&h);
area = b * h;
printf("Area = %d", area);
}
Ejemplo de Programa en lenguaje C que calcula área de un rectángulo.
Validación y pruebas Esta fase se lleva a cabo una vez que se ha codificado el algoritmo previamente diseñado con el fin de verificar que su ejecución sea correcta. Existen diferentes formas de probar que la solución es correcta, algunas de ellas son formales y otras informales: las primeras se utilizan para garantizar que el programa o algoritmo siempre calcule el resultado deseado para cualquier conjunto de datos de entrada; en cambio, en las segundas sólo se prueba que funciona correctamente para algunos datos de entrada, tratando de encontrar posibles errores, en este caso no se puede garantizar que el programa o algoritmo calcule la salida correcta para cualquier conjunto de datos. En cualquiera de los dos casos, si se encuentra alguna falla se debe corregir y volver a realizar pruebas.
Dado que el problema que estamos analizando como ejemplo es muy sencillo, si se ejecuta manualmente el programa o algoritmo relacionado para un caso específico de rectángulo se observará que el resultado es correcto. En la siguiente figura se ilustra la ejecución del programa:
Documentación Cualquier proyecto de software por la complejidad que tiene requiere que tanto las ideas principales como el desarrollo de principio a fin sea documentado con el fin de que se pueda entender la lógica del programa y de ser necesario se pueda modificar o darle mantenimiento posteriormente, sin tantas complicaciones. Es común que si se desea modificar un programa y no se tiene información acerca de cómo fue construido originalmente, sea más fácil volverlo a hacer desde el principio que intentar entender la lógica aplicada en un inicio. Uno de los mejores ejemplos de la importancia de la documentación es el software libre, en el cual colaboran diversos desarrolladores para su elaboración, teniendo el código fuente disponible para modificarlo a su conveniencia. Estos desarrolladores se encuentran en diferentes puntos geográficos del globo terráqueo e incluso varios hablan diferentes idiomas, así es que la documentación les permite entender lo que está haciendo cada uno y bajo qué método está trabajando.
Como parte de la documentación también deben incluirse manuales de usuario y las normas de mantenimiento para que se haga un buen uso del software y éste se mantenga al día.
Mantenimiento Esta fase tiene sentido una vez que fue terminada y liberada una primera versión del programa, misma que ya está siendo utilizada. En esta fase se actualiza y modifica dicho programa para corregir errores no detectados o para cambiar y/o agregar una nueva función. Siguiendo con nuestro ejemplo, se podría extender el programa ejemplo que calcula el área de un rectángulo para obtener también su perímetro:
#include<stdio.h>
#include<stdlib.h>
main()
{
int b,h, area, perimetro;
printf("Ingresa la base y altura:");
scanf("%d %d", &b,&h);
perimetro = 2*b + 2*h;
area = b * h;
printf("Perimetro = %d", perimetro);
printf("Area = %d", area);
}
Ejemplo de mejora al programa original incluyendo el cálculo del perímetro de un rectángulo
En el programa se resaltan las instrucciones que se añadieron para calcular el perímetro.
La metodología de programación sirve para desarrollar software desde el inicio con su diseño hasta el final con su implementación, de ahí la importancia de entender las diferentes fases y las actividades involucradas en cada una de ellas, con el fin de dar una solución óptima al problema en cuestión.
En programación, se entiende como metodología al “conjunto de estrategias usadas para abordar un problema y transformarlo en un programa codificado que tendrá una estructura o arquitectura acorde con un paradigma de programación” (Martínez y Martín, 2003, p.46).
La Importancia de contar con una metodología radica en la necesidad de sistematizar las acciones a realizar para la resolución del problema propuesto considerando todos los requerimientos, datos y objetivo del programa, es decir, todos los elementos necesarios para desarrollar un programa que dé solución a un requerimiento específico, con ello se reduce la probabilidad de error al momento de ejecutar un programa, y los costos que implica realizar correcciones.
Un paradigma “es un conjunto explícitamente determinado de conceptos y proposiciones usadas para dirigir investigación dentro de un campo determinado” (Cedano, Et al, 2014, p. 165).
“Los paradigmas de programación se definen como las diversas maneras que a lo largo de la transformación de los lenguajes de programación se han reconocido como estilos para programar y resolver problemas. […] Cuando se describen los distintos enfoques del desarrollo de un programa y las técnicas y lenguajes correspondientes, se habla de paradigma de programación. Éste define la forma en que se estructura el código, y la relación de éste con los datos.” (Ibídem, p. 165).
Un lenguaje de programación siempre sigue un paradigma de programación, aunque también podemos encontrar lenguajes con la influencia de dos paradigmas, tal es el caso del lenguaje C, que surgió bajo el paradigma procedimental y se transformó al paradigma orientado a objetos, de tal manera que puede soportar ambos paradigmas.
Los paradigmas de programación más importantes son: imperativo, funcional, lógico y orientado a objetos. Para revisar en qué consisten estos paradigmas, revisa el documento U1. Paradigmas de programación en la sección Material de apoyo.
El lenguaje de programación sirve para escribir código orientado a resolver algún problema o necesidad. Cada lenguaje de programación se define a partir de un conjunto de símbolos básicos, llamado alfabeto; un conjunto de reglas, llamado sintaxis, que definen la forma de manipularlos o combinarlos para representar instrucciones; y las reglas que especifican los efectos de dichas instrucciones cuando son ejecutadas por la computadora, conocidas como semántica. De esta manera se puede decir que los elementos que conforman un lenguaje de programación son:
Los lenguajes de programación se clasifican en lenguajes de bajo nivel y lenguajes de alto nivel dependiendo de su legibilidad para el ser humano. Los primeros se caracterizan porque sus instrucciones se parecen más a las acciones elementales que ejecuta una computadora, como son: sumar, restar, guardar en memoria, etcétera. En cambio, las instrucciones de los lenguajes de alto nivel son más parecidas a un lenguaje humano, por lo regular en idioma inglés.
Los programas escritos en bajo nivel describen a detalle lo que sucede a nivel de hardware, mientras que los programas escritos en un lenguaje de alto nivel lo ocultan, teniendo como ventaja que son más fáciles de entender para las personas.
Estructura de un lenguaje
Como en muchos otros lenguajes, una función es un código de programación que tiene una tarea específica y forma parte del programa original. Es una secuencia de instrucciones precisas, para realizar una tarea en específico.
Una función está definida por los siguientes elementos: • Cabecera de la función. Está integrada por un tipo de dato, un nombre de la función y una la lista de parámetros. • Código de programación. Es único para cada función. Se incluye el valor devuelto por la función.
Los aspectos más importantes en el diseño de una función son: • Tipo de resultado. Se refiere al tipo de dato que devuelve la función. • Lista de parámetros. • Cuerpo de una función. Se encierra entre llaves {}. • Paso de parámetros. • Declaración de variables de forma local. Dentro de una función pueden declararse variables de distintos tipos, pero estas perduran únicamente dentro la función. • Valor devuelto por la función.
Una función devuelve un único valor, el valor que devuelve puede ser de cualquier tipo de datos reconocido. El nombre de una función comienza con una letra o un subrayado (_) y puede contener las letras y subrayados que se desee.
A continuación, se muestra la estructura general de una función en lenguaje programación C:
Tipos de datos
Los tipos de datos que suelen utilizarse en la mayoría de los lenguajes de programación son: • Cadena (texto). • Entero (número entero). • Decimal (número con punto decimal).
Evolución de los lenguajes de programación
Con las primeras computadoras surgió el primer lenguaje de programación que fue precisamente el lenguaje de máquina, el cual es considerado el lenguaje de primera generación. Las instrucciones en lenguaje de máquina dependían de las características de cada equipo, por lo que dada la dificultad de desarrollar programas en unos y ceros, los investigadores de la época desarrollaron el lenguaje ensamblador, cuyo conjunto de instrucciones consta de palabras nemotécnicas que corresponden a las operaciones básicas que una computadora puede ejecutar.
Para ilustrar esto se revisará la siguiente instrucción:
Mueve el contenido del registro 8 al contenido del registro 10
En lenguaje de máquina, ésta se podría representar como: 0010 0000 1000 0100
Lo anterior es ilegible para el ser humano, en cambio en lenguaje ensamblador esta instrucción se puede representar de la siguiente forma: MOV R8, R10
El código anterior continúa estando en clave, pero es definitivamente más amigable que las cadenas de ceros y unos.
Para traducir de lenguaje ensamblador a lenguaje de máquina, se desarrollaron programas llamados ensambladores (en inglés, assemblers).
Este lenguaje fue considerado de segunda generación. Posteriormente, en la década de los 50´s aparecieron los primeros lenguajes de alto nivel, cuyas instrucciones son más parecidas al idioma inglés y, por lo tanto, más fácil de utilizar para los programadores, además de que son independientes de la arquitectura de las computadoras. Algunos ejemplos son: FORTRAN y COBOL (que son los primeros lenguajes que aparecieron y en sus inicios se utilizaron para aplicaciones científicas), C, Pascal, Ada, Lisp y Prolog (utilizados principalmente en inteligencia artificial), Java, C++, C#, entre otros.
Al igual que el lenguaje ensamblador, los programas escritos en un lenguaje de alto nivel deben ser codificados a lenguaje de máquina, así que junto con ellos se desarrollaron programas traductores, que de acuerdo con la forma en que trabajan se dividen en dos tipos: compiladores e intérpretes.
Compiladores. Traducen todo el programa escrito en un lenguaje de alto nivel, llamado programa o código fuente, generando un nuevo programa objeto que está escrito en lenguaje de máquina y a partir de este se genera un programa ejecutable, el cual puede ejecutarse cada vez que se desee sin tener que compilar el programa fuente nuevamente. Además, como parte del proceso de traducción el compilador detecta los errores que hay en el código fuente, informándole al programador para que los corrija, pues un programa solo se compila si no tiene errores.
Intérprete. Revisa cada línea de código individualmente, la analiza y enseguida la ejecuta, sin revisar todo el código y sin generar un programa objeto, así que cada vez que se quiere ejecutar el programa se vuelve a traducir el programa fuente línea por línea.
Por lo anterior, los compiladores requieren una fase extra antes de poder generar un programa ejecutable, y aunque esto pareciera menos eficiente en cuanto a tiempo, los programas creados con compiladores se ejecutan mucho más rápido que el mismo programa ejecutado con un intérprete.
Adicionalmente, cuando un programa ya ha sido compilado puede ejecutarse nuevamente sin tener que compilarse, mientras que los programas que son interpretados, se deben volver a traducir cada vez que se ejecutan.
Conforme han ido evolucionando las computadoras también lo han hecho las estrategias para solucionar problemas, generando nuevos programas con diferentes filosofías, llamadas paradigmas de programación.