FUNDAMENTOS DE PROGRAMACIÓN
<kikemonzo@ono.com>
con autorización de Moisés Mascuñán.
v1.0, Oct 2004
El presente documento es una guía del módulo de Fundamentos de Programación (FPR) del Ciclo de Grado Superior de ASI (Administración de Sistemas Informáticos). Los contenidos están extraidos del material proporcionado durante el curso y cuyo autor y titular del módulo, Moisés Mascuñán, ha autorizado la publicación de este resumen por médio electrónico.
Tema 1. Introducción a la programación
Programación
Pese a que mucha gente iguala los términos de "programación" y "codificación", lo cierto es que se trata de procesos distintos. En realidad se podría decir que uno engloba en una de sus fases al otro, pués dentro del proceso de programación o desarrollo de un programa, se incluye la tarea de codificar mediante un lenguaje de programación nuestro programa.
Se podría pués decir que programar es desarrollar software empleando lenguajes de programación.
En todo proceso de desarrollo se reconocen o por lo menos se debería seguir, varias fases que nos conduzcan al resultado final.
Fases del desarrollo:
-
Análisis: QUÉ, definición problema, entrevistas, investigación, terminología, estudio del sistema existente, descripción de necesidades de información, límites de la aplicación…
-
Diseño: CÓMO, definición solución, pasos a seguir, opciones, datos/funciones, elección algoritmos y estructuras de datos…
-
Codificación: elección del Lenguaje de Programación, elección del entorno de desarrollo, separación en módulos, teclear código…
-
Pruebas: verificación del programa, comparación salidas previstas/salidas obtenidas, corrección errores, mejoras, estudio de la eficiencia…
-
Mantenimiento: instalación, actualización, nuevas funcionalidades, reparar errores…
Como podemos ver la programación o desarrollo de programas es bastante más que codificar.
Así pues se podrían esquematizar las llamadas Fases de Ciclo de Vida Clásico de todo desarrollo, de la siguiente manera:
Metodología
La metodología es el conjunto de métodos y técnicas a utilizar durante todas las fases del desarrollo de una aplicación o programa. Algunos tipos de metodoloía podrían ser la metodología estructurada y la metodología orientada a objetos. Ejemplos de ambos tipos son:
-
Metodología Estructurada: Análisis (DFD), Diseño (DE), Codificación (Lenguaje de programación estructurada), Prueba (Caja blanca/negra).
-
Metodología Orientada a Objetos: Análisis (Diseño de Clases, Diseño de Objetos, Diseño de Secuencias), Codificación (Lenguaje de programación orientado a objetos).
La metodología no solo aplica a la programación, en diferentes disciplinas se siguen metodologías. Así pues un arquitecto tiene los planos, mapa de la casa, materiales, plazos, etc. Igualmente un Ingeniero del Software tiene sus diagramas de clases, DFD, ER, esquema de la BBDD, código fuente, etc.
La metodología guía todo el proceso de desarrollo, por eso es importante elegirla bien al principio.
Una buena metodología debe contemplar diferentes situaciones, atender distintos requisitos y necesidades, y preveer un funcionamiento en diferentes escenarios.
Así pues, no es lo mismo una aplicación que usarán 20 personas en una empresa, que una aplicación accesible desde Internet por cualquier usario. Igualmente son distintos escenarios, con requisitos muy diferentes, los de una aplicación que contiene los datos bancarios que los de una aplicación para la gestión de almacén de una pequeña zapatería. Distintos requisitos gráficos tendrán, por ejemplo, un videojuego en 3D (altos requisitos gráficos), de la aplicación que controla un cajero automático. Distintas necesidades tendrá una pyme respecto a su programa de gestión, que una aplicación que controla el proceso de fabricación de productos químicos.+
La metodología sirve como ayuda para resolver problemas a la hora de crear una aplicación.
Lenguajes de programación
Conceptos
Un lenguaje de programación es un lenguaje para comunicarnos con el ordenador y controlar la máquina. Permite describir algoritmos que solucionen problemas.
Un algoritmo son una serie de pasos, a modo de receta, que transforman el estado inicial de un problema en su estado final o solución. Por lo tanto, es una secuencia de instrucciones para obtener los resultados deseados. Se escriben en pseudocódigo.
El pseudocódigo es una mezcla entre un lenguaje natural y un lenguaje de programación.
Un problema nos lleva a buscar una solución algorítmica, y después a implementar dichos algoritmos en un programa. Un ejemplo esquematizado:
a) Problema (fase de análisis): obtener el factorial de un número n.
b) Algoritmo (fase de diseño):
fact:=1;
para i:=1 hasta n hacer
fact:=fact*i;
fin para
devolver fact
c) Programa (fase de codificación):
function fact(n:integer):integer;
var i, n:integer;
begin
fact:=1;
for i:=1 to n do
fact:=fact*i;
return fact;
end;
Historia
Los primeros algoritmos aparecen como soluciones automáticas a problemas generalmente matemáticos, como por ejemplo el cálculo del máximo común divisor de dos números positivos, resuelto por Euclides en el 300 a.C.).
Entre 1820 y 1850, Charles Babbage diseña las primeras calculadoras. Posteriormente, Ada Augusta realiza trabajos visionarios sobre la programación y desarrolla el llamado lenguaje ADA.
En 1950 aparece el lenguaje ensamblador, muy cercano a la máquina, por tanto, muy dificil de codificar y reservado a expertos. Posteriormente surge el lenguaje FORTRAN (FORmula TRANslator), de más alto nivel, que facilitó las cosas a la hora de codificar.
Entrados ya en el siglo XX, y entre los años 50 y 60 aparecen otros leguajes, como el ALGOL diseñado como lenguaje de propósito general, el COBOL, destinado a aplicaciones de gestión, el LISP, orientado al desarrollo de algoritmos de Inteligencia Artificial, y el BASIC, que pronto se popularizó dadas sus aptitudes didácticas a la hora de aprender a programar.
En los años 70 surgen más lenguajes como el Pascal, que con el tiempo se convirtió en el lenguaje estrella de la programación estructurada; y el lenguaje C, de propósito general, y hasta la fecha el más extendido y usado de todos los lenguajes de programación. También aparece el Prolog, como lenguaje basado en la programación declarativa (más adelante explicaremos este concepto).
Ya entre los años 70 y 80 aparecen en liza los Lenguajes de Programación Orientados a Objeto, como el C++, desarrollado a partir del original lenguaje C. Con ellos aparece el concepto de objeto, que se define como un conjunto de propiedades y métodos. Con estos lenguajes se extiende el uso de las metodologías estructuradas.
A partir de los 90, se empiezan a extender las metodologías Orientadas a Objeto, aparece y se expande Internet, y se desarrollan las arquitecturas cliente-servidor.
Actualmente, existe una mezcla de lenguajes estructurados, orientados a objeto, interfaces gráficos de usuario (GUI), entornos de desarrollo (IDE) como Visual Basic, C++ Builder, Delphi; lenguajes multiplataforma como Java, C++, C#, el lenguaje XML, aplicaciones multiplataforma, aplicaciones distribuidas, arquitecturas cliente-servidor, arquitecturas de 3 capas (GUI + reglas negocio + Base de Datos), lenguajes de scripting (VBS, JS), generadores de aplicaciones para BD, herramientas RAD para desarrollo rápido (Rapid Aplication Development), automatización de aplicaciones, ASP, PHP, .NET, etc; el maremagnum de tecnologías es apabullante.
Al mismo tiempo también ha ido evolucionando el hardware (CPU, memoria, E/S), las Bases de Datos (relacionales, OO), las comunicaciones (Internet, dispositivos móviles), y sobre todo los Sistemas Operativos (Windows, UNIX/Linux).
Clasificación
La clasificación de los lenguajes de programación puede realizarse atendiendo a diversos criterios. Así pues, tenemos tres tipos de clasificiación según el modelo de computación, a las generaciones históricas o al método de traducción.
-
Atendiendo al modelo de computación.
-
Imperativos: leguajes cuya unidad básica es la instrucción. Un programa consiste en un conjunto de instrucciones. Como ejemplos tenemos el Pascal o el lenguaje C.
-
Orientados a objeto (LPOO): en ellos la unidad básica es el objeto, que se define como un conjunto de propiedades y métodos asociados. Un programa es un conjunto de objetos que se intercambian mensajes. Ejemplos de este tipo de lenguajes son el lenguaje Java, el C++, el Delphi.
-
Declarativos: en este tipo de lenguajes la unidad básica es la fórmula lógica. Un programa consiste en una ecuación matemática, y son ejemplos de este tipo el lenguaje Prolog, y el Haskell. Tiene gran potencia expresiva, por contra, dado su "alto nivel" son bastante más lentos y quizá sean demasiado ambiciosos.
-
-
Atendiendo a las generaciones históricas.
-
1GL: Lenguajes de bajo nivel, básicamente existían dos, el primero era el código máquina, dado que su sintaxis se basa en código binario, rápidamente aparece el lenguaje ensamblador, que implementa ya instrucciones específicas del procesador. Sus principales ventajas son la velocidad y un mayor control del hardware.
Sin embargo, tiene algunos inconvenientes como el hecho de ser dependientes de la arquitectura y por su propia naturaleza, son de programación lenta.
En el código máquina la CPU sólo puede ejecutar instrucciones formadas a base de 0 y 1, dado que se basa en los estados posibles de un transistor, que son dos, y por tanto en una electrónica digital binaria. Esta arquitectura a base de transistores es la base de los procesadores actuales.
Los transistores se implementan para albergar "palabras" (ternas de transistores) de n bits, como por ejemplo 110101010110….1 puede tener una tamaño de palabra de 32 bits. La memoria RAM no es más que una tabla con palabras binarias (cada una con su dirección), que pueden albergar instrucciones o datos.
Las instrucciones del lenguaje máquina son de muy bajo nivel, del tipo "incrementa en 200 el valor de la variable que está en la posición de memoria x", "recoge la última tecla de la zona de memoria destinada a guardar los caracteres tecleados y guárdala en la posición de memoria y", "envía por el puerto z el contenido de una zona de memoria que representa el color de los pixels de la pantalla".
Cuando aparece el lenguaje ensamblador, se facilita el entendimiento de los programas empleando mnemotécnicos o códigos. Por ejemplo, una instrucción binaria como 0101010101011…1 se puede implementar como "mov ax,0x3", otra del tipo 1101010101010…0 se puede implementar como "add ax,bx,2", o del tipo lógico como 0100101010101…1 se implementaría como "and ax,bx,1".
Así, se implementan operaciones básicas de tipo aritmético (suma, resta, etc.), lógicas (and, or…), E/S (in, out..), o funciones para trasferencia de datos con la memoria.
El ensamblador facilita la programación, pero necesita ser traducido a código máquina. Arrastra la desventaja de que sigue siendo dependiente de la arquitectura de la CPU, pues implementa funciones específicas de un determinado procesador.
-
2GL y 3GL: Lenguajes de mayor nivel, más alejados del hardaware, y que tienen como representates más ilustres al FORTRAN, COBOL, Pascal, y el lenguaje C.
Sus ventajas pasan por una mejora sustancial en su legibilidad, que desemboca en mayor facilidad de programación. Son independientes de la plataforma (arquitectura + Sistema Operativo). Así, dado un mismo programa desarrollado en C, se abarcan distintas posibilades, dentro del esquema:
Programa C → COMPILACIÓN → Programa ejecutable.
La compilación es el proceso llevado a cabo por el programa compilador para generar programas en código binario, entendibles por el procesador, a partir de código en un determinado lenguajes. Existen para diversas arquitecturas y sistemas operativos, a fin de cubrir el espectro de combinaciones de procesador y sistema operativo. El formato del ejecutable resultante dependerá de la arquitectura…
Programa en C → Compilador de lenguaje C para procesadores INTEL → Programa ejecutable en procesadores Intel.
…y del Sistema Operativo:
Programa en C → Compilador de lenguaje C para procesadores INTEL y binarios para Windows → Programa ejecutable en arquitecturas Intel y con Sistema operativo Windows.
Programa en C → Compilador de lenguaje C para procesadores INTEL y binarios para Linux → Programa ejecutable en arquitecturas Intel con Sistema operativo Linux.
El programa escrito en C no varía, pués el código está albergado en un fichero de texto. Por lo tanto, la codificación en un un lenguaje de este tipo oculta al programador los detalles de la máquina, pués solo son necesarios a la hora de compilar y por tanto el compilador ya los conoce.
Los leguajes de tercera generación (3GL) aportan la llamada abstracción de operaciones, esta funcionalidad permite que las operaciones repetitivas se parametricen.
Un ejemplo para entender ésto podría ser un programa que calcula el factorial de 3, 10 y 20.:
• Sin abstracción de operaciones:
Calcular el factorial de 3 (3 instrucciones).
Calcular el factorial de 10 (3 instrucciones).
Calcular el factorial de 20 (3 instrucciones).
• Con abstracción de operaciones:
Calcular en general el factorial de n (3 instrucciones).
Aplicar el proceso anterior a 3 (1 instrucción).
Aplicar el proceso anterior a 10 (1 instrucción).
Aplicar el proceso anterior a 20 (1 instrucción).
El proceso repetitivo se escribe una vez en general, y se reutiliza cuantas veces queramos; en lugar de repetir instrucciones, se crea un único fragmento de código con "espacios en blanco" que se rellenan cada vez que se aplica el proceso.
A estas alturas, se puede adivinar que el mayor inconveniente de los lenguajes 2GL y 3GL radica en la necesidad de un compilador.
-
4GL: Este tipo de lenguajes aceleran el proceso de construcción de aplicaciones de manera drástica. Antes de la aparición de los lenguajes de 4GL, dibujar una ventana gráfica requería alrededor de 300 instrucciones, en lenguajes de cuarta generación, dibujar una ventana requiere ¡¡1 instrucción!!.
También permiten automatizar procesos altamente repetitivos como la gestión ventanas, E/S, acceso a Bases de Datos, acceso a la red, etc.
Anteriormente, cada programa se encargaba de gestionar todo por sí sólo. Con la cuarta generación de lenguajes aparecen "miniprogramas" predefinidos que realizan funciones complejas pero muy útiles y ampliamente usadas.
Un ejemplo claro es el Visual Basic.
Su pricipal ventaja es que se trata de herramientas RAD, o de desarrollo de aplicaciones muy rápido.
En el apartado de inconvenientes tenemos que dan poca libertad al usuario, por ejemplo, un aspecto similar de todos los programas para Windows.
-
5GL: Lenguajes empleados en Inteligencia Artificial, como el procesamiento del lenguaje natural, por ejemplo.
Su ventaja es que se trata de lenguajes muy cercanos a la manera de pensar del hombre en su sintaxis.
Tienen el inconveniente de que son lentos, pues precisan de demasiadas traducciones hasta que se llega al código máquina.
Debemos recordar que cuando hablamos de lenguajes de Alto nivel, se trata de lenguajes más cercanos al programador, y por tanto más rápidos en cuanto a desarrollo de aplicaciones. Si hablamos de lenguajes de Bajo nivel, estamos hablando de lenguajes muy cercanos a la máquina, al harware, por tanto, su complejidad aumenta y los tiempos de desarrollo se alargan.
-
-
Atendiendo al proceso de traducción.
-
Lenguajes compilados. En éste tipo de lenguajes existe un traducción (compilación) a lenguaje máquina previa a la ejecución. Un claro ejemplo es el lenguaje C y un esquema de su funcionamiento podría ser:
Programa → Compilación → ejecución instrucción 1,ejecución instrucción 2,…, ejecución instrucción n.
-
Lenguajes interpretados: Son aquellos en que la traducción a lenguaje máquina se produce durante la ejecución. Un ejemplo de éste tipo de lenguajes es el Prolog y su funcionamiento es similar al esquema que sigue:
Programa → interpretación instrucción 1, ejecución instrucción 1, interpretación instrucción 2, ejecución instrucción2,…, interpretación instrucción n', ejecución instrucción 'n.
Tanto la "compilación" como la "interpretación" son procesos completamente automáticos.
Los lenguajes compilados generan programas ejecutables, aunque hay entornos para lenguajes interpretados que crean ejecutables para algunas plataformas.
El principal inconveniente de un lenguaje interpretado es que és lento respecto a un lenguaje compilado.
Por contra, en los lenguajes compilados hay que realizar el proceso de compilación, aunque con la potencia del hardware actual, apenas se tarda tiempo. Otro inconveniente, que se infiere de su propia naturaleza, es que las modificaciones en el código original implican recompilar para generar los nuevos ejecutables modificados.
Con características de ambos tipos de lenguajes, compilados e interpretados, existen un tipo de lenguajes denominados híbridos que aúnan lo mejor de ambos tipos. Un ejemplo es el lenguajes Java, su código se compila para una máquina virtual, la denominada JVM (Java Virtual Machine), lo que además lo convierte en multiplataforma por existir JVM para prácticamente cualquier plataforma; y a la vez es interpretado por cada navegador en tiempo de carga. Veamos el proceso:
Programa en java → Compilación → generación de un binario ejecutable en la JVM (fichero .class) → Interpretación por parte del cliente web o navegador (Explorer, Mozilla, etc.)
Cada navegador tiene una implementación de la JVM, que traduce el fichero .class a código ejecutable mientras se carga la página web.
Así como implementa virtudes de los dos mundos, también hereda desventajas de ambos tipos: como lenguaje interpretados resulta lentos, y como lenguajes compilado requiere el proceso de compilación, una vez aliviado por la enorme potencia del hardware actual que hace que sea un proceso bastante ágil. Como en todo lenguaje compilado, además, cualquier modificación en el código inicial implica el proceso de recompilar.
-
Entorno de Desarrollo o IDE (Integrated Development Envíroment)
contenido
Ingeniería del Software
contenido
Bibliografia
contenido
Glosario
Glosario