Principios de los lenguajes de programación



Descargar 51,5 Kb.
Fecha de conversión08.06.2017
Tamaño51,5 Kb.

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.
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.
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:

  1. No necesita saber la información oculta para usar la abstracción, y

  2. 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 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.
...

IF (a.eq.b) THEN

GOTO 10

ELSE


GOTO 20

ENDIF


10 print *,’Son iguales’

stop

20 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.

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:





+

-

1

>

<

2

== (igual)

¡= (diferente)

3

OR

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.
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.

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.
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.

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


La base de datos está protegida por derechos de autor ©absta.info 2016
enviar mensaje

    Página principal