Ada beberapa orang yang sangat berpengalaman di Stack Overflow yang selalu berbicara tentang standar C. Orang-orang tampaknya tidak menyukai solusi non-portabel, bahkan jika mereka bekerja untuk saya. Ok, saya mengerti bahwa standar perlu diikuti, tetapi tidakkah hal itu menghambat kreativitas programmer?
Apa manfaat konkret yang berasal dari mengikuti standar? Terutama karena penyusun dapat menerapkan standar sedikit berbeda.
programming-languages
c
standards
0decimal0
sumber
sumber
Jawaban:
Ada beberapa alasan mengapa berpegang teguh pada standar adalah hal yang baik.
Terkunci dalam kompiler sangat menyebalkan. Anda sepenuhnya berada di bawah kekuasaan sekelompok pengembang dengan agenda mereka sendiri. Mereka jelas tidak keluar untuk mendapatkan Anda atau apa pun, tetapi jika kompiler Anda mulai tertinggal pada optimasi, fitur baru, perbaikan keamanan dll, terlalu buruk; Anda terjebak. Dalam kasus-kasus ekstrem, beberapa perusahaan harus mulai menambal alat apa pun yang telah mereka andalkan. Ini sangat membuang-buang uang dan waktu ketika ada alat kerja lain di luar sana.
Terkunci ke dalam platform lebih sulit. Jika Anda mendorong perangkat lunak di Linux dan ingin beralih ke Windows karena Anda menyadari pasar Anda benar-benar ada, Anda akan bersenang-senang mengubah setiap peretasan non-portabel yang Anda miliki dalam kode Anda untuk bermain bagus dengan GCC dan MSVC. Jika Anda memiliki beberapa desain inti yang didasarkan pada sesuatu seperti itu, semoga berhasil!
Perubahan yang tidak kompatibel mundur menyebalkan yang paling sulit. Standar tidak akan pernah memecahkan kode Anda (Abaikan python). Beberapa penulis kompiler acak mungkin memutuskan bahwa benar-benar tambahan khusus implementasi ini tidak sepadan dengan masalah dan menjatuhkannya. Jika Anda mengandalkannya, maka Anda terjebak pada versi lama apa pun yang terakhir digunakan.
Jadi pesan utama di sini, berpegang teguh pada standar membuat Anda lebih fleksibel . Anda memiliki bahasa yang lebih terbatas, tetapi Anda memiliki lebih banyak
Ini keseimbangan yang halus, tetapi mengabaikan standar sama sekali merupakan kesalahan. Saya cenderung mengatur kode C saya untuk mengandalkan abstraksi yang dapat diimplementasikan dengan cara yang tidak portabel, tetapi saya bisa porting secara transparan tanpa mengubah semua yang bergantung pada abstraksi.
sumber
Standar adalah semacam "kontrak" antara Anda dan kompiler Anda yang mendefinisikan arti dari program Anda. Sebagai programmer, kita sering memiliki model mental tertentu tentang bagaimana bahasa bekerja, dan model mental ini sering bertentangan dengan standar. (Sebagai contoh, programmer C sering menganggap pointer sebagai kira-kira "integer yang menunjukkan alamat memori", dan oleh karena itu menganggap bahwa aman untuk melakukan aritmatika / konversi / manipulasi pada pointer yang mungkin dilakukan dengan integer yang menunjukkan memori address. Asumsi ini tidak sesuai dengan standar; itu sebenarnya memberlakukan batasan yang sangat ketat pada apa yang dapat Anda lakukan dengan pointer.)
Jadi, apa keuntungan mengikuti standar, daripada model mental Anda sendiri?
Sederhananya, standarnya benar, dan model mental Anda sendiri salah. Model mental Anda biasanya adalah pandangan yang disederhanakan tentang bagaimana segala sesuatu bekerja pada sistem Anda sendiri, dalam kasus umum, dengan semua optimisasi kompiler dinonaktifkan; vendor compiler umumnya tidak berupaya untuk menyesuaikan diri dengannya, terutama ketika menyangkut optimasi. (Jika Anda tidak memegang akhir kontrak Anda, Anda tidak dapat mengharapkan perilaku spesifik dari kompiler: sampah masuk, sampah keluar.)
Mungkin lebih baik untuk mengatakan, "bahkan jika mereka tampaknya bekerja untuk saya". Kecuali jika kompiler Anda secara khusus mendokumentasikan bahwa perilaku yang diberikan akan berfungsi (yaitu: kecuali jika Anda menggunakan standar yang diperkaya, yang terdiri dari dokumentasi yang tepat ditambah kompiler), Anda tidak tahu itu benar-benar berfungsi, atau bahwa itu benar-benar dapat diandalkan. Sebagai contoh, integer overflow yang ditandatangani biasanya menghasilkan pembungkus pada banyak sistem (jadi,
INT_MAX+1
biasanyaINT_MIN
) - kecuali bahwa kompiler "tahu" bahwa aritmatika integer yang ditandatangani tidak pernah meluap dalam program C (benar), dan sering melakukan optimasi yang sangat mengejutkan berdasarkan ini " pengetahuan".sumber
-fwrapv
, dan kemudian Anda menggunakan bahasa yang sedikit berbeda, non-standar di mana aritmatika integer yang ditandatangani selalu ditutup.Tidak. Standar ini memberi tahu apa yang diizinkan untuk dilakukan. Jika tidak ditentukan, Anda berada di wilayah perilaku yang tidak ditentukan, dan kemudian semua taruhan dibatalkan - program bebas untuk melakukan apa pun.
Karena Anda menyebutkan contoh spesifik
void main()
vsint main()
, saya dapat meningkatkan jawaban saya.void main()
bukan deklarasi standar fungsi utama. Mungkin bekerja pada beberapa kompiler melalui ekstensi, tetapi bergantung pada implementasinya. Bahkan jika itu berhasil, Anda harus memeriksa apakah itu melakukan apa yang Anda inginkan. Masalahnya adalah, pengembang kompiler dapat memutuskan untuk menghapusvoid main()
dengan rilis kompiler berikutnya, merusak aplikasi Anda.Di sisi lain, standar dengan jelas mendefinisikan tanda tangan utama sebagai
int main()
dan memberitahu apa yang harus dilakukan.Di sisi lain, ada hal-hal yang tidak didefinisikan dalam standar. Kemudian, standar lain mungkin berlaku (seperti misalnya, POSIX). Contoh terbaik mungkin dengan implementasi thread di c ++ 03, karena c ++ 03 program standar 1-threaded. Dalam hal ini, Anda dipaksa untuk menggunakan pustaka yang tergantung platform, atau sesuatu seperti boost .
sumber
Jangan ikuti aturan JIKA proyek Anda tentang proyek khusus, misalnya proyek pemerintah atau tentara, tetapi Anda harus mengikuti aturan JIKA Anda berbicara tentang sumber terbuka atau proyek besar dengan tim yang didistribusikan.
sumber