jueves, 14 de febrero de 2008

Historia de Java

Historia de Java



¿Por qué se diseñó Java?

Los lenguajes de programación C y Fortran se han utilizado para diseñar algunos de los sistemas más complejos en lenguajes de programación estructurada, creciendo hasta formar complicados procedimientos. De ahí provienen términos como "código de espagueti" o "canguros" referentes a programas con múltiples saltos y un control de flujo difícilmente trazable.

No sólo se necesitaba un lenguaje de programación para tratar esta complejidad, sino un nuevo estilo de programación. Este cambio de paradigma de la programación estructurada a la programación orientada a objetos, comenzó hace 30 años con un lenguaje llamado Simula67.

El lenguaje C++ fue un intento de tomar estos principios y emplearlos dentro de las restricciones de C. Todos los compiladores de C++ eran capaces de compilar programas de C sin clases, es decir, un lenguaje capaz de interpretar dos estilos diferentes de programación. Esta compatibilidad ("hacia atrás") que habitualmente se vende como una característica de C++ es precisamente su punto más débil. No es necesario utilizar un diseño orientado a objetos para programar en C++, razón por la que muchas veces las aplicaciones en este lenguaje no son realmente orientadas al objeto, perdiendo así los beneficios que este paradigma aporta.

Así Java utiliza convenciones casi idénticas para declaración de variables, paso de parámetros, y demás, pero sólo considera las partes de C++ que no estaban ya en C.

Las principales características que Java no hereda de C++ son:

  • Punteros: Las direcciones de memoria son la característica más poderosa de C++. El inadecuado uso de los punteros provoca la mayoría de los errores de colisión de memoria, errores muy difíciles de detectar. Además, casi todos los virus que se han escrito aprovechan la capacidad de un programa para acceder a la memoria volátil (RAM) utilizando punteros. En Java, no existen punteros, evitando el acceso directo a la memoria volátil.
  • Variables globales: Con ellas cualquier función puede producir efectos laterales, e incluso se pueden producir fallos catastróficos cuando algún otro método cambia el estado de la variable global necesaria para la realización de otros procesos. En Java lo único global es el nombre de las clases.
  • goto: Manera rápida de arreglar un programa sin estructurar el código. Java no tiene ninguna sentencia goto. Sin embargo Java tiene las sentencias break y continue que cubren los casos importantes de goto.
  • Asignación de memoria: La función malloc de C, asigna un número especificado de bytes de memoria devolviendo la dirección de ese bloque. La función free devuelve un bloque asignado al sistema para que lo utilice. Si se olvida de llamar a free para liberar un bloque de memoria, se están limitando los recursos del sistema, ralentizando progresivamente los programas. Si por el contrario se hace un free sobre un puntero ya liberado, puede ocurrir cualquier cosa. Más tarde C++ añadió new y delete, que se usan de forma similar, siendo todavía el programador, el responsable de liberar el espacio de memoria. Java no tiene funciones malloc ni free. Se utiliza el operador new para asignar un espacio de memoria a un objeto en el montículo de memoria. Con new no se obtiene una dirección de memoria sino un descriptor al objeto del montículo. La memoria real asignada a ese objeto se puede mover a la vez que el programa se ejecuta, pero sin tener que preocuparse de ello. Cuando no tenga ninguna referencia de ningún objeto, la memoria ocupada estará disponible para que la reutilice el resto del sistema sin tener que llamar a free o delete. A esto se le llama recogida de basura. El recolector de basura se ejecuta siempre que el sistema esté libre, o cuando una asignación solicitada no encuentre asignación suficiente.
  • Conversión de tipos insegura: Los moldeados de tipo (type casting) son un mecanismo poderoso de C y C++ que permite cambiar el tipo de un puntero. Esto requiere extremada precaución puesto que no hay nada previsto para detectar si la conversión es correcta en tiempo de ejecución. En Java se puede hacer una comprobación en tiempo de ejecución de la compatibilidad de tipos y emitir una excepción cuando falla.

Comienzos

Java fue diseñado en 1990 por James Gosling, de Sun Microsystems, como software para dispositivos electrónicos de consumo. Curiosamente, todo este lenguaje fue diseñado antes de que diese comienzo la era World Wide Web, puesto que fue diseñado para dispositivos electrónicos como calculadoras, microondas y la televisión interactiva.
Logotipo de la Empresa Sun Microsystems

