Loading presentation...

Present Remotely

Send the link below via email or IM

Copy

Present to your audience

Start remote presentation

  • Invited audience members will follow you as you navigate and present
  • People invited to a presentation do not need a Prezi account
  • This link expires 10 minutes after you close the presentation
  • A maximum of 30 users can follow your presentation
  • Learn more about this feature in our knowledge base article

Do you really want to delete this prezi?

Neither you, nor the coeditors you shared it with will be able to recover it again.

DeleteCancel

Make your likes visible on Facebook?

Connect your Facebook account to Prezi and let your likes appear on your timeline.
You can change this under Settings & Account at any time.

No, thanks

Principios de diseño de los lenguajes de programación

Unidad 1.- Teoría de Lenguajes de Programación
by

Lucero Zamora

on 24 August 2014

Comments (0)

Please log in to add your comment.

Report abuse

Transcript of Principios de diseño de los lenguajes de programación

Notes
Qué es???
Eficiencia
Eficiencia
Principios de diseño de los lenguajes de programación
Paradigmas de computación
Historia y criterios de diseño
"Los lenguajes de programación sirven para escribir programas que permitan la comunicación usuario - máquina" (Joyanes, 2003)
Clasificación
Eficiencia
Los factores fundamentales en la calidad del software son:
la eficiencia,
la portabilidad,
la verificabilidad,
la integridad,
la facilidad de uso,
la exactitud,
la robustez,
la extensibilidad,
la compatibilidad y
la reutilización.

Regularidad
El principal objetivo del lenguaje es, por supuesto, servir de apoyo didáctico en una materia de lenguajes de programación, intérpretes y compiladores. Derivado de la persecución de este objetivo surgen varias metas específicas y objetivos particulares:
Principios adicionales sobre el diseño de lenguajes
Simplicidad
Unidad 1
Ing. Lucero Zamora M
Qué es???
Epistemología
Es aquel conjunto de creencias que permiten ver y comprender la realidad de determinada manera
Programación
Un paradigma de programación provee y determina la visión y métodos de un programador en la construcción de un programa o subprograma. Diferentes paradigmas resultan en diferentes estilos de programación y en diferentes formas de pensar la solución de problemas (con la solución de múltiples “problemas” se construye una aplicación).

Ejemplos:
Un paradigma es un conjunto de cosas que asumimos y creemos, lo que sirve como base o filtro de nuestra percepción e interpretación de la realidad
Los paradigmas no sólo incluyen creencias científicas, sino que poseen elementos religiosos, sociales, estéticos y filosóficos propios del contexto, entre otros, que muchas veces tienen estrecha relación con el éxito que tengan los nuevos paradigmas a medida que vayan naciendo.
Existen múltiples paradigmas, difícilmente un lenguaje de programación pueda clasificarse solamente en un paradigma
Tarea:
* Investigar los diferentes tipos de paradigmas de programación
Imperativo
Declarativo
Lógico
Funcional
Orientado a objetos
* 1 Ejemplo de cada uno de los paradigmas anteriores (
No buscarlo en internet!!!
)
Los lenguajes de programación son como un lenguaje cualquiera, pero simplificado y con ciertas normas,para poder transmitir nuestros deseos a la computadora.
Nivel de abstracción
* Lenguajes de bajo nivel
Forma de ejecución
* Lenguajes compilados
Paradigma de programación
* Lenguajes imperativos
* Lenguajes de medio nivel
* Lenguajes de alto nivel
Son aquellos que se acercan al funcionamiento de una computadora
* Lenguaje máquina
Ordena a la máquina las operaciones fundamentales para su funcionamiento
* Lenguajes ensambladores
Con la aparición de este lenguaje se crearon los programas traductores para poder pasar los programas escritos en lenguaje ensamblador a lenguaje máquina.
Tienen las características que los acercan a los lenguajes de bajo nivel pero, al mismo tiempo,ciertas cualidades que lo hacen un lenguaje más cercano al humano, por lo tanto,de alto nivel
Se tratan de lenguajes independientes de la arquitectura del ordenador.
* Lenguajes interpretados
Los compiladores son aquellos cuya función es traducir un programa escrito en un determinado lenguaje a un idioma que la computadora entienda.
Es un lenguaje de programación que necesita un interprete para implementar o ejecutar el código escrito en este.
* Lenguajes declarativos
* Lenguajes orientados a objetos
Son aquellos en los que se le ordena a la computadora cómo realizar una tarea siguiendo una serie de pasos o instrucciones
Son aquellos en los cuales se le indica a la computadora qué es lo que se desea obtener o qué se esta buscando, pueden ser lógicos o funcionales.
Son aquellos que expresan un programa como un conjunto de objetos, que colaboran entre si para realizar tareas.
Historia y evolución
La necesidad de recordar secuencias de programación para realizar ciertas acciones llevo a denominarlas con nombres fáciles de memorizar y asociar. A esta secuencia de posiciones se le denominó "instrucciones", y a este conjunto de instrucciones se le llamó lenguaje ensamblador.
Posteriormente aparecieron diferentes lenguajes de programación, los cuales reciben su denominación porque tienen una estructura sintáctica similar a los lenguajes escritos por los humanos.
1843
1849
1908
1902
1800
Primera generación
Lenguaje máquina
Segunda generación
Se crearon los primeros lenguajes ensambladores
Tercera generación
Se crean los primeros lenguajes de alto nivel.

