Mostrando entradas con la etiqueta Programacion. Mostrar todas las entradas

[Java] Buenas prácticas en programación


1.- Evitar la creación innecesaria de objetos, Lazy Initialitation

La creación de objetos en Java es una de las operaciones mas costosas en términos de uso de memoria e impacto en el performance.  Esto es evitable creando o inicializando objetos solo en el momento en que serán requeridos en el código.

Código: Java
  1. public class Paises {
  2.  
  3.     private List paises;
  4.  
  5.     public List getPaises() {
  6.         //se inicializa solo cuando es requerido
  7.         if(null == paises) {
  8.             paises = new ArrayList();
  9.         }
  10.         return paises;
  11.     }
  12. }


2.- Nunca hacer variables de instancia públicas

Hacer una clase publica se puede ocasionar problemas en un programa.  Por ejemplo si tienes una clase MiCalendario. Esta clase contiene un arreglo de cadenas diasDeLaSemana.  Pero es una arreglo público y este puede ser accedido por cualquiera.  Tu asumes que este arreglo contiene siempre los 7 nombres de los días de la semana.  Alguien por error puede cambiar el valor e insertar un error!

Código: Java
  1. public class MiCalendario {
  2.    
  3.     public String[] diasDeLaSemana =
  4.         {"Domingo", "Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sábado"};
  5.    
  6.     //mas código
  7.    
  8. }


La mejor práctica es como mucho de ustedes saben, es siempre definir estas variables como privadas y crear los métodos accesores, “setters“ y “getters”

Código: Java
  1. private String[] diasDeLaSemana =
  2.     {"Domingo", "Lunes", "Martes", "Miercoles", "Jueves", "Sabado", "Domingo"};
  3.  
  4. public String[] getDiasDeLaSemana() {
  5.     return diasDeLaSemana;
  6. }


Pero escribir los métodos accesores no resuelve el problema del todo.  El arreglo sigue siendo accesible.  La mejor forma de hacerlo inmodificable es devolviendo un arreglo clonado en lugar del arreglo mismo.  Esto se logra modificando el método get de la siguiente forma.

Código: Java
  1. public String[] getDiasDeLaSemana() {
  2.     return diasDeLaSemana.clone();
  3. }


3.- Tratar siempre de minimizar la Mutabilidad de las clases

Hacer una clase inmutable es hacerla inmodificable.   La información de la clase se preservara durante el tiempo de vida de la clase.  Las clases inmutables son simples y fáciles de manejar.  Son “thread safe”.  Normalmente son los bloques para formar otros objetos mas grandes.

No obstante, crear objetos inmutables pueden golpear significativamente el rendimiento de una aplicación.  Así que elije cuidadosamente si quieres que una clase sea o no inmutable.  Trata siempre de tener clases pequeñas con el menor número de clases inmutables.

Para hacer una clase inmutable puedes definir sus constructor de forma privada y luego crear un método estático para inicializar al objeto y devolverlo.

Código: Java
  1. public class Empleado {
  2.  
  3.     private String primerNombre;
  4.     private String segundoNombre;
  5.    
  6.     // constructor private default
  7.     private Empleado (String primerNombre, String segundoNombre) {
  8.         this. primerNombre = primerNombre;
  9.         this. segundoNombre = segundoNombre;
  10.     }
  11.    
  12.     public static Empleado valueOf (String primerNombre, String segundoNombre) {
  13.         return new Empleado (primerNombre, segundoNombre);
  14.     }
  15. }


4.- Trata de usar mas las Interfaces sobre las Clases Abstractas

No es posible la herencia múltiple en Java, pero definitivamente puedes implementar múltiples interfaces.  Esto hace que cambiar la implementación de una clase existente sea fácil y que puedas implementar una o mas interfaces en lugar de cambiar la jerarquía completa de clases.

Pero si tu estás cien por ciento seguro de que métodos de una interface tendrás, entonces solo implementa esa interfaz.   Es bastante difícil agregar un nuevo método en una interfaz existente sin alterar todo el código que se está implementando.  Por el contrario un nuevo método puede ser fácilmente agregado en una clase abstracta sin alterar la funcionalidad existente.

5.- Limita siempre el alcance de una variable local

Las variables locales son grandiosas.  Pero algunas veces pueden insertar mas bugs durante el copiado y pegado de código viejo. Minimizar el alcance de una variable local hace que el código sea mas legible, menos propenso a errores  y mas mantenible.

Por lo tanto, debemos declarar variables justo antes de ser usadas.

Procura inicializar una variable desde su declaración.  Si eso no es posible asígnale el valor nulo.

