Documentos de Académico
Documentos de Profesional
Documentos de Cultura
ANTÚNEZ DE MAYOLO”
FACULTA DE CIENCIAS
TEORIA DE LENGUAJES
“TIPOS DE TRADUCTORES”
b. INICIOS
Los primeros traductores de idiomas realizaban la traducción palabra por
palabra; haciendo que, entre los diferentes idiomas, no tenían sentido ni
coherencia.
Viendo esto; se tuvieron que realizar algunas modificaciones.
La principal fue la realización de inteligencias artificiales para poder dar el
sentido a las oraciones; que este también a su vez, conllevo a más
problemas
d. AMBIGÜEDAD
Otro problema que sigue hasta la actualidad es la ambigüedad al momento
de traducir palabras que tienen doble sentido, o palabras que se puede
traducir de diferentes formas. Esto genero que al momento de traducir
textos de extrema importancia; parecían no tener ningún sentido después
de traducirlas
Cada vez la inteligencia artificial almacena los posibles conceptos de cada
palabra y logra encontrar esas palabras exactas para cada oración.
e. ACTUALIDAD
En la actualidad existen diferentes sistemas que necesitan un traductor de
idiomas, principalmente son los navegadores; que, según la documentación
de html, debe ser capaz de identificar la necesidad del cliente y poder
traducir paginas de otros idiomas para la facilitación del cliente.
Otros son los mismos sistemas de traducción de idiomas, como el traductor
de Google o Plugins de traducción, donde están más enfocados a una
mayor lingüística y poder ofrecer al cliente una mejor traducción
Sin embrago todos estos están incompletos; ya que existen mas de 7000
idiomas oficiales y no oficiales
2. COMPILADORES
a. DEFINICION
b. CONSTRUCCION
c. INICIOS
Los primeros usuarios de los 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 se orientaron hacia la creación de
un lenguaje que expresara las acciones a realizar de una manera lo más
sencilla posible para una persona.
d. TIPOS DE COMPILADORES
e. PROCESOS DE COMPLIACION
Es el proceso por el cual se traducen las instrucciones escritas en un
determinado lenguaje de programación a lenguaje máquina. Un programa
fuente se puede dividir en módulos almacenados en archivos distintos.
Fase de síntesis
Consiste en generar el código objeto equivalente al programa fuente.
a. DEFINICION
Ejemplo de un intérprete
Los intérpretes son diferentes a los compiladores, ya que estos últimos transforman el
programa a otro igual en un código objeto y en una segunda instancia generan los
resultados a partir de los datos que se usar de entrada.
Ejemplo de un compilador
b. ESTRUCTURA DE UN INTERPRETE
a) Interpretación Iterativa
Esta interpretación es ideal para lenguajes simples, donde se analiza y ejecuta
las expresiones directamente, entre ellos están los códigos de máquinas
abstractas o lenguajes de sentencias sencillas. La interpretación consiste en un
ciclo básico de búsqueda, análisis y ejecución de instrucciones.
b) Interpretación Recursiva
Comúnmente, el diseño de nuevos lenguajes de programación se realiza en dos
fases:
Una primera fase de especificación semántica mediante la construcción de un
intérprete prototipo que actúa como una especificación ejecutable y una
segunda fase de implementación del compilador de dicho lenguaje. Para la
construcción de prototipos suele utilizarse un modelo de interpretación
recursiva donde las sentencias pueden estar compuestas de otras sentencias y
la ejecución de una sentencia puede lanzar la ejecución de otras sentencias de
forma recursiva. Los intérpretes recursivos no son apropiados para aplicaciones
prácticas debido a su ineficiencia y se utilizan únicamente como prototipo
ejecutable del lenguaje. El problema de especificar un lenguaje mediante un
intérprete prototipo es decidir en qué lenguaje se implementa dicho
intérprete. Dicho lenguaje debe ser suficientemente expresivo y no ambigüo
para definir claramente cómo funcionan las diferentes construcciones. En
muchos casos se opta por utilizar lenguajes ya implementados pero que
carecen de una especificación semántica clara. La tendencia actual es
investigar técnicas de especificación semántica formal que permitan generar
automáticamente este tipo de intérpretes.
c. APLICACIONES DE LOS SISTEMAS BASADOS EN INTÉRPRETES
Los sistemas interpretados han tenido una gran importancia desde la aparición de
los primeros ordenadores. En la actualidad, la evolución del hardware abre nuevas
posibilidades a los sistemas interpretados. La preocupación ya no es tanto la
eficiencia como la capacidad de desarrollo rápido de nuevas aplicaciones. Las
principales aplicaciones podrían resumirse en:
d. TIPOS DE INTÉRPRETES
a) Intérpretes puros
Los intérpretes puros son los que analizan y ejecutan sentencia a sentencia
todo el programa fuente. Siguen el modelo de interpretación iterativa y, por
tanto, se utilizan principalmente para lenguajes sencillos. Los intérpretes puros
se han venido utilizando desde la primera generación de ordenadores al
permitir la ejecución de largos programas en ordenadores de memoria
reducida, ya que sólo debían contener en memoria el intérprete y la sentencia
a analizar y ejecutar en cada momento. El principal problema de este tipo de
intérpretes es que si a mitad del programa fuente se producen errores, se debe
de volver a comenzar el proceso.
b) Intérpretes avanzados
Los intérpretes avanzados o normales incorporan un paso previo de análisis de
todo el programa fuente. Generando posteriormente un lenguaje intermedio
que es ejecutado por ellos mismos. De esta forma en caso de errores
sintácticos no pasan de la fase de análisis. Se utilizan para lenguajes más
avanzados que los intérpretes puros, ya que permiten realizar un análisis más
detallado del programa fuente (comprobación de tipos, optimización de
instrucciones, etc.)
c) Intérpretes incrementales
Existen ciertos lenguajes que, por sus características, no se pueden compilar
directamente. La razón es que pueden manejar objetos o funciones que no son
conocidos en tiempo de compilación, ya que se crean dinámicamente en
tiempo en ejecución. Entre estos lenguajes, pueden considerarse Smalltalk,
Lisp o Prolog. Con el propósito de obtener una mayor eficiencia que en la
interpretación simple, se diseñan compiladores incrementales. La idea es
compilar aquellas partes estáticas del programa en lenguaje fuente, marcando
como dinámicas las que no puedan compilarse. Posteriormente, en tiempo de
ejecución, el sistema podrá compilar algunas partes dinámicas o recompilar
partes dinámicas que hayan sido modificadas. Estos sistemas no producen un
código objeto independiente, sino que acompañan el sistema que permite
compilar módulos en tiempo de ejecución (run time system) al código objeto
generado.
Normalmente, los compiladores incrementales se utilizan en sistemas
interactivos donde conviven módulos compilados con módulos modificables.
d) Evaluadores parciales
La utilización de evaluadores parciales o especializadores surge al considerar
que muchos programas contienen dos tipos de datos de entrada. Existen una
serie de datos de entrada que son diferentes en cada ejecución mientras que
otros datos no varían de una ejecución a otra. El primer conjunto, se conoce
como datos de entrada dinámicos (se denotará como Din), mientras que el
segundo conjunto, serían los datos de entrada estáticos (Est). Dado un
programa P, el proceso de evaluación parcial consiste en construir otro
programa especializado P_est para los datos estáticos de P. El programa P_est
suele estar escrito en el mismo lenguaje fuente que P y se debe garantizar que
cuando se le presenten los datos dinámicos produzca los mismos resultados
que si se hubiesen presentado todos los datos al programa P original.
e) Compiladores “Just-In-Time”
Con la aparición de Internet surge la necesidad de distribuir programas de una
forma independiente de la máquina permitiendo su ejecución en una amplia
variedad de plataformas. Los códigos de bytes de la máquina Virtual de Java
permiten la ejecución de programas distribuidos, ya que la mayoría de los
visualizadores tienen un mecanismo capaz de interpretarlos. La interpretación
de códigos de bytes supone una demora en los tiempos de ejecución. Para
evitar la interpretación, muchos sistemas transforman los códigos de bytes en
código nativo siguiendo el modelo “just in time”. En este modelo, una unidad
de compilación o clase se transmite en el formato de códigos de bytes, pero no
se realiza la interpretación. En lugar de ello, el código es compilado a código
nativo justo en el momento en que lo necesita el programa que se está
ejecutando.
f) Compilación continua
La compilación continua surge como un intento de mejorar la compilación “Just
in Time”. El sistema mezcla el proceso de compilación a código nativo con el
proceso de interpretación. Para conseguirlo, el sistema dispone de dos
módulos: un módulo de interpretación de los códigos de bytes y otro módulo
de compilación de códigos de bytes a código nativo. La idea consiste en que
ambos módulos actúen a la vez (lo ideal sería disponer de dos procesadores),
de forma que el sistema no se detenga a compilar un módulo, sino que vaya
interpretándolo hasta que el compilador haya generado el código nativo. La
principal ventaja de la compilación continua respecto a la compilación Just in
Time radica en no tener que esperar a compilar una unidad para comenzar su
ejecución.
Como se puede comprobar, las dos líneas que comienzan por “#” han desaparecido, al
igual que los comentarios. Al traductor a código binario le llega fichero sin ninguna
directiva ni comentario. El preprocesador puede ser utilizado de forma independiente del
compilador mediante el comando cpp. Abre un terminal de comandos y consulta la página
de manual de este comando. Como puedes comprobar, es un programa que puede
procesar un amplio catálogo de directivas. De todas ellas, en este documento se describen
las más utilizadas.
a. La directiva #include
Esta directiva posee dos versiones. La primera; si va seguida de una única cadena
de texto como:
La directiva #define tiene una funcionalidad extra que puede utilizarse para definir
lo que se conoce como “macros”. El reemplazo que hace el preprocesador del
símbolo por su equivalente puede incluir parámetros. En el siguiente ejemplo se
define una macro para reemplazar el símbolo DEMASIADO_GRANDE(v) la
comparación de v dada con el valor 1000.
los usuarios ingresan comandos a través del teclado, luego el intérprete convierte los
comandos en funciones o llamadas al sistema.
Como ventaja el uso de estás interfaces es que las instrucciones se ejecutan más rápido,
otra ventaja es que no todo el SO cuenta con botones para todas las acciones posibles por
el interprete es por esto que el interprete se convierte en la única solución en caso no
podamos mediante la SO.
Pueden estar en el kernel o como también en dispositivos externos este ultimo es más
conveniente por los cambios constantes que se dan en el Shell.
6. ENSAMBLADORES Y MACROENSAMBLADORES
Son los pioneros de los compiladores porque antes se escribían los códigos en lenguaje
maquina y era laborioso, constituyendo así el primer paso para los lenguajes de alto nivel,
los ensambladores.
. Si el lenguaje destino no tiene las mismas características que el origen. Por ejemplo, un
Usos
El uso de máquinas virtuales (como la JVM de Java) resuelve algunas de las razones por las que
se desarrollaron compiladores cruzados. El paradigma de la máquina virtual permite que se
utilice la misma salida del compilador en varios sistemas de destino, aunque esto no siempre
es ideal porque las máquinas virtuales suelen ser más lentas y el programa compilado solo se
puede ejecutar en equipos con esa máquina virtual.
Cruz canadiense
El Cross Canadian es una técnica para la construcción de compiladores cruzados para otras
máquinas. Dadas tres máquinas A, B y C, una usa la máquina A (por ejemplo, ejecutando
Windows XP en un procesador IA-32 ) para construir un compilador cruzado que se ejecuta en
la máquina B (por ejemplo, ejecutando Mac OS X en un procesador x86-64 ) para crear
ejecutables para la máquina C (por ejemplo, ejecutar Android en un procesador ARM ). Al usar
Canadian Cross con GCC, puede haber cuatro compiladores involucrados
Por ejemplo, NetBSD proporciona un script de shell POSIX Unix llamado build.shque primero
construirá su propia cadena de herramientas con el compilador del host; esto, a su vez, se
usará para construir el compilador cruzado que se usará para construir todo el sistema.
El término Cruz Canadiense surgió porque en el momento en que se estaban debatiendo estos
temas, Canadá tenía tres partidos políticos nacionales.
1979 - ALGOL 68C generó ZCODE ; esto ayudó a portar el compilador y otras aplicaciones de
ALGOL 68 a plataformas alternativas. Para compilar el compilador ALGOL 68C se requieren
aproximadamente 120 KB de memoria. Con Z80, su memoria de 64 KB es demasiado pequeña
para compilar el compilador. Entonces, para el Z80, el compilador en sí tuvo que compilarse
de forma cruzada desde una computadora con capacidad CAP más grande o una
computadora central IBM System / 370 .
GCC requiere que haya disponible una copia compilada de binutils para cada plataforma de
destino. Especialmente importante es el ensamblador GNU . Por lo tanto, binutils primero
debe compilarse correctamente con el conmutador --target=some-targetenviado al script de
configuración . GCC también debe configurarse con la misma --targetopción. Luego, GCC se
puede ejecutar normalmente siempre que las herramientas, que binutils crea, estén
disponibles en la ruta , lo que se puede hacer usando lo siguiente (en sistemas operativos tipo
UNIX con bash):
Los paquetes de autotools de GNU (es decir , autoconf , automake y libtool ) utilizan la noción
de una plataforma de compilación , una plataforma de host y una plataforma de destino . La
plataforma de compilación es donde se compila realmente el compilador. En la mayoría de los
casos, la compilación debe dejarse sin definir (será el valor predeterminado del host). La
plataforma de host es siempre donde se ejecutarán los artefactos de salida del compilador, ya
sea que la salida sea de otro compilador o no. La plataforma de destino se utiliza cuando se
compilan compiladores cruzados, representa qué tipo de código de objeto producirá el
paquete; de lo contrario, la configuración de la plataforma de destino es irrelevante. [2] Por
ejemplo, considere la posibilidad de realizar una compilación cruzada de un videojuego que
se ejecutará en un Dreamcast . La máquina donde se compila el juego es la plataforma de
construcción, mientras que Dreamcast es la plataforma anfitriona . Los nombres de host y
target son relativos al compilador que se está utilizando y se han cambiado como hijo y nieto .
Otro método utilizado popularmente por los desarrolladores de Linux embebido implica la
combinación de compiladores GCC con entornos sandbox especializados como Scratchbox ,
scratchbox2 o PRoot . Estas herramientas crean una caja de arena " chrooted " donde el
programador puede crear las herramientas, libc y bibliotecas necesarias sin tener que
establecer rutas adicionales. También se proporcionan funciones para "engañar" al tiempo de
ejecución de modo que "crea" que realmente se está ejecutando en la CPU de destino
prevista (como una arquitectura ARM); esto permite que los scripts de configuración y
similares se ejecuten sin errores. Scratchbox se ejecuta más lentamente en comparación con
los métodos "no chrootados", y la mayoría de las herramientas que están en el host deben
moverse a Scratchbox para que funcionen.
Aztec C86 de Manx, su compilador de MS-DOS 8086 en modo nativo , también era un
compilador cruzado. Aunque no compiló código para un procesador diferente como sus
compiladores cruzados Aztec C65 6502 para Commodore 64 y Apple II, creó ejecutables
binarios para los sistemas operativos heredados de la familia de procesadores 8086 de 16
bits.
Cuando se introdujo por primera vez IBM PC, estaba disponible con una selección de sistemas
operativos, CP / M-86 y PC DOS eran dos de ellos. Aztec C86 se proporcionó con bibliotecas
de enlaces para generar código para ambos sistemas operativos IBM PC . A lo largo de la
década de 1980, las versiones posteriores de Aztec C86 (3.xx, 4.xx y 5.xx) agregaron soporte
para las versiones 1 y 2 "transitorias" de MS-DOS [8] y que eran menos robustas que las
versiones "de base" de MS-DOS. versión 3 y posterior que Aztec C86 apuntó hasta su
desaparición.
Thomas Fenwick y James Goodnow II fueron los dos principales desarrolladores de Aztec-C.
Fenwick más tarde se hizo conocido como el autor del kernel de Microsoft Windows CE o NK
("New Kernel") como se llamaba entonces.
Microsoft C (MSC) tiene una historia más corta que otros que se remontan a la década de
1980. Los primeros compiladores de Microsoft C fueron hechos por la misma compañía que
hizo Lattice C y Microsoft los renombró como propios, hasta que se lanzó MSC 4, que fue la
primera versión que Microsoft produjo.
Borland C (empresa de California) estuvo disponible para su compra años antes de que
Microsoft lanzara su primer producto C.
Mucho antes de Borland, BSD Unix (Universidad de Berkeley) había obtenido C de los autores
del lenguaje C: Kernighan y Ritche, quienes lo escribieron al unísono mientras trabajaban para
AT&T (laboratorios). Las necesidades originales de K&R no eran solo una elegante sintaxis
analizada de segundo nivel para reemplazar la sintaxis analizada de primer nivel de asm: se
diseñó para que se escribiera una cantidad mínima de asm para admitir cada plataforma (el
diseño original de C era la capacidad de compilar usando C con la código de soporte mínimo
por plataforma, que necesitaban). También ayer C directamente relacionado con el código
ASM donde no depende de la plataforma. El C de hoy (más bien c ++) ya no es compatible con
C y el código asm subyacente puede ser extremadamente diferente al escrito en una
plataforma determinada (en Linux: a veces reemplaza y desvía las llamadas a la biblioteca con
opciones de distribuidor). El C de hoy es un idioma de tercer o cuarto nivel que se usa a la
antigua como un idioma de segundo nivel.
1987
Los programas en C llevaban mucho tiempo vinculados con módulos escritos en lenguaje
ensamblador . La mayoría de los compiladores de C (incluso los compiladores actuales)
ofrecen un pase de lenguaje ensamblador (que puede modificarse para mayor eficiencia y
luego vincularse al resto del programa después del ensamblaje).
Los compiladores como Aztec-C convirtieron todo al lenguaje ensamblador como una pasada
distinta y luego ensamblaron el código en una pasada distinta, y se destacaron por su código
muy eficiente y pequeño, pero en 1987 el optimizador integrado en Microsoft C era muy
bueno, y solo Las partes "críticas para la misión" de un programa generalmente se
consideraban para reescribir. De hecho, la programación en lenguaje C se había convertido en
el lenguaje de "nivel más bajo", con la programación convirtiéndose en una industria de
crecimiento multidisciplinario y los proyectos cada vez más grandes, con programadores
escribiendo interfaces de usuario e interfaces de base de datos en lenguajes de nivel superior,
y había una necesidad surgió para el desarrollo de idiomas cruzados que continúa hasta el día
de hoy.
Otro tipo de compilación cruzada para el que se utilizó Microsoft C durante este tiempo fue
en aplicaciones minoristas que requieren dispositivos de mano como el PDT3100 de Symbol
Technologies (utilizado para hacer inventario ), que proporciona una biblioteca de enlaces
dirigida a un lector de códigos de barras basado en 8088 . La aplicación se construyó en la
computadora host y luego se transfirió al dispositivo de mano (a través de un cable serial )
donde se ejecutó, similar a lo que se hace hoy para ese mismo mercado usando Windows
Mobile por compañías como Motorola , que compraron Symbol.
A lo largo de la década de 1990 y comenzando con MSC 6 (su primer compilador compatible
con ANSI C ), Microsoft volvió a enfocar sus compiladores de C en el mercado emergente de
Windows, y también en OS / 2 y en el desarrollo de programas GUI . La compatibilidad de
idiomas mixtos se mantuvo a través de MSC 6 en el lado de MS-DOS, pero la API para
Microsoft Windows 3.0 y 3.1 se escribió en MSC 6. MSC 6 también se extendió para brindar
soporte para ensamblados de 32 bits y soporte para Windows for Workgroups emergente y
Windows NT que formaría la base de Windows XP . Se introdujo una práctica de
programación llamada procesador para permitir el paso entre programas de 16 y 32 bits que
aprovechaban el enlace en tiempo de ejecución (enlace dinámico ) en lugar del enlace
estático que se favorecía en las aplicaciones monolíticas de MS-DOS de 16 bits. Algunos
desarrolladores de código nativo todavía prefieren el enlace estático, pero generalmente no
proporciona el grado de reutilización de código requerido por las mejores prácticas más
recientes, como el modelo de madurez de capacidad (CMM).
MSC asumió el control donde lo dejó Aztec C86 . La cuota de mercado de los compiladores de
C se había convertido en compiladores cruzados que aprovechaban las últimas y mejores
características de Windows, ofrecían C y C ++ en un solo paquete y seguían admitiendo
sistemas MS-DOS que ya tenían una década, y las empresas más pequeñas que Los
compiladores producidos como Aztec C ya no podían competir y se dirigieron a nichos de
mercado como los sistemas integrados o desaparecieron.
El soporte de generación de código de 16 bits y MS-DOS continuó hasta MSC 8.00c, que se
incluía con Microsoft C ++ y Microsoft Application Studio 1.5, el precursor de Microsoft Visual
Studio, que es el entorno de desarrollo cruzado que Microsoft ofrece en la actualidad.
MSC 12 se lanzó con Microsoft Visual Studio 6 y ya no proporcionó soporte para binarios de
16 bits de MS-DOS, sino que proporcionó soporte para aplicaciones de consola de 32 bits,
pero proporcionó soporte para la generación de código de Windows 95 y Windows 98 , así
como para Windows NT . Las bibliotecas de enlaces estaban disponibles para otros
procesadores que ejecutaban Microsoft Windows; una práctica que Microsoft continúa hasta
el día de hoy.
MSC 13 se lanzó con Visual Studio 2003 y MSC 14 se lanzó con Visual Studio 2005 , los cuales
todavía producen código para sistemas más antiguos como Windows 95, pero que producirán
código para varias plataformas de destino, incluido el mercado móvil y la arquitectura ARM .
En 2001, Microsoft desarrolló Common Language Runtime (CLR), que formó el núcleo de su
compilador .NET Framework en Visual Studio IDE. Esta capa del sistema operativo que se
encuentra en la API permite la combinación de lenguajes de desarrollo compilados en
plataformas que ejecutan el sistema operativo Windows.
El tiempo de ejecución de .NET Framework y CLR proporcionan una capa de mapeo a las
rutinas centrales para el procesador y los dispositivos en la computadora de destino. El
compilador C de la línea de comandos en Visual Studio compilará código nativo para una
variedad de procesadores y se puede usar para construir las rutinas centrales ellos mismos.
Las aplicaciones de Microsoft .NET para plataformas de destino como Windows Mobile en la
arquitectura ARM se compilan de forma cruzada en máquinas Windows con una variedad de
procesadores y Microsoft también ofrece emuladores y entornos de implementación remota
que requieren muy poca configuración, a diferencia de los compiladores cruzados de antaño
o en el futuro. otras plataformas.
Pascal libre
Free Pascal se desarrolló desde el principio como un compilador cruzado. El ejecutable del
compilador (ppcXXX donde XXX es una arquitectura de destino) es capaz de producir
ejecutables (o solo archivos de objeto si no existe un enlazador interno, o incluso solo
archivos de ensamblaje si no existe un ensamblador interno) para todos los sistemas
operativos de la misma arquitectura. Por ejemplo, ppc386 es capaz de producir ejecutables
para i386-linux, i386-win32, i386-go32v2 (DOS) y todos los demás sistemas operativos
(consulte [13] ). Sin embargo, para compilar en otra arquitectura, primero se debe construir
una versión de arquitectura cruzada del compilador. El ejecutable del compilador resultante
tendría 'ross' adicional antes de la arquitectura de destino en su nombre. es decir, si el
compilador está diseñado para apuntar a x64, entonces el ejecutable sería ppcrossx64.
Sonido metálico