domingo, 30 de mayo de 2010

Compiladores y Funciones Unidad III

1.- ¿Cuales son las funciones de un compilador?

A grandes rasgos un compilador es un programa que lee un programa escrito es un lenguaje, el lenguaje fuente, y lo traduce a un programa equivalente en otro lenguaje, el lenguaje objeto. Como parte importante de este proceso de traducción, el compilador informa a su usuario de la presencia de errores en el programa fuente.
A primera vista, la diversidad de compiladores puede parecer abrumadora. Hay miles de lenguajes fuente, desde los lenguajes de programación tradicionales, como FORTRAN o Pascal, hasta los lenguajes especializados que han surgido virtualmente en todas las áreas de aplicación de la informática.




2.- ¿Cuáles son las fases de un compilador?

Fase de análisis: Análisis léxico, análisis sintáctico y el análisis semántico.
Fase de Síntesis: Generación de optimización de código intermedio y Generación de optimización de código objeto

3.- ¿En que consiste la fase de análisis?

Está fase se relaciona con el lenguaje fuente y consiste en ir leyendo las instrucciones que lo componen e ir almacenando el significado de las mismas. En esta fase se obtiene un código intermedio (información de instrucciones) y una tabla de símbolos (información de datos).
Además de que en esta fase el programa es descompuesto en sus elementos fundamentales. Abarca el análisis léxico, el análisis sintáctico y el análisis semántico.
Esta fase verifica si el programa en lenguaje fuente es correcto, y recoge la información necesaria en la tabla de símbolos para el módulo de síntesis.

4.- ¿Cuál es el análisis léxico grafico?

Es el que se encarga de verificar si todas las cadenas pertenecen o no al lenguaje. Es decir realiza un análisis símbolo por símbolo indicando el token por cada uno de los elementos reconocidos o el error en caso de no reconocer. Este análisis no logra detectar muchos errores por su característica.

5.- ¿Cual es el análisis sintáctico?

Es el que impone una estructura jerárquica a la cadena de componentes léxicos, generada por el analizador léxico, que es representada en forma de un árbol sintáctico.

6.- ¿En que consiste el análisis semántico?

Es posterior al sintáctico y mucho más difícil de formalizar que éste. Se trata de determinar el tipo de los resultados intermedios, comprobar que los argumentos que tiene un operador pertenecen al conjunto de los operadores posibles, y si son compatibles entre sí, etc. En definitiva, comprobará que el significado de lo que se va leyendo es válido.
La salida “teórica” de la fase de análisis semántico sería un árbol semántico. Consiste en un árbol sintáctico en el que cada una de sus ramas ha adquirido el significado que debe tener. En el caso de los operadores polimórficos (un único símbolo con varios significados), el análisis semántico determina cuál es el aplicable.



7.- ¿En que consiste la fase de síntesis?

Etapa de generación de código intermedio, aunque algunos compiladores no la tienen, es bueno saber de su existencia, en esta etapa se lleva el código del programa fuente a un código interno para poder trabajar mas fácilmente sobre él. Esta representación interna debe tener dos propiedades, primero debe ser fácil de representar y segundo debe ser fácil de traducir al código objeto.
En la etapa de optimización de código, se busca obtener el código más corto y rápido posible, utilizando distintos algoritmos de optimización.
Etapa de generación de código, se lleva el código intermedio final a código maquina o código objeto, que por lo general consiste en un código maquina relocalizable o código ensamblador. Se selecciona las posiciones de memoria para los datos (variables) y se traduce cada una de las instrucciones intermedias a una secuencia de instrucciones de maquina puro.




8.- ¿Qué es la Generación de código intermedio?

El código intermedio es un código abstracto independiente de la máquina para la que se generará el código objeto. El código intermedio ha de cumplir dos requisitos importantes: ser fácil de producir a partir del análisis sintáctico, y ser fácil de traducir al lenguaje objeto. Esta fase puede no existir si se genera directamente código máquina, pero suele ser conveniente emplearla.
Ejemplo: Consideremos, por ejemplo, un código intermedio de tercetos, llamado así porque en cada una de sus instrucciones aparecen como máximo tres operandos.

9.- ¿Que es la Generación y optimización de código objeto?

A partir de los análisis anteriores y de las tablas que estos análisis van creando durante su ejecución produce un código o lenguaje objeto que es directamente ejecutable por la máquina. Es la fase final del compilador. Las instrucciones del código intermedio se traducen una a una en código máquina reubicable.
Cada instrucción de código intermedio puede dar lugar a más de una de código máquina.
Ejemplo: El código anterior traducido a ensamblador DLX quedaría:
LW R1,id3MUL R1,R1,2LW R2,id2ADD R2,R2,R1SW id1,R2 en donde id1, id2 y id3 representan las posiciones de memoria en las que se hallan almacenadas estas variables; R1 y R2 son los registros de la máquina; y las instrucciones LW, SW, MUL y ADD representan las operaciones de colocar un valor de memoria en un registro, colocar un valor de un registro en memoria, multiplicar en punto flotante y sumar, respectivamente2.

10.- ¿Cuáles son las diferencias entre un intérprete y un compilador?

Interprete: Es un programa que lee línea a línea un programa escrito en un lenguaje; en lenguaje fuente y lo va traduciendo a un código intermedio, para ejecutarlo.
Compilador: Es un programa que lee totalmente un programa escrito en un lenguaje; el lenguaje fuente, y lo traduce a un programa equivalente a otro lenguaje, lenguaje objeto.
A grandes rasgos un compilador es un programa que lee un programa escrito es un lenguaje, el lenguaje fuente, y lo traduce a un programa equivalente en otro lenguaje, el lenguaje objeto. Como parte importante de este proceso de traducción, el compilador informa a su usuario de la presencia de errores en el programa fuente.
La principal ventaja del proceso de compilación frente al de interpretación es que los programas se ejecutan mucho más rápidamente una vez compilados; por el contrario, es más cómodo desarrollar un programa mediante un intérprete que mediante un compilador puesto que en el intérprete las fases de edición y ejecución están más integradas. La depuración de los programas suele ser más fácil en los intérpretes que en los compiladores puesto que el código fuente está presente durante la ejecución. Estas ventajas pueden incorporarse al compilador mediante la utilización de entornos de desarrollo y depuradores simbólicos en tiempo de ejecución.

martes, 18 de mayo de 2010

Unidad IV Ligadores

1.- ¿Que son los ligadores?

Es un programa que enlaza todos los programas o módulos obteniendo lo que denominamos programa ejecutable ala ves enlaza distintos módulos o programas que poseen subprogramas. Además de incorporar las denominadas rutinas de librerías en caso de solicitarlas el propio programa.

2.- ¿Cuales son las principales funciones de un ligador?

Enlazar código intermedio compilado independientemente en un solo módulo de carga resolviendo las diferencias entre Tokens.
Incorpora las denominadas rutinas de librerías en caso de solicitarlas el propio programa.

Su función es reducir procedimientos traducidos por separado y enlazarlos para que se ejecuten como una unidad llamada programa binario ejecutable.

3.- ¿Cuales son los tipos de ligadores?

Editores de ligado.- La diferencia fundamental entre un editor de ligado y un cargador ligador es: Primero se ensambla o compila el programa fuente, produciendo un programa objeto (que puede contener varias secciones de control diferentes).
Ligador dinámico.- El ligador dinámico ofrece algunas ventajas sobre los otros tipos de ligado. Proporciona la posibilidad de cargar las rutinas sólo cuando y si se necesitan. Si las subrutinas son grandes o tienen muchas referencias externas, se pueden conseguir ahorros considerables de tiempo y espacio de memoria.

4.- ¿Cuales son los ligadores estáticos?

Cuando se utilizan subrutinas en un programa, el código ejecutable de cada una de ellas debe encontrarse en memoria al tiempo de ejecución. Para esto, antes de cargar un programa, debe ligarse su código objeto con los códigos objeto (guardados en uno o más archivos) de cada una de las subrutinas invocadas por él, obteniendo así un programa ejecutable que contiene tanto el código del módulo invocador como el código de los módulos invocados.

5.- ¿Cuales son los ligadores dinámicos?

Ofrece ventajas que el estático no. Proporciona la posibilidad de cargar las rutinas sólo cuando y si se necesitan. SI las subrutinas son grandes o tienen muchas referencias externas, se pueden conseguir ahorros considerables de tiempo y espacio de memoria.
Supongamos que en cualquier ejecución un programa usa sólo pocas de una gran cantidad de subrutinas posibles, pero el número exacto de rutinas necesarias no puede predecirse hasta que el programa examina su entrada.

6.- ¿Que son los Ligadores de bibliotecas de códigos de objetos?

Se le denomina estático ya que se realiza antes de ejecutar el programa

Estático: Cuando se utilizan subrutinas en un programa, el código ejecutable de cada una de ellas debe encontrarse en memoria al tiempo de ejecución. Para esto, antes de cargar un programa, debe ligarse su código objeto con los códigos objeto (guardados en uno o más archivos) de cada una de las subrutinas invocadas por él, obteniendo así un programa ejecutable que contiene tanto el código del módulo invocador como el código de los módulos invocados.

