viernes, 28 de febrero de 2014

Tecnologia Informatica y su relacion con la humanidad

Lenguaje C++



C++ es un lenguaje de programación diseñado a mediados de los años 1980 por Bjarne Stroustrup. La intención de su creación fue el extender al exitoso lenguaje de programación C con mecanismos que permitan la manipulación de objetos. En ese sentido, desde el punto de vista de los lenguajes orientados a objetos, el C++ es un lenguaje híbrido.

Posteriormente se añadieron facilidades de programación genérica, que se sumó a los otros dos paradigmas que ya estaban admitidos (programación estructurada y la programación orientada a objetos). Por esto se suele decir que el C++ es un lenguaje de programación multiparadigma.

Actualmente existe un estándar, denominado ISO C++, al que se han adherido la mayoría de los fabricantes de compiladores más modernos. Existen también algunos intérpretes, tales como ROOT.

Una particularidad del C++ es la posibilidad de redefinir los operadores, y de poder crear nuevos tipos que se comporten como tipos fundamentales.
El nombre C++ fue propuesto por Rick Mascitti en el año 1983, cuando el lenguaje fue utilizado por primera vez fuera de un laboratorio científico. Antes se había usado el nombre "C con clases". En C++, la expresión "C++" significa "incremento de C" y se refiere a que C++ es una extensión de C.

Tipos de datos:

C++ tiene los siguientes tipos fundamentales:

Caracteres: char (también es un entero), wchar_t
Enteros: short, int, long, long long
Números en coma flotante: float, double, long double
Booleanos: bool
Vacío: void

El concepto de clase

Los objetos en C++ son abstraídos mediante una clase. Según el paradigma de la programación orientada a objetos un objeto consta de:

1.  Identidad, que lo diferencia de otros objetos (Nombre que llevara la clase a la que pertenece dicho objeto).
2.     Métodos o funciones miembro
3.     Atributos o variables miembro

Un ejemplo de clase que podemos tomar es la clase perro. Cada perro comparte unas características (atributos). Su número de patas, el color de su pelaje o su tamaño son algunos de sus atributos. Las funciones que lo hagan ladrar, cambiar su comportamiento... esas son las funciones de la clase.

Constructores

Son unos métodos especiales que se ejecutan automáticamente al crear un objeto de la clase. En su declaración no se especifica el tipo de dato que devuelven, y poseen el mismo nombre que la clase a la que pertenecen. Al igual que otros métodos, puede haber varios constructores sobrecargados, aunque no pueden existir constructores virtuales.

Como característica especial a la hora de implementar un constructor, justo después de la declaración de los parámetros, se encuentra lo que se llama "lista de inicializadores". Su objetivo es llamar a los constructores de los atributos que conforman el objeto a construir.

Cabe destacar que no es necesario declarar un constructor al igual que un destructor, pues el compilador lo puede hacer, aunque no es la mejor forma de programar.


Destructores

Los destructores son funciones miembro especiales llamadas automáticamente en la ejecución del programa, y por tanto no tienen por qué ser llamadas explícitamente por el programador. Sus principales cometidos son:

Liberar los recursos computacionales que el objeto de dicha clase haya adquirido en tiempo de ejecución al expirar éste.

Quitar los vínculos que pudiesen tener otros recursos u objetos con éste.

Los destructores son invocados automáticamente al alcanzar el flujo del programa el fin del ámbito en el que está declarado el objeto. El único caso en el que se debe invocar explícitamente al destructor de un objeto, es cuando éste fue creado mediante el operador new, es decir, que éste vive en memoria heap, y no en la pila de ejecución del programa. La invocación del destructor de un objeto que vive en heap se realiza a través del operador delete para arrays.

Herencia

Existen varios tipos de herencia entre clases en el lenguaje de programación C++. Estos son:

