Sunting global: maaf kawan, saya semua bersemangat dan menulis banyak omong kosong. Hanya kakek tua mengoceh.
Saya ingin percaya bahwa C telah dihindarkan, tetapi sayangnya sejak C11 telah disejajarkan dengan C ++. Rupanya, mengetahui apa yang akan dilakukan oleh kompiler dengan efek samping dalam ekspresi sekarang harus menyelesaikan sedikit teka-teki matematika yang melibatkan urutan sebagian urutan kode berdasarkan "terletak sebelum titik sinkronisasi".
Saya kebetulan telah merancang dan menerapkan beberapa sistem tertanam waktu-nyata yang kritis pada masa K&R (termasuk pengontrol mobil listrik yang dapat mengirim orang menabrak tembok terdekat jika mesin tidak disimpan dalam pengawasan, sebuah industri 10 ton robot yang dapat menekan orang ke bubur kertas jika tidak diperintahkan dengan benar, dan lapisan sistem yang, meskipun tidak berbahaya, akan memiliki beberapa lusin prosesor menyedot bus data mereka kering dengan overhead sistem kurang dari 1%).
Saya mungkin terlalu pikun atau bodoh untuk mendapatkan perbedaan antara tidak ditentukan dan tidak ditentukan, tapi saya pikir saya masih memiliki ide yang cukup bagus tentang apa yang dimaksud dengan eksekusi secara bersamaan dan akses data. Menurut pendapat saya, informasi tentang C ++ dan sekarang orang-orang C dengan bahasa peliharaan mereka mengambil alih masalah sinkronisasi adalah mimpi pipa yang mahal. Entah Anda tahu apa eksekusi serentak itu, dan Anda tidak memerlukan alat-alat ini, atau tidak, dan Anda akan melakukan kebaikan secara umum untuk tidak mencoba mengacaukannya.
Semua truk dengan abstraksi penghalang memori yang memikat ini hanya disebabkan oleh keterbatasan sementara dari sistem cache multi-CPU, yang semuanya dapat dengan aman dienkapsulasi dalam objek sinkronisasi OS umum seperti, misalnya, variabel dan variabel kondisi C ++ penawaran.
Biaya enkapsulasi ini hanyalah penurunan satu menit dalam kinerja dibandingkan dengan apa yang dapat dicapai oleh penggunaan instruksi CPU spesifik berbutir halus.
Kata volatile
kunci (atau a#pragma dont-mess-with-that-variable
untuk semua saya, sebagai pemrogram sistem, perawatan) sudah cukup untuk memberitahu kompiler untuk berhenti memesan kembali akses memori. Kode optimal dapat dengan mudah diproduksi dengan arahan asm langsung untuk menaburkan driver tingkat rendah dan kode OS dengan instruksi khusus CPU ad hoc. Tanpa pengetahuan mendalam tentang bagaimana perangkat keras yang mendasarinya (sistem cache atau antarmuka bus) bekerja, Anda terikat untuk menulis kode yang tidak berguna, tidak efisien atau salah.
Penyesuaian satu menit volatile
kata kunci dan Bob akan menjadi semua orang kecuali paman programmer tingkat rendah yang paling keras. Alih-alih itu, geng matematika C ++ biasa memiliki hari lapangan merancang abstraksi lain yang tidak bisa dipahami, menghasilkan kecenderungan khas mereka untuk merancang solusi mencari masalah yang tidak ada dan salah mengartikan definisi bahasa pemrograman dengan spesifikasi kompiler.
Hanya kali ini perubahan diperlukan untuk merusak aspek fundamental C juga, karena "hambatan" ini harus dihasilkan bahkan dalam kode C tingkat rendah untuk bekerja dengan baik. Itu, antara lain, menimbulkan malapetaka dalam definisi ekspresi, tanpa penjelasan atau justifikasi apa pun.
Sebagai kesimpulan, fakta bahwa kompiler dapat menghasilkan kode mesin yang konsisten dari potongan C yang absurd ini hanyalah konsekuensi yang jauh dari cara orang-orang C ++ mengatasi potensi ketidakkonsistenan sistem cache di akhir tahun 2000-an.
Itu membuat kekacauan yang mengerikan dari satu aspek mendasar dari C (definisi ekspresi), sehingga sebagian besar programmer C - yang tidak peduli tentang sistem cache, dan memang begitu - sekarang dipaksa mengandalkan guru untuk menjelaskan perbedaan antara a = b() + c()
dan a = b + c
.
Mencoba menebak apa yang akan terjadi pada array yang tidak menguntungkan ini adalah kehilangan waktu dan usaha. Terlepas dari apa yang akan dibuat oleh kompiler, kode ini secara patologis salah. Satu-satunya hal yang bertanggung jawab untuk dilakukan adalah mengirimkannya ke tempat sampah.
Secara konseptual, efek samping selalu dapat dipindahkan dari ekspresi, dengan upaya sepele membiarkan modifikasi terjadi sebelum atau setelah evaluasi, dalam pernyataan terpisah.
Jenis kode menyebalkan ini mungkin dibenarkan pada tahun 80-an, ketika Anda tidak dapat mengharapkan kompiler untuk mengoptimalkan apa pun. Tapi sekarang kompiler telah lama menjadi lebih pintar dari kebanyakan programmer, yang tersisa hanyalah sepotong kode buruk.
Saya juga gagal memahami pentingnya debat yang tidak ditentukan / tidak ditentukan ini. Entah Anda bisa mengandalkan kompiler untuk menghasilkan kode dengan perilaku yang konsisten atau Anda tidak bisa. Apakah Anda menyebutnya tidak terdefinisi atau tidak spesifik, sepertinya ini adalah titik perdebatan.
Menurut pendapat saya yang bisa dibilang informasi, C sudah cukup berbahaya dalam kondisi K&R-nya. Evolusi yang bermanfaat adalah menambahkan langkah-langkah keamanan akal sehat. Sebagai contoh, dengan menggunakan alat analisis kode canggih ini, spesifikasi memaksa kompiler untuk mengimplementasikan setidaknya menghasilkan peringatan tentang kode gila, alih-alih diam-diam menghasilkan kode yang berpotensi tidak dapat diandalkan hingga ekstrem.
Tetapi sebaliknya orang-orang memutuskan, misalnya, untuk menentukan urutan evaluasi tetap di C ++ 17. Sekarang setiap perangkat lunak imbecile secara aktif dihasut untuk menempatkan efek samping dalam kodenya secara sengaja, berdasarkan kepastian bahwa kompiler baru akan dengan bersemangat menangani kebingungan dengan cara deterministik.
K&R adalah salah satu keajaiban dunia komputasi. Untuk dua puluh dolar Anda mendapatkan spesifikasi bahasa yang komprehensif (saya telah melihat satu orang menulis kompiler lengkap hanya menggunakan buku ini), sebuah manual referensi yang sangat baik (daftar isi biasanya akan mengarahkan Anda dalam beberapa halaman jawaban untuk jawaban Anda). pertanyaan), dan buku teks yang akan mengajarkan Anda untuk menggunakan bahasa dengan cara yang masuk akal. Lengkap dengan alasan, contoh dan kata-kata bijak peringatan tentang berbagai cara Anda dapat menyalahgunakan bahasa untuk melakukan hal-hal yang sangat, sangat bodoh.
Menghancurkan warisan itu hanya karena sedikit sekali keuntungan bagiku bagaikan pemborosan yang kejam bagiku. Tetapi sekali lagi saya mungkin gagal memahami intinya sepenuhnya. Mungkin beberapa jenis jiwa dapat mengarahkan saya ke arah contoh kode C baru yang mengambil keuntungan signifikan dari efek samping ini?