Ejemplo: C, Pascal, Cobol,
Cuarta generación
Son los lenguajes capaces de generar código por si solos, son los llamados RAD, con los cuales se pueden realizar aplicaciones son ser un experto en el lenguaje.
Aquí también se encuentran los lenguajes orientados a objetos, haciendo posible la reutilización de partes del código para otros programas.
Quinta generación
Aquí se encuentran los lenguajes orientados a la inteligencia artificial.
Estos lenguajes todavía están poco desarrollados.
Ejemplo: LISP
Evolución
Es la capacidad de disponer de algo o alguien para conseguir un objetivo determinado con el mínimo de recursos posibles.
En términos generales, estos factores pueden describirse de la siguiente forma:
La eficiencia: capacidad para el aprovechamiento óptimo de los recursos que emplea.
Los lenguajes OO arrastraron en un principio la reputación de ser ineficaces. Esto se debía en gran medida a que los primeros lenguajes (como Smalltalk) eran interpretados y no compilados.
La existencia de compiladores permite a los desarrolladores ganar rapidez. Actualmente, usando un buen lenguaje orientado a objetos como C++, Java, etc. Junto con las librerías apropiadas para la realización de un programa, puede que se ejecute más rápidamente que el mismo programa compilado con un lenguaje procedural
La portabilidad:
Facilidad para ser ejecutados en distintos entornos lógicos o físicos .
La verificabilidad:
Capacidad para soportar procedimientos de pruebas, test o ensayos.
La integridad:
Nivel de protección frente a procesos que traten de alterarlo.
La facilidad de uso:
Comodidad y claridad en la interacción con el usuario.
La exactitud:
Nivel de precisión que alcanzan los resultados obtenidos.
La robustez:
Capacidad para funcionar correctamente en situaciones extremas.
La extensibilidad:
Capacidad para adaptar su funcionamiento al incremento en sus objetivos.
La compatibilidad:
Facilidad de poder ser aplicados en conjunción con otros programas.
La reutilización:
Posibilidad de utilizarlos (total o parcialmente) en nuevos contextos.
La apreciación del desarrollo e implementación de un lenguaje de programación.
La comprensión del procedimiento seguido en la formación de un conjunto de reglas gramaticales que permiten identificar y nombrar sin ambigüedad acciones y secuencias ordenadas de acciones sobre el contexto específico de un problema en particular.
Proporcionar un medio de familiarización con la realización de operaciones aritméticas usando una pila y su posterior extensión para la manipulación de otros datos.
La clara especificación y adecuada documentación del proceso de creación o extensión de un lenguaje y sus resultados
Principalmente se busca que un lenguaje de programación sea regular, modular y estructurado.
* De código
El diseño del lenguaje debe ser tal que un compilador pueda generar un código ejecutable eficiente(optimizabilidad).
* De compilación
Compilación rápida, usando un compilador de tamaño reducido.
La verificación de errores puede ser un problema grave de eficiencia, ya que verificar la existencia de un error en tiempo de compilación puede hacer ineficiente al compilador, y la generación de código para verificar el error durante la ejecución podría hacer que el código objetivo resulte ineficiente
Ignorar esa verificación, viola otro principio de diseño, la confiabilidad (el aseguramiento de que un programa no se comportará en formas no esperadas durante su ejecución
* De la programación
Rapidez y facilidad en la escritura de programas en el lenguaje.
Facilidad para expresar procesos y estructuras complejas (capacidad de expresión del lenguaje).
Facilidad con la que se puede correlacionar el diseño en la cabeza del programador con el código real.
Lo conciso de la sintaxis y evitar detalles innecesarios, como son las declaraciones de variables, a menudo también se consideran factores importantes en este tipo de eficiencia.
Una mayor regularidad implica
Pocas restricciones en el uso de constructores
Menos interacciones raras entre dichos constructores
Menos sorpresas en la forma en que se comportan las características del lenguaje
Generalidad
Un lenguaje logra tener generalidad eliminando casos especiales en la disponibilidad y uso de los constructores y combinando constructores íntimamente relacionados en uno solo más general.
Uniformidad
La regularidad se puede dividir en tres conceptos:
Algunos ejemplos de violación de este concepto podrían ser la carencia de:
Variables de procedimientos (Pascal).
Anidación de funciones / procedimientos (C).
Arreglos de longitud variable (Pascal).
Extensión y creación de operadores (==, +, …) hacia nuevos tipos de datos (C) .
Ortogonalidad
Los constructores del lenguaje no deben comportarse de manera diferente en contextos diferentes, por lo que las restricciones que dependen del contexto son no ortogonales, en tanto que las que se aplican independientemente del contexto son no generales.
Los constructores del lenguaje se pueden combinar en cualquier forma significativa y que la interacción entre los constructores o el contexto del uso no debe generar restricción o comportamientos inesperados.
Los constructores no pueden comportarse de manera diferente en contextos diferentes.
Las cosas similares deben verse de forma similar y tener significados similares, y a la inversa, las cosas diferentes se tienen que ver de forma diferente.
Las no uniformidades son de dos tipos:
Cosas similares no parecen ser o no se comportan de manera similar.
Cosas no similares, parecen ser o se comportan de manera similar.
Ejemplo de violación de este concepto puede ser:
En C++ es necesario un punto y coma después de la definición de clase, pero está prohibidodespués de la definición de una función.
class A{ ... };
int f() { ... }
Si una no regularidad no puede justificarse de forma razonable entonces se puede decir que es un error de diseño
Expresividad
Extensibilidad
Capacidad
de restricción
Precisión
Seguridad
La simplicidad parecía ser un principio fácil de lograr, pero en la práctica es asombrosamente difícil
No debe confundirse simplicidad con regularidad, ejemplo: Algol68 es uno de los lenguajes más regulares, pero no es simple.
Tampoco tener muy pocos constructores básicos es simplicidad, ejemplo: LISP y Prolog tienen unos cuantos constructores básicos, pero dependen de un ambiente de ejecución complejo.
Un LP demasiado simple puede hacer que la tarea de utilizarlo resulte más compleja
“Todo debería hacerse tan simple como sea posible, pero no más simple”. Albert Einstein
La sobresimplicidad puede hacerse que el lenguaje sea difícil de utilizar, carente de expresividad, legibilidad o seguridad y sujeto a demasiadas restricciones.
Es la facilidad con que un lenguaje puede expresar procesos y estructuras complejas
Uno de los primeros adelantos en expresividad fue la adición de la recursión en los LP (LISP y Algol60)
Es una de las razones del aumento de popularidad de los lenguajes orientados a objetos.
Principio que indica que debería de haber algún mecanismo general que permita al usuario añadir nuevas características al lenguaje.
Podría significar simplemente el añadir:
Nuevos tipos al lenguaje.
Nuevas funciones a una biblioteca.
Nuevas palabras claves.
La simplicidad sin extensibilidad, prácticamente tiene garantizado el fracaso del lenguaje.
Un diseño de lenguaje debería dar la posibilidad de que un programador pudiera programar de una forma útil empleando un conocimiento mínimo del lenguaje, por lo que el diseño de un lenguaje debería promover la capacidad de definir subconjuntos del lenguaje
Esto resulta útil de dos maneras:
No es necesario que el programador aprenda todo el lenguaje para utilizarlo con efectividad.
Un escritor de compilador podría elegir implementar únicamente un subconjunto en el caso de que la implementación de todo lenguaje resultara demasiado costosa e innecesaria.
A veces conocida como claridad.
Es la existencia de una definición precisa para un lenguaje, de tal manera que el comportamiento de los programas pueda ser predecible
Pasos para lograrlo:
Publicación de un manual o informe del lenguaje por parte del diseñador.
Adopción de un estándar emitido por una organización nacional o internacional de estándares:
*ANSI.
*ISO.
Este principio se basa en minimizar los errores de programación y permitir que dichos errores sean detectados e informados.
La seguridad está íntimamente relacionada con la confiabilidad y con la precisión.
Este es el principio que condujo a los diseñadores del lenguaje a introducir los tipos, la verificación de tipos y las declaraciones de variables en los lenguajes de programación.
Full transcript