Herencia simple
La herencia en C++ es un mecanismo de abstracción creado para poder facilitar y mejorar el diseño de las clases de un programa. Con ella se pueden crear nuevas clases a partir de clases ya hechas, siempre y cuando tengan un tipo de relación especial.
En la herencia, las clases derivadas "heredan" los datos y las funciones miembro de las clases base, pudiendo las clases derivadas redefinir estos comportamientos (polimorfismo) y añadir comportamientos nuevos propios de las clases derivadas. Para no romper el principio de encapsulamiento (ocultar datos cuyo conocimiento no es necesario para el uso de las clases), se proporciona un nuevo modo de visibilidad de los datos/funciones: "protected". Cualquier cosa que tenga visibilidad protected se comportará como pública en la clase Base y en las que componen la jerarquía de herencia, y como privada en las clases que NO sean de la jerarquía de la herencia.
Antes de utilizar la herencia, nos tenemos que hacer una pregunta, y si tiene sentido, podemos intentar usar esta jerarquía: Si la frase <claseB> ES-UN <claseA> tiene sentido, entonces estamos ante un posible caso de herencia donde clase A será la clase base y clase B la derivada.

Herencia múltiple
La herencia múltiple es el mecanismo que permite al programador hacer clases derivadas a partir, no de una sola clase base, sino de varias. Para entender esto mejor, pongamos un ejemplo: Cuando ves a quien te atiende en una tienda, como persona que es, podrás suponer que puede hablar, comer, andar, pero, por otro lado, como empleado que es, también podrás suponer que tiene un jefe, que puede cobrarte dinero por la compra, que puede devolverte el cambio, etc.


C++11

El 12 de agosto de 2011, Herb Sutter, presidente del comité de estándares de C++, informó la aprobación unánime del nuevo estándar.2 La publicación del mismo se espera para algún momento de 2011.

Entre las características del nuevo estándar se pueden destacar:
Funciones lambda;
Referencias rvalue;
La palabra reservada auto;
Inicialización uniforme;
Plantillas con número variable de argumentos.
Además se ha actualizado la biblioteca estándar del lenguaje.

Diferencias de tipos respecto a C

En C++, cualquier tipo de datos que sea declarado completo (fully qualified, en inglés) se convierte en un tipo de datos único. Las condiciones para que un tipo de datos T sea declarado completo son a grandes rasgos las siguientes:

Es posible al momento de compilación conocer el espacio asociado al tipo de datos (es decir, el compilador debe conocer el resultado de sizeof(T)).

T Tiene al menos un constructor, y un destructor, bien declarados.

Si T es un tipo compuesto, o es una clase derivada, o es la especificación de una plantilla, o cualquier combinación de las anteriores, entonces las dos condiciones establecidas previamente deben aplicar para cada tipo de dato constituyente.

En general, esto significa que cualquier tipo de datos definido haciendo uso de las cabeceras completas, es un tipo de datos completo.

En particular, y, a diferencia de lo que ocurría en C, los tipos definidos por medio de struct o enum son tipos completos. Como tales, ahora son sujetos a sobrecarga, conversiones implícitas, etcétera.

Los tipos enumerados, entonces, ya no son simplemente alias para tipos enteros, sino que son tipos de datos únicos en C++. El tipo de datos bool, igualmente, pasa a ser un tipo de datos único, mientras que en C funcionaba en algunos casos como un alias para alguna clase de dato de tipo entero.

Compiladores

Uno de los compiladores libres de C++ es el de GNU, el compilador G++ (parte del proyecto GCC, que engloba varios compiladores para distintos lenguajes). Otros compiladores comunes son Intel C++ Compiler, el compilador de Xcode, el compilador de Borland C++, el compilador de CodeWarrior C++, el compilador g++ de Cygwin, el compilador g++ de MinGW, el compilador de Visual C++, Carbide.c++, entre otros.



Traductores: Ensambladores, compiladores e intérpretes

Un traductor es un programa que recibe como entrada código escrito en un cierto lenguaje y produce como salida código en otro lenguaje, generalmente el lenguaje de entrada es de más alto nivel que el de salida, por ejemplo, los traductores son los ensambladores y los compiladores.