Dinámico: Ofrece ventajas que el estático no. Proporciona la posibilidad de cargar las rutinas sólo cuando y si se necesitan. SI las subrutinas son grandes o tienen muchas referencias externas, se pueden conseguir ahorros considerables de tiempo y espacio de memoria.




7.- ¿Que es un cargador?

Programa que coloca en la memoria para su ejecución, el programa guardado en algún dispositivo de almacenamiento secundario, consiste en un juego de instrucciones que permiten al dispositivo de entrada (teclado ó unidad de cinta) asignar la dirección de inicio de la memoria y asegurar que el computador leerá el programa y lo cargara byte a byte.

Programa del sistema que realiza la función de carga pero muchos cargadores también incluyen relocalización y ligado. Algunos sistemas tienen un ligador (ó editor de ligado) para realizar las operaciones de enlace.

8.- ¿Cuales son las funciones de un cargador?


Coloca un programa objeto en la memoria e iniciar su ejecución.
Lleva la carga al programa objeto a la memoria para su ejecución.
Modifica el programa objeto de forma que puede cargarse en una dirección diferente de la localidad especificada originalmente.
Combina dos o mas programas objeto independientes y proporciona la información necesaria para realizar diferencias entre ellos.

9.- ¿Tipos de cargadores?

Cargadores Bootstrap: situado en la memoria del computador, cargará el programa de aplicación y los datos. Pero, previamente, se ha debido cargar el cargador en la memoria.
Cargadores iniciales: indican a la computadora la forma de poner, dentro de la memoria principal unos datos que están guardados en un periférico de memoria externa (cinta, disco, etc.). Sirven para cargar en la memoria pequeños programas que inician el funcionamiento de una computadora.
Cargadores absolutos: el programa cargador pone en memoria las instrucciones guardadas en sistemas externos. Independientemente de que sea un cargador inicial, o no sin dichas instrucciones se almacenan siempre en el mismo espacio de memoria (cada vez que se ejecuta el programa cargador) se dice que es un cargador absoluto.
Cargadores con reubicación: en ocasiones un mismo programa necesita ejecutarse en diferentes posiciones de memoria. Para esto la traducción debe estar realizada en forma adecuada, es decir no utilizando referencias absolutas a direcciones en memoria, sino referencias a una dirección especial llamada de reubicación.
Cargadores ligadores: conocidos también como linker. Un linker se un término en inglés que significa montar.
Montar un programa consiste en añadir al programa objeto obtenido a la traducción las rutinas externas a las que hace referencia dicho programa.

10.- ¿Cuales son los cargadores de carga absoluta y relocalizable?

Carga absoluta: consiste en que con la máquina vacía ó inactiva no hay necesidad de hacer relocalización de programas tan solo se puede especificar la dirección absoluta del programa que se cargue en primer lugar.
En la mayoría de los casos este programa es el sistema operativo que ocupa un lugar predefinido en la memoria. Dicho de otra manera es que se necesitan algunos medios para realizar las funciones del cargador absoluto. Una opción es que el operador introduzca en la memoria el código objeto de un cargador absoluto, utilizando los interruptores en la consola del computador.

Nota: Algunos computadores requerían que el operador hiciera exactamente eso. Sin embargo este proceso es demasiado incomodo y propenso a errores para ser una buena solución del problema.
Relocalizable: Los cargadores que permiten la relocalización de programas se denominan cargadores relocalizadores o relativos.
Nota: Algunos computadores proporcionan una posibilidad de relocalización por hardware que elimina en parte la necesidad de que el cargador efectúe la relocalización de programas.

11.- ¿Cuales son los cargadores estáticos y dinámicos?

Estáticos: estos son utilizados para cargar de manera estática o sin tener algún movimiento cuando se realiza el proceso de la información del ejecutable.
La estructura se coloca estática en memoria. Solo que aquí no se puede intercambiar cada unos de los módulos en memoria conforme se requieran
Dinámicos: El cargador dinámico se utiliza para cargar dinámicamente bibliotecas compartidas durante el inicio ejecutable.
Es útil cuando no es posible asignar en memoria un programa completo, dicho cargador se basa en el binder para operar de esta forma.
La estructura se coloca dinámicamente en memoria. De esta forma cada módulo se va intercalando en memoria conforme se requiere.


12.- ¿Que entiendes por paso de control al sistema operativo?

Es como un proceso el cual genera de manera estable todo el funcionamiento del sistema operativo en la computadora para que con este el trabajo que realice el usuario sea más rápido y el cual puede cargar y ejecutar los programas que requiera de acuerdo a sus necesidades.

martes, 20 de abril de 2010

Instrucciones de Lenguaje Ensamblador

1.- ¿instrucciones aritméticas?

Se usan para realizar operaciones aritméticas sobre los operandos.

Instrucción ADC
Propósito: Adición con acarreo.
Sintaxis: ADC destino, fuente
Lleva a cabo la suma de dos operandos y suma uno al resultado en caso de que la bandera CF esté activada, esto es, en caso de que exista acarreo.
El resultado se guarda en el operando destino.

Instrucción ADD
Propósito: Adición de los operandos.
Sintaxis: ADD destino, fuente
Suma los dos operandos y guarda el resultado en el operando destino.

Instrucción DIV
Propósito: División sin signo
Sintaxis: DIV fuente
El divisor puede ser un byte o palabra y es el operando que se le da a la instrucción.
Si el divisor es de 8 bits se toma como dividendo el registro de 16 bits AX y si el divisor es de 16 bits se tomara como dividendo el registro par DX:AX, tomando como palabra alta DX y como baja AX.
Si el divisor fue un byte el cociente se almacena en el registro AL y el residuo en AH, si fue una palabra el cociente se guarda en AX y el residuo en DX.

Instrucción IDIV
Propósito: División con signo
Sintaxis: IDIV fuente
Consiste básicamente en lo mismo que la instrucción DIV, solo que esta última realiza la operación con signo.
Para sus resultados utiliza los mismos registros que la instrucción DIV.

Instrucción MUL
Propósito: Multiplicación sin signo
Sintaxis: MUL fuente
El ensamblador asume que el multiplicando será del mismo tamaño que el del multiplicador, por lo tanto multiplica el valor almacenado en el registro que se le da como operando por el que se encuentre contenido en AH si el multiplicador es de 8 bits o por AX si el multiplicador es de 16 bits.
Cuando se realiza una multiplicación con valores de 8 bits el resultado se almacena en el registro AX y cuando la multiplicación es con valores de 16 bits el resultado se almacena en el registro par DX:AX.

Instrucción IMUL
Propósito: Multiplicación de dos enteros con signo.
Sintaxis: IMUL fuente
Este comando hace lo mismo que el anterior, solo que si toma en cuenta los signos de las cantidades que se multiplican.
Los resultados se guardan en los mismos registros que en la instrucción MUL.

Instrucción SBB
Propósito: Substracción con acarreo
Sintaxis: SBB destino, fuente
Esta instrucción resta los operandos y resta uno al resultado si CF está activado. El operando fuente siempre se resta del destino.
Este tipo de substracción se utiliza cuando se trabaja con cantidades de 32 bits.

Instrucción SUB
BPropósito: Substracción
Sintaxis: SUB destino, fuente
Resta el operando fuente del destino.


2.- ¿Instrucciones de comparación?

Son usadas para comparar operandos, afectan al contenido de las banderas.
CMP y CMPS (CMPSB) (CMPSW)

Instrucción CMP
Propósito: Comparar los operandos.
Sintaxis:
CMP destino, fuente
Esta instrucción resta el operando fuente al operando destino pero sin que éste almacene el resultado de la operación, solo se afecta el estado de las banderas.

Instrucción CMPS (CMPSB) (CMPSW)
Propósito: Comparar cadenas de un byte o palabra.
Sintaxis:
CMP destino, fuente
Con esta instrucción la cadena de caracteres fuente se resta de la cadena destino.
Se utilizan DI como índice para el segmento extra de la cadena fuente y SI como índice de la cadena destino.
Solo se afecta el contenido de las banderas y tanto DI como SI se incrementan.


3.- ¿Instrucciones de salto?

Son Utilizadas para transferir el flujo del proceso al operando indicado.

Instrucción JMP
Propósito: Salto incondicional
Sintaxis: JMP destino
Esta instrucción se utiliza para desviar el flujo de un programa sin tomar en cuenta las condiciones actuales de las banderas ni de los datos.

Instrucción JA (JNBE)
Propósito: Brinco condicional
Sintaxis: JA Etiqueta
Después de una comparación este comando salta si está arriba o salta si no está abajo o si no es igual.
Esto significa que el salto se realiza solo si la bandera CF esta desactivada o si la bandera ZF esta desactivada (que alguna de las dos sea igual a cero).

