Download info

Document related concepts

Scheme wikipedia , lookup

Rust (lenguaje de programación) wikipedia , lookup

Programación funcional wikipedia , lookup

Little man computer wikipedia , lookup

Clojure wikipedia , lookup

Transcript
Principios de los lenguajes de programación
Abstracción
Hay que evitar que un proceso se inicie más de una vez. Una
abstracción es una representación de un objeto que incluye sólo los
atributos importantes del objeto original, ignorando aquellos atributos que
son irrelevantes para el propósito.
Un lenguaje de programación ofrece dos tipos de abstracción.
Primeramente, el lenguaje proporciona directamente un conjunto útil de
abstracciones que conocemos como “características” del lenguaje. Segundo,
el lenguaje proporciona facilidades que ayudan al programador a construir
sus propias abstracciones. Los subprogramas, las bibliotecas de
subprogramas, definiciones de tipo y paquetes son algunas facilidades
proporcionadas por diferentes lenguajes para soportar las abstracciones
definidas por el programador.
Una abstracción es una herramienta intelectual que permite trabajar
con los conceptos independientemente de las particularidades de estos.
Permite la separación de los conceptos de un sistema para implementarlo
después. Por ejemplo, permite especificar una propiedad FIFO o LIFO, sin
preocuparse del esquema utilizado para instrumentar dichas propiedades.
Una abstracción funcional (o de procedimientos) aplica un conjunto de
entradas a un conjunto de salidas, pudiendo en algún momento modificar
algunas de las entradas.
Una abstracción de datos está formada por un conjunto de objetos y
un conjunto de operaciones (abstracciones funcionales) que manipulan esos
objetos.
Automatización (AUTOMATION)
Automatizar mecanismos, actividades tediosas o de error probable.
Al estar programando en ocasiones debemos tener mucho cuidado,
por ejemplo con los apuntadores, ya que un mal manejo de estos puede
provocar problemas con la memoria. También hay algunas actividades que
por ser muy repetitivas y cansadas, se vuelven tediosas, lo cual se presta
mucho a que salgan posibles errores, por ejemplo al querer que el programa
realice una serie de instrucciones n veces, es mejor que exista un
mecanismo que nos permita envolver estas en un ciclo que se repetirá n
veces (como un for) a estar repitiendo las n veces ese conjunto de
instrucciones. De esta forma eliminamos esa tarea que llega a ser tediosa y
se presta mucho a errores de dedo.
Principios de los lenguajes de programación
Por eso el principio de automatización propone que este tipo de
actividades se implementen con mecanismos automatizados para evitar lo
más posible los problemas que puedan causar.
Un ejemplo de esto es utilizar una maquina virtual al estar
programando en ensamblador, ya que podríamos obtener por error la
dirección del BIOS y guardarla en una variable la cual pudiéramos utilizar
para guardar algunos datos en un registro, por consecuencia lógica
estaríamos borrando nuestro BIOS.
put dirBIOS, var
...
put var, dato
En este ejemplo no se muestra una actividad tediosa (que si podría
tomarse como tal ya que el manejo de apuntadores lo es), pero si es una
actividad que tiene una alta probabilidad de que ocurran errores, por lo que
se puede considerar como de error probable.
Defensa en profundidad
Tener una serie de defensas tal que si un error no es detectado por uno,
este probablemente sea detectado por otro.
Los errores deben ser detectados por el compilador, si un mecanismo no es
capaz de detectar un error es necesario implementar otro que lo detecte,
pero nunca ignorarlo.
Ocultación de Información
Fue enunciado por David Parnas en los 70`s y dice que "Los módulos
de un sistema deben diseñarse de modo que la información contenida en
ellos sea inaccesible a todos aquellos módulos que no la necesiten".
Establece las restricciones de acceso a los detalles internos de cualquier
módulo y a cualquier estructura de datos utilizada localmente en el mismo.
El módulo oculta su funcionalidad interna y se comunica con otros mediante
interfaces.
Principios de los lenguajes de programación
Representación de un módulo creado con el principio de ocultamiento de
información
El lenguaje deben permitir módulos diseñados para que
(1) El usuario del lenguaje tenga toda la información necesaria para usar el
módulo correctamente, y nada más;
(2) El desarrollador del lenguaje tiene toda la información necesaria para
llevar a cabo el módulo correctamente, y nada más.
Este ocultamiento de información se puede ver en varios casos. Por
ejemplo, cuando utilizamos algún software mediante su interfaz, no nos
importa cómo el programa maneja internamente la información, lo que nos
importa es el resultado que obtenemos.
Información oculta es un término con que se designa uno de los
principios centrales en el diseño de abstracciones definidas por el
programador tales como subprogramas y tipos de datos nuevos: cada
componente del programa debe ocultar tanta información como sea posible
al usuario del componente. Por ejemplo, la función de la raíz cuadrada
proporcionada por el lenguaje es una exitosa abstracción porque oculta al
usuario los detalles de la representación del número y el algoritmo de
computación para la raíz cuadrada.
Cuando la información es encapsulada en una abstracción significa que
el usuario de la abstracción:
a) No necesita saber la información oculta para usar la abstracción, y
b) No es permitido usar o manipular directamente la información
oculta, aún cuando lo desee.
Etiquetado (LABELING)
Evitar secuencias arbitrarias más que unos pocos items largos. No
requiere que el usuario conozca la posición absoluta en una lista. En lugar de
Principios de los lenguajes de programación
esto, se debe asociar una etiqueta significativa con cada item y dejar que el
item ocurra en cualquier orden.
Este principio cuando ocupa la palabra item se está refiriendo a
pedazos de código que realizan una tarea determinada.
El etiquetado nos ayuda para poder realizar saltos dentro de un
programa ya que en la mayoría de estos no es factible poner todo el código
seguido y que se ejecute en forma lineal. Las etiquetas nos ayudan a no
estar guardando o calculando la localidad absoluta de memoria a donde
queremos que continúe la ejecución del programa, sino que esta continuará
donde encuentre la etiqueta indicada.
Con esto podemos facilitar la lectura de los programas, además
tenemos la posibilidad de reutilizar código escribiéndolo solo una vez
comportándose esto como una función.
Por ejemplo, el siguiente código en FORTRAN compara dos números,
si son iguales entra en el IF y dentro de este se manda la ejecución del
programa a la bandera marcada como 10, en caso contrario entra en el ELSE
y salta ahora a donde está la bandera marcada como 20.
10
20
...
IF (a.eq.b) THEN
GOTO 10
ELSE
GOTO 20
ENDIF
…
print *,’Son iguales’
stop
print *,’Son distintos’
end
En este código se manejan dos banderas explícitas, pero hay algunas
implícitas que trae el lenguaje de programación como el IF y su ELSE, ya
que estos se pueden considerar como items en los cuales si no se ejecuta el
primero el lenguaje realizara un salto hasta la bandera asociada con ese
ELSE para ejecutar ese item.
Principios de los lenguajes de programación
Localización de costos
Los usuarios solo deben pagar por lo que usan, deben evitar costos
distribuidos.
Un buen lenguaje de programación debe permitir al programador
determinar los costos y permitirle elegir que parte del lenguaje usar y por
lo tanto pagar menos por él.
La determinación se basa en los siguientes puntos:
 Costo de ejecución
 Costo e compilación
 Costo de creación de programas
 Costo de uso y prueba
 Costo de mantenimiento.
Interface Manifiesta
Todas las interfaces deben ser aparentes (manifiestas) en la sintaxis.
Dice que la interface con un objeto es su protocolo, el conjunto de mensajes
a los cuales el objeto responde.
La interface con un objeto debe ser reconocible fácilmente; debe ser
visible y debe ser lo más clara y descriptiva posible.
Ortogonalidad (ORTHOGONALITY)
Funciones independientes deben ser controladas por mecanismos
independientes.
La ortogonalidad viene dad por las rectas que se interceptan y forman
ángulos rectos entre sí (como los ejes en un plano cartesiano), se dice que
estas rectas son independientes, por lo que el principio d ortogonalidad se
basa en estas rectas. Entonces podemos ver que el lenguaje de
programación tiene funciones independientes distintas unas de otras, las
cuales van en el mismo camino en cualquier circunstancia.
En si, trata de juntar varias funciones (independientes) en distintos
grupos para después poder hacer referencia a estas con mayor facilidad.
Por ejemplo, par las operaciones lógicas podríamos agruparlas en conjuntos
de la misma naturaleza y realizar la referencia con un dígito tomando en
cuenta su signo como muestra la siguiente tabla:
Principios de los lenguajes de programación
1
2
3
+
>
== (igual)
OR
<
¡= (diferente)
AND
Aquí se ve que cada es independiente, al igual que el mecanismo
utilizado para su control ya que se puede observar que los dígitos y sus
signos pueden formar las rectas ortogonales.
Este principio además ayuda para reducir a la mitad el número de
códigos que el programador debe aprender.
Portabilidad
Se deben evitar características o facilidades tal que dependan de
una maquina en particular o un pequeño grupo de máquinas.
Un lenguaje es portable si un programa puede ser compilado en
diferentes computadoras y ejecutable en diferente hardware.
Como ejemplo tenemos el lenguaje cobol permite definir el tipo de
computadora en el cual se compilara el programa y escoger la plataforma en
que se ejecutará.
Preservación de la Información
El lenguaje debe permitir la representación de información que el
usuario deba saber y que el compilador pueda necesitar. Debe proporcionar
las herramientas necesarias para que tanto el usuario del lenguaje como el
desarrollador del mismo puedan realizar su trabajo correctamente.
Regularidad (REGULARITY)
Reglas regulares, sin excepción son fáciles de aprender, usar,
describir e implementar.
Este principio también es conocido por otros autores como uniformidad
(uniformity). Quiere decir que notaciones similares deben verse y comportarse parecido.
Principios de los lenguajes de programación
Esto se refiere a que si tenemos una instrucción que termine un
bloque de código en específico, por ejemplo el END, debe tener otra
instrucción que indique el inicio de ese bloque de código, como por ejemplo
el BEGIN en este caso. Pero también define que podemos tener símbolos
que especifiquen el final de una instrucción, como el punto y coma en el
lenguaje C.
Por lo tanto este principio se enfoca a la definición de las fronteras
de una instrucción o un conjunto de ellas agrupadas en un bloque de código
para que el lenguaje conozca donde comienza y en donde termina cada una y
así poder interpretarlas correctamente.
Por ejemplo, el siguiente código en C muestra las fronteras de una
función llamada “func”, donde los delimitadores son las llaves que abren y
cierran en un cierto orden.
int func (int c)
{
c = c * c;
return (c);
}
Aquí también hay otros delimitadores, estos son los paréntesis que
nos indican que todo lo que esté dentro de ellos son variables que recibe de
otra parte del programa. También tenemos el punto y coma que delimita las
instrucciones que están dentro de la función.
Como se puede observar, estas son reglas básicas que no son difíciles
de aprender ni entender ya que en todo el programa se están utilizando y en
ocasiones ni siquiera se nota que se estén utilizando. Hay que notar que cada
lenguaje tiene su propio conjunto de reglas de este tipo ya que por ejemplo
en el lenguaje C las instrucciones se delimitan por el punto y coma, pero en
otros lenguajes, como por ejemplo BASIC, la delimitación de sus
instrucciones la reconoce por un salto de línea.
Seguridad
Ningún programa que viole la definición de el lenguaje o su propia
estructura propuesta, debe escapar a la detección.
La base de este principio es disminuir el al mínimo la posibilidad de
que el programador cometa un error.
Principios de los lenguajes de programación
Simplicidad
Un lenguaje debe ser tan simple como sea posible. Debe haber un
número mínimo de conceptos con reglas simples para su combinación.
Un lenguaje de programación debe esforzarse en la simplicidad
sintáctica y semántica. Simplicidad en la semántica implica que el lenguaje
contiene un mínimo número de conceptos y estructuras. Estos conceptos
deben ser naturales, rápidamente aprendidos, y fácilmente entendidos. with
little danger of misinterpretation.
La simplicidad sintáctica requiere que la sintaxis represente cada
concepto en una y una única forma y que ésta interpretación es tan legible
como sea posible. Esto no necesariamente implica que la sintaxis es tan
concisa como sea posible, desde que la concisión es a menudo
contraproducente a la legibilidad. Excluye múltiples representaciones de la
misma semántica conceptual y representaciones sintácticas que son
fácilmente confusas.
La simplicidad requiere que un idioma incorpore tan pocos conceptos
como sean posibles. El lenguaje debe ser una ayuda para el programador
antes de que alcance el estado real de codificación en programación. Debe
darle un conjunto de conceptos claro, simple y unificado para que pueda
usarlos como primarios en el desarrollo de lenguajes. Para ello es deseable
tener un número mínimo de conceptos diferentes, con las reglas de su
combinación lo más simples y regulares posibles. Esta claridad semántica y
de conceptos es el factor determinante del valor de un lenguaje.
Estructura (STRUCTURE)
La estructura estática de un programa debe corresponder en un
camino simple con la estructura dinámica de los computo correspondientes.
Este principio nos dice que debe ser posible visualizar el
comportamiento dinámico de un programa fácilmente desde su forma
estática. Donde con comportamiento dinámico nos referimos al
comportamiento que tiene el programa en tiempo de ejecución, y a su forma
estática al programa escrito.
En otras palabras, debemos poder entender como se va a comportar
el programa al ser ejecutado simplemente con ver el código y seguirlo
instrucción por instrucción. De esta forma podemos hacer una revisión de
nuestros códigos para poder detectar errores que pudiéramos haber
cometido, además de hacerlo entendible también para los demás.
Principios de los lenguajes de programación
Por ejemplo, cuando una segmento de código debe ejecutarse antes
de tiempo que otro, las instrucciones del primer segmento deben estar
antes de las del segundo en el programa escrito.
Para poder comprender mejor esto tomemos el código siguiente:
int a = 1;
int b = 2;
...
printf (“Variable A = %d\n”, a);
printf (“Variable B = %d”, b);
...
Aquí podemos ver claramente que las asignaciones de las variables “a”
y “b” están escritas antes que las funciones de entrada y salida definidas
por los “printf”, por lo que según el principio de estructura se deberán
ejecutar primero.
Consistencia sintáctica
Las cosas similares deben lucir similares y las cosas deferentes
deben lucir diferentes.
Todas las palabras reservadas y las funciones definidas en el lenguaje
deben tener evitar confundir al programador con la sintaxis de sus
declaraciones.
Uno, cero e infinito(ninguno)
Los únicos números razonables son uno, cero e infinito, es decir no es
conveniente diseñar un lenguaje de programación que requiera que el
programador memorice valores diferentes a estos tres valores, por
ejemplo para denotar un valor vació en la mayoría de los lenguajes se utiliza
el valor de cero , la violación de este principio seria representar el valor
con otro numero que no sea el cero, ya que obligara que el aprendizaje del
lenguaje dependa de la memorización de diferentes valores.
Principios de los lenguajes de programación
Bibliografía
* Lenguajes de Programación, Diseño e Implementación
Terrence W. Pratt, Prentice Hall. 2ª. Edición.
* Programming Languages: Structures and Models
Herbert L. Dershem, Michael J. Jipping
*MacLennan, Bruce J. Principles of Programming Languages : Design,
Evaluation, and Implementation, 3rd Ed. Oxford University Press;
ISBN 0195113063