TL; DR
Trong Java, lý do public static void main(String[] args)
là
- Mong muốn
- mã được viết bởi một người có kinh nghiệm về C (không phải bằng Java)
- được thực thi bởi ai đó đã từng chạy PostScript trên NeWS
Đối với C #, lý do tương tự quá mức để nói. Các nhà thiết kế ngôn ngữ giữ cú pháp điểm nhập chương trình quen thuộc với các lập trình viên đến từ Java. Như kiến trúc sư C #, Anders Hejlsberg ,
... Cách tiếp cận của chúng tôi với C # đơn giản là cung cấp một giải pháp thay thế ... cho các lập trình viên Java ...
Phiên bản dài
mở rộng ở trên và sao lưu với các tài liệu tham khảo nhàm chán.
Kẻ hủy diệt java Hasta la vista Em yêu!
VM Spec, Khởi động máy ảo 2.17.1
... Cách thức mà lớp ban đầu được chỉ định cho máy ảo Java nằm ngoài phạm vi của đặc tả này, nhưng thông thường, trong các môi trường máy chủ sử dụng các dòng lệnh, cho tên đủ điều kiện của lớp được chỉ định là một đối số dòng lệnh và cho các đối số dòng lệnh tiếp theo được sử dụng làm chuỗi được cung cấp làm đối số cho phương thức chính. Ví dụ: sử dụng SDK Java 2 của Sun cho Solaris, dòng lệnh
java Terminator Hasta la vista Baby!
sẽ khởi động một máy ảo Java bằng cách gọi phương thức chính của lớp Terminator
(một lớp trong gói không tên) và truyền cho nó một mảng chứa bốn chuỗi "Hasta", "la", "vista" và "Baby!" ...
... Xem thêm: Phụ lục: Tôi cần quần áo, ủng và xe máy của bạn
- Giải thích của tôi:
thực thi được nhắm mục tiêu để sử dụng như các tập lệnh điển hình trong giao diện dòng lệnh.
sidestep quan trọng
... Điều đó giúp tránh một vài dấu vết sai trong cuộc điều tra của chúng tôi.
VM Spec, 1.2 Máy ảo Java
Máy ảo Java không biết gì về ngôn ngữ lập trình Java ...
Tôi nhận thấy ở trên khi nghiên cứu chương trước - 1.1 Lịch sử mà tôi nghĩ có thể hữu ích (nhưng hóa ra vô dụng).
- Giải thích của tôi:
việc thực thi bị chi phối bởi chỉ số VM, điều này
tuyên bố rõ ràng rằng nó không liên quan gì đến ngôn ngữ Java
=> OK để bỏ qua JLS và mọi thứ liên quan đến ngôn ngữ Java
Gosling: một sự thỏa hiệp giữa C và ngôn ngữ kịch bản ...
Dựa vào bên trên, tôi bắt đầu tìm kiếm trên web cho lịch sử JVM . Không giúp được gì, quá nhiều rác trong kết quả.
Sau đó, tôi nhớ lại những truyền thuyết về Gosling và thu hẹp tìm kiếm của tôi vào lịch sử JVM của Gosling .
Eureka! Thông số JVM đã trở thành như thế nào
Trong bài phát biểu này từ Hội nghị thượng đỉnh về ngôn ngữ JVM 2008, James Gosling thảo luận về ... sáng tạo của Java, ... một sự thỏa hiệp giữa ngôn ngữ C và ngôn ngữ kịch bản ...
- Giải thích của tôi:
tuyên bố rõ ràng rằng tại thời điểm sáng tạo,
C và kịch bản đã được coi là ảnh hưởng quan trọng nhất.
Đã nhìn thấy cái gật đầu để kịch bản trong VM Spec 2.17.1,
đối số dòng lệnh đầy đủ giải thích String[] args
nhưng static
và main
không có được nêu ra, cần phải đào thêm ...
Lưu ý trong khi nhập cái này - kết nối C, script và VM Spec 1.2 với Java không có gì - Tôi cảm thấy như một cái gì đó quen thuộc, một cái gì đó ... hướng đối tượng đang dần biến mất. Nắm lấy tay tôi và tiếp tục di chuyển 'Đừng làm chậm chúng tôi gần đến bây giờ
Các slide chính có sẵn trực tuyến: 20_Gosling_keynote.pdf , khá thuận tiện để sao chép các điểm chính.
trang 3
Tiền sử của Java
* Điều gì định hình suy nghĩ của tôi
trang 9
Tin tức
* Hệ thống cửa sổ mở rộng nối mạng
* Một hệ thống cửa sổ dựa trên kịch bản ....
PostScript (!!)
trang 16
Mục tiêu lớn (nhưng yên tĩnh):
Tôi có thể đến gần như thế nào
"kịch bản" cảm thấy ...
trang 19
Khái niệm ban đầu
* Là tất cả về xây dựng
mạng lưới của sự vật,
được dàn dựng bởi một kịch bản
ngôn ngữ
* (Shell Unix, AppleScript, ...)
trang 20
Một con sói mặc quần áo cừu
* Cú pháp C để tạo nhà phát triển
Thoải mái
A-ha! Chúng ta hãy nhìn sâu hơn về cú pháp C .
Ví dụ "xin chào, thế giới" ...
main()
{
printf("hello, world\n");
}
... một chức năng có tên chính đang được xác định. Các chính chức năng phục vụ một mục đích đặc biệt trong chương trình C; môi trường thời gian chạy gọi hàm chính để bắt đầu thực hiện chương trình.
... Hàm chính thực sự có hai đối số int argc
và char *argv[]
, tương ứng, có thể được sử dụng để xử lý các đối số dòng lệnh ...
Có phải chúng ta đang tiến gần hơn? bạn đặt cược Nó cũng có giá trị theo liên kết "chính" từ trích dẫn ở trên:
chức năng chính là nơi một chương trình bắt đầu thực thi. Nó chịu trách nhiệm tổ chức cấp cao về chức năng của chương trình và thường có quyền truy cập vào các đối số lệnh được cung cấp cho chương trình khi chương trình được thực thi.
- Giải thích của tôi:
Để được thoải mái cho nhà phát triển C, điểm vào chương trình phải được main
.
Ngoài ra, vì Java yêu cầu bất kỳ phương thức nào phải ở trong lớp, Class.main
cũng
gần như nó nhận được: lời gọi tĩnh, chỉ tên lớp và dấu chấm,
không có hàm tạo nào làm ơn - C không biết gì như vậy.
Điều này cũng áp dụng quá mức cho C #, có tính đến
ý tưởng di chuyển dễ dàng từ Java.
Người đọc nghĩ rằng điểm vào chương trình quen thuộc không thành vấn đề được mời tìm kiếm và kiểm tra các câu hỏi Stack Overflow nơi những người đến từ Java SE đang cố gắng viết Hello World cho Java ME MIDP. Lưu ý điểm vào MIDP không có main
cũng không có static
.
Phần kết luận
Dựa vào bên trên tôi sẽ nói rằng static
, main
và String[] args
tại thời điểm tạo Java và C #, các lựa chọn hợp lý nhất để xác định điểm vào chương trình .
Phụ lục: Tôi cần quần áo, ủng và xe máy của bạn
Phải thừa nhận, đọc VM Spec 2.17.1 rất thú vị.
... dòng lệnh
java Terminator Hasta la vista Baby!
sẽ khởi động một máy ảo Java bằng cách gọi phương thức chính của lớp Terminator
(một lớp trong gói không tên) và truyền cho nó một mảng chứa bốn chuỗi "Hasta", "la", "vista" và "Baby!".
Bây giờ chúng tôi phác thảo các bước mà máy ảo có thể thực hiện Terminator
, như một ví dụ về các quá trình tải, liên kết và khởi tạo được mô tả thêm trong các phần sau.
Nỗ lực ban đầu ... phát hiện ra rằng lớp Terminator
không được tải ...
Sau khi Terminator
được tải, nó phải được khởi tạo trước khi main có thể được gọi và một kiểu (lớp hoặc giao diện) phải luôn được liên kết trước khi nó được khởi tạo. Liên kết (§2.17.3) liên quan đến xác minh, chuẩn bị và (tùy chọn) giải quyết ...
Xác minh (§2.17.3) kiểm tra xem đại diện được tải Terminator
có được hình thành tốt không ...
Độ phân giải (§2.17.3) là quá trình kiểm tra các tham chiếu tượng trưng từ lớp Terminator
...
Tài liệu tham khảo tượng trưng từ Terminator
oh yeah.