Un traductor es un programa que toma el texto escrito en un lenguaje (el lenguaje fuente) y lo convierte en el texto equivalente en un segundo lenguaje (el lenguaje destino u objeto).

Cuando programamos en algún lenguajes de alto nivel, lo que estamos haciendo en realidad es el código fuente de ese programa, este código fuente debe ser traducido a lenguaje binario para que las instrucciones que contienen puedan ser entendidas y ejecutadas por la computadora.

Un ensamblador es un programa que traduce de un lenguaje ensamblador a lenguaje máquina, mientras que un compilador es un programa que traduce de un lenguaje de alto nivel a un lenguaje de bajo nivel o a lenguaje máquina.

Si la fuente es un lenguaje abstracto o de alto nivel y si el objetivo es un lenguaje de ensamble de bajo nivel o de máquina, el traductor es un compilador.

Los programas traductores de lenguajes son:
1. Compiladores
2. Interpretes

Debido la complejidad de la programación del lenguaje de máquina, en realidad son muy pocos los programas que se escriben con él. Sin embargo el lenguaje de maquina es el único lenguaje capaz de dar instrucciones directamente al CPU. Por lo tanto, toda instrucción de un programa de lenguaje que no sea de maquina tiene que traducirse al lenguaje de maquina antes de su ejecución. Esto se realiza mediante el software de sistemas que se llama traductor de lenguaje. Un traductor de lenguaje convierte un código fuente de un programador a su equivalente en lenguaje de máquina. El código de programa de nivel alto se conoce como el código fuente, mientras que el código de lenguaje de maquina se llama código objeto. 

Hay dos tipos de traductores de lenguajes: intérpretes y compiladores.

Para que un lenguaje de programación sea útil debe de tener un traductor es decir un programa que aceptan otros programas escritos en el lenguaje de cuestión y que, o los ejecuta directamente, o los transforma en una forma adecuada de su ejecución. Un traductor que produce un programa equivalente en una forma adecuada para su ejecución se conoce como compilador.

COMPILADOR

Los primeros compiladores se realizaron programándolos directamente en lenguaje máquina o en ensamblador. Actualmente existen herramientas que facilitan la tarea de escribir compiladores ó intérpretes informáticos. Estas herramientas permiten generar el esqueleto del analizador sintáctico a partir de una definición formal del lenguaje de partida, especificada normalmente mediante una gramática formal y barata, dejando únicamente al programador del compilador la tarea de programar las acciones semánticas asociadas.

Una vez que se dispone de un compilador, se pueden escribir nuevas versiones del compilador en el lenguaje que compila ese compilador.

Un compilador es un programa informático que traduce un programa escrito en un lenguaje de programación a otro lenguaje de programación, o también genera aplicaciones que sean directamente utilizables en un ordenador o computadora. Un compilador lee el código fuente creado en un determinado lenguaje de programación, lo interpreta, comprueba su sintaxis y traduce a lenguaje o código máquina toda la serie de instrucciones, generando el archivo ejecutable final.

Son programas que leen el código fuente y lo traducen o convierten a otro lenguaje, estos programas muestran los errores existentes en el código fuente.

ESTRUCTURA DE UN COMPILADOR

Se requiere un compilador para cada lenguaje de programación. Un compilador efectúa la traducción, no ejecuta el programa, una vez compilado el programa, el resultado en forma de programa objeto será directamente ejecutable.

La ejecución de un programa con compilador requiere de dos etapas:
Traducir el programa simbólico a código máquina
Ejecución y procesamiento de los datos.


El proceso de compilación considera las siguientes etapas:

  • Edición. Esta fase consiste en escribir el programa empleando algún lenguaje y un editor. Como resultado nos dará el código fuente de nuestro programa.

  • Compilación. En esta fase se traduce el código fuente obtenido en la fase anterior a código máquina. Si no se produce ningún error se obtiene el código objeto. En caso de errores el compilador los mostraría para ayudarnos a corregirlos y se procedería a su compilación de nuevo, una vez corregido.

  • Linkado. Esta fase consiste en unir el archivo generado en la fase dos con determinadas rutinas internas del lenguaje, obteniendo el programa ejecutable.