Instrucción JAE (JNB)
Propósito: salto condicional
Sintaxis: JAE etiqueta
Salta si está arriba o si es igual o salta si no está abajo.
El salto se efectua si CF esta desactivada.

Instrucción JB (JNAE)
Propósito: salto condicional
Sintaxis: JB etiqueta
Salta si está abajo o salta si no está arriba o si no es igual.
Se efectúa el salto si CF esta activada.

Instrucción JBE (JNA)
Propósito: salto condicional
Sintaxis: JBE etiqueta
Salta si está abajo o si es igual o salta si no está arriba.
El salto se efectúa si CF está activado o si ZF está activado (que cualquiera sea igual a 1).

Instrucción JE (JZ)
Propósito: salto condicional
Sintaxis: JE etiqueta
Salta si es igual o salta si es cero.
El salto se realiza si ZF está activada.

Instrucción JNE (JNZ)
Propósito: salto condicional
Sintaxis: JNE etiqueta
Salta si no es igual o salta si no es cero.
El salto se efectúa si ZF está desactivada.

Instrucción JG (JNLE)
Propósito: salto condicional, se toma en cuenta el signo.
Sintaxis: JG etiqueta
Salta si es más grande o salta si no es menor o igual.
El salto ocurre si ZF = 0 u OF = SF.

Instrucción JGE (JNL)
Propósito: salto condicional, se toma en cuenta el signo.
Sintaxis: JGE etiqueta
Salta si es más grande o igual o salta si no es menor que.
El salto se realiza si SF = OF

Instrucción JL (JNGE)
Propósito: salto condicional, se toma en cuenta el signo.
Sintaxis: JL etiqueta
Salta si es menor que o salta si no es mayor o igual.
El salto se efectúa si SF es diferente a OF.

Instrucción JLE (JNG)
Propósito: salto condicional, se toma en cuenta el signo.
Sintaxis: JLE etiqueta
Salta si es menor o igual o salta si no es más grande.
El salto se realiza si ZF = 1 o si SF es diferente a OF

Instrucción JC
Propósito: salto condicional, se toman en cuenta las banderas.
Sintaxis: JC etiqueta
Salta si hay acarreo.
El salto se realiza si CF = 1

Instrucción JNC
Propósito: salto condicional, se toma en cuenta el estado de las banderas.
Sintaxis: JNC etiqueta
Salta si no hay acarreo.
El salto se efectúa si CF = 0.

Instrucción JNO
Propósito: salto condicional, se toma en cuenta el estado de las banderas.
Sintaxis: JNO etiqueta
Salta si no hay desbordamiento.
El salto se efectúa si OF = 0.

Instrucción JNP (JPO)
Propósito: salto condicional, toma en cuenta el estado de las banderas.
Sintaxis: JNP etiqueta
Salta si no hay paridad o salta si la paridad es non.
El salto ocurre si PF = 0.

Instrucción JNS
Propósito: salto condicional, toma en cuenta el estado de las banderas.
Sintaxis:
JNP etiqueta
Salta si el signo esta desactivado.
El salto se efectúa si SF = 0.

Instrucción JO
Propósito: salto condicional, toma en cuenta el estado de las banderas.
Sintaxis: JO etiqueta
Salta si hay desbordamiento (overflow).
El salto se realiza si OF = 1.

Instrucción JP (JPE)
Propósito: salto condicional, toma en cuenta el estado de las banderas.
Sintaxis: JP etiqueta
Salta si hay paridad o salta si la paridad es par.
El salto se efectúa si PF = 1.

Instrucción JS
Propósito: salto condicional, toma en cuenta el estado de las banderas.
Sintaxis: JS etiqueta
Salta si el signo está prendido.
El salto se efectúa si SF = 1.




4.- ¿Instrucciones para el stack?

“Stack” significa pila en inglés, pila en el sentido de “apilar cosas”, no de batería eléctrica. Es una zona de la memoria en donde se guardan cosas. Por ejemplo las variables locales de las subrutinas y funciones, los parámetros, algunos resultados intermedios de cálculos complejos, etc.
Todo el manejo del stack lo realiza el compilador de forma automática, así que no hace falta preocuparse salvo cuando se acaba el lugar y el programa genera un error (“stack overflow”). Lo más importante de esta estructura es que en cada momento sólo se tiene acceso a la parte superior del stack (no a las cosas que están apiladas debajo). Entonces cada subrutina puede guardar sus datos en el stack, y las subrutinas a las que llame no los afectarán.
La pila es una zona de la memoria sobre la que se pueden escribir y leer datos de forma convencional. Esta zona tiene una posición especial que se denomina “la cima de la pila”. El procesador contiene dos instrucciones de su lenguaje máquina para realizar las operaciones de “apilar” y “des apilar” datos de la pila. Los datos que se pueden apilar y des apilar, en el caso del Intel Pentium son siempre de tamaño 4 bytes.


5.- ¿Qué son los Macros y para que sirven?

Un macro ensamblador es un ensamblador modular, descendiente de los ensambladores básicos. Fueron muy populares en los años 1950 y años 1960, antes de la generalización de los lenguajes de alto nivel. Hacen todo lo que puede hacer un ensamblador, y además proporcionan una serie de Directivas para definir y ejecutar macro instrucciones (o simplemente, Macros). Cuando ejecutamos a una “macro”, ésta se expande al cuerpo que hayamos definido.

Macro, del griego μακρο significa “grande”. En el ámbito informático es la abreviatura del término “macroinstrucción”.
Una macro o macroinstrucción es una serie de instrucciones que se almacenan para que se puedan ejecutar de forma secuencial mediante una sola llamada u orden de ejecución.

Características
Una macroinstrucción es por tanto una instrucción compleja, formada por otras instrucciones más sencillas.
Además tiene que estar almacenada, el término no se aplica a una serie de instrucciones escritas en la línea de comandos enlazadas unas con otras por redirección de sus resultados (piping) o para su ejecución consecutiva.
Las macros suelen almacenarse en el ámbito del propio programa que las utiliza y se ejecutan pulsando una combinación especial de teclas.
La diferencia entre una macroinstrucción y un programa es que en las macroinstrucciones la ejecución es secuencial y no existe otro concepto del flujo de programa que por tanto, no puede bifurcarse.

Macros aplicaciones
Las macros son grupos de instrucciones que tienen un seguimiento cronológico usadas para economizar tareas; una macro no es más que un conjunto de instrucciones tales como “borrar archivo”, “añadir registro”, etc., y que se almacenan en una ubicación especial.

Macros en programación
Con el fin de evitar al programador la tediosa repetición de partes idénticas de un programa, los ensambladores y compiladores cuentan con macroprocesadores que permiten definir una abreviatura para representar una parte de un programa y utilizar esa abreviatura cuantas veces sea necesario. Para utilizar una macro, primero hay que declararla. En la declaración se establece el nombre que se le dará a la macro y el conjunto de instrucciones que representará.


6.- ¿Que son las interrupciones y en que nos afectan?

Son un “mecanismo” por medio del cual hacemos que la CPU deje la tarea en la que estaba para que se vaya a ocupar de otra cosa distinta, es decir, es una forma de llamar la atención de la CPU de tal forma que cada dispositivo cuando necesita ser atendido por la CPU, emite una interrupción o señal haciendo que la CPU vaya a atenderla de inmediato. Esto es importantísimo ya que de no existir interrupciones, la CPU debería de ir preguntando, cada cierto tiempo, a los dispositivos para ver si necesitan de su intervención y como se puede suponer, eso significaría lentitud, mucha lentitud. Por tanto, quedaros con que las interrupciones sirven para controlar el hardware, ya que son las que llaman a la CPU cuando este, el hardware, necesita la intervención de la misma.
Se dividen en dos grupos

Interrupciones de Software

También son conocidas como “falsas interrupciones” ya que se producen como consecuencia de la ejecución de otra instrucción al no ser el hardware las que las produce. Otra forma de entender estas interrupciones, es verlas desde el punto de vista de llamadas a subrutinas, lógicamente, la gracia está en que esas subrutinas no son nuestras, sino que son las propias de cada sistema operativo, driver o similar tiene. Quedaros pues, con que somos nosotros los que hacemos invocamos a la interrupción. Este tipo de interrupción es el más habitual en la programación.

Interrupciones de Hardware

Este tipo de interrupción es invocado directamente por los dispositivos hardware de nuestro ordenador, por lo que “son bastante más auténticas” que las anteriores. Al producir algún dispositivo hardware la interrupción el controlador de interrupciones o PIC se encarga de gestionarla determinando, en el caso de producirse más de una interrupción a la vez, cual de ellas tiene más prioridad y debe de ser gestionada por la CPU. El funcionamiento de este tipo de interrupciones es bastante similar y se suele utilizar mucho para la programación de sistemas de comunicaciones.

martes, 23 de marzo de 2010

Lenguaje Ensamblador
1.-¿Que es lenguaje ensambledor?

