Modern C Edisi C23
(gustedt.wordpress.com)- Edisi revisi Modern C yang disesuaikan dengan standar C baru telah dirilis untuk diunduh gratis, sehingga materi belajar dan referensi bahasa C dapat dilihat kembali berdasarkan C23
- Fokus revisi ini adalah penerapan C23, dengan penekanan pada membantu transisi ke standar baru selaras dengan prosedur dan jadwal publikasi ISO
- Rilis baru compiler utama sudah mengimplementasikan sebagian besar fitur C23, sehingga perubahan dalam buku ini tidak sekadar pengenalan eksperimental, tetapi terhubung dengan lingkungan penggunaan nyata
- Perubahan bahasa dan library seperti
_BitInt(N),nullptr,auto,typeof, danconstexprtercakup secara luas, sehingga turut memengaruhi cara penulisan kode C yang sudah ada - Lampiran untuk transisi dan header include sementara ditambahkan agar bisa langsung dicoba di platform yang ada, tetapi MEAP dari Manning masih berlangsung
Materi gratis dan dokumen standar
- Modern C Edisi C23 dapat diunduh secara gratis
- Materi terkait juga dapat ditemukan di halaman khusus buku ini
- Halaman khusus: https://gustedt.gitlabpages.inria.fr/modern-c/
- Tautan unduhan contoh kode yang disertakan bersama buku juga ada di halaman ini
- Edisi revisi ini memperbaiki berbagai penjelasan, tetapi tujuan utamanya adalah mencerminkan standar C baru, C23
- Di antara dokumen yang dapat diakses publik, materi yang paling mendekati isi standar baru adalah PDF N3220
- Rilis baru dari compiler utama sudah mengimplementasikan sebagian besar fitur baru yang dibawa C23
Perubahan bahasa C23 dan dukungan transisi
- Perubahan terkait integer menjadi bagian yang besar
- Penambahan tipe presisi bit baru
_BitInt(N) - Penambahan header C library baru untuk aritmetika dengan pengecekan overflow dan manipulasi bit
- Mencerminkan kemungkinan tipe 128-bit pada arsitektur modern
- Termasuk peningkatan substansial pada tipe enum
- Penambahan tipe presisi bit baru
- Konsep baru lain dalam C23 juga disertakan
- Konstanta
nullptrdan tipe dasarnya - Anotasi sintaks melalui attributes
- Alat pemrograman generik berbasis tipe, termasuk
autodantypeof - Inisialisasi default
{}yang juga berlaku untuk array panjang variabel constexpruntuk konstanta bernama dari semua tipe
- Konstanta
- Materi baru ini juga membahas ekspresi majemuk, lambda, “internasionalisasi”, hingga pendekatan komprehensif terhadap kegagalan program
- Lampiran dan header include sementara ditambahkan agar C23 bisa langsung mulai digunakan di platform yang ada
- MEAP untuk edisi baru dari Manning masih terbuka
- MEAP: https://www.manning.com/books/modern-c-third-edition
- Waktu publikasi final Edisi C23 versi Manning belum diketahui
1 komentar
Pendapat di Hacker News
Berbeda dengan urutan penyimpanan di mesin saya, yaitu little-endian, cara yang menaruh representasi digit bernilai lebih tinggi terlebih dahulu disebut big-endian. Namun mengatakan keduanya umum dipakai di prosesor modern terasa agak berlebihan, karena selain s390x hampir tidak ada yang tersisa
Sepertinya sebentar lagi akan muncul komentar tentang arsitektur big-endian niche/usang favorit semua orang
Seperti komentar teratas lainnya, kata modern tidak selalu berarti populer atau digunakan luas
AIX dan IBM i mungkin tidak seaktif mainframe IBM, tetapi AIX bisa dibilang lebih hidup daripada Solaris atau HP/UX, apalagi jika dibandingkan dengan banyak Unix komersial lama. IBM i juga masih bertahan tipis, tetapi jauh lebih hidup dibanding platform midrange legacy pesaing seperti HP MPE yang dukungan vendornya sudah resmi berakhir
Aspek terpenting C adalah portabilitas. Intinya adalah bisa berjalan dari mikrokontroler kecil hingga hampir semua platform komputasi, tetapi saya ragu versi C baru akan diadopsi sejauh itu
Jika ingin memakai yang paling mutakhir, saya rasa saya akan memilih C++2x atau Rust daripada C. Apakah saya melewatkan sesuatu? Saya penasaran apa keuntungan yang diberikan oleh apa yang disebut C modern ini
Untuk yang mutakhir, saya merekomendasikan Zig. Kompleksitas bahasanya jauh lebih rendah daripada C++ modern dan Rust. Efek samping bagus C23 yang tidak terlalu mencolok adalah sintaks seperti
... = {}dan{0}dibuat lebih selaras dengan C++, sehingga para pemelihara pustaka C tidak terlalu repot mendukung orang yang ingin membangun kode C dengan compiler C++0bbanyak digunakan di dunia mikrokontrolerToolchain mikrokontroler umumnya dibangun di atas GCC, jadi fiturnya didapat gratis. Memang selalu ada compiler C proprietari yang tertinggal, tetapi tidak sepenting 20 tahun lalu
Jika Anda tidak menargetkan embedded atau himpunan arsitektur yang sangat luas, tidak ada alasan untuk tidak memakai C23 mulai hari ini
thread_localsudah dipakai di beberapa platform mikrokontroler, tetapi sebelum C11 itu sepenuhnya ilegal. Meski begitu, ia sangat menyederhanakan manajemen memori di lingkungan threadApakah ada alasan harus masuk ke dunia C++ hanya untuk itu?
Secara pribadi, hal-hal seperti
guard,defer,auto,constexpr,nullptrmembuat C jauh lebih kompleks. Saya memilih C karena butuh kesederhanaan; kalau menginginkan kompleksitas, biasanya saya akan memilih C++ meski sebenarnya tidak ingin, atau sekalian Go, atau Elixir kalau untuk server_BitInt(N)juga jelek, dan mengingatkan pada_Boolyang untungnya sekarang menjadibool.constexprdannullptrterlalu beraroma C++. Meski begitu, Modern C adalah buku yang bagus, dan selama ini berguna untuk penggunaan C99 yang akan terus saya pertahankanNULLterjawab jika membaca dokumen terkait, berkat salah satu dari sedikit kelebihan standardisasi ISO: https://wg21.link/p2312Ringkasnya, ketika argumen
NULLditeruskan ke makro type-generic, bisa muncul hasil yang mengejutkan, dan status ekspresi kondisional seperti(1 ? 0 : NULL)dan(1 ? 1 : NULL)bergantung pada bagaimanaNULLdidefinisikan. Selain itu, meneruskanNULLke fungsi variadic yang mengharapkan pointer bisa berakibat serius. Pada banyak arsitektur saat ini, ukuranintdanvoid*berbeda, jadi jikaNULLhanyalah0, argumen dengan ukuran yang salah akan diteruskan ke fungsiMirip dengan membangun rumah. Palu dan obeng sangat sederhana, sedangkan crane sangat kompleks, tetapi yang membuat pembangunan rumah menjadi sederhana adalah crane. Jika harus membangun rumah hanya dengan palu dan obeng, Anda harus merancang prosedur yang luar biasa rumit
Bahasa pemrograman juga demikian. Membuat container generik di C++ itu sepele, tetapi di C sangat sulit. Bisa saja ditiru sampai batas tertentu dengan
void *dan casting manual, tetapi itu merepotkan, rawan kesalahan, dan membuat kode lebih kompleksstd::sortdanqsortjuga sama. Dengan kekuatan template dan function object, implementasinya lebih sederhana dan cepat. Tidak perlu meneruskanvoid *lalu melakukan dereference saat runtime, dan perbandingan bisa dimasukkan ke definisi fungsi itu sendiri. Tidak ada indirect call, tidak ada passing lewat stack, bahkan fungsi pembanding bisa di-inline. Kompleksitas bahasa tidak berarti kompleksitas implementasiautoterutama berguna saat menangani makro type-generic, tetapi sebaiknya tidak dipakai dalam kode biasa. Semoga kegilaan seperti almost always auto yang sempat populer di dunia C++ dapat dihindariSayangnya ada sedikit perbedaan antar-compiler. Seingat saya, Clang mengimplementasikan
autoala C++, sedangkan GCC mengimplementasikanautoala C, sehingga ada perbedaan halus pada pointerauto. Saya tidak tahu apakah perbedaan itu sekarang sudah diperbaiki_BitInt(N)biasanya tidak dipakai langsung, melainkan di-typedefsesuai lebar yang dibutuhkan. Misalnyatypedef _BitInt(2) u2;. Sintaks jelek seperti_Bdiperlukan karena kombinasi garis bawah diikuti huruf besar dicadangkan dalam standar C, agar saat menambahkan fitur kecil ke bahasa tidak berbenturan dengan kode yang sudah ada. Nama_Booljuga karena alasan yang sama. Setahu saya,defersebenarnya tidak masuk ke C23Definisi lama bahkan tidak menentukan apakah
NULLitu pointer atau integer. Jadi pada platform yang tidak mengikuti persyaratan Posix((void*)0), ini menjadi jebakan di bawah kaki yang bukan bertipe pointer maupun berukuran seperti pointerconstexprdannullptrmungkin terasa berbau C++ karena kemungkinan diimpor balik dari C++. Meski begitu,NULLtetap bisa dipakai, dan sekilas tampaknya didefinisikan ulang sebagainullptrexeclp("echo", "echo", "Hello, world!", NULL);Kode ini tidak punya bug tersebut:
execlp("echo", "echo", "Hello, world!", nullptr);Ini juga tidak masalah:
execlp("echo", "echo", "Hello, world!", (char *)NULL);Tadinya ingin bertanya apakah ada daftar buku C yang bagus, lalu menemukan jawabannya sendiri. Di sini Modern C diklasifikasikan sebagai tingkat menengah
https://stackoverflow.com/questions/562303/the-definitive-c-...
Sebagai pendamping C modern untuk K&R, menurut saya 21st Century C karya Ben Klemens dan C Programming: A Modern Approach karya King adalah alternatif yang lebih mudah didekati
Secara pribadi saya lebih suka Effective C daripada Modern C. Modern C sangat ketat sehingga rasanya seperti membaca spesifikasi bahasa beranotasi yang mungkin diperlukan bagi para ahli, tetapi bagi orang seperti saya yang memakai C secara ringan, membacanya terasa membosankan
Beberapa ekstensi High C dari Metaware cukup saya sukai
https://news.ycombinator.com/item?id=41647843
https://news.ycombinator.com/item?id=38938402
Selama lebih dari setahun terakhir saya memakai C++ modern untuk proyek pribadi berupa interpreter bahasa, tetapi karena beban mental C++ dan masalah tooling, saya terus berpikir untuk beralih ke C. IntelliSense Visual Studio masih hampir tidak berfungsi saat memakai modul C++20, dan karena kegagalan bahasanya, terlalu banyak hal terdorong ke antarmuka sehingga waktu kompilasi juga menjadi buruk rupa
Sebaliknya, saya sudah terlalu terbiasa dengan class, member function, pemrograman generik, dan namespace, jadi mungkin saya sudah terlanjur terjerat
Untuk kebutuhan itu, pernah mempertimbangkan C#? Visual Studio jauh lebih cocok dengan C#
Di macOS Preview, mengklik tautan daftar isi di sidebar tidak berfungsi dengan benar
Baru beberapa tahun ini saya bisa percaya bahwa semua compiler C mendukung C99 pada library yang saya pelihara: https://github.com/eyalroz/printf
Namun setelah beberapa tahun, seperti biasa, ada issue yang dibuka meminta kompatibilitas C89 karena suatu toolchain embedded kuno. Jadi C23 memang bagus, tetapi rasanya mari kita bicarakan lagi sekitar 20 tahun lagi
Adakah yang bisa menautkan tulisan yang secara praktis menjelaskan mengapa C pada dasarnya berhenti di C99? Hampir tidak ada proyek yang layak dibicarakan yang memanfaatkan fitur setelah C11
Karena C pada dasarnya membeku selama puluhan tahun, basis penggunanya tampaknya juga terseleksi sendiri menjadi orang-orang yang menyukai C apa adanya dan tidak keberatan mendukung compiler rongsokan kuno. Mereka yang kehilangan kesabaran atau menginginkan bahasa abad ke-21 sudah pindah ke C++/Rust/Zig dan lainnya
Sekitar 2010, MSVC masih sangat penting, yang terdengar aneh dari sudut pandang sekarang ketika kebanyakan developer tampaknya sudah pindah ke Linux. Di sisi lain, tidak banyak proyek yang benar-benar membutuhkan fitur C11. C11 juga mengambil VLA dari C99, tetapi itu bukan kehilangan yang terlalu disayangkan. C23 mungkin menjadi versi pertama sejak C99 yang benar-benar layak di-upgrade oleh banyak codebase C