Académique Documents
Professionnel Documents
Culture Documents
Ir a la navegaciónIr a la búsqueda
Este artículo o sección necesita referencias que aparezcan en una publicación
acreditada.
Este aviso fue puesto el 22 de diciembre de 2017.
Índice
1Historia
2Tipos de compiladores
3Proceso de compilación
4Etapas del proceso
o 4.1Fase de análisis
4.1.1Análisis léxico
4.1.2Análisis sintáctico
4.1.3Análisis semántico
o 4.2Fase de síntesis
4.2.1Generación de código intermedio
o 4.3Optimización de código
5Estructura de datos principales
o 5.1Componentes léxicos o tókenes
o 5.2Árbol sintáctico
o 5.3Tabla de símbolos
o 5.4Tabla de literales
o 5.5Código intermedio
o 5.6Archivos temporales
6Véase también
7Referencias
8Enlaces externos
Historia[editar]
Artículo principal: Historia de la construcción de los compiladores
En 1946 se desarrolló la primera computadora digital. En un principio, estas máquinas
ejecutaban instrucciones consistentes en códigos numéricos que señalaban a los circuitos de
la máquina los estados correspondientes a cada operación, lo que se denominó lenguaje
máquina.
Pronto los primeros usuarios de estos ordenadores descubrieron la ventaja de escribir sus
programas mediante claves más fáciles de recordar que esos códigos; al final, todas esas
claves juntas se traducían manualmente a lenguaje máquina. Estas claves constituyen los
llamados lenguajes ensambladores.
Pese a todo, el lenguaje ensamblador seguía siendo el de una máquina, pero más fácil de
manejar. Los trabajos de investigación se orientaron hacia la creación de un lenguaje que
expresara las distintas acciones a realizar de una manera lo más sencilla posible para una
persona. El primer compilador fue escrito por Grace Hopper, en 1952 para el lenguaje de
programación A-0. En 1950 John Backus dirigió una investigación en IBM sobre un lenguaje
algebraico. En 1954 se empezó a desarrollar un lenguaje que permitía escribir fórmulas
matemáticas de manera traducible por un ordenador; le llamaron FORTRAN (FORmulae
TRANslator). Fue el primer lenguaje de alto nivel y se introdujo en 1957 para el uso de la
computadora IBM modelo 704.
Surgió así por primera vez el concepto de un traductor como un programa que traducía un
lenguaje a otro lenguaje. En el caso particular de que el lenguaje a traducir es un lenguaje de
alto nivel y el lenguaje traducido de bajo nivel, se emplea el término compilador.
El trabajo de realizar un compilador fue complicado de realizar. El primer compilador
de FORTRAN tardó 18 años-persona en realizarse y era muy sencillo. Este desarrollo de
FORTRAN estaba muy influenciado por la máquina objeto en la que iba a ser implementado.
Como un ejemplo de ello tenemos el hecho de que los espacios en blanco fuesen ignorados,
debido a que el periférico que se utilizaba como entrada de programas (una lectora de tarjetas
perforadas) no contaba correctamente los espacios en blanco.
El primer compilador autocontenido, es decir, capaz de compilar su propio código fuente fue el
creado para Lisp por Hart y Levin en el MIT en 1962. Desde 1970 se ha convertido en una
práctica común escribir el compilador en el mismo lenguaje que este compila, aunque
PASCAL y C han sido alternativas muy usadas.
Crear un compilador autocontenido genera un problema llamado bootstrapping, es decir el
primer compilador creado para un lenguaje tiene que o bien ser compilado por un compilador
escrito en otro lenguaje o bien compilado al ejecutar el compilador en un intérprete.
Tipos de compiladores[editar]
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.
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.
En las primeras épocas de la informática, los compiladores eran considerados un software de
los más complejos existentes.
Los primeros compiladores se realizaron programándolos directamente en lenguaje máquina o
en ensamblador. Una vez que se dispone de un compilador, se pueden escribir nuevas
versiones del compilador (u otros compiladores distintos) en el lenguaje que compila ese
compilador.
Actualmente existen herramientas que facilitan la tarea de escribir compiladores
o 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.
Proceso de compilación[editar]
Es el proceso por el cual se traducen las instrucciones escritas en un determinado lenguaje de
programación a lenguaje máquina. Además de un traductor, se pueden necesitar otros
programas para crear un programa objeto ejecutable. Un programa fuente se puede dividir en
módulos almacenados en archivos distintos. La tarea de reunir el programa fuente a menudo
se confía a un programa distinto, llamado preprocesador. El preprocesador también puede
expandir abreviaturas, llamadas a macros, a proposiciones del lenguaje fuente.
Normalmente la creación de un programa ejecutable (un típico
archivo .exe para Windows o DOS) conlleva dos pasos. El primer paso se
llama compilación (propiamente dicho) y traduce el código fuente escrito en un lenguaje de
programación almacenado en un archivo a código en bajo nivel (normalmente en código
objeto, no directamente a lenguaje máquina). El segundo paso se llama enlazado en el cual se
enlaza el código de bajo nivel generado de todos los ficheros y subprogramas que se han
mandado a compilar y se añade el código de las funciones que hay en las bibliotecas del
compilador para que el ejecutable pueda comunicarse directamente con el sistema operativo,
traduciendo así finalmente el código objeto a código máquina, y generando un módulo
ejecutable.
Estos dos pasos se pueden hacer por separado, almacenando el resultado de la fase de
compilación en archivos objetos (un típico.obj para Microsoft Windows, DOS o para Unix);
para enlazarlos en fases posteriores, o crear directamente el ejecutable; con lo que la fase de
compilación se almacena solo temporalmente. Un programa podría tener partes escritas en
varios lenguajes (por ejemplo C, C++ y Asm), que se podrían compilar de forma independiente
y luego enlazar juntas para formar un único módulo ejecutable.
El análisis léxico constituye la primera fase, aquí se lee el programa fuente de izquierda a
derecha y se agrupa en componentes léxicos (tókenes), que son secuencias de caracteres
que tienen un significado. Además, todos los espacios en blanco, líneas en blanco,
comentarios y demás información innecesaria se elimina del programa fuente. También se
comprueba que los símbolos del lenguaje (palabras clave, operadores, etc.) se han escrito
correctamente.
Como la tarea que realiza el analizador léxico es un caso especial de coincidencia de
patrones, se necesitan los métodos de especificación y reconocimiento de patrones, se usan
principalmente los autómatas finitos que acepten expresiones regulares. Sin embargo, un
analizador léxico también es la parte del traductor que maneja la entrada del código fuente, y
puesto que esta entrada a menudo involucra un importante gasto de tiempo, el analizador
léxico debe funcionar de manera tan eficiente como sea posible.
Análisis sintáctico[editar]
Artículo principal: Analizador sintáctico
temp1 := entreal(60)
temp2 := id3 * temp1 ===> (2)
temp3 := id2 + temp2
id1 := temp3
Esta representación intermedia tiene varias propiedades. Primera, cada instrucción de tres
direcciones tiene a lo sumo un operador, además de la asignación. Por tanto, cuando se
generan esas instrucciones el compilador tiene que decidir el orden en que deben efectuarse,
las operaciones; la multiplicación precede a la adición al programa fuente de. Segunda, el
compilador debe generar un nombre temporal para guardar los valores calculados por cada
instrucción. Tercera, algunas instrucciones de «tres direcciones» tienen menos de tres
operadores, por ejemplo la primera y la última instrucciones de asignación.
Optimización de Código
La fase de optimización de código trata de mejorar el código intermedio de modo que resulte
un código de máquina más rápido de ejecutar. Algunas optimizaciones son triviales. Por
ejemplo, un algoritmo natural genera el código intermedio (2) utilizando una instrucción para
cada operador de la representación del árbol después del análisis semántico, aunque hay una
forma mejor de realizar los mismos cálculos usando las dos instrucciones
Este sencillo algoritmo no tiene nada de malo, puesto que el problema se puede solucionar en
la fase de optimización de código. Esto es, el compilador puede deducir que la conversión de
60 de entero a real se puede hacer de una vez por todas en el momento de la compilación, de
modo que la operación "entreal( )" se puede eliminar. Además, temp3 se usa solo una vez,
para transmitir su valor a id1. Entonces resulta seguro sustituir a id1 por temp3, a partir de lo
cual la última proposición de (2) no se necesita y se obtiene el código de (3).
Hay muchas variaciones en la cantidad de optimización de código que ejecutan los distintos
compiladores. En lo que hacen mucha optimización llamados «compiladores optimizadores»,
una parte significativa del tiempo del compilador se ocupa en esta fase. Sin embargo, hay
optimizaciones sencillas que mejoran sensiblemente el tiempo de ejecución del programa
objeto sin retardar demasiado la compilación.
Archivos temporales[editar]
Al principio las computadoras no tenían la suficiente memoria para guardar un programa
completo durante la compilación. Este problema se resolvió mediante el uso de archivos
temporales para mantener los productos de los pasos intermedios durante la traducción o bien
al compilar «al vuelo», es decir, manteniendo solo la información suficiente de las partes
anteriores del programa fuente que permita proceder a la traducción.
Las limitaciones de memoria son ahora un problema mucho menor, y es posible requerir que
una unidad de compilación entera se mantenga en memoria, en especial si se dispone de la
compilación por separado en el lenguaje. Con todo, los compiladores ocasionalmente
encuentran útil generar archivos intermedios durante alguna de las etapas del procesamiento.
Algo típico de estos es la necesidad de direcciones de corrección hacia atrás durante la
generación de código.
Véase también[editar]
BlueJ
Lenguaje de programación
Proceso de traducción de programas
Lenguaje ensamblador
Ensamblador
Desensamblador
Decompilador
Intérprete
Depurador
Lenguaje de alto nivel
Lenguaje de bajo nivel
Lenguaje de máquina
Historia de la construcción de los compiladores
Un ejemplo de código fuente escrito en el lenguaje de programación Java, que imprimirá el mensaje
"Hello World!" a la salida estándar cuando es compilado y ejecutado
Índice
1Historia
2Clasificación de los lenguajes de programación
o 2.1Clasificación histórica o por generaciones
3Paradigma de programación
4Clasificación por paradigmas
5Elementos
o 5.1Variables y vectores
o 5.2Condicionales
o 5.3Bucles
o 5.4Funciones
o 5.5Sintaxis
o 5.6Semántica estática
o 5.7Sistema de tipos
5.7.1Lenguajes tipados versus lenguajes no tipados
5.7.2Tipos estáticos versus tipos dinámicos
5.7.3Tipos débiles y tipos fuertes
6Implementación
7Técnica
o 7.1Paradigmas
8Véase también
9Referencias
10Enlaces externos
Historia[editar]
Artículo principal: Historia de los lenguajes de programación
Código Fortran en una tarjeta perforada, mostrando el uso especializado de las columnas 1-5, 6 y 73-80.
Para que la computadora entienda nuestras instrucciones debe usarse un lenguaje específico
conocido como código máquina, que la máquina lee fácilmente, pero que es excesivamente
complicado para las personas. De hecho solo consiste en cadenas extensas de números 0 y
1.
Para facilitar el trabajo, los primeros operadores de computadoras decidieron crear un
traductor para reemplazar los 0 y 1 por palabras o abstracción de palabras y letras
provenientes del inglés; este se conoce como lenguaje ensamblador. Por ejemplo, para sumar
se usa la letra A de la palabra inglesa add (sumar). El lenguaje ensamblador sigue la misma
estructura del lenguaje máquina, pero las letras y palabras son más fáciles de recordar y
entender que los números.
La necesidad de recordar secuencias de programación para las acciones usuales llevó a
denominarlas con nombres fáciles de memorizar y
asociar: ADD (sumar), SUB (restar), MUL (multiplicar), CALL (ejecutar subrutina), etc. A esta
secuencia de posiciones se le denominó "instrucciones", y a este conjunto de instrucciones se
le llamó lenguaje ensamblador. Posteriormente aparecieron diferentes lenguajes de
programación, los cuales reciben su denominación porque tienen una
estructura sintáctica semejante a la de los lenguajes escritos por los humanos, denominados
también lenguajes de alto nivel.
El primer programador de computadora conocido fue una mujer: Ada Lovelace, hija
de Anabella Milbanke Byron y Lord Byron. Anabella inició en las matemáticas a Ada quien,
después de conocer a Charles Babbage, tradujo y amplió una descripción de su máquina
analítica. Incluso aunque Babbage nunca completó la construcción de cualquiera de sus
máquinas, el trabajo que Ada realizó con estas le hizo ganarse el título de primera
programadora de computadoras del mundo. El nombre del lenguaje de programación Ada fue
escogido como homenaje a esta programadora.
A finales de 1953, John Backus sometió una propuesta a sus superiores en IBM para
desarrollar una alternativa más práctica al lenguaje ensamblador para programar
la computadora central IBM 704. El histórico equipo Fortran de Backus consistió en los
programadores Richard Goldberg, Sheldon F. Best, Harlan Herrick, Peter Sheridan, Roy
Nutt, Robert Nelson, Irving Ziller, Lois Haibt y David Sayre.1
El primer manual para el lenguaje Fortran apareció en octubre de 1956, con el
primer compilador Fortran entregado en abril de 1957. Esto era un compilador optimizado,
porque los clientes eran reacios a usar un lenguaje de alto nivel a menos que su compilador
pudiera generar código cuyo desempeño fuera comparable al de un código hecho a mano en
lenguaje ensamblador.
En 1960, se creó COBOL, uno de los lenguajes usados aún en la actualidad, en informática de
gestión.
A medida que la complejidad de las tareas que realizaban las computadoras aumentaba, se
hizo necesario disponer de un método más eficiente para programarlas. Entonces, se crearon
los lenguajes de alto nivel, como lo fue BASIC en las versiones introducidas en los
microordenadores de la década de 1980. Mientras que una tarea tan sencilla como sumar dos
números puede necesitar varias instrucciones en lenguaje ensamblador, en un lenguaje de
alto nivel bastará una sola sentencia.
Clasificación histórica
A medida que surgian nuevos lenguajes que permitían nuevos estilos de programación
más expresiva, se distinguieron dichos estilos en una serie de generaciones, cada
una representando lenguajes de programación surgidos en una época similar y con
características genéricas comunes.
Paradigma de programación[editar]
Un paradigma de programación consiste en un método para llevar a cabo
cómputos y la forma en la que deben estructurarse y organizarse las tareas
que debe realizar un programa.2 Se trata de una propuesta tecnológica
adoptada por una comunidad de programadores, y desarrolladores cuyo
núcleo central es incuestionable en cuanto que únicamente trata de resolver
uno o varios problemas claramente delimitados; la resolución de estos
problemas debe suponer consecuentemente un avance significativo en al
menos un parámetro que afecte a la ingeniería de software. Representa un
enfoque particular o filosofía para diseñar soluciones. Los paradigmas difieren
unos de otros, en los conceptos y la forma de abstraer los elementos
involucrados en un problema, así como en los pasos que integran su solución
del problema, en otras palabras, el cómputo. Tiene una estrecha relación con
la formalización de determinados lenguajes en su momento de definición. Es
un estilo de programación empleado.
Un paradigma de programación está delimitado en el tiempo en cuanto a
aceptación y uso, porque nuevos paradigmas aportan nuevas o mejores
soluciones que lo sustituyen parcial o totalmente.
El paradigma de programación que actualmente es más utilizado es la
"orientación a objetos" (OO). El núcleo central de este paradigma es la unión
de datos y procesamiento en una entidad llamada "objeto", relacionable a su
vez con otras entidades "objeto".
Tradicionalmente, datos y procesamiento se han separado en áreas diferente
del diseño y la implementación de software. Esto provocó que grandes
desarrollos tuvieran problemas de fiabilidad, mantenimiento, adaptación a los
cambios y escalabilidad. Con la OO y características como el encapsulado,
polimorfismo o la herencia, se permitió un avance significativo en el desarrollo
de software a cualquier escala de producción. La OO parece estar ligada en
sus orígenes con lenguajes como Lisp y Simula, aunque el primero que acuñó
el título de "programación orientada a objetos" fue Smalltalk.
Elementos[editar]
Variables y vectores[editar]
Artículo principal: Variable (programación)
Imagen tomada de Pauscal, lenguaje de programación en español creado en
Argentina.
Tipo de
Breve descripción
dato
If: Indica una condición para que se ejecute una parte del programa.
Else if: Siempre va precedido de un "If" e indica una condición para que
se ejecute una parte del programa siempre que no cumpla la condición
del if previo y sí se cumpla con la que el "else if" especifique.
Else: Siempre precedido de "If" y en ocasiones de "Else If". Indica que
debe ejecutarse cuando no se cumplan las condiciones previas.
Bucles[editar]
Los bucles son parientes cercanos de los condicionantes, pero ejecutan
constantemente un código mientras se cumpla una determinada condición.
Los más frecuentes son:
complex *p = NULL;
complex abs_p = sqrt (p->real * p->real + p->im * p->im);
Implementación[editar]
Técnica[editar]
Para escribir programas que proporcionen los mejores resultados, cabe tener
en cuenta una serie de detalles.
Corrección. Un programa es correcto si hace lo que debe hacer tal y
como se estableció en las fases previas a su desarrollo. Para determinar
si un programa hace lo que debe, es muy importante especificar
claramente qué debe hacer el programa antes de desarrollarlo y, una vez
acabado, compararlo con lo que realmente hace.
Algoritmo
Ir a la navegaciónIr a la búsqueda
Índice
1Definición
2Medios de expresión de un algoritmo
o 2.1Diagrama de flujo
o 2.2Pseudocódigo
o 2.3Sistemas formales
o 2.4Implementación
o 2.5Variables
o 2.6Estructuras secuenciales
3Algoritmos como funciones
4Análisis de algoritmos
5Ejemplo de algoritmo
o 5.1Descripción de alto nivel
o 5.2Descripción formal
o 5.3Implementación
6Véase también
o 6.1Tipos de algoritmos según su función
o 6.2Técnicas de diseño de algoritmos
o 6.3Temas relacionados
o 6.4Disciplinas relacionadas
7Referencias
8Bibliografía
9Enlaces externos
Definición[editar]
En general, no existe ningún consenso definitivo en cuanto a la definición formal de algoritmo.
Muchos autores los señalan como listas de instrucciones para resolver un cálculo o
un problema abstracto, es decir, que un número finito de pasos convierten los datos de un
problema (entrada) en una solución (salida).123456 Sin embargo cabe notar que algunos
algoritmos no necesariamente tienen que terminar o resolver un problema en particular. Por
ejemplo, una versión modificada de la criba de Eratóstenes que nunca termine de calcular
números primos no deja de ser un algoritmo.7
A lo largo de la historia varios autores han tratado de definir formalmente a los algoritmos
utilizando modelos matemáticos. Esto fue realizado por Alonzo Church en 1936 con el
concepto de "calculabilidad efectiva" basada en su cálculo lambda y por Alan
Turing basándose en la máquina de Turing. Los dos enfoques son equivalentes, en el sentido
en que se pueden resolver exactamente los mismos problemas con ambos enfoques.89 Sin
embargo, estos modelos están sujetos a un tipo particular de datos como son números,
símbolos o gráficas mientras que, en general, los algoritmos funcionan sobre una vasta
cantidad de estructuras de datos.31 En general, la parte común en todas las definiciones se
puede resumir en las siguientes tres propiedades siempre y cuando no
consideremos algoritmos paralelos:7
Diagrama de flujo que expresa un algoritmo para calcular la raíz cuadrada de un número
Los diagramas de flujo son descripciones gráficas de algoritmos; usan símbolos conectados
con flechas para indicar la secuencia de instrucciones y están regidos por ISO.
Los diagramas de flujo son usados para representar algoritmos pequeños, ya que abarcan
mucho espacio y su construcción es laboriosa. Por su facilidad de lectura son usados como
introducción a los algoritmos, descripción de un lenguaje y descripción de procesos a
personas ajenas a la computación.
Pseudocódigo[editar]
Artículo principal: Pseudocódigo
El pseudocódigo (falso lenguaje, el prefijo pseudo significa falso) es una descripción de alto
nivel de un algoritmo que emplea una mezcla de lenguaje natural con algunas convenciones
sintácticas propias de lenguajes de programación, como asignaciones, ciclos y condicionales,
aunque no está regido por ningún estándar. Es utilizado para describir algoritmos en libros y
publicaciones científicas, y como producto intermedio durante el desarrollo de un algoritmo,
como los diagramas de flujo, aunque presentan una ventaja importante sobre estos, y es que
los algoritmos descritos en pseudocódigo requieren menos espacio para representar
instrucciones complejas.
El pseudocódigo está pensado para facilitar a las personas el entendimiento de un algoritmo, y
por lo tanto puede omitir detalles irrelevantes que son necesarios en una implementación.
Programadores diferentes suelen utilizar convenciones distintas, que pueden estar basadas en
la sintaxis de lenguajes de programación concretos. Sin embargo, el pseudocódigo, en
general, es comprensible sin necesidad de conocer o utilizar un entorno de programación
específico, y es a la vez suficientemente estructurado para que su implementación se pueda
hacer directamente a partir de él.
Así el pseudocódigo cumple con las funciones antes mencionadas para representar algo
abstracto los protocolos son los lenguajes para la programación. Busque fuentes más precisas
para tener mayor comprensión del tema.
Sistemas formales[editar]
La teoría de autómatas y la teoría de funciones recursivas proveen modelos matemáticos que
formalizan el concepto de algoritmo. Los modelos más comunes son la máquina de
Turing, máquina de registro y funciones μ-recursivas. Estos modelos son tan precisos como
un lenguaje máquina, careciendo de expresiones coloquiales o ambigüedad, sin embargo se
mantienen independientes de cualquier computadora y de cualquier implementación.
Implementación[editar]
Muchos algoritmos son ideados para implementarse en un programa. Sin embargo, los
algoritmos pueden ser implementados en otros medios, como una red neuronal, un circuito
eléctrico o un aparato mecánico y eléctrico. Algunos algoritmos inclusive se diseñan
especialmente para implementarse usando lápiz y papel. El algoritmo de
multiplicacióntradicional, el algoritmo de Euclides, la criba de Eratóstenes y muchas formas de
resolver la raíz cuadrada son solo algunos ejemplos.
Variables[editar]
Son elementos que toman valores específicos de un tipo de datos concreto. La declaración de
una variable puede realizarse comenzando con var. Principalmente, existen dos maneras de
otorgar valores iniciales a variables:
Ejemplo:
...
i:=1;
read(n);
while i < n do begin
(* cuerpo del bucle *)
i := i + 1
end;
...
Estructuras secuenciales[editar]
La estructura secuencial es aquella en la que una acción sigue a otra en secuencia. Las
operaciones se suceden de tal modo que la salida de una es la entrada de la siguiente y así
sucesivamente hasta el fin del proceso. La asignación de esto consiste, en el paso de valores
o resultados a una zona de la memoria. Dicha zona será reconocida con el nombre de la
variable que recibe el valor. La asignación se puede clasificar de la siguiente forma:
Inicio
...
float b, h, a;
printf("Diga la base");
scanf("%f", &b);
printf("Diga la altura");
scanf("%f", &h);
a = (b*h)/2;
printf("El área del triángulo es %f", a)
...
Fin
Un algoritmo se puede concebir como una función que transforma los datos de
un problema (entrada) en los datos de una solución (salida). Mas aún, los datos se pueden
representar a su vez como secuencias de bits, y en general, de símbolos cualesquiera.1911
Como cada secuencia de bits representa a un número natural(véase Sistema binario),
entonces los algoritmos son en esencia funciones de los números naturales en los números
naturales que sí se pueden calcular. Es decir que todo algoritmo calcula una función
donde cada número natural es la codificación de un problema o de una solución.
En ocasiones los algoritmos son susceptibles de nunca terminar, por ejemplo, cuando entran a
un bucle infinito. Cuando esto ocurre, el algoritmo nunca devuelve ningún valor de salida, y
podemos decir que la función queda indefinida para ese valor de entrada. Por esta razón se
considera que los algoritmos son funciones parciales, es decir, no necesariamente definidas
en todo su dominio de definición.
Cuando una función puede ser calculada por medios algorítmicos, sin importar la cantidad de
memoria que ocupe o el tiempo que se tarde, se dice que dicha función es computable. No
todas las funciones entre secuencias datos son computables. El problema de la parada es un
ejemplo.
Análisis de algoritmos[editar]
Artículo principal: Análisis de algoritmos
Ejemplo de algoritmo[editar]
El problema consiste en encontrar el máximo de un conjunto de números. Para un ejemplo
más complejo véase Algoritmo de Euclides.
Descripción de alto nivel[editar]
función max( )
← // es el número de elementos de //
si entonces
devolver
Sobre la notación:
de ;
"devolver" termina el algoritmo y devuelve el valor a su derecha (en este caso, el máximo
de ).
Implementación[editar]
En lenguaje C++:
Un algoritmo es una secuencia de pasos lógicos necesarios para llevar a cabo una tarea especifica, como la
solución de un problema. Los algoritmos son independientes tanto del lenguaje de programación en que se
expresan como de la computadora que los ejecuta. En cada problema el algoritmo se puede expresar en un
lenguaje diferente de programación y ejecutarse en una computadora distinta; sin embargo el algoritmo será
siempre el mismo.
Por ejemplo en una analogía con la vida diaria, una receta de un plato de cocina se puede expresar en
español, ingles o francés, pero cualquiera que sea el lenguaje, los pasos para la elaboración del plato se
Para llegar a la realización de un programa es necesario el diseño previo de un algoritmo, de modo que sin
Un algoritmo debe estar definido. Si se sigue un algoritmo dos veces, se debe obtener el mismo resultado
cada vez.
Un algoritmo debe ser finito. Si se sigue un algoritmo, se debe terminar en algún momento; o sea debe de
Los pasos de un algoritmo deben ser simples y exentos de ambigüedades (diferentes significados), deben
seguir un orden cuidadosamente prescrito, deben ser efectivos y deben de resolver el problema en un
Pero, si tuviera que entrenar un robot domestico para que efectúe esta tarea, tendrá que ser mas especifico
y claro en los pasos a seguir, dar mas detalles (suponga que el foco se encuentra en el techo de una
habitación):
Girar el foco contra las manecillas del reloj hasta que esté suelto.
Enroscar en el sentido de las manecillas del reloj hasta que quede apretado.
Bajar de la escalera.
Al igual que los idiomas sirven de vehículo de comunicación entre seres humanos, existen lenguajes que
realizan la comunicación entre ellos y las computadoras. Estos lenguajes permiten expresar las instrucciones
Lenguaje maquina
Lenguajes máquina
Se llama lenguaje máquina a las instrucciones que se dan directamente a la computadora, utilizando una
serie de dígitos binarios o bits, representados por los números 0 y 1 que especifican una operación. Aunque
este lenguaje es el que entiende la computadora, es muy difícil de manejar en la comunicación humana. Las
instrucciones en lenguaje maquina dependen del hardware de la computadora y, por lo tanto, diferirán de
Los lenguajes de bajo nivel son más fáciles de utilizar que los lenguajes máquina, pero, al igual que ellos,
dependen de la máquina en particular. El lenguaje de bajo nivel por excelencia es el ensamblador (assembler
ADD M, N, P
Esta instrucción podría significar "sumar el número contenido en la posición de memoria M al número
es mucho más sencillo recordar la instrucción anterior con un mnemotécnico que su equivalente en código
máquina.
Un programa escrito en lenguaje ensamblador no puede ser ejecutado directamente por la computadora (en
esto se diferencia esencialmente del lenguaje máquina) sino que requiere una fase de traducción al lenguaje
máquina.
El programa original escrito en lenguaje ensamblador se denomina programa fuente y el programa traducido
en lenguaje maquina se conoce como programa objeto, ya directamente entendible por la computadora.
NOTA: No se debe confundir el programa ensamblador, encargado de efectuar la traducción del programa
fuente escrito a lenguaje maquina, con el lenguaje ensamblador (assembly language), lenguaje de
Los lenguajes ensambladores presentan la ventaja frente a los lenguajes maquina de su mayor facilidad de
Dependencia total de la maquina lo que impide la transportabilidad de los programas (posibilidad de ejecutar
nivel, ya que exige no sólo las técnicas de programación, sino también el conocimiento del interior de la
máquina.
Hoy día los lenguajes ensambladores tienen sus aplicaciones muy reducidas en la programación de
etc.
Los lenguajes de alto nivel son los mas utilizados por los programadores. Están diseñados para que las
personas escriban y entiendan los programas de un modo mucho más fácil que los lenguajes máquina y
ensambladores. Otra razón es que un programa escrito en un lenguaje de alto nivel es independiente de la
máquina; esto es, las instrucciones del programa de la computadora no dependen del diseño del hardware o
de una computadora en particular. En consecuencia, los programas escritos en lenguajes de alto nivel son
portables o transportables, lo que significa la posibilidad de poder ser ejecutados con poca o ninguna
modificación en diferentes tipos de computadoras; al contrario que los programas en lenguaje máquina o
El tiempo de formación de los programadores es relativamente corto comparado con otros lenguajes.
La escritura de programas se basa en reglas sintácticas similares a los lenguajes humanos. Nombres de las
instrucciones tales como READ, WRITE, PRINT, OPEN, etc. Las modificaciones y puestas a punto de los
Transportabilidad.
Incremento del tiempo de puesta a punto al necesitarse diferentes traducciones del programa fuente para
No se aprovechan los recursos internos de la máquina que se explotan mucho mejor en lenguajes máquina y
ensambladores.
Al igual que pasa con los lenguajes ensambladores, los programas fuente tienen que ser traducidos por
práctica demuestra que su uso mayoritario se reduce a BASIC, COBOL, PASCAL, C, C++,... y en el campo de
Los traductores de lenguajes son programas que traducen a su vez los programas fuente escritos en
Compiladores
Interpretes
Interpretes
Un interprete es un traductor que toma un programa fuente, lo traduce y a continuación lo ejecuta (dicho
Un lenguaje que soporte un traductor de tipo intérprete se denomina lenguaje interpretado. BASIC es el
Los programas fuente en BASIC se escriben con ayuda de un programa denominado editor que suele venir
Compiladores
Un compilador es un programa que traduce los programas fuente escritos en lenguajes de alto nivel a
lenguaje máquina.
Los programas escritos en lenguajes de alto nivel (en el editor del lenguaje) se llaman programas fuente y el
programa traducido programa objeto o código objeto. El compilador traduce (sentencia a sentencia) el
programa fuente.
Fases de la compilación
ensamblador. Para conseguir el programa máquina real se debe utilizar un programa llamado montador o
ejecutable:
Por ejemplo, el proceso de ejecución de un Programa en C++ tiene los siguientes pasos:
Escritura del programa fuente con un editor (programa que permite a una computadora actuar de modo
similar a una máquina de escribir electrónica) y guardarlo en un dispositivo de almacenamiento (un disco).
la ejecución de una determinada tarea. En esencia, un programa es un medio para conseguir un fin. El fin
El proceso de programación es, por consiguiente, un proceso de solución de problemas (como ya se vio
2. Diseño de algoritmos.
- diagrama de flujo;
- pseudocódigo.
5. Documentación.
6. Mantenimiento.