TL; DR
En Java, la razón public static void main(String[] args)
es que
- Gosling quería
- El código escrito por alguien con experiencia en C (no en Java)
- para ser ejecutado por alguien acostumbrado a ejecutar PostScript en NeWS
Para C #, el razonamiento es transitivamente similar, por así decirlo. Los diseñadores de lenguaje mantuvieron la sintaxis del punto de entrada del programa familiar para los programadores provenientes de Java. Como dice el arquitecto C # Anders Hejlsberg ,
... nuestro enfoque con C # ha sido simplemente ofrecer una alternativa ... a los programadores de Java ...
Versión larga
expandiéndose arriba y respaldado con aburridas referencias.
java Terminator Hasta la vista Baby!
VM Spec, 2.17.1 Inicio de máquina virtual
... La manera en que se especifica la clase inicial en la máquina virtual Java está más allá del alcance de esta especificación, pero es típico, en entornos host que usan líneas de comando, que el nombre completo de la clase se especifique como un argumento de línea de comandos y para los argumentos de línea de comandos posteriores que se utilizarán como cadenas que se proporcionarán como argumento al método main. Por ejemplo, usando Sun 2 Java 2 SDK para Solaris, la línea de comando
java Terminator Hasta la vista Baby!
iniciará una máquina virtual Java invocando el método main of class Terminator
(una clase en un paquete sin nombre) y pasándole una matriz que contiene las cuatro cadenas "Hasta", "la", "vista" y "Baby!" ...
... vea también: Apéndice: Necesito su ropa, sus botas y su motocicleta.
- Mi interpretación:
ejecución dirigida para su uso como scripts típicos en la interfaz de línea de comandos.
paso lateral importante
... eso ayuda a evitar un par de rastros falsos en nuestra investigación.
VM Spec, 1.2 La máquina virtual Java
La máquina virtual Java no sabe nada del lenguaje de programación Java ...
Noté lo anterior al estudiar el capítulo anterior - 1.1 Historia que pensé que podría ser útil (pero resultó inútil).
- Mi interpretación: la
ejecución se rige solo por las especificaciones de VM, que
declara explícitamente que no tiene nada que ver con el lenguaje Java
=> OK para ignorar JLS y cualquier cosa relacionada con el lenguaje Java
Gosling: un compromiso entre C y el lenguaje de script ...
Basado en lo anterior, comencé a buscar en la web el historial de JVM . No ayudó, demasiada basura en los resultados.
Luego, recordé las leyendas sobre Gosling y reduje mi búsqueda a la historia de Gosling JVM .
Eureka! Cómo surgió la especificación JVM
En esta nota clave de la Cumbre de idiomas JVM 2008, James Gosling analiza ... la creación de Java, ... un compromiso entre C y el lenguaje de secuencias de comandos ...
- Mi interpretación:
declaración explícita de que en el momento de la creación,
C y las secuencias de comandos se han considerado las influencias más importantes.
Ya visto un guiño a las secuencias de comandos en VM Spec 2.17.1, los
argumentos de la línea de comandos explican lo suficiente String[] args
pero, static
y main
aún no están allí, necesitan profundizar más ...
Tenga en cuenta que mientras escribo esto, conectando C, scripting y VM Spec 1.2 con su nada de Java, siento que algo familiar, algo ... orientado a objetos está desapareciendo lentamente. Toma mi mano y sigue moviéndote No disminuyas la velocidad, ya casi estamos allí
Las diapositivas de Keynote están disponibles en línea: 20_Gosling_keynote.pdf , bastante conveniente para copiar puntos clave.
página 3
La prehistoria de Java
* ¿Qué formó mi pensamiento?
página 9
Noticias
* Sistema de ventana extensible en red
* Un sistema de ventanas basado en secuencias de comandos ...
PostScript (!!)
página 16
Un gran (pero tranquilo) objetivo:
¿Qué tan cerca podría llegar a un
sensación de "guión" ...
página 19
El concepto original
* Se trataba de construir
redes de cosas,
orquestado por una secuencia de comandos
idioma
* (Shells de Unix, AppleScript, ...)
página 20
Un lobo con ropa de oveja
* Sintaxis C para hacer desarrolladores
cómodo
A-ha! Veamos más de cerca a la sintaxis C .
El ejemplo de "hola, mundo" ...
main()
{
printf("hello, world\n");
}
... se está definiendo una función llamada main. La función principal tiene un propósito especial en los programas en C; El entorno de tiempo de ejecución llama a la función principal para comenzar la ejecución del programa.
... La función principal en realidad tiene dos argumentos int argc
y char *argv[]
, respectivamente, que se pueden usar para manejar argumentos de línea de comando ...
¿Nos estamos acercando? usted apuesta También vale la pena seguir el enlace "principal" de la cita anterior:
La función principal es donde un programa inicia la ejecución. Es responsable de la organización de alto nivel de la funcionalidad del programa y, por lo general, tiene acceso a los argumentos de comando dados al programa cuando se ejecutó.
- Mi interpretación:
para estar cómodo con el desarrollador de C, el punto de entrada del programa debe serlo main
.
Además, dado que Java requiere que cualquier método esté en clase, Class.main
es
lo
más parecido posible : invocación estática, solo nombre de clase y punto, sin constructores, por favor. C no sabe nada de eso.
Esto también se aplica de forma transitiva a C #, teniendo en cuenta
la idea de una fácil migración desde Java.
Los lectores que piensan que el punto de entrada del programa familiar no importa están amablemente invitados a buscar y verificar las preguntas de desbordamiento de pila en las que los hombres que vienen de Java SE intentan escribir Hello World para Java ME MIDP. Nota El punto de entrada MIDP no tiene main
ni static
.
Conclusión
Basado en lo anterior, diría eso static
, main
y String[] args
en los momentos de creación de Java y C #, las opciones más razonables para definir el punto de entrada del programa .
Apéndice: necesito tu ropa, tus botas y tu motocicleta
Debo admitir que leer VM Spec 2.17.1 fue muy divertido.
... la línea de comando
java Terminator Hasta la vista Baby!
iniciará una máquina virtual Java invocando el método main of class Terminator
(una clase en un paquete sin nombre) y pasándole una matriz que contiene las cuatro cadenas "Hasta", "la", "vista" y "Baby!".
Ahora describimos los pasos que la máquina virtual puede seguir para ejecutar Terminator
, como un ejemplo de los procesos de carga, vinculación e inicialización que se describen más adelante en secciones posteriores.
El intento inicial ... descubre que la clase Terminator
no está cargada ...
Después de Terminator
cargarse, debe inicializarse antes de que se pueda invocar main, y un tipo (clase o interfaz) siempre debe vincularse antes de inicializarse. La vinculación (§2.17.3) implica verificación, preparación y (opcionalmente) resolución ...
La verificación (§2.17.3) verifica que la representación cargada de Terminator
esté bien formada ...
La resolución (§2.17.3) es el proceso de verificar referencias simbólicas de la clase Terminator
...
Referencias simbólicas de Terminator
oh sí.