Existen dos tipos de linkados:

Linkado estático: Los binarios de las librerías se añaden a nuestros binarios compilados generando el archivo ejecutable.

Linkado dinámico: no se añaden las librerías a nuestro binario sino que hará que se carguen en memoria las librerías que en ese momento se necesiten.

Una vez traducido, compilado y linkado el archivo está listo para su ejecución donde también podrán surgir problemas y fallos, para los cuales tendríamos que volver a realizar todo el proceso anteriormente citado, de modo que puedan ser corregidos.

TIPOS DE COMPILADORES

Esta taxonomía de los tipos de compiladores no es excluyente, por lo que puede haber compiladores que se adscriban a varias categorías:

Compiladores cruzados: generan código para un sistema distinto del que están funcionando.

Compiladores optimizadores: realizan cambios en el código para mejorar su eficiencia, pero manteniendo la funcionalidad del programa original.

Compiladores de una sola pasada: generan el código máquina a partir de una única lectura del código fuente.

ESTRUCTURA DE UN COMPILADOR DE UNA SOLA PASADA

Compiladores de varias pasadas: necesitan leer el código fuente varias veces antes de poder producir el código máquina.

Compiladores JIT (Just In Time): forman parte de un intérprete y compilan partes del código según se necesitan.

FASES DE LA COMPILACIÓN

La compilación es el proceso de traducción de programas fuente o código fuente a programas objeto o código objeto.

Analizador léxico: también denominado scanner. Su función consiste básicamente en agrupar los caracteres del texto fuente en grupos con entidad propia denominados tokens, que son los identificadores, palabras reservadas, separadores. Los tokens reconocidos son la entrada a la siguiente fase, el analizador sintáctico.

Analizador sintáctico: se ocupa de analizar la sintaxis de las sentencias, de acuerdo con la descripción sintáctica reflejada en la gramática.

Analizador semántico: Se ocupa de analizar la semántica de las sentencias realizando una serie de consultas en unas tablas auxiliares denominadas tablas de símbolos.

TABLA DE SÍMBOLOS

Estructura de datos que contiene un registro por cada identificador, con los campos para los atributos: información sobre la memoria asignada, tipo, si es nombre de procedimiento (número, tipo y método de paso de cada argumento).

Permite encontrar rápidamente cada ID y almacenar o consultar datos de ese registro.

En el Análisis Léxico se detectan los ID y se introducen en la Tabla de Símbolos.

Las fases restantes introducen información sobre los ID y después la utilizan.

OPTIMIZACIÓN DE CÓDIGO

Trata de mejorar el código intermedio para que resulte un código de máquina más rápido de ejecutar.

Compiladores optimizadores: La fase de optimación ocupa una parte significativa del tiempo del compilador.

Hay optimaciones sencillas que mejoran el tiempo de ejecución del programa sin retardar mucho la compilación.

ANÁLISIS DEL FLUJO DE CONTROL.- Proceso que identifica los lazos dentro del grafo de flujo de un programa.

ANÁLISIS DEL FLUJO DE DATOS.- Proceso para recopilar información sobre el modo en que se utilizan las variables en un programa. Considera varios algoritmos para recopilar información, y el impacto de construcciones de lenguaje como los procedimientos y apuntadores.

TRANSFORMACIONES.- Mejoras que se realizan al código con el fin de obtener programas en lenguaje objeto eficientes.

GENERADOR DE CÓDIGO

Se ocupa de generar código objeto para una maquina, es decir, donde efectivamente se hace la traducción.

Existe una otra fase, opcional pero muy usada en los compiladores modernos, que es el optimizador de código, ocupándose de optimizar el tamaño y velocidad del código generado en la fase anterior.

Un compilador necesita guardar y usar la información de los objetos que va encontrando en el lenguaje fuente, como variables, etiquetas, declaraciones de tipos, etc. Esta información se va introduciendo en estructura de datos internos al compilador conocida con el nombre de tabla de símbolos.

