Download introducción al diseño de los lenguajes de programación principios

Document related concepts

Lisp wikipedia , lookup

Programación funcional wikipedia , lookup

Dylan (lenguaje de programación) wikipedia , lookup

J (lenguaje de programación) wikipedia , lookup

Haskell wikipedia , lookup

Transcript
Programación de Sistemas – Unidad II
INTRODUCCIÓN AL DISEÑO DE LOS LENGUAJES DE PROGRAMACIÓN
Son varios aspectos que están relacionados con un lenguaje de programación, el punto de vista de un programador profesional, el
de un diseñador del lenguaje y el de la persona que implementa dicho lenguaje, considerando también los aspectos relacionados
con el equipo de cómputo. El hablar de un programador, incluye importantes diferencias entre distintos niveles y aplicaciones de la
programación. Diferencias que pueden ir desde el tipo de lenguaje que conoce hasta la aplicación que desee hacer con dicho
lenguaje. Un programador de un lenguaje de programación es una persona o un grupo de personas que desarrolla un compilador o
interprete para un lenguaje sobre una máquina particular o tipos de máquinas. Los lenguajes de programación se clasifican
principalmente por nivel y por aplicaciones.
Cada programador tiene un estilo propio de programación, la decisión de incluir u omitir ciertos tipos de datos es importante en la
forma en que el lenguaje es usado así como omitir o utilizar ciertos conceptos de programación o modelos. Más adelante, se
contemplaran las características que se deben tener presentes al momento de diseñar un lenguaje de programación.
Los lenguajes de programación son por lo tanto una solución de compromiso entre las necesidades del emisor (programador –
persona) y del receptor (computador – maquina).
C. Morris realiza una división del estudio de los signos (semiótica) en las siguientes partes:
 Sintaxis: relación de los signos entre sí. (formato del lenguaje)
 Semántica: relación de los signos con los objetos a los que se aplican. (comportamiento de los programas)
 Pragmática: relación de los signos con sus intérpretes. (técnicas empleadas en su construcción)
