Hogar / La seguridad / Se creó el lenguaje de programación java. Introducción a Java. Ventajas de Java como lenguaje de programación

Se creó el lenguaje de programación java. Introducción a Java. Ventajas de Java como lenguaje de programación

lenguaje Java. Introducción.

Durante mucho tiempo fue difícil imaginar una revista de informática sin un artículo sobre el lenguaje Java. Incluso periódicos y revistas tan populares como The New York Times, The Washington Post y Business Week escribieron sobre él.

Es imposible recordar que National Public Radio alguna vez dedicó un programa de diez minutos a un lenguaje de programación. Si esto es bueno o malo depende del punto de vista. Una inversión de $100 millones en producción software creado usando un lenguaje de programación específico?! CNN, CNBC y otros medios de comunicación han estado y aún están hablando de cómo Java puede hacerlo y lo hará.

Sin embargo, este libro es para programadores serios, y dado que Java es un lenguaje de programación serio, tenemos mucho que cubrir. Por lo tanto, no nos sumergiremos en el análisis de las promesas publicitarias y trataremos de descubrir qué hay de cierto y qué es ficción en ellas. En su lugar, describiremos el lenguaje Java con suficiente detalle como lenguaje de programación (incluidas, por supuesto, las características que hacen posible su uso para trabajar en Internet, que, de hecho, causó tanto revuelo publicitario). Después de eso, intentaremos separar la realidad de la fantasía explicando lo que el lenguaje Java puede y no puede hacer.

Al principio, había un abismo entre las promesas publicitarias y las posibilidades reales del lenguaje Java. A medida que maduró, la tecnología se volvió más estable y confiable, y las expectativas cayeron a un nivel razonable. El lenguaje Java ahora se usa cada vez más para crear "middleware" que se comunica entre los clientes y los recursos del servidor (como las bases de datos).

Si bien estas importantes aplicaciones no son sorprendentes, es en esta área donde el lenguaje Java ha demostrado ser más útil debido a su independencia de la máquina, subprocesos múltiples y capacidades de programación en red. Además, el lenguaje Java ha tomado la delantera en los sistemas integrados, convirtiéndose en el estándar de facto para dispositivos portátiles, quioscos virtuales, computadoras a bordo de automóviles y similares. Sin embargo, los primeros intentos de reescribir programas Java ampliamente utilizados para Computadoras personales no tuvieron éxito: las aplicaciones resultantes resultaron ser lentas y de bajo consumo. Con la llegada de la nueva versión, algunos de estos problemas se han solucionado y, sin embargo, hay que reconocer que a los usuarios, en general, no les importa en absoluto en qué idioma están escritos los programas que compran. Creemos que las principales ventajas del lenguaje Java aparecerán en la creación de nuevos tipos de dispositivos y aplicaciones, y no en la reescritura de programas existentes.

El lenguaje Java como herramienta de programación

Cómo el lenguaje de programación Java ha superado sus promesas publicitarias. Sin duda, es uno de los mejores lenguajes al alcance de los programadores serios. Java tiene el potencial de ser un gran lenguaje de programación, pero probablemente ya sea demasiado tarde. Cuando aparece un nuevo lenguaje de programación, surge de inmediato el fastidioso problema de su compatibilidad con el software creado anteriormente. Además, incluso si se pueden realizar cambios en estos programas sin alterar su texto, es difícil para los creadores de un lenguaje tan bien recibido por el público, como el lenguaje Java, decir directamente: "Sí, podemos He cometido un error al desarrollar la versión X, pero la versión Y será mejor". Como resultado, mientras esperamos que aparezcan más mejoras, debemos afirmar que la estructura del lenguaje Java no cambiará significativamente en un futuro próximo.

La pregunta obvia es: ¿Cómo se ha mejorado el lenguaje Java?". Resulta que esto no se hizo mejorando el lenguaje de programación en sí, sino cambiando fundamentalmente las bibliotecas de programas escritos en lenguaje Java. Sun Microsystems ha cambiado todo: desde los nombres de las funciones de biblioteca individuales (haciéndolas más significativas) y los métodos de operación de los módulos gráficos (cambiando la forma en que se manejan los eventos y reescribiendo en parte los programas de trabajo), y terminando con la creación de nuevas funciones del lenguaje, como las funciones de impresión, que no estaban en Java 1.0. El resultado es una plataforma de programación mucho más útil que todas Versión anterior lenguaje Java.

Microsoft ha lanzado su propio producto llamado J++, que está relacionado con el lenguaje Java. El lenguaje J++ es interpretado por una máquina virtual compatible con Java Virtual Machine cuando se ejecuta el código de bytes, pero las interfaces con el código externo son significativamente diferentes entre estos lenguajes. Los lenguajes J++ y Java tienen casi la misma sintaxis. Sin embargo, Microsoft ha creado construcciones de lenguaje adicionales. Todos ellos tienen un valor bastante dudoso, con la excepción de Interfaz de Windows API. Además del hecho de que estos lenguajes tienen la misma sintaxis, sus bibliotecas principales (cadenas, utilidades, herramientas de programación de redes, herramientas de subprocesos múltiples, bibliotecas matemáticas, etc.) son esencialmente las mismas.

Sin embargo, las bibliotecas de gráficos, la interfaz de usuario y el acceso a objetos remotos son completamente diferentes para estos lenguajes. Actualmente, Microsoft ya no es compatible con el lenguaje J++, ya que ha desarrollado un nuevo lenguaje C# que tiene muchas similitudes con Java, pero usa una máquina virtual diferente. Este libro no cubre J++ o C#.

Beneficios del lenguaje Java

1) Una de las principales ventajas del lenguaje Java es independencia de la plataforma en la que se ejecutan los programas: El mismo código se puede ejecutar en los sistemas operativos Windows, Solaris, Linux, Machintosh, etc.
Esto es realmente necesario cuando los programas se descargan a través de Internet para su posterior ejecución en diferentes sistemas operativos.

2) Otra ventaja es que la sintaxis del lenguaje Java es similar a la sintaxis del lenguaje C ++, y para los programadores que conocen los lenguajes C y C ++, no es difícil aprenderlo. Es cierto que para los programadores que conocen el lenguaje Visual Basic, esta sintaxis puede resultar inusual.

Si nunca ha programado en C++, es posible que algunos de los términos utilizados en esta sección no le resulten claros. En este caso, puede omitirlo. Cuando llegue al final del Capítulo 6, estos términos le resultarán familiares.

3) Además, Java - un lenguaje completamente orientado a objetos, incluso más que C++. Todas las entidades en el lenguaje Java son objetos, con la excepción de algunos tipos primitivos, como los números. (Debido a que es fácil desarrollar proyectos complejos utilizando la programación orientada a objetos, ha reemplazado a la programación estructurada más antigua. Si no está familiarizado con la programación orientada a objetos, los capítulos 3 a 6 le brindarán toda la información que necesita al respecto).

Sin embargo, no es suficiente desarrollar otro dialecto ligeramente mejorado del lenguaje C++. Es de fundamental importancia que sea más fácil desarrollar programas libres de errores en Java que en C++. ¿Por qué? Los diseñadores del lenguaje Java han pensado mucho sobre por qué los programas escritos en C++ son tan propensos a errores. Dotaron al lenguaje Java de herramientas para eliminar la posibilidad misma de crear programas que escondieran los errores más comunes. Para ello se hace lo siguiente en lenguaje Java.

4) Se excluye la posibilidad de asignación y liberación explícita de memoria.
La memoria en el lenguaje Java se libera automáticamente mediante el mecanismo de recolección de elementos no utilizados. El programador está garantizado contra errores relacionados con el uso incorrecto de la memoria.

5) Se introducen matrices verdaderas y se prohíbe la aritmética de punteros.
Ahora los programadores, en principio, no pueden borrar datos de la memoria debido a mal uso punteros

6) Se excluye la posibilidad de confundir el operador de asignación con el operador de comparación de igualdad.
Ahora ni siquiera puedes compilar if(ntries = 3) . . . (Los programadores de Visual Basic pueden no notar ningún problema aquí, ya que este error es la fuente de la mayor parte de la confusión en C y C++).

7) Se excluye la herencia múltiple. Ha sido reemplazado por un nuevo concepto: una interfaz, tomada del lenguaje Objective C.
Una interfaz le brinda al programador casi todo lo que un programador puede obtener de la herencia múltiple mientras evita las complejidades de administrar jerarquías de clases.

Rasgos característicos del lenguaje Java.

Simple
Interpretado
Repartido
De confianza
Seguro
máquina independiente
Orientado a objetos
alto rendimiento
multiproceso
dinámica
Arquitectura informática independiente

Ya hemos tocado algunos de estos puntos en la última sección. En esta sección, proporcionaremos citas del manual del lenguaje Java, revelando las características del lenguaje; Compartamos con los lectores algunas reflexiones sobre ciertas propiedades del lenguaje, basadas en nuestra propia experiencia con su última versión.

Simple

Queríamos crear un sistema que sea fácil de programar, que no requiera capacitación adicional y que tenga en cuenta la práctica y los estándares de programación predominantes. Por lo tanto, aunque consideramos que C ++ no es adecuado para este propósito, Java fue diseñado para ser lo más similar posible para que el sistema sea más accesible. El lenguaje Java no contiene muchas de las características infrautilizadas, oscuras y oscuras de C++ que creemos que hacen más daño que bien.

La sintaxis del lenguaje Java es esencialmente una versión refinada de la sintaxis del lenguaje C++. Este lenguaje no tiene archivos de encabezado, aritmética de punteros (y los propios punteros), estructuras, uniones, sobrecarga de operadores, clases base virtuales, etc. (Las diferencias entre los lenguajes Java y C++ se describen en las notas sobre el lenguaje C++ repartidas por todo el libro). Sin embargo, los desarrolladores no intentaron solucionar todas las deficiencias del lenguaje C++.