El conjunto de procedimientos para el manejo de esta tabla, como introducir un nuevo símbolo, consultar la información de un símbolo, modificarla, borrarla, etc., es lo que se denomina control de las tablas de símbolos. En cuanto al tratamiento de errores es el conjunto de rutinas y actividades que tratan la identificación de un error, su posible tratamiento o recuperación y la emisión del mensaje correspondiente.

Hay que hacer notar la diferencia entre el BASIC interpretado y el compilado, que sería un buen ejemplo entre ambas técnicas de traducción. En el BASIC intérprete se interpreta cada una de las líneas del programa, con lo que se hace lenta la ejecución del programa; con el compilado se consigue un programa objeto que, una vez linkado, es un programa ejecutable globalmente. Todos los demás lenguajes citados tienen un traductor del tipo compilador.

INTÉRPRETES

Un programa intérprete o traductor, analiza directamente la descripción simbólica del programa fuente y realiza las instrucciones dadas.

Es un programa que traduce un lenguaje de alto nivel al lenguaje de máquina de una computadora, el programa siempre permanece en su forma original y traduce cuando está en la fase de ejecución instrucción por instrucción.

La interpretación es un proceso que consta de un paso, en donde tanto el programa como la entrada le son dados al intérprete y se obtiene de una salida.

El intérprete en los lenguajes de programación simula una máquina virtual, donde el lenguaje de máquina es similar al lenguaje fuente.

La ventaja del proceso interprete es que no necesita de dos fases para ejecutar el programa, sin embargo su inconveniente es que la velocidad de ejecución es más lenta ya que debe analizar e interpretar las instrucciones contenidas en el programa fuente.

Comparando su actuación con la de un ser humano, un compilador equivale a un traductor profesional que, a partir de un texto, prepara otro independiente traducido a otra lengua, mientras que un intérprete corresponde al intérprete humano, que traduce de viva voz las palabras que oye, sin dejar constancia por escrito.

En la actualidad, uno de los entornos más comunes de uso de los intérpretes informáticos es Internet, debido a la posibilidad que estos tienen de ejecutarse independientemente de la plataforma.

Traduce y ejecuta una línea del programa a la vez. Si hay error, detiene ejecución del programa. Programas más lentos pero más portables y flexibles. Los intérpretes realizan la traducción y ejecución de forma simultánea, es decir, un intérprete lee el código fuente y lo va ejecutando al mismo tiempo.

Las diferencias entre un compilador y un intérprete básicamente son:

Un programa compilado puede funcionar por si solo mientras que un código traducido por un intérprete no puede funcionar sin éste.

Un programa traducido por un intérprete puede ser ejecutado en cualquier máquina ya que, cada vez que se ejecuta el intérprete, tiene que compilarlo.

Un archivo compilado es mucho más rápido que uno interpretado.

El intérprete traduce una sentencia de programa a la vez, según se ejecuta el programa. 

Mostrara en la pantalla cualquier error que encuentre en la sentencia. Esta traducción línea por línea hace que los intérpretes sean ideales para quienes se hallan en el aprendizaje de la programación, pero hace más lento el proceso de ejecución.

Código fuente: Es un conjunto de instrucciones del programa que están escritas en un lenguaje de programación.

Lenguaje de maquina: Instrucciones nativas del CPU
Lenguaje de alto nivel: Más expresivo a nivel de aplicación.

ENSAMBLADORES

Los ensambladores son programas que procesan los enunciados del programa origen en lenguaje ensamblador y los traducen en archivos en lenguaje máquina que son ejecutados por un microprocesador o un microcontrolador. Los ensambladores permiten que los programas origen se escriban y se editen en una computadora para generar un código ejecutable en otra computadora. El archivo en lenguaje objeto ejecutable resultante se carga y se ejecuta en el sistema destino.

PROCESAMIENTO DE ENSAMBLADO

Este ensamblador es de dos pasadas.
Durante la primera pasada, el programa origen se lee para desarrollar la tabla de símbolos.
Durante la segunda pasada el archivo objeto se crea con referencia a la tabla desarrollada en la primera pasada.
Durante la segunda pasada se crea el listado del programa origen.

