Lenguajes de programación:
Es un lenguaje formal (o artificial, es decir, un lenguaje con reglas gramaticales bien definidas)
que le proporciona a una persona, en este caso el programador, la capacidad de escribir (o
programar) una serie de instrucciones o secuencias de órdenes en forma de algoritmos con el fin
de controlar el comportamiento físico y/o lógico de una computadora, de manera que se puedan
obtener diversas clases de datos o ejecutar determinadas tareas. A todo este conjunto de órdenes
escritas mediante un lenguaje de programación se le denomina programa.
Historia:
Sobre los últimos 50 años, los idiomas que programan han evolucionado del código binario de
máquina a herramientas poderosas que crean las abstracciones complejas. Es importante entender
por qué los idiomas han evolucionado, y qué capacidades que los idiomas más nuevos nos dan.
"Tan largo como no había máquinas, programar era ningún problema; cuando tuvimos unos
pocas computadoras débiles, programar llegó a ser un problema templado y ahora que tenemos
las computadoras gigantescas, programar ha llegado a ser un problema igualmente gigantesco.
En este sentido que la industria electrónica no ha resuelto un solo problema, tiene sólo los creó -
ha creado el problema de usar su producto". [Edsger. W. Dijkstra. "El Programista Humilde" (la
Conferencia del Premio de Turing), Comunicaciones del ACM, Vol 15, No. 10 (el octubre
1972).]
E. W. Dijkstra habló estas palabras proféticas casi hace 28 años en su es la conferencia del
Premio de Turing. En aquel momento, el 'las computadoras gigantescas él radio de
probablemente tenido entre 64 y 128 kilobytes de la memoria verdadera, y a lo más unos pocos
megaoctetos de artefactos de almacenamiento de acceso directo. Si él pensó que el problema era
gigantesco entonces...
Uno de las llaves a programar exitoso es el concepto de la abstracción. La abstracción es la llave
a la construcción sistemas complejos de software. Como el tamaño de nuestros problemas crece,
la necesidad para la abstracción dramáticamente aumentos. En sistemas sencillos, característica
de idiomas usados en el 1950s y '60s, un solo programador podría entender el problema entero, y
por lo tanto manipula todas estructuras del programa y datos. Los programador son hoy
incapaces de entender todos los programas y los datos - es apenas demasiado grande. La
abstracción se requiere a permitir que el programador para agarrar los conceptos necesarios.
La mayoría de los libros y el reglamento en la historia de programar los idiomas tienden a
discutir los idiomas en términos de generaciones. Esto es un arreglo útil para clasificar los
idiomas por la edad.
Primera Generación
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.
John Von Neumann desarrolló el modelo que lleva su nombre, para describir este concepto de
"programa almacenado". En este modelo, se tiene una abstracción de la memoria como un
conjunto de celdas, que almacenan simplemente números. Estos números pueden representar dos
cosas: los datos, sobre los que va a trabajar el programa; o bien, el programa en sí.
¿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.
La solución que se tomó fue la siguiente: a cada acción que sea capaz de realizar nuestra
computadora, asociarle un número, que será su código de operación (opcode) . Por ejemplo, una
calculadora programable simple podría asignar los opcodes :
1 = SUMA, 2 = RESTA, 3 = MULTIPLICA, 4 = DIVIDE.
Supongamos que queremos realizar la operación 5 * 3 + 2, en la calculadora descrita arriba. En
memoria, podríamos "escribir" el programa de la siguiente forma:
Podemos ver que con esta representación, es simple expresar las operaciones de las que es capaz
el hardware (en este caso, nuestra calculadora imaginaria), en la memoria.
La descripción y uso de los opcodes es lo que llamamos lenguaje de máquina. Es decir, la lista
de códigos que la máquina va a interpretar como instrucciones, describe las capacidades de
programación que tenemos de ella; es el lenguaje más primitivo, depende directamente del
hardware, y requiere del programador que conozca el funcionamiento de la máquina al más bajo
nivel.
Los lenguajes más primitivos fueron los lenguajes de máquina. Esto, ya que el hardware se
desarrolló antes del software, y además cualquier software finalmente tiene que expresarse en el
lenguaje que maneja el hardware.
La programación en esos momentos era sumamente tediosa, pues el programador tenía que
"bajarse" al nivel de la máquina y decirle, paso a pasito, cada punto de la tarea que tenía que
realizar. Además, debía expresarlo en forma numérica; y por supuesto, este proceso era propenso
a errores, con lo que la productividad del programador era muy limitada. Sin embargo, hay que
recordar que en estos momentos, simplemente aún no existía alternativa.
Segunada Generación
El primer gran avance que se dio, como ya se comentó, fue la abstracción dada por el Lenguaje
Ensamblador, y con él, el nacimiento de las primeras herramientas automáticas para generar el
código máquina. Esto redujo los errores triviales, como podía ser el número que correspondía a
una operación, que son sumamente engorrosos y difíciles de detectar, pero fáciles de cometer.
Sin embargo, aún aquí es fácil para el programador perderse y cometer errores de lógica, pues
debe bajar al nivel de la forma en que trabaja el CPU, y entender bien todo lo que sucede dentro
de él.
ejemplo ensamblador: Hola Mundo!
Tercera Generación
Con el desarrollo en los 50s y 60s de algoritmos de más elevado nivel, y el aumento de poder del
hardware, empezaron a entrar al uso de computadoras científicos de otras ramas; ellos conocían
mucho de Física, Química y otras ramas similares, pero no de Computación, y por supuesto, les
era sumamente complicado trabajar con lenguaje Ensamblador en vez de fórmulas. Así, nació el
concepto de Lenguaje de Alto Nivel, con el primer compilador de FORTRAN (FORmula
TRANslation), que, como su nombre indica, inició como un "simple" esfuerzo de traducir un
lenguaje de fórmulas, al lenguaje ensamblador y por consiguiente al lenguaje de máquina. A
partir de FORTRAN, se han desarrollado innumerables lenguajes, que siguen el mismo
concepto: buscar la mayor abstracción posible, y facilitar la vida al programador, aumentando la
productividad, encargándose los compiladores o intérpretes de traducir el lenguaje de alto nivel,
al lenguaje de computadora.
Hay que notar la existencia de lenguajes que combinan características de los de alto nivel y los
de bajo nivel (es decir, Ensamblador). Mi ejemplo favorito es C: contiene estructuras de
programación de alto nivel, y la facilidad de usar librerías que también son características de alto
nivel; sin embargo, fue diseñado con muy pocas instrucciones, las cuales son sumamente
sencillas, fáciles de traducir al lenguaje de la máquina; y requiere de un entendimiento apropiado
de cómo funciona la máquina, el uso de la memoria, etcétera. Por ello, muchas personas
consideramos a lenguajes como C (que fue diseñado para hacer sistemas operativos), lenguajes
de nivel medio.
Cuarta Generación
Los idiomas de la cuarta generación parecen según las instrucciones a las de la tercera
generación. Lo nuevo de estas lenguajes son conceptos como clases, objetos y eventos que
permiten soluciones más fáciles y lógicos. Lenguajes como C++, java y C# se llaman lenguajes
orientadas al objeto.
Los idiomas modernos, tal como C++ y Java, no sólo permite las abstracciones, pero permite la
implementación impuesta de restricciones en abstracciones. La mayoría de los idiomas modernos
son objetivas orientado, que permite que mí modele el mundo verdadero que usa mi idioma.
Además, puedo limitar el acceso para modelar las restricciones de mundo verdadero en datos. La
llave es que usé el término "mundo verdadero." Por la primera vez, yo modelo mi solución en
términos del problema. Quiero que mi solución sea orientado de problema, para que la solución
refleje el mundo verdadero en términos de estructuras de datos y acceso a los datos. Yo también
puedo aplicar directamente y para poder modelar objetos de mundo verdadero usando las clases
(en C + + o Java).
Quinta Generación
Como la quinta generación están conocidos los Lenguajes de inteligencia artificial. Han sido
muy valorados al principio de las noventa - mientras ahora el desarrollo de software toma otras
caminos.
Lo que veremos en el futuro es menos dependencia en el idioma, y más en el modelando
herramientas, tal como el Unificado Modelando el Idioma (UML). La salida del modelando
herramienta producirá mucho de nuestro código para nosotros; en el muy menos, producirá
arquitectónico y los modelos del diseño y la estructura de nuestro código. Esto producirá un
diseño (y posiblemente código) eso puede ser validado por el cliente antes de completar la
implementación y probar. Cuando los problemas diarios que resolvemos llegan a ser más grande,
nosotros tenemos cada vez menos tiempo "volver a hacer" el código. Los días de decir,
"acabamos de escribir una versión de Beta y el cliente entonces pueden decir nosotros lo que
ellos quieren realmente," son pasados. Las organizaciones que fallan de obtener completa y
corrige los requisitos de cliente antes de escribir el código saldrá del negocio. ¿Por qué? Porque
toma demasiado largo, y cuesta también mucho, para escribir código dos o más vez. Las
organizaciones que tienen un compromiso a la comprobación y la validación antes de producir
código prosperarán - los otros fallarán.
Tipos de lenguaje:
Lenguaje imperativo: entre ellos tenemos el Cobol, Pascal, C y Ada.
Lenguaje declarativo: el Lisp y el Prolog.
Lenguaje de programación orientado a objetos: el Smalltalk y el C++.
Lenguaje orientado al problema: son aquellos lenguajes específicos para gestión.
Lenguaje de programación natural: son los nuevos lenguajes que pretender aproximar el diseño y
la construcción de programas al lenguaje de las personas.
Lenguaje de programación de primera generación: el lenguaje máquina y el ensamblador
Lenguaje de segunda generación: los primeros lenguajes de programación de alto nivel imperativo
(FORTRAN, COBOL).
Lenguaje de tercera generación: son lenguajes de programación de alto nivel imperativo pero
mucho más utilizados y vigentes en la actualidad (ALGOL 8, PL/I, PASCAL, MODULA)
Lenguaje de cuarta generación: usados en aplicaciones de gestión y manejo de base de datos
(NATURAL, SQL)
Lenguaje de quinta generación: creados para la inteligencia artificial y para el procesamiento de
lenguajes naturales (LISP, PROLOG)
Fundamentos:
Fundamentos de programación es una asignatura básica que permite crear programas que exhiban un
comportamiento deseado. El proceso de escribir código requiere frecuentemente conocimientos en
varias áreas distintas, además del dominio del lenguaje a utilizar, algoritmos especializados y lógica
formal.
Con esta materia el alumno aprenderá a escribir, a analizar, probar, depurar y dar mantenimiento al
programa generado en un lenguaje de programación.
Lenguaje de programación C:
C es un lenguaje de programación originalmente desarrollado por Dennis M. Ritchie entre 1969
y 1972 en los Laboratorios Bell, como evolución del anterior lenguaje B, a su vez basado en
BCPL.
Al igual que B, es un lenguaje orientado a la implementación de Sistemas Operativos,
concretamente Unix. C es apreciado por la eficiencia del código que produce y es el lenguaje de
programación más popular para crear software de sistemas, aunque también se utiliza para crear
aplicaciones.
Se trata de un lenguaje de tipos de datos estáticos, débilmente tipificado, de medio nivel pero con
muchas características de bajo nivel. Dispone de las estructuras típicas de los lenguajes de alto
nivel pero, a su vez, dispone de construcciones del lenguaje que permiten un control a muy bajo
nivel. Los compiladores suelen ofrecer extensiones al lenguaje que posibilitan mezclar código en
ensamblador con código C o acceder directamente a memoria o dispositivos periféricos.
Historia:
La primera estandarización del lenguaje C fue en ANSI, con el estándar X3.159-1989. El lenguaje
que define este estándar fue conocido vulgarmente como ANSI C. Posteriormente, en 1990, fue
ratificado como estándar ISO (ISO/IEC 9899:1990). La adopción de este estándar es muy amplia por
lo que, si los programas creados lo siguen, el código es portable entre plataformas y/o arquitecturas.
Características:
Un núcleo del lenguaje simple, con funcionalidades añadidas importantes, como
funciones matemáticas y de manejo de archivos, proporcionadas por bibliotecas.
Es un lenguaje muy flexible que permite programar con múltiples estilos. Uno de los más
empleados es el estructurado "no llevado al extremo" (permitiendo ciertas licencias de
ruptura).
Un sistema de tipos que impide operaciones sin sentido.
Usa un lenguaje de preprocesador, el preprocesador de C, para tareas como definir
macros e incluir múltiples archivos de código fuente.
Acceso a memoria de bajo nivel mediante el uso de punteros.
Interrupciones al procesador con uniones.
Un conjunto reducido de palabras clave.
Por defecto, el paso de parámetros a una función se realiza por valor. El paso por
referencia se consigue pasando explícitamente a las funciones las direcciones de memoria
de dichos parámetros.
Punteros a funciones y variables estáticas, que permiten una forma rudimentaria
de encapsulado y polimorfismo.
Tipos de datos agregados (struct) que permiten que datos relacionados (como un
empleado, que tiene un id, un nombre y un salario) se combinen y se manipulen como un
todo (en una única variable "empleado").
Ventajas:
El lenguaje C ha sido pensado para ser altamente transportable.
Un núcleo del lenguaje simple, con funcionalidades añadidas importantes, como
funciones matemáticas y de manejo de archivos, proporcionadas por bibliotecas.
Es un lenguaje muy flexible que permite programar con múltiples estilos. Uno de los más
empleados es el estructurado "no llevado al extremo" (permitiendo ciertas licencias de
ruptura).
Un sistema de tipos que impide operaciones sin sentido.
Usa un lenguaje preprocesado, el preprocesador de C, para tareas como definir macros e
incluir múltiples archivos de código fuente.
Acceso a memoria de bajo nivel mediante el uso de punteros.
Interrupciones al procesador con uniones.
Un conjunto reducido de palabras clave.
Por defecto, el paso de parámetros a una función se realiza por valor. El paso por
referencia se consigue pasando explícitamente a las funciones las direcciones de memoria
de dichos parámetros.
Punteros a funciones y variables estáticas, que permiten una forma rudimentaria de
encapsulado y polimorfismo.
Gracias a este tipo de programas la tecnología ha podido alcanzar un gran avance en
todos los ámbitos tanto nacionales como internacionales, es por eso que es necesario que
este tipo de lenguaje se aprenda para poder realizar utilerías capaces de trabajar y apoyar
proyectos que ayudarán al manejo más sencillo de una empresa o en particular pequeñas
aplicaciones en el hogar.
El Lenguaje C es relativamente sencillo, pero su gran flexibilidad es terreno abonado para
la creación de vicios y prácticas no adecuadas de programación, por lo cual debe cuidarse
la enseñanza de su estilo de programación, técnica y filosofía de trabajo.
Versiones:
XCode.
Borland C++
Codewarrior C++
Comeau C++
Cygwin (GNU C++)
MINGW - Minimalist GNU for Windows.
Dev C++ (IDE que usa MinGW)
wx-Dev C++ (IDE basado en Dev C++)
Digital Mars C++
DJ Delorie's C++ development system for DOS/Windows (GNU C++)
Edison Design Group C++ Front End
Green Hills C++
HP C++ para UNIX y HP C++ para OpenVMS.
IBM C++
Intel C++
The LLVM Compiler Infrastructure.
Mentor Graphics/Microtec Research C++
Microsoft Visual C++
Microsoft Visual Studio Express Editions
Paradigm C++
The Portland Group C++
SGI C++
Sun C++
Sun Studio.
WindRiver's Diab C++
ZinjaI
Realiza una línea de tiempo que muestra la evolución de los lenguajes de programación. Puedes
utilizar el siguiente link para crear la Línea de Tiempo
[Link]
Crea un cuadro comparativo donde se muestre los diferentes tipos de lenguajes de programación
con sus características (Lenguaje máquina, lenguaje de bajo nivel y lenguaje de alto nivel).
Tipos de lenguaje de programación
Lenguaje de maquina El lenguaje máquina es el
único lenguaje que puede ejecutar una
computadora, es específico en cada
arquitectura, es un código que es interpretado
directamente por el microprocesador, está
compuesto por un conjunto de instrucciones
ejecutadas en secuencia que representan
acciones que la máquina podrá tomar
Lenguaje de bajo nivel Lenguaje de bajo nivel. Un lenguaje de
programación de características de bajo
nivel o de primera generación, es aquel en el
que sus instrucciones ejercen un control
directo sobre el hardware y están
condicionados por la estructura física de las
computadoras que lo soportan.
Lenguaje de alto nivel Un lenguaje de programación de alto
nivel se caracteriza por expresar los
algoritmos de una manera adecuada a la
capacidad cognitiva humana, en lugar de la
capacidad con que los ejecutan las máquinas.
Estos lenguajes permiten una máxima
flexibilidad al programador a la hora de
abstraerse o de ser literal.