TL; DR
En Java, la raison public static void main(String[] args)
est que
- Gosling voulait
- le code écrit par une personne expérimentée en C (pas en Java)
- être exécuté par une personne habituée à exécuter PostScript sur NeWS
Pour C #, le raisonnement est transitoirement similaire pour ainsi dire. Les concepteurs de langage ont gardé la syntaxe de point d’entrée de programme familière pour les programmeurs venant de Java. Comme le dit l’architecte C #, Anders Hejlsberg ,
... notre approche avec C # a simplement été d'offrir une alternative ... aux programmeurs Java ...
Version longue
expansion au-dessus et soutenu avec des références ennuyeuses.
java Terminator Hasta la vista bébé!
VM Spec, 2.17.1 Démarrage de la machine virtuelle
... La manière dont la classe initiale est spécifiée sur la machine virtuelle Java dépasse le cadre de la présente spécification, mais il est typique, dans les environnements hôtes utilisant des lignes de commande, que le nom complet de la classe soit spécifié comme suit: un argument de ligne de commande et les arguments suivants à utiliser comme chaînes à fournir comme arguments de la méthode main. Par exemple, en utilisant le SDK Java 2 de Sun pour Solaris, la ligne de commande
java Terminator Hasta la vista Baby!
lancera une machine virtuelle Java en appelant la méthode main of class Terminator
(une classe dans un paquet non nommé) et en lui transmettant un tableau contenant les quatre chaînes "Hasta", "la", "vista" et "Baby!" ...
... voir aussi: Annexe: J'ai besoin de tes vêtements, de tes bottes et de ta moto
- Mon interprétation:
exécution ciblée pour une utilisation similaire aux scripts classiques dans l'interface de ligne de commande.
marche de côté importante
... cela permet d'éviter quelques fausses traces dans notre enquête.
VM Spec, 1.2 La machine virtuelle Java
La machine virtuelle Java ne sait rien du langage de programmation Java ...
J'ai remarqué ci-dessus lors de l'étude du chapitre précédent - 1.1 Histoire qui, selon moi, pourrait être utile (mais s'est avérée inutile).
- Mon interprétation: l'
exécution est régie par la seule spécification de machine virtuelle, qui
déclare explicitement qu'elle n'a rien à voir avec le langage Java
=> OK pour ignorer JLS et tout élément lié au langage Java.
Gosling: un compromis entre C et langage de script ...
Sur la base de ce qui précède, j'ai commencé à rechercher sur le Web l' historique de la JVM . N'a pas aidé, trop de déchets dans les résultats.
Ensuite, je me suis rappelé les légendes sur Gosling et ma recherche a été réduite à l’ histoire de Gosling JVM .
Eureka! Comment les spécifications de la JVM sont devenues
Dans cette allocution du JVM Languages Summit 2008, James Gosling aborde ... la création de Java, ... un compromis entre le langage C et le langage de script ...
- Mon interprétation:
déclaration explicite qu’au moment de la création,
C et le script ont été considérés comme les influences les plus importantes.
Déjà vu clin d' œil à des scripts dans VM Spec 2.17.1, les
arguments de ligne de commande expliquent suffisamment , String[] args
mais static
et main
ne sont pas encore là, le besoin de creuser plus loin ...
Notez que lorsque vous tapez ceci - connexion de C, de script et de VM Spec 1.2 avec sa technologie rien de Java - je me sens comme quelque chose de familier, quelque chose ... orienté objet est en train de disparaître lentement. Prends ma main et continue à avancer Ne ralentis pas, nous y sommes presque
Les diapositives Keynote sont disponibles en ligne: 20_Gosling_keynote.pdf , ce qui est très pratique pour copier des points clés.
page 3
La préhistoire de Java
* Qu'est-ce qui a façonné ma pensée?
page 9
Nouvelles
* Système de fenêtre extensible en réseau
* Un système de fenêtre basé sur le script ....
PostScript (!!)
page 16
Un grand (mais calme) objectif:
À quel point pourrais-je me rapprocher d'un
"script" sentir ...
page 19
Le concept original
* Était tout au sujet de la construction
réseaux de choses,
orchestré par un script
la langue
* (Shells Unix, AppleScript, ...)
page 20
Un loup dans l'habillement du mouton
* La syntaxe C pour rendre les développeurs
confortable
A-ha! Regardons de plus près la syntaxe C .
L'exemple "bonjour, monde" ...
main()
{
printf("hello, world\n");
}
... une fonction nommée main est en cours de définition. La fonction principale remplit une fonction particulière dans les programmes C; l'environnement d'exécution appelle la fonction principale pour commencer l'exécution du programme.
... La fonction principale a en fait deux arguments int argc
et char *argv[]
, respectivement, qui peuvent être utilisés pour gérer des arguments en ligne de commande ...
Est-ce qu'on se rapproche? tu paries. Il est également intéressant de suivre le lien "principal" de la citation ci-dessus:
la fonction principale est l'endroit où un programme commence l'exécution. Il est responsable de l'organisation de haut niveau de la fonctionnalité du programme et a généralement accès aux arguments de commande donnés au programme lors de son exécution.
- Mon interprétation:
pour que le développeur C soit à l'aise, le point d'entrée du programme doit être main
.
De plus, comme Java requiert que toute méthode soit dans la classe, elle Class.main
est
aussi proche que possible: invocation statique, juste nom de classe et point,
pas de constructeur s'il vous plaît - C ne sait rien de tel.
Ceci s’applique également de manière transitoire au C #, en tenant compte de
l’idée d’une migration aisée de ce dernier vers Java.
Les lecteurs qui pensent que le point d’entrée du programme est sans importance sont invités à rechercher et à vérifier les questions de Stack Overflow dans lesquelles des personnes de Java SE essaient d’écrire Hello World pour Java ME MIDP. Remarque Le point d’entrée MIDP n’a pas de main
ni static
.
Conclusion
Sur la base de ce qui précède, je dirais que static
, main
et que String[] args
c’était au moment de la création de Java et de C # le choix le plus raisonnable pour définir le point d’entrée du programme .
Annexe: J'ai besoin de tes vêtements, de tes bottes et de ta moto
Je dois admettre que la lecture de VM Spec 2.17.1 était très amusant.
... la ligne de commande
java Terminator Hasta la vista Baby!
lancera une machine virtuelle Java en appelant la méthode main of class Terminator
(une classe dans un paquet non nommé) et en lui transmettant un tableau contenant les quatre chaînes "Hasta", "la", "vista" et "Baby!".
Nous décrivons maintenant les étapes que la machine virtuelle peut entreprendre Terminator
, en tant qu’exemple des processus de chargement, de liaison et d’initialisation décrits plus en détail dans les sections suivantes.
La tentative initiale ... découvre que la classe Terminator
n'est pas chargée ...
Une fois Terminator
chargé, il doit être initialisé avant que main puisse être appelé et un type (classe ou interface) doit toujours être lié avant son initialisation. La liaison (§2.17.3) implique la vérification, la préparation et (facultativement) la résolution ...
Vérification (§2.17.3) vérifie que la représentation chargée de Terminator
est bien formée ...
La résolution (§2.17.3) est le processus de vérification des références symboliques de la classe Terminator
...
Références symboliques de Terminator
oh ouais.