Sei sulla pagina 1di 5

Compilación JIT

En informática, la compilación en tiempo de ejecución (también conocida por


sus siglas inglesas, JIT, just-in-time), también conocida como traducción
dinámica, es una técnica para mejorar el rendimiento de sistemas de
programación que compilan a bytecode, consistente en traducir el bytecode a
código máquina nativo en tiempo de ejecución. La compilación en tiempo de
ejecución se construye a partir de dos ideas anteriores relacionadas con los
entornos de ejecución: la compilación a bytecode y la compilación dinámica.

En un sistema que use compilación a bytecode como por ejemplo Smalltalk, Perl,
GNU CLISP o las primeras versiones de Java, el código fuente es traducido a un
código intermedio llamado bytecode. El bytecode no es el código máquina de
ninguna computadora en particular, y puede por tanto ser portable entre diferentes
arquitecturas. El bytecode es entonces interpretado, o ejecutado por una máquina
virtual.

Un entorno con compilación dinámica es aquél en el que el compilador puede ser


usado durante la ejecución. Por ejemplo, la mayoría de los sistemas Commons Lisp
tienen una función compile que permite compilar nuevas funciones creadas durante
la ejecución del programa. Aunque ventajoso en la depuración interactiva, la
compilación dinámica es menos útil en un sistema en explotación desatendido. Ese
método es más común en emuladores modernos y frecuentemente comerciales que
requieren mucha velocidad, como el Qemu y el VirtualPC (PC) o el Executor
(Macintosh 68k).

En un entorno de compilación en tiempo de ejecución, la compilación a bytecode es


el primer paso, reduciendo el código fuente a una representación intermedia
portable y optimizable. El bytecode se despliega en el sistema de destino. Cuando
dicho código se ejecuta, el compilador en tiempo de ejecución lo traduce a código
máquina nativo. Esto puede realizarse a nivel de fichero (programa) o de funciones,
compilándose en este último caso el código correspondiente a una función justo
cuando va a ejecutarse (de aquí el nombre de just-in-time, «justo a tiempo»).

El objetivo es combinar muchas de las ventajas de la compilación a código nativo y


a bytecode: la mayoría del «trabajo pesado» de procesar el código fuente original y
realizar optimizaciones básicas se realiza en el momento de compilar a bytecode,
mucho antes del despliegue: así, la compilación a código máquina del programa
resulta mucho más rápida que partiendo del código fuente. El bytecode desplegado
es portable, a diferencia del código máquina para cualquier arquitectura concreta.
Los compiladores dinámicos son más fáciles de escribir, pues el compilador a
bytecode ya realiza buena parte del trabajo.
Bytecode

Es un código intermedio más abstracto que el código máquina. Habitualmente es


tratado como un fichero binario que contiene un programa ejecutable similar a un
módulo objeto, que es un fichero binario producido por el compilador cuyo
contenido es el código objeto o código máquina .

El bytecode recibe su nombre porque usualmente cada código de operación tiene


una longitud de un byte, si bien la longitud del código de las instrucciones varía.
Cada instrucción tiene un código de operación entre 0 y 255 seguido de parámetros
tales como los registros o las direcciones de memoria. Esta sería la descripción de
un caso típico, si bien la especificación del bytecode depende ampliamente del
lenguaje.

Como código intermedio, se trata de una forma de salida utilizada por los
implementadores de lenguajes para reducir la dependencia respecto del hardware
específico y facilitar la interpretación. Menos frecuentemente se utiliza el bytecode
como código intermedio en un compilador. Algunos sistemas, llamados traductores
dinámicos o compiladores just-in-time traducen el bytecode a código máquina
inmediatamente antes de su ejecución para mejorar la velocidad de ejecución.

Los programas en bytecode suelen ser interpretados por un intérprete de bytecode


(en general llamado máquina virtual, dado que es análogo a un ordenador). Su
ventaja es su portabilidad: el mismo código binario puede ser ejecutado en
diferentes plataformas y arquitecturas. Es la misma ventaja que presentan los
lenguajes interpretados. Sin embargo, como el bytecode es en general menos
abstracto, más compacto y más orientado a la máquina que un programa pensado
para su modificación por humanos, su rendimiento suele ser mejor que el de los
lenguajes interpretados. A causa de esa mejora en el rendimiento, muchos
lenguajes interpretados, de hecho, se compilan para convertirlos en bytecode y
después son ejecutados por un intérprete de bytecode. Entre esos lenguajes se
encuentran Perl, PHP y Python. El código Java se suele trasmitir como bytecode a la
máquina receptora, que utiliza un compilador just-in-time para traducir el bytecode
en código máquina antes de su ejecución.

Son asimismo interesantes los denominados p-Codes, similares a bytecodes pero


cuyos códigos de operación pueden constar de más de un byte y pueden ser
variables en tamaño, como los opcodes de muchas CPUs. Estos códigos trabajan a
muy alto nivel, incluyendo instrucciones del estilo de «imprime esta cadena» o
«borra la pantalla». Por ejemplo, BASIC utiliza p-Codes.
Programación Estructurada
La programación estructurada es una forma de escribir programas de ordenador
(programación de computadora) de forma clara. Para ello utiliza únicamente tres
estructuras: secuencia, selección e iteración; siendo innecesario y no permitiéndose
el uso de la instrucción o instrucciones de transferencia incondicional (GOTO, EXIT
FUNCTION, EXIT SUB o múltiples RETURN).

