0% encontró este documento útil (0 votos)
77 vistas36 páginas

C00 Intro

Este documento presenta la maestría en ciencias de la computación de la Universidad de Oriente. El programa se enfoca en el desarrollo de habilidades en el uso de lenguajes de programación, incluyendo estructuras de datos, control de flujo, herencia, polimorfismo, genéricos e hilos. El documento también incluye objetivos, contenidos y bibliografía recomendada para el programa.
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
77 vistas36 páginas

C00 Intro

Este documento presenta la maestría en ciencias de la computación de la Universidad de Oriente. El programa se enfoca en el desarrollo de habilidades en el uso de lenguajes de programación, incluyendo estructuras de datos, control de flujo, herencia, polimorfismo, genéricos e hilos. El documento también incluye objetivos, contenidos y bibliografía recomendada para el programa.
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
Está en la página 1/ 36

Maestría en Ciencias de la Computación

Universidad de Oriente

Teoría y práctica de lenguajes de programación


OBJETIVOS
 Desarrollar habilidades en el uso de las estructuras de
datos y de control de los lenguajes de programación para
la representación de datos y solución de problemas
complejos, así como describir y utilizar diferentes formas
de organización y acceso de datos.
CONTENIDOS
 Recursos del lenguaje para definición de estructuras de control y tipos
de datos. Recursos para la abstracción de datos. Clases y objetos.
Conceptos básicos. Componentes estáticas de las clases. Sobrecarga de
operadores.
 Concepto de herencia. Clase base y clase derivada. Consideraciones de
diseño. Herencia simple y múltiple. Herencia pública, privada y protegida.
Herencia selectiva. Concepto de polimorfismo. Destructores y funciones
virtuales. Destructor virtual puro. Ligadura dinámica frente a ligadura
estática. Métodos virtuales puros y clases abstractas.
 Genericidad. Interfaces y delegados. Recordatorio sobre estructuras
dinámicas lineales. Bibliotecas de clases del lenguaje tipo STL de C++.
Contenedores, iteradores y algoritmos. Elementos fundamentales de
programación multihilos.
 Diferentes estilos de la semántica dinámica: enfoques operacional,
axiomático y denotacional. Elementos básicos sobre corrección y
robustez de los programas.
BIBLIOGRAFIA
 Robert. W. Sebesta: Concepts of Programming Languages. 11th. Ed. Pearson Education, 2016.
 Terrence Pratt and Malvin Zelkowitz. Lenguajes de Programación, Diseño e Implementación (3ra
Edición). Prentice Hall, 1998.
 Kenneth C. Louden and Kenneth A. Lambert: Programming Languages: Principles and Practice. 3th
Edition, 2012.
 Michael L. Scott: Programming Language Pragmatics. Morgan Kaufmann Publishers, 2009.
 M. Ben-Ari. Understarting Programming Languages. 2006.
 Hanne Riis Nielson and Flemming Nielson: Semantics with Applications: An Appetizer. Springer-Verlag
London Limited 2007.
 Bertrand Meyer. Construcción de Software Orientado a Objeto, 2da edición. Prentice Hall, 1999.
 Paul Deitel, Harvey Deitel: C++ How to program, 10th edition. Pearson Education, 2017.
 Paul Deitel, Harvey Deitel: Java How to Program, 10th Edition. Prentice Hall, 2015.
 Anders Hejlsberg et al. The C# Programming Language. 4th Ed. Addison-Wesley, 2011.
 Benjamin C. Pierce: Types and Programming Languages, MIT Press, 2002.
 Glynn Winskel: The Formal Semantics of Programming Languages: An Introduction, MIT Press, 1996.
 Otros materiales sobre lenguajes de programación diversos, por ejemplo, Algol-60, Algol-68, Modula-2,
Ada, Fortran, C++, Eiffel, Java, C#, PHP, JavaScript, R, Python, Go, Swift, Kotlin, Scala, Lua, Ruby.
INTRODUCCIÓN A LOS
LENGUAJES DE PROGRAMACIÓN.
LENGUAJES PIONEROS.
¿Por qué estudiar lenguajes de programación?

 Mejora la habilidad de desarrollar algoritmos efectivos.


 Mejora la comprensión del lenguaje concreto que se está
tratando.
 Aumenta el caudal de recursos útiles de programación.
 Facilita la selección del lenguaje conveniente para
resolver un problema.
 Facilita la asimilación de un nuevo lenguaje.
 Facilita la elaboración de un nuevo lenguaje.
Aspectos a tener en cuenta al escoger un lenguaje de programación

Claridad, simplicidad y uniformidad


 Un LP debe proporcionar tanto un marco para pensar
acerca de los algoritmos como un medio de expresarlos
eficientemente y con facilidad.
 El lenguaje debe constituir una ayuda para el
