TL; DR
In Java, la ragione public static void main(String[] args)
è che
- Voleva papera
- il codice scritto da qualcuno con esperienza in C (non in Java)
- per essere eseguito da qualcuno abituato a eseguire PostScript su NeWS
Per C #, il ragionamento è transitivamente simile per così dire. I progettisti linguistici hanno tenuto familiare la sintassi del punto di ingresso del programma per i programmatori provenienti da Java. Come afferma l' architetto C # Anders Hejlsberg ,
... il nostro approccio con C # è stato semplicemente quello di offrire un'alternativa ... ai programmatori Java ...
Versione lunga
espandendosi sopra e backup con riferimenti noiosi.
java Terminator Hasta la vista Baby!
Specifiche VM, 2.17.1 Avvio macchina virtuale
... Il modo in cui la classe iniziale viene specificata nella macchina virtuale Java va oltre lo scopo di questa specifica, ma è tipico, negli ambienti host che utilizzano le righe di comando, che il nome completo della classe sia specificato come un argomento della riga di comando e per i successivi argomenti della riga di comando da utilizzare come stringhe da fornire come argomento al metodo principale. Ad esempio, usando l'SDK Java 2 di Sun per Solaris, la riga di comando
java Terminator Hasta la vista Baby!
avvierà una macchina virtuale Java invocando il metodo main of class Terminator
(una classe in un pacchetto senza nome) e passandogli un array contenente le quattro stringhe "Hasta", "la", "vista" e "Baby!" ...
... vedi anche: Appendice: ho bisogno dei tuoi vestiti, dei tuoi stivali e della tua moto
- La mia interpretazione:
esecuzione mirata per l'uso come script tipici nell'interfaccia della riga di comando.
evitamento importante
... questo aiuta a evitare un paio di false tracce nella nostra indagine.
VM Spec, 1.2 Java Virtual Machine
La macchina virtuale Java non sa nulla del linguaggio di programmazione Java ...
Ho notato sopra quando studiavo il capitolo precedente - 1.1 Storia che pensavo potesse essere utile (ma risultò inutile).
- La mia interpretazione: l'
esecuzione è governata dalle specifiche della VM, che
dichiara esplicitamente che non ha nulla a che fare con il linguaggio Java
=> OK per ignorare JLS e qualsiasi cosa relativa al linguaggio Java
Gosling: un compromesso tra C e linguaggio di scripting ...
Sulla base di quanto sopra, ho iniziato a cercare nel web la storia di JVM . Non ha aiutato, troppa spazzatura nei risultati.
Poi, ho ricordato leggende su Gosling e ho ristretto la mia ricerca alla storia di Gosling JVM .
Eureka! Come sono venute le specifiche JVM
In questo keynote del JVM Languages Summit 2008, James Gosling discute ... la creazione di Java, ... un compromesso tra C e il linguaggio di scripting ...
- La mia interpretazione:
dichiarazione esplicita che al momento della creazione,
C e scripting sono stati considerati le influenze più importanti.
Già visto accennare allo scripting nella specifica VM 2.17.1, gli
argomenti della riga di comando spiegano sufficientemente String[] args
ma static
e main
non sono ancora arrivati, è necessario scavare ulteriormente ...
Nota durante la digitazione - che collega C, scripting e VM Spec 1.2 con il suo nulla di Java - Sento che qualcosa di familiare, qualcosa ... orientato agli oggetti sta lentamente scomparendo. Prendi la mia mano e continua a muoverti Non rallentare, siamo quasi arrivati adesso
Le diapositive Keynote sono disponibili online: 20_Gosling_keynote.pdf , abbastanza conveniente per copiare punti chiave.
pagina 3
La preistoria di Java
* Che cosa ha plasmato il mio pensiero
pagina 9
Notizia
* Sistema finestra estensibile collegato in rete
* Un sistema di finestre basato su scripting ....
PostScript (!!)
pagina 16
Un grande (ma silenzioso) obiettivo:
Quanto potrei avvicinarmi a
"scripting" sentire ...
pagina 19
Il concetto originale
* Tutto riguardava la costruzione
reti di cose,
orchestrato da uno scripting
linguaggio
* (Shell Unix, AppleScript, ...)
pagina 20
Un lupo travestito da pecora
* Sintassi C per creare sviluppatori
confortevole
A-ha! Diamo un'occhiata più da vicino la sintassi C .
L'esempio "ciao, mondo" ...
main()
{
printf("hello, world\n");
}
... è stata definita una funzione chiamata main. La funzione principale ha uno scopo speciale nei programmi C; l'ambiente di runtime chiama la funzione principale per iniziare l'esecuzione del programma.
... La funzione principale in realtà ha due argomenti int argc
e char *argv[]
, rispettivamente, che possono essere utilizzati per gestire gli argomenti della riga di comando ...
Ci stiamo avvicinando? Scommetti. Vale anche la pena seguire il link "principale" dalla citazione sopra:
la funzione principale è dove un programma inizia l'esecuzione. È responsabile dell'organizzazione di alto livello della funzionalità del programma e in genere ha accesso agli argomenti dei comandi forniti al programma quando è stato eseguito.
- La mia interpretazione:
per essere a mio agio con lo sviluppatore C, il punto di accesso al programma deve essere main
.
Inoltre, poiché Java richiede che qualsiasi metodo sia in classe, Class.main
è il
più vicino possibile: invocazione statica, solo nome e punto della classe,
nessun costruttore per favore - C non sa nulla del genere.
Questo vale anche in modo transitorio per C #, tenendo conto
dell'idea di una facile migrazione ad esso da Java.
I lettori che pensano che il punto di ingresso del programma familiare non abbia importanza sono gentilmente invitati a cercare e controllare le domande Stack Overflow in cui i ragazzi provenienti da Java SE stanno cercando di scrivere Hello World per Java ME MIDP. Nota Il punto di ingresso MIDP non ha main
né static
.
Conclusione
Basandomi su, direi che static
, main
e String[] args
nei momenti della creazione di Java e C #, le scelte più ragionevoli per definire il punto di ingresso del programma .
Appendice: ho bisogno dei tuoi vestiti, dei tuoi stivali e della tua moto
Devo ammettere che leggere la specifica VM 2.17.1 è stato molto divertente.
... la riga di comando
java Terminator Hasta la vista Baby!
avvierà una macchina virtuale Java invocando il metodo main of class Terminator
(una classe in un pacchetto senza nome) e passandogli un array contenente le quattro stringhe "Hasta", "la", "vista" e "Baby!".
Descriviamo ora i passaggi che la macchina virtuale può eseguire per eseguire Terminator
, come esempio dei processi di caricamento, collegamento e inizializzazione descritti più avanti nelle sezioni successive.
Il tentativo iniziale ... scopre che la classe Terminator
non è caricata ...
Dopo che Terminator
è stato caricato, deve essere inizializzato prima di poter richiamare main e un tipo (classe o interfaccia) deve essere sempre collegato prima di essere inizializzato. Il collegamento (§2.17.3) comporta la verifica, la preparazione e (facoltativamente) la risoluzione ...
La verifica (§2.17.3) verifica che la rappresentazione caricata di Terminator
sia ben formata ...
La risoluzione (§2.17.3) è il processo di verifica dei riferimenti simbolici dalla classe Terminator
...
Riferimenti simbolici da Terminator
oh sì.