TL; DR
자바에서 그 이유 public static void main(String[] args)
는
- 고슬링 원
- C에서 경험 한 사람이 작성한 코드 (Java가 아님)
- 실행하는 데 사용 누군가에 의해 실행되는 포스트 스크립트 에 뉴스
C #의 경우 추론은 전 이적으로 유사 합니다. 언어 설계자는 프로그램 진입 점 구문을 Java에서 온 프로그래머에게 친숙 하게 유지했습니다 . C # 설계자 인 Anders Hejlsberg는 다음과 같이 말합니다 .
... C #을 사용한 우리의 접근 방식은 단순히 Java 프로그래머에게 대안을 제공하는 것이 었습니다 ...
긴 버전
지루한 참조로 위로 확장하고 백업했습니다.
자바 터미네이터 Hasta la vista Baby!
VM 사양, 2.17.1 가상 머신 시작
... 초기 클래스가 JVM (Java Virtual Machine)에 지정되는 방식은이 스펙의 범위를 벗어나지 만 명령 행을 사용하는 호스트 환경에서는 클래스의 완전한 이름을 다음과 같이 지정하는 것이 일반적입니다. main 메소드에 대한 인수로 제공 될 문자열로 사용되는 명령 행 인수 및 후속 명령 행 인수 예를 들어, Solaris 용 Sun의 Java 2 SDK (명령 줄)를 사용하면
java Terminator Hasta la vista Baby!
클래스의 메인 메소드 Terminator
(명명되지 않은 패키지 의 클래스)를 호출하고 네 개의 문자열 "Hasta", "la", "vista"및 "Baby!"를 포함하는 배열을 전달 하여 Java 가상 머신을 시작합니다 .
... 참조 : 부록 : 옷, 부츠, 오토바이가 필요합니다
- 내 해석 :
명령 줄 인터페이스의 일반적인 스크립트처럼 사용하기위한 실행.
중요한 회피
조사에서 몇 가지 잘못된 흔적을 피하는 데 도움이됩니다.
VM 스펙, 1.2 Java 가상 머신
자바 가상 머신은 자바 프로그래밍 언어를 전혀 모른다 ...
이전 장 -1.1 에서 공부할 때 위와 같은 사실을 알았습니다 .
- 내 해석 :
실행은 VM 사양 단독으로 관리되며
Java 언어
=> OK 와 관련이 없으므로 JLS 와 Java 언어 를 무시 합니다.
고슬링 : C 언어와 스크립팅 언어의 타협 ...
위의 내용을 바탕으로 웹에서 JVM 히스토리 를 검색하기 시작했습니다 . 결과에 너무 많은 쓰레기가 도움이되지 않았습니다.
그런 다음 Gosling에 대한 전설을 기억하고 Gosling JVM history로 검색 범위를 좁혔습니다 .
유레카! JVM 사양은 어떻게 되었습니까?
James Gosling은 JVM Languages Summit 2008의 기조 연설에서 Java의 생성, C와 스크립팅 언어의 타협에 대해 설명합니다.
- 내 해석 :
창조 순간
C와 스크립팅이 가장 중요한 영향으로 간주되었다는 명시 적 선언 .
이미 VM 사양 2.17.1에서 스크립트에 고개를 끄덕 볼,
명령 줄 인수 충분히 설명 String[] args
하지만, static
및 main
더 발굴 할 필요가 아직 없습니다 ...
Java를 사용하지 않고 C, 스크립팅 및 VM Spec 1.2를 연결하는 동안 이것을 입력하는 동안 친숙하고 무언가 ... 객체 지향 객체 가 천천히 사라지는 것처럼 느낍니다 . 내 손을 잡고 움직여 라 '천천히 하지마 우리는 거의 다 왔어
키 노트 슬라이드는 온라인으로 제공됩니다 : 20_Gosling_keynote.pdf , 키포인트 복사에 매우 편리합니다.
3 페이지
자바의 선사 시대
* 내 생각의 원인
9 페이지
뉴스
* 네트워크 확장 가능 윈도우 시스템
* 스크립팅 기반의 윈도우 시스템 ....
포스트 스크립트 (!!)
16 페이지
큰 (하지만 조용한) 목표 :
내가 얼마나 가까이 갈 수 있을까
"스크립팅"느낌 ...
19 페이지
원래 개념
* 건물에 관한 모든 것
사물의 네트워크,
스크립팅으로 조정
언어
* (유닉스 쉘, AppleScript, ...)
20 페이지
양의 늑대
* 개발자를위한 C 구문
편안
아하! C 구문을 자세히 살펴 보자 .
"hello, world"예제 ...
main()
{
printf("hello, world\n");
}
... main이라는 함수가 정의되고 있습니다. 주요 기능은 C 프로그램에서 특별한 용도로 사용됩니다; 런타임 환경은 main 함수를 호출하여 프로그램 실행을 시작합니다.
... 주 함수에는 실제로 두 개의 인수가 int argc
있으며 char *argv[]
, 각각 명령 행 인수를 처리하는 데 사용할 수 있습니다.
우리는 점점 가까워지고 있습니까? 물론이지. 위의 인용문에서 "main"링크를 따르는 것도 가치가 있습니다.
주요 기능은 프로그램이 실행을 시작하는 곳입니다. 프로그램 기능의 상위 레벨 조직을 담당하며 일반적으로 프로그램이 실행될 때 제공된 명령 인수에 액세스 할 수 있습니다.
- 내 해석 :
C 개발자가 편하게하려면 프로그램 시작 지점이이어야 main
합니다.
자바 클래스에있을 어떤 방법을 필요로하기 때문에, Class.main
있다
가수록 가까운 정적 호출, 단지 클래스 이름과 점은,
어떤 생성자하십시오 - C는 그런 아무것도 모른다.
이는
Java에서 쉽게 마이그레이션 할 수 있다는 아이디어 를 고려 하여 C # 에도 전 이적으로 적용됩니다
.
친숙한 프로그램 진입 점이 중요하지 않다고 생각하는 독자들은 Java SE에서 온 사람들이 Hello ME for Java ME MIDP 를 작성하려고 시도하는 스택 오버플로 질문을 검색하고 확인하도록 친절하게 초대됩니다 . 참고 MIDP 진입 점 에는도 main
없습니다 static
.
결론
나는 그 말을 상기 내용을 토대로 static
, main
그리고 String[] args
정의하는 자바와 C # 만드는 가장 합리적인 선택의 순간에 있었던 프로그램의 진입 점을 .
부록 : 옷, 부츠, 오토바이가 필요합니다
VM Spec 2.17.1 을 읽는 것은 엄청난 재미였습니다.
... 명령 줄
java Terminator Hasta la vista Baby!
클래스의 메소드 main Terminator
(이름없는 패키지 의 클래스)을 호출하고 "Hasta", "la", "vista"및 "Baby!"라는 네 개의 문자열을 포함하는 배열을 전달 하여 Java 가상 머신을 시작합니다 .
이제 Terminator
이후 섹션에서 자세히 설명하는로드, 링크 및 초기화 프로세스의 예로 가상 머신이 실행하는 단계를 간략하게 설명합니다.
초기 시도는 ... 클래스 Terminator
가로드되지 않았 음을 발견합니다 .
Terminator
로드 된 후에 는 main을 호출하기 전에 초기화해야하며, 유형 (클래스 또는 인터페이스)이 초기화되기 전에 항상 링크되어야합니다. 연결 (§2.17.3)에는 검증, 준비 및 (선택적) 해결이 포함됩니다 ...
검증 (§2.17.3)은로드 된 표현 Terminator
이 잘 구성되어 있는지 확인합니다 .
결의안 (§2.17.3)은 클래스에서 상징적 참조를 확인하는 과정이다 Terminator
.
Terminator
오 예
에서 상징적 인 참조 .