TL; DR
Przyczyną tego public static void main(String[] args)
jest Java
- gosling chciał
- kod napisany przez osobę mającą doświadczenie w C (nie w Javie)
- do wykonania przez osobę przyzwyczajoną do uruchamiania PostScript na NeWS
W przypadku C # rozumowanie jest tranzytowo podobne, że tak powiem. Projektanci języków znali składnię punktów wejścia programu znaną programistom pochodzącym z Javy. Jak ujął to architekt C #, Anders Hejlsberg ,
... naszym podejściem do C # było po prostu zaoferowanie alternatywy ... dla programistów Java ...
Długa wersja
rozwijając się powyżej i tworząc nudne referencje.
java Terminator Hasta la vista Baby!
Specyfikacja VM, 2.17.1 Uruchomienie maszyny wirtualnej
... Sposób, w jaki klasa początkowa jest określana na maszynie wirtualnej Java, wykracza poza zakres tej specyfikacji, ale jest typowy w środowiskach hostów korzystających z wiersza poleceń, aby w pełni kwalifikowana nazwa klasy została określona jako argument wiersza poleceń i kolejne argumenty wiersza polecenia, które mają być użyte jako ciągi znaków jako argument metody main. Na przykład przy użyciu zestawu SDK Java 2 firmy Sun dla systemu Solaris wiersz poleceń
java Terminator Hasta la vista Baby!
uruchomi maszynę wirtualną Java, wywołując metodę main klasy Terminator
(klasa w nienazwanym pakiecie) i przekazując jej tablicę zawierającą cztery ciągi znaków „Hasta”, „la”, „vista” i „Baby!” ...
... patrz także: Załącznik: Potrzebuję twoich ubrań, butów i motocykla
- Moja interpretacja:
wykonanie ukierunkowane do użycia jak typowe skrypty w interfejsie wiersza poleceń.
ważny boczny krok
... pomaga to uniknąć kilku fałszywych śladów w naszym dochodzeniu.
VM Spec, 1.2 The Java Virtual Machine
Wirtualna maszyna Java nic nie zna języka programowania Java ...
Powyżej zauważyłem, studiując poprzedni rozdział - 1.1 Historia, która moim zdaniem może być pomocna (ale okazała się bezużyteczna).
- Moja interpretacja:
wykonanie jest regulowane przez samą specyfikację VM, która
wyraźnie oświadcza, że nie ma to nic wspólnego z językiem Java
=> OK, aby zignorować JLS i dowolny inny język Java
Gąsiątko: kompromis między C a językiem skryptowym ...
W oparciu o powyższe zacząłem przeszukiwać sieć w poszukiwaniu historii JVM . Nie pomogło, zbyt wiele śmieci w wynikach.
Potem przypomniałem sobie legendy o Goslingu i zawęziłem poszukiwania do historii JVM Goslinga .
Eureka! Jak powstała specyfikacja JVM
W tym przemówieniu z JVM Languages Summit 2008 James Gosling omawia ... tworzenie Javy, ... kompromis między C i językiem skryptowym ...
- Moja interpretacja:
wyraźne oświadczenie, że w momencie tworzenia
C i skrypt zostały uznane za najważniejsze czynniki.
Już widać ukłon skryptów w VM Spec 2.17.1,
argumenty linii poleceń dostatecznie wyjaśnić String[] args
, ale static
i main
nie są tam jeszcze, trzeba kopać dalej ...
Zauważ, że pisząc to - łącząc C, skryptowanie i VM Spec 1.2 z nic-of-Java - czuję się jak coś znajomego, coś ... obiektowego powoli odchodzi. Weź mnie za rękę i ruszaj się. Nie zwalniaj, jesteśmy już prawie na miejscu
Slajdy keynote są dostępne online: 20_Gosling_keynote.pdf , całkiem wygodne do kopiowania kluczowych punktów.
strona 3
Prehistoria Java
* Co ukształtowało moje myślenie
strona 9
Aktualności
* Sieciowy system rozszerzalnych okien
* System okien oparty na skryptach ....
PostScript (!!)
strona 16
Duży (ale cichy) cel:
Jak blisko mogę się dostać do
„skryptowanie” wydaje się…
strona 19
Oryginalna koncepcja
* Chodziło o budowę
sieci rzeczy,
zaaranżowane przez skrypt
język
* (Powłoki Unix, AppleScript, ...)
strona 20
Wilk w owczej skórze
* C składnia do tworzenia programistów
wygodny
Aha! Spójrzmy bliżej na składni C .
Przykład „witaj, świecie” ...
main()
{
printf("hello, world\n");
}
... definiowana jest funkcja main. Główną funkcja służy do celów specjalnych w programach C; środowisko wykonawcze wywołuje główną funkcję, aby rozpocząć wykonywanie programu.
... Główna funkcja faktycznie ma dwa argumenty int argc
i char *argv[]
, odpowiednio, można ich użyć do obsługi argumentów wiersza poleceń ...
Czy zbliżamy się? obstawiasz. Warto również kliknąć „główny” link z powyższego cytatu:
główną funkcją jest miejsce, w którym program rozpoczyna wykonywanie. Odpowiada za organizację wysokiego poziomu funkcjonalności programu i zazwyczaj ma dostęp do argumentów poleceń podanych programowi podczas jego wykonywania.
- Moja interpretacja:
Aby być wygodnym dla programisty C, punkt wejścia programu musi być main
.
Ponadto, ponieważ Java wymaga, aby każda metoda była w klasie, Class.main
jest
tak blisko, jak to możliwe: wywołanie statyczne, tylko nazwa klasy i kropka,
proszę żadnych konstruktorów - C nie wie nic takiego.
Dotyczy to także tranzytowo C #, biorąc pod uwagę
pomysł łatwej migracji do niego z Java.
Czytelnicy myślący, że znajomy punkt wejścia programu nie ma znaczenia, są proszeni o wyszukiwanie i sprawdzanie pytań dotyczących przepełnienia stosu, w których faceci z Java SE próbują napisać Hello World dla Java ME MIDP. Uwaga Punkt wejścia MIDP nie ma main
ani static
.
Wniosek
W oparciu o powyższe chciałbym powiedzieć, że static
, main
i String[] args
były w chwilach Java i C # tworzenie najbardziej rozsądnych wyborów do definiują programu punktu wejścia .
Dodatek: Potrzebuję twoich ubrań, butów i motocykla
Muszę przyznać, że czytanie VM Spec 2.17.1 było niesamowitą zabawą.
... wiersz poleceń
java Terminator Hasta la vista Baby!
uruchomi maszynę wirtualną Java, wywołując metodę main klasy Terminator
(klasa w pakiecie bez nazwy) i przekazując jej tablicę zawierającą cztery ciągi znaków „Hasta”, „la”, „vista” i „Baby!”.
Teraz nakreślamy kroki, które może wykonać maszyna wirtualna Terminator
, jako przykład procesów ładowania, łączenia i inicjowania, które są opisane w dalszej części.
Pierwsza próba ... odkrywa, że klasa Terminator
nie jest załadowana ...
Po Terminator
załadowaniu należy go zainicjować, aby można było wywołać main, a typ (klasa lub interfejs) musi być zawsze połączony przed jego zainicjowaniem. Łączenie (§2.17.3) obejmuje weryfikację, przygotowanie i (opcjonalnie) rozwiązanie ...
Weryfikacja (§2.17.3) sprawdza, czy załadowana reprezentacja Terminator
jest poprawnie uformowana ...
Rozdzielczość (§2.17.3) to proces sprawdzania symbolicznych odniesień z klasy Terminator
...
Symboliczne odniesienia od Terminator
o tak.