PRINCIPIOS DE DISEÑO
Una pregunta natural al estudiar los lenguajes de programación es si existe un lenguaje perfecto. Si existiese tal lenguaje, entonces
sería importante identificar sus características y no perder el tiempo utilizando lenguajes imperfectos.
Al diseñar lenguajes de programación a menudo es necesario tomar decisiones sobre las características que se incluyen de forma
permanente, las características que no se incluyen pero que existen mecanismos que facilitan su inclusión y las que no se permiten.
Estas decisiones pueden afectar al diseño final del lenguaje y a menudo entrar en conflicto con otros aspectos del lenguaje.
A continuación se resumen algunos principios de diseño de lenguajes de programación:
CONCISIÓN NOTACIONAL.
El lenguaje proporciona un marco conceptual para pensar algoritmos y expresar dichos algoritmos con el nivel de detalle adecuado.
El lenguaje debe ser una ayuda al programador (incluso antes de comenzar a codificar) proporcionando un conjunto de conceptos
claro, simple y unificado. La sintaxis debe ser legible por el programador (o por otras personas que vayan a utilizar esos programas).
Deben buscarse soluciones de compromiso entre lenguajes demasiado crípticos (por ejemplo, C) y lenguajes demasiado prolijos
(Cobol, XSLT).
ORTOGONALIDAD.
Dos características de un lenguaje son ortogonales si pueden ser comprendidas y combinadas de forma independiente. Cuando las
características del lenguaje son ortogonales, el lenguaje es más sencillo de comprender, porque hay menos situaciones
excepcionales a memorizar. La ortogonalidad ofrece la posibilidad de combinar características de todas las formas posibles (sin
excepciones). La falta de ortogonalidad puede suponer la enumeración de situaciones excepcionales o la aparición de incoherencias.
Un ejemplo de falta de ortogonalidad es la limitación que impone Pascal para que una función devuelva determinados tipos de
valores.
ABSTRACCIÓN.
El lenguaje debe evitar forzar a los programadores a tener que enunciar algo más de una vez. El lenguaje debe permitir al
programador la identificación de patrones repetitivos y automatizar tareas mecánicas, tediosas o susceptibles de cometer errores.
Ejemplos de técnicas de abstracción son los procedimientos y funciones, la genericidad, los lenguajes de patrones de diseño, etc.
SEGURIDAD.
La fiabilidad de los productos software es cada vez más importante. Lo ideal es que los programas incorrectos no pertenezcan al
lenguaje y sean rechazados por el compilador. Por ejemplo, los sistemas con chequeo de tipos establecen restricciones a los posibles
1
ITSEldorado – Ing. Leonardo Ramírez
Programación de Sistemas – Unidad II
programas que pueden escribirse en un lenguaje para evitar que en tiempo de ejecución se produzcan errores. Existen lenguajes
como Charity que garantizan la terminación de sus programas [Charity].
EXPRESIVIDAD.
El programador debe poder expresar sus intenciones. En ocasiones, demasiada expresividad puede implicar falta de seguridad. De
hecho, algunos sistemas limitan la expresividad para mejorar la fiabilidad de los programas (por ejemplo, la aritmética de punteros
no es permitida en algunos lenguajes).
EXTENSIBLIDAD.
El lenguaje debe facilitar mecanismos para que el programador pueda aumentar la capacidad expresiva del lenguaje añadiendo
nuevas construcciones. En Haskell, por ejemplo, el programador puede definir sus propias estructuras de control.
PORTABILIDAD.
El lenguaje debe facilitar la creación de programas que funcionen en el mayor número de entornos computacionales. Este requisito
es una garantía de supervivencia de los programas escritos en el lenguaje y, por tanto, del propio lenguaje. Para conseguir la
portabilidad, es necesario limitar las características dependientes de una arquitectura concreta.
EFICIENCIA.
El programador debe poder expresar algoritmos suficientemente eficientes o el lenguaje debe incorporar técnicas de optimización
de los programas escritos en él.
LIBRERÍAS E INTERACCIÓN CON EL EXTERIOR.
La inclusión de un conjunto de librerías que facilita el rápido desarrollo de aplicaciones es una componente esencial de la
popularidad de los lenguajes. Si no se dispone de tales librerías, es necesario contemplar mecanismos de enlace con otros lenguajes
que facilitan la incorporación de librerías externas.
ENTORNO.
Aunque el entorno no forma parte del lenguaje, muchos lenguajes débiles técnicamente son ampliamente utilizados debido a que
disponen de un entorno de desarrollo potente o agradable. De la misma forma, la disposición de documentación, ejemplos de
programas e incluso programadores pueden ser factores clave de la popularidad de un lenguaje de programación.
DEFINICIÓN DE UN LENGUAJE
Cuando se extiende la utilización de un lenguaje de programación, es fundamental disponer de una definición completa y precisa del
lenguaje que permita desarrollar implementaciones para diferentes entornos y sistemas. Los programas escritos en un lenguaje
determinado, deben poder ser procesados por cualquier implementación de dicho lenguaje.
El proceso de estandarización se desarrolla como respuesta a esta necesidad. El estándar de un lenguaje es una definición formal de
la sintaxis y semántica. Debe ser completo y no ambigüo. Los aspectos del lenguaje que son definidos, deben quedar claramente
especificados, mientras que algunos aspectos que se salgan de los límites del estándar debe ser claramente designados como
“indefinidos”. El procesador de un lenguaje que implementa un estándar debe ajustarse a todos los aspectos definidos, mientras
que en los aspectos indefinidos puede recurrir a soluciones propias. La autoridad que define el estándar de un lenguaje o que
cambia la definición de un lenguaje puede variar desde un diseñador individual a una agencia de estandarización como ANSI, ISO o
ECMA.
En el caso de las agencias de estandarización, es habitual recurrir a la creación de un comité de personas con orígenes diversos
(gente del mundo industrial o del mundo académico). El proceso no suele ser fácil ya que es necesario decidir entre numerosos
dialectos y combinaciones de ideas. En numerosas ocasiones, el proceso llega a durar varios años y durante el mismo se producen
diversas versiones a menudo incompatibles entre sí.
El primer estándar de un lenguaje a menudo limpia algunas ambigüedades, fija algunos defectos obvios y define un lenguaje mejor y
más portable. Los implementadores de dichos lenguajes deben entonces realizar un proceso de ajuste de sus implementaciones
para adoptar el estándar. En dicho proceso aparecen varios tipos de desviaciones:
2
ITSEldorado – Ing. Leonardo Ramírez
Programación de Sistemas – Unidad II
EXTENSIONES.
Numerosas implementaciones añaden nuevas características al estándar sin romper la compatibilidad con el mismo.
MODIFICACIONES.
En ocasiones, los implementadores de un lenguaje consideran necesario modificar algunas características del estándar. Este tipo de
modificaciones puede perjudicar la compatibilidad de los programas escritos en el lenguaje.
ERRORES.
Finalmente, las implementaciones de un lenguaje pueden desviarse del estándar sin pretenderlo, bien por una falta de comprensión
de la especificación, bien por un error de la implementación. Los errores o bugs de las implementaciones son muy abundantes y
peligrosos.
Independientemente de la postura que se tenga respecto al estándar de un lenguaje, a la hora de construir una aplicación es
necesario tomar con precaución la decisión de incluir características no estándar. Cada inclusión de una característica no estándar de
un lenguaje supone un paso atrás en la portabilidad del programa y decrementa su posterior usabilidad y tiempo de vida. Los
programadores que utilizan características no estándar en sus programas deberían segregar los segmentos con dichas características
y documentarlos claramente.
TÉCNICAS DE ESPECIFICACIÓN SEMÁNTICA
Es importante distinguir entre la sintaxis y semántica de un lenguaje de programación. La sintaxis describe la estructura aparente del
lenguaje: qué constituye un token, un bloque, un procedimiento, un identificador, etc. La semántica asume que el programa ya ha
sido analizado sintácticamente y relaciona la estructura del programa con su comportamiento: qué hace el programa, qué cálculos
realiza, qué muestra por pantalla, etc.
En general, la sintaxis es más fácil de afrontar. En la definición de Algol 60, se utilizó con gran éxito la notación BNF (Backus-Naur
Form) para especificar la sintaxis del lenguaje. Desde entonces, esta notación ha sido aceptada universalmente y ha suplantado a
otras técnicas de especificación sintáctica.
Sin embargo, no existe una notación aceptada universalmente de especificación semántica. Por el contrario, se han inventado un
gran número de notaciones y se siguen inventando nuevas notaciones de forma regular. La razón es que la descripción del
comportamiento de los programas tiene una mayor complejidad que la de su estructura.
La búsqueda de técnicas de especificación semántica se ve motivada por las siguientes aplicaciones:
 En el diseño de lenguajes de programación. Los diseñadores necesitan una técnica que les permite registrar las decisiones