6- Trata de usar librerías estándar en lugar de hacer las tuyas desde cero.

Escribir código es divertido.  Pero no reinventes la rueda.  Es bastante recomendable usar librerías estándar que ya han sido probadas, debugeadas y usadas por otros.    Esto no solo mejora la eficiencia de un programador sino que redice las posibilidades de tener errores en el código.  Además, usar una librería estándar  hace al código mas legible y mantenible.

Por ejemplo Google tiene liberada la nueva librería Google Collections que puede ser usada para agregar mas funcionalidad a tu código.

7.- Siempre que sea posible trata de usar tipos primitivos en lugar de las clases Wrapper

Las clases Wrapper son buenas, pero también son lentas.  Los tipos primitivos son como clases, sin embargo las clases wrapper almacenan la información completa acerca de una clase.

Algunas veces un programador puede agregar un error en el código usando una wrapper por un descuido.  Por ejemplo:

Código: Java
  1. int x = 10;
  2. int y = 10;
  3.  
  4. Integer x1 = new Integer(10);
  5. Integer y1 = new Integer(10);
  6.  
  7. System.out.println(x == y);
  8. System.out.println(x1 == y1);


El primer System.out.println imprimirá true mientras que el segundo imprimirá false.  El problema cuando comparas dos clases wrapper es que no se puede usar el operador ==, por que en realidad se están comparando referencias y no sus valores actuales.

Además si estás usando una clase wrapper no debes olvidar inicializarla.  Porque el valor por default de las variables wrapper es null.

Código: Java
  1. Boolean bandera = null;
  2.      
  3.         //mas código
  4.  
  5. if(flag == true) {
  6.     System.out.println("Se establece el valor de bandera ");
  7. } else {
  8.     System.out.println("No se establece el valor de bandera");
  9. }


El código lanzará un NullPointerException cuando se trate de comparar con true y el valor sea nulo si en el código intermedio no fue inicializada.

8.- Usa los Strings con mucho cuidado.

Usa siempre las cadenas con mucho cuidado en tu código.  Una simple concatenación de cadenas puede reducir el rendimiento de tu programa.  Por ejemplo si queremos concatenar cadenas usando el operador “+” en un ciclo for entonces todo el tiempo se estará creando un objeto String.  Esto afecta tanto a la memoria como al rendimiento.

Además en lugar de que instancies una objeto String no uses su constructor, sino que debes instanciarlo directamente. Por ejemplo:

Código: Java
  1. //instanciación lenta
  2. String lenta = new String("solo otro objeto string");
  3.  
  4. //instanciación rápida
  5. String rapida = "solo otro objeto string";


9.- Siempre regresa colecciones vacías en lugar de nulas

No importa que tu método regrese una colección o un arreglo, siempre asegúrate de que cuando sea necesario se regrese vacío y no nulo, en aquellos casos en los que no contendrá elementos porque la lógica de tu programa lo requiera.  Esto te ahorrará un montón de tiempo cuando hagas pruebas para valores nulos.

10.- El copiado defensivo es salvador

El copiado defensivo hace que los objetos creados estén libres de la mutación.  Por ejemplo en el código siguiente tenemos definida la clase Estudiante la cual a su vez tiene una variable con la fecha de nacimiento que es inicializada cuando el objeto es construido.

Código: Java
  1. public class Estudiante {
  2.     private Date fechaNacimiento;
  3.    
  4.     public Estudiante(fechaNacimiento) {
  5.         this. fechaNacimiento = fechaNacimiento;
  6.     }
  7.    
  8.     public Date getFechaNacimiento () {
  9.         return this.fechaNacimiento;
  10.     }
  11. }


Ahora podríamos tener el siguiente código que use al objeto Estudiante.

Código: Java
  1. public static void main(String []arg) {
  2.     Date fechaNacimiento = new Date();    
  3.     Estudiante estudiante = new Student(fechaNacimiento);
  4.     fechaNacimiento.setYear(2019);
  5.     System.out.println(estudiante.getFechaNacimiento ());
  6. }


En el código siguiente creamos tan solo al objeto Estudiante con algunas fechas de nacimiento por default.  Pero entonces cambiamos el valor de el año de nacimiento.  Después imprimimos el año de nacimiento, este año fue cambiado por 2019!

Para evitar estos casos, se puede utilizar el mecanismo defensivo copias. Cambie el constructor de la clase del estudiante a lo siguiente.

Código: Java
  1. public Estudiante(fechaNacimiento) {
  2.     this.fechaNacimiento = new Date(fechaNacimiento);
  3. }


