Abstracción - aulavirtual.fio.unam.edu.ar
Transcript of Abstracción - aulavirtual.fio.unam.edu.ar
¿Qué es un lenguaje de programación?
Programa: descripción abstracta de un proceso
Clasificación
Los lenguajes de programación se clasifican según el nivel de abstracción, la forma según
se ejecutan en la computadoras y por el paradigma que implemente.
Proceso: manera de indicarle a la computadora que haga determinadas tareas.
1. Según su nivel de abstracción
a) Lenguajes de máquina: simbolizaba con cadenas de 1 y 0 - estados de las señales
eléctricas- a las direcciones de memoria y las operaciones a realizarse sobre ellas,
sin distinción aparente.
Cada modelo de procesador tenía su lenguaje de máquina ya que los enunciados a usar
en un programa hacían referencia exclusiva a sus atributos: las instrucciones del
lenguaje eran las instrucciones del procesador.
Los circuitos electrónicos del procesador eran capaces de interpretar el significado de
cada una de esas secuencias de bits y llevar a cabo las acciones que codifican.
Ejemplo del aspecto real de un programa
b) Lenguaje de bajo nivel: se incorpora un mecanismo de abstracción.
El programador no necesita conocer el código de máquina, porque las posiciones de
memoria y operaciones a realizar sobre ellas se representan por nombres simbólicos
pero sigue teniendo que pensar y recordar la secuencia de operaciones elementales
del procesador. El lenguaje se denomina ensamblador. Para hacer una tarea sencilla
como sumar dos números puede necesitar varias operaciones del procesador.
El programa se introduce en la memoria de la computadora con la ayuda de un teclado
y cada letra se almacena en una posición, como una combinación particular de unos y
ceros. Para ello se creó un programa especial que al ejecutarse actúa sobre el código
ensamblador y lo “reescribe” en lenguaje de máquina: ensamblador.
“El lenguaje sigue atado a la máquina”.
Las palabras representan instrucciones y los # seguidos de números indican las direcciones de memoria a cuyo contenido se desea acceder.
c) Lenguaje de alto nivel: Más parecido al lenguaje humano.
Con los lenguajes de alto nivel se alcanza independencia de los procesadores, ya que los
elementos de estos lenguajes son palabras propias del humano que no hacen referencia a
ningún procesador en particular.
Una instrucción en lenguaje de alto nivel se corresponde con una secuencia de operaciones
realizables en determinadas posiciones de memoria. Con ella el programador hace
abstracción de cómo hará la máquina para ejecutarla.
Ejemplo: Se desea obtener el resultado de agregar el valor 8 al valor 25; El enunciado que
se corresponda con esta actividad humana en lenguaje natural podría ser: “sumar 8 y 25”
o “add 8 and 25”, etc.
Expresada en un lenguaje de alto nivel, la instrucción será por ejemplo: wr = 8 + 25;, pero
también podría ser wr := 8 + 25;.
. En ninguno de los dos casos es relevante cuáles serán las operaciones y las celdas de memoria que
intervendrán, la tarea es la misma. El símbolo es distinto por que corresponden a distintos
lenguajes de programación, es simplemente una cuestión de codificación.
En este caso se creó también un programa especial que al ejecutarse actúa sobre el
código de alto nivel y lo “reescribe” en lenguaje de máquina con el programa traductor.
Contando con estos recursos el programador puede ahora, ubicarse más cerca del
dominio del problema y alejarse completamente de la máquina.
No necesita conocer las formas de representación interna de los valores y puede
concentrar su atención, en la solución global del problema.
El trabajo del programador es el de construir abstracciones que permitan tratar con
eficiencia la complejidad del mundo real y el de los lenguajes de programación es
proporcionar herramientas que sirvan para construir estas abstracciones.
2. Según la forma de ejecución
a) Lenguajes compilados:
Un programa traductor traduce el código del programa, código fuente, en código
máquina, código objeto. Otro programa, el enlazador, unirá los ficheros de código
objeto del programa principal con los de las librerías para producir el programa
ejecutable. Ejemplo: C.
b) Lenguajes interpretados:
Un programa, intérprete, ejecuta las instrucciones del programa de manera directa.
Ejemplo: Lisp.
También hay mixtos, como Java, que primero pasan por una fase de compilación en la
que el código fuente se transforma en “bytecode”, y este “bytecode” puede ser
ejecutado luego, interpretado, en computadoras con distintos arquitecturas
(procesadores) que tengan todos instalados la misma “máquina virtual” Java.
3. Según el paradigma
a) Imperativos: establecen cómo debe ejecutarse una tarea fraccionándola en
procedimientos que especifican cada una de las tareas, por ejemplo C, Fortran y Pascal.
b) Declarativos: establecen estructuras de datos y las relaciones entre ellos que son
significativas para ejecutar una tarea determinada, al tiempo que indican cual es el
objetivo de dicha tarea. Ejemplo: Prolog.
c) Orientado a objetos: usa objetos y sus interacciones para diseñar aplicaciones y
programas de ordenador; está basado en varias técnicas, incluyendo herencia,
modularidad, polimorfismo y encapsulamiento. Ejemplo: Smalltalk
d) Funcional: es un paradigma de programación declarativo basado en la utilización de
funciones matemáticas, Ejemplo: LISP.
En la práctica es habitual que se mezclen, dando lugar a la programación multiparadigma.
La abstracción es uno de los procesos mentales más comunes que realizamos de manera
rutinaria y usamos sin darnos cuenta. El medio de qué nos valemos los seres humanos
para realizar esta construcción mental es el lenguaje.
Entonces…
La abstracción en informática
Enunciado de una situación problemática
Al buscar la solución crea, en su mente, una abstracción del problema para encontrar un método que describa el proceso de solución.
Encontrado el método, es decir, paso a paso “lo qué hay que hacer”, lo implementará en un programa mediante un lenguaje de programación
1 3 2
Ejemplo:
HECHO REAL ENUNCIADOS A RESOLVER
En un seminario sobre “Teoría de los lenguajes” que tiene un cupo de 100 asistentes se registran apellido, edad e importe pagado en concepto de inscripción por los presentes al mismo. No todos pagan el mismo valor
PROBLEMA 1: Teniendo como dato el apellido de cada asistente a un seminario se quiere determinar cuántos no asistieron sabiendo que el cupo era de 100
PROBLEMA 2: Calcular la edad promedio de los asistentes a un seminario a partir de la edad de cada uno de ellos.
PROBLEMA 3: Calcular el importe promedio pagado por los asistentes a un seminario a partir del valor pagado por cada uno de ellos.
Un lenguaje de programación permite:
definir un proceso que ejecutará una computadora
hacer abstracción de la máquina, se ajusta más al problema
construir nuevas abstracciones que se adapten al dominio del problema
Un programa es una descripción abstracta de un procedimiento que existe o puede existir en
el mundo real.
Los lenguajes de programación son las herramientas para implementar esos modelos
abstractos.
Por medio de un lenguaje de programación se puede representar, en la computadora, el
proceso de solución de un problema.
La abstracción es clave para diseñar un buen programa.
Al diseñarse un lenguaje se tiene en cuenta el estilo de programación o paradigma al que se
ajustará.
Conclusiones
La abstracción ofrecida por los lenguajes de programación
Alejados ya de la máquina, los lenguajes siguieron evolucionando de la mano de la
complejidad de los problemas que se pretendían resolver automáticamente.
Brindan variados recursos al programador, para que, al diseñar el programa “ignore”
distintos detalles del funcionamiento interno de la computadora.
Se dividen en dos grandes grupos:
1. Las que tienen que ver con los datos que deberán procesarse, abstracción de datos
2. Las que tienen que ver con el orden en que se ejecuten las acciones que corresponden
al proceso, abstracción de control.
Abstracciones de Datos
Abstracciones básicas:
Se refieren a la “representación” de las características del valor de un dato: del precio de un
producto, del largo de un barco, de la edad de una persona, etc. en cuanto a los patrones
de bits que lo deben codificar, las direcciones de las celdas de memoria que se utilicen y las
operaciones que con ellos se pueda realizar.
Todo esto queda resumido en lo que, en los lenguajes llaman tipo de dato. Proveen de
palabras especiales con las que se identifica cada uno de los tipos, tal que, el programador
se abstrae de conocer los detalles de implementación en el hardware de los valores a
procesar. Por ejemplo, en el lenguaje C, los enunciados:
float pr,largo;
char ton
Indican que los identificadores pr y largo se refieren a respectivas posiciones de
memoria que contienen representaciones en punto flotante, que sus valores
corresponderán a números que pueden incluir valores fraccionarios y que
soportarán las operaciones aritméticas tradicionales y la comparación de su valor.
En tanto que ton se refiere a los números o de puntuación reconocidos en la
notación ASCII y que tendrán a la comparación como una operación permitida.
En Pascal, lo mismo se representaría:
var largo, pr: real;
ton: char;
En los lenguajes de alto nivel más antiguos o de primera generación (FORTRAN I, ALGOL,
etc.) los datos que se podían manipular eran puramente matemáticos, porque respondían
a aplicaciones científicas y de ingeniería.
Al extenderse el campo de acción de la programación hacia otras áreas, fue necesario
trabajar con otros datos y, por lo tanto, con valores de otro tipo que se incorporarían
como básicos a los lenguajes. Es el caso de los valores lógicos y de los caracteres.
El programador estaba limitado a usar las abstracciones que proveía el lenguaje.
Abstracciones de organización
Se refieren a la “representación” de datos más complejos.
Son los que se corresponden con una colección de valores de datos relacionados entre sí
(nombre de una ciudad, datos personales de un estudiante, etc.).
Para la abstracción de estos conjuntos, el concepto fundamental es el de dato
estructurado.
Los lenguajes incluyen como propias, algunas formas de organización o estructuras de
datos, tales como arreglos, registros, cadenas entre otras, cada una de las cuales
presenta características exclusivas del agrupamiento.
Con algunos lenguajes se pueden definir las estructuras de datos como si fueran tipos,
con las mismas posibilidades de manejo que los tipos básicos, pero con los rasgos y
cualidades específicas que el programador requiera.
Al contar con estos recursos, el programador tuvo la posibilidad de pensar en distintas
formas de organizar los grupos de valores que fuera necesario manipular.
Se hizo sumamente importante en la etapa de diseño de la solución del problema, detectar la
o las estructuras más apropiadas para cubrir las necesidades del tratamiento de los datos
ajustando las exigencias del problema a las posibilidades que ofrecen estas herramientas.
Los lenguajes que se fueron inventando (que serían luego encuadrados en generaciones)
incluyeron progresivamente, no sólo estas abstracciones sino que fueron incorporando la
posibilidad de permitir al programador definir nuevas abstracciones de datos más
específicas.
Se refieren a la posibilidad de trabajar, en determinados lugares del programa, con
agrupamiento de código en forma de archivo.
Las abstracciones de datos unitarias son la base del mecanismo de las bibliotecas
estándar, de los paquetes o de las clases (en los lenguajes orientados a objeto).
Abstracciones unitarias:
Abstracciones de Control
Abstracciones básicas:
Son las que sintetizan en una sola instrucción, expresada en un único enunciado, a
varias acciones de máquina.
El mecanismo que usa la máquina, para realizar un cálculo (aritmético, lógico, de
concatenación, etc.) involucra varias acciones que son distintas a las que tienen que ver
con el traslado de valores de una localización a otra de la memoria. Sin embargo, el
programador no se ocupa de ello, el lenguaje tiene un único enunciado llamado
sentencia de asignación que combinada o no con algún símbolos especial, resume el
accionar interno del hardware.
Por ejemplo, en lenguaje C:
x = ‘M’; activa una determinada cadena de bits en una dirección de memoria.
z = 4 + w; recupera el valor almacenado en una dirección de memoria y lo agrega
a otro valor, activándose en una dirección de memoria distinta, la cadena de bits
que representa al resultado. ex = imp; copia (o traslada) el valor almacenado en una dirección a otra.
En lenguaje Fortran:
x = ‘M’
z = 4 + w
ex = imp
En lenguaje Pascal:
x := ‘M’;
z := 4 + w;
ex := imp;
En un lenguaje de programación el enunciado que viene a resumir este accionar, es la
sentencia goto (ir a…). Se considera que, salvo para necesidades especiales, esta
sentencia no es una forma útil de abstracción porque en realidad, con ella el
programador no se libera de “pensar” en el accionar de la máquina para mantener el
control sobre las instrucciones.
Internamente, la máquina almacena también en posiciones de memoria, a cada una de las
instrucciones. Estas posiciones son consecutivas, de tal manera que, cuando se lo requiera,
se ejecutarán automáticamente una después de la otra, salvo que una de esas instrucciones
de máquina sea la que indica un salto en la secuencia. En ese caso, lo que hace, es transferir
el control a la posición específica de memoria donde se encuentra otra instrucción que, de
alguna forma, se ha etiquetado para ese fin (mediante un nombre o un número)
1 GOTO 10 2 estas líneas se saltan ... 3 ... 4 ...y la ejecución continúa aquí 5 10 CONTINUE
el control salta de la línea 1 a la 5.
Todas las sentencias que haya las líneas intermedias no se ejecutan
Los lenguajes actuales tienen esta sentencia pero habilitada sólo para
situaciones puntuales de la programación.
Abstracciones estructuradas:
Son las que describen el orden en el cual las acciones van a ser ejecutadas.
El hardware dispone de mecanismos que implementan la secuencialidad en la
ejecución de las instrucciones de máquina, mediante un contador de programa que se
incrementa con cada instrucción llevada a cabo.
El contador puede ser modificado por una instrucción especial, tal que se provoque un
cambio en el flujo de las acciones pues se estaría transfiriendo el control a una
posición especificada, distinta que la próxima en la secuencia.
Así es que se puede provocar una división en el flujo de instrucciones o una
reiteración de las ya ejecutadas.
Las abstracciones que proveen los lenguajes para que el programador no tenga que manipular
con estas acciones, son las denominadas estructuras de control y corresponden a enunciados
de selección simple (if-then-else en la mayoría de los lenguajes) de selección múltiple (case
en Pascal, switch en C) y a los bucles o ciclos (for, while, dowhile en C o for, while, repeat-
until en Pascal, o do, do while en Fortran)).
Otro mecanismo para controlar el flujo durante la ejecución de un programa, aunque
bastante más complejo a nivel de máquina, es el subprograma.
Es un recurso que se puede trabajar de dos maneras distintas: una es la que se denomina
subrutina o procedimiento) y la otra función.
Consiste en un agrupamiento de acciones que resuelven un problema determinado, tiene
sus propios datos y responde a un algoritmo específico.
Se comporta como una unidad de programa independiente, pero asociada al programa
principal de tal manera, que puede intercambiar explícitamente valores con él.
El grupo de sentencias de las líneas 2 a la 4 , encerradas entre
llaves, se ejecutan como un único bloque si se cumple que x>=0 y
en otro caso se ejecuta la sentencia 6.
Otros lenguajes como Haskell, utilizan la sangría como sustitución de llaves para indicar
anidamiento, como en la siguiente función:
Además las abstracciones de control
estructuradas se pueden anidar unas dentro de
otras. Por ejemplo en C:
Es así que el subprograma es llamado desde el programa principal.
En esa circunstancia, se establece una conexión de paso (parámetros) para intercambiar
información y se transfiere el control a la unidad de programa invocada.
El subprograma es una abstracción muy especial que distingue entre la definición y el uso
de la acción abstracta. Debe ser diseñado por el programador y puede ser usado cuando
sea necesario, como si fuera una única acción.
Durante su diseño, el programador se concentra solamente en el “cómo debe
trabajar” (implementa la abstracción) e incluso debe identificar el proceso con un
nombre. Cuando lo pone en uso, se concentra en el “qué hace”, ignorando los
detalles de su real implementación (usa la abstracción).
En esta doble abstracción se sintetiza no sólo la operatoria (en el cuerpo del
subprograma) sino un mecanismo complejo que incluye la información referida al
estado del programa en el punto de la invocación y al proceso de transferencia del
control hacia y desde el subprograma (en la llamada)
Son las que permiten reunir procedimientos que resuelven situaciones individuales,
lógicamente vinculadas.
Este tipo de abstracción de control provee herramientas para la programación en paralelo.
El hardware actual, al tener varios procesadores, puede ejecutar varios procesos a la par.
Los lenguajes modernos han incorporado entonces, mecanismos de control específicas
como son los hilos o los task.
Abstracciones unitarias:
Implementación de un lenguaje
Se refiere a la manera de convertir o traducir a lenguaje de máquina un programa escrito en un
lenguaje de programación. Es lo que va a permitir que se ejecute un programa para una
determinada combinación hardware-software.
La conversión se realiza a través de un traductor, que no es más que un programa que recibe a
otro programa escrito en un determinado lenguaje.
El proceso de conversión se puede realizar de dos maneras:
- mediante interpretación (el traductor se llama intérprete): convierte y ejecuta el programa.
El programador no percibe la conversión a lenguaje de máquina, parece que se ejecuta
directamente.
- mediante compilación (el traductor se llama compilador): la actividad final del proceso de
traducción es la generación de un nuevo código, se construye una secuencia de instrucciones en
lenguaje de máquina que representan a los enunciados del programa fuente, el producto final
es el programa objeto.
Este sufrirá otros tratamientos para terminar en un programa ejecutable.
La traducción consiste, esencialmente, en tres actividades básicas que llevan a cabo tanto
los compiladores como los intérpretes: análisis léxico, análisis sintáctico y semántico.
En el análisis léxico se reconocen las entidades elementales que se representan con las
distintas cadenas de símbolos (identificadores, palabras reservadas y constantes), en el
sintáctico se analiza la estructura gramatical de un enunciado y se reconoce el papel de
cada uno de sus componentes y en el análisis semántico se analiza el significado.
Los lenguajes de programación “ son una herramienta para describir computaciones"
donde prevalecen la legibilidad de la maquina y de los programadores.
“El reto de un lenguaje es lograr la potencia, expresividad y comprensión que requiere
la legibilidad del programador conservando la precisión y simplicidad necesarias para su
traducción al lenguaje de maquina. La legibilidad del programador es parcialmente
proporcional a las capacidades de abstracción del lenguaje con mecanismos para la
abstracción de datos mediante estructuras de datos y la abstracción del control de la
ejecución para resolver el problema
y por lo tanto el objetivo principal de la abstracción en el diseño de los lenguajes de
programación es el control de la complejidad.