TL; DR
In Java ist der Grund public static void main(String[] args)
dafür
- Gänschen wollte
- der Code, der von jemandem geschrieben wurde, der Erfahrung mit C hat (nicht in Java)
- von jemandem ausgeführt werden, der es gewohnt ist, PostScript unter NeWS auszuführen
Für C # ist die Argumentation sozusagen transitiv ähnlich . Die Sprachentwickler haben die Syntax des Programmeinstiegspunkts für Programmierer aus Java beibehalten . Wie der C # -Architekt Anders Hejlsberg es ausdrückt ,
... unser Ansatz mit C # war einfach, eine Alternative zu Java-Programmierern anzubieten ...
Lange Version
oben erweitern und mit langweiligen Referenzen gesichert.
Java Terminator Hasta la Vista Baby!
VM Spec, 2.17.1 Start der virtuellen Maschine
... Die Art und Weise, in der die anfängliche Klasse für die Java Virtual Machine angegeben wird, liegt außerhalb des Bereichs dieser Spezifikation. In Hostumgebungen, die Befehlszeilen verwenden, ist es jedoch typisch, dass der vollständig qualifizierte Name der Klasse als angegeben wird Ein Befehlszeilenargument und nachfolgende Befehlszeilenargumente, die als Zeichenfolgen verwendet werden, müssen als Argument für die Methode main angegeben werden. Verwenden Sie beispielsweise das Java 2 SDK von Sun für Solaris, die Befehlszeile
java Terminator Hasta la vista Baby!
startet eine Java Virtual Machine, indem die Methode main of class Terminator
(eine Klasse in einem nicht benannten Paket) aufgerufen und ein Array übergeben wird, das die vier Zeichenfolgen "Hasta", "la", "vista" und "Baby!" enthält.
... siehe auch: Anhang: Ich brauche deine Klamotten, deine Stiefel und dein Motorrad
- Meine Interpretation:
Zielgerichtete Ausführung für die Verwendung als typische Skripte in der Befehlszeilenschnittstelle.
wichtiger Nebenschritt
... das hilft, ein paar falsche Spuren in unserer Untersuchung zu vermeiden.
VM Spec, 1.2 Die Java Virtual Machine
Die Java Virtual Machine kennt die Programmiersprache Java nicht ...
Ich habe oben beim Studium des vorherigen Kapitels - 1.1 Geschichte bemerkt, was ich für hilfreich hielt (aber als nutzlos herausstellte).
- Meine Interpretation: Die
Ausführung wird ausschließlich durch die VM-Spezifikation geregelt, die
ausdrücklich erklärt, dass sie nichts mit der Java-Sprache zu tun hat
=> OK, um JLS und jegliche Java-Sprache überhaupt zu ignorieren
Gosling: ein Kompromiss zwischen C und Skriptsprache ...
Basierend auf den obigen Angaben habe ich begonnen, das Web nach JVM-Verlauf zu durchsuchen . Hat nicht geholfen, zu viel Müll in den Ergebnissen.
Dann erinnerte ich mich an Legenden über Gosling und beschränkte meine Suche auf die Gosling JVM-Geschichte .
Eureka! Wie die JVM-Spezifikation entstanden ist
In dieser Keynote des JVM Languages Summit 2008 geht James Gosling auf ... Javas Erschaffung, ... einen Kompromiss zwischen C und Skriptsprache ein ...
- Meine Interpretation:
explizite Erklärung, dass zum Zeitpunkt der Erstellung
C und Scripting als wichtigste Einflüsse betrachtet wurden.
Bereits Nicken zu Scripting in VM Spec 2.17.1, gesehen
hinreichend erklären Befehlszeilenargumente String[] args
aber static
und main
sind noch nicht da, müssen weiter graben ...
Beachten Sie, während Sie dies eingeben - indem Sie C, Scripting und VM Spec 1.2 mit dem Nichts von Java verbinden -, dass ich das Gefühl habe, dass etwas Vertrautes, etwas ... Objektorientiertes langsam vergeht. Nimm meine Hand und beweg dich weiter. Mach nicht langsamer, wir sind fast da
Die Keynote-Folien sind online verfügbar: 20_Gosling_keynote.pdf. Dies ist sehr praktisch, um wichtige Punkte zu kopieren.
Seite 3
Die Vorgeschichte von Java
* Was hat mein Denken geprägt?
Seite 9
Nachrichten
* Networked Extensible Window System
* Ein auf Scripting basierendes Fenstersystem ....
PostScript (!!)
Seite 16
Ein großes (aber ruhiges) Ziel:
Wie nah könnte ich an eine ... herankommen?
"scripting" fühlen ...
Seite 19
Das ursprüngliche Konzept
* War alles über das Bauen
Netzwerke von Dingen,
orchestriert durch ein Skript
Sprache
* (Unix-Shells, AppleScript, ...)
Seite 20
Ein Wolf im Schafspelz
* C-Syntax, um Entwickler zu machen
gemütlich
Aha! Schauen wir uns die C-Syntax genauer an .
Das "Hallo, Welt" Beispiel ...
main()
{
printf("hello, world\n");
}
... wird eine Funktion namens main definiert. Die Hauptfunktion erfüllt in C-Programmen einen besonderen Zweck; Die Laufzeitumgebung ruft die Hauptfunktion auf, um die Programmausführung zu starten.
... Die Hauptfunktion hat tatsächlich zwei Argumente, int argc
und char *argv[]
, jeweils, der verwendet werden kann , um Befehlszeilenargumente Griff ...
Kommen wir näher? Sie wetten. Es lohnt sich auch, dem "Haupt" -Link aus dem obigen Zitat zu folgen:
Die Hauptfunktion ist, wo ein Programm die Ausführung startet. Es ist für die übergeordnete Organisation der Programmfunktionalität verantwortlich und hat normalerweise Zugriff auf die Befehlsargumente, die dem Programm bei seiner Ausführung gegeben wurden.
- Meine Interpretation:
Um für C-Entwickler komfortabel zu sein, muss der Programmeinstiegspunkt sein main
.
Da Java erfordert, dass eine Methode in der Klasse enthalten ist, Class.main
ist es
so nah wie möglich: statischer Aufruf, nur Klassenname und Punkt,
bitte keine Konstruktoren - C weiß nichts dergleichen.
Dies gilt auch transitiv für C #, wobei
die Idee einer einfachen Migration von Java zu C # berücksichtigt wird .
Leser, die der Meinung sind, dass der Einstiegspunkt in ein vertrautes Programm keine Rolle spielt, werden gebeten, nach Stack Overflow-Fragen zu suchen und zu suchen, bei denen Jungs aus Java SE versuchen, Hello World für Java ME MIDP zu schreiben . Hinweis Der MIDP-Einstiegspunkt hat kein main
Nor static
.
Fazit
Basierend auf oben ich sagen würde static
, main
und String[] args
war in den Momenten von Java und C # Schaffung vernünftigste Wahl zu definieren Programmeinstiegspunkt .
Anhang: Ich brauche deine Kleidung, deine Stiefel und dein Motorrad
Zugegeben , das Lesen von VM Spec 2.17.1 hat riesigen Spaß gemacht.
... die Kommandozeile
java Terminator Hasta la vista Baby!
startet eine Java Virtual Machine, indem die Methode main of class Terminator
(eine Klasse in einem nicht benannten Paket) aufgerufen und ein Array übergeben wird, das die vier Zeichenfolgen "Hasta", "la", "vista" und "Baby!" enthält.
Wir skizzieren nun die Schritte, die die virtuelle Maschine ausführen kann Terminator
, als Beispiel für die Lade-, Verknüpfungs- und Initialisierungsprozesse, die in späteren Abschnitten weiter beschrieben werden.
Der erste Versuch ... stellt fest, dass die Klasse Terminator
nicht geladen ist ...
Nachdem Terminator
geladen wurde, muss es initialisiert werden, bevor main aufgerufen werden kann, und ein Typ (Klasse oder Schnittstelle) muss immer verknüpft werden, bevor es initialisiert wird. Das Verknüpfen (§2.17.3) beinhaltet die Überprüfung, Vorbereitung und (optional) Auflösung ...
Die Überprüfung (§2.17.3) prüft, ob die geladene Darstellung von Terminator
wohlgeformt ist ...
Die Auflösung (§2.17.3) ist der Prozess des Überprüfens von symbolischen Referenzen aus der Klasse Terminator
...
Symbolische Verweise von Terminator
oh yeah.