Mengapa `main` tidak dapat mengembalikan double atau String daripada int atau void?


38

Dalam banyak bahasa seperti C, C ++, dan Java, mainmetode / fungsi memiliki tipe pengembalian voidatau int, tetapi tidak doubleatau String. Apa yang mungkin menjadi alasan di balik itu?

Saya tahu sedikit bahwa kita tidak bisa melakukan itu karena maindipanggil 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 mainmemiliki jenis tanda tangan yang dimilikinya, dan bukan yang berbeda?


19
Apa yang akan nilai kembali ganda berarti ? Apa yang akan nilai kembali string yang berarti ?

1
Saya mengerti bahwa itu tidak berarti apa-apa. Tetapi ada alasan dan konvensi lain?
JAVA

1
saya pikir itu tidak berarti apa-apa, hanya karena secara universal dipilih bahwa 0 untuk keluar normal dan bukan nol untuk abnormal.An int dipilih sebagai tipe data paling sederhana dengan kompatibilitas lintas bahasa yang luas. @ delnan
JAVA

@unny Dari apa yang saya dapat kumpulkan dari pengalaman saya dengan OS mirip Unix, 0 digunakan sebagai "keluar normal" (0 kesalahan) karena tidak ambigu bila dibandingkan dengan nilai integer lainnya. Karena sebagian besar (tidak semua) bahasa modern dirancang untuk serupa dengan (jika tidak dirancang di belakang) C, dan karena C digunakan untuk menulis Unix, saya akan mengatakan itu adalah keputusan historis oleh KnR.
Jamie Taylor

3
@unny "kompatibilitas lintas bahasa luas" tidak menjadi masalah. C dan UNIX ditulis bersama-sama. Alasan banyak bahasa lain mengembalikan int adalah karena mereka dirancang untuk bekerja di lingkungan seperti UNIX atau UNIX.

Jawaban:


88

Nilai pengembalian mainharus 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 ( 0x0001berarti gagal, 0x0002berarti gagal, 0x0003berarti ini dan gagal). Membatasi ini hanya byte dapat dengan mudah kehabisan flag (hanya 8), jadi keputusan itu mungkin menggunakan integer.


2
Saya pikir main dipanggil oleh c / c ++ runtime library sebelum os menyebutnya yang juga merupakan bagian dari kode yang dimuat bersama kode kita dan dipanggil oleh os @ MichaelT
JAVA

5
main()dipanggil berbagai cara pada sistem operasi yang berbeda. Dalam C, bagaimana metode main () awalnya disebut? masuk ke ini.

25
Saya pikir titik kunci untuk memahami adalah bahwa 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.
Euro Micelli

2
IBM mengambil konsep halaman kode dari EBCDIC ke PC mereka. Mereka masih menghantui kita hingga hari ini, berlangsung 35 tahun setelah IBM 5150 diperkenalkan. ASCII 7-bit tidak memiliki codepage, tetapi kode karakter 8-bit dapat ditafsirkan dengan berbagai cara bahkan pada satu komputer, tergantung pada pengaturan - - Apalagi codepages yang mengkodekan multi-byte encode. Jadi itu sebenarnya lebih buruk dari apa yang Anda singgung dalam kalimat terakhir dari paragraf kedua.
CVn

@EuroMicelli itu informasi yang sangat bagus sebenarnya terima kasih untuk itu :)
JAVA

29

Ya, bisa .

Misalnya, dalam dialek C yang digunakan dalam sistem operasi Plan 9main biasanya dinyatakan sebagai voidfungsi, tetapi status keluar dikembalikan ke lingkungan pemanggilan dengan melewatkan penunjuk string ke exits()fungsi. String kosong menunjukkan keberhasilan, dan string tidak kosong menunjukkan beberapa jenis kegagalan. Ini bisa diterapkan dengan mainmengembalikan char*hasil.

Dan tentu saja mungkin untuk mengimplementasikan sistem dengan status floatatau doublekeluar.

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 ++ hanyamain 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 .)intvoid mainvoid main


9

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).


3
Mengapa string harus dikumpulkan dari sampah sedangkan integer tidak?
Brad

4
@Brad, string memiliki panjang variabel untuk mereka dan pada dasarnya sama dengan melewatkan kembali array yang bisa menjadi satu karakter atau bisa ribuan. Memori dinamis akan menyusahkan sementara int adalah ukuran yang agak tetap yang tidak begitu sulit untuk ditangani.
JB King

-4

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 ..


1
ini tampaknya tidak menawarkan sesuatu yang substansial atas poin yang dibuat (dan jauh lebih baik dijelaskan) dalam jawaban sebelumnya yang diposting beberapa tahun lalu
Agas
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.