TL; DR
В Java причина в public static void main(String[] args)
том, что
- Гослинг хотел
- код, написанный кем-то опытным в C (не в Java)
- быть выполненным кем-то, кто привык запускать PostScript в NeWS
Для C # рассуждения транзитивно похожи, так сказать. Разработчики языка сохранили синтаксис точки входа в программу знакомым для программистов из Java. Как говорит C # архитектор Андерс Хейлсберг ,
... наш подход к C # просто предлагал альтернативу ... программистам на Java ...
Длинная версия
расширение выше и подкреплено скучными ссылками.
Java Терминатор Хаста ла Виста Детка!
VM Spec, 2.17.1 Запуск виртуальной машины
... Способ, которым начальный класс указывается для виртуальной машины Java, выходит за рамки данной спецификации, но для сред хоста, использующих командные строки, типично, чтобы полное имя класса указывалось как аргумент командной строки и для последующих аргументов командной строки, которые будут использоваться в качестве строк, которые будут предоставлены в качестве аргумента метода main. Например, используя Sun Java 2 SDK для Solaris, командную строку
java Terminator Hasta la vista Baby!
запустит виртуальную машину Java, вызвав метод main класса Terminator
(класс в неназванном пакете) и передав ему массив, содержащий четыре строки: «Hasta», «la», «vista» и «Baby!» ...
... см. также: Приложение: мне нужна твоя одежда, твои ботинки и твой мотоцикл
- Моя интерпретация:
выполнение предназначено для использования как типичные сценарии в интерфейсе командной строки.
важный шаг
... это помогает избежать нескольких ложных следов в нашем расследовании.
VM Spec, 1.2 Виртуальная машина Java
Виртуальная машина Java ничего не знает о языке программирования Java ...
Я заметил выше, когда изучал предыдущую главу - 1.1 История, которая, на мой взгляд, могла бы быть полезной (но оказалась бесполезной).
- Моя интерпретация:
выполнение регулируется только спецификацией VM, которая
явно заявляет, что она не имеет ничего общего с языком Java
=> OK, чтобы игнорировать JLS и все, что связано с языком Java.
Гослинг: компромисс между Си и языком сценариев ...
Исходя из вышеизложенного, я начал искать в Интернете историю JVM . Не помогло, слишком много мусора в результатах.
Затем я вспомнил легенды о Гослинге и сузил свой поиск до истории Гослинг-JVM .
Эврика! Как появилась спецификация JVM
В этом лейтмотиве JVM Languages Summit 2008 Джеймс Гослинг обсуждает ... создание Java, ... компромисс между C и языком сценариев ...
- Моя интерпретация:
явное заявление о том, что в момент создания
C и сценарии считались наиболее важными факторами.
Уже видели кивок к скриптинг в VM Spec 2.17.1,
аргументы командной строки , достаточно объяснить , String[] args
но static
и main
еще не там, нужно копать дальше ...
Обратите внимание, что при наборе этого слова - соединяя C, скрипты и VM Spec 1.2 с его ничего-Java-я - я чувствую себя как что-то знакомое, что-то ... объектно-ориентированное медленно исчезает. Возьми меня за руку и продолжай двигаться.
Слайды Keynote доступны онлайн: 20_Gosling_keynote.pdf , довольно удобно для копирования ключевых моментов.
страница 3
Предыстория Java
* Что сформировало мое мышление
страница 9
Новости
* Сетевая расширяемая оконная система
* Оконная система на основе сценариев ....
PostScript (!!)
страница 16
Большая (но тихая) цель:
Как близко я мог добраться до
"сценарий" чувствую ...
страница 19
Оригинальная концепция
* Было все о строительстве
сети вещей,
организован с помощью сценариев
язык
* (Оболочки Unix, AppleScript, ...)
страница 20
Волк в овечьей шкуре
* Синтаксис C, чтобы сделать разработчиков
удобный
Ага! Давайте подробнее рассмотрим синтаксис Си .
Пример "Привет, мир" ...
main()
{
printf("hello, world\n");
}
... определяется функция с именем main. Основная функция служит специальное назначение в программах C; среда выполнения вызывает основную функцию, чтобы начать выполнение программы.
... Функция main на самом деле имеет два аргумента 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 класса Terminator
(класс в неназванном пакете) и передав ему массив, содержащий четыре строки: «Hasta», «la», «vista» и «Baby!».
Теперь мы опишем шаги, которые может предпринять виртуальная машина Terminator
, в качестве примера процессов загрузки, компоновки и инициализации, которые описаны далее в последующих разделах.
Первоначальная попытка ... обнаруживает, что класс Terminator
не загружен ...
После Terminator
загрузки он должен быть инициализирован перед вызовом main, а тип (класс или интерфейс) всегда должен быть связан до его инициализации. Связывание (§2.17.3) включает проверку, подготовку и (необязательно) разрешение ...
Проверка (§2.17.3) проверяет, что загруженное представление Terminator
правильно сформировано ...
Резолюция (§2.17.3) - это процесс проверки символических ссылок из класса Terminator
...
Символические ссылки от Terminator
ах да.