22 poin oleh GN⁺ 22 hari lalu | 6 komentar | Bagikan ke WhatsApp
  • C++26 resmi selesai secara teknis. Empat fitur inti yang disertakan adalah reflection, penguatan keamanan memori, Contracts, std::execution
  • Compile-time reflection adalah mesin abstraksi paling kuat dalam sejarah C++ sejak template diperkenalkan, memungkinkan bahasa mendeskripsikan dirinya sendiri dan menghasilkan kode
  • Dengan hanya melakukan recompilation kode C++ yang ada ke C++26, undefined behavior (UB) akibat variabel lokal yang belum diinisialisasi dapat dihapus, dan bounds safety dijamin melalui standard library yang diperkuat
  • Dari hasil deployment di Google, terukur adanya lebih dari 1.000 bug diperbaiki serta penurunan segfault sebesar 30% di lingkungan produksi
  • Diperkirakan adopsi cepat oleh implementasi compiler, karena GCC sudah menggabungkan reflection dan Contracts ke trunk

C++26 rampung: rilis terpenting sejak C++11

  • Pada rapat komite ISO C++ yang diadakan di Croydon, London, Inggris, pekerjaan teknis C++26 akhirnya selesai
    • Sekitar 210 peserta hadir (130 tatap muka, 80 jarak jauh via Zoom), dengan perwakilan resmi dari 24 negara
    • Sebagian besar rapat digunakan untuk menangani 411 komentar internasional (tahap CD) yang masuk pada musim panas
    • Fokusnya pada penyempurnaan akhir (fit-and-finish), tanpa penambahan atau penghapusan fitur baru
  • C++26 yang dirampungkan pada rapat ini kini memasuki tahap penyusunan dokumen final untuk pemungutan suara persetujuan internasional (DIS)

4 fitur inti C++26

(1) Reflection

  • Ini adalah upgrade terbesar dalam sejarah pengembangan C++ sejak penemuan template, berupa kemampuan bahasa untuk mendeskripsikan dirinya sendiri dan menghasilkan kode
  • Pada Juni 2025, komite C++ memasukkan compile-time reflection ke draf C++26, menandai titik balik dalam sejarah bahasa ini
  • Fitur ini diperkenalkan sebagai "mesin baru paling kuat untuk mengekspresikan abstraksi yang efisien, dan butuh 10 tahun ke depan untuk benar-benar menemukan apa saja yang bisa dilakukan roket ini"

(2) Penguatan keamanan memori

  • Dengan hanya melakukan recompilation, seluruh kategori UB karena pembacaan variabel lokal yang belum diinisialisasi pada kode C++ lama dihapus di C++26
  • Hardened Standard Library distandardisasi untuk menjamin bounds safety pada tipe utama seperti vector, span, string, dan string_view
    • Overhead performa terukur rata-rata hanya 0,3% (di bawah 1%)
    • Sudah dideploy pada ratusan juta baris kode di platform Apple dan layanan Google
  • Hasil deployment di Google:
    • Lebih dari 1.000 bug telah diperbaiki
    • Diperkirakan dapat mencegah 1.000–2.000 bug per tahun
    • Tingkat kejadian segfault turun 30% di seluruh produksi
    • Dari seluruh basis kode C++ Google, hanya 5 layanan yang melakukan opt-out penuh, dan hanya ada 7 lokasi yang memakai API akses tidak aman

(3) Contracts: pre, post, contract_assert

  • C++26 memperkenalkan fitur kontrak di level bahasa — mendukung precondition, postcondition, dan assertion untuk deklarasi fungsi
  • Dinilai jauh lebih kuat daripada macro assert milik C
  • Hasil voting adopsi Contracts:
    • Februari 2025 (merge ke working draft): 100 setuju, 14 menolak, 12 abstain
    • Maret 2026 (penetapan final C++26): 114 setuju, 12 menolak, 3 abstain
  • Meski sejumlah pakar komite masih memiliki kekhawatiran teknis, topik ini telah dibahas cukup dalam lewat tiga rapat dan banyak panggilan konferensi
  • Sebelum rapat November 2025, umpan balik sudah tercermin lewat perbaikan 2 bug pada spesifikasi Contracts