Esto para asegurarnos de tener otra copia de la fecha de nacimiento que usamos en clase Estudiante.

11.-  Nunca dejes salir una excepción de un bloque finally

12.- Nunca lances "Exception" directamente.


Extraido de: viralpatel.net

Tabla periodica del HTML


Encontre esta tabla periodica de HTML y me parecio muy buena, ya que no solo nombra a todos los tags, sino que tambien da una referencia de cada uno de ellos


Taller de Python 3 #1

En este taller veremos las novedades sobre Python 3, que cosas nuevas e interesantes trae, que lo diferencia con Python 2, a demas conoceremos los depuradores que trae. Miraremos por arriba lo que es profiling, y de que manera usarlo para medir el rendimiento de la ejecucion de algun script programado en Python.

Este taller estara orientado a aquellas personas que no han visto jamas Python y tambien a aquellos que quieran pasar de Python 2 al 3



Taller de Python #2

 


Taller de Python #1


Introducción a Python

En este taller veremos Python desde cero. Empezaremos por descargar nuestro interprete e iremos avanzando en conocimientos hasta llegar a desarrollar nuestros propios programas.
Python es un lenguaje scripting por lo tanto se interpreta en lugar de compilarse, a diferencia de otros lenguajes que es necesario pasarlos a binarios para que puedan ejecutarse.
Es un lenguaje multiplataforma, ya que no solo se usa en Windows, sino que también se puede usar en Linux, MAC, etc.
Una de las ventajas es que es un lenguaje muy prolijo y entendible a la hora de programarlo y esto facilita la tarea de aprenderlo.
A lo largo de este taller, veremos lo potente e importante que puede ser saber Python.

Instalación

Windows de 32 o 64 bits?

Lo que primero debemos hacer, es saber si nuestro sistema operativo es de 32 o 64 bits. Para ello vamos a:

Inicio >> Panel de control >> Sistema
 
En mi caso estoy utilizando un sistema operativo de 32 bits.
Lo que necesitaremos para poder programar en este lenguaje, será un editor de texto y el interprete de Python.
Con respecto al editor de texto, pueden utilizar cualquiera que les agrade o les resulte cómodo, yo utilizare Sublime Text 2

Y al intérprete de Python

Instalación en Windows

En la pagina del interprete, podremos ver lo siguiente: 

NOTA: Usaremos por ahora Python 2.x debido a que es la versión estable. Mas adelante, veremos algo de Python 3.x

Una vez descargado, ejecutamos el MSI que descargamos


Es muy importante saber la ruta en donde se instalara. Yo les recomiendo dejarla en donde viene por defecto que es en C:\Python27\
Damos en Next y continuamos la instalación hasta que finalice

Ahora abrimos una consola:
INICIO > EJECUTAR > COMMAND (En Windows 95,98)
INICIO > EJECUTAR > CMD  (En Windows XP)
INICIO > EN LA BARRA BUSCAR > CMD (En Windows Vista y 7)
Y dentro de la consola escribimos python, lo mas probable, es que les aparezca el siguiente error:

"python" no se reconoce como un comando interno o externo, programa o archivo por lotes ejecutable.

Esto se debe a que no esta añadido en las variables de entorno, asique tipeamos lo siguiente:
PATH C:\Python27;%PATH%

Presionamos enter, cerramos la consola y la volvemos a abrir… Ahora si tipeamos python, debería aparecernos algo como esto:


Esto nos indica que lo hemos hecho bien, y ya podemos comenzar a programar.

Instalación en Linux

La instalacion en Linux es mucho mas facil… abrimos una consola (CTRL + ALT + T) y tipeamos:
sudo apt-get install python
Y esto nos instalara Python en linux.
Luego al comienzo de cada script, debemos añadir la linea:
#! /usr/bin/pyhton27
Para que el intérprete busque ahí las librerías.

Primeros pasos en Python 

Comenzaremos con programas básicos. Como dijimos en la introducción, Python es un lenguaje scripting ya que no es necesario compilarlo para poder ver el programa en funcionamiento.
Dentro de la consola, pondremos 5+7 y veremos lo que pasa

 

Rápidamente nos hará el cálculo.
Python se caracteriza por ser una potente calculadora. Es por eso que ahora probaremos con algo más avanzado.
En la consola pondremos 56+28-34*6
 

Ahora también podemos trabajar con variables, asignándoles algún valor.
Podemos probar con X=7
Seguido a esto colocamos 105*X


Hasta el momento se ve muy fácil y básico, aunque también muy tedioso ya que tipear comandos desde la consola no es muy gustoso, es por eso que ahora armaremos nuestro primer script.