Por ejemplo, la sintaxis de la sentencia switch en el lenguaje Java no ha cambiado. Conociendo el lenguaje C++, será fácil cambiar a la sintaxis del lenguaje Java.
Si sueles utilizar un entorno de programación visual (como Visual Basic), el lenguaje Java te resultará complicado.
Su sintaxis a menudo parece bastante extraña (aunque no es difícil entender el significado de la expresión). Más importante aún, cuando se trabaja en lenguaje Java, hay que programar mucho más. La belleza del lenguaje Visual Basic es que su entorno de programación visual le permite crear casi automáticamente la infraestructura de la aplicación. Para lograr el mismo resultado usando el lenguaje Java, necesita programar a mano, pero esto da como resultado programas mucho más cortos.

Sin embargo, existe un tercer tipo de entorno de programación que le permite crear programas usando la tecnología de "arrastrar y soltar".

Otro aspecto de la simplicidad es la brevedad. Uno de los objetivos del lenguaje Java es permitir el desarrollo de programas que puedan ejecutarse de forma totalmente independiente en máquinas pequeñas. El tamaño del intérprete principal y el soporte de clase es de unos 40 KB; las bibliotecas estándar y las herramientas de subprocesos (especialmente el micronúcleo autónomo) ocupan otros 17:Kb.
Este es un gran éxito. Tenga en cuenta, sin embargo, que las bibliotecas de soporte de GUI son mucho más grandes.

Orientado a objetos

En pocas palabras, la programación orientada a objetos es una técnica de programación que se centra en los datos (es decir, los objetos) y los medios para acceder a ellos. Haciendo una analogía con la carpintería, el artesano orientado a objetos se centra principalmente en la silla que está fabricando, y solo en segundo lugar está interesado en las herramientas necesarias para hacerlo; al mismo tiempo, el carpintero no orientado a objetos sólo piensa en sus herramientas. Las propiedades orientadas a objetos de Java y C++ son esencialmente las mismas.

La orientación a objetos ya ha demostrado su valor durante los últimos 30 años, y sin ella es imposible imaginar un lenguaje de programación moderno. De hecho, las características orientadas a objetos del lenguaje Java son comparables a las de C++. La principal diferencia entre ellos radica en el mecanismo de herencia múltiple, para el cual el lenguaje Java encontró una mejor solución, así como en el modelo de metaclase del lenguaje Java.

Los mecanismos de reflexión (Capítulo 5) y serialización de objetos (Capítulo 12) le permiten implementar objetos y herramientas persistentes para crear interfaces gráficas de usuario basadas en componentes listos para usar.

Si nunca ha programado en un lenguaje orientado a objetos, eche un vistazo de cerca a los Capítulos 4-6. Estos capítulos introducen los conceptos básicos de la programación orientada a objetos y muestran cómo se puede utilizar para desarrollar proyectos complejos sobre lenguajes de procedimientos tradicionales como C o Basic.

Repartido

Java tiene una gran biblioteca de programas para transferir datos basados ​​en protocolos TCP/IP (Protocolo de control de transmisión/Protocolo de Internet) como HTTP (Protocolo de transferencia de hipertexto) o FTP (Protocolo de transferencia de archivos). Las aplicaciones escritas en lenguaje Java pueden abrir y acceder a objetos a través de la red usando yURL (Ubicación uniforme de recursos - dirección de recurso universal) tan fácilmente como red local.

El lenguaje Java proporciona herramientas poderosas y convenientes para trabajar en la red. Cualquiera que haya intentado alguna vez escribir programas para Internet en otros idiomas se sorprenderá gratamente de la facilidad con la que se resuelven en Java las tareas más difíciles, como abrir conexiones de red (conexión de sockets). El mecanismo elegante, que consiste en los llamados servlets (servlets), hace que el trabajo en el servidor sea extremadamente eficiente.

Los servlets son compatibles con muchos populares servidores web. (La creación de redes se tratará en el segundo volumen). La comunicación entre objetos distribuidos en el lenguaje Java se proporciona mediante un mecanismo para llamar a métodos remotos (este tema también se trata en el segundo volumen).

De confianza

El lenguaje Java está diseñado para crear programas que deben funcionar de manera confiable en todas las situaciones. El enfoque del lenguaje Java está en la detección temprana posibles errores, comprobación dinámica (durante la ejecución del programa) y evitación de situaciones propensas a errores... La única diferencia significativa entre Java y C++ es el modelo de puntero del lenguaje Java, que elimina la posibilidad de sobrescritura de memoria y corrupción de datos.

Esta propiedad también es muy útil. El compilador del lenguaje Java detecta errores que en otros lenguajes solo se detectan en tiempo de ejecución. Además, los programadores que han pasado muchas horas buscando un error de corrupción de memoria debido a un mal puntero estarán muy contentos de que tales problemas en principio no puedan surgir en el lenguaje Java.

Si alguna vez ha programado en lenguajes Visual Basic o COBOL que no usan punteros explícitamente, es posible que no entienda por qué esto es tan importante. Los programadores de C son mucho menos afortunados. Necesitan punteros para acceder a cadenas, matrices, objetos e incluso archivos. Al programar en Visual Basic, no se requiere nada de esto y el programador no tiene que preocuparse por asignar memoria para estas entidades. Por otro lado, muchas estructuras de datos en un lenguaje que no tiene punteros son muy difíciles de implementar. Las estructuras ordinarias como cadenas y matrices no necesitan punteros. Todo el poder de los punteros se manifiesta solo donde no se puede prescindir de ellos, por ejemplo, al crear listas enlazadas. El programador de Java se salva para siempre de malos punteros, malas asignaciones y fugas de memoria.

Seguro

El lenguaje Java está diseñado para ser utilizado en un entorno distribuido o en red. Por esta razón, se ha prestado mucha atención a la seguridad. El lenguaje Java le permite crear sistemas que están protegidos contra virus y manipulaciones.

En la primera edición escribimos, "Nunca digas nunca", y teníamos razón. Un grupo de expertos en seguridad de la Universidad de Princeton descubrió los primeros errores de seguridad en Java 1.0 poco después de que saliera a la venta la primera versión de JDK. Además, tanto ellos como otros especialistas seguían encontrando cada vez más fallos en los mecanismos de seguridad de todas las versiones posteriores del lenguaje Java.

En el lado positivo de esta situación, el Grupo de Desarrollo del Lenguaje Java ha declarado tolerancia cero para cualquier error en el sistema de seguridad e inmediatamente se dispuso a solucionar cualquier problema encontrado en el mecanismo de seguridad del applet. En particular, al publicar especificaciones internas para el intérprete de lenguaje Java, Sun ha facilitado mucho la búsqueda de errores de seguridad ocultos y los ha subcontratado a expertos independientes.

Esto aumentó la probabilidad de que pronto se descubrieran todas las vulnerabilidades de seguridad. En cualquier caso, es extremadamente difícil burlar el sistema de seguridad del lenguaje Java. Los errores encontrados hasta ahora han sido casi imperceptibles y su número es (relativamente) pequeño.

La página web de seguridad de Sun tiene la siguiente URL: http://java.sun.com/sfaq/.

Aquí hay algunas situaciones que el sistema de seguridad de Java evita que ocurran.

1) El desbordamiento de pila del programa ejecutable, que fue causado por el infame "gusano" que se propagó en Internet.

2) Daño a áreas de memoria que están fuera del espacio asignado al proceso.

3) Leer y escribir archivos locales cuando se usa un cargador de clases seguro, como un navegador web, que prohíbe dicho acceso a archivos.

Todas estas medidas de seguridad son adecuadas y suelen funcionar a la perfección, pero la discreción nunca está de más. Si bien los errores descubiertos hasta la fecha están lejos de ser triviales, y los detalles para encontrarlos a menudo se mantienen en secreto, debe admitirse que probar la seguridad del lenguaje Java probablemente ya no sea posible.

Con el tiempo, se han agregado nuevas funciones de seguridad al idioma. A partir de la versión 1.1, el lenguaje Java introdujo la noción de clases firmadas digitalmente. Al utilizar una clase con firma digital, puede estar seguro de su autor. Si confía en él, puede otorgar a esta clase todos los privilegios disponibles en su máquina.

Un mecanismo de entrega de código alternativo propuesto por Microsoft se basa en la tecnología ActiveX y utiliza únicamente firmas digitales para la seguridad. Obviamente, esto no es suficiente: cualquier usuario de software de Microsoft puede atestiguar que los programas de fabricantes conocidos a menudo fallan, lo que crea un riesgo de corrupción de datos. El sistema de seguridad en el lenguaje Java es mucho más fuerte que la tecnología ActiveX, ya que controla la aplicación desde el momento en que se inicia y no permite que cause daño.

arquitectura independiente

El compilador genera un archivo de objeto cuyo formato no depende de la arquitectura de la computadora: el programa compilado se puede ejecutar en cualquier procesador bajo el control del sistema de ejecución del programa Java. Para hacer esto, el compilador del lenguaje Java genera comandos, bytecode, que no dependen de la arquitectura específica de la computadora. El código de bytes está diseñado de tal manera que cualquier máquina puede interpretarlo fácilmente o traducirlo a un código dependiente de la máquina sobre la marcha.

