3 poin oleh GN⁺ 2024-10-16 | 1 komentar | Bagikan ke WhatsApp
  • 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, dan constexpr tercakup 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
  • 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
  • Konsep baru lain dalam C23 juga disertakan
    • Konstanta nullptr dan tipe dasarnya
    • Anotasi sintaks melalui attributes
    • Alat pemrograman generik berbasis tipe, termasuk auto dan typeof
    • Inisialisasi default {} yang juga berlaku untuk array panjang variabel
    • constexpr untuk konstanta bernama dari semua tipe
  • 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

1 komentar

 
GN⁺ 2024-10-16
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

    • Arm itu bi-endian dan masih hidup di sebagian besar ponsel
      Seperti komentar teratas lainnya, kata modern tidak selalu berarti populer atau digunakan luas
    • POWER itu bi-endian. Linux on POWER modern adalah little-endian, dan dulu Linux on POWER big-endian umum, tetapi beberapa tahun lalu distro-distro beralih. Sebaliknya, AIX dan IBM i adalah big-endian
      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
    • MIPS masih cukup hidup di perangkat keras jaringan konsumen
    • Dalam satu sisi, bisa juga dibilang semua prosesor umum memakainya. Karena network byte order adalah big-endian
    • Bukankah Sparc itu big-endian?
  • 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

    • Salah satu keuntungan menulis kode C adalah tidak perlu terlibat dalam perdebatan melelahkan tentang seperti apa kode idiomatik seharusnya, atau subset bahasa mana yang tepat
      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++
    • Pada akhirnya akan diadopsi, seperti dulu C11, ekstensi GNU, dan fitur-fitur individual yang sekarang masuk C23. Misalnya notasi biner 0b banyak digunakan di dunia mikrokontroler
      Toolchain mikrokontroler umumnya dibangun di atas GCC, jadi fiturnya didapat gratis. Memang selalu ada compiler C proprietari yang tertinggal, tetapi tidak sepenting 20 tahun lalu
    • Fitur-fitur seperti ini pada akhirnya akan mengalir ke arus utama. Mirip seperti yang sedang terjadi pada C11 sekarang
      Jika Anda tidak menargetkan embedded atau himpunan arsitektur yang sangat luas, tidak ada alasan untuk tidak memakai C23 mulai hari ini
    • Specifier thread_local sudah dipakai di beberapa platform mikrokontroler, tetapi sebelum C11 itu sepenuhnya ilegal. Meski begitu, ia sangat menyederhanakan manajemen memori di lingkungan thread
      Apakah ada alasan harus masuk ke dunia C++ hanya untuk itu?
    • Jika targetnya didukung LLVM/GCC, bukankah versi C baru juga otomatis didapat? Hanya saja, pada toolchain GCC tua yang dimodifikasi vendor untuk arsitektur lain, kemungkinan tidak akan mendapatkannya
  • Secara pribadi, hal-hal seperti guard, defer, auto, constexpr, nullptr membuat 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 _Bool yang untungnya sekarang menjadi bool. constexpr dan nullptr terlalu beraroma C++. Meski begitu, Modern C adalah buku yang bagus, dan selama ini berguna untuk penggunaan C99 yang akan terus saya pertahankan

    • Pertanyaan tentang apa masalahnya dengan NULL terjawab jika membaca dokumen terkait, berkat salah satu dari sedikit kelebihan standardisasi ISO: https://wg21.link/p2312
      Ringkasnya, ketika argumen NULL diteruskan ke makro type-generic, bisa muncul hasil yang mengejutkan, dan status ekspresi kondisional seperti (1 ? 0 : NULL) dan (1 ? 1 : NULL) bergantung pada bagaimana NULL didefinisikan. Selain itu, meneruskan NULL ke fungsi variadic yang mengharapkan pointer bisa berakibat serius. Pada banyak arsitektur saat ini, ukuran int dan void* berbeda, jadi jika NULL hanyalah 0, argumen dengan ukuran yang salah akan diteruskan ke fungsi
    • Saya rasa kompleksitas tidak bertambah secara linear. Justru sering kali alat yang lebih kompleks membuat proses dan hasil akhir menjadi lebih sederhana
      Mirip 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 kompleks
      std::sort dan qsort juga sama. Dengan kekuatan template dan function object, implementasinya lebih sederhana dan cepat. Tidak perlu meneruskan void * 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 implementasi
    • auto terutama 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 dihindari
      Sayangnya ada sedikit perbedaan antar-compiler. Seingat saya, Clang mengimplementasikan auto ala C++, sedangkan GCC mengimplementasikan auto ala C, sehingga ada perbedaan halus pada pointer auto. Saya tidak tahu apakah perbedaan itu sekarang sudah diperbaiki
      _BitInt(N) biasanya tidak dipakai langsung, melainkan di-typedef sesuai lebar yang dibutuhkan. Misalnya typedef _BitInt(2) u2;. Sintaks jelek seperti _B diperlukan 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 _Bool juga karena alasan yang sama. Setahu saya, defer sebenarnya tidak masuk ke C23
  • Definisi lama bahkan tidak menentukan apakah NULL itu 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 pointer
    constexpr dan nullptr mungkin terasa berbau C++ karena kemungkinan diimpor balik dari C++. Meski begitu, NULL tetap bisa dipakai, dan sekilas tampaknya didefinisikan ulang sebagai nullptr

    • Kode ini punya bug, dan di beberapa arsitektur bisa saja crash: execlp("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-...

    • Saya suka Modern C dan melihatnya dinilai baik di banyak tempat. Saya setuju bahwa itu tingkat menengah
      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
    • Fluent C: Principles, Practices and Patterns karya Christopher Preschern juga layak dilihat
    • Daftar ini tidak lengkap. Misalnya, Effective C tidak ada: https://nostarch.com/effective-c-2nd-edition
      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

    • Saya sudah lama memakai C++, dan sama sekali tidak berniat meninggalkan destructor demi pindah ke C
      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

    • Di PDF reader zathura, saya menguji beberapa tautan di daftar isi dan semuanya berfungsi dengan baik
    • Daftar isi saat ini jelas rusak
  • 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

    • C99 masih tergolong baru. Microsoft mencoba membunuh C dengan menolak mengimplementasikan apa pun selain yang juga ada di C++. Implementasi C99 di MSVC terlambat 16 tahun, dan hanya mengimplementasikan bagian minimum. Implementasi C11 juga terlambat 11 tahun
      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
    • Microsoft pada dasarnya menghambat C99 dengan hampir tidak mengimplementasikan fitur C99 di compiler C Visual Studio sampai sekitar 2015. Lalu baru pada 2019 mereka mengakui kegagalan itu dan mulai lagi mendukung versi C yang lebih baru. Front-end C MSVC masih tertinggal secara stabil dibanding Clang dan GCC
      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