sobre construcciones particulares del lenguaje y descubrir posibles irregularidades u omisiones.
 Durante la implementación del lenguaje, la semántica puede ayudar a asegurar que la implementación se comporta de
forma adecuada.

La estandarización del lenguaje se debe realizar mediante la publicación de una semántica no ambigüa. Los programas
deben poder transportarse de una implementación a otra exhibiendo el mismo comportamiento.
 La comprensión de un lenguaje por parte del programador requiere el aprendizaje de su comportamiento, es decir, de su
semántica. La semántica debe aclarar el comportamiento del lenguaje y sus diversas construcciones en términos de
conceptos familiares, haciendo aparente la relación entre el lenguaje considerado y otros lenguajes familiares para el
programador.
 La semántica asiste al programador durante el razonamiento sobre el programa: verificando que hace lo que se pretende.
Esto requiere la manipulación matemática de programas y significados para poder demostrar que los programas cumplen
ciertas condiciones.
 Finalmente, el estudio de las especificaciones semánticas ayudará a comprender las relaciones entre diferentes lenguajes
de programación, aislando propiedades comunes que permitan avanzar la investigación de nuevos lenguajes de
programación.
Las principales técnicas de especificación semántica de un lenguaje de programación son:

Descripción en lenguaje natural: La especificación de la mayoría de los Lenguajes desde Fortran hasta Java se ha realizado
en lenguaje natural más o menos formal. Las descripciones en lenguaje natural acarrean una serie de problemas como la
3
ITSEldorado – Ing. Leonardo Ramírez
Programación de Sistemas – Unidad II


falta de rigurosidad, la ambigüedad, etc. que dificultan la verificación formal de programas y corrección de las
implementaciones.
Implementaciones prototipo: Se define un intérprete estándar para el lenguaje que funciona en una determinada máquina.
El problema es decidir qué lenguaje se utiliza en la construcción de dicho intérprete. En muchas ocasiones se utilizan
lenguajes ya implementados con el fin de ofrecer especificaciones ejecutables. En otras ocasiones, se utiliza el mismo
lenguaje que se está definiendo. En todos los casos, se produce una sobre-especificación (es necesario especificar no
solamente el lenguaje objeto, sino el lenguaje de implementación).
Semántica denotacional [Tennent 94]: Se describe el comportamiento del programa modelizando los significados (efectos
de las diversas construcciones del lenguaje) mediante entidades matemáticas. La denotación de una programa se considera
como una función del estado anterior al comienzo de la ejecución al estado final.
4
ITSEldorado – Ing. Leonardo Ramírez
Programación de Sistemas – Unidad II

Semántica operacional: Los significados del programa son descritos en términos operacionales. Se utiliza un lenguaje
basado en reglas de inferencia lógicas en las que se describen formalmente las secuencias de ejecución de las diferentes
instrucciones en una máquina abstracta. Semántica axiomática: Emplea un sistema formal de razonamiento sobre los
significados de los programas como una descripción del comportamiento del lenguaje. El sistema permite estudiar
formalmente las propiedades del lenguaje y se requiere la utilización de sistemas consistentes y completos que no siempre
son asequibles. Existen sistemas híbridos como la semántica de acción de Mosses o la semántica monádica modular que
facilitan la legibilidad sin perjuicio de la rigurosidad matemática. Permitiendo, además, la automatización de la construcción
de prototipos.
CARACTERÍSTICAS DEL LENGUAJE
Las características que se consideran son:
 Representación.
 Tipos básicos.
 Tipos de datos compuestos.
 Expresiones y operadores.
 Declaraciones y ámbitos.
 Variables, referencias y asignaciones.
 Control de la ejecución.
 Mecanismos de abstracción.
 Entrada / salida.
 Objetos, clases y herencia.
 Genericidad.