Cada enunciado origen se procesa completamente antes de que el enunciado siguiente se lea.

A medida que el enunciado se procesa el ensamblador examina los campos de etiqueta, de código de operación y de operandos.

La tabla de códigos de operación se revisa para encontrar un código operacional similar.

Durante el procesamiento de un mnemónico correspondiente a un código de operación normal, el código máquina normal se inserta en el archivo objetivo.

La acción buscada por una directriz del ensamblador ocurre durante el procesamiento de dicha directriz.

Cualquier error que detecta el ensamblador se muestra justamente antes de la línea que contiene dicho error.

Aún y cuando no se desee producir un listado origen, los errores se despliegan para indicar que el procesamiento de ensamblado no se llevó a cabo de manera normal.

LENGUAJE ENSAMBLADOR

El lenguaje simbólico que se utiliza para codificar los programas origen que se procesan por el ensamblador es llamado lenguaje ensamblador.

Este lenguaje es una colección de símbolos mnemónicos que representan: operaciones, nombres simbólicos, operadores y símbolos especiales.

El lenguaje ensamblador proporciona códigos de operación de los mnemónicos para todas las instrucciones de la máquina contenidas en la lista de instrucciones.

Además, el lenguaje ensamblador contiene mnemónicos directrices, los cuales especifican acciones auxiliares que se llevan a cabo por el ensamblador. Estas directrices no siempre son traducidas a lenguaje maquina.

LENGUAJE INTERPRETADO

Un lenguaje de programación es, por definición, diferente al lenguaje máquina. Por lo tanto, debe traducirse para que el procesador pueda comprenderlo. Un programa escrito en un lenguaje interpretado requiere de un programa auxiliar, que traduce los comandos de los programas según sea necesario.

LENGUAJE COMPILADO

Un programa escrito en un lenguaje "compilado" se traduce a través de un programa anexo llamado compilador que, a su vez, crea un nuevo archivo independiente que no necesita ningún otro programa para ejecutarse a sí mismo. Este archivo se llama ejecutable.

Un programa escrito en un lenguaje compilado posee la ventaja de no necesitar un programa anexo para ser ejecutado una vez que ha sido compilado. Además, como sólo es necesaria una traducción, la ejecución se vuelve más rápida.

Sin embargo, no es tan flexible como un programa escrito en lenguaje interpretado, ya que cada modificación del archivo fuente requiere de la compilación del programa para aplicar los cambios.

LENGUAJES INTERMEDIARIOS

Algunos lenguajes pertenecen a ambas categorías (LISP, Java, Python...) dado que el programa escrito en estos lenguajes puede, en ciertos casos, sufrir una fase de compilación intermediaria, en un archivo escrito en un lenguaje ininteligible y no ejecutable. Los applets Java, pequeños programas que a menudo se cargan en páginas Web, son archivos compilados que sólo pueden ejecutarse dentro de un navegador Web.

Clasificación de los Lenguajes de programación

Los lenguajes de programación se clasifican por su nivel de abstracción del procesador, en este caso la abstracción es un principio por el cual se aísla toda aquella información que no es resulta relevante a un determinado nivel de conocimiento.

Lenguaje de bajo nivel: es el que proporciona poca o ninguna abstracción del microprocesador de un ordenador. Consecuentemente es fácilmente trasladado a lenguaje de máquina.

En general se utiliza este tipo de lenguaje para programar controladores (drivers).


Ventajas:
Mayor adaptación al equipo.
Posibilidad de obtener la máxima velocidad con mínimo uso de memoria.


Inconvenientes:
Imposibilidad de escribir código independiente de la máquina.
Mayor dificultad en la programación y en la comprensión de los programas.
El programador debe conocer más de un centenar de instrucciones.
Es necesario conocer en detalle la arquitectura de la máquina.


Características:
Se trabaja a nivel de instrucciones, es decir, su programación es al más fino detalle.
Está orientado a la máquina.