programador incluso antes de la etapa misma de
codificación. Debe proveer un conjunto claro, sencillo y
unificado de conceptos que se puedan usar como
primitivas en el desarrollo de algoritmos.
Aspectos a tener en cuenta al escoger un lenguaje de programación

Claridad, simplicidad y uniformidad


 Muchas características es malo: Un lenguaje con muchos conceptos
básicos es más difícil de aprender que uno con un número más
pequeño. Fue un problema en PL/1, Algol 68, etc.
 Multiplicidad de interpretaciones de una característica es malo. Por
ejemplo, en C y lenguajes descendientes, un usuario puede
incrementar una variable entera simple de cuatro maneras
diferentes:
count = count + 1
count += 1
count++
++count
Aspectos a tener en cuenta al escoger un lenguaje de programación

Ortogonalidad – toda combinación de características es significativa.


 La ortogonalidad en un lenguaje de programación significa que un conjunto
relativamente pequeño de conceptos primitivo pueden ser combinados en un
número relativamente pequeño de maneras para construir las estructuras de
control y de datos del lenguaje. Además, cada posible combinación de primitivas es
legal y significativa.
 Falta de ortogonalidad implica excepciones en las reglas del lenguaje.
 Cuando las características de un lenguaje son ortogonales, entonces es más fácil
aprender el lenguaje y escribir los programas porque hay menos excepciones y
casos especiales que recordar. El significado de las construcciones es independiente
del contexto en que aparecen.
 El aspecto negativo de la ortogonalidad es que un programa suele compilar sin
errores a pesar de contener una combinación de características que son
lógicamente incoherentes o cuya ejecución es en extremo ineficiente.
Aspectos a tener en cuenta al escoger un lenguaje de programación

Ortogonalidad – toda combinación de características es significativa.


 Ejemplos de no ortogonalidad en C:
◦ En el traspaso de parámetros, C pasa todos los parámetros por valor
excepto los arreglos que los pasa por referencia.
◦ Un elemento de arreglo puede ser de cualquier tipo, excepto void o
función.
◦ Las funciones no pueden retornar arreglos (a menos sean vector de la
STL), sin embargo si pueden retornar registros. Ada, Python y muchos
lenguajes funcionales superan esta falta de ortogonalidad.
 La ortogonalidad fue la meta principal del Algol-68, que sigue siendo
el mejor ejemplo de lenguaje donde sus constructores pueden ser
combinados en todas las maneras significativas.
Aspectos a tener en cuenta al escoger un lenguaje de programación

 Naturalidad para la aplicación – la estructura del programa refleja la estructura


lógica del algoritmo.
 Un lenguaje necesita una sintaxis que, al usarse correctamente, permita que la
estructura del programa refleje la estructura lógica del algoritmo.
 El lenguaje debe suministrar estructuras de datos, operaciones, estructuras de
control y una sintaxis natural apropiada para el problema que se va a resolver.
 Así:
◦ si debemos enfrentar el desarrollo de una aplicación de inteligencia artificial,
por ejemplo, desarrollar un sistema experto, la primera idea que nos viene
es usar un lenguaje funcional o de programación lógica, como LISP o Prolog;
◦ si deseamos desarrollar un programa de sistema, pensaríamos en C;
◦ si deseamos desarrollar una aplicación web se pensaría en lenguajes basados
en scripting o marcos de trabajos soportados sobre ellos.
 Si bien este criterio no es determinante, pues incluso podríamos escoger de entre
varios lenguajes para desarrollar una aplicación, es de un peso considerable.
Aspectos a tener en cuenta al escoger un lenguaje de
programación…
Soporte para la abstracción – los datos del programa reflejan el problema
que está siendo resuelto.
 Una parte considerable de la tarea del programador es proyectar las
abstracciones adecuadas para la solución del problema y luego
implementar esas abstracciones empleando las capacidades más
primitivas que provee el lenguaje de programación.
 Idealmente, el lenguaje debe permitir la definición y el mantenimiento
de las estructuras de datos, de los tipos de datos y de las operaciones
como abstracciones autosuficientes. El programador puede emplear
todo esto en otras partes del programa conociendo sólo sus
propiedades abstractas, sin preocuparse por los detalles de su
implementación.
 Tanto Ada, C++, Delphi, Eiffel, Java y otros se desarrollaron debido
precisamente a estos defectos de los lenguajes más antiguos Pascal y
C.
Aspectos a tener en cuenta al escoger un lenguaje de
programación…
Facilidad para la verificación del programa – verificar que el programa
realice correctamente la función requerida para la que fue concebido.
 La corrección de los programas escritos en un lenguaje es siempre una
preocupación medular.
 Existen muchas técnicas para verificar que un programa ejecuta
