Mengapa array panjang variabel dibuat opsional di C 2011?


12

Ketika VLA diperkenalkan pada C 1999, saya pikir itu adalah inovasi yang bagus untuk bahasa tersebut. Namun, setelah mempelajarinya dibuat opsional pada C 2011, saya bertanya-tanya apa yang menyebabkan perubahan statusnya, dan jika itu berarti fitur tersebut sebenarnya menuju usang. Jika demikian, apakah ada gagasan yang setara tentang manajemen otomatis data berukuran dinamis yang sedang dipertimbangkan untuk menggantikannya?

Saya mencoba menemukan dokumen alasan C 2011, tetapi sepertinya belum dipublikasikan.


Kurang adopsi?
Ryan Reich

@RyanReich: Mungkin, tapi mengapa penolakan dari vendor?
jxh

Jawaban:


8

Saya telah mendengar legenda bervariasi dari "itu harus opsional karena beberapa kompiler kecil harus dapat memenuhi C11 tanpa VLA" hingga "itu adalah kesalahan di tempat pertama". Namun, saya tidak pernah mendapat jawaban yang benar dan pasti. Pada akhirnya, saya tidak percaya ada orang yang benar-benar memilikinya karena alasannya (dengan asumsi - dan berharap - ada) tidak pernah diungkapkan (sejauh pencarian lama saya berjalan).


Dari Bab 4 (halaman 13) dari Dasar Pemikiran untuk Standar Internasional - Bahasa Pemrograman - C 5.10 (2003)

Dengan mendefinisikan implementasi sesuai dengan program yang mereka terima, Standar membiarkan pintu terbuka untuk kelas ekstensi yang luas sebagai bagian dari implementasi yang sesuai. Dengan mendefinisikan kedua host yang sesuai dan implementasi yang berdiri bebas, Standar mengakui penggunaan C untuk menulis program seperti sistem operasi dan aplikasi berbasis ROM, serta aplikasi yang di-host lebih konvensional. Di luar skema dua tingkat ini, tidak ada subsetting tambahan yang ditentukan untuk C, karena Komite C89 merasa sangat kuat bahwa terlalu banyak level melemahkan keefektifan suatu standar .

Tekankan milikku. Perhatikan bahwa keputusan ini bertentangan dengan alasan mereka sendiri. Namun, ada hal lain yang dibuat opsional. Sekarang Anda mendapatkan __STDC_NO_VLA__atau mendukung VLA. Ini adalah keputusan yang sangat aneh.


@ jxh. Bahkan tidak melihat itu. Terima kasih telah menunjukkannya, ini telah diubah menjadi kata-kata yang lebih jelas dan tidak ambigu. Saya telah melihat motif sebagai sinonim dari motif dan tujuan dalam beberapa konteks, tetapi saya percaya itu hanya umum dalam skenario artistik.
Bernardo Sulzbach

Masalah dengan hanya memiliki skema dua tingkat adalah bahwa ada banyak fitur dan jaminan yang bermanfaat yang secara luas tetapi tidak didukung secara universal, dan yang memungkinkan beberapa jenis program ditulis lebih efisien daripada yang seharusnya mungkin dilakukan. Kurangnya sarana standar pengujian untuk ketersediaan fitur-fitur tersebut membuatnya perlu untuk fraksi yang signifikan jika tidak mayoritas program praktis di banyak bidang untuk menggunakan jaminan di luar yang termasuk dalam Standar, dan membuatnya sulit untuk menentukan dengan kepastian apakah ada yang khusus ...
supercat

... program akan bekerja dengan implementasi tertentu. Menentukan variasi yang lebih besar dari fitur-fitur opsional dan jaminan yang implementasi dapat mendukung atau menolak (dengan menolak kompilasi) akan memungkinkan untuk memiliki cara standar mudah yang bagus untuk menguji apakah suatu program yang secara tepat menentukan persyaratannya akan bekerja dengan benar pada platform: coba untuk membangunnya. Jika itu membangun, itu akan berhasil. Jika tidak, tentu saja tidak. Meningkatkan fraksi program yang memungkinkan untuk memastikan bahwa bangunan yang berhasil akan menjamin operasi yang sukses ...
supercat

... akan tampak jauh lebih berharga daripada hanya memaksimalkan jumlah penyusun yang dapat menangani sebagian kecil dari program yang tidak akan mendapat manfaat dari fitur dan jaminan di luar apa yang dituntut oleh Standar.
supercat

4

Sejauh yang saya dapat menentukan dari dokumen komite publik (khususnya N1395 ), salah satu alasan utama untuk membuat VLA's (bersama dengan aritmatika dan threading) opsional adalah untuk memungkinkan untuk membuat kompiler C yang sesuai untuk prosesor tertanam kecil.

Kecenderungannya adalah bahwa vendor kompiler yang menargetkan sistem tertanam tetap pada standar C90, karena pengenalan fitur-fitur besar yang tidak diminta oleh pelanggan mereka.


Dalam banyak kasus, "meminta untuk tidak keluar". Setelah Anda melihat perubahan jejak RAM ketika Anda mengaktifkan fitur-fitur itu, menjadi jelas mengapa beberapa orang tidak menginginkannya. Ini dapat menggandakan biaya prosesor, yang dapat menjadi bagian paling mahal dari sistem.
і uі

1
@ JerryCoffin: Ya, tetapi kode hanya dihasilkan ketika sizeof () benar-benar digunakan pada array. Kompiler perlu melacak info sehingga dapat menghasilkan kode yang benar, tetapi info itu tidak perlu disematkan ke dalam representasi memori VLA.
jxh

2
@jxh: Seperti yang awalnya dibayangkan, implementasi mandiri dan di-host menggunakan bahasa inti yang sama. Perbedaannya terbatas pada perpustakaan. Dalam kasus VLA, ada perbedaan dalam bahasa itu sendiri yang (setidaknya beberapa vendor merasa) tidak benar-benar cocok untuk sistem embedded yang lebih kecil. Sejauh menanamkan ukuran: tidak, itu mungkin tidak pernah benar-benar diperlukan, tetapi mungkin cara termudah (misalnya, beberapa byte penyimpanan untuk ukuran mungkin menghindari banyak byte kode untuk menghitungnya).
Jerry Coffin

1
@supercat: Saya dapat melihat logika memilih fungsi C library, tetapi membuat fitur bahasa "opsional" tampaknya jelas tidak membantu seseorang yang mencoba menulis kode C multi-platform. Ini digunakan untuk menjadi bahwa C adalah pilihan yang jelas untuk dekat dengan sistem logam pemrograman yang dapat dengan mudah Ditargetkan Ulang untuk compiler yang berbeda dan platform hardware yang berbeda. Sekarang, itu tidak begitu jelas.
jxh

1
@supercat: Membom tumpukan tidak unik untuk VLA. Benda otomatis besar yang tidak normal atau tumpukan panggilan fungsi yang tidak dibatasi akan memiliki masalah yang serupa. Jika standar mendefinisikan cara untuk mendeteksi kegagalan untuk kasus-kasus itu, kemungkinan akan bekerja untuk VLA juga. Dalam hal opsional, itu hanya membuat lebih sulit untuk berdebat untuk menggunakan fitur C baru dalam kode C baru dalam proyek-proyek baru yang diperlukan untuk bekerja pada banyak platform menggunakan kompiler dari beberapa vendor.
jxh
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.