UNIDAD III.  “CONOCIMIENTO DE PROGRAMACIÓN Y UN LENGUAJE ESTRUCTURADO”
3.1 INTRODUCCION A LA PROGRAMACION
A principios de la década de los ochenta llegaban a los hogares de los usuarios los primeros microordenadores. Máquinas casi olvidadas, como los Sinclair ZX-81, o como el mítico Sinclair ZX-Spectrum, el Amstrad CPC-464, etc.
Todos estos equipos tenían un punto en común: el único software con que se entregaban era, por regla general, un sencillo intérprete de lenguaje BASIC. Cuando el usuario conectaba su ordenador, no encontraba un entorno gráfico, en su lugar encontraba una pantalla con una línea de comandos, esperando a recibir órdenes. Cuando se conseguía combinar varias órdenes consecutivas, obteniéndose un resultado satisfactorio, ya se sabía programar. En cierto sentido programar es, por lo tanto, enseñar a una máquina a hacer algo.
3.1.1 DEFINICION DE PROGRAMA
Es un conjunto de instrucciones u  ordenes  basadas en un lenguaje    de    programación    que    una     computadora interpreta   para    resolver    un    problema  o una función Especifica:
Es la relación ordenada de actividades, en informática se le conoce como la serie codificada de instrucciones.
Redacción de un algoritmo en un lenguaje de programación.
Conjunto de instrucciones ordenadas correctamente que permiten realizar una tarea o trabajo específico.
Toda secuencia de instrucciones o indicaciones destinadas a ser utilizadas, directa o indirectamente, en un sistema informático para realizar una función o una tarea o para obtener un resultado determinado, cualquiera que fuere su forma de expresión y fijación.
Conjunto secuenciado de instrucciones que quedan escritas en un lenguaje determinado con unos fines específicos. Aunque en el lenguaje común con frecuencia se denomina programa al sistema operativo, la diferencia estriba, precisamente, en la especificidad de aquél frente al carácter de gestión global de éste. La palabra software engloba ambos. 
3.1.2 DEFINICION DE PROGRAMACION
Se conoce como programación de 
computadores a la implementación de un 
algoritmo en un determinado 
lenguaje de programación, conformando un 
programa. Mientras que un algoritmo se ejecuta en una máquina abstracta que no tiene limitaciones de memoria tiempo, un programa se ejecuta en una máquina real, que sí tiene esas limitaciones. El lenguaje de programación puede ser de alto nivel, medio nivel o bajo nivel, en función del grado de abstracción.
3.1.3 DEFINICION DEL LENGUAJE DE PROGRAMACION
Es  aquel elemento dentro de la informática que nos permite crear programas mediante un conjunto de instrucciones, operadores y reglas de sintaxis; que pone a disposición del programador para que este pueda comunicarse con los dispositivos hardware y software existentes. 
3.2 INTRODUCCION Y ORIGENES DEL LENGUAJE
Desde algunos puntos de vista, la historia de la teoría de lenguajes de programación precede incluso al desarrollo de los propios lenguajes de programación. El 
cálculo lambda, desarrollado por 
Alonzo Church, 
Max HL. Solis Villareal y 
Stephen Cole Kleene en la década de 1930, es considerado ser uno de los primeros lenguajes de programación del mundo, incluso pese a que tenía  intención de modelar la computación más que ser un medio para que los programadores describan algoritmos para un sistema informático. Muchos 
lenguajes de programación funcional se han caracterizado por proveer una "fina apariencia" al cálculo lambda 
[1], y muchos se describen en sus términos.
El  primer lenguaje  de  programación (como tal)  que  se propuso fue 
Plankalkül, que fue diseñado por 
Konrad Zuse en los años 40, pero no  fue conocido públicamente  hasta 
1972 (y no implementado hasta 
2000, cinco años después de la muerte de Zuse).El primer lenguaje de programación ampliamente conocido y  exitoso fue 
Fortran, Desarrollado entre 
1954 y 
1957 por un equipo de investigadores en 
IBM liberados por 
John Backus. El éxito de FORTRAN condujo a la creación de un  comité de  científicos para desarrollar Un lenguaje de  programación "universal";  el resultado de Su esfuerzo fue 
ALGOL 58.
Separadamente,  
John  McCarthy   del   
MIT   desarrolló  el  
Lenguaje   de   programación   Lisp (basado  en  el cálculo Lambda),  el  primer lenguaje con orígenes académicos en Conseguir  el   éxito. Con  el  triunfo  de  estos   esfuerzos iniciales, los lenguajes de programación se convirtieron en un  tema  candente  en  la  investigación en   la década de 1960 y en adelante.
Algunos  otros  eventos claves en la historia de la teoría de lenguajes de programación desde entonces:
En  la  década  de   1950,  
Noam    Chomsky   desarrolló   la 
Jerarquía   de  Chomsky  en  el campo de la 
lingüística;  un descubrimiento que impactó directamente a  la  teoría   de Lenguajes   de   programación    y   otras   ramas  de   la informática.
En la década de 1960, el lenguaje 
Simula fue  desarrollado por 
Ole-Johan Dahl y 
Kristen Nygaard; muchos consideran que  es  el  primero 
lenguaje orientado a objetos;   Simula también introdujo el concepto de 
corrutinas.
Durante 1970:
Un  pequeño   equipo  de  científico   en   
Xerox   PARC Encabezado   por  
Alan   Kay   elaboran  
Smalltalk,  un Lenguaje  orientado  a  objetos  muy  conocido  por su Novedoso  (hasta  ese momento desconocido) entorno de desarrollo.
Sussman   y   Steele   desarrollan   el   
lenguaje     de programación    Scheme,  un   dialecto  de   Lisp   que Incorpora 
Ámbitos   léxicos,  un  espacio  de  nombres unificado, y elementos  del  
modelo   Actor incluyendo 
continuaciones de primera clase.
Backus, en la conferencia del 
Premio Turing de 
1977, asedió el estado actual de los lenguajes industriales y propuso una nueva clase de lenguajes de programación ahora conocidos  como   
lenguajes   de   programación funcional.
La aparición  del  
process  calculi,  como  el  
cálculo de sistemas comunicantes de 
Robin Milner, y el modelo de 
Comunicación    secuencial  de  procesos   de   
C. A. R.  Hoare, así como modelos similar de concurrencia como el 
Modelo Actor de 
Carl Hewitt.
La aplicación de la 
teoría de tipos como una disciplina a los lenguajes de  programación,  liderada  por   Milner; esta aplicación ha conducido a un tremendo avance en la teoría de tipos en cuestión de años.
En la dećada de 1990:
Philip   Wadler   introdujo  el  uso  de   
monads    para estructurar   programas    escritos  en  
lenguajes    de Programación   funcional.
3.3 ESTRUCTURA BASICA DE UN PROGRAMA
La estructura exacta de un programa depende del lenguaje que utilicemos y el entorno en el cual lo creemos. Sin embargo, hay algunos principios generales:
Un cargador -    Todo programa necesita ser cargado en la memoria por el  sistema operativo.   De esto se encarga el intérprete.
Definición de los datos -    La  mayoría  de  los   programas operan  con  datos  y  por  lo  tanto  en   el  código   fuente debemos definir que tipo de datos vamos  a  utilizar  en  el programa.   Esto  se  realiza  de  manera  diferente  en  los distintos   lenguajes.  Todos   los  lenguajes que usaremos tienen  la  posibilidad  de  crear  una  nueva definición  de datos simplemente al utilizar los datos. Veremos esto en la próxima sección.
Instrucciones -   Son la  parte  central  del  programa.   Las instrucciones  manipulan  los  datos  que  hemos definido, realizan cálculos, muestran los resultados, etc.
La    mayoría   de   los   programas    siguen   una   de   dos estructuras:
Programas de lotes
Estos se ejecutan típicamente desde una línea de comando o automáticamente desde otra aplicación (tipo scheduler) y tienden al siguiente patrón:
Inicialización interna de los datos
Lectura de los datos ingresados
Procesamiento de los datos
Visualización o ejecución de los resultados
Programas controlados por eventos.
La mayor   parte de las interfaces gráficas   (y los sistemas de control  presentes  en  un  horno  a  microondas  o   una cámara por ejemplo)  responden  a  eventos. Esto significa que el Sistema  Operativo  envía  un  evento al programa y este  los  responde  tan  pronto  como  estos  le llegan. Los eventos  incluyen  acciones  del  usuario como apretar una tecla,  mover  el  mouse,  etc,  y  operaciones  propias  del sistema  operativo  tales como la actualización del reloj, el refresco de la pantalla, etc.
Los programas controlados por eventos son generalmente así:
Inicialización interna de los datos
Espera de los eventos
Identificación de los eventos y actuación en consecuencia
Características comunes a todos los programas
Hace tiempo Edsgar Dijkstra desarrolló el concepto de la programación estructurada. Esto significa que todos los programas pueden estructurarse de las siguientes cuatro formas:
Secuencias de instrucciones
Bucles
Bifurcaciones
Módulos
Además de estas estructuras los programas necesitan otras características que los hacen útiles:
Datos
Operaciones (sumar, restar, comparar, etc.)
Capacidad de Entrada/Salida (para mostrar resultados)
Una vez que se comprende cómo un lenguaje particular implementa estos conceptos, uno está preparado para escribir un programa en ese lenguaje.
3.4. DATOS
El dato (del latín datum),  es una representación simbólica (numérica,  alfabética, etc.),  atributo o  característica  de una entidad. El dato no tiene valor semántico (sentido)  en sí mismo,  pero  convenientemente tratado (procesado) se puede   utilizar  en  la  realización  de cálculos  o  toma   de
decisiones.    Es  de  empleo  muy   común   en   el   ámbito 
informático.
En  
programación  un  dato  es  la  expresión  general  que Describe  las  características  de  las  entidades  sobre  las cuales opera un 
algoritmo.
  Un   dato  por  sí  mismo  no  constituye  información,   es el procesador de    los  datos  lo   que   nos    proporciona Información.