correctamente la función requerida. Se puede probar que un programa
es correcto a través de un método formal de verificación, se puede
probar informalmente que es correcto por verificación de escritorio
(leer y verificar visualmente el texto del programa), se puede poner a
prueba ejecutándolo con los datos de entrada de prueba y
comparando los resultados de salida con las especificaciones, etc.
 La sencillez de la estructura semántica y sintáctica es un aspecto
primordial que tiende a simplificar la verificación de programas.
Aspectos a tener en cuenta al escoger un lenguaje de
programación…
Ambiente de programación – soporte externo para el lenguaje.
 La presencia de un ambiente de programación adecuado puede facilitar el
trabajo con un lenguaje técnicamente débil en comparación con un
lenguaje más fuerte con poco apoyo externo.
 Se destacan la disponibilidad de una implementación confiable, eficiente y
bien documentada del lenguaje, editores especiales y paquetes hechos
para el lenguaje que aceleran la creación y puesta a punto de programas,
recursos para el mantenimiento y modificación de múltiples versiones de
un programa, poderosos medios de edición y desarrollo de aplicaciones,
como ambientes de desarrollo integrados tipo Delphi, C++ Builder, Visual
Basic, etc o plataformas como Microsoft Visual Studio.NET (un gran y
complejo ambiente visual usado para programar en C#, F#,Visual BASIC,
Jscript, J#, o C++)
Aspectos a tener en cuenta al escoger un lenguaje de
programación…

Portabilidad de los programas – facilidad de transportar el


programa resultante de una computadora sobre la cual se
desarrolló a otros sistemas de cómputo, incluso sobre
sistemas operativos diferentes.
 Un lenguaje que está ampliamente disponible y cuya
definición es independiente de las características de una
máquina particular constituye una base útil para la
producción de programas transportables. Ejemplo de ello
es Java.
Aspectos a tener en cuenta al escoger un lenguaje de
programación…

Costos de uso adecuados – en cuanto a


 Costo de creación del programa,
 Costo de traducción del programa,
 Costo de ejecución del programa y
 Costo de mantenimiento del programa.
Estandarización
 ISO - International Standards Organization
 IEEE - Institute of Electrical and Electronics Engineers
 ANSI - American National Standards Institute
Primeros lenguajes
FORTRAN: pionero en LP de alto
nivel.
 1955 a 1957: John Backus
 Orientado a cálculos numéricos
 Tuvo un éxito extraordinario
 Versiones: FORTRAN en 1958
(FORTRAN II); FORTRAN IV;
FORTRAN 66; FORTRAN 77 hasta
FORTRAN 2008.
Primeros lenguajes
LISP: pionero en procesamiento de listas y
aplicaciones de inteligencia artificial.
 Desarrollado bajo el liderazgo de Jonh
McCarthy, del MIT, en la década de los 50.
 LISP fue proyectado como un lenguaje
funcional para procesamiento de listas para
usos generales
 Su estructura básica, el control y su
estrategia de implementación se basaban
en conceptos de lógica matemática.
 Ha tenido múltiples versiones posteriores.
Primeros lenguajes
ALGOL: pionero en introducción de recursos formales en la
definición de LP de alto nivel.
 Desarrollado bajo el liderazgo de Peter Naur 1958.
 La notación de ALGOL debería aproximarse a las
matemáticas normales.
 ALGOL debería ser útil para la descripción de algoritmos.
 No alcanzó éxito comercial en USA, aunque consiguió
cierto éxito en Europa. Sin embargo, tuvo un impacto más
allá de su uso, por la trascendencia y valor de los
conceptos de programación que incorporó.
 Backus fue el editor del informe de ALGOL que definía el
lenguaje, usando una notación sintáctica basada en una
gramática libre de contexto (BNF o Backus Naur Form).
 Versiones: ALGOL 58; ALGOL 60.
Primeros lenguajes
COBOL: avance en procesamiento de
datos de negocios en LP de alto nivel.
 Desarrollado bajo el liderazgo de
Grace Hopper, con el patrocinio del
Departamento de Defensa de
Estados Unidos alrededor de los 60.
 Ha tenido varias versiones
posteriores.
Genealogía de los principales pioneros LP

Tomado de Watt (2004)


Genealogía de los principales LP

Tomado
de
Sebesta
(2010)
The 2016 Top-Ten Programming Languages
(IEEE Spectrum ranking)
The 2019 Top-Ten Programming Languages
(IEEE Spectrum ranking)
Lenguajes emergentes
Hay muchos, aquí una propuesta:
 Lua
 Clojure
 Scala
 Go
 Cuda
 Kotlin
 Swift
 Rust
…
Sintaxis y semántica
 Semántica estática - Semántica determinada en tiempo de compilación:
◦ var A: integer; Tipo y almacenamiento para A
◦ int B[10]; Tipo y almacenamiento para el arreglo B
◦ float MyProcC(float x; float y){...}; atributos (signatura) de función
 Semántica dinámica – Semántica determinada en tiempo de ejecución:
◦ $X = ”ABC'' Ejemplo de PHP: $X es una cadena
◦ $X = 1 + 2; $X es un entero
 Notaciones sintácticas formales son:
◦ BNF (Backus-Naur Form)
◦ Diagramas sintácticos
 Notaciones semánticas formales son:
◦ Semántica operacional
◦ Semántica denotacional
◦ Semántica axiomática
Paradigmas de programación
 Los paradigmas de programación son modelos que
describen cómo diseñar e implementar programas.
 Diferentes paradigmas dan lugar a diferentes técnicas de
programación, lo cual no implica que ellos sean
contradictorios, sino que más bien unos tienden a
complementar otros, por lo que la programación actual
tiende a ser multiparadigma.
Paradigmas de programación
Familias de LP y paradigmas que engloban
 Lenguajes imperativos, en los cuales el foco de atención es como la
computadora debe hacer el cómputo.
◦ von Neumann o procedurales: están basados en sentencias (en particular
asignaciones) que influencian el subsiguiente cálculo vía efectos colaterales de
cambios de valores en la memoria. Ejemplos: C, Ada, Fortran, . . .
◦ Orientados a objetos: representan el cómputo como interacciones entre objetos
semi-independientes, cada uno de los cuales posee su propio estado interno y un
conjunto de procedimientos que administrar ese estado. Smalltalk es el más puro
de los LPOO, Eiffel, Java, … C++ es un ejemplo de lenguaje híbrido OO y fuertes
características procedurales.
◦ De scripting: se distinguen por mezclar componentes que originariamente fueron
desarrolladas como programas independientes. PHP y JavaScript se desarrollaron
inicialmente para general páginas web con contenido dinámico (que se puede
ejecutar en el cliente o en el servidor). Otros LP de scripting , como Perl,
Python, Ruby, se desarrollaron más deliberadamente como de propósito general.
Cálculo imperativo del MCD
 El mcd de u y v es u, si v= 0.
 El mcd de u y v es igual al mcd de v y u mod v si
v es > 0.
int mcd (int u, int v)
{ if (v == 0)
return v;
else
return mcd(v, u % v);
}
Una clase de Java para obtener el MCD
public class IntMcd
{ private int valor ;
public IntMcd(int val) { valor = val;}
public getValor() { return valor; }
public int mcd (int v)
{ int z = valor;
int y = v;
while (y != 0)
{ int t = y;
y = z % y;
z = t;
}
return z;
}
}
Paradigmas de programación
Familias de LP y paradigmas que engloban
 Lenguajes declarativos, los cuales se enfocan en que debe hacer la
computadora.
◦ Funcional: emplea un modelo computacional basado en la definición recursiva de
las funciones. Se inspiran en el -cálculo, un modelo computacional desarrollado
por Alonzo Church en los 1930s. En esencia, un programa es considerado una
función de ciertas entradas a ciertas salidas, definidas en términos de funciones
más simples a través de un proceso de refinamiento. Ejemplo de LP funcionales:
Lisp, Scheme, ML, Haskell.
◦ Lógica o basado en restricciones: Se inspiran en la lógica de predicados. Ellos
modelan el cómputo intentando encontrar valores que satisfacen ciertas
relaciones especificadas, usando búsqueda dirigidas a metas a través de una lista
de reglas lógicas. Prolog es el lenguaje de programación lógica más conocido.
También se considera el lenguaje de bases de datos SQL.
Cálculo funcional del MCD

(define (mcd u v)
(if (= v 0) u
(mcd v (remainder u v))
)
)
Cálculo del MCD en Prolog

mcd(u,v,u):- v = 0 .
mcd(u,v,x):- v > 0 ,
y is u mod v,
mcd (v,y,x) .
Paradigmas de programación
Familias de LP y paradigmas que engloban
 Lenguajes concurrentes o paralelos.
◦ La mayoría de los programas concurrentes son escritos usando
compiladores o paquetes de bibliotecas especiales en conjunto
con un lenguaje secuencial.
◦ Algunos lenguajes de amplio uso, como Java, C# y Ada, tienen
características concurrentes explícitas.
Paradigmas de programación
 Las fronteras entre categorías o paradigmas de lenguajes
de programación son difusas.
 Por ejemplo, se puede escribir en un estilo ampliamente
funcional en muchos lenguajes imperativos y muchos
lenguajes funcionales contienen características
imperativas.
 Es posible que un lenguaje funcional sea orientado a
objeto y varios autores no consideran la programación
funcional como declarativa.
¿Nuevos paradigmas de programación?
 …

También podría gustarte