En los primeros años de la década de los noventa, Sun Microsystems decidió intentar introducirse en el mercado de la electrónica de consumo y desarrollar programas para pequeños dispositivos electrónicos. Tras unos comienzos dudosos, Sun decidió crear una filial, denominada FirstPerson Inc., para dar margen de maniobra al equipo responsable del proyecto.

Inicialmente Java se llamó Oak (roble en inglés), aunque tuvo que cambiar de denominación, debido a que dicho nombre ya estaba registrado por otra empresa. Se dice este nombre se le puso debido a la existencia de tal árbol en los alrededores del lugar de trabajo de los promotores del lenguaje.


Tres de las principales razones que llevaron a crear Java son:

  1. Creciente necesidad de interfaces mucho más cómodas e intuitivas que los sistemas de ventanas que proliferaban hasta el momento.
  2. Fiabilidad del código y facilidad de desarrollo. Gosling observó que muchas de las características que ofrecían C o C++ aumentaban de forma alarmante el gran coste de pruebas y depuración. Por ello en los sus ratos libres creó un lenguaje de programación donde intentaba solucionar los fallos que encontraba en C++.
  3. Enorme diversidad de controladores electrónicos. Los dispositivos electrónicos se controlan mediante la utilización de microprocesadores de bajo precio y reducidas prestaciones, que varían cada poco tiempo y que utilizan diversos conjuntos de instrucciones. Java permite escribir un código común para todos los dispositivos.

Por todo ello, en lugar de tratar únicamente de optimizar las técnicas de desarrollo y dar por sentada la utilización de C o C++, el equipo de Gosling se planteó que tal vez los lenguajes existentes eran demasiado complicados como para conseguir reducir de forma apreciable la complejidad de desarrollo asociada a ese campo. Por este motivo, su primera propuesta fue idear un nuevo lenguaje de programación lo más sencillo posible, con el objeto de que se pudiese adaptar con facilidad a cualquier entorno de ejecución.

Basándose en el conocimiento y estudio de gran cantidad de lenguajes, este grupo decidió recoger las características esenciales que debía tener un lenguaje de programación moderno y potente, pero eliminando todas aquellas funciones que no eran absolutamente imprescindibles.

Primeros proyectos en que se aplicó Java

El proyecto Green fue el primero en el que se aplicó Java, y consistía en un sistema de control completo de los aparatos electrónicos y el entorno de un hogar. Con este fin se construyó un ordenador experimental denominado *7 (Star Seven). El sistema presentaba una interfaz basada en la representación de la casa de forma animada y el control se llevaba a cabo mediante una pantalla sensible al tacto. En el sistema aparecía ya Duke, la actual mascota de Java.

Mascota de Java

Más tarde Java se aplicó a otro proyecto denominado VOD (Video On Demand) en el que se empleaba como interfaz para la televisión interactiva que se pensaba iba a ser el principal campo de aplicación de Java. Ninguno de estos proyectos se convirtió nunca en un sistema comercial, pero fueron desarrollados enteramente en un Java primitivo.

Una vez que en Sun se dieron cuenta de que a corto plazo la televisión interactiva no iba a ser un gran éxito, instaron a FirstPerson a desarrollar nuevas estrategias que produjeran beneficios. Entre ellas se encontraba la aplicación de Java a Internet, la cual no se consideró productiva en ese momento.

Resurgimiento de Java

Aunque muchas de las fuentes consultadas señalan que Java no llegó a caer en un olvido, lo cierto es que tuvo que ser Bill Joy (cofundador de Sun y uno de los desarrolladores principales del sistema operativo Unix de Berckley) el que sacó a Java del letargo en que estaba sumido. Joy juzgó que Internet podría llegar a ser el campo adecuado para disputar a Microsoft su primacía en el terreno del software, y vio en Oak el instrumento idóneo para llevar a cabo estos planes.

Para poder presentarlo en sociedad se tuvo que modificar el nombre de este lenguaje de programación y se tuvo que realizar una serie de modificaciones de diseño para poderlo adaptar al propósito mencionado. Así Java fue presentado en sociedad en agosto de 1995.