Es un tipo de lenguaje de bajo nivel utilizado para escribir programas informáticos, y constituye la representación más directa del código máquina específico para cada arquitectura de computadoras legible por un programador.
Fue usado principalmente en los inicios del desarrollo de software, cuando aun no se contaba con los potentes lenguajes de alto nivel. Actualmente se utiliza con frecuencia en ambientes académicos y de investigación, especialmente cuando se requiere la manipulación directa de hardware, se pretenden altos rendimientos o un uso de recursos controlado y reducido.

2.-¿para que te sirve el lenguaje ensamblador?

Es un tipo de lenguaje de bajo nivel utilizado para escribir programas informáticos, y constituye la representación más directa del código máquina específico para cada arquitectura de computadoras legible por un programador.
Fue usado principalmente en los inicios del desarrollo de software, cuando aun no se contaba con los potentes lenguajes de alto nivel. Actualmente se utiliza con frecuencia en ambientes académicos y de investigación, especialmente cuando se requiere la manipulación directa de hardware, se pretenden altos rendimientos o un uso de recursos controlado y reducido.
La entrada para un ensamblador es un programa fuente escrito en lenguaje ensamblador. La salida es un programa objeto, escrito en lenguaje de máquina. El programa objeto incluye también la información necesaria para que el cargador pueda preparar el programa objeto para su ejecución.
Motivos para utilizarlo.
Rapidez: Como el programador directamente selecciona las instrucciones que se ejecutan en el programa, el programa final queda mas optimizado que un programa generado por un compilador.
Mayor control de la computadora: Un programa puede acceder directamente cualquier componente y periférico de la computadora.
Independencia del lenguaje: No depende de librerías o del lenguaje mismo para realizar una tarea específica. Lenguajes como el Basic limitan al programador a lo que el lenguaje puede hacer.
La mayoría de las computadoras pueden ensamblar: Los recursos necesarios para ensamblar un programa son mucho menores que los compiladores o intérpretes. El ensamblador generalmente es más rápido ensamblando un programa que un compilador generando un archivo ejecutable.

3.-¿Menciona almenos dos ejemplos de donde se puede aplicar el lenguaje ensamblador?

Ejemplo: El siguiente es un ejemplo del programa clásico Hola mundo escrito para la arquitectura de procesador x86 (bajo el sistema operativo DOS).

 .model small
 .stack .data
 Cadena1 DB 'Hola Mundo.$'
 .code
 programa:
    mov ax, @data
    mov ds, ax
    mov dx, offset Cadena1
    mov ah, 9
    int 21h
 end programa

Ejemplo: Código en lenguaje ensamblador para µC Intel 80C51:

 ORG 8030H
 T05SEG:                     
  SETB TR0
  JNB uSEG,T05SEG       ;esta subrutina es utilizada     
  CLR TR0               ;para realizar una cuenta de 
  CPL uSEG              ;0,5 segundos mediante la     
  MOV R1,DPL            ;interrupción del timer 0.     
  MOV R2,DPH                 
  CJNE R2,#07H,T05SEG        
  CJNE R1,#78H,T05SEG        
  MOV DPTR,#0000H
  RET

4.-¿Como se realisa el manejo de memoria?


La unidad de manejo de memoria (Lat.) o unidad de gestión de memoria (Esp.) (en inglés: Memory Management Unit o simplemente MMU) es un dispositivo de Hardware formado por un grupo de circuitos integrados, responsable del manejo de los accesos a la memoria por parte de la Unidad de Procesamiento Central (CPU).

Entre las funciones de este dispositivo se encuentran la traducción de las direcciones lógicas (o virtuales) a direcciones físicas (o reales), la protección de la memoria, el control de caché y, en arquitecturas de computadoras más simples (especialmente en sistemas de 8 bits), Bank switching.

Cuando la CPU intenta acceder a una dirección de memoria lógica, la MMU realiza una búsqueda en una memoria caché especial llamada Buffer de Traducción Adelantada (TLB, Translation Lookaside Buffer), que mantiene la parte de la tabla de páginas usada hace menos tiempo. En esta memoria se mantienen entradas de la tabla de páginas (llamadas PTE por sus siglas en inglés, Page Table Entry), donde se pueden rescatar las direcciones físicas correspondientes a algunas direcciones lógicas, de forma directa. Cuando la dirección requerida por la CPU se encuentra en el TLB, su traducción a dirección real o física es entregada, en lo que se conoce como 'acierto en el TLB' ('TLB hit'). En otro caso, cuando la dirección buscada no se encuentra en el TLB (fallo en el TLB), el procesador busca en la tabla de páginas del proceso utilizando el número de página como entrada a la misma.

5.-¿Que es el direccionamiento en lenguaje ensamblador?

En informática, una direccionamiento es un identificador para una localización de memoria con la cual un programa informático o un dispositivo de hardware pueden almacenar un dato para su posterior reutilización.

Una forma común de describir la memoria principal de un ordenador es como una colección de celdas que almacenan datos e instrucciones. Cada celda está identificada unívocamente por un número o dirección de memoria. La información que se almacena en cada celda es un byte (conjunto de ocho bits), que es la unidad mínima de almacenamiento de datos e instrucciones, ya que un bit solo puede contener el valor cero o uno y eso no es suficiente para guardar datos o instrucciones, por lo que se debe almacenar en bytes.

Para poder acceder a una ubicación específica de la memoria, la CPU genera señales en el bus de dirección, que habitualmente tiene un tamaño de 32 bits en la mayoría de máquinas actuales. Un bus de dirección de 32 bits permite especificar a la CPU 232 = 4.294.967.296 direcciones de memoria distintas.

Aplicación informática


En aplicaciones informáticas las direcciones son asignadas por el sistema operativo a cada programa en ejecución, asegurándose éste, comúnmente por medio de un daemon, que las direcciones utilizadas por un ejecutable u otro proceso no se solapen o se escriba en posiciones protegidas de memoria, por ejemplo, en el sector de arranque.

Los sistemas operativos actuales son comúnmente diferenciados según el ancho de palabra soportado por sus registros, es decir 32 y 64 bits.

6.-¿Cuales son los tipos de direccionamiento?

Directo: El campo de operando en la instrucción contiene la dirección en memoria donde se encuentra el operando.

En este modo la dirección efectiva es igual a la parte de dirección de la instrucción. El operando reside en la memoria y su dirección es dada directamente por el campo de dirección de la instrucción. En una instrucción de tipo ramificación el campo de dirección especifica la dirección de la rama actual.

Con este tipo de direccionamiento, la dirección efectiva es contenida en la misma instrucción, tal como los valores de datos inmediatos que son contenidos en la instrucción. Un procesador de 16 bits suma la dirección efectiva al contenido del segmento de datos previamente desplazado en 4 bits para producir la dirección física del operando.

Indirecto: El campo de operando contiene una dirección de memoria, en la que se encuentra la dirección efectiva del operando.

Direccionamiento relativo: Cuando para direccionar una posición de memoria se hace referencia a otra sobre la cual se especifica un incremento o decremento, es decir, se requiere otro dato para el cálculo de la dirección efectiva.


Generalmente se usan los direccionamientos relativos ya que, al ejecutar un cierto programa se cumple la proximidad espacial y temporal, lo que implica que datos que ya han sido usados o que se encuentran en posiciones cercanas al PC tendrán una alta probabilidad de ser referenciados próximamente.

Inmediato: En la instrucción está incluido directamente el operando.

En este modo el operando es especificado en la instrucción misma. En otras palabras, una instrucción de modo inmediato tiene un campo de operando en vez de un campo de dirección. El campo del operando contiene el operando actual que se debe utilizar en conjunto con la operación especificada en la instrucción. Las instrucciones de modo inmediato son útiles para inicializar los registros en un valor constante.

Cuando el campo de dirección especifica un registro del procesador, la instrucción se dice que está en el modo de registro.

Indexado: En el direccionamiento indexado como en el relativo, la parte dirección de la instrucción contiene un número N que puede ser positivo o negativo. Sin embargo para utilizar el direccionamiento indexado, el computador debe estar equipado con un registro especial empleado para permitir direccionamiento indexado, y denominado naturalmente registro índice. La posición de memoria donde se localiza el operando se encuentra mediante la suma I + N.


Inherente: Ordinariamente una dirección que es parte de una instrucción se refiere a una posición de memoria. Cuando una instrucción indica una fuente o un destino de datos y no se direcciona específicamente, ya no se hace referencia a la posición de memoria, se dice que la instrucción tiene una dirección inherente.

7.-¿Que es el formato de un programa?

Un formato de archivo o programa informático (o formato de fichero informático) es una manera particular de codificar información para almacenarla en un archivo informático.

Dado que una unidad de disco, o de hecho cualquier memoria sólo puede almacenar bits, la computadora debe tener alguna manera de convertir la información a ceros y unos y viceversa. Hay diferentes tipos de formatos para diferentes tipos de información. Sin embargo, dentro de cada tipo de formato, por ejemplo documentos de un procesador de texto, habrá normalmente varios formatos diferentes, a veces en competencia.




domingo, 7 de marzo de 2010

Modelo DeVon Neumann Y Editores Unidad I

