Dalam banyak bahasa seperti C, C ++, dan Java, main
metode / fungsi memiliki tipe pengembalian void
atau int
, tetapi tidak double
atau String
. Apa yang mungkin menjadi alasan di balik itu?
Saya tahu sedikit bahwa kita tidak bisa melakukan itu karena main
dipanggil oleh runtime library dan mengharapkan beberapa sintaks seperti int main()
atau int main(int,char**)
jadi kita harus tetap berpegang pada itu.
Jadi pertanyaan saya adalah: mengapa main
memiliki jenis tanda tangan yang dimilikinya, dan bukan yang berbeda?
Jawaban:
Nilai pengembalian
main
harus diteruskan ke sistem operasi ( sistem operasi apa pun ) dengan cara tunggal yang konsisten. Informasi yang perlu diketahui sistem operasi adalah "apakah program berhasil dihentikan, atau ada kesalahan?"Jika ini adalah string, responsnya menjadi sulit dalam berbagai bahasa. Internal dari string Pascal (byte pertama adalah panjang) dan string FORTRAN (tetap, diisi beberapa nilai) dan string C (null dihentikan) semuanya berbeda. Ini akan membuat pengembalian nilai yang konsisten ke sistem operasi menjadi menantang. Dengan asumsi bahwa ini diselesaikan, apa yang akan Anda lakukan untuk menjawab pertanyaan OS dari program ini? Perbandingan string penuh dengan kesalahan ("sukses" vs "Sukses"), dan sementara kesalahan mungkin lebih bermanfaat bagi manusia, lebih sulit bagi sistem operasi atau program lain (shell) untuk mengatasinya. Ada juga perbedaan yang signifikan bahkan dalam string sendiri - EBCDIC (dengan semua halaman kode-nya) vs ASCII.
Mengapung dan ganda tidak memberikan nilai tambahan di atas bilangan bulat untuk mengkomunikasikan kembali data ke OS (dan shell). Sebagian besar, tidak satu pun dari bagian komputer ini yang berurusan dengan angka floating point. Ganda juga tidak terhitung membuat perbandingan sulit. Tidak dapat dihitung, mereka membuat melaporkan kesalahan itu (dengan asumsi Anda telah memilih nilai tertentu untuk sukses). Sekali lagi, floating point tidak konsisten - float pada mesin 8 bit berbeda dari float pada 16 bit dan mesin 32 bit (dan itu hanya yang 'normal' - bahkan di dalam IBM, floating point tidak distandarisasi antara mesin oleh produsen yang sama hingga 1980-an). Dan kemudian Anda punya komputer desimal vs. biner. Nilai floating point tidak konsisten dan tidak memberikan data yang berarti kembali.
Itu benar-benar membuat kita dengan byte dan integer sebagai opsi. Konvensi yang didirikan adalah '0' sukses, dan yang lainnya adalah kesalahan. Integer memberi lebih banyak ruang daripada byte untuk melaporkan kesalahan. Dapat dihitung (pengembalian 1 berarti XYZ, pengembalian 2 berarti ABC, pengembalian 3, berarti DEF, dll.) Atau digunakan sebagai tanda (
0x0001
berarti gagal,0x0002
berarti gagal,0x0003
berarti ini dan gagal). Membatasi ini hanya byte dapat dengan mudah kehabisan flag (hanya 8), jadi keputusan itu mungkin menggunakan integer.sumber
main()
dipanggil berbagai cara pada sistem operasi yang berbeda. Dalam C, bagaimana metode main () awalnya disebut? masuk ke ini.main
- tidak seperti fungsi lain dalam program apa pun - bukan bagian dari protokol yang ditentukan oleh programmer, tetapi protokol yang digunakan untuk berinteraksi dengan host (OS). Anda tidak bisa mengambilnya karena itu bukan milik Anda untuk memilih. Pada tingkat yang lebih pragmatis, UNIX mengharapkan int untuk dikembalikan oleh suatu proses, sehingga protokol C-to-UNIX melakukan hal itu. Argumen analog dapat dibuat untuk argumen-passing: jika C telah ditemukan untuk OS / host yang hanya melewati angka sebagai argumen (mis. Tidak ada baris perintah), argumen akan menjadi int bukan string.Ya, bisa .
Misalnya, dalam dialek C yang digunakan dalam sistem operasi Plan 9
main
biasanya dinyatakan sebagaivoid
fungsi, tetapi status keluar dikembalikan ke lingkungan pemanggilan dengan melewatkan penunjuk string keexits()
fungsi. String kosong menunjukkan keberhasilan, dan string tidak kosong menunjukkan beberapa jenis kegagalan. Ini bisa diterapkan denganmain
mengembalikanchar*
hasil.Dan tentu saja mungkin untuk mengimplementasikan sistem dengan status
float
ataudouble
keluar.Jadi mengapa
int
? Ini hanya masalah konvensi - dan ada nilai yang luar biasa dalam memiliki sistem operasi dan program yang berjalan di bawah mereka mematuhi konvensi umum.Konvensi Unix adalah menggunakan kode status integer, dengan 0 menunjukkan keberhasilan dan kegagalan bukan-nol (karena biasanya hanya ada satu cara untuk berhasil, tetapi banyak cara untuk gagal). Saya tidak tahu apakah konvensi itu berasal dari Unix; Saya menduga itu berasal dari sistem operasi sebelumnya.
Floating-point akan menjadi konvensi yang lebih sulit, karena (a) dukungan floating-point tidak universal, (b) lebih sulit untuk mendefinisikan pemetaan antara nilai-nilai floating-point dan kondisi kesalahan, (c) sistem yang berbeda menggunakan floating-point yang berbeda. representasi titik, dan (d) bayangkan kesenangan melacak kesalahan pembulatan dalam status keluar program Anda. Integer, di sisi lain, cocok untuk menghitung kode kesalahan.
Plan 9, seperti yang saya sebutkan, menggunakan string, tetapi memaksakan beberapa kompleksitas untuk manajemen memori, pengkodean karakter, dll. Sejauh yang saya tahu, ide baru ketika Plan 9 mengimplementasikannya, dan itu tidak menggantikan yang sudah ada konvensi yang luas.
(Kebetulan, di C ++ hanya
main
bisa kembali , dan di C hanya diizinkan jika kompiler secara khusus mendukungnya. Banyak kompiler tidak mengeluh dengan sangat keras jika Anda menulis , tetapi hanya sedikit berlebihan untuk mengatakan bahwa itu salah .)int
void main
void main
sumber
Nilai yang dikembalikan oleh metode utama adalah "kode keluar". Ini digunakan oleh aplikasi pemanggil (biasanya bash) untuk menguji apakah program berakhir seperti yang diharapkan. Mengembalikan integer adalah cara termudah untuk melakukannya di level OS. Double tidak masuk akal untuk kode kesalahan dan String sulit dipertahankan di level OS (tidak ada GC).
sumber
utama harus mengembalikan status program yang dijalankan. Apakah program itu berhasil dijalankan (mengembalikan 0 yang EXIT_SUCCESS) atau tidak (mengembalikan 1 berarti EXIT_FAILURE) angka bukan nol menyampaikan arti yang sama tetapi nol menunjukkan tidak ada kesalahan atau eksekusi berhasil ..
sumber