Algunas de las razones que llevaron a Bill Joy a pensar que Java podría llegar a ser rentable son:

  • Java es un lenguaje orientado a objetos: Esto es lo que facilita abordar la resolución de cualquier tipo de problema.
  • Es un lenguaje sencillo, aunque sin duda potente.
  • La ejecución del código Java es segura y fiable: Los programas no acceden directamente a la memoria del ordenador, siendo imposible que un programa escrito en Java pueda acceder a los recursos del ordenador sin que esta operación le sea permitida de forma explícita. De este modo, los datos del usuario quedan a salvo de la existencia de virus escritos en Java. La ejecución segura y controlada del código Java es una característica única, que no puede encontrarse en ninguna otra tecnología.
  • Es totalmente multiplataforma: Es un lenguaje sencillo, por lo que el entorno necesario para su ejecución es de pequeño tamaño y puede adaptarse incluso al interior de un navegador.

Las consecuencias de la utilización de Java junto a la expansión universal de Internet todavía están comenzando a vislumbrarse.

Futuro de Java

Existen muchas críticas a Java debido a su lenta velocidad de ejecución, aproximadamente unas 20 veces más lento que un programa en lenguaje C. Sun está trabajando intensamente en crear versiones de Java con una velocidad mayor.

El problema fundamental de Java es que utiliza una representación intermedia denominada código de byte para solventar los problemas de portabilidad. Los códigos de byte posteriormente se tendrán que transformar en código máquina en cada máquina en que son utilizados, lo que ralentiza considerablemente el proceso de ejecución.

La solución que se deriva de esto parece bastante obvia: fabricar ordenadores capaces de comprender directamente los códigos de byte. Éstas serían unas máquinas que utilizaran Java como sistema operativo y que no requerirían en principio de disco duro porque obtendrían sus recursos de la red.

A los ordenadores que utilizan Java como sistema operativo se les llama Network Computer, WebPC o WebTop. La primera gran empresa que ha apostado por este tipo de máquinas ha sido Oracle, que en enero de 1996 presentó en Japón su primer NC (Network Computer), basado en un procesador RISC con 8 Megabytes de RAM. Tras Oracle, han sido compañías del tamaño de Sun, Apple e IBM las que han anunciado desarrollos similares.

La principal empresa en el mundo del software, Microsoft, que en los comienzos de Java no estaba a favor de su utilización, ha licenciado Java, lo ha incluido en Internet Explorer (versión 3.0 y posteriores), y ha lanzado un entorno de desarrollo para Java, que se denomina Visual J++.

El único problema aparente es la seguridad para que Java se pueda utilizar para transacciones críticas. Sun va a apostar por firmas digitales, que serán clave en el desarrollo no sólo de Java, sino de Internet.

Especulación sobre el futuro de Java

En opinión de los redactores de este tutorial, Java es una plataforma que le falta madurar, pero que a buen seguro lo va a hacer. La apuesta realizada por empresas con mucho peso específico ha sido tan grande que va a dar un impulso a Java que no le permitirá caer

Además, el parque de productos (entornos de desarrollo, bibliotecas, elementos de conectividad...) ya disponible en la actualidad es tan amplio que es improbable que se quede en nada.

Por otra parte, la relación simbiótica que tiene con Internet (y por derivación con las Intranets) es un punto a favor de Java de muy difícil refutación.



viernes, 25 de enero de 2008

Historia de la Computación

LA COMPUTACION

La Computación, y por tanto, las Ciencias de la Computación, tienen su origen en el cálculo, es decir, en la preocupación del ser humano por encontrar maneras de realizar operaciones matemáticas de forma cada vez más rápida y más fácilmente. Pronto se vio que con ayuda de aparatos y máquinas las operaciones podían realizarse de forma más rápida y automática.

El primer ejemplo que encontramos en la historia es el ábaco, aparecido hacia el 500 AC en Oriente Próximo, que servía para agilizar las operaciones aritméticas básicas, y que se extendió a China y Japón, siendo descubierto mucho más tarde por Europa.

También es digno de señalar el conocido Mecanismo de Antikythera, recuperado en 1900, construido alrededor del año 80 a.C., en la isla griega de Rodas, ubicada en el mar Egeo. Era un artefacto de cálculo astronómico con mecanismos de precisión. El usuario, por medio de una perilla, podía accionar un simulador en miniatura del movimiento del sol, la luna y varios planetas, teniendo a la vista la fecha en que se había dado, o se daría, tal combinación. Es tanta su sofisticación que ha sido llamado la primera computadora de Occidente.