Operadores Aritmeticos

 A continuación veremos los operadores que se suelen utilizar con frecuencia en Python.

 

Nuestro Primer Script

Abrimos nuestro editor de texto y haremos el famoso "Hola Mundo"
Dentro del editor pondremos:
print "Hola Mundo"


La sintaxis print sirve para mostrar una cadena de valores en pantalla. Un poco mas adelante lo veremos mas en detalle.
Ahora lo guardamos (CTRL + S) o (File >>Save As..), lo guardamos con extension *.py y nos aseguramos que en tipo de archivo diga “All Files (*.*)”

 

Y ahora lo correremos nuestro script desde la consola.
Es importante saber en donde guardamos nuestro script, yo lo hice en el escritorio, asique desde la consola, debemos pararnos en el directorio en donde esta guardado y tipeamos
python taller1.py
 
Y nos muestra nuestro Hola mundo…

Variables

Las variables en Python pueden estar formadas por letras o números, pero siempre deben comenzar con letras o un guion bajo. Algo a tener en cuenta, es que este lenguaje es sensible a mayúsculas y minúsculas. Es decir, para el intérprete no es lo mismo "A" que "a".

Las variables en Python pueden ser de tipo:

Numerica:

Enteros (Ej: 7) Son números positivos y negativos, que no poseen decimales.
Dentro de los enteros, tenemos dos tipos, Cortos (int) o Largos (long) expresados de la siguiente forma:
Entero_corto = 7
Entero_largo = 7L
Flotante (Ej: 7,9) Son todos números reales que posean decimales y se representan como (float)
Flotante = 1.345
Compleja o imaginaria (Ej: 2+3i) Son aquellos que poseen una parte real y otra imaginaria y se representan como (complex)
Imag = 4.3 + 7i
Cadenas de Texto: (Ej: "ANTRAX"), las cadenas de texto es simplemente texto y pueden estar entre comillas dobles o simples
Ej1 = "ANTRAX"
Ej2 = 'ANTRAX'
Booleano: True, False (Verdadero o Falso), Estos dos son muy utilizados en bucles o condiciones.

Concatenaciones

Como vimos antes, es posible sumar, restar, multiplicar, dividir, etc… Pero no solo se hace con números sino que también con letras, palabras y variables.
Realizaremos el siguiente ejemplo:

Como resultado tendremos


Ya que sumo las dos cadenas de texto, la del Hola y X que tenia almacenado otra cadena de texto.
Otra forma de concatenar dos cadenas de texto seria:
print "Hola" + "underc0de"
Y con eso obtendremos el mismo resultado que la forma anterior.
Ahora veremos un ejemplo un poco más complejo, en donde concatenaremos números, variables y cadenas de texto

Explico rápidamente, guarde mi nick en la variable a, luego en el print, lo que hice fue mostrar la cadena de texto "hola" concatenado con la variable "a" que es mi Nick, hasta aquí tenemos "hola ANTRAX" luego lo concatene con "el resultado de 145 + 34 es" y hasta aquí tendríamos "hola ANTRAX el resultado de 145 + 34 es" finalmente para concatenar con números, es necesario colocar una coma. Aquí lo que hace es resolver la suma algebraica de 145+34 y como resultado final tenemos:

 Comentarios

 Los comentarios sirven para ayudar a entender el código, para explicar una función o simplemente agregar algún texto.
Es importante saber que estos comentarios no son ejecutados a la hora de correr el programa. Para colocar un comentario, solo basta con poner el carácter numeral, seguido del comentario. Ejemplo:
#esto es un comentario
Aquí lo mostrare en el editor de texto:


Los comentarios suelen ser útiles a la hora de hacer publico un script, de esta forma, la persona que lo lea pueda entender mejor que hace cada función del código.

Python desde Android

Como parte extra de este taller, les enseñare a instalar Pythonen algún dispositivo móvil con Android, para que puedan programar desde el.
Lo que necesitamos descargar el ultimo APK del SL4a. Actualmente la última versión es la r6.
Instalamos como cualquier apk de android y lo abrimos.

 Presionamos en View
 Entramos a Interpreters

Y agregamos a Python… A demás de python, como podrán ver, pueden agregar Perl, Ruby, PHP entre otros

 Al presionar sobre Python, lo comienza a descargar

 
 Luego lo instalamos
 

Esto suele demorar algunos minutos en descargar los módulos y librerías


Una vez que termine, veremos algo como esto


 Volvemos a abrir SL4a y podremos ver scripts de muestra hechos en Python


Finalmente clickeando sobre alguno de ellos, tendremos la opción de editarlos o ejecutarlos.