No es Idea Nueva. Hace más de 20 años, tanto el sistema de implementación Pascal desarrollado por Niclaus Wirth como el sistema Pascal de UCSD usaban la misma tecnología. El uso de bytecodes proporciona una gran ganancia en la ejecución del programa (sin embargo, la compilación síncrona lo compensa en muchos casos). Los desarrolladores del lenguaje Java han hecho un gran trabajo al desarrollar un conjunto de instrucciones de código de bytes que funcionan muy bien en la mayoría de computadoras modernas, traduciéndose fácilmente en instrucciones reales de la máquina.

máquina independiente

A diferencia de los lenguajes C y C++, no hay aspectos de la especificación Java que dependan del sistema de implementación. Tanto el tamaño de los tipos de datos básicos como las operaciones aritméticas sobre ellos están bien definidos.

Por ejemplo, el tipo int en el lenguaje Java siempre significa un número entero de 32 bits. En C y C++, el tipo int puede significar un entero de 16 bits, un entero de 32 bits o un entero de tamaño arbitrario, según lo elija el desarrollador de un compilador en particular. La única restricción es que el tamaño de un int no puede ser menor que el tamaño de un int corto y mayor que el tamaño de un int largo. El tamaño fijo de los tipos numéricos evita muchas de las molestias asociadas con la ejecución de programas en diferentes computadoras. Los datos binarios se almacenan y transmiten en un formato fijo, lo que también evita malentendidos asociados con diferentes ordenes de bytes en diferentes plataformas (conflicto "big endian/little endian"). Las líneas se almacenan en formato estandar Unicode.

Las bibliotecas que forman parte del sistema definen una interfaz independiente de la máquina. Por ejemplo, el lenguaje proporciona una clase de ventana abstracta y sus implementaciones para los sistemas operativos Unix, Windows y Macintosh.

Cualquiera que haya intentado alguna vez escribir un programa que funcione igual de bien en Windows, Macintosh y las diez versiones de Unix sabe que esta es una tarea muy difícil. La versión de Java hizo un intento heroico de resolver este problema al proporcionar un conjunto de herramientas simple que adapta los elementos comunes de la interfaz de usuario a una gran cantidad de plataformas de software. Desafortunadamente, la biblioteca, en la que se dedicó mucho trabajo, no nos permitió lograr resultados aceptables en diferentes plataformas. (Al mismo tiempo, aparecieron diferentes errores en los programas de gráficos en diferentes plataformas).

Sin embargo, esto fue solo el comienzo. En muchas aplicaciones, la independencia de la máquina es mucho más importante que la sofisticación de una interfaz gráfica de usuario. Son estas aplicaciones las que se han beneficiado de la introducción de Java 1.0. Sin embargo, el conjunto de herramientas de GUI ahora se ha rediseñado por completo y ya no depende de la interfaz de usuario en la computadora host. Una nueva version más significativo y, en nuestra opinión, más atractivo para el usuario que los anteriores.

Interpretado

El intérprete de lenguaje Java se puede enviar a cualquier máquina y ejecutar bytecode directamente en ella. Debido a que la edición de enlaces es un proceso más fácil, la programación puede volverse mucho más rápida y eficiente.

Quizás esto sea una ventaja en el desarrollo de aplicaciones, pero la cita es una clara exageración. En cualquier caso, el compilador del lenguaje Java incluido en el JSDK (Java Software Development Kit) es bastante lento. (Algunos compiladores del tercer tipo, como los de IBM, son mucho más rápidos.) La velocidad de recompilación es sólo un factor en la eficiencia de un entorno de programación. Comparando la velocidad de los entornos de programación Java y Visual Basic, es posible que se sienta decepcionado.

alto rendimiento

Si bien los códigos de bytes generalmente interpretados tienen un rendimiento más que suficiente, hay situaciones en las que se requiere un rendimiento aún mejor. Los códigos de bytes se pueden traducir sobre la marcha (en tiempo de ejecución) en códigos de máquina para el procesador particular en el que se ejecuta la aplicación.

Si se usa un intérprete para ejecutar bytecodes, no debe usar la frase " alto rendimiento". Sin embargo, en muchas plataformas, es posible otro tipo de compilación, proporcionada por compiladores síncronos (compiladores justo a tiempo-JIT). Traducen el código de bytes en código dependiente de la máquina, almacenan el resultado en la memoria y luego lo llaman cuando sea necesario Dado que esta interpretación se ejecuta solo una vez, este enfoque aumenta la velocidad muchas veces.

Aunque los compiladores síncronos siguen siendo más lentos que los compiladores específicos de máquina, son al menos mucho más rápidos que los intérpretes, y proporcionan aceleraciones de 10x o incluso 20x para algunos programas. Esta tecnología se mejora constantemente y eventualmente puede alcanzar velocidades que los compiladores tradicionales nunca superarán. Por ejemplo, un compilador síncrono puede determinar qué fragmento de código se ejecuta con más frecuencia y optimizarlo para la velocidad de ejecución.

MULTIHILOS

Proporciona una mejor interactividad y ejecución del programa.

Si alguna vez ha probado el multiproceso en cualquier otro lenguaje de programación, se sorprenderá gratamente de lo fácil que es hacerlo en Java. Los hilos en el lenguaje Java pueden aprovechar los sistemas multiprocesador si el sistema operativo lo permite. Desafortunadamente, las implementaciones de subprocesos en la mayoría de las plataformas varían ampliamente y los diseñadores del lenguaje Java no hacen ningún esfuerzo por lograr la uniformidad. Solo el código para llamar a los subprocesos sigue siendo el mismo para todas las máquinas; El lenguaje Java deja la implementación de subprocesos múltiples al sistema operativo subyacente o la biblioteca de subprocesos. (Los flujos se describen en el Volumen 2). A pesar de esto, es la facilidad de organización informática multiproceso hace que el lenguaje Java sea tan atractivo para el desarrollo de software de servidor.

dinámica

En muchos sentidos, Java es más dinámico que C o C++. Ha sido diseñado para adaptarse fácilmente a un entorno en constante cambio. Puede agregar libremente nuevos métodos y objetos a las bibliotecas sin causar ningún daño. El lenguaje Java facilita la obtención de información sobre el progreso de un programa.

Esto es muy importante cuando desea agregar código a un programa que ya se está ejecutando. Un buen ejemplo de esto es el código que se descarga de Internet para que lo ejecute un navegador. En Java 1.0, obtener información sobre el progreso de un programa en ejecución no era nada fácil, pero la versión actual del lenguaje Java expone al programador tanto la estructura como el comportamiento de los objetos en el programa en ejecución.
Esto es muy valioso para los sistemas que deben analizar objetos durante la ejecución del programa. Estos sistemas incluyen herramientas GUI, depuradores inteligentes, complementos y bases de datos de objetos.

Lenguaje Java e Internet

La idea es simple: los usuarios descargan códigos byte de Java de Internet y los ejecutan en sus máquinas. Los programas Java que se ejecutan en navegadores web se denominan subprogramas. Para usar el applet, necesita un navegador web que admita el lenguaje Java y pueda interpretar los códigos de bytes. El código fuente de Java tiene licencia de Sun, que insiste en la inmutabilidad tanto del lenguaje en sí como de la estructura de sus bibliotecas principales. Lamentablemente, la realidad no es así. Las diferentes versiones de los navegadores Netscape e Internet Explorer admiten diferentes versiones del lenguaje Java, y algunas de estas versiones están significativamente desactualizadas. Esta desafortunada situación crea cada vez más obstáculos en el desarrollo de applets que aprovechan ultima versión lenguaje Java. Para resolver este problema, Sun ha desarrollado un complemento de Java que proporciona el entorno más avanzado para ejecutar programas Java basados ​​en los navegadores Netscape e Internet Explorer.

Cargar un applet es como incrustar una imagen en una página web. El applet se convierte en parte de la página y el texto se ajusta al espacio que ocupa. Sin embargo, la diferencia es que la imagen ahora está viva. Responde a los comandos del usuario, cambia su apariencia y proporciona transferencia de datos entre la computadora en la que se ve el subprograma y la computadora que controla el subprograma.

Cargar un applet es como insertar una imagen en una página web. El applet se convierte en parte de la página y el texto se ajusta al espacio que ocupa. El caso es que la imagen está "en vivo". Responde a los comandos del usuario, cambia su apariencia y transfiere datos entre la computadora que ejecuta el subprograma y la computadora que ejecuta el subprograma.