(4) std::execution (Sender/Receiver)

  • Ini adalah model asinkron C++ berupa framework terpadu untuk mengekspresikan dan mengendalikan konkurensi serta paralelisme
  • Memiliki karakteristik aman karena memudahkan penulisan structured concurrency (konkurensi dengan siklus hidup yang tersarang secara ketat), sehingga data race dapat dicegah secara struktural
  • Perhatian: dokumentasinya saat ini masih kurang, dan library "fingers-and-toes" belum memadai sehingga tingkat adopsinya lebih sulit dibanding fitur C++ lainnya
    • Mungkin diperlukan bantuan dari pakar yang sudah sangat memahami fitur ini serta penulisan adapter library untuk integrasi dengan kode asinkron yang sudah ada

Mengapa C++26 diperkirakan akan cepat diadopsi

  • Ini adalah kumpulan fitur yang paling banyak dibutuhkan sejak C++11, karena mencakup reflection dan peningkatan safety yang kemungkinan dipakai sehari-hari oleh mayoritas developer C++
    • Parallel STL, concepts, coroutines, dan modules pada C++17, C++20, dan C++23 dinilai tidak memberi dampak seluas C++11 bagi semua developer C++
  • GCC dan Clang sepanjang pengembangan C++26 telah mempertahankan status pra-implementasi untuk dua pertiga fitur
    • GCC sudah menggabungkan reflection dan Contracts ke trunk, tinggal menunggu rilis

Pekerjaan C++29 dimulai: pendalaman keamanan memori

  • Pada rapat kali ini, jadwal C++29 juga diadopsi, mempertahankan siklus rilis 3 tahunan
  • Fokus utama C++29 dipastikan pada penguatan tambahan untuk type safety dan memory safety
    • Berbagai usulan untuk mengurangi undefined behavior (UB) lebih lanjut sedang ditinjau
    • Di SG23 (subgrup safety dan security), pekerjaan sedang berjalan berdasarkan profil type safety P3984 milik Bjarne Stroustrup serta framework profil umum dari Gabriel Dos Reis
  • Oliver Hunt dari Apple mempresentasikan P4158R0 "C++ Subsetting and Restriction for Memory Safety"
    • Pendekatan subset-of-superset diterapkan pada lebih dari 4 juta baris kode WebKit
    • Dilaporkan bahwa pendekatan ini "memblokir banyak kelas kerentanan, dan kebijakan saat ini kemungkinan besar akan mencegah sebagian besar exploit di masa lalu"
  • Topik keamanan memori dibahas mendalam pada sesi Rabu malam yang dihadiri mayoritas komite dan pada sesi khusus EWG Jumat sore yang dihadiri sekitar 90 orang
  • Library quantities and units (P3045R7 "Quantities and units library") maju dari SG6 dan SG18 ke LEWG (subgrup evolusi library utama)

Jadwal berikutnya

  • Dua rapat berikutnya dijadwalkan di Brno, Ceko (Juni) dan Buzios, Rio de Janeiro, Brasil (November)
  • Pada kedua rapat tersebut, pekerjaan penambahan fitur ke working draft C++29 akan dimulai
  • Mulai sekarang hingga sebelum rapat berikutnya, banyak telekonferensi subgrup sudah masuk dalam jadwal

6 komentar

 
roxie 20 hari lalu