Por otra parte, los matemáticos hindúes, árabes y europeos fueron los primeros que desarrollaron técnicas de cálculo escrito. El matemático árabe Al'Khwarizmi, alrededor del año 830 DC, escribe un libro de Aritmética, traducido al latín como Algoritmi de numero Indorum, donde introduce el sistema numérico indio (sólo conocido por los árabes unos 50 años antes) y los métodos para calcular con él. De esta versión latina proviene la palabra algoritmo.

PRIMERA GENERACION

(Electromecánicos y electrónicos de tubos de vacío)

Para tabular el censo de 1890, el gobierno de Estados Unidos estimó que se invertirían alrededor de diez años. Un poco antes, Herman Hollerith (1860-1929), había desarrollado un sistema de tarjetas perforadas eléctrico y basado en la lógica de Boole, aplicándolo a una máquina tabuladora de su invención. La máquina de Hollerith se usó para tabular el censo de aquel año, durando el proceso total no más de dos años y medio. Así, en 1896, Hollerith crea la Tabulating Machine Company con la que pretendía comercializar su máquina. La fusión de esta empresa con otras dos, dio lugar, en 1924, a la International Business Machines Corporation (IBM).

Sin embargo, en el censo de 1910, el sistema de Hollerith fue sustituido por uno desarrollado por James Powers. En 1911 James Powers constituyó la Power's Tabulating Machine Company, convirtiéndose en el principal competidor de Hollerith.

Al desencadenarse la Segunda Guerra Mundial, la necesidad de realizar complicados cálculos balísticos y la exigencia de descodificar los mensajes cifrados del otro bando, impulsó el desarrollo de los computadores electrónicos de propósito general. El propio Turing fue reclutado en Bletchley Park, en Inglaterra, para descifrar los mensajes que encriptaba la máquina alemana Enigma, para lo que fue necesario construir la computadora Colossus.


En la Universidad de Harvard, Howard Aiken (1900-1973) en colaboración con IBM, empezó, en 1939, la construcción del computador electromecánico Mark I, en la que trabajó como programadora Grace Murray Hopper. Pero para cuando se terminó en 1944, ya habían aparecido las primeras computadoras totalmente electrónicas, que eran mucho más rápidas.


Por otro lado, en la Universidad del Estado de Iowa, entre 1937 y 1942, John Vincent Atanasoff (1903-1995) y Clifford Berry, diseñaron y construyeron la ABC (Atanasoff-Berry Computer). Terminada en 1942, fue la primera computadora electrónica digital, aunque sin buenos resultados y nunca fue mejorada. En 1941, John W. Mauchly (1907-1980) visitó a Atanasoff y observó de cerca su impresionante maquinaria, teniendo la oportunidad de revisar su tecnología. Más tarde, Mauchly y J. Presper Eckert, Jr (1919-1995), diseñaron y construyeron, entre los años 1943 y 1946, el computador eléctrico de propósito general ENIAC. Existe una gran controversia respecto a que Mauchly copiara muchas de las ideas y conceptos del profesor Atanasoff, para construir la computadora ENIAC. En cualquier caso en las últimas fases de su diseño y construcción aparece la importante figura de John Von Neumann (1903-1957), que actúa como consultor.


Von Neumann escribió en 1946, en colaboración con Arthur W. Burks y Herman H. Goldstine, Preliminary Discussion of the Logical Design of an Electronic Computing Instrument, que contiene la idea de Máquina de Von Neumann, que es la descripción de la arquitectura que, desde 1946, se aplica a todos los computadores que se han construido.


Con estos fundamentos, Eckert y Mauchly construyen en la Universidad de Manchester, en Connecticut (EE.UU.), en 1949 el primer equipo con capacidad de almacenamiento de memoria, la EDVAC. Eckert y Mauchly forman una corporación para construir una máquina que se pueda comercializar, pero, debido a problemas financieros, se vieron obligados a vender su compañía a a Remington Rand Corp. Trabajando para esta compañía fue que se concluyó el proyecto Univac, en 1951.


También por esta época Maurice Wilkes construye la EDSAC en Cambridge (Inglaterra) y F.C. Williams construye en Manchester (Inglaterra), la Manchester Mark I.

