Değişken uzunluklu diziler C 2011'de neden isteğe bağlı hale getirildi?


12

VLA'lar C 1999'da tanıtıldığında, bunun dile büyük bir yenilik olduğunu düşündüm. Ancak, C 2011'de isteğe bağlı hale getirildiğini öğrendikten sonra, durumundaki değişime neyin yol açtığını merak ediyorum ve eğer bu özellik aslında eskimeye yöneliyorsa. Öyleyse, dinamik olarak boyutlandırılan verilerin yerini alacak şekilde düşünülen eşdeğer otomatik yönetim kavramı var mı?

C 2011 gerekçesi belgesini bulmaya çalıştım, ancak henüz yayınlanmamış gibi görünüyor.


Evlat edinme eksikliği?
Ryan Reich

@RyanReich: Muhtemelen, ama neden satıcıların direnci?
jxh

Yanıtlar:


8

"Bazı küçük derleyicilerin VLA olmadan C11 uyumlu olabilmesi gerektiği için isteğe bağlı olmalıdır" dan "bu ilk etapta bir hataydı" arasında değişen efsaneler duydum. Yine de bunun için kesin ve kesin bir cevabım olmadı. Nihayetinde, kimsenin gerçekten bir nedeni olduğuna inanmıyorum (varsayarak - ve umduğumda) asla ifşa edilmedi (eski aramalarm ilerledikçe).


Uluslararası Standartlar için Gerekçe - Programlama Dilleri Bölüm 4 (sayfa 13) - C 5.10 (2003)

Standart, kabul ettikleri programlar açısından uygun uygulamaları tanımlayarak, uygun bir uygulamanın bir parçası olarak geniş bir uzantı sınıfının kapısını açar. Standart, hem barındırılan hem de uyumlu olan bağımsız uygulamaları tanımlayarak, C'nin işletim sistemleri ve ROM tabanlı uygulamalar gibi programların yanı sıra daha geleneksel barındırılan uygulamalar yazmak için kullanımını tanır. Bu iki seviyeli şemanın ötesinde, C için ek alt küme tanımlanmamıştır, çünkü C89 Komitesi çok fazla seviyenin bir standardın etkinliğini azalttığını kuvvetle hissetti .

Vurgu madeni. Bu kararın kendi mantığına aykırı olduğuna dikkat edin. Ancak, başka bir şey isteğe bağlı hale getirildi. Şimdi __STDC_NO_VLA__ya VLA desteği alıyorsunuz . Bu çok garip bir karardır.


@jxh Bunu görmedim bile. İşaret ettiğiniz için teşekkürler, daha net ve daha az belirsiz bir ifadeye dönüştü. Motifi bazı bağlamlarda güdü ve hedefin eşanlamlısı olarak gördüm, ancak bunun sadece sanatsal senaryolarda yaygın olduğuna inanıyorum.
Bernardo Sulzbach

Sadece iki seviyeli bir şemaya sahip olma sorunu, yaygın olarak ancak evrensel olarak desteklenmeyen ve bazı programların aksi takdirde mümkün olandan çok daha verimli bir şekilde yazılmasına izin verebilecek birçok yararlı özellik ve garantinin olmasıdır. Bu tür özelliklerin mevcudiyeti için herhangi bir standart test yolunun olmaması, birçok alanda pratik programların çoğunluğu olmasa bile, Standartta yer alanların ötesinde garantilerden faydalanmayı önemli bir kesir için gerekli kılar ve Kesin olup olmadığını kesin ...
supercat

... program herhangi bir özel uygulama ile çalışacaktır. Hangi uygulamaların (derlemeyi reddederek) destekleyebileceği veya reddedebileceği çok çeşitli isteğe bağlı özellikler ve garantiler tanımlamak, gereksinimlerini doğru bir şekilde belirleyen bir programın bir platformda düzgün çalışıp çalışmayacağını test etmenin kolay ve standart bir yolunu mümkün kılar: inşa etmek. İnşa ederse işe yarayacaktır. Değilse, kesinlikle olmayacak. Başarılı bir derlemenin başarılı bir şekilde çalışacağını garanti etmenin mümkün olacağı programların oranının artırılması ...
Supercat

... standartların gerektirdiğinin ötesinde özelliklerden ve garantilerden yararlanamayan programların küçük bir kısmını işleyebilecek derleyici sayısını en üst düzeye çıkarmaktan çok daha değerli görünecektir.
supercat

4

Kamu komitesi belgelerinden (özellikle N1395 ) belirleyebildiğim kadarıyla, VLA'ları (karmaşık aritmetik ve diş açma ile birlikte) isteğe bağlı hale getirmenin başlıca nedenlerinden biri, küçük gömülü işlemciler için uygun C derleyicileri oluşturmayı mümkün kılmaktı.

Trend, gömülü sistemleri hedefleyen derleyici satıcılarının, müşterilerinin istemediği büyük özelliklerin tanıtımı nedeniyle C90 standardında kalmasıydı.


Birçok durumda, "dışarıda bırakılmasını istiyorlardı". Bu özellikleri etkinleştirdiğinizde RAM ayak izi değişikliğine baktığınızda, bazı insanların neden istemediklerini açıklığa kavuştururuz. Sistemin en pahalı kısmı olabilecek işlemcinin maliyetini iki katına çıkarabilir.
16'da

1
@JerryCoffin: Evet, ancak kod yalnızca dizide sizeof () kullanıldığında oluşturulur. Derleyicinin doğru kodu üretebilmesi için bilgileri izlemesi gerekir, ancak bu bilgilerin VLA'nın bellek temsiline gömülmesi gerekmez.
jxh

2
@jxh: Başlangıçta öngörüldüğü gibi, bağımsız ve barındırılan uygulamalar aynı temel dili kullandı. Farklılıklar kütüphane ile sınırlıydı. VLA'lar söz konusu olduğunda, dilin kendisinde (en azından bazı satıcıların hissettiği) daha küçük gömülü sistemler için gerçekten uygun olmadığı konusunda bir fark vardır. Boyut gömme ile ilgili olarak: hayır, muhtemelen kesinlikle kesinlikle gerekli değildir, ancak en kolay yol olabilir (örneğin, boyut için birkaç bayt depolama, hesaplamak için birçok bayt koddan kaçınabilir).
Jerry Coffin

1
@supercat: Kiraz toplama C kütüphanesi işlevselliğinin mantığını görebiliyorum, ancak dil özelliklerini "isteğe bağlı" yapmak, çok platformlu C kodu yazmaya çalışan birine kesinlikle yararsız görünüyor. Bu kullanılan C kolayca farklı bir derleyici ve farklı donanım platformu olarak yeniden hedeflenmektedir olabilir programlama metal sistemlere yakın için bariz bir seçim olduğunu olmak. Şimdi, o kadar açık değil.
jxh

1
@supercat: Yığının bombalanması VLA'ya özgü değildir. Anormal derecede büyük otomatik nesneler veya kısıtlanmamış bir işlev çağrısı yığını benzer sorunlara sahip olacaktır. Standart, bu durumlar için başarısızlığı tespit etmek için bir araç tanımlarsa, muhtemelen VLA için de işe yarayacaktır. İsteğe bağlı olarak, birden çok tedarikçinin derleyicilerini kullanarak birden çok platformda çalışması gereken yeni projelerde yeni C kodunda yeni C özelliklerinin kullanılmasını tartışmayı zorlaştırır.
jxh
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.