TL; DR
Di Jawa, alasannya public static void main(String[] args)
adalah itu
- Gosling ingin
- kode yang ditulis oleh seseorang yang berpengalaman dalam C (bukan di Jawa)
- untuk dieksekusi oleh seseorang yang terbiasa menjalankan PostScript di NeWS
Untuk C #, alasannya hampir sama untuk berbicara. Perancang bahasa membuat sintaksis titik entri program tetap familier bagi programmer yang datang dari Jawa. Seperti yang dikatakan arsitek C #, Anders Hejlsberg ,
... pendekatan kami dengan C # hanyalah menawarkan alternatif ... ke pemrogram Java ...
Versi panjang
berkembang di atas dan didukung dengan referensi yang membosankan.
Terminator java Hasta la vista Baby!
VM Spec, 2.17.1 Memulai Mesin Virtual
... Cara di mana kelas awal ditentukan untuk mesin virtual Java berada di luar ruang lingkup spesifikasi ini, tetapi biasanya, di lingkungan host yang menggunakan baris perintah, untuk nama kelas yang sepenuhnya memenuhi syarat untuk ditentukan sebagai argumen baris perintah dan untuk argumen baris perintah selanjutnya yang akan digunakan sebagai string yang akan diberikan sebagai argumen ke metode utama. Misalnya, menggunakan Java 2 SDK Sun untuk Solaris, baris perintah
java Terminator Hasta la vista Baby!
akan memulai mesin virtual Java dengan menjalankan metode utama kelas Terminator
(kelas dalam paket yang tidak disebutkan namanya) dan memberikannya array yang berisi empat string "Hasta", "la", "vista", dan "Baby!" ...
... lihat juga: Lampiran: Saya membutuhkan pakaian, sepatu bot, dan sepeda motor Anda
- Interpretasi saya:
eksekusi ditargetkan untuk digunakan seperti skrip pada antarmuka baris perintah.
sidestep penting
... yang membantu menghindari beberapa jejak palsu dalam penyelidikan kami.
VM Spec, 1.2 Mesin Virtual Java
Mesin virtual Java tidak tahu apa-apa tentang bahasa pemrograman Java ...
Saya perhatikan di atas ketika mempelajari bab sebelumnya - 1.1 Sejarah yang saya pikir bisa membantu (tetapi ternyata tidak berguna).
- Interpretasi saya:
eksekusi diatur oleh VM spec saja, yang
secara eksplisit menyatakan bahwa itu tidak ada hubungannya dengan bahasa Java
=> OK untuk mengabaikan JLS dan apa pun yang terkait dengan bahasa Jawa sama sekali
Gosling: kompromi antara bahasa C dan scripting ...
Berdasarkan hal di atas, saya mulai mencari web untuk sejarah JVM . Tidak membantu, terlalu banyak sampah dalam hasil.
Kemudian, saya teringat legenda tentang Gosling dan mempersempit pencarian saya ke sejarah Jling Gosling .
Eureka! Bagaimana Spesifikasi JVM Datang
Dalam keynote ini dari JVM Languages Summit 2008, James Gosling membahas ... penciptaan Java, ... kompromi antara C dan bahasa scripting ...
- Interpretasi saya:
pernyataan eksplisit bahwa pada saat penciptaan,
C dan skrip dianggap sebagai pengaruh yang paling penting.
Sudah terlihat anggukan pada skrip di VM Spec 2.17.1,
argumen baris perintah cukup menjelaskan String[] args
tetapi static
dan main
belum ada di sana, perlu menggali lebih lanjut ...
Catatan saat mengetik ini - menghubungkan C, scripting dan VM Spec 1.2 dengan tidak ada-nya-Jawa - Saya merasa seperti sesuatu yang akrab, sesuatu ... berorientasi objek perlahan berlalu. Pegang tanganku dan terus bergerak. Jangan memperlambat, kita hampir sampai
Slide utama tersedia secara online: 20_Gosling_keynote.pdf , cukup nyaman untuk menyalin poin utama.
halaman 3
Prasejarah Jawa
* Apa yang membentuk pemikiran saya
halaman 9
Berita
* Networked Extensible Window System
* Sistem jendela berdasarkan scripting ....
PostScript (!!)
halaman 16
Sasaran Besar (namun hening):
Seberapa dekat saya bisa dengan a
"scripting" merasa ...
halaman 19
Konsep aslinya
* Apakah semua tentang bangunan
jaringan benda,
diatur oleh skrip
bahasa
* (Unix shells, AppleScript, ...)
halaman 20
A Wolf in Sheeps Clothing
* Sintaks C untuk membuat pengembang
nyaman
A-ha! Mari kita lihat lebih dekat pada sintaks C .
Contoh "halo, dunia" ...
main()
{
printf("hello, world\n");
}
... fungsi bernama utama sedang didefinisikan. Fungsi utama melayani tujuan khusus dalam program C; lingkungan run-time memanggil fungsi utama untuk memulai eksekusi program.
... Fungsi utama sebenarnya memiliki dua argumen, int argc
dan char *argv[]
, masing-masing, yang dapat digunakan untuk menangani argumen baris perintah ...
Apakah kita semakin dekat? kamu bertaruh. Juga patut mengikuti tautan "utama" dari kutipan di atas:
fungsi utama adalah di mana program memulai eksekusi. Ini bertanggung jawab untuk organisasi tingkat tinggi dari fungsionalitas program, dan biasanya memiliki akses ke argumen perintah yang diberikan kepada program ketika dieksekusi.
- Interpretasi saya:
Agar nyaman bagi pengembang C, titik masuk program harus main
.
Juga, karena Java membutuhkan metode apapun untuk berada di kelas, Class.main
adalah
sedekat karena mendapat: doa statis, hanya nama kelas dan dot,
tidak ada konstruktor menyenangkan - C tahu apa-apa seperti itu.
Ini juga transitif berlaku untuk C #, dengan mempertimbangkan
gagasan migrasi mudah untuk itu dari Jawa.
Pembaca yang berpikir bahwa titik masuk program yang familier tidak masalah diundang dengan ramah untuk mencari dan memeriksa pertanyaan Stack Overflow di mana orang-orang yang berasal dari Java SE mencoba menulis Hello World untuk Java ME MIDP. Catatan MIDP entry point tidak memiliki main
atau tidak static
.
Kesimpulan
Berdasarkan di atas saya akan mengatakan itu static
, main
dan String[] args
pada saat Jawa dan C # pilihan yang paling masuk akal untuk menentukan titik masuk program .
Lampiran: Saya membutuhkan pakaian, sepatu bot, dan sepeda motor Anda
Harus mengakui, membaca VM Spec 2.17.1 sangat menyenangkan.
... baris perintah
java Terminator Hasta la vista Baby!
akan memulai mesin virtual Java dengan memanggil metode utama kelas Terminator
(kelas dalam paket yang tidak disebutkan namanya) dan memberikannya array yang berisi empat string "Hasta", "la", "vista", dan "Baby!".
Kami sekarang menguraikan langkah-langkah yang mungkin dilakukan oleh mesin virtual Terminator
, sebagai contoh proses pemuatan, penautan, dan inisialisasi yang dijelaskan lebih lanjut di bagian selanjutnya.
Upaya awal ... menemukan bahwa kelas Terminator
tidak dimuat ...
Setelah Terminator
dimuat, harus diinisialisasi sebelum main dapat dipanggil, dan suatu tipe (kelas atau antarmuka) harus selalu dihubungkan sebelum diinisialisasi. Menautkan (§2.17.3) melibatkan verifikasi, persiapan, dan (opsional) resolusi ...
Verifikasi (§2.17.3) memeriksa bahwa representasi yang dimuat Terminator
terbentuk dengan baik ...
Resolusi (§2.17.3) adalah proses memeriksa referensi simbolis dari kelas Terminator
...
Referensi simbolis dari Terminator
oh yeah.