C++26 selesai! — Upgrade terbesar sejak C++11, dengan refleksi dan peningkatan keamanan memori yang resmi ditetapkan

 
GN⁺ 22 hari lalu
Pendapat Hacker News
  • Sangat disayangkan fitur Contracts diadopsi ke dalam standar C++
    Rasanya seperti menambah kompleksitas lagi ke bahasa yang kompleksitasnya sudah mencapai batas
    Bahkan Bjarne Stroustrup menyebut fitur ini sebagai “desain yang belum matang dan digembungkan ala komite”
    Menurut saya, fitur ini juga punya banyak potensi bahaya (footgun), jadi sulit dibenarkan

    • Pada awal 90-an saya pernah mengimplementasikan sendiri ekstensi Contracts untuk C++
      Tapi tidak ada yang tertarik
      Materinya ada di sini
    • Banyak orang bilang “C++ terlalu kompleks”, tetapi menarik bahwa fitur kompleks yang mereka bayangkan ternyata berbeda-beda
    • Bisa jadi desain Contracts di C++ memang salah, tetapi saya rasa konsepnya sendiri sangat penting untuk perkembangan bahasa
      Seperti di Ada atau Rust, ini adalah elemen inti untuk integrasi dengan verifikasi formal (proof assistant) agar verifikasi statis bisa menggantikan pengujian
      Ada Spark layak dijadikan rujukan
    • Dokumentasi Contracts terlalu membingungkan
      Contoh pertama di dokumentasi cppreference justru merupakan kasus pengecualian yang mengubah state
      Sintaksnya juga tidak intuitif
      Misalnya bentuk seperti asserts_pre(num >= 0) akan jauh lebih jelas daripada pre(num >= 0)
      Tapi tampaknya keringkasan lebih diprioritaskan
    • Contracts pada dasarnya hanya menstandarkan hal-hal yang selama ini sudah dilakukan secara tidak resmi oleh para pengembang C++
      Jadi bukan menambah kompleksitas, melainkan menyatukan berbagai implementasi masing-masing agar interoperabilitas lebih baik
      Justru fitur seperti Reflection yang menurut saya lebih menambah kompleksitas
  • Sebagai pengembang C# dan Java, saya penasaran
    Saat ini aplikasi seperti apa yang dibuat dengan C++?
    Saya jarang mendapat kesempatan mendengar masalah nyata apa yang sebenarnya diselesaikan dengan bahasa ini

  • Pendefinisian ulang “erroneous behavior” untuk variabel yang tidak diinisialisasi cukup menarik
    Menurut dokumen standar, ini menimbulkan biaya runtime,
    dan dengan atribut [[indeterminate]] perilakunya bisa dikembalikan lagi menjadi undefined behavior

    int x [[indeterminate]];
    std::cin >> x;
    
    • Bahasa D menginisialisasi semua variabel secara otomatis
      Jika benar-benar ingin tidak menginisialisasi, harus ditulis eksplisit seperti int x = void;
      Hampir tidak mungkin menulis itu secara tidak sengaja
    • Setelah membaca dokumennya sekilas, ada dua hal yang mengejutkan
      1. Tidak jelas apa sebenarnya arti “nilai yang ditentukan secara independen” — apakah diisi 0, atau nilai acak dari memori?
      2. Saya juga mempertanyakan kenapa [[indeterminate]] justru kembali ke UB (Undefined Behavior)
    • Kemungkinan fitur ini nantinya bisa dikendalikan lewat flag compiler
      Beberapa proyek mungkin tetap lebih memilih inisialisasi manual
    • Membayangkan orang yang nanti melihat [[indeterminate]] di kode terasa mengerikan
      Pada akhirnya mereka akan membuang waktu untuk mencari artinya, atau lama-lama malah mengabaikannya
      Ini mengingatkan saya pada pengalaman membaca kode Rust yang dipenuhi generic dan trait hingga sulit dipahami
  • Saya pernah bekerja di tim C++ Microsoft pada tahun 90-an
    Saat itu saya mengira RTTI adalah batas tertinggi sistem reflection yang mungkin dimiliki C++
    Kemajuan sekarang benar-benar mengejutkan

  • Mengadakan rapat di Croydon lalu tidak membiarkan siapa pun keluar sampai tanda tangan selesai adalah strategi yang cukup licik
    Saya tidak ingin bekerja di sana lagi

  • Saya penasaran dengan status implementasi C++26 di GCC dan Clang
    GCC sudah menggabungkan reflection dan contracts ke trunk, tetapi saya ingin tahu sejauh mana Clang sudah berjalan

    • Di halaman status Clang, keduanya ditandai “no”,
      sedangkan di halaman GCC ditandai “yes”
    • Bloomberg merilis implementasi reflection untuk Clang di sini
      Ini sudah bisa dipakai di Compiler Explorer, dan digunakan untuk menambahkan reflection ke simdjson
  • Saya ragu perubahan pada sistem modul di standar kali ini benar-benar akan membuatnya lebih luas dipakai

    • Menurut saya C++ WG setidaknya sekali perlu fokus pada modul dan packaging alih-alih fitur baru
      Itulah alasan Cargo di Rust jauh mengungguli C++
      Ketidakmampuan menambahkan dependensi hanya dengan satu baris cargo add membuat generasi baru menjauh
    • Sebagian besar compiler masih belum mendukung header unit
      Jika CMake mengadopsi model kompilasi dua tahap milik Clang, kecepatan build akan meningkat drastis,
      dan barulah modul benar-benar mulai diadopsi
    • Saya rasa modul sudah merupakan gagasan yang gagal
      Hampir tidak ada peluang untuk menjadi arus utama
    • Sejujurnya saya berharap pengembangan C++ berhenti saja sekarang
      Fitur baru terlalu banyak sehingga sulit diikuti
      Sistem build juga berantakan, dan file header seharusnya sudah ditinggalkan
  • Ini agak di luar topik, tetapi ungkapan “London Croydon” terdengar aneh
    Bukankah biasanya orang mengatakan “Croydon, London”?

    • Ada juga ungkapan terbalik yang umum seperti “London Gatwick Airport”
      Saat merencanakan perjalanan, membaca dari wilayah besar ke wilayah kecil terasa lebih alami
    • Setiap orang berbeda dalam apakah mereka menyebut yang spesifik dulu atau yang umum dulu
      Alasan ditulis “London, Croydon” mungkin untuk memberi kesan “rapatnya di London”
      “Croydon, London” justru terasa seperti “di Croydon pinggiran London”, jadi kurang keren — tafsiran setengah bercanda
  • Ada juga reaksi sinis seperti “rilisnya pas menjelang bahasa ini ditinggalkan”

  • Jika C++29 hanya fokus pada peningkatan kualitas dan penyempurnaan fitur yang sudah ada, sepertinya komunitas pun tidak akan terlalu keberatan

    • Secara pribadi, saya sudah puas kalau C++29 hanya menambahkan fungsi random() satu baris
    • Tentu saja, reaksi komunitas akan berbeda tergantung fitur apa yang benar-benar ditambahkan
 
woonsa 21 hari lalu

Daripada menambahkan fitur demi keamanan memori, kalau saja pointer menggantung atau referensi yang dapat diubah saja tidak diperbolehkan, keamanan memori sudah akan meningkat. Malah dengan menambah fitur, kompleksitas kode justru hanya makin tinggi.

 
tsboard 21 hari lalu

Saya sudah susah payah beralih ke Rust, jadi cukup menggembirakan melihat banyak fitur yang saya tunggu akhirnya masuk ke rancangan standar C++26. Tapi saya tetap tidak akan kembali ke C++... haha

 
heal9179 21 hari lalu

Untuk yang terkait packaging, tampaknya ada juga perkembangan dari sisi CMake..
https://www.kitware.com/common-package-specification-is-out-the-gate/

 
heal9179 21 hari lalu

contract benar-benar fitur yang sudah lama kutunggu, akhirnya juga