EL MODELO DE VON NEUMANN
La maquina de Von Neumann tenia 5 partes básicas: La memoria, la unidad Aritmética lógica, la unidad de control del programa y los equipos de entrada y salida. La memoria constaba de 4096 palabras, cada una con 40 bits (0 o 1). Cada palabra podía contener 2 instrucciones de 20 bits o un número entero de 39 bits y su signo. Las instrucciones tenían 8 bits dedicados a señalar el tiempo de la misma y 12 bits para especificar alguna de las 4096 palabras de la memoria.

Dentro de la unidad aritmética - lógica, el antecedente directo actual CPU (Unidad central de Proceso), había un registro interno especial de 40 bits llamado en acumulador. Una instrucción típica era sumar una palabra de la memoria al acumulador o almacenar éste en la memoria.

La máquina no manejaba la aritmética de punto flotante, porque Von Neumann pensaba que cualquier matemático competente debería ser capaz de llevar la cuenta del punto decimal (en este caso del punto binario), mentalmente.

Un elemento importante del hardware de la PC es la unidad del sistema, que contiene una tarjeta de sistema, fuente de poder y ranuras de expansión para tarjetas opcionales. Los elementos de la tarjeta de sistema son un microprocesador, memoria de solo lectura (ROM) y memoria de acceso aleatorio (RAM).

El cerebro de la PC y compatibles es un microprocesador basado en la familia 8086 de Intel, que realiza todo el procesamiento de datos e instrucciones. Los procesadores varían en velocidad y capacidad de memoria, registros y bus de datos. Un bus de datos transfiere datos entre el procesador, la memoria y los dispositivos externos.

Aunque existen muchos tipos de computadoras digitales según se tenga en cuenta su tamaño, velocidad de proceso, complejidad de diseño físico, etc., los principios fundamentales básicos de funcionamiento son esencialmente los mismos en todos ellos.

Se puede decir que una computadora está formada por tres partes fundamentales, aunque una de ellas es subdividida en dos partes no menos importantes. En la figura 1.2 se muestran dichas partes, llamadas genéricamente unidades funcionales debido a que, desde el punto de vista del funcionamiento, son independientes.

El nombre de cada parte nos indica la función que realiza. Así, la Unidad Central de Proceso (CPU) es la que coordina el funcionamiento conjunto de las demás unidades y realiza los cálculos necesarios; por eso la podemos subdividir en una Unidad de Control (UC) y en una unidad de cálculo o Unidad Aritmético-Lógica (UAL).
La unidad de Memoria Principal (MP) se encarga de almacenar las instrucciones que realizará la Unidad de Control al ejecutar un programa y los datos que serán procesados. La Unidad de Entradas y Salidas será la encargada de la comunicación con el exterior a través de los periféricos. Estos periféricos pueden ser: de entrada, como los teclados; de salida, como los tubos de rayos catódicos, y de entrada y salida, como los discos magnéticos.

Unidad de Memoria Principal

La memoria principal esta formada por un conjunto de unidades llamadas palabras. Dentro de cada una de estas palabras se guarda la información que constituye una instrucción o parte de ella (puede darse el caso de que una sola instrucción necesite varia palabras), o un dato o parte de un dato (también un dato puede ocupar varias palabras).

A la cantidad de palabras que forman la MP se le denomina capacidad de memoria. De este modo, cuanto mayor sea el número de palabras mayor será el número de instrucciones y datos que podrá almacenar la computadora.
Una palabra esta formada a su vez de unidades mas elementales llamadas bits, del mismo modo que en el lenguaje natural una palabra esta formada por letras. Cada bit solo puede guardar dos valores, el valor 0 o el valor 1; por eso se dice que son elementos binarios.

El número de bits que forman una palabra se llama longitud de palabra. Por regla general, las computadoras potentes tienen memorias con longitud de palabra grande, mientras que las computadoras pequeñas tienen memorias con longitud de palabra menor.

Organización de una unidad de memoria

Ya se ha visto en las secciones precedentes como funcionan la CPU y la MP, pero puede decirse que es necesaria la comunicación entre el interior de la computadora y su entorno o periferia. Esta comunicación se consigue a través de dispositivos de muy diversos tipos, como son: teclados, impresoras, pantallas, discos magnéticos, etc. Es estos dispositivos se les conoce con el nombre genérico de periféricos.

En la siguiente figura se muestran algunos periféricos conectados a la Unidad de E/S, la cual hace de intermediaria entre los periféricos y la CPU. Las flechas indican el sentido en que fluye la información. , la cual hace de intermediaria entre los periféricos y la CPU. Las flechas indican el sentido en que fluye la información.


La unidad de entrada y salida hace de intermediaria entre la UCP y los periféricos

La coordinación de la comunicación entre los periféricos y la CPU la realiza la Unidad de E/S. Obsérvese que esta no es un periférico sino un dispositivo que gestiona a los periféricos siguiendo las ordenes de la CPU; es decir, la Unidad de E/S recibe de la Unidad de Control información sobre el tipo de transferencia de datos que debe realizar (si es de entrada o de salida) y periférico que debe de utilizar; si es de salida recibirá también el dato que debe enviar y el momento de la operación.

Entonces, la Unidad de E/S seleccionara el periférico y ejecutara la operación teniendo en cuanta las características propias de cada periférico. Una vez ejecutada la orden avisara a la UC de la terminación de la transferencia.

Cada periférico o parte de un periférico tendrá asignado un numero o dirección que servirá para identificarlo. Cuando la UC quiera seleccionarlo enviara dicho número a la Unidad de E/S.

Partes de una PC


Las PC forman parte de una de las muchas categorías de computadoras que hay, en nuestra actualidad este tipo de computadora es la que mejor tendremos acceso. Las principales partes de un PC son:

Monitor: Los monitores los podemos clasificar por tamaño o por tipo de monitor. Si es por tamaño dependerá de el largo de la diagonal de la pantalla, es decir 14, 15, 17, 19, 21 pulgadas, etc. Hay que tomar en cuenta que esta distancia no es real, es la diagonal del tubo pero por los plásticos que lo cubren se reduce hasta 1 pulgada o un poco mas, por eso es que vemos que al comprar nuestro monitor de 17" en las especificaciones indica que es la distancia que se puede ver es de 16".

Por otra parte, si es por el tipo de monitor es un poco más técnico, se diferencian en los monitores de tubo sencillo, los de tubo de pantalla plana y los flat panel. La diferencia principal entre los de tubo es que los de pantalla plana poseen mejor tecnología y ofrecen mejor imagen (colores mas vivos) y resolución(mas detalle) que los de tuvo sencillo curvos. Ahora el último grito de la moda son los flat panel como el de las computadoras portátiles ya que no ocupan casi espacio y ofrecen altas resoluciones y tamaños adecuados, la única desventaja es que son sumamente caros, cuestan hasta diez veces lo que cuesta uno de tuvo del mismo tamaño de diagonal, muy pronto profundizaré un poco mas en el tema, no se preocupen.

Ratón: los ratones se diferencian principalmente en dos bandos. Los que se conectan al puerto serial, los cuales son estos. (Muestra imagen) y los PS-2 (muestra imagen). Los PS2 son el estándar hoy día pero tienes que tomar en cuenta si tu computadora tiene el puerto PS2 o no, aunque todas tienen puerto serial.
Son los que están reemplazando a los seriales ya que en las computadoras se creo este puerto especialmente para el mouse
Sabes que el puerto PS2 fue creado por la IBM especialmente para el mouse y el teclado, ya que al tener un puerto (conector) dedicado a los periféricos principales como teclado y mouse se puede liberar el puerto serial para conectar otros dispositivos como por ejemplo un MODEM.
Los mouse existen en distintas formas, unas más sencillas que otras, una de las variantes de mouse son los track ball, estos son un mouse pero invertido, en vez de mover el ratón entero, se mueve directamente la bola en dirección a la cual se quiere dirigir el cursor, o los touchpad como en las computadoras portátiles.

Teclado: hay dos tipos de ellos si los diferencias por el conector, AT y PS2, como podemos ver (mostrar figura comparatoria), la diferencia principal es el tamaño del conector. El conector del mouse PS2 es idéntico al del teclado PS2, tengan cuidado al invertirlos, no va a pasar nada, simplemente no les va a funcionar. Los teclados han evolucionado bastante también, hoy día poseen botones especiales para navegar en Internet o para abrir programas específicos con solo oprimirlos, también los tienen ergonómicos (adecuados a la fisonomía del hombre) y sencillos, inalámbricos, con bocinas, diferentes colores, etc. En fin hay teclados para cada usuario.


CPU: Unidad de procesamiento central, esta es la parte más importante ya que es el cerebro de la computadora, dentro de ella se realizan todas las tareas comandadas por el usuario, ella consta de partes específicas internas que serán explicadas más adelante.

