viernes, 28 de febrero de 2014
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
Suscribirse a:
Entradas (Atom)