Lenguaje de medio nivel: es un lenguaje de programación informática como el lenguaje C, que se encuentran entre los lenguajes de alto nivel y los lenguajes de bajo nivel.

Suelen ser clasificados muchas veces de alto nivel, pero permiten ciertos manejos de bajo nivel. Son precisos para ciertas aplicaciones como la creación de sistemas operativos, ya que permiten un manejo abstracto (independiente de la máquina, a diferencia del ensamblador), pero sin perder mucho del poder y eficiencia que tienen los lenguajes de bajo nivel.

Una característica distintiva, por ejemplo, que convierte a C en un lenguaje de medio nivel y al Pascal en un lenguaje de alto nivel es que en el primero es posible manejar las letras como si fueran números (en Pascal no), y por el contrario en Pascal es posible concatenar las cadenas de caracteres con el operador suma y copiarlas con la asignación (en C es el usuario el responsable de llamar a las funciones correspondientes).

Una de las características más peculiares del lenguaje de programación C; es el uso de "apuntadores", los cuales son muy útiles en la implementación de algoritmos como Listas ligadas, Tablas Hash y algoritmos de búsqueda y ordenamiento que para otros lenguajes de programación (como Java por ejemplo) les suele ser un poco más complicado implementar.

Los lenguajes de alto nivel: se caracterizan por expresar los algoritmos de una manera adecuada a la capacidad cognitiva humana, en lugar de a la capacidad ejecutora de las máquinas.

En los primeros lenguajes de alto nivel la limitación era que se orientaban a un área específica y sus instrucciones requerían de una sintaxis predefinida. Se clasifican como lenguajes procedimentales.

Otra limitación de los lenguajes de alto nivel es que se requiere de ciertos conocimientos de programación para realizar las secuencias de instrucciones lógicas.

Los lenguajes de muy alto nivel se crearon para que el usuario común pudiese solucionar tal problema de procesamiento de datos de una manera más fácil y rápida.

Por esta razón, a finales de los años 1950 surgió un nuevo tipo de lenguajes de programación que evitaba estos inconvenientes, a costa de ceder un poco en las ventajas. Estos lenguajes se llaman "de tercera generación" o "de alto nivel", en contraposición a los "de bajo nivel" o "de nivel próximo a la máquina".


Ventajas:
La programación en un lenguaje de alto nivel tiene ciertas ventajas:
Genera un código más sencillo y comprensible.
Escribir un código válido para diversas máquinas y, posiblemente, sistemas operativos.


Inconvenientes:
Reducción de velocidad al ceder el trabajo de bajo nivel a la máquina.
Algunos requieren que la máquina cliente posea una determinada plataforma.


Objetivos:
Lograr independencia de la máquina, pudiendo utilizar un mismo programa en diferentes equipos con la única condición de disponer de un programa traductor o compilador, que lo suministra el fabricante, para obtener el programa ejecutable en lenguaje binario de la máquina que se trate. Además, no se necesita conocer el hardware específico de dicha máquina.

Aproximarse al lenguaje natural, para que el programa se pueda escribir y leer de una forma más sencilla, eliminando muchas de las posibilidades de cometer errores que se daban en el lenguaje máquina, ya que se utilizan palabras (en inglés) en lugar de cadenas de símbolos sin ningún significado aparente.

Incluir rutinas de uso frecuente como son las de entrada/salida, funciones matemáticas, manejo de tablas, etc., que figuran en una especie de librería del lenguaje, de tal manera que se pueden utilizar siempre que se quieran sin necesidad de programarlas cada vez.



Lenguajes de bajo nivel
Código máquina
Ensamblador


Lenguajes de medio nivel
BCPL
C


Lenguajes de alto nivel
ADA
ALGOL
BASIC
Clipper
Cobol
C++
FORTH
Fortran
Haskell
Informix 4gl
Java
Lexico (con códigos en castellano o sinónimos en otros idiomas)
Lisp
Logo
Modula
PASCAL
Prolog
RPG
Visual Basic