TL; DR
ใน Java เหตุผลpublic static void main(String[] args)
ก็คือ
- ลูกห่านที่ต้องการ
- รหัสที่เขียนโดยคนที่มีประสบการณ์ใน C (ไม่ใช่ใน Java)
- จะถูกประหารโดยใครบางคนที่เคยใช้งานPostScriptบนNeWS
สำหรับ C # เหตุผลคล้ายคลึงกันในลักษณะทรานซิทจึงจะพูด นักออกแบบภาษายังคงคุ้นเคยกับไวยากรณ์จุดเข้าใช้งานโปรแกรมสำหรับโปรแกรมเมอร์ที่มาจาก Java ในฐานะที่เป็น C # สถาปนิกAnders Hejlsberg ทำให้มัน ,
... แนวทางของเรากับ C # เป็นเพียงการนำเสนอทางเลือก ... แก่โปรแกรมเมอร์ Java ...
รุ่นยาว
ขยายด้านบนและสำรองด้วยการอ้างอิงที่น่าเบื่อ
java Terminator เรียนรู้เกี่ยวกับ Baby!
VM Spec, 2.17.1 การเริ่มต้นเครื่องเสมือน
... ลักษณะที่คลาสเริ่มต้นถูกระบุไปยังเครื่องเสมือน Java อยู่นอกเหนือขอบเขตของข้อกำหนดนี้ แต่เป็นเรื่องปกติในสภาพแวดล้อมโฮสต์ที่ใช้บรรทัดคำสั่งสำหรับชื่อที่ผ่านการรับรองโดยสมบูรณ์ของคลาสที่จะระบุเป็น อาร์กิวเมนต์บรรทัดคำสั่งและสำหรับอาร์กิวเมนต์บรรทัดคำสั่งที่ตามมาที่จะใช้เป็นสตริงที่จะให้เป็นอาร์กิวเมนต์สำหรับวิธีการหลัก ตัวอย่างเช่นการใช้ Java 2 SDK สำหรับ Solaris ซึ่งเป็นบรรทัดคำสั่ง
java Terminator Hasta la vista Baby!
จะเริ่มต้นเครื่องเสมือน Java โดยเรียกใช้เมธอด main ของคลาสTerminator
(คลาสในแพ็กเกจที่ไม่มีชื่อ) และส่งผ่านอาร์เรย์ที่มีสี่สตริง "Hasta", "la", "vista" และ "Baby!" ...
... ดูเพิ่มเติม: ภาคผนวก: ฉันต้องการเสื้อผ้ารองเท้าบู๊ทและมอเตอร์ไซค์ของคุณ
- การตีความของฉัน:
การดำเนินการเป้าหมายสำหรับการใช้งานเช่นสคริปต์ทั่วไปในอินเตอร์เฟสบรรทัดคำสั่ง
ก้าวเท้าเลี่ยง
... ที่ช่วยหลีกเลี่ยงร่องรอยที่ผิดพลาดในการสืบสวนของเรา
VM Spec, 1.2 The Java Virtual Machine
เครื่องเสมือน Java ไม่รู้ภาษาการเขียนโปรแกรม Java ...
ฉันสังเกตเห็นข้างต้นเมื่อศึกษาบทก่อนหน้า - 1.1 ประวัติศาสตร์ซึ่งฉันคิดว่าอาจเป็นประโยชน์ (แต่กลับกลายเป็นว่าไร้ประโยชน์)
- การตีความของฉัน:
การประมวลผลถูกควบคุมโดยข้อมูลจำเพาะของ VM เพียงอย่างเดียวซึ่ง
ประกาศอย่างชัดเจนว่าไม่มีส่วนเกี่ยวข้องกับภาษา Java
=> ตกลงเพื่อละเว้นJLSและภาษา Java ที่เกี่ยวข้องทั้งหมด
ลูกห่าน: ประนีประนอมระหว่าง C และภาษาสคริปต์ ...
ขึ้นอยู่กับข้างต้นผมเริ่มค้นหาเว็บสำหรับประวัติ JVM ไม่ได้ผลขยะมากเกินไป
แล้วฉันจะเล่าตำนานเกี่ยวกับกอสลิงและแคบลงค้นหาของฉันไปประวัติศาสตร์ลูกห่าน JVM
ยูเรก้า! JVM Spec มาเป็นอย่างไร
ในคำปราศรัยนี้จาก JVM Languages Summit 2008, James Gosling พูดถึง ... การสร้างของ Java, ... การประนีประนอมระหว่างภาษา C และภาษาสคริปต์ ...
- การตีความของฉัน:
ประกาศอย่างชัดเจนว่าในขณะที่สร้าง
C และการเขียนสคริปต์ได้รับการพิจารณาอิทธิพลที่สำคัญที่สุด
เห็นแล้วพยักหน้าให้สคริปต์ใน VM Spec 2.17.1,
อาร์กิวเมนต์บรรทัดคำสั่งพออธิบายString[] args
แต่static
และmain
ไม่ได้มี แต่ต้องขุดต่อไป ...
หมายเหตุในขณะที่พิมพ์สิ่งนี้ - การเชื่อมต่อ C, การเขียนสคริปต์และ VM Spec 1.2 โดยไม่มีอะไรเลย - ฉันรู้สึกว่าคุ้นเคยกับบางสิ่งบางอย่าง ... การวางเชิงวัตถุนั้นผ่านไปอย่างช้าๆ จับมือฉันไว้ก่อนแล้วอย่าช้าลงเราใกล้จะถึงแล้ว
สไลด์ Keynote มีให้บริการออนไลน์: 20_Gosling_keynote.pdfค่อนข้างสะดวกสำหรับการคัดลอกประเด็นสำคัญ
หน้า 3
ประวัติศาสตร์ของ Java
* อะไรที่ทำให้ฉันคิด
หน้า 9
ข่าว
* ระบบหน้าต่างที่ขยายได้บนเครือข่าย
* ระบบหน้าต่างอ้างอิงสคริปต์ ....
PostScript (!!)
หน้า 16
เป้าหมายใหญ่ (แต่เงียบ):
ฉันจะได้ใกล้ชิดแค่ไหน
ความรู้สึก "การเขียนสคริปต์" ...
หน้า 19
แนวคิดดั้งเดิม
* ทุกอย่างเกี่ยวกับการสร้าง
เครือข่ายของสิ่งต่าง ๆ
เตรียมการโดยสคริปต์
ภาษา
* (Unix shells, AppleScript, ... )
หน้า 20
A Wolf in Sheeps เครื่องแต่งกาย
* C ไวยากรณ์เพื่อให้นักพัฒนา
สบาย
A-Ha! ลองดูที่ไวยากรณ์ C ให้ละเอียดยิ่งขึ้น
ตัวอย่าง "สวัสดีโลก" ...
main()
{
printf("hello, world\n");
}
... ฟังก์ชั่นชื่อ main กำลังถูกกำหนด หลักฟังก์ชั่นทำหน้าที่เป็นวัตถุประสงค์พิเศษในโปรแกรม C; สภาพแวดล้อมรันไทม์เรียกใช้ฟังก์ชันหลักเพื่อเริ่มการทำงานของโปรแกรม
... ฟังก์ชั่นหลักที่จริงมีสองข้อโต้แย้งint argc
และchar *argv[]
ตามลำดับซึ่งสามารถใช้ในการจัดการข้อโต้แย้งบรรทัดคำสั่ง ...
เราเข้าใกล้ไหม? พนันได้เลย. นอกจากนี้ยังมีมูลค่าต่อไปนี้ลิงค์ "หลัก" จากใบเสนอราคาด้านบน:
ฟังก์ชั่นหลักคือที่ที่โปรแกรมเริ่มการทำงาน เป็นผู้รับผิดชอบสำหรับองค์กรระดับสูงของฟังก์ชันการทำงานของโปรแกรมและโดยทั่วไปจะสามารถเข้าถึงอาร์กิวเมนต์คำสั่งที่กำหนดให้กับโปรแกรมเมื่อถูกเรียกใช้งาน
- การตีความของฉัน:
การจะมีความสะดวกสบายสำหรับนักพัฒนา C, main
จุดเข้าโปรแกรมจะต้องมี
นอกจากนี้ตั้งแต่ Java ต้องใช้วิธีการใด ๆ ที่จะอยู่ในระดับClass.main
เป็น
ที่ใกล้ที่สุดเท่าที่จะได้รับ: การภาวนาแบบคงที่ชื่อชั้นและเพียงแค่จุด
ไม่มีการก่อสร้างโปรด - C รู้อะไรเช่นนั้น
นอกจากนี้ยังสกรรมกริยานำไปใช้กับ C # คำนึงถึง
ความคิดของการย้ายถิ่นง่ายที่จะได้จาก Java
ผู้อ่านที่คิดว่าจุดเข้าโปรแกรมที่คุ้นเคยนั้นไม่สำคัญโปรดเชิญให้ค้นหาและตรวจสอบคำถาม Stack Overflow ที่ผู้ที่มาจาก 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
โหลดแล้วจะต้องเริ่มต้นได้ก่อนที่จะสามารถเรียกใช้งานหลักและต้องเชื่อมโยงประเภท (คลาสหรืออินเทอร์เฟซ) ก่อนที่จะเริ่มต้นได้ การเชื่อมโยง (§2.17.3) เกี่ยวข้องกับการตรวจสอบการเตรียมการและ (ทางเลือก) การแก้ไข ...
การตรวจสอบ (§2.17.3) ตรวจสอบว่าการแสดงการโหลดTerminator
ถูกสร้างขึ้นอย่างดี ...
ความละเอียด (.12.17.3) เป็นกระบวนการตรวจสอบการอ้างอิงสัญลักษณ์จากคลาสTerminator
...
การอ้างอิงเชิงสัญลักษณ์จากTerminator
oh yeah