TL; DR
У Java причина public static void main(String[] args)
цього
- Гослінг хотів
- код, написаний людиною, що має досвід C (не на Java)
- виконуватиметься хтось, хто звик працювати з PostScript на NeWS
Для C # міркування транзитивно схожі, так би мовити. Мовні дизайнери зберегли синтаксис точки введення програми, знайомий програмістам, що надходять з Java. Як стверджує архітектор C # Андерс Хейльсберг ,
... наш підхід із C # був просто запропонувати альтернативу ... програмістам Java ...
Довга версія
розширення вище та підкріплене нудними посиланнями.
java Термінатор Hasta la vista Baby!
VM Spec, 2.17.1 Запуск віртуальної машини
... Спосіб, яким початковий клас задається віртуальній машині Java, виходить за межі цієї специфікації, але типовим є в середовищі хостів, що використовують командні рядки, для повного кваліфікованого імені класу, що визначається як аргумент командного рядка та наступні аргументи командного рядка, що використовуються як рядки, що надаються як аргумент до методу main. Наприклад, використовуючи командний рядок Java Java SD 2 для Solaris
java Terminator Hasta la vista Baby!
запустить віртуальну машину Java шляхом виклику методу main class Terminator
(клас у неназваному пакеті) і передасть йому масив, що містить чотири рядки "Hasta", "la", "vista" та "Baby!" ...
... див. також: Додаток: Мені потрібен ваш одяг, ваші черевики та мотоцикл
- Моя інтерпретація:
виконання, націлене на використання, як типові сценарії в інтерфейсі командного рядка.
важливий бічний крок
... що допомагає уникнути пари помилкових слідів у нашому розслідуванні.
VM Spec, 1.2 Віртуальна машина Java
Віртуальна машина Java нічого не знає мови програмування Java ...
Я звернув увагу вище, вивчаючи попередній розділ - 1.1 Історія, яку я вважав може бути корисною (але виявилася марною).
- Моя інтерпретація:
виконання регулюється лише специфікацією VM, яка
прямо заявляє, що це не має нічого спільного з мовою Java
=> ОК, щоб ігнорувати JLS та що-небудь, що стосується мови Java, взагалі.
Гослінг: компроміс між мовою С та сценарієм ...
На підставі вище я почав шукати в Інтернеті історію JVM . Не допомогло, занадто багато сміття в результатах.
Потім я згадав легенди про Гослінг і звузив свій пошук до історії JVM Gosling .
Еврика! Як з'явився спец JVM
У цій доповіді з саміту JVM Languages 2008, Джеймс Гослінг обговорює ... створення Java, ... компроміс між C та мовою сценаріїв ...
- Моє тлумачення:
чітка заява про те, що на момент створення,
С та сценарії вважалися найважливішими впливами.
Вже бачили кивок до скриптинг в VM Spec 2.17.1,
аргументи командного рядка , досить пояснити , String[] args
але static
і main
ще не там, потрібно копати далі ...
Зауважте, під час введення цього тексту - підключення C, сценаріїв та VM Spec 1.2 з його нічого не відрізняється від Java - мені здається, що щось знайоме, щось ... орієнтоване на об'єкти повільно проходить. Візьміть мене за руку і продовжуйте рухатись: Не сповільнюйтесь, ми вже майже там
Основні слайди доступні в Інтернеті: 20_Gosling_keynote.pdf , що досить зручно для копіювання ключових точок.
сторінка 3
Передісторія Яви
* Що сформувало моє мислення
сторінка 9
NeWS
* Мережева система розширених вікон
* Віконна система на основі сценаріїв ....
PostScript (!!)
стор. 16
Велика (але тиха) мета:
Як близько я міг дістатися до
"сценарій" відчуваю ...
стор. 19
Оригінальна концепція
* Було все про будівництво
мережі речей,
оркестрований сценарієм
мова
* (Оболонки Unix, AppleScript, ...)
стор. 20
Вовк в одязі овець
* Синтаксис C для створення розробників
зручні
А-ха! Давайте подивимося ближче на синтаксисі C .
Приклад "привіт, світ" ...
main()
{
printf("hello, world\n");
}
... визначається функція з назвою main. Основна функція служить спеціальне призначення в програмах C; середовище виконання часу викликає головну функцію для початку виконання програми.
... Основна функція насправді має два аргументи, int argc
і char *argv[]
, відповідно, які можна використовувати для обробки аргументів командного рядка ...
Ми наближаємось? Будьте впевнені. Варто також дотримуватися "головного" посилання зверху цитатою:
основна функція - це те, де програма починає виконання. Він відповідає за організацію функціональних можливостей програми на високому рівні і, як правило, має доступ до аргументів команд, що надаються програмі під час її виконання.
- Моя інтерпретація:
Щоб зручно було розробнику C, програма введення програми повинна бути main
.
Крім того, оскільки Java вимагає, щоб будь-який метод був у класі, Class.main
він
настільки близький, наскільки це стає: статичне виклик, просто ім'я класу та крапка,
будь-які конструктори, будь ласка - C нічого такого не знає.
Це також транзитивно стосується C # з урахуванням
ідеї простої міграції до неї з Java.
Читачі, які думають, що знайома точка вступу програми не має значення, запрошуємо шукати та перевіряти питання щодо переповнення стека, де хлопці з Java SE намагаються написати Hello World для Java ME MIDP. Примітка. Точка входу MIDP не має main
ані норми static
.
Висновок
На підставі вище , я б сказав , що static
, main
і String[] args
був в моменти Java і C # створення найбільш розумних рішень щодо визначення програми точки входу .
Додаток: Мені потрібен ваш одяг, ваші чоботи та ваш мотоцикл
Потрібно визнати, читання VM Spec 2.17.1 було надзвичайно цікавим.
... командний рядок
java Terminator Hasta la vista Baby!
запустить віртуальну машину Java шляхом виклику методу main class Terminator
(клас у неназваному пакеті) та передасть йому масив, що містить чотири рядки "Hasta", "la", "vista" та "Baby!".
Тепер ми описуємо кроки, які може виконати віртуальна машина Terminator
, як приклад процесів завантаження, зв’язування та ініціалізації, які описані далі в наступних розділах.
Початкова спроба ... виявляє, що клас Terminator
не завантажений ...
Після Terminator
завантаження він повинен бути ініціалізований до виклику основного, і тип (клас чи інтерфейс) повинен бути завжди пов'язаний перед його ініціалізацією. Посилання (§2.17.3) включає перевірку, підготовку та (необов'язково) резолюцію ...
Перевірка (§2.17.3) перевіряє, Terminator
чи добре сформоване завантажене представлення ...
Резолюція (§2.17.3) - це процес перевірки символічних посилань з класу Terminator
...
Символічні посилання від Terminator
о так.