Estas máquinas se programaban directamente en lenguaje máquina, pero a partir de mediados de los 50, se produjo un gran avance en la programación avanzada.

SEGUNDA GENERACION

(los transistores y los avances en programación)


Allá por 1945 la máxima limitación de las computadoras era la lenta velocidad de procesamiento de los relés electromecánicos y la pobre disipación de calor de los amplificadores basados en tubos de vacío.

transistores

En 1947, John Bardeen, Walter Brattain y William Shockley inventan el transistor, recibiendo el Premio Nobel de Física en 1956. Un transistor contiene un material semiconductor, normalmente silicio, que puede cambiar su estado eléctrico. En su estado normal el semiconductor no es conductivo, pero cuando se le aplica un determinado voltaje se convierte en conductivo y la corriente eléctrica fluye a través de éste, funcionando como un interruptor electrónico.
Los computadores construidos con
transistores eran más rápidos, más pequeños y producían menos calor, dando también oportunidad a que, más tarde, se desarrollaran los microprocesadores. Algunas de las máquinas que se construyeron en esta época fueron la TRADIC, de los Laboratorios Bell (donde se inventó el transistor), en 1954, la TX-0 del laboratorio LINCOLN del MIT y las IBM 704, 709 y 7094. También aparece en esta generación el concepto de supercomputador, específicamente diseñados para el cálculo en aplicaciones científicas y mucho más potentes que los de su misma generación, como el Livermore Atomic Research Computer (LARC) y la IBM 7030.



Pero esta generación se explica también por los avances teóricos que se dan.



Así, en 1950, Alan Turing publica el artículo Computing Machinery and Intelligence en la revista Mind, en el que introducía el célebre Test de Turing. Este artículo estimuló a los pensadores sobre la filosofía e investigación en el campo de la Inteligencia Artificial. Por desgracia, Turing no fue testigo del interés que desató su artículo, porque en 1952 fue detenido por su relación homosexual con Arnold Murray y fue obligado a mantener un tratamiento con estrógenos que le hizo impotente y le produjo el crecimiento de pechos. En 1957, fue encontrado muerto en su casa al lado de una manzana mordida a la que había inyectado cianuro.



En 1951, Grace Murray Hooper (1906-1992) da la primera noción de compilador y más tarde desarrolla el COBOL. Pero fue John Backus, en 1957, el que desarrolla el primer compilador para FORTRAN. En 1958, John MacCarthy propone el LISP, un lenguaje orientado a la realización de aplicaciones en el ámbito de la Inteligencia Artificial. Casi de forma paralela, Alan Perlis, John Backus y Peter Naur desarrollan el lenguaje ALGOL.



Pero el personaje más importante en el avance del campo de los algoritmos y su análisis, es Edsger Dijkstra (1930- ), que en 1956, propuso su conocido algoritmo para la determinación de los caminos mínimos en un grafo, y más adelante, el algoritmo del árbol generador minimal. Más tarde, en 1961, N. Brujin introduce la notación O, que sería sistematizada y generalizada por D. Knuth. En 1957, aparece la Programación Dinámica de la mano de R. Bellman. En 1960, S. Golomb y L. Baumet presentan las Técnicas Backtracking para la exploración de grafos. Se publican en 1962 los primeros algoritmos del tipo Divide y Vencerás: el QuickSort de Charles Hoare y el de la multiplicación de grandes enteros de A. Karatsuba e Y. Ofman.

En 1959,
Jack Kilby (1923- ) presenta el primer circuito integrado, un conjunto de transistores interconectados con resistencias, en una pequeña pastilla de silicio y metal, llamada chip. Fue a partir de este hecho que las computadoras empezaron a fabricarse de menor tamaño, más veloces y a menor costo, debido a que la cantidad de transistores colocados en un solo chip fue aumentando en forma exponencial.




TERCERA GENERACION

(circuitos integrados y miniaturización)


IBM 360/91

A partir del circuito integrado, se producen nuevas máquinas, mucho más pequeñas y rápidas que las anteriores, así aparecen las IBM 360/91, IBM 195, SOLOMON (desarrollada por la Westinghouse Corporation) y la ILLIAC IV, producida por Burroughs, el Ministerio de Defensa de los EE.UU y la Universidad de Illinois.