1.1 VISIÓN DEL PROBLEMA
Al desarrollarse las primeras computadoras electrónicas, se vio la necesidad de programarlas, es decir, de almacenar en memoria la
información sobre la tarea que iban a ejecutar. Las primeras se usaban como calculadoras simples; se les indicaban los pasos de
cálculo, uno por uno.
¿Cómo es que describimos un programa como números? Se tenía el problema de representar las acciones que iba a realizar la
computadora, y que la memoria, al estar compuesta por switches correspondientes al concepto de bit, solamente nos permitía
almacenar números binarios.
En años recientes, una de las formas de arte más comunes en el mundo de la programación ha sido el diseño de los lenguajes de
programación. El número de lenguajes de programación propuestos y diseñados es extremadamente amplio. Aún el número de
lenguajes para los cuales un traductor ha sido implementado es inmenso. Sammet (1976) enfatizó en 167 lenguajes en su lista entre
1974-1975. Aunque el primer lenguaje de programación más primitivo llego a existir hace 25 años, hasta que recientemente hubo
una pequeña regla en el proceso de diseño de nuevos lenguajes.
Los primeros lenguajes fueron esfuerzos innovadores, explorando un campo nuevo. No es sorprendente que fueron pobremente
desarrollados. Las criticas no deberían de ser contra los diseñadores de FORTRAN; ellos tuvieron bastantes problemas en el diseño e
implementación de uno de los primeros lenguajes de alto nivel.
Después del desarrollo inicial de los lenguajes de alto nivel y de la implementación de los pocos primeros compiladores, hubo un
periodo bastante largo en el cual se intento conscientemente hacer el diseño de nuevos lenguajes sin los defectos de los viejos
lenguajes. La mayoría de esos intentos fueron fracasos, no así debido a la falta de ideas sobre como diseñar un mejor lenguaje a
partir de un excedente de ideas. Un buen ejemplo de este proceso es la idea de “Si puede significar algo, debería”, (Radin y
Rogoway, 1965), los cuales conducen a PL/I.
Más recientemente, la experiencia de errores previos ha dejado un conocimiento real acerca de cómo construir un buen lenguaje de
programación. Ideas y principios básicos han llegado a ser suficientemente bien establecidos de manera práctica para colocar guías
explicitas en el diseño de lenguajes. Esas áreas que aún no se han entendido han comenzado a investigarse sistemáticamente.
Esta discusión por consiguiente intentará hacer énfasis sistemático, ordenando el aprovechamiento para el diseño de un lenguaje.
Deberá ser recordado, sin embargo, que hacer un juicio propio en muchos tópicos, es muchas veces necesario para discutir
particularidades como generalidades. El área del diseño del lenguaje no se ha desarrollado completamente, y muchas áreas aún no
están muy bien unificadas. También hay mucha áreas interrelacionadas fuertemente que es difícil discutirlas por separado.
5
ITSEldorado – Ing. Leonardo Ramírez
Programación de Sistemas – Unidad II
Por necesidad, esta discusión será, sin embargo, restringida al tratamiento. Elaborar una descripción de las posibles características
de un lenguaje serán limitadas. Asumimos que el diseñador de un lenguaje potencial tiene la suficiente experiencia en lenguajes de
programación consiente de las principales ideas. Las características especificas se discutirán por razones especificas, pero no se
intentará para hacer un catalogo general. Existen ya varios catálogos (Elson, 1973; Pratt, 1975; Nicholls, 1975). Se asumirá que los
lenguajes en discusión son de “alto nivel”. Esta discusión también será restringida ampliamente a lenguajes procedurales para
escribir software (“software” es usado en su sentido mas general para significar “programas a ser utilizados por alguien más). Mucho
de lo que se dice será aplicado a otra clase de lenguajes. El diseñador de un lenguaje no procedural omitirá consideraciones de algún
tópico (ejemplo, estructuras de control) pero muchos principios generales seguirán siendo aplicables. Lenguajes destinados a
propósitos no software (ejemplo, para usar como una calculadora glorificada o para investigación de algoritmos) se sacrificarán
algunas consideraciones para improvisar algunas otras (un lenguaje calculador sacrificará readaptabilidad y estructura por
conciencia y conveniencia; un lenguaje de prueba de algoritmos sacrificará eficiencia por conveniencia y notación natural, pero esto
cambiará solo la prioridad de varias consideraciones.
Sistemas de comandos en línea y lenguajes de consultas son para algunos, extensiones separadas en cuestión. También asumiremos
que los lenguajes son diseñados con la intención de implementar un traductor para ellos, siempre y cuando la implementación es
una perspectiva puramente hipotética. Lenguajes para otros propósitos (ejemplo, para servir como base para una discusión) no son
obligados para las siguientes reglas.
1.2 CONSIDERACIONES PRELIMINARES
En el diseño de un nuevo lenguaje, ciertas cuestiones requieren pensarse bien antes de dar cualquier consideración para el detalle
del diseño. Atención apropiada para esos avances puede evitar problemas futuros.
La primera y más importante pregunta que se debe hacer es:
¿Es necesario diseñar un nuevo lenguaje?
Casi cualquier alternativa cercana, deberá ser simple y rápida tratando la dificultad y el tiempo de ejecución de una tarea de diseño
para un lenguaje completamente nuevo.
¿Existe un lenguaje que pueda ser usado para llenar estos requerimientos? Si se requiere una nueva implementación,
implementando un lenguaje existente es más fácil y rápido que el diseño y la implementación de un nuevo lenguaje.
¿Puede un lenguaje existente ser extendido? Es fácil diseñar una extensión clara para un lenguaje existente, siempre si la extensión
implica un nuevo compilador que diseñe de un nuevo lenguaje. Si esta característica es tomada, sin embargo, debe ser tomada con
cuidado, no hacer la extensión demasiado larga y compleja que llegue a ser, de hecho, un nuevo lenguaje. En tales casos la
necesidad de retener algunas interfaces para el viejo lenguaje será probablemente un compromiso serio para el diseño de la
extensión. También, si es extendido un lenguaje existente, es necesario seleccionar el lenguaje base cuidadosamente para que el
trabajo de la extensión sea minimizado y la extensión ajuste elegantemente en el lenguaje. El objetivo deberá ser producir un
lenguaje un poco mas grande pero igualmente bien construido.
¿Pudiera ser posible modificar un lenguaje existente, usando un macro procesador o algo similar? La facilidad para menos
parámetros en macros (simplemente sustituyendo un texto específico por cada ocurrencia de un identificador definido) puede
producir mayores alternativas en la sintaxis de un lenguaje, si se utiliza hábilmente. Sin embargo, el poder de este aprovechamiento
para tareas más complejas, tales como introducir nuevas estructuras de datos, es limitado.
Se deberán dar serias consideraciones para esas técnicas como alternativa para un nuevo lenguaje, simplemente sobre el área de
minimizar el trabajo y tiempo empleado. Quizás no hay otros problemas relacionados con la computadora los cuales se ven
tentadoramente fáciles y es tan terriblemente duro como hacer un buen trabajo de diseño de lenguaje.
• Ya existe un lenguaje apropiado:
– El nuevo lenguaje se diferencia de los existentes.
• Se consume demasiado tiempo en el diseño e implementación de un nuevo lenguaje:
– Es demasiado fácil diseñar un lenguaje incompleto.
– Lenguaje demasiado especializado .
– Sacrificar características del lenguaje por un compilador simple.
• Otras opciones:
– Un módulo o librería de funciones.
– Ampliar un lenguaje de programación.
Asumiendo que se ha tomado una decisión y ninguno de los acercamientos previos bastará, el siguiente punto de interés es:

6
ITSEldorado – Ing. Leonardo Ramírez
Programación de Sistemas – Unidad II
¿Cual es el propósito del lenguaje?
Un lenguaje es muchas veces diseñado específicamente para la aplicación sobre un área. La principal atención se da para restringir el
área de aplicación del lenguaje, lo mejor del lenguaje será para problemas en su área. De hecho,
no es aconsejable intentar diseñar un lenguaje de propósito general compatible para cualquier problema. Todos los intentos
registrados han sido decepcionantes (notablemente PL/I y ALGOL 68). Actualmente todas las evidencias indican que no hay
conocimientos de cómo hacer un trabajo propio de diseño de lenguaje que sea “bueno para cualquier cosa”.
Finalmente, la relación de los nuevos lenguajes con los lenguajes existentes deberá ser considerada. Weinberg (1971) discute el
fenómeno psicológico de “inhibición “, el cual ocurre cuando un viejo lenguaje y un nuevo lenguaje son similares pero no idénticos.
El usuario es sometido a serias confusiones debido a incertidumbres acerca de cómo muchos de los viejos lenguajes se conservan en
los nuevos. En resumen, es mejor hacer el nuevo lenguaje distintivamente diferente en vez de similitudes cercanas para cualquier
lenguaje existente. Si el nuevo y viejo lenguajes son similares, quizás la necesidad de un nuevo lenguaje no ha sido propiamente
examinada.
• No hay un lenguaje bueno para todo.
• Aplicación específica.
– Bases de datos, sistemas expertos, cálculo numérico, programación simbólica, diseño algorítmico, etc.
1.3 OBJETIVOS Y FILOSOFÍAS DEL DISEÑO DE LOS LENGUAJES DE PROGRAMACIÓN
En la preparación de un programa, el programador puede tener que escoger entre soluciones alternativas en muchos puntos. Cada
elección debe hacerse para satisfacer los objetivos y las restricciones de la tarea de la programación particular. Se asumirán como
apropiados para toda área de programación entre otros, los siguientes objetivos:
 Exactitud.
 Claridad.
 Eficiencia.
EXACTITUD
Un objetivo obvio en la escritura de cualquier programa computador es que tiene que satisfacer su especificación exactamente. A
menudo, sin embargo, a causa de la complejidad de la labor del programa, y de un entendimiento o cuidados inadecuados de parte
del programador, un programa falla en satisfacer alguna parte de su especificación. Un programador tiene que ser en todo tiempo
cuidadoso de la exactitud o pertinencia del programa para su propósito especificado.
Un factor clave en el logro de exactitud es la simplicidad. Escogiendo el algoritmo o técnica más simple disponible, es más probable
que un programador vea si satisface o no los requerimientos de la especificación del programa, y es menos probable que la describa
incorrectamente en su programa. La innecesaria complejidad no cumple propósito alguno en la programación de computadores.
Algunos programas son, por supuesto, inherentemente complejos. Para tales programas, el programador debe adoptar un
tratamiento sistemático que controle y limite la complejidad de la que tiene que ocuparse cada etapa.
CLARIDAD
Un programa es necesariamente tan complejo como el algoritmo que describe. Sin embargo, es importante que la forma en que el
algoritmo esté descrito, por el texto del programa, no sea más complicada de lo que es necesario. La claridad del programa es una
ayuda importante para el programador mismo en el diseño y limpieza del programa; y para otros que puedan tener que leer y
alterar el programa en alguna etapa posterior.
La claridad del programa es lograda casi en la misma forma que para cualquier texto escrito, tal como un ensayo o un libro en los
cuales se requiere:
a) Una separación lógica del texto en partes comprensibles (capítulos, sesiones, etc.) que reflejen la distinción entre los temas que
describen, y su presentación en una secuencia lógica que refleje las relaciones entre ellas;
b) Una selección cuidadosa de las características del lenguaje, usadas en cada parte para expresar su sentido propuesto tan
precisamente como sea posible;
c) Otra selección cuidadosa de las palabras usadas para denotar los objetos y conceptos involucrados;
d) La inclusión de comentarios y preámbulos para clarificar el texto principal cuando sea necesario;
e) Un aprovechamiento de los dispositivos para presentación de textos, tales como las líneas en blanco y la sangría, para enfatizar la
relación entre partes componentes de textos.
7
ITSEldorado – Ing. Leonardo Ramírez
Programación de Sistemas – Unidad II
Un programador podría ser tan diligente en el uso de estas técnicas para lograr claridad como el autor de cualquier texto. En muchos
casos, la utilidad de un programa es determinada tanto por la claridad de su texto como por las cualidades del algoritmo que
describe.
EFICIENCIA
El costo de ejecutar un programa de computador, es medido normalmente en términos de:
a) El tiempo tomado por el computador para llevar a cabo la secuencia de operaciones involucradas;
b) La cantidad de memoria de computador usada en hacerlo.
En muchos ambientes (de máquina), el programa competirá con otros programas por el uso de esos recursos del computador, y es,
por tanto, lógico minimizar los requerimientos del programa para cada uno.
El tiempo tomado para ejecutar el programa, es directamente proporcional al número de operaciones que el procesador tiene que
realizar al hacerlo. El programador debe, por tanto, escoger un algoritmo que minimice las operaciones implicadas, y tener cuidado
para evitar cualquier operación redundante al expresar el algoritmo como un programa de computador.
La memoria usada por el programa durante su ejecución, es determinada por la cantidad de datos que tienen que ser guardados, y
por el número de instrucciones del procesador requeridas para definir el programa, ya que éstas también tienen que ser guardadas
en la memoria. Para minimizar el almacenamiento usado por su programa, el programador debe, por tanto, considerar los datos
manipulados y el número de operaciones especificadas por el programa
Para algunos programas, o partes de programas, el uso eficiente del tiempo o del almacenamiento puede ser crítico; para otros
puede serlo menos. El programador debe estar enterado de cualquiera de tales requerimientos de eficiencia cuando escriba su
programa.
Cuando un lenguaje de programación es diseñado, se deberá dar particular atención a los siguientes puntos:
Independencia de la máquina:
Son instrucciones para que el computador haga diferentes tareas. Con los lenguajes de computador, nosotros generamos nuestras
aplicaciones. Un lenguaje de programación es una notación para escribir instrucciones con las que será posible comunicarse con el
hardware, dando las ordenes necesarias para la realización de un determinado proceso. Se denomina “lenguaje fuente” a las
órdenes que escribe el programador, las cuales son traducidas al lenguaje máquina de las computadoras. Cada lenguaje de
programación tiene su propia gramática o “lenguaje”. Existen distintos niveles de programación:
Bajo nivel: Son dependientes de la máquina, están diseñados para ejecutarse en una determinada computadora. Este lenguaje aquel
por el que se accede directamente al hardware. Es el caso del lenguaje máquina, que fue el primero en utilizarse, es el único que
entiende la computadora directamente, al usar el alfabeto binario (0 y 1) por lo que son los menos “amigables “para el usuario ante
el cúmulo de errores que se pueden cometer. También se incluye aquí, aunque en un paso por encima de estos, los lenguajes
ensambladores, que son un intento de sustituir al lenguaje máquina por otro más fácil de aprender y utilizar. En éste cada
instrucción equivale a una instrucción en lenguaje máquina, la diferencia es que para su escritura utiliza palabras mnemotécnicas (es
decir grupos de letras que equivalen a una operación en la máquina) y no cadenas de bits.
Por lo demás presenta todos los inconvenientes del lenguaje máquina, por ejemplo que cada ordenador tiene un lenguaje
ensamblador propio, por lo que un programa solo se puede usar en el ordenador para el que se pensó, lo que obliga a conocer la
arquitectura de la máquina. Estos lenguajes son los que más se aproximan al lenguaje máquina, por lo que se pueden cometer
errores fácilmente, aunque van a ser más rápidos que los que veremos a continuación, pues la traducción menos pasos. Por esto
último es por lo que necesitamos un traductor o programa en lenguaje máquina que tome como datos las sentencias
mnemotécnicas y de cómo resultado un programa objeto a lenguaje máquina.
Alto nivel o lenguajes evolucionados: Son independientes de la máquina y se pueden utilizar en una variedad de computadoras
Cuanto más alto es el nivel del lenguaje, más sencillo es comprenderlo y utilizarlo. Persiguen en primer lugar lograr independencia
de la máquina, de forma que un mismo programa se pueda utilizar en diferentes ordenadores, si bien, debe disponerse de un
programa traductor (que puede ser un interprete o un compilador) para obtener el programa ejecutable en lenguaje binario de la
máquina. Así no se requiere conocer el hardware específico del equipo. En segundo lugar se puede escribir y leer de una forma más
sencilla, eliminando en gran medida las posibilidades de cometer errores, ya que se usan palabras en ingles y no cadenas de bits.
Ejemplos de lenguajes de programación típicos son FORTRAN, COBOL, BASIC, PASCAL, C, ETC..
Antes de comenzar a hablar de las filosofías de programación debemos definir lo que es un lenguaje de programación ya que estos
dos conceptos están relacionados entre sí. Así bien, considerando que el lenguaje es un medio que se emplea para expresar ideas y
la programación es un conjunto de instrucciones que se debe seguir para realizar una determinada tarea. Es ahí, donde para
determinar ese conjunto de instrucciones se debe de escribir en algún medio que las exprese, en pocas palabras se usa un lenguaje.
Con esto podemos definir que un lenguaje de programación en el ámbito de la informática es un medio de expresión a través de una
8
ITSEldorado – Ing. Leonardo Ramírez
Programación de Sistemas – Unidad II
sintaxis bien definida que facilita la construcción de un conjunto de instrucciones finito para realizar una tarea determinada en la
computadora.
Existen diferentes tipos de lenguajes dependiendo el tipo de filosofía que se utilice. De antemano ya definimos el concepto de
programación sólo faltará definir el de filosofía y sin buscar una polémica usaremos para tal efecto la definición genérica de ella la
dice que la filosofía es un conjunto de verdades lógicamente sistematizadas que tiene por objeto unificarlas en una generalidad. En
el ámbito informático, una filosofía de programación es un conjunto de técnicas y métodos para estructurar en forma uniforme el
diseño del conjunto de instrucciones necesarios para ejecutar una tarea en especifico en la computadora buscando que el proceso
sea confiable, integro y eficiente.
Existen tres tipos de filosofía de programación:
 La programación estructurada
 La programación orientada a objetos
 La programación orientada a eventos