Hoy en día las aplicaciones informáticas son mucho más ambiciosas que las
necesidades de programación existentes en los años 1960, principalmente debido a
las aplicaciones gráficas, por lo que las técnicas de programación estructurada no
son suficientes. Ello ha llevado al desarrollo de nuevas técnicas, tales como la
programación orientada a objetos y el desarrollo de entornos de programación que
facilitan la programación de grandes aplicaciones.

Orígenes de la programación estructurada

A finales de los años 1960 surgió una nueva forma de programar que no solamente
daba lugar a programas fiables y eficientes, sino que además estaban escritos de
manera que facilitaba su comprensión posterior.

El teorema del programa estructurado, demostrado por Böhm-Jacopini, demuestra


que todo programa puede escribirse utilizando únicamente las tres instrucciones de
control siguientes:

• Secuencia
• Instrucción condicional
• Iteración (bucle de instrucciones) con condición al principio

Solamente con estas tres estructuras se pueden escribir todos los programas
(programas) y aplicaciones posibles. Si bien los lenguajes de programación tienen
un mayor repertorio de estructuras de control, éstas pueden ser construidas
mediante las tres básicas.

Ventajas de la programación estructurada

Con la programación estructurada, elaborar programas de computador sigue siendo


una labor que exige esfuerzo, creatividad, habilidad y cuidado. Sin embargo, con
este estilo podemos obtener las siguientes ventajas:

1. Los programas son más fáciles de entender, ya que pueden ser leídos de
forma secuencial, sin necesidad de hacer seguimiento a saltos de línea
(GOTO) dentro de los bloques de código para entender la lógica.
2. La estructura del programa es clara, puesto que las instrucciones están más
ligadas o relacionadas entre sí.
3. Reducción del esfuerzo en las pruebas. El seguimiento de los fallos o errores
del programa ("debugging") se facilita debido a la estructura más visible, por
lo que los errores se pueden detectar y corregir más fácilmente.
4. Reducción de los costes de mantenimiento de los programas.
5. Programas más sencillos y más rápidos (ya que es más fácil su optimización).
6. Los bloques de código son auto explicativos, lo que facilita la documentación.
7. Los GOTO se reservan para construir las instrucciones básicas. Aunque no se
usan de forma directa, por estar prohibida su utilización, están incluidas
implícitamente en las instrucciones de selección e iteración.
8. Un programa escrito de acuerdo a estos principios no solamente tendrá una
mejor estructura sino también una excelente presentación.
9. La programación estructurada ofrece estos beneficios, pero no se la debe
considerar como una panacea ya que el desarrollo de programas es,
principalmente, una tarea de dedicación, esfuerzo y creatividad.

Inconvenientes de la programación estructurada

El principal inconveniente de este método de programación es que se obtiene un


único bloque de programa, que cuando se hace demasiado grande puede resultar
problemático su manejo; esto se resuelve empleando la programación modular,
definiendo módulos interdependientes programados y compilados por separado (en
realidad esto no es necesario, pero así ha sido históricamente). Un método un poco
más sofisticado es la programación por capas, en la que los módulos tienen una
estructura jerárquica en la que se pueden definir funciones dentro de funciones o de
procedimientos.

Programación orientada a objetos


La Programación Orientada a Objetos (POO u OOP según sus siglas en inglés) es un
paradigma de programación que usa objetos y sus interacciones para diseñar
aplicaciones y programas de computadora. Está basado en varias técnicas,
incluyendo herencia, modularidad, polimorfismo y encapsulamiento. Su uso se
popularizó a principios de la década de 1990. Actualmente son muchos los
lenguajes de programación que soportan la orientación a objetos.

Origen

Los conceptos de la programación orientada a objetos tienen origen en Simula 67,


un lenguaje diseñado para hacer simulaciones, creado por Ole-Johan Dahl y Kristen
Nygaard del Centro de Cómputo Noruego en Oslo. Al parecer, en este centro,
trabajaban en simulaciones de naves, y fueron confundidos por la explosión
combinatoria de cómo las diversas cualidades de diversas naves podían afectar
unas a las otras. La idea ocurrió para agrupar los diversos tipos de naves en
diversas clases de objetos, siendo responsable cada clase de objetos de definir sus
propios datos y comportamiento. Fueron refinados más tarde en Smalltalk, que fue
desarrollado en Simula en Xerox PARC (y cuya primera versión fue escrita sobre
Basic) pero diseñado para ser un sistema completamente dinámico en el cual los
objetos se podrían crear y modificar "en marcha" en lugar de tener un sistema
basado en programas estáticos.

Resumen

Es un paradigma que utiliza objetos como elementos fundamentales en la


construcción de la solución. Surge en los años 70. Un objeto es una abstracción de
algún hecho o cosa del mundo real que tiene atributos que representan sus
características o propiedades y métodos que representan su comportamiento o
acciones que realizan. Todas las propiedades y métodos comunes a los objetos se
encapsulan o se agrupan en clases. ¨Una clase es una plantilla o un prototipo para
crear objetos, por eso se dice que los objetos son instancias de clases. Lenguaje de
programación: C++, Java, C#, VB.Net, etc.

Diferencias entre la programación estructurada y la


orientada a objetos son:
• La programación orientada a objetos es más moderna, es una evolución de la
programación estructurada que plasma en el diseño de una familia de
lenguajes conceptos que existían previamente con algunos nuevos.

• La programación orientada a objetos se basa en lenguajes que soportan


sintáctica y semánticamente la unión entre los tipos abstractos de datos y
sus operaciones (a esta unión se la suele llamar clase).

• La programación orientada a objetos incorpora en su entorno de ejecución


mecanismos tales como el polimorfismo y el envío de mensajes entre objetos.

Potrebbero piacerti anche