Ejercitacion

1.- Realizar un código que concatene 3 variables, de las cuales 2 sean numéricas.
El usuario X lleva Y días y Z horas conectado
2.- Realizar un código para cada uno de los siguientes ejercicios. Cada número debe ser una variable
a. 273 * 4 + 97 * 5 – 1200 / 6
b. 1470 / 5 + 400 * 2 - 49**2
c. 15**5 / 50 – 37 * 4
Todos los resultados deben mostrarse de la siguiente forma:
El resultado es:

Emulador EMU8086

El Emulador EMU8086 es el primer programa que se utiliza en el curso de Microprocesadores que imparte la Universidad Don Bosco; se ha elegido este emulador porque posee una interfaz de usuario muy amistosa que permite familiarizarse con los fundamentos de la programación en lenguaje ensamblador de forma muy intuitiva, aparte de eso brinda una serie de recursos para ejecutar y depurar los programas. También tiene algunas desventajas como el de no soportar algunas de las interrupciones más interesantes que posee el sistema operativo y tampoco puede acceder a los puertos físicos (reales), sino que los emula usando otros programas que ya están incluidos en su respectiva carpeta.
Para iniciar se debe ejecutar el archivos EMU886.exe, que se encuentra en la carpeta del mismo nombre, en el directorio raíz; seguramente en la computadora donde corra el programa tendrá otras alternativas para activar el programa, como un acceso directo en el escritorio o en el menú de programas del sistema operativo.
Si está ejecutando la versión 4.05 del EMU8086 observará primero la pantalla de
Bienvenida (welcome), similar a la que se muestra en la Figura 1

 Figura 1. Pantalla de bienvenida del emulador EMU8086.
Se presentan cuatro diferentes opciones para elegir: 

• New : Le permite escribir un nuevo código en lenguaje ensamblador (al que
Llamaremos “Código Fuente” y tendrá extensión .ASM)

• Code examples: Le permite acceder a una serie de programas ejemplos que
pueden ayudarle a comprender funciones más complejas.

• Quick star tutor : activa un conjunto de documentos de ayuda, se recomienda
revisarlos frecuentemente en caso de dudas.

• Recent file : Le muestra los últimos archivos que se trabajaron en la máquina.
Para continuar este primer contacto con el emulador, seleccioneNew. Observará una
nueva caja de dialogo “choose code template”, como se muestra en la Figura 2

Figura 2. Caja de dialogo para seleccionar el tipo plantilla (template).
En ella se le presentan seis opciones, cuatro que le permiten usar plantillas predefinidas con algunos de los tipo de archivo que se pueden crear en lenguaje ensamblador: COM template, EXE template, BIN template y BOOT template (cada uno le permite diferentes características que se abordaran a su debido tiempo en el curso). Dos que le permiten usar un espacio vacío “empty workspace” (sin una plantilla) o activar el emulador mismo. Selecciones la opción del espacio vacío. Observará la ventana de edición o mejor dicho el Entorno de Desarrollo Integrado (Integrated Development Environme IDE), como se muestra en la Figura 3, donde escribirá sus archivos fuentes en lenguaje ensamblador, por favor lo confunda con el lenguaje de máquina.
Podrá ver una barra de menú de Windows con sus opciones file, edit, etc. pero también vera unas opciones poco usuales como assembler, emulator, etc. propias del emulador. También vera una serie de botones que le permitirán crear un nuevo archivo (new), abrir un archivo que ya existe (open), abrir un ejemplo (examples), compilar un archivo fuente (compile), emular un archivo ejecutable (emulate) y otras opciones que ira descubriendo a medida que se familiarice con el programa. 

Figura 3. Ventana de edición o Entorno de Desarrollo Integrado IDE del EMU8086.
Bueno, es el momento de estudiar nuestro primer programa en lenguaje ensamblador, el cual imprime en pantalla algunas cadenas de texto. Para comprender mejor como funciona revise primero la Figura 4, donde se presenta un diagrama de flujo.


Figura 4. Diagrama de Flujo del ejemplo.
Ahora observe la Tabla 1 donde aparece el código fuente escrito en lenguaje
Ensamblador. Por favor note que el programa está compuesto de diferentes bloques

Tabla 1. Programa en lenguaje ensamblador.
Directivas de pre proceso: Le indican al compilador que debe realizar una serie de acciones particulares en el momento de convertir el archivo fuente (ASM) en archivo objeto (OBJ). 

Segmento de Datos: Donde se declaran las variables y constantes que el programa va a utilizar. 