Seymour Cray (1925-1996) revoluciona el campo de la supercomputación con sus diseños: en 1964, el CDC 6600, que era capaz de realizar un millón de operaciones en coma flotante por segundo; en 1969, el CDC 7600, el primer procesador vectorial, diez veces más rápido que su predecesor.



CDC 6600

En cuanto a los avances teóricos, a mediados de los 60, un profesor de Ciencias de la Computación, Niklaus Wirth, desarrolla el lenguaje PASCAL, y en Berkeley, el profesor Lotfi A. Zadeh, publica su artículo Fuzzy Sets, que revoluciona campos como la Inteligencia Artificial, la Teoría de Control o la Arquitectura de Computadores.

En 1971, Intel introduce el primer microprocesador. El potentísimo 4004 procesaba 4 bits de datos a la vez, tenía su propia unidad lógicoaritmética, su propia unidad de control y 2 chips de memoria. Este conjunto de 2.300 transistores que ejecutaba 60.000 operaciones por segundo se puso a la venta por 200 dólares. Muy pronto Intel comercializó el 8008, capaz de procesar el doble de datos que su antecesor y que inundó los aparatos de aeropuertos, restaurantes, salones recreativos, hospitales, gasolineras...

A partir de aquí nacieron las tecnologías de integración a gran escala (LSI) y de integración a muy gran escala (VLSI), con las que procesadores muy complejos podían colocarse en un pequeño chip.

Sin embargo, hasta este momento, por motivos económicos, complejidad de uso y dificultad de mantenimiento, los computadores habían sido patrimonio de universidades, organismos militares y gubernamentales, y grandes empresas.

En 1975, Popular Electronics dedicó su portada al primer microcomputador del mundo capaz de rivalizar con los modelos comerciales, el Altair 8800.



CUARTA GENERACION

(ordenadores personales de uso doméstico)

IBM

El Altair 8800, producido por una compañía llamada Micro Instrumentation and Telemetry Systems (MITS), se vendía a 397 dólares, lo que indudablemente contribuyó a su popularización. No obstante, el Altair requería elevados conocimientos de programación, tenía 256 bytes de memoria y empleaba lenguaje máquina. Dos jóvenes, William Gates y Paul Allen, ofrecerion al dueño de MITS, un software en BASIC que podía correr en el Altair. El software fue un éxito y, posteriormente Allen y Gates crearon Microsoft.

Paralelamente, Steven Wozniak y Steven Jobs, también a raíz de ver el Altair 8800 en la portada de Popular Electronics, construyen en 1976, la Apple I. Steven Jobs con una visión futurista presionó a Wozniak para tratar de vender el modelo y el 1 de Abril de 1976 nació Apple Computer. En 1977, con el lanzamiento de la Apple II, el primer computador con gráficos a color y carcasa de plástico, la compañia empezó a imponerse en el mercado.

En 1981, IBM estrena una nueva máquina, la IBM Personal Computer, protagonista absoluta de una nueva estrategia: entrar en los hogares. El corazón de esta pequeña computadora, con 16 Kb de memoria (ampliable a 256), era un procesador Intel, y su sistema operativo procedía de una empresa recién nacida llamada Microsoft.

En 1984, Apple lanza el Macintosh, que disponía de interfaz gráfico para el usuario y un ratón, que se hizo muy popular por su facilidad de uso.

QUINTA GENERACION


En vista de la acelerada marcha de la microelectrónica, la sociedad industrial se ha dado a la tarea de poner también a esa altura el desarrollo del software y los sistemas con que se manejan las computadoras. Surge la competencia internacional por el dominio del mercado de la computación, en la que se perfilan dos líderes que, sin embargo, no han podido alcanzar el nivel que se desea: la capacidad de comunicarse con la computadora en un lenguaje más cotidiano y no a través de códigos o lenguajes de control especializados.

Japón lanzó en 1983 el llamado "programa de la quinta generación de computadoras", con los objetivos explícitos de producir máquinas con innovaciones reales en los criterios mencionados. Y en los Estados Unidos ya está en actividad un programa en desarrollo que persigue objetivos semejantes, que pueden resumirse de la siguiente manera:

El futuro previsible de la computación es muy interesante, y se puede esperar que esta ciencia siga siendo objeto de atención prioritaria de gobiernos y de la sociedad en conjunto.