Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

431
Views
¿El comando 'java' compila programas Java?

La mayoría de los sitios web en Internet dicen:

"use el comando javac para compilar un archivo .java . Luego ejecútelo usando el comando java "

Pero hoy traté de ejecutar un programa java sin javac y obtuve un resultado extraño.

Aquí está el contenido de un archivo llamado hello.java :

 public class Myclass { public static void main(String[] args){ System.out.println("hello world"); } }

Entonces corrí:

 $ javac hello.java

Lo que me da este error:

 hello.java:1: error: class Myclass is public, should be declared in a file named Myclass.java public class Myclass { ^ 1 error

Pero cuando lo ejecuto sin el comando javac , se ejecutó sin errores.

 $ java hello.java hello world

¿El comando java también compila el programa? En caso afirmativo, ¿por qué necesitamos el comando javac ?

La versión de mi java es:

 openjdk version "12.0.2" 2019-07-16 OpenJDK Runtime Environment (build 12.0.2+10) OpenJDK 64-Bit Server VM (build 12.0.2+10, mixed mode)
over 4 years ago · Santiago Trujillo
4 answers
Answer question

0

Si está ejecutando Java 11, hay una nueva característica que permite la ejecución de un archivo fuente único. El compilador de fuente única es más promiscuo en términos de nombre de clase versus nombre de archivo, así es como puede ejecutar pero no compilar con éxito.

Si tiene una versión anterior de Java, su hello.java actual no se compila debido a errores de compilación, específicamente en torno al nombre de la clase. Entonces, no hay absolutamente ninguna forma de que llamar a java hello.java compile su código, porque no compila.

Parece muy probable que estuviera ejecutando algún código compilado previamente al ejecutar el comando java.

over 4 years ago · Santiago Trujillo Report

0

Antes de Java 11, para ejecutar su código, primero debe compilarlo y luego puede ejecutarlo. Aquí hay un ejemplo:

 javac test.java java test

Desde Java 11, aún puede hacer javac + java , o puede ejecutar java solo para compilar y ejecutar automáticamente su código. Tenga en cuenta que no se generará ningún archivo .class . Aquí hay un ejemplo:

 java test.java

Si ejecuta java -help , verá los distintos usos permitidos. Esto es lo que parece en mi máquina. El último es lo que encontró: java [options] <sourcefile> [args] que "ejecutará un único programa de archivo fuente".

 $ java -help Usage: java [options] <mainclass> [args...] (to execute a class) or java [options] -jar <jarfile> [args...] (to execute a jar file) or java [options] -m <module>[/<mainclass>] [args...] java [options] --module <module>[/<mainclass>] [args...] (to execute the main class in a module) or java [options] <sourcefile> [args] (to execute a single source-file program)

ACTUALIZAR:

Como señaló @BillK, OP también preguntó:

¿Por qué necesitamos el comando javac?

La razón por la que necesitamos javac es para crear archivos .class para que el código se pueda crear, probar, distribuir, ejecutar, compartir, etc. como se hace hoy. La motivación para JEP 330 fue facilitar las "primeras etapas de aprendizaje de Java y la escritura de pequeños programas de utilidad" sin cambiar ningún otro uso existente.

over 4 years ago · Santiago Trujillo Report

0

Sí, pero no en la forma en que probablemente te refieres.

Cuando usa el comando javac para compilar un archivo .java en un archivo .class, la salida es algo llamado bytecode. Bytecode es el código de la máquina (instrucciones nativas) para una CPU teórica basada en la especificación de la máquina virtual de Java.

Esta especificación de CPU virtual es una especie de promedio de tipos de CPU que eran comunes en el momento en que se escribió la especificación. Debido a esto, está cerca de muchos tipos diferentes de CPU, lo que facilita la ejecución de los mismos archivos .class de Java en varios tipos de CPU.

Cuando se lanzó Java por primera vez, el comando java leía el archivo .class e interpretaba las instrucciones del código de bytes una a la vez y luego las asignaba a la instrucción nativa equivalente para cualquier CPU en la que realmente se estuviera ejecutando. Esto funcionó pero no fue particularmente rápido. Para mejorar esta compilación Just in Time (JIT), se agregó a Java Runtime.

Con JIT, el comando java toma el código de bytes y lo compila nuevamente en las instrucciones nativas para la CPU en la que se ejecuta. Los tiempos de ejecución de Java modernos tienden a comenzar interpretando el código de bytes mientras compilan JIT en segundo plano y cambian a las instrucciones nativas compiladas cuando están listas y también perfilarán la aplicación en ejecución y luego volverán a compilar el código de bytes con una optimización diferente para obtener el mejor rendimiento posible.

EDITAR (para apaciguar a los votantes negativos):

Entonces, en su caso específico (ya que está ejecutando un JRE más nuevo que v11), el código se compila (al menos) dos veces

  1. Como un único archivo .java a código de bytes
  2. A través del compilador JIT mientras interpreta el código de bytes (aunque para helloWorld es posible que no tenga tiempo de ejecutar ninguno de los códigos nativos compilados)
over 4 years ago · Santiago Trujillo Report

0

Para responder por qué se da este error, el nombre de clase del archivo debe coincidir con el basename del archivo.

Tiene dos opciones para que este código funcione para el javac tradicional; secuencia java :

  1. Cambie el nombre de la clase a public class Hello o

  2. Cambie el nombre hello.java a myclass.java .

El intérprete de java para Java 11 no impone este requisito. La clase que contiene main puede tener cualquier nombre, siempre que sea la primera clase del archivo. Esto tenía la intención principal de facilitar el proceso de aprendizaje para los principiantes y permitir "scripts de Java" con el shebang ( ref. ).

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!