En la fig. La figura 1.1 muestra un buen ejemplo de una página web dinámica que realiza cálculos complejos y utiliza un subprograma para dibujar moléculas. Para comprender mejor la estructura de la molécula, puede rotarla o acercarla con el mouse. Tales manipulaciones no se pueden implementar en páginas web estáticas, pero los subprogramas lo hacen posible. (Este subprograma se puede encontrar en http://jmol.sourceforge.net).

Arroz. 1.1. Subprograma Jmol

Los applets se pueden usar para agregar nuevos botones y campos de texto a una página web. Sin embargo, tales applets tardan en cargarse a través de la línea telefónica.

Se puede hacer lo mismo con HTML dinámico, formas de HTML (lenguaje de marcado de hipertexto) o un lenguaje de secuencias de comandos como JavaScript. Por supuesto, los primeros applets se diseñaron para la animación: globos giratorios, personajes de dibujos animados que bailan, textos artísticos, etc. Sin embargo, la mayoría de los anteriores también pueden crear GIF animados, y HTML dinámico combinado con secuencias de comandos hace mucho más que applets.

Como resultado de la incompatibilidad del navegador y la inconsistencia en el proceso de descarga debido a la lentitud conexiones de red Los applets diseñados para páginas web no han sido un gran logro. En las redes locales (intranets) la situación es completamente diferente. Por lo general, no tienen problemas de ancho de banda, por lo que el tiempo de carga de los subprogramas no es significativo. En la red local, puede seleccionar el navegador deseado o utilizar el complemento de Java. Los empleados no pueden mover un programa entregado a través de la red a la ubicación incorrecta o instalarlo incorrectamente, y administrador de sistema no es necesario pasar por alto todas las máquinas cliente y actualizar los programas en ellas. Muchas empresas han desarrollado un gran número de programas para la gestión de inventario, la planificación de vacaciones, el reembolso de viajes y similares en forma de applets que utilizan navegadores.

Mientras escribíamos este libro, el péndulo osciló de la programación del lado del cliente a la programación del lado del servidor. En particular, los servidores de aplicaciones pueden usar capacidades de monitoreo máquina virtual Java para balanceo de carga automático, agrupación de enlaces de bases de datos, sincronización de objetos, apagado y recarga seguros y otros procesos necesarios para aplicaciones de servidor escalables que son casi imposibles de implementar correctamente. Así, los programadores que crean aplicaciones tienen la oportunidad de comprar estos complejos mecanismos, en lugar de desarrollarlos ellos mismos. Esto aumentó la productividad de los programadores: se centraron en la lógica de sus programas, sin distraerse con los detalles asociados con el funcionamiento de los servidores.

Java es un lenguaje de programación de los microsistemas de Sun. Originalmente desarrollado como un lenguaje de programación dispositivos electrónicos, pero luego se usó para escribir aplicaciones de software de servidor. Los programas Java son multiplataforma, es decir, pueden ejecutarse en cualquier sistema operativo.

Fundamentos de la programación Java

Java, como lenguaje orientado a objetos, sigue los principios básicos de OOP:

  • herencia;
  • polimorfismo;
  • encapsulación

En el centro de "Java", como en otros OOP, hay un objeto y una clase con constructores y propiedades. Es mejor comenzar a aprender el lenguaje de programación Java no de los recursos oficiales, sino de los manuales para principiantes. En tales manuales, las características se describen en detalle, se proporcionan ejemplos de código. Libros como El lenguaje de programación Java para principiantes explican en detalle los principios básicos y las características del lenguaje mencionado.

Peculiaridades

El código en el lenguaje de programación Java se traduce a bytecode y luego se ejecuta en la máquina virtual JVM. La conversión a bytecode se realiza en Javac, Jikes, Espresso, GCJ. Hay compiladores que traducen el lenguaje C al bytecode de Java. Por lo tanto, una aplicación C puede ejecutarse en cualquier plataforma.

La sintaxis "Java" se caracteriza por lo siguiente:

  1. Los nombres de las clases deben comenzar con una letra mayúscula. Si el nombre consta de varias palabras, entonces la segunda debe comenzar con mayúscula.
  2. Si se utilizan varias palabras para formar el método, entonces la segunda de ellas debe comenzar con una letra mayúscula.
  3. El procesamiento comienza con el método main() - es parte de cada programa.

Tipos

El lenguaje de programación Java tiene 8 tipos primitivos. Se presentan a continuación.

  • Boolean es un tipo booleano que toma solo dos valores verdadero y falso.
  • Byte es el tipo de entero más pequeño con un tamaño de 1 byte. Se utiliza cuando se trabaja con archivos o datos binarios sin procesar. Tiene un rango de -128 a 127.
  • Short tiene un rango de -32768 a 32767 y se usa para representar números. El tamaño de las variables de este tipo es de 2 bytes.
  • Int también significa números, pero su tamaño es de 4 bytes. Se usa con mayor frecuencia para trabajar con datos enteros, y byte y short a veces se promocionan a int.
  • Long se utilizan para números enteros grandes. Los valores posibles van desde -9223372036854775808 hasta 9223372036854775807.
  • Flotante y doble se utilizan para denotar fracciones. Su diferencia es que float es conveniente cuando no se requiere una alta precisión en la parte fraccionaria del número.
  • Double muestra todos los caracteres después del delimitador ".", y float, solo el primero.
  • String es el tipo primitivo más utilizado para definir cadenas.

Clases y Objetos

Las clases y los objetos juegan un papel importante en el aprendizaje del lenguaje de programación Java para principiantes.

Una clase define una plantilla para un objeto, debe tener atributos y métodos. Para crearlo, utilice la palabra clave Clase. Si se crea en un archivo separado, entonces el nombre de la clase y el archivo deben ser iguales. El nombre en sí consta de dos partes: nombre y extensión.Java.

En Java, puede crear una subclase que heredará los métodos del padre. Para esto, se usa la palabra extiende:

  • class nombreclase extiende nombresuperclase();

Un constructor es miembro de cualquier clase, incluso si no se establece explícitamente. En este caso, el compilador lo crea por su cuenta:

  • clase pública Clase( clase pública()( ) clase pública(nombre de la cadena)( ))

El nombre del constructor es el mismo que el nombre de la clase, por defecto solo tiene un parámetro:

  • Cachorro público (nombre de la cadena)

Un objeto se crea a partir de una clase usando el operador new():

  • Punto p = nuevo Punto()

Recibe todos los métodos y propiedades de la clase, con la ayuda de los cuales interactúa con otros objetos. Un objeto puede usarse varias veces bajo diferentes variables.

    Punto p = nuevo Punto()

    clase DosPuntos(

    public static void main(String args) (

    Punto p1 = nuevo Punto();

    Punto p2 = nuevo Punto();

    Las variables de objeto y los objetos son entidades completamente diferentes. Las variables de objeto son enlaces. Pueden apuntar a cualquier variable de tipo no primitivo. A diferencia de C++, su conversión de tipo está estrictamente regulada.

    Campos y Métodos

    Los campos son todas las variables asociadas con una clase u objeto. Son locales por defecto y no se pueden usar en otras clases. El operador "." se utiliza para acceder a los campos:

    • variable de nombre de clase

    Puede especificar campos estáticos con la palabra clave estática. Dichos campos son la única forma de almacenar variables globales. Esto se debe al hecho de que simplemente no hay variables globales en Java.

    Se implementó la capacidad de importar variables para obtener acceso desde otros paquetes:

    • importar nombre de clase estático;

    Un método es una subrutina para aquellas clases en las que se declara. Descrito al mismo nivel que las variables. Se especifica como una función y puede ser de cualquier tipo, incluido el vacío:

    • clase Punto (int x, y;

      void init(int a, int b) (

    En el ejemplo anterior, la clase Point tiene un número entero x e y, un método init(). Se accede a los métodos, al igual que a las variables, usando el operador ".":

    • punto.init();

    La propiedad init no devuelve nada, por lo que es de tipo void.

    Variables

    En el tutorial del lenguaje de programación Java, las variables ocupan un lugar aparte. Todas las variables tienen un tipo específico, determina el lugar requerido para almacenar valores, el rango de valores posibles, la lista de operaciones. Antes de manipular los valores, se declaran las variables.

    Se pueden declarar varias variables al mismo tiempo. Se usa una coma para enumerarlos:

    • int a, b, c;

    La inicialización se realiza después o durante la declaración:

    int a = 10, b = 10;

    Hay varios tipos:

    • variables locales (locales);
    • variables de instancia (variables de instancia);
    • variables estáticas (estáticas).

    Las variables locales se declaran en métodos y constructores, se crean durante el inicio de este último y se destruyen después de la finalización. Para ellos, está prohibido especificar modificadores de acceso y controlar el nivel de accesibilidad. No son visibles fuera del bloque declarado. En Java, las variables no tienen un valor inicial, por lo que se debe asignar uno antes del primer uso.

    Las variables de instancia deben declararse dentro de la clase. Se utilizan como métodos, pero solo se puede acceder a ellos después de que se haya creado el objeto. La variable se destruye cuando se destruye el objeto. Las variables de instancia, a diferencia de las variables locales, tienen valores predeterminados:

    • números - 0;
    • lógica - falso;
    • las referencias son nulas.

    Las variables estáticas se denominan variables de clase. Sus nombres comienzan con un carácter en mayúscula y se especifican con el modificador estático. Se usan como constantes, respectivamente, se les agrega un especificador de la lista:

    • final;
    • privado;
    • público.

    Se ejecuta al principio del programa, se destruye después de que se detiene la ejecución. Al igual que las variables de instancia, tienen valores predeterminados que se asignan a variables vacías. Los números tienen el valor 0, los booleanos tienen el valor falso, las referencias a objetos son inicialmente nulas. Las variables estáticas se llaman de la siguiente forma:

    • ClassName.VariableName.

    Recolector de basura

    En el Tutorial del Lenguaje de Programación Java para Principiantes, la sección del recolector automático de basura es la más interesante.

    En Java, a diferencia del lenguaje C, no es posible extracción manual objeto de la memoria. Para esto, se implementa un método de eliminación automática: el recolector de basura. Con la eliminación tradicional a través de nulo, solo se elimina la referencia al objeto y se elimina el objeto en sí. Existen métodos para la recolección forzada de basura, aunque no se recomiendan para un uso normal.

    El módulo para la eliminación automática de objetos no utilizados se ejecuta en segundo plano y se inicia cuando el programa está inactivo. Para borrar objetos de la memoria, el programa se detiene, después de liberar la memoria, se reanuda la operación interrumpida.

    modificadores

    Distinguir diferentes tipos modificadores Además de los que determinan el método de acceso, existen modificadores para métodos, variables y una clase. Los métodos declarados como privados solo están disponibles en la clase declarada. Estas variables no se pueden utilizar en otras clases y funciones. Public da acceso a cualquier clase. Si necesita obtener una clase pública de otro paquete, primero debe importarla.

    El modificador protected tiene una acción similar a public: abre el acceso a los campos de clase. En ambos casos, las variables se pueden utilizar en otras clases. Pero el modificador público está disponible para absolutamente todos, y el modificador protegido está disponible solo para clases heredadas.

    El modificador que se aplica al crear métodos es estático. Esto significa que el método generado existe independientemente de las instancias de la clase. El modificador Final no controla el acceso, pero indica la imposibilidad de una mayor manipulación de los valores del objeto. Prohíbe cambiar el elemento para el que se especifica.

    Final for campos hace que sea imposible cambiar el primer valor de la variable:

      Método de vacío estático público (argumentos de cadena) (

      int final Nombre = 1;

      int Name = 2; // lanzará un error

    Las variables con el modificador final son constantes. Por lo general, se escriben solo en mayúsculas. CamelStyle y otras formas no funcionan.

    Final para métodos indica una prohibición de cambiar un método en una clase heredada:

      final void myMethod() (

      System.out.printIn("Hola mundo");

    Final para clases significa que no puede crear descendientes de clase:

      Clase de clase pública final (

    Abstract: modificador para crear clases abstractas. Cualquier clase abstracta y métodos abstractos están destinados a extenderse aún más en otras clases y bloques. modificador transitorio le dice a la máquina virtual que no procese la variable dada. En este caso, simplemente no se guardará. Por ejemplo, transitorio int Name = 100 no persistirá, pero int b sí.

    Plataformas y versiones

    Familias de lenguajes de programación Java existentes:

    • edición estándar.
    • Edición de Empresa.
    • Microedición.
    • tarjeta.

    1. SE - es el principal, ampliamente utilizado para crear aplicaciones personalizadas para uso individual.
    2. EE es un conjunto de especificaciones para el desarrollo de software empresarial. Contiene más funciones que SE, por lo que se utiliza a escala comercial en empresas grandes y medianas.
    3. ME: diseñado para dispositivos con energía y memoria limitadas, por lo general tienen un tamaño de pantalla pequeño. Dichos dispositivos son teléfonos inteligentes y PDA, receptores televisión digital.
    4. Tarjeta: diseñada para dispositivos con recursos informáticos extremadamente limitados, como tarjetas inteligentes, tarjetas SIM, cajeros automáticos. Para estos efectos, se ha cambiado el bytecode, los requisitos de la plataforma y los componentes de las librerías.

    Solicitud

    Los programas en el lenguaje de programación Java tienden a ser más lentos y toman más memoria de acceso aleatorio. Un análisis comparativo de los lenguajes Java y C mostró que C es un poco más productivo. Tras numerosos cambios y optimizaciones de la máquina virtual Java, ha mejorado su rendimiento.

    Utilizado activamente para aplicaciones para Android. El programa se compila en un código de bytes no estándar y se ejecuta en la máquina virtual ART. Android Studio se utiliza para la compilación. Este IDE de Google es el IDE oficial de desarrollo de Android.

    Microsoft ha desarrollado su propia implementación de Java Virtual Machine MSJVM. Tenía tales diferencias que rompieron el concepto fundamental de multiplataforma: no había soporte para algunas tecnologías y métodos, había extensiones no estándar que funcionaban solo en la plataforma Windows. Microsoft lanzó el lenguaje J#, cuya sintaxis y funcionamiento general es muy similar a Java. No se ajustaba a la especificación oficial y finalmente se eliminó del kit de herramientas estándar para desarrolladores de Microsoft Visual Studio.

    Entorno y lenguaje de programación Java

    El desarrollo de software se lleva a cabo en los siguientes IDEs:

    1. IDE de NetBeans.
    2. Eclipse IDE.
    3. IDEA IntelliJ.
    4. jDeveloper.
    5. Java para iOS.
    6. Geany.

    Oracle distribuye el JDK como un kit de desarrollo de Java. Incluye compilador, bibliotecas estándar, utilidades, sistema ejecutivo. Los entornos de desarrollo integrados modernos se basan en JDK.

    Es conveniente escribir código en el lenguaje de programación Java en Netbeans y el IDE de Eclipse. Estos son entornos de desarrollo integrados gratuitos, son adecuados para todas las plataformas Java. También se utiliza para programar en Python, PHP, JavaScript, C++.

    IntelliJ IDE de Jetbrains se distribuye en dos versiones: gratuita y comercial. Admite la escritura de código en muchos lenguajes de programación, existen complementos de terceros de desarrolladores que implementan incluso más lenguajes de programación.

    JDeveloper es otro desarrollo de Oracle. Completamente escrito en Java, por lo que funciona en todos los sistemas operativos.

Introducción

Este trabajo está dedicado a uno de los lenguajes de programación más prometedores de la actualidad: el lenguaje Java. La tecnología llamada "Java" puede, sin exagerar, llamarse revolucionaria en la industria del desarrollo de software.

La clasificación se puede implementar en otros lenguajes de programación como PHP, C++, etc. Es mucho más rentable en Java. Los detalles se discuten a continuación. La novedad radica en que el programa de clasificación en este lenguaje y en esta interpretación no ha sido implementado previamente.

Para implementar la tarea, se propuso un algoritmo para escribir un programa. Además, este algoritmo se implementó en Java.

Descripción del lenguaje de programación Java

Características generales de Java

Se eligió el lenguaje Java para escribir el programa clasificador. Java es un lenguaje de programación orientado a objetos desarrollado por Sun Microsystems desde 1991 y lanzado oficialmente el 23 de mayo de 1995. Inicialmente, el nuevo lenguaje de programación se llamó Oak (James Gosling) y se desarrolló para la electrónica de consumo, pero luego se le cambió el nombre a Java y comenzó a usarse para escribir subprogramas, aplicaciones y software de servidor.

El lenguaje de programación Java es diferente a cualquier otro que exista. Está diseñado para facilitar el trabajo en computadoras en la WWW a través de navegadores. Hoy en día, cada computadora tiene un navegador. A su vez, cada navegador es compatible con Java. Esto significa que puede ver documentos almacenados en todo el mundo y, al hacer clic en un enlace, activar un programa Java que se transferirá a través de la red y se ejecutará en su computadora.

Una de las principales ventajas del lenguaje Java es su independencia de la plataforma y el tipo de computadora en la que se ejecutan los programas. Por lo tanto, el mismo código se puede ejecutar en los sistemas operativos Windows, Linux, FreeBSD, Solaris, Apple Mac, etc. Esto se vuelve muy importante cuando los programas se descargan a través de Internet global y se usan en varias plataformas. El lenguaje de programación Java puede funcionar no solo con textos y gráficos estáticos, sino también con varios objetos dinámicos.

Otra ventaja igualmente importante de Java es su gran similitud con el lenguaje de programación C++. Por tanto, para aquellos programadores que estén familiarizados con la sintaxis de C y C++, será sencillo aprender Java.

Además, Java es un lenguaje completamente orientado a objetos, incluso más que C++. Todas las entidades en el lenguaje Java son objetos, con la excepción de algunos tipos primitivos, como los números.

También es importante que sea mucho más fácil desarrollar programas en Java que no contengan errores que en C++.

El caso es que los desarrolladores del lenguaje Java de la empresa Sun realizaron un análisis fundamental de los programas en el lenguaje C++. Se analizaron los "cuellos de botella" del código fuente, que dan lugar a la aparición de errores difíciles de detectar. Por lo tanto, se tomó la decisión de diseñar el lenguaje Java con la capacidad de crear programas que ocultaran los errores más comunes.

Para ello se hizo lo siguiente:

los desarrolladores han eliminado la posibilidad de asignar y liberar memoria explícitamente.

Por ejemplo, la memoria en Java se libera automáticamente a través de la recolección de elementos no utilizados. Resulta que el programador está asegurado contra errores que surgen por el uso indebido de la memoria.

la introducción de matrices verdaderas y la prohibición de punteros.

Ahora los programadores no pueden borrar datos de la memoria debido al uso incorrecto de punteros.

se excluyó la posibilidad de confundir el operador de asignación con el operador de comparación por igualdad. Como regla general, el problema con el signo "=" muy a menudo conduce a errores lógicos en C y C ++, que no son tan fáciles de detectar. Especialmente en programas grandes.

la herencia múltiple está completamente excluida. Ha sido reemplazado por un nuevo concepto: una interfaz, cuya idea se tomó prestada del lenguaje Objective C.

Una interfaz le brinda al programador casi todo lo que un programador puede obtener de la herencia múltiple, al tiempo que evita las complejidades que conlleva la administración de jerarquías de clases.

La última versión es la versión 1.6, que ha mejorado la seguridad, mejoró la compatibilidad con el lenguaje de secuencias de comandos Mozilla Rhino, mejoró la integración del escritorio y agregó algunas características nuevas en la creación de interfaces gráficas.

Java y Microsoft

Las siguientes empresas se centran principalmente en tecnologías Java (J2EE) en lugar de .NET, aunque también se ocupan de este último: IBM, Oracle. En particular, Oracle DBMS incluye una JVM como componente, lo que brinda la capacidad de programar directamente el DBMS en el lenguaje Java, incluidos, por ejemplo, los procedimientos almacenados.

Características clave

Ejemplo de programa

Programa que imprime "Hello, World!":

Clase pública HelloWorld ( public static void main(String args) ( System .out .println ("¡Hola, mundo!" ) ; ) )

Un ejemplo de uso de plantillas:

Importar java.util.*; Muestra de clase pública (public static void main(String args) ( // Crear un objeto a partir de una plantilla. Lista cadenas = nueva lista enlazada () ; cadenas.add("Hola"); cadenas.add("mundo" ); cadenas.añadir("!"); for (String s: strings) ( System .out .print (s) ; System .out .print (" " ) ; ) ) )

Ideas claves

tipos primitivos

Solo hay 8 tipos escalares en el lenguaje Java: boolean, byte, char, short, int, long, float, double.

Clases contenedoras para tipos primitivos

Las longitudes y los rangos de valores de los tipos primitivos están definidos por el estándar, y no la implementación y se dan en la tabla. El tipo char se hizo de dos bytes por conveniencia de localización (uno de los principios ideológicos de Java): cuando se formó el estándar, ya existía Unicode-16, pero no Unicode-32. Dado que no quedó ningún tipo de byte único en el resultado, se agregó un nuevo tipo de byte. Los tipos float y double pueden tener valores especiales y "no son un número" (

Tipo de Longitud (en bytes) Rango o conjunto de valores
booleano indefinido verdadero Falso
byte 1 −128..127
carbonizarse 2 0..2 16 -1, o 0..65535
corto 2 −2 15 ..2 15 -1, o −32768..32767
En t 4 −2 31 ..2 31 -1, o −2147483648..2147483647
largo 8 −2 63 ..2 63 -1, o aproximadamente −9.2 10 18 ..9.2 10 18
flotar 4 -(2-2 -23) 2 127 ..(2-2 -23) 2 127 , o aproximadamente −3.4 10 38 ..3.4 10 38 , así como , , NaN
doble 8 -(2-2 -52) 2 1023 ..(2-2 -52) 2 1023 , o aproximadamente −1.8 10 308 ..1.8 10 308 , y también , , NaN

Una estandarización tan rígida era necesaria para que el lenguaje fuera independiente de la plataforma, que es uno de los requisitos ideológicos de Java y una de las razones de su éxito. Sin embargo, aún quedaba un pequeño problema con la independencia de la plataforma. Algunos procesadores utilizan registros de 10 bytes para el almacenamiento intermedio de resultados o mejoran la precisión de los cálculos de otras formas. Para hacer que Java sea lo más interoperable posible entre diferentes sistemas, en las primeras versiones se prohibió cualquier forma de mejorar la precisión de los cálculos. Sin embargo, esto resultó en un rendimiento más lento. Resultó que pocas personas necesitan el deterioro de la precisión en aras de la independencia de la plataforma, especialmente si tienen que pagar por ello ralentizando el trabajo de los programas. Después de numerosas protestas, se eliminó esta prohibición, pero se agregó la palabra clave strictfp para deshabilitar la mejora de la precisión.

Transformaciones en Operaciones Matemáticas

El lenguaje Java tiene las siguientes reglas:

  1. Si un operando es de tipo doble, el otro también se convierte al tipo doble.
  2. De lo contrario, si un operando es de tipo flotante, el otro también se convierte a tipo flotante.
  3. De lo contrario, si un operando es de tipo largo, el otro también se convierte al tipo largo.
  4. De lo contrario, ambos operandos se convierten al tipo int.

La última regla distingue a Java de las implementaciones más antiguas y de C++ y hace que el código sea más seguro. Así, por ejemplo, en el lenguaje Java, después de ejecutar el código

Corta x = 50 , y = 1000 ; intz = x*y;

a la variable z se le asigna el valor 50000, no −15536, como en la mayoría de las implementaciones obsoletas de C y C++. En un programa compilado por MS VC++ desde la versión 7, así como por muchos otros compiladores modernos (gcc, Intel C++, Borland C++, Comeau, etc.), el valor también será 50000.

Variables de objeto, objetos, referencias y punteros

El lenguaje Java solo tiene objetos creados dinámicamente. Además, las variables de tipo de objeto y los objetos en Java son entidades completamente diferentes. Las variables de tipo de objeto son referencias, es decir, punteros implícitos a objetos creados dinámicamente. Esto se enfatiza mediante la sintaxis de la declaración de variables. Por ejemplo, en Java no puedes escribir:

Doble a[ 10 ] [ 20 ] ; Foo b(30) ;

Doble a = nuevo doble [ 10 ] [ 20 ] ; Foo b = new Foo(30 ) ;

Durante las asignaciones, el paso a subrutinas y las comparaciones, las variables de objeto se comportan como punteros, es decir, las direcciones de los objetos se asignan, copian y comparan. Y al acceder a campos de datos o métodos de un objeto utilizando una variable de objeto, no se requieren operaciones especiales de desreferenciación: este acceso se realiza como si la variable de objeto fuera el objeto mismo.

Las variables de objeto son variables de cualquier tipo, excepto los tipos numéricos simples. No hay punteros explícitos en Java. A diferencia de los punteros en C, C++ y otros lenguajes de programación, las referencias en Java son muy seguras debido a las estrictas restricciones de su uso, en particular:

  • No puede convertir un objeto de tipo int o cualquier otro tipo primitivo en un puntero o referencia, y viceversa.
  • Está prohibido realizar las operaciones ++, −−, +, − o cualquier otra operación aritmética en los enlaces.
  • La conversión de tipo entre referencias está estrictamente regulada. Con la excepción de las referencias de matriz, solo se permite convertir referencias entre un tipo heredado y su descendiente, y la conversión del tipo heredado al tipo heredado debe especificarse explícitamente y verificarse en tiempo de ejecución. Las conversiones de referencia de matriz solo se permiten cuando se permiten las conversiones de sus tipos base y no hay conflictos de dimensión.
  • En Java, no hay operaciones de toma de dirección (&) o toma de dirección (*). El asterisco en Java significa multiplicación, eso es todo. El ampersand (&) simplemente significa "bit a bit y" (el ampersand doble es "lógico y").

Debido a estas restricciones especialmente introducidas en Java, la manipulación directa de la memoria a nivel de direcciones físicas es imposible (aunque hay referencias que no apuntan a nada: el valor de dicha referencia se denota por nulo).

Enlaces duplicados y clonación

Dado que las variables de objeto son variables de referencia, la asignación no copia el objeto. Entonces, si escribes

Foo foo, bar; ... barra = foo;

entonces la dirección se copiará de foo a bar. Es decir, foo y bar apuntarán a la misma área de memoria, es decir, al mismo objeto; intentar cambiar los campos del objeto al que hace referencia foo cambiará el objeto al que hace referencia bar , y viceversa. Si necesitas conseguir solo uno más Copiar objeto de origen, use el método (función miembro, en la terminología de C++) clone() , que crea una copia del objeto, o un constructor de copias.

El método clone() requiere que la clase implemente la interfaz Cloneable (consulte las interfaces a continuación). Si una clase implementa la interfaz Cloneable, por defecto clone() copia todos los campos ( copia pequeña). Si desea clonar campos (así como sus campos, etc.) en lugar de copiarlos, debe anular el método clone(). Definir y usar el método clone() a menudo no es una tarea trivial.

Recolección de basura

En el lenguaje Java, no es posible eliminar explícitamente un objeto de la memoria; en su lugar, se implementa la recolección de elementos no utilizados. El truco tradicional para darle al recolector de basura una "pista" para desasignar memoria es establecer una variable en null . Esto, sin embargo, no significa que el objeto reemplazó nulo, será borrado de forma segura e inmediata. Esta técnica solo elimina la referencia al objeto, es decir, desvincula el puntero del objeto en la memoria. En este caso, debe tenerse en cuenta que el recolector de basura no eliminará el objeto siempre que al menos una referencia de las variables u objetos utilizados apunte a él. También hay métodos para iniciar una recolección de basura forzada, pero no se garantiza que sean llamados por el tiempo de ejecución y no se recomiendan para un uso normal.

Clases y Funciones

Java no es un lenguaje de procedimientos: cualquier función solo puede existir dentro de una clase. Esto se enfatiza con la terminología del lenguaje Java, donde no hay conceptos de "función" o "función miembro" (Ing. función miembro), pero sólo método. Las funciones estándar también se han convertido en métodos. Por ejemplo, no hay una función sin() en Java, pero hay un método Math.sin() de la clase Math (que contiene, además de sin() , cos() , exp() , sqrt() , abs() y muchos otros métodos).

Métodos y campos estáticos

Para no crear un objeto de la clase Math (y otras clases similares) cada vez que necesite llamar a sin () (y otras funciones similares), el concepto métodos estáticos(Inglés) método estático; a veces en ruso se les llama estáticos). Se puede llamar a un método estático (marcado con la palabra clave estática en la descripción) sin crear un objeto de su clase. Por lo tanto, se puede escribir

Doble x = Matemáticas .sin(1) ;

Matemáticas m = nueva Matemáticas(); doble x = m.sin(1) ;

La restricción de los métodos estáticos es que solo pueden acceder a campos y métodos estáticos en este objeto.

Los campos estáticos tienen el mismo significado que en C++: solo hay una instancia de cada uno.

Finalidad

La palabra clave final significa diferentes cosas al describir una variable, método o clase. La variable final (llamada constante) se inicializa cuando se declara y no se puede cambiar más. El método final no puede ser invalidado por herencia. La clase final no puede tener herederos en absoluto.

Abstracción

En Java, los métodos que no se declaran explícitamente finales o privados son virtuales en la terminología de C ++: llamar a un método que se define de manera diferente en la base y heredar clases siempre tiene una verificación de tiempo de ejecución.

El método abstracto (descriptor abstracto) en Java es un método para el que se especifican los parámetros y el tipo de devolución, pero no un cuerpo. Un método abstracto se define en clases derivadas. En C++, lo mismo se denomina función virtual pura. Para que una clase pueda describir métodos abstractos, la clase misma también debe declararse abstracta. No se pueden crear objetos de clase abstracta.

Interfaces

El mayor grado de abstracción en Java es la interfaz. Todos los métodos de interfaz son abstractos: ni siquiera se requiere el descriptor abstracto. Una interfaz no es una clase. Una clase puede heredar, o expandir(extiende) otra clase, o implementar(implementos) interfaz. Además, una interfaz puede heredar o extender otra interfaz.

en Java una clase no puede heredar más de una clase, pero puede implementar cualquier número de interfaces.

Las interfaces se pueden pasar a los métodos como parámetros, pero no se pueden crear objetos de sus tipos.

Interfaces de marcador

Hay algunas interfaces en Java que no contienen métodos para implementar, pero que la JVM maneja de una manera especial. Estas son las interfaces:

  • java.lang.Cloneable
  • java.io.Serializable
  • java.rmi.remoto

Plantillas en Java (genéricos)

A partir de Java 5, el lenguaje tiene un mecanismo de programación genérico: plantillas que se parecen mucho a las plantillas de C++. Usando una sintaxis especial en la descripción de clases y métodos, puede especificar parámetros de tipo que se pueden usar dentro de la descripción como tipos de campos, parámetros y valores de retorno de métodos.

// declaración de clase genérica clase GenericClass ( E getFirst() ( ... ) void add(E obj) ( ... ) ) // Usando una clase genérica en código Clase genérica var = nueva clase genérica () ; var.add("qwerty") ; Cadena p = var.getFirst();

Se permite la declaración genérica de clases, interfaces y métodos. Además, la sintaxis admite declaraciones limitadas de tipos de parámetros: una indicación en la declaración de una construcción de la forma requiere que el parámetro de tipo T implemente las interfaces A, B, C, etc., y la construcción requiere que el parámetro de tipo T sea un tipo C o uno de sus ancestros.

A diferencia de las plantillas de C#, el tiempo de ejecución no admite las plantillas de Java: el compilador simplemente crea un código de bytes que no contiene ninguna plantilla. La implementación de plantillas en Java es fundamentalmente diferente de la implementación de mecanismos similares en C ++: el compilador no genera una variante separada de una clase o método de plantilla para cada caso de uso de una plantilla, sino que simplemente crea una implementación de código de bytes único que contiene las comprobaciones de tipos y conversiones necesarias. Esto lleva a una serie de restricciones en el uso de plantillas en programas Java.

Verificación de membresía de clase

En Java, puede verificar explícitamente a qué clase pertenece un objeto. La expresión foo instancia de Foo es verdadera si el objeto foo pertenece a la clase Foo o su descendiente, o implementa la interfaz Foo (o, más generalmente, hereda una clase que implementa una interfaz que hereda Foo).

A continuación, la función getClass() definida para todos los objetos devuelve un objeto de tipo Class. Estos objetos se pueden comparar. Entonces, por ejemplo, foo.getClass()==bar.getClass() será verdadero si los objetos foo y bar pertenecen exactamente a la misma clase (pero esto no significa que sean dos objetos idénticos).

Además, se puede obtener un objeto de tipo Class de cualquier tipo así: Integer.class , Object.class .

Sin embargo, la comparación directa de clases no siempre es el mejor medio para verificar la pertenencia a una clase. A menudo, se usa la función isAssignableFrom() en su lugar. Esta función se define sobre un objeto de tipo Clase y toma como parámetro un objeto de tipo Clase. Por lo tanto, llamar a Foo.class.isAssignableFrom(Bar.class) devolverá verdadero si Foo es un ancestro de la clase Bar. Dado que todos los objetos son descendientes del tipo Object , llamar a Object.class.isAssignableFrom() siempre devolverá true . Junto a las funciones mencionadas de un objeto de tipo Class, también se utilizan las funciones isInstance() (equivalente a instanceof) y cast() (convierte un parámetro en un objeto de la clase seleccionada).

Bibliotecas de clases

Herramientas de desarrollo de software

  • JDK: además de un conjunto de bibliotecas para las plataformas Java SE y Java EE, contiene un compilador línea de comando javac y un conjunto de utilidades que también funcionan en modo línea de comandos.
  • NetBeans IDE es un IDE gratuito para todas las plataformas Java: Java ME, Java SE y Java EE. Promovido por Sun Microsystems, el desarrollador de Java, como línea base para el desarrollo de software en Java y otros lenguajes (, C++, Fortran, etc.).
  • Java SE y Java EE. Se está trabajando para admitir la plataforma Java ME en Eclipse. Se promocionan C, C++, Fortran, etc.)
  • IntelliJ IDEA es un entorno de desarrollo comercial para las plataformas Java SE, Java EE y Java ME.

notas

  1. java (inglés). Diccionario en línea Merriam-Webster. Merriam Webster. - Pronunciación en inglés de la palabra "Java". Consultado el 5 de junio de 2009.
  2. Roberto Tolksdorf. Lenguajes de programación para la máquina virtual Java JVM. es investigación GmbH. - Catálogo en línea de lenguajes alternativos y extensiones de lenguaje para la JVM. Consultado el 5 de junio de 2009.
  3. Compatibilidad con máquinas virtuales de Microsoft Java. Microsoft (2003-09-12). - Declaración oficial de Microsoft sobre el programa de soporte MSJVM. Consultado el 5 de junio de 2009.
  4. Todd Hoff Arquitectura de Amazon (inglés) (2007-09-18). - Discusión de la arquitectura de Amazon utilizando tecnologías Java. Consultado el 6 de junio de 2009.
  5. Amazon Elastic Compute Cloud (Amazon EC2) . Amazon Web Services LLC. - Descripción de la tecnología y capacidades de Amazon EC2 como servicio web. Consultado el 6 de junio de 2009.
  6. Todd Hoff Arquitectura de eBay (inglés) (2008-05-27). - Discusión de la arquitectura de eBay en la plataforma Java. Consultado el 6 de junio de 2009.
  7. Randy Shoup, Dan Pritchett La arquitectura de eBay (inglés) (PDF). Foro SD 2006(2006-11-29). - Presentación sobre la historia del desarrollo de la arquitectura de eBay. Consultado el 6 de junio de 2009.
  8. popa allen Entrevista exclusiva con Yandex CTO Ilya Segalovich (inglés) . Centro de redes (2008-01-14). - Entrevista con Yandex CTO Ilya Segalovich. Consultado el 6 de junio de 2009.
  9. Anatoli Orlov Arquitectura Yandex.Search (ruso) (PowerPoint). Materiales de la reunión JUG en Ekaterimburgo(2008-05-24). Consultado el 6 de junio de 2009.
  10. Brian Guan El Blog de Linkedin. Archivo de blog. Griales en LinkedIn. (Inglés) . LinkedIn.com (2008-06-11). - La historia de la creación del sistema LinkedIn basado en la tecnología Grails Java. Consultado el 5 de junio de 2009.
  11. Procedimientos almacenados de OracleJVM y Java. Oracle Inc.: una sección del portal de Oracle dedicada a las tecnologías Java como parte del servidor Oracle DBMS. Consultado el 5 de junio de 2009.
  12. Enlace a la documentación del método Object.clone()

Literatura

  • Monajov Vadim El lenguaje de programación Java y el entorno NetBeans, 2ª edición. - San Petersburgo.: "BHV-Petersburg", 2009. - S. 720. - ISBN 978-5-9775-0424-9
  • Josué Bloch. Java. Programación efectiva = Java efectivo. - M.: "Lori", 2002. - S. 224. - ISBN 5-85582-169-2
  • Java 2. Biblioteca para profesionales, Volumen 1. Fundamentos = Core Java™ 2, Volumen I--Fundamentos. - 7ª ed. - M.: "Williams", 2007. - S. 896. - ISBN 0-13-148202-5
  • Kay S. Horstmann, Gary Cornell. Java 2. The Professional's Library, Volumen 2. Consejos de programación = Core Java™ 2, Volumen II--Características avanzadas. - 7ª ed. - M.: "Williams", 2007. - S. 1168. - ISBN 0-13-111826-9
  • Bruce Eckel. Filosofía Java = Pensar en Java. - 3ª ed. - San Petersburgo: "Piter", 2003. - S. 976. - ISBN 5-88782-105-1
  • Herbert Schildt, James Holmes. El arte de la programación en Java = El arte de Java. - M.: "Dialéctica", 2005. - S. 336. - ISBN 0-07-222971-3
  • Lubos Bruga. Java Rápido: Curso Práctico Express = Luboš Brůha. Java Hotová řešení.. - M .: Ciencia y Tecnología, 2006. - P. 369. - ISBN 5-94387-282-5

Java es un lenguaje de programación desarrollado por SunMicrosystems. Las aplicaciones Java generalmente se compilan en un código de bytes especial, por lo que pueden ejecutarse en cualquier máquina virtual Java (JVM) independientemente de la arquitectura de la computadora. La fecha de lanzamiento oficial es el 23 de mayo de 1995. Hoy en día, la tecnología Java proporciona los medios para convertir páginas web estáticas en documentos interactivos y dinámicos y para crear aplicaciones distribuidas e independientes de la plataforma.

Los programas Java se traducen a bytecode, que es ejecutado por Java Virtual Machine (JVM), un programa que procesa el bytecode y pasa instrucciones al hardware como intérprete.

La ventaja de esta forma de ejecutar programas está en la completa independencia del bytecode de sistema operativo y hardware, que le permite ejecutar aplicaciones Java en cualquier dispositivo para el que exista una máquina virtual correspondiente. Otro característica importante La tecnología Java es un sistema de seguridad flexible debido a que la ejecución del programa está completamente controlada por la máquina virtual. Cualquier operación que exceda los permisos establecidos del programa (como el intento de acceso no autorizado a los datos o la conexión a otra computadora) provoca un aborto inmediato.

A menudo, las desventajas del concepto de máquina virtual incluyen el hecho de que la ejecución de bytecode por parte de una máquina virtual puede reducir el rendimiento del programa de algoritmos implementado en el lenguaje Java. Recientemente, se han realizado una serie de mejoras que aumentan ligeramente la velocidad de ejecución de programas Java:

Aplicación de la tecnología de traducción de bytecode en código de máquina directamente durante la operación del programa (tecnología JIT) con la capacidad de guardar versiones de clase en código de máquina,

Uso generalizado de código orientado a la plataforma (código nativo) en bibliotecas estándar,

Hardware que proporciona procesamiento de bytecode acelerado (por ejemplo, tecnología Jazelle, compatible con algunos procesadores ARM).



Características principales del lenguaje:

Gestión automática de memoria;

Capacidades extendidas para manejar situaciones excepcionales;

Un amplio conjunto de herramientas de filtrado de entrada/salida;

Un conjunto de colecciones estándar, como una matriz, una lista, una pila, etc.;

Disponibilidad de herramientas simples para crear aplicaciones de red (incluido el uso del protocolo RMI);

La presencia de clases que le permiten realizar solicitudes HTTP y procesar respuestas;

Herramientas de lenguaje incorporadas para crear aplicaciones de subprocesos múltiples;

Acceso unificado a la base de datos:

A nivel de consultas SQL individuales, basadas en JDBC, SQLJ;

A nivel del concepto de objetos con la capacidad de almacenar en una base de datos - basada en Java Data Objects y Java Persistence API;

Soporte para plantillas (a partir de la versión 1.5);

Ejecución paralela de programas.

1.4.3 Lenguaje de programación C#

En junio de 2000 se supo de un nuevo lenguaje de programación que nacía en las entrañas de Microsoft. Se convirtió en parte nueva tecnología Microsoft llamó .NET (pronunciado "Dot Net"). En el marco de esta tecnología, se proporciona un único entorno de ejecución de programas (Common Language Runtime, CLR) escritos en diferentes lenguajes de programación. Uno de estos lenguajes, el principal en este entorno, es C# (C#, léase “C sostenido”, “C sostenido”). Por el nombre del lenguaje, por supuesto, querían enfatizar su relación con C++, porque # son dos puntos positivos que se cruzan. Pero sobre todo, el nuevo lenguaje es similar a Java. Y no cabe duda de que uno de los motivos de su aparición fue el deseo de Microsoft de responder al reto de Sun.

Aunque los autores de C# no se nombran oficialmente, en la portada de una de las ediciones preliminares de la guía del lenguaje, se indican Anders Hejlsberg, el creador de Turbo Pascal y Delphi, que se mudó a Microsoft en 1996, y Scott Wiltamuth.

El entorno de ejecución de programa unificado se basa en el uso del lenguaje intermedio IL (Intermediate Language - lenguaje intermedio), que realiza casi el mismo papel que el código de bytes de la máquina virtual Java. Los compiladores de varios lenguajes utilizados dentro de la tecnología .NET traducen programas a código IL. Al igual que el código de bytes de Java, el código IL representa las instrucciones de una computadora de pila hipotética. Pero también hay una diferencia en el diseño y uso de IL.

Primero, a diferencia de JVM, IL no está vinculado a un lenguaje de programación. Las versiones preliminares de Microsoft.NET incluyen compiladores para C++, C#, Visual Basic. Los desarrolladores independientes pueden agregar otros lenguajes creando compiladores de esos lenguajes al código IL.

En segundo lugar, IL no está destinado a la interpretación programática, sino a la compilación posterior en código de máquina. Esto le permite lograr programas de rendimiento significativamente más altos. Los archivos que contienen código IL contienen suficiente información para que funcione un compilador de optimización.

“C# es un lenguaje orientado a objetos sencillo, moderno y con seguridad de tipos derivado de C y C++. C# será conveniente y comprensible para los programadores que conocen C y C++. C# combina la productividad de Visual Basic con la potencia de C++". Estas palabras comienzan la descripción de C#.

Considerar características técnicas idioma:

La unidad de compilación es un archivo (como en C, C++, Java). El archivo puede contener una o más descripciones de tipo: clases (clase), interfaces (interfaz), estructuras (struct), enumeraciones (enum), tipos de delegado (delegado) con o sin indicación de su distribución en espacios de nombres;

Los espacios de nombres (namespace) regulan la visibilidad de los objetos del programa (como en C++). Los espacios de nombres se pueden anidar. Está permitido usar objetos de programa sin especificar explícitamente el espacio de nombres al que pertenece este objeto. Solo una mención general del uso de este espacio de nombres en la directiva de uso (como en Turbo Pascal) es suficiente. Hay alias para nombres de espacios de nombres en la directiva de uso (como en el lenguaje Oberon);

Tipos de datos elementales: enteros con y sin signo de 8 bits (sbyte, byte), 16 bits (short, ushort), 32 bits (int, uint) y 64 bits (long, ulong), reales individuales (float) y precisión doble (doble), caracteres Unicode (char), tipo booleano (bool, no compatible con números enteros), tipo decimal que proporciona 28 dígitos significativos de precisión (decimal);

Tipos estructurados: clases e interfaces (como en Java), matrices unidimensionales y multidimensionales (a diferencia de Java), cadenas (string), estructuras (casi lo mismo que las clases, pero no colocadas en el montón y sin herencia), enumeraciones, incompatible con números enteros (como en Pascal);

Tipos de delegados o simplemente "delegados" (como tipos procedimentales en Module-2 y Oberon, punteros de función en C y C++);

Los tipos se dividen en tipos de referencia (clases, interfaces, matrices, delegados) y tipos de valor (tipos elementales, enumeraciones, estructuras). Los objetos de tipos de referencia se asignan en memoria dinámica (montón), y las variables de tipos de referencia son, de hecho, punteros a estos objetos. En el caso de los tipos de valor, las variables no son punteros, sino valores en sí mismos. Las conversiones de tipos implícitas solo se permiten si no infringen la seguridad de tipos ni provocan la pérdida de información. Todos los tipos, incluidos los tipos elementales, son compatibles con el tipo de objeto, que es la clase base de todos los demás tipos. Hay una conversión implícita de tipos de valor al tipo de objeto, llamada boxing, y una conversión inversa explícita - unboxing;

Recolección automática de basura (como en Oberon y Java);

Amplio conjunto de operaciones con 14 niveles de prioridad. Redefinición de operaciones (como en Algol-68, Ada, C++). Con los operadores marcados y no marcados, puede controlar el control de desbordamiento al realizar operaciones en números enteros;

Métodos con parámetros de valor, parámetros de referencia (ref) y parámetros de salida (out). Las palabras ref y out deben escribirse antes del parámetro, no solo en la descripción del método, sino también al llamar. La presencia de parámetros de salida le permite controlar la ejecución de las asignaciones de definición. Según las reglas del lenguaje, se debe garantizar que cualquier variable tenga un valor antes de intentar usarla;

Declaraciones de control: if, switch, while, do, for, break, continue (como en C, C++ y Java). La sentencia foreach, que recorre cada elemento de la "colección", varias variedades de la sentencia goto jump;

manejo de excepciones (como en Java);

Propiedades: elementos de clases (objetos), cuyo acceso se lleva a cabo de la misma manera que los campos (puede asignar u obtener un valor), pero se implementan mediante subrutinas de obtención y configuración llamadas implícitamente (como en Object Pascal, el lenguaje de entrada del sistema Delphi);

Los indexadores son elementos de clases (objetos) que le permiten acceder a objetos de la misma manera que los arreglos (especificando un índice en corchetes). Implementado por rutinas get y set llamadas implícitamente. Por ejemplo, el acceso (para lectura) a los caracteres de una cadena se puede realizar como elementos de una matriz debido al hecho de que se implementa un indexador para la clase de cadena estándar;

Los eventos son elementos de clases (campos o propiedades) de tipo procedimental (delegados), a los que, fuera de la clase donde están definidos, solo les son aplicables las operaciones += y -=, lo que permite agregar o eliminar métodos de manejo de eventos para objetos. de esta clase;

El código inseguro (inseguro) que utiliza punteros y aritmética de direcciones se localiza en partes del programa marcadas con el modificador inseguro;

Un preprocesador que, a diferencia de C y C++, solo proporciona funciones de compilación condicional.

Por supuesto, las deficiencias discutidas de C # no privan al lenguaje de las perspectivas en absoluto. En muchos sentidos es preferible a C++. La insatisfacción general con el lenguaje C++, que se reconoce por la aparición misma de un nuevo lenguaje, es uno de los principales requisitos previos para el éxito de C#.

Comparando C# con Java, puede ver muchas similitudes. Cierto, si los sistemas Java son multiplataforma, entonces la implementación de C# existe solo para el sistema operativo. sistemas Windows y solo uno Pero, a pesar de la pesadez, se puede esperar que el lenguaje se implemente para otros sistemas. Además, la propia plataforma Microsoft .NET con un único entorno de ejecución de programas puede promoverse a arquitecturas alternativas, principalmente a sistemas UNIX.

C# parece ser un lenguaje más realista que Java. A diferencia de Java, es autosuficiente. Es decir, puedes escribir cualquier programa en C# sin recurrir a otros lenguajes. Esto es posible debido a la presencia de bloques de código "inseguros" que abren el acceso directamente al hardware. En Java, el acceso a las instalaciones de bajo nivel debe utilizar "métodos nativos" (métodos nativos), que deben programarse en otros lenguajes.

Y, por supuesto, las perspectivas de C# están principalmente relacionadas con los esfuerzos que, por supuesto, Microsoft hará para promocionarlo.