Gabinete: El gabinete es la parte externa de la computadora y hay dos tipos principales, torre y de escritorio. En la clase de torre, las hay mini torre, media torre y torre completa que son los que se utiliza para servidores. Dentro del gabinete se encuentran todos los dispositivos principales. Fuente de poder, microprocesador, memorias, tarjeta de video, tarjeta de sonido, motherboard, ventiladores. Hoy día encontramos gabinetes mucho más elaborados en donde no sólo se toma en cuenta el diseño futurístico fuera del gabinete sino mucho mas importante, el diseño por dentro, el cual permite mejor flujo de aire y distribución correcta de los dispositivos internos.

Microprocesador: El microprocesador es la pieza principal en una computadora, es el cerebro en donde se realizan todos los cálculos y tomas de decisión. Los microprocesadores los podemos encontrar también en casi todos los dispositivos digitales, desde relojes hasta en los sistemas de inyección en los autos.
Sus características principales son: su ancho de banda y su velocidad del reloj.
El ancho de banda define el número de bits que puede procesar por cada instrucción. Esto es lo que se refiere a 8 bits, 16 bits, 32 bits, 64 bits. (Recordar lo de los video juegos)

La velocidad del reloj, dada en Hz que define cuantas instrucciones por segundo puede ejecutar. Esto es lo que escuchamos decir cuando un microprocesador de X marca es de 600MHz, 800 MHz, 1.5 GHz, donde MHz (Mega Hertz es millones de instrucciones y GHz (Mil millones de instrucciones)
La combinación de los dos (ancho de banda y velocidad de reloj) es lo que define el poder del microprocesador siendo más poderoso mientras mayor sean ambas.

Algunas marcas de los principales microprocesadores son: AMD, Cyrix, Intel y Motorola.

1.4 Editores

Aunque la ayuda de la sintaxis coloreada, autocompletar y otras argucias de los entornos de programación y editores de código fuente nos hacen la vida más fácil, lo cierto es que cuando conocemos en profundidad un lenguaje, generalmente, terminamos por olvidar lo fácil que nos hicieron la vida y cómo se codificaba con herramientas tan rudimentarias como el bloc de notas, editores poco más avanzados que el edit de MS-DOS o con pico, para los que teníamos la suerte de poder sustituir con el mismo el uso de vi.

Sin embargo, es en momentos en los que tenemos que enfrentarnos a nuevos lenguajes (al menos nuevos en el sentido de no conocerlos en profundidad) cuando es más útil que nunca contar con un editor apropiado que nos haga más liviana la tarea.

1.4.1 Editores de Carácter

Situación

El uso de logos u otros ítems para ser usados en cualquier documento se puede volver engorroso con los métodos tradicionales.

Recomendación

Windows XP tiene una característica que permite personalizar logos o cualquier otro ítem para ser utilizado en cualquier documento. El Editor de Caracteres Privados (Private Character Editor) se puede acceder en digitando “Eudcedit” sin las comillas en la ruta Inicio/Ejecutar

Una vez haya construido y guardado el diseño de su selección, puede accederlo a través del Mapa de Caracteres, al cual se llega por la ruta

Inicio/Todos los programas/Accesorios/Mapa de caracteres

En el tipo de letra se selecciona Todas las Fuentes (caracteres privados) y aparecerán sus adiciones. Las podrá copiar y pegar en cualquier documento.

1.4.2 Editores de Línea

El editor de líneas se usa para crear o editar la Tabla de Definición de Campos y la Tabla de Selección de Campos Estas tablas están formadas por una o más líneas, cada una de las cuales representa un elemento descriptivo. Aunque cada tabla tiene una estructura propia de sus elementos, los comandos del editor de líneas en ambos casos es idéntico. Para cada nuevo elemento de la tabla creado, el editor de líneas presenta un renglón en el que se muestra la posición y longitud de cada campo con líneas de subrayado (en coincidencia con el encabezado de la tabla presentado en la parte de arriba de la pantalla, y que contiene los nombres correspondientes a cada campo), y posiciona el cursor en el primer campo donde se van a teclear los datos.

Por ejemplo, la figura 63 y la figura 64 muestran como aparece la pantalla cuando se va a teclear en la primera línea de una FST y de una FDT respectivamente.

Nótese que cuando se crea una nueva línea en la tabla, la primera posición (que tiene encabezado?) no se usa, y que el cursor se posiciona en el primer campo donde se deben teclear datos (la primera posición se utiliza cuando se editan líneas ya existentes en la tabla, tal como se explica más adelante).

Se pueden teclear los diversos campos según sea necesario, y mover el cursor de uno al siguiente usando la tecla . La tecla devuelve el cursor al campo precedente. Nótese que todos los campos de más de un carácter de longitud activan al editor de campos (recordar que cuando el editor de campos está activo, el modo de edición se visualiza en la parte inferior izquierda de la. En este caso se pueden usar todas las facilidades del editor de campos, incluyendo las operaciones de manejo de bloques.

Para campos de un sólo carácter, simplemente debe teclearse el carácter relevante, el cursor pasará automáticamente al campo siguiente.

Por ejemplo, después de teclear el (ID) en una línea de una FST, se presiona para pasar a indicar la técnica de indizado (IT). Siendo un campo IT de un sólo carácter, basta con teclear uno de los códigos correspondientes (sin presionar ), para pasar al campo siguiente. El formato es un campo de texto, por lo que CDS/ISIS activará al editor de campos. Después del formato si se presiona CDS/ISIS pasará a la siguiente línea, ya que el formato es el último campo de la línea.

Al mover el cursor de un campo a otro, CDS/ISIS presenta un mensaje o un submenú relacionado con cada campo, en el área de mensajes (líneas 22–24).

1.4.3 Editores de Pantalla

Editor de pantalla completa vi

El editor más frecuente en Unix es vi. Es un editor que trabaja línea a línea y que muestra una pantalla de texto a la vez.

Para inciar una sesión de edición, se ejecuta el programa vi seguido del nombre del archivo a editar, y dado el caso también la trayectoria. Por ejemplo, para editar el arvhivo /tmp/borrame, basta con dar vi /tmp/borrame, o para editar un archivo en el directorio actual: vi borrame.

Si el archivo no existe vi lo crea. De igual manera, podemos simplemente invocar a vi, comenzar a escribir y despúes nombrar el archivo al momento de salvarlo.

Al ser ejecutado vi, presenta una pantalla con el texto del archivo, y las líneas después del final del archivo aparecen con el carácter ~ para indicar que a partir de ahí el archivo está vacio. Obviamente, si comenzamos a editar un archivo nuevo, todas las líneas aparecerán con éste carácter.

Tiene tres modos de trabajo. El modo de inserción, el de edición y el de comandos.

En el modo de inserción, toda la entrada que demos en el teclado se inserta en el archivo en el punto donde se encuentre el cursor. En el modo de edición daremos instrucciones que alteran el contenido, como por ejemplo para posicionarse en determinado punto, hacer reemplazos de texto, copiar o mover bloques de texto, etc. En el modo comandos se dan instrucciones para salvar el archivo, traer a edición otro, insertar otro archivo en el punto donde se está, terminar la edición, etc.







martes, 2 de marzo de 2010

Unidad I Lenguajes de Programación y Editores

1.- ¿En que se basa el modelo de John Von Neumann?

Observo que la torpeza de la aritmética decimal utilizadas en la computadora ENIAC podia remplazarse utilizando la aritmatica binaria.


Realizo un diseño básico llamado la máquina de Von Newman y se utilizo en la computadora EDVAC que fue la primera computadora que almacenaba el programa.

La máquina de Von Newman tenía 5 partes principales y son las siguientes:


LA MEMORIA: Constaba de 4096 palabras cada una de 40 bits cada palabra podía contener 2 instrucciones de 20 bits cada una o un número entero de 39 bits y su signo.


UNIDAD DE CONTROL: Es la que supervisaba la transferencia de información y la indicaba a la unidad aritmética lógica cual operación debía ejecutar.

UNIDAD DE ARITMATICA LÓGICA: Es aquella que se encarga de realizar las operaciones aritméticas y lógicas necesarias para la ejecución de una instrucción.

ENTRADA: Es cualquier dispositivo por el que se introduce información a la computadora.

SALIDA: Es cualquier dispositivo que recibe información de la máquina para ser utilizadas por el usuario.


2.- ¿Cuales son los lenguajes formales y sus características principales?


En matemáticas, lógica, y ciencias de la computación, un lenguaje formal es un lenguaje cuyos símbolos primitivos y reglas para unir esos símbolos están formalmente especificados. Al conjunto de los símbolos primitivos se le llama el alfabeto (o vocabulario) del lenguaje, y al conjunto de las reglas se lo llama la gramática formal (o sintaxis). A una cadena de símbolos formada de acuerdo a la gramática se la llama una fórmula bien formada (o palabra) del lenguaje. Estrictamente hablando, un lenguaje formal es idéntico al conjunto de todas sus fórmulas bien formadas. A diferencia de lo que ocurre con el alfabeto (que debe ser un conjunto finito) y con cada fórmula bien formada (que debe tener una longitud también finita), un lenguaje formal puede estar compuesto por un número infinito de fórmulas bien formadas.

Por ejemplo, un alfabeto podría ser el conjunto {a,b}, y una gramática podría definir a las fórmulas bien formadas como aquellas que tienen el mismo número de símbolos a que b. Entonces, algunas fórmulas bien formadas del lenguaje serían: ab, ba, abab, ababba, etc.; y el lenguaje formal sería el conjunto de todas esas fórmulas bien formadas.

Para algunos lenguajes formales existe una semántica formal que puede interpretar y dar significado a las fórmulas bien formadas del lenguaje. Sin embargo, una semántica formal no es condición necesaria para definir un lenguaje formal, y eso es una diferencia esencial con los lenguajes naturales.

3.- ¿Qué son los editores y para que sirven?

Un editor de texto es un programa que permite crear y modificar archivos digitales compuestos únicamente por texto sin formato, conocidos comúnmente como archivos de texto o texto plano. El programa lee el archivo e interpreta los bytes leídos según el código de caracteres que usa el editor. Hoy en día es comúnmente de 7- ó 8-bits en ASCII o UTF-8, rara vez EBCDIC.


Por ejemplo, un editor ASCII de 8 bits que lee el número binario 0110 0001 (decimal 97 ó hexadecimal 61) en el archivo lo representará en la pantalla por la figura a, que el usuario reconoce como la letra "a" y ofrecerá al usuario las funciones necesarias para cambiar el número binario en el archivo.

Los editores de texto son incluidos en el sistema operativo o en algún paquete de software instalado y se usan cuando se deben crear o modificar archivos de texto como archivos de configuración, scripts o el código fuente de algún programa.

El archivo creado por un editor de texto incluye por convención en DOS y Microsoft Windows la extensión .txt, aunque pueda ser cambiada a cualquier otra con posterioridad. Tanto Unix como Linux dan al usuario total libertad en la denominación de sus archivos.

Al trasladar archivos de texto de un sistema operativo a otro se debe considerar que existen al menos dos convenciones diferentes para señalar el término de una línea: Unix y Linux usan sólo retorno de carro en cambio Microsoft Windows usa al término de cada línea retorno de carro y salto de línea.

4.- ¿Que son los editores de carácter?

Editor de Caracteres Privados

Situación: El uso de logos u otros ítems para ser usados en cualquier documento se puede volver engorroso con los métodos tradicionales.

Recomendación: Windows XP tiene una característica que permite personalizar logos o cualquier otro ítem para ser utilizado en cualquier documento. El Editor de Caracteres Privados (Private Character Editor) se puede acceder en digitando “Eudcedit” sin las comillas en la ruta Inicio/Ejecutar

Una vez haya construido y guardado el diseño de su selección, puede accederlo a través del Mapa de Caracteres, al cual se llega por la ruta:

(Inicio/Todos los programas/Accesorios/Mapa de caracteres)


En el tipo de letra se selecciona Todas las Fuentes (caracteres privados) y aparecerán sus adiciones. Las podrá copiar y pegar en cualquier documento.

El editor para caracteres es A[w], siendo w el ancho del campo medido en caracteres. Si omitimos w, la longitud de los datos se tomará como el ancho del campo.

En la entrada, sea long la longitud de los datos que leemos. Si w es mayor que long, los caracteres después de la posición long también son leídos. Si w es menor que long, a la entrada le añadiremos espacios en blanco por la derecha.

En la salida, si w es mayor que long, se añaden espacios en blanco por la izquierda. Si w es menor que long, los caracteres antes de la posición w aparecerán en la salida.



5.- ¿Qué son los editores de línea?

El editor de líneas se usa para crear o editar la Tabla de Definición de Campos y la Tabla de Selección de Campos Estas tablas están formadas por una o más líneas, cada una de las cuales representa un elemento descriptivo. Aunque cada tabla tiene una estructura propia de sus elementos, los comandos del editor de líneas en ambos casos es idéntico. Para cada nuevo elemento de la tabla creado, el editor de líneas presenta un renglón en el que se muestra la posición y longitud de cada campo con líneas de subrayado (en coincidencia con el encabezado de la tabla presentado en la parte de arriba de la pantalla, y que contiene los nombres correspondientes a cada campo), y posiciona el cursor en el primer campo donde se van a teclear los datos.

Para campos de un sólo carácter, simplemente debe teclearse el carácter relevante, el cursor pasará automáticamente al campo siguiente.


Antes que existieran los editores de texto, los datos y el código fuente de los programas debía ser entregado a la máquina por medio de tarjetas perforadas. El programa, un fajo de tarjetas, era leído por un lector de tarjetas perforadas. Cada carácter era representado por una o más perforaciones en una columna de 8 o 10 posibles perforaciones. No más de 80 caracteres podían ser representados en una tarjeta.

Con los Teletipos aparecieron también los primeros editores de texto que en un comienzo solo mostraban una línea del texto. Mandatos especiales movían el "cursor" en la cuatro direcciones.

El siguiente paso se dio con la aparición del monitor de tubo de rayos catódicos que permitió la edición a "pantalla completa" es decir mostrando varias líneas a la vez. El aumento de productividad fue enorme, por la rapidez y simplicidad del mecanismo. Uno de los primeros editores de texto fue el O26 escrito para la consola del operador de la serie de computadores CDC 6000 a mediados de la década de los 1960'. Otro precursor es el vi, escrito en los 1970' que aún es el estándar para los sistemas operativos Unix y Linux.

6.- ¿Qué son los editores de pantalla?
Editor de pantalla completa vi

El editor más frecuente en Unix es vi. Es un editor que trabaja línea a línea y que muestra una pantalla de texto a la vez.
Para inciar una sesión de edición, se ejecuta el programa vi seguido del nombre del archivo a editar, y dado el caso también la trayectoria. Por ejemplo, para editar el arvhivo /tmp/borrame, basta con dar vi /tmp/borrame, o para editar un archivo en el directorio actual: vi borrame.

Si el archivo no existe vi lo crea. De igual manera, podemos simplemente invocar a vi, comenzar a escribir y despúes nombrar el archivo al momento de salvarlo.

Al ser ejecutado vi, presenta una pantalla con el texto del archivo, y las líneas después del final del archivo aparecen con el carácter ~ para indicar que a partir de ahí el archivo está vacio. Obviamente, si comenzamos a editar un archivo nuevo, todas las líneas aparecerán con éste carácter.

Tiene tres modos de trabajo. El modo de inserción, el de edición y el de comandos.

En el modo de inserción, toda la entrada que demos en el teclado se inserta en el archivo en el punto donde se encuentre el cursor. En el modo de edición daremos instrucciones que alteran el contenido, como por ejemplo para posicionarse en determinado punto, hacer reemplazos de texto, copiar o mover bloques de texto, etc. En el modo comandos se dan instrucciones para salvar el archivo, traer a edición otro, insertar otro archivo en el punto donde se está, terminar la edición, etc.



7.- ¿Qué son los lenguajes de programación?

Un lenguaje de programación es un idioma artificial diseñado para expresar computaciones que pueden ser llevadas a cabo por máquinas como las computadoras. Pueden usarse para crear programas que controlen el comportamiento físico y lógico de una máquina, para expresar algoritmos con precisión, o como modo de comunicación humana. Está formado de un conjunto de símbolos y reglas sintácticas y semánticas que definen su estructura y el significado de sus elementos y expresiones. Al proceso por el cual se escribe, se prueba, se depura, se compila y se mantiene el código fuente de un programa informático se le llama programación.

También la palabra programación se define como el proceso de creación de un programa de computadora, mediante la aplicación de procedimientos lógicos, a través de los siguientes pasos:

El desarrollo lógico del programa para resolver un problema en particular.

Escritura de la lógica del programa empleando un lenguaje de programación específico (codificación del programa)

Ensamblaje o compilación del programa hasta convertirlo en lenguaje de máquina.

Prueba y depuración del programa.

Desarrollo de la documentación.

Existe un error común que trata por sinónimos los términos 'lenguaje de programación' y 'lenguaje informático'. Los lenguajes informáticos engloban a los lenguajes de programación y a otros más, como por ejemplo el HTML. (lenguaje para el marcado de páginas web que no es propiamente un lenguaje de programación sino un conjunto de instrucciones que permiten diseñar el contenido y el texto de los documentos)

Permite especificar de manera precisa sobre qué datos debe operar una computadora, cómo deben ser almacenados o transmitidos y qué acciones debe tomar bajo una variada gama de circunstancias. Todo esto, a través de un lenguaje que intenta estar relativamente próximo al lenguaje humano o natural, tal como sucede con el lenguaje Léxico. Una característica relevante de los lenguajes de programación es precisamente que más de un programador pueda usar un conjunto común de instrucciones que sean comprendidas entre ellos para realizar la construcción del programa de forma colaborativa.



8.- ¿Cuáles son los lenguajes de alto nivel?

Los lenguajes de programación 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".



9.- ¿Cuales son los lenguajes de medio o intermedio nivel?

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 mas 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.

10.- ¿Cuáles son los lenguajes de bajo nivel?

Un lenguaje de programación 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.
La palabra "bajo" no implica que el lenguaje sea inferior a un lenguaje de alto nivel; se refiere a la reducida abstracción entre el lenguaje y el hardware.

Algunos lenguajes de bajo nivel son el lenguaje de maquina , el lenguaje simbolico y el de programacion. El lenguaje de programacion tiene ciertas ventajas:

Mayor adaptación al equipo.

Posibilidad de obtener la máxima velocidad con mínimo uso de memoria.

Pero también tiene importantes 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.


Primera generación


El lenguaje de programación de primera generación (por sus siglas en inglés, 1GL), es el lenguaje de código máquina. Es el único lenguaje que un microprocesador entiende de forma nativa. El lenguaje máquina no puede ser escrito o leído usando un editor de texto, y por lo tanto es raro que una persona lo use directamente.

Segunda generación


El lenguaje de programación de segunda generación (por sus siglas en inglés, 2GL), es el lenguaje ensamblador. Se considera de segunda generación porque, aunque no es lenguaje nativo del microprocesador, un programador de lenguaje ensamblador debe conocer la arquitectura del microprocesador (como por ejemplo las particularidades de sus registros o su conjunto de instrucciones).

11.- ¿Menciona los tipos de compiladores?

Un compilador es un programa informático que traduce un programa escrito en un lenguaje de programación a otro lenguaje de programación, generando un programa equivalente que la máquina será capaz de interpretar. Usualmente el segundo lenguaje es lenguaje de máquina, pero también puede ser simplemente texto. Este proceso de traducción se conoce como compilación.

Un compilador es un programa que permite traducir el código fuente de un programa en lenguaje de alto nivel, a otro lenguaje de nivel inferior (típicamente lenguaje de máquina). De esta manera un programador puede diseñar un programa en un lenguaje mucho más cercano a como piensa un ser humano, para luego compilarlo a un programa más manejable por una computadora.

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.

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.


Pauta de creación de un compilador: En las primeras épocas de la informática, el software de los compiladores era considerado como uno 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 ó 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


Es el proceso por el cual se traducen las instrucciones escritas en un determinado lenguaje de programación a lenguaje maquina. 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.exe para Microsoft 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 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.

12.- ¿Menciona los tipos de intérpretes?

Un intérprete es un programa que toma un programa fuente escrito en un lenguaje de alto nivel, lo analiza y lo ejecuta instrucción a instrucción bajo su control.

No se genera un programa equivalente en otro lenguaje de menor nivel, así que si se desea repetir la ejecución del programa es preciso volver a traducirlo.

Un intérprete realizaría el siguiente ciclo:

Repetir, leer instrucción, ejecutar instrucción, hasta el fin.

En un intérprete sólo hay que distinguir dos lenguajes diferentes, el de los programas de partida (LA), y el lenguaje en que está escrito el intérprete (LC).

Un intérprete corresponde al intérprete humano, que traduce de viva voz las palabras que oye, sin dejar constancia por escrito un intérprete toma las instrucciones del programa fuente y las traduce y ejecuta a lenguaje máquina una a una, un compilador realiza la traducción completa del programa fuente a código máquina, sin ejecutarlo, siendo posteriormente cuando se ejecute el programa una vez compilado.

Un intérprete toma las instrucciones del programa fuente y las traduce y ejecuta a lenguaje máquina una a una, un compilador realiza la traducción completa del programa fuente a código máquina, sin ejecutarlo, siendo posteriormente cuando se ejecute el programa una vez compilado.

Tipos de intérpretes de órdenes

Como se ha comentado antes, es un sistema operativo multitarea y multiusuario. La multitarea es muy útil, y una vez la haya comprendido, la usará todo el tiempo. Dentro de poco ejecutará programas en segundo plano, cambiará entre tareas y redirigirá programas junto a resultados complicados con una sencilla orden.

Muchas de las características que se verán en esta sección son características suministradas por el intérprete de órdenes. Se debe tener cuidado en no confundir (el actual sistema operativo) con el intérprete de órdenes. Un intérprete de órdenes es tan sólo un interfaz con el sistema operativo que hay debajo. El intérprete de órdenes proporciona funcionalidad añadida a .

Un intérprete de órdenes no es sólo un intérprete de las órdenes interactivas que se teclean en el indicador de órdenes, sino también un potente lenguaje de programación. Permite escribir guiones (shell scripts), juntando varias órdenes en un fichero. Si se conoce MS-DOS, se reconocerá la similitud con los ficheros de procesamiento por lotes. Los guiones del intérprete de órdenes son una herramienta muy potente, que le permitirá automatizar y extender el uso de. Mire la página para más información.

13.- ¿Cual es la diferencia entre un intérprete y un compilador?

Intérpretes y Compiladores

Principios de la interpretación.

En lugar de producir un programa objeto como resultado de una traducción, un intérprete realiza las operaciones que implica el programa fuente. Por ejemplo un intérprete podría construir un árbol, y después efectuar las operaciones de los nodos conforme recorre el árbol.


Muchas veces los intérpretes se utilizan para ejecutar lenguajes de órdenes, pues cada operador que se ejecuta en un lenguaje de este tipo suele ser una invocación de una rutina, como un editor o un compilador. Del mismo modo algunos lenguajes de alto nivel son interpretados, porque hay muchas cosas sobre los datos, como el tamaño y la forma de las matrices que no se pueden deducir en el momento de la compilación.

Intérprete: Es un traductor que realiza la operación de compilación paso a paso. Para cada sentencia que compone el texto de entrada, se realiza una traducción, ejecuta dicha sentencia y vuelve a iniciar el proceso con la sentencia siguiente.

La principal ventaja del proceso de compilación frente al de interpretación es que los programas se ejecutan mucho más rápidamente una vez compilados; por el contrario, es más cómodo desarrollar un programa mediante un intérprete que mediante un compilador puesto que en el intérprete las fases de edición y ejecución están más integradas. La depuración de los programas suele ser más fácil en los intérpretes que en los compiladores puesto que el código fuente está presente durante la ejecución. Estas ventajas pueden incorporarse al compilador mediante la utilización de entornos de desarrollo y depuradores simbólicos en tiempo de ejecución.

Diferencia entre un intérprete y compilador


INTERPRETE: Es un programa que lee línea a línea un programa escrito en un lenguaje; en lenguaje fuente y lo va traduciendo a un código intermedio, para ejecutarlo.


COMPILADOR: Es un programa que lee totalmente un programa escrito en un lenguaje; el lenguaje fuente, y lo traduce a un programa equivalente a otro lenguaje, lenguaje objeto.

A grandes rasgos un compilador es un programa que lee un programa escrito es un lenguaje, el lenguaje fuente, y lo traduce a un programa equivalente en otro lenguaje, el lenguaje objeto. Como parte importante de este proceso de traducción, el compilador informa a su usuario de la presencia de errores en el programa fuente.

Comparación Intérpretes Y Compiladores

Un compilador acepta programas escritos en un lenguaje de alto nivel y los traduce a otro lenguaje, generando un programa equivalente independiente, que puede ejecutarse tantas veces como se quiera.


En un compilador hay que distinguir tres lenguajes diferentes:

• El de los programas de partida (LA)

• El de los programas equivalentes traducidos (LB), normalmente el lenguaje de máquina


• El lenguaje en que está escrito el propio compilador (LC), que puede ser igual o diferente a uno de los otros dos.

Los programas interpretados suelen ser más lentos que los compilados, pero los intérpretes son más flexibles como entornos de programación y depuración. 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.

¿Qué es un compilador?

Un traductor es cualquier programa que toma como entrada un texto escrito en un lenguaje, llamado fuente y da como salida otro texto en un lenguaje, denominado objeto.

Compilador: En el caso de que el lenguaje fuente sea un lenguaje de programación de alto nivel y el objeto sea un lenguaje de bajo nivel (ensamblador o código de máquina), a dicho traductor se le denomina compilador. Un ensamblador es un compilador cuyo lenguaje fuente es el lenguaje ensamblador. Un intérprete no genera un programa equivalente, sino que toma una sentencia del programa fuente en un lenguaje de alto nivel y la traduce al código equivalente y al mismo tiempo lo ejecuta. Históricamente, con la escasez de memoria de los primeros ordenadores, se puso de moda el uso de intérpretes frente a los compiladores, pues el programa fuente sin traducir y el intérprete juntos daban una ocupación de memoria menor que la resultante de los compiladores. Por ello los primeros ordenadores personales iban siempre acompañados de un intérprete de BASIC (Spectrum, Commodore VIC-20, PC XT de IBM, etc.). La mejor información sobre los errores por parte del compilador así como una mayor velocidad de ejecución del código resultante hizo que poco a poco se impusieran los compiladores. Hoy en día, y con el problema de la memoria prácticamente resuelto, se puede hablar de un gran predominio de los compiladores frente a los intérpretes, aunque intérpretes como los incluidos en los navegadores de Internet para interpretar el código JVM de Java son la gran excepción.