Segmento de Código: Donde especifica lo que deseamos que el programa haga. Para especificarlo se pueden usar: instrucciones (propias del microprocsador), Macro-instrucciones (similar a los comandos de los lenguajes de alto nivel) y procedimientos (similar a las funciones definidas por el usuario de los lenguajes de alto nivel). 

Segmento de PILA o STACK: bloque de memoria donde almacenan datos intermedios que se generan durante la ejecución de un programa. En este no se declaran variables o constantes como en el segmento de datos, sino que se administra como una memoria LIFO, el último en entrar es el primero en salir. 

Directiva que indica el fin del archivo, cualquier instrucción posterior a esta línea Será ignorada. 

Digite el código en el IDE, note como se le asignan diferentes colores a las líneas, dependiendo si son instrucciones, macro-instrucciones, comentarios, cadenas de texto (formato ASCII), directivas, etc. 

Al terminar de digitar el código salve el archivo usando como nombre su número de carnet (8 caracteres) y con extensión ASM (ensamblador). 

Presione el botón “compile” para convertir el archivo fuente (ASM) en ejecutable (lenguaje de máquina), debe aclararse que al compilar solo se crea un archivo objeto que no es ejecutable, se necesita de otro proceso, el enlazado (LINK), para lograr que el archivo objeto se convierta en ejecutable (EXE), pero por facilidad el emulador realiza los dos procesos de forma secuencial al presionar el botón “compile”. 

Mientras se realiza la compilación y enlazado se abre un ventana llamada “assembler status” que le informa sobre los resultados del proceso. Si el resultado es exitoso observará un mensaje como el de la Figura 5. 

Figura 5. Estado del proceso de compilación.
Luego se le pedirá que salve el archivo EXE, por defecto se le asigna el mismo nombre del archivo fuente, pero usted puede elegir otro, siempre de 8 caracteres máximo, use el nombre por defecto, Si existe algún problema (error de sintaxis u otros) en la ventana “assembler status” se le indican las líneas donde están los errores, para hacer las correcciones cierre la ventana “assembler status” y corrija el archivo fuente, que se encuentra en el IDE e intente compilar nuevamente. 

Volviendo al caso de no tener errores, la ventana “assembler status” le muestra diferentes opciones como revisar algunos de los archivos complementarios que se crearon en el proceso de compilación y enlazado (opción view), puede ejecutar el archivo usando el programa DEBUG (opción external). Esta es otra herramienta que se estudiará más adelante en el curso, puede ejecutar directamente el archive EXE (RUN) o puede cerrar la ventana (close). Seleccione esta opción. 

Emule el archivo EXE presionando el botón “emulate”. Notará que se abren dos ventanas: Una llamada “emulator” en la que podrá monitorear la mayoría de procesos al ejecutar el programa y otra llamada “original sourse code” que muestra el código fuente del archivo, esta ventana es diferente de la que observa en el IDE porque en ésta podrá observar cual instrucción esta a punto de ejecutarse, es ideal al corre programas pasos a paso. 

Ahora observe con más detenimiento la ventana llamada “emulator” Figura 6, ésta será la que más utilice a la hora de ejecutar las prácticas de laboratorio, por lo que es importante que la conozca y maneje de forma efectiva. 

Figura 6. Ventana del Emulador.
En la parte superior tiene una barra de herramientas con las siguientes opciones:

File, permite administrar (cargar o salvar) los archivos que va creando o ejecutando
Math, da acceso a una calculadora y un convertidor de basas de numeración.
Debug, provee herramientas para depurar programas.
View, permite abrir otras ventanas que pueden ser de mucha ayuda al ejecutar o depurar programas.
External, permite ejecutar el programa con otras herramientas diferentes del
EMU8086.

Virtual devices, activa los dispositivos virtuales con que cuenta el programa, dado que se trata de un emulador no se tiene acceso a los puertos físicos de la computadora, por lo que estos son simulados.

Virtual drive, da opciones para administrar las unidades virtuales de almacenamiento (HDD y FDD virtuales).

Help, activa la herramienta de ayuda.
Bajo la barra de herramientas hay cinco botones que le permiten:

Load, carga un archivo ejecutable EXE, COM, etc. que ya existe.
Reload, recarga (inicializa los registros) para ejecutar nuevamente un programa que acaba de ser corrido.

Single step, ejecuta solamente una instrucción o macroinstrucción (paso a paso).

Step back, retrocede una instrucción que ya fue ejecutada (función muy útil al depurar un programa)

Run, ejecuta un programa en su totalidad o hasta presionar el botón “STOP”.
Vale la pena hacer notar que también es posible, en la opción DEBUG, insertar un “break point” cuando se está depurando programas.

La parte media está dividida en tres partes:
Parte izquierda denominada “registers”, donde se puede monitorear el contenido de los registros del microprocesador.

Parte central, donde se puede observar el contenido de la memoria desde donde se está ejecutando el programa. Primero se notan las direcciones del bloque de memoria que se visualiza, estas direcciones de dan en un formato llamado físico o absoluto (existe otro formato para las direcciones) dado por cinco cifras hexadecimales (20 bits) lo que indica que en este bus de direcciones se puede direccional desde la dirección00000h (dirección 0) hasta la direcciónFFFFFh (dirección 148575). Luego se indica el contenido de cada palabra (cada una de 1 byte), por facilidad el contenido se presenta en hexadecimal, decimal e
interpretado como un carácter ASCII.

Parte derecha, donde puede observar el contenido de la memoria, pero esta vez no se detalla con direcciones específicas, sino que cada bloque de datos es interpretado como un conjunto de instrucciones (lo que llamaremos programa DESENSAMBLADO) que el microprocesador deberá ejecutar. Es importante mencionar que algunas instrucciones se expresan solo con un byte, pero otras necesitan varios bytes para ser expresadas


Parte inferior, contiene una serie de botones que permiten un acceso rápido a una serie de ventanas auxiliares, algunas de las cuales se puede activar también en la barra de herramientas con la opción “view”
Regresando a la estructura del programa estudiemos el Segmento de Datos: Puede observar que se hab declarado tres cadenas de datos llamadas frase, frase_2 y línea; note que luego del nombre de la cadena de ha incluido la directiva db (definir byte) que indica al compilador que ese es el tipo de datos que contendrá la cadena. A parte de eso en las primeras dos cadenas se han usado comillas simples para definir el contenido, eso indica al compilador que el texto debe ser interpretado como caracteres ASCII. En el caso de la última cadena los datos no están entre comillas, lo que indica que serán interpretados como datos hexadecimales.
Para ejecutar el programa presione el botón RUN: note que automáticamente se activo la ventana “emulator screen” en la que se pueden observar dos textos impresos, que corresponden la frase y frase_2. Vamos a estudiar más detenidamente la ejecución del programa.
Cierre la ventana “emulator screen”
Prepare el programa para ser ejecutado nuevamente presionando el botón “reload”.
Observe la ventana “original sourse code”, parece que es una copia fiel del código fuente que digito en el IDE (en la Figura 7 puede ver una comparación entre las dos ventanas), pero la primera línea de código está marcada de color amarillo, esto indica que es la primera que se ejecutará al correr el programa.

Figura 7. Comparación entre las ventanas de edición y código fuente.

Si observe la ventana “emulator” (Figura 6), se ha marcado un bloque de bytes almacenados en memoria, precisamente los de las direcciones físicas 07120h, 07121h y 07122h que contiene los datos B8h (que equivalea 184d y al carácter ASCII ‘©’), los otros datos son 10h y 07h.

Los tres juntos equivalen, en lenguaje de máquina, a la MOV AX, @DATA, que ya desensamblada se transforma en mov AX, 0710h, Aparece marcada porque será la primera en ejecutarse.
Un detalle importante es la sustitución de la expresión @DATA por un valor numérico, esta sustitución es producto de la compilación del código fuente que sustituye las etiquetas y nombres de variables por direcciones físicas de memoria.
Presione el botón “single step” note que se ha avanzado una sola línea, dado que se ejecuta una única instrucción, También se han dado cambios en los registros del microprocesador, pero éstos se analizarán en la primera guía de laboratorio. Ejecute la siguiente instrucción, de igual manera se avanzó solo un paso.
Ahora la línea marcada no es de color azul, sino negra, en este caso indica que se trata de una Macroinstrucción, que contiene un conjunto completo de instrucciones que se ejecutan en bloque. 

La lógica de esta estructura tiene varias formas de utilización, en este caso se asemejan a formas que ya aplicó programando en alto nivel, invoca a una función predefinida en una librería o biblioteca (printf o putchar) y para hacerlo, al inicio tiene que colocar una sentencia #include.
Como su nombre lo indica la macroinstrucción imprime una cadena de texto en la pantalla. Esta cadena se especifica pasándole un parámetro a la función, la palabra “frase”. 
Presione nuevamente “single step” observe que en la ventana “emulator” si se ha avanzado en “original sourse code” y no se avanzará hasta ejecutar todas las instrucciones que conforman la macroinstrucción.
Presione tres veces “single step” se activará de forma automática la ventana “emulator screen” e imprimiendo el texto de la cadena frase, note que el signo de dólar “$” final no se ha impreso. 
Presione nuevamente “single step” y se marca la siguiente macroinstrucción, que imprimirá la cadena “línea”. 
Esta cadena no se declarado de la misma forma que las otras, pero aun así se imprime, un detalle importante es que al final de esta cadena se encuentra el dato 24h que corresponde al código ASCII del signo de dólar.
Presione cinco veces “single step” con esto ha bajado el cursor a la siguiente línea,
como si hubiera presionado ENTER en un editor de texto.
Presione cinco veces “single step” para imprimir la cadena “frase_2”
Ahora aparece marcada una línea de instrucción (recuerde el color azul). Analicemos su estructura, La estructura sintáctica de las líneas de instrucción está formada por elementos llamados campos, dependiendo la instrucción específica se puede tener uno o varios campos.
Primer campo se le llama código de operación e indica que es lo deseamos que realice el microprocesador, básicamente nos referimos a la instrucción en misma. 

Este no puede faltar en una línea de instrucción
Segundo y tercer campo se les llama 1º operando y 2º operando campo. Si solo existe el 1º operando indica que la instrucción se ejecutará ese dato (el dato en cuestión puede declararse de forma explícita o estar almacenado en un registro del micro o en alguna localidad de memoria). En caso de existir los dos operandos implica que el 2º operando es la fuente donde está el dato que se procesará y el 1º operando es el destino donde se almacenará el resultado de ejecutar la instrucción.
Tomando como ejemplo la instrucción que en este momento está marcada: 
MOV AX, 4C00h 
Se entiende que MOV es el código de operación e indica que un dato se moverá (en realidad se copiará porque la fuente conservará el dato). Por tener tres campos en esta línea de instrucción el 1º operando es el destino donde se copiará el dato (en este caso el registro Acumulador AX del microprocesador) y el 2º operando es el dato que será movido (en este caso el número hexadecimal 4C00h)

Ejecute la instrucción, note que efectivamente el dato se copió en el registro, lo que puede verificar en la ventana “emulator”
La última línea del código usa la instrucción INT (de interrupción) que es otra forma particular de invocar una función definida previamente, en este caso para terminar el programa y regresar el control del microprocesador al sistema operativo, de forma similar a la sentencia return(0) que se usa en lenguaje C. 
Para visualizar de forma más clara el proceso para imprimir la cadena “línea” edite en el IDE el código fuente, eliminando de el dato 0Dh. Luego de esto realice las acciones listadas anteriormente para crear un nuevo archivo ejecutable. 
Ejecute el programa paso a paso y note coma cambian los mensajes en la pantalla. 
Cambie la cadena, pero ahora solo elimine el 0Ah verifique como afectan los cambios
en la ejecución. 
¿Cuál es la función individual de los datos 0Ah y 0Dh en el programa?
¿Cuál es la relación de estos y el código ASCII? 
Para terminar este primer acercamiento con el EMU8086 es importante mostrarle una de las ventanas más útiles del emulador la ventana de “variables”, es muy similar a la herramienta match del lenguaje C en la que usted podía monitorear el estado de las variables declaradas a medida que el programa se va desarrollando.

Recargue el programa y cierre la venta “emulator screen”. Usando los botones de la parte inferior del “emulator” active la ventana denominada “var”. Observará que están listadas las tres variables declaradas al inicio del archivo fuente como se muestra en la Figura 8a.
Note que aparece marcada la variable frase e indica que su contenido es 48 hexadecimal (indicado por la casilla llamada “show as”), pero sabemos que esta variable contiene más datos, para poder verlos todos juntos, cambien el datos en la casilla “elements” de 1 a 7, observará una serie de datos hexadecimales. Puede cambiar la representación a datos ASCII cambiando la opción en la casilla “show as” y verificar que efectivamente es el contenido de la cadena “frase”, Figura 8b. Si durante la ejecución del programa el contenido de la cadena cambia en esta ventana podrá observarlo.
Marque la segunda variable llamada “frase_2” observe la información, se le indica que el contiene el dato 53h, cambie la representación de datos a ASCII y la cantidad de elementos de 1 a 8, debería observas la misma información que ve en la Figura 8c.
Ahora marque la tercera variable “línea”, el contenido es 0Ah, cambie a representación ASCII y 3 elementos, debería observas la misma información que ve en la Figura 8d. 

Bueno con estas ideas básicas podrá iniciar el estudio de la programación en lenguaje ensamblador apoyándose en los recursos que le brinda el EMU8086, adelante

Figura 8. Ventana auxiliar para monitorear el contenido de las variables declaradas