La programación estructurada es una filosofía de implantación de algoritmos con un conjunto finito de estructuras bien organizadas.
Esta filosofía está enfocada a los programas, es decir en la forma en que se resolverán los problemas. Al implementar los
procedimientos y funciones se aplican las estructuras de datos adecuadas a estos y se obtienen los programas.
En cambio, la programación orientada a objetos analiza las entidades implicadas en el programa buscando características comunes
entre entidades y de ahí crear estructuras de datos que capturen estas características permitiendo crear relaciones entre las
estructuras de datos también denominados objetos. Las propiedades de la programación orientada a objetos son: herencia, paso de
mensajes, encapsulamiento y polimorfismo.
La programación orientada a eventos se enfoca a las acciones del usuario como principalmente forma de programación. Esta
filosofía basa sus características en crear funciones en base a los eventos que produce el usuario. Este tipo de programación es
sensiblemente más complicada que la secuencial y la interactiva, ya que las acciones de un usuario son muy variadas.
1.4 DISEÑO DETALLADO
El diseño detallado tiene que ver con la especificación de detalles algorítmicos, representaciones concretas de datos,
interconexiones entre funciones y estructuras de datos, y empaque del producto de programación. El diseño detallado está
fuertemente influenciado por el lenguaje de instrumentación, pero no es lo mismo que la instrumentación; el diseño detallado tiene
que ver más con aspectos semánticos y menos con detalles sintácticos que es la instrumentación. El punto de inicio para el diseño
detallado es una estructura arquitectónica a la que se le van a proporcionar los detalles algorítmicos y las representaciones
concretas de datos. Mientras que hay una fuerte tentación para proceder directamente de la estructura arquitectónica a la
instrumentación, hay varias ventajas que pueden lograrse en el nivel intermedio de detalle proporcionado por el diseño detallado.
La instrumentación comunica los aspectos de la sintaxis del lenguaje de programación, el estilo de codificación la documentación
interna, y la inserción de pruebas y depuraciones al código. Las dificultades que se encuentran durante la instrumentación casi
siempre se deben al hecho de que el instrumentador simultáneamente está realizando análisis, diseño y actividades de codificación
mientras intenta expresar el resultado final en un lenguaje de instrumentación.
El diseño detallado permite el diseño de algoritmos y representaciones de datos en un nivel más alto de abstracción y notación que
el que proporciona el lenguaje de instrumentación. El diseño detallado separa la actividad de diseño a bajo nivel de la
instrumentación, igual que las actividades de análisis y diseño aíslan las consideraciones de lo que se desea de la estructura que
logrará los resultados deseados.
Una especificación adecuada de diseño detallado minimiza el número de sorpresas durante la instrumentación del producto.
Las actividades de diseño detallado inevitablemente exponen los defectos en la estructura arquitectónica y las modificaciones
resultantes se verán facilitadas por tener menos detalles por manipular que los que estarían presentes en el lenguaje de
instrumentación. El diseño detallado también proporciona un vehículo para inspecciones de diseño, recorridos estructurados y la
revisión crítica del diseño.
Las notaciones para el diseño detallado incluyen a los diagramas HIPO, el pseudocódigo, el inglés estructurado, los diagramas de
flujo estructurados, los diagramas de estructuras de datos, y las distribuciones físicas para las representaciones de datos.
La representación del diseño detallado puede utilizar palabras clave del lenguaje de instrumentación para especificar el flujo de
control, y proposiciones de declaración del lenguaje para especificar la representación de datos.
9
ITSEldorado – Ing. Leonardo Ramírez
Programación de Sistemas – Unidad II
El empaque tiene que ver con la manera en que los datos elementales globales son compartidos selectivamente entre las unidades
del programa, la especificación de áreas de datos estáticos, el agrupamiento de unidades del programa como funciones y subrutinas,
la especificación de los mecanismos para el paso de parámetros, las estructuras de archivos y las técnicas para su acceso, y la
estructura de las unidades de compilación y módulos de carga.
El diseño detallado debe llevarse hasta un nivel donde cada proposición en la notación del diseño resulte en unas cuantas (menos de
10) proposiciones en el lenguaje de instrumentación. Dadas las especificaciones arquitectónicas y de diseño detallado, cualquier
programador familiar con el lenguaje de instrumentación debe ser capaz de implantar el producto de la programación.
10
ITSEldorado – Ing. Leonardo Ramírez
Programación de Sistemas – Unidad II
A continuación se muestran algunos lenguajes de programación con su diseño detallado:
LENGUAJE C
Código compacto
decremento
de coerciones
PASCAL
a explícitamente
LIPS
estructura y lectura de los programas
11
ITSEldorado – Ing. Leonardo Ramírez
Programación de Sistemas – Unidad II
12
ITSEldorado – Ing. Leonardo Ramírez
Programación de Sistemas – Unidad II
PROLOG
C ++
stándar
1.5 CASO DE ESTUDIO
A continuación se muestra un ejemplo de un lenguaje de prueba:
Nombre del lenguaje: PS1
Lenguaje diseñado para el paradigma estructurado, pensado para pequeños proyectos de software, fácil uso de procedimientos y
funciones, Un buen nivel de abstracción, portable y uso de un lenguaje simplificado.
Elementos del lenguaje a considerar:
Palabras Reservadas.
PROG
PROC
TO
ELSE
UNTIL
INTEGER
BEGIN
SAT
WHILE
CLEAR
Operadores y Caracteres especiales.
ARITMÉTICOS
RELACIONALES
LÓGICOS
CARACTERES ESPECIALES
+
<
&&
;
REAL
END
GET
DO
CALL
<=
||
,
*
>
!
.
STRING
STORE
IF
REPEAT
/
>=
%
!=
=
(
)
@
[
]
..
:
ID’s, Constantes y Comentarios.
Identificadores
Los ID constan únicamente de letras, longitud máxima de 6 letras, en la fase de léxico
deben ser reconocidos como ID (sin especificar tipo), en la fase de semántica diferencias
los ID según el tipo de dato.
Constantes Enteras
Las constantes enteras, pueden o no llevar signo (+ ó -), deben estar en un rango de -32768
a 32767, en caso de salir de ese rango automáticamente se tomara como real.
Constantes Reales
Pueden o no llevar signo, no pueden iniciar ni terminar con punto decimal, no permiten la
notación científica.
13
ITSEldorado – Ing. Leonardo Ramírez
Programación de Sistemas – Unidad II
Constantes String
Comentarios
Están limitadas por comillas (“) al inicio y al final. Deben terminar en una misma línea.
Los comentarios están limitados por // al inicio y también // al final, deben terminar en la
línea que inician y permiten dentro cualquier carácter incluyendo “/”.
14
ITSEldorado – Ing. Leonardo Ramírez