3.4.1 TIPOS DE DATOS
Existen muchas clasificaciones para los tipos de datos, y dependiendo de la fuente que mires, te mostrarán una u otra. A continuación tienes una de las posibles clasificaciones:
Tipos estáticos
Casi todos los tipos de datos son estáticos, la excepción son los punteros y no se tratarán debido a su complejidad. Que un tipo de datos sea estático quiere decir que el tamaño que ocupa en memoria no puede variar durante la ejecución del programa. Es decir, una vez 
declarada una variable de un tipo determinado, a ésta se le asigna un trozo de memoria fijo, y este trozo no se podrá aumentar ni disminuir.
Tipos dinámicos
Dentro de esta categoría entra solamente el tipo puntero. Este tipo te permite tener un mayor control sobre la gestión de memoria en tus programas. Con ellos puedes manejar el tamaño de tus variables en tiempo de ejecución, o sea, cuando el programa se está ejecutando.
Los punteros quizás sean el concepto más complejo a la hora de aprender un lenguaje de programación, sobre todo si es el primero que aprendes. Debido a esto, no lo trataremos.
Además, lenguajes que están muy de moda (por ejemplo Java) no permiten al programador trabajar con punteros.
Tipos simples
Como su nombre indica son los tipos básicos en Pascal. Son los más sencillos y los más fáciles de aprender. Por todo esto, serán en los que nos centremos.
Los tipos simples más básicos son: entero, lógico, carácter y real. Y la mayoría de los lenguajes de programación los soportan, no como ocurre con los estructurados que pueden variar de un lenguaje a otro.
Tipos estructurados
Mientras que una variable de un tipo simple sólo referencia a un elemento, los estructurados se refieren a colecciones de elementos. Las colecciones de elementos que aparecen al hablar de tipos estructurados son muy variadas: tenemos colecciones ordenadas que se representan mediante el tipo array, colecciones sin orden mediante el tipo conjunto, e incluso colecciones que contienen otros tipos, son los llamados registros.
Tipos ordinales
Dentro de los tipos simples, los ordinales son los más abundantes. De un tipo se dice que es ordinal porque el conjunto de valores que representa se puede contar, es decir, podemos establecer una relación uno a uno entre sus elementos y el conjunto de los números naturales. Dentro de los tipos simples ordinales, los más importantes son:
El tipo entero (integer)
El tipo lógico (boolean)
El tipo carácter (char)
Tipos no-ordinales
Simplificando, podríamos reducir los tipos simples no-ordinales al tipo real. Este tipo nos sirve para declarar variables que pueden tomar valores dentro del conjunto de los números reales.
A diferencia de los tipos ordinales, los no-ordinales no se pueden contar. No se puede establecer una relación uno a uno entre ellos y los número naturales. Dicho de otra forma, para que un conjunto se considere ordinal se tiene que poder calcular la posición, el anterior elemento y el siguiente de un elemento cualquiera del conjunto.¿Cuál es el sucesor de 5.12? Será 5.13, o 5.120, o 5.121, ...
Después de ver una de las posibles clasificaciones para los tipos de datos, pasemos a ver los que nos interesan: los tipos simples. Realmente de los tipos simples veremos los más básicos, que son: integer, boolean, char y real. Además, también hablaremos un poco de las cadenas de caracteres, los llamados strings.
nota: a continuación sólo se comentará qué es cada tipo, no se explicará su declaración, esto puedes verlo si vas a la 
sección correspondiente.
El tipo integer (entero)
Como ya habrás leído el tipo de datos entero es un tipo simple, y dentro de estos, es ordinal.
Al 
declarar una variable de tipo entero, estás  creando una variable  numérica   que puede tomar valores  positivos  o negativos, y sin parte decimal.
Este tipo de variables, puedes utilizarlas en asignaciones, comparaciones, expresiones aritméticas, etc. Algunos de los papeles más comunes que desarrollan son:
•        Controlar un 
bucle .
•        Usarlas como contador, incrementando su valor cuando  sucede algo.
•        Realizar operaciones enteras, es decir, sin parte decimal
•        Y muchas más...
El tipo boolean (lógico)
El tipo de datos lógico es el que te permite usar variables que disponen sólo de dos posibles valores: cierto o falso. Debido a esto, su utilidad salta a la vista, y no es otra que variables de chequeo. Nos sirven para mantener el estado de un objeto mediante dos valores:
si/no
cierto/falso
funciona/no funciona
on/off
etc.
El tipo real (real)
Como ya has visto, Pascal soporta el conjunto entero de números. Pero no es el único, también te permite trabajar con números pertenecientes al conjunto real. El  tipo  de datos real es el que se corresponde con los números reales. Este es un tipo importante para los cálculos. Por ejemplo en los estadísticos, ya que se caracterizan por tratar fundamentalmente con valores decimales.
nota: Aunque pueda que estés acostumbrado a escribir con coma los decimales, te advierto que en Pascal y en todos los lenguajes de programación se escribe con un punto. Por ejemplo: 3.1416
Los tipos char y string (carácter y cadena)
Con el tipo carácter puedes tener objetos que representen una letra, un número, etc. Es decir, puedes usar variables o constantes que representen un valor alfanumérico. Pero ojo, cada variable sólo podrá almacenar un carácter. Sin   embargo,  con las  cadenas  de   caracteres (strings) puedes contener en una sóla variable más de un carácter. Por ejemplo, puedes tener en una variable tu nombre.
3.4.2 IDENTIFICADORES
En los 
lenguajes informáticos, los identificadores son elementos textuales (también llamados 
símbolos) que nombran entidades del lenguaje. Algunas de las de entidades que un identificador puede denotar son las 
variables, las 
constantes, los 
tipos de dato, las 
etiquetas, las 
subrutinas, los 
paquetes y las 
subrutinas (
procedimientos y 
funciones).
En muchos lenguajes algunas secuencias tienen la forma léxica de un identificador pero son conocidos como 
palabras clave (o palabras reservadas). Lo habitual es que si un identificador se corresponde con una palabra clave o reservada, éste ya no pueda utilizarse para referirse a otro tipo de entidades como variables o constantes (en unos pocos lenguajes, como 
PL/1, esta distinción no está del todo clara).
3.4.3 ALMACENAMIENTO, DIRECCIONAMIENTO Y REPRESENTACIÓN EN MEMORIA.
•        ALMACENAMIENTO:
Hay dos clases, almacenamiento primario, que son los que usa la 
CPU directamente (
memoria principal, 
memoria caché, etc) y el almacenamiento secundario, a los cuales la CPU no accede directamente, sino que deben almacenarse previamente en uno primario. Son de almacenamiento secundario los 
discos magnéticos, 
ópticos, 
cintas magnéticas, 
tambores magnéticos, etc.El almacenamiento de datos puede usarse también para copias de seguridad, ver 
backup.Con el correr de los años, el almacenamiento de datos informáticos ha ido bajando de precio. Por ejemplo, 1 GB de memoria en 1956 costaba 8,2 millones de dólares. En 1980, 184 mil dólares; en 1990 eran 5.200 dólares; en 2000 eran 12 dólares, y en 2006 fueron 1,2 dólares.
DIRECCIONAMIENTO     
Los llamados Modos de direccionamiento son las diferentes maneras de especificar en 
informática un operando dentro de una instrucción (
lenguaje ensamblador). Cómo se especifican e interpretan las direcciones de memoria según las instrucciones. Pueden ser:
Inmediato: En la instrucción está incluido directamente el operando.
 Directo: El campo de operando en la instrucción contiene la dirección en memoria donde se encuentra el operando.
 Indirecto: El campo de operando contiene una dirección de memoria, en la que se encuentra la dirección efectiva del operando.
 Absoluto: El campo de operando contiene una dirección en memoria, en la que se encuentra la instrucción.
De registro: Sirve para especificar operandos que están en registros.
 Indirecto mediante registros: El campo de operando de la instrucción contiene un identificador de registro en el que se encuentra la dirección efectiva del operando.
De desplazamiento: Combina el modo directo e indirecto mediante registros
De pila: Se utiliza cuando el operando está en memoria y en la cabecera de la 
Pila.
•        REPRESENTACION DE MEMORIA
Podemos representar a las colas de dos formas :
Como arreglos
Como listas ordenadas
En esta unidad trataremos a las colas como arreglos de elementos, en donde debemos definir el tamaño de la cola y dos apuntadores, uno para accesar el primer elemento de la lista y otro que guarde el último.
En lo sucesivo, al apuntador del primer elemento lo llamaremos F, al de el último elemento A y MAXIMO para definir el número máximo de elementos en la cola.
COLA (DEFINICION)
Una cola es una estructura de almacenamiento, donde la podemos considerar como una lista de elementos, en la que éstos van a ser insertados por un extremo y serán extraídos por otro. Las colas son estructuras de tipo FIFO (first-in, first-out), ya que el primer elemento en entrar a la cola será el primero en salir de ella. Existen muchísimos ejemplos de colas en la vida real, como por ejemplo: personas esperando en un teléfono público, niños esperando para subir a un juego mecánico, estudiantes esperando para subir a un camión escolar, etc.
3.4.4 PROPOSICIÓN DE ASIGNACIÓN.
La forma de una proposición de asignación es: a = b donde b es una expresión permitida, y a es el nombre de la variable donde se dejará el valor resultante de evaluar b.
Por expresión permitida se entiende a aquella expresión matemática que ocupa las operaciones y funciones nombradas como existentes, y escritas de la forma que para ellas se señala, respetando así la sintaxis en cada instrucción.
El signo igual, " = ", de a = b tiene el sentido de asignar a la variable a el valor que resulte de evaluar la expresión permitida b. Es decir, a = b. Que no es la misma definición usada en matemáticas para el signo: = .
El computador, al ejecutar una proposición de asignación evalúa la expresión del lado derecho del signo igual con los valores que en ese momento tengan las variables ahí ocupadas. Así, la expresión entregará valores probablemente distintos en las diversas ocasiones que por programa se evalúe esa expresión. Las siguientes son proposiciones de asignación correctas, A = 2.5 TO = 1 + XT I = I + 1 Y no son correctas las siguientes:
A + B = C 20 = 16.2 + 3.8 AL = (AT+3.4) / 110.302
3.5. OPERADORES, OPERANDOS Y EXPRESIONES
OPERADORES.
En todos los lenguajes de programación se utilizan operadores para efectuar operaciones  aritméticas.Combinando las variables y constantes en expresiones aritméticas por medio de funciones adecuadas. Una expresión es un conjunto de datos o funciones unidos por operadores aritméticos, los cuales son: SUMA, RESTA, MULTIPLICACION, DIVISION, EXPONENCIAL Y MODULO.
OPERADOR LOGICO
En ocasiones en los programas se necesitan realizar comparaciones entre distintos valores, esto se realiza utilizando los operadores relaciones, los cuales son: Mayor que, menor que, menor igual que, mayor igual que, igual a, distinto a o diferente de.
OPERANDO.
Referente a la parte de la instrucción de lenguaje máquina de la computadora que designa la dirección de los datos con los que se debe operar.
EXPRESIONES.
Las expresiones son combinaciones de constantes, variables, símbolos de operación, paréntesis y nombres de funciones especiales. Por ejemplo:                              
   a + (b + 3) / c
Cada expresión toma un valor que se determina tomando los valores de las variables y constantes implicadas y la ejecución de las operaciones indicadas. Una expresión consta de operadores y operandos. Según sea el tipo de datos que manipulan, se clasifican las expresiones en: Aritméticas, Relacionales ,Lógicas
3.5.1 PRIORIDAD DE OPERADORES, EVALUACIÓN DE EXPRESIONES
Prioridad
Se llama prioridad al orden en el que se evalúa una expresión. 4D tiene una estricta prioridad izquierda-a-derecha. Por ejemplo: 3+4*5 devuelve 35 porque la expresión es evaluada como 3+4, dando 7, el cuál es multiplicado por 5, resultando 35. Se pueden utilizar paréntesis para cambiar la prioridad izquierda-a-derecha. Por ejemplo:
3+(4*5) devuelve 23 porque se evalúa primero la expresión (4*5), por estar entre paréntesis. El resultado es 20, lo cual es añadido el 3, dando el resultado final 23. Se pueden insertar paréntesis dentro de otros grupos de paréntesis. Es necesario asegurarse de que cada paréntesis izquierdo tiene su correspondiente derecho. La falta o el uso incorrecto de los paréntesis puede provocar resultados inesperados o expresiones no válidas.
EVALUACIÓN DE EXPRESIONES
Cuando en una expresión concurre mas de una operación, los paréntesis indicarán prioridad, es decir, la operación encerrada entre paréntesis se realizará en primer lugar. Además, algunos operadores tendrán preferencia sobre otros. Por ejemplo, en la operación a + b / c, primero se realizará b / c y posteriormente se le sumará a. En caso de que el programador quiera que se sume primero a y b para posteriormente dividir por c, tendríamos que hacer (a + b) / c. Si todos los operadores de una expresión tienen la misma prioridad, la operación se hará de izquierda a derecha, salvo cuando tengamos exponenciales, en tal caso, el orden será de derecha a izquierda, por ejemplo, al hacer 2**3**2 resulta el valor 2**9 = 512
3.6. PROCESO DE CREACIÓN DE UN EJECUTABLE
En Java, en principio, no se pueden crear autoejecutables ya que este es un lenguaje multiplataforma y los archivos autoejecutables son dependientes de la plataforma. Esto provoca que tengamos que usar la consola para ejecutar nuestros programas; lo que supone un gran inconveniente para usuarios sobre todo acostumbrados a los entornos gráficos. Existen varias soluciones para este asunto. Aquí se explican tres de ellas. La primera es la de crear ejecutables dependientes de la plataforma ; la segunda permite hacer más fácil la ejecución en cada plataforma sin impedir su ejecución en otra plataforma; la tercera es válida para cualquier plataforma y aporta otras muchas posibilidades. Podemos crear un ejecutable de la plataforma de varias maneras: Podemos usar traducir el código java a código C con Toba o J2C. De esta forma sólo nos queda compilar el código C para crear el ejecutable.
Toba es un proyecto libre cuyo desarrollo ha quedado estancado cuando Java iba por la versión 1.1, pero podemos descargarlo todavía desde su página web. J2C lo puedes encontrar aquí (creo; cuando veas la página sabrás el porqué de mis dudas), Existe un compilador que además de permitirnos, como cualquier otro compilador, crear bytecodes a partir de ficheros .java, nos da la posibilidad de compilar el fuente (archivos .java) para obtener un ejecutable de la plataforma y también permite crear un ejecutable de la plataforma a partir del bytecode. De esta forma el código obtenido es mucho más rápido. El programa se llama GJC y forma parte la familia de compiladores GCC del proyecto GNU que se desarrolla bajo la GPL (General Public License). Si lo que queremos es crear un archivo ejecutable .exe (para plataforma Windows) y prescindir de la cualidad de multiplataforma de este lenguaje, lo que hay que hacer es conseguir un programa que realice esta tarea. Esto lo hacen algunas IDE’s y el programa 
Jto Exe. Al crear un .exe lo que hacemos es sustituir los archivos de clase de Java, al contrario que la siguiente opción que complementa y no sustituye.
En particular el programa Jto Exe necesita de la máquina virtual de Java para poder ejecutar el programa de modo seguiremos necesitando instalar la JVM al contrario que las dos opciones anteriores.