Yeni C projeleri ne zaman çok eski C standartlarını (> 20 yaşında, yani C89) hedeflemelidir?


12

Bazen çok eski C standartlarını, tipik olarak C89'u hedefleyen büyük, nispeten yeni, açık kaynaklı C projeleri görüyorum. Bir örnek systemd. Bu projelerin dümeninde zeki insanları var, bu yüzden muhtemelen bilmediğim bu kararın arkasında iyi bir mantık var. Şüphe bir yana, mantıklı sonuç FORTRAN'ın C'den daha iyi ve COBOL'un FORTRAN'dan bile daha iyi olacağı anlamına geldiği için, mantıksal sonuç "eski ve standardize edilmiş her zaman daha taşınabilir ve daha iyidir" gibi görünüyor.

Yeni C projelerinin çok eski C standartlarını hedeflemesi ne zaman ve neden haklı?

Bir kullanıcının sisteminin C derleyicisini kesinlikle güncellememesi gereken, ancak yeni yazılım yüklemek için ücretsiz olduğu bir senaryo hayal edemiyorum. Örneğin Debian'ın LTS sürümü, C99'u ve bazı C11'i destekleyen bir gcc 4.6 paketine sahiptir. Sanırım garip senaryo var olmalı ve systemd gibi programlar bu kullanıcıları hedefliyor.

Hayal edebileceğim en makul kullanım durumu, kullanıcıların sadece bir C89 derleyicisinin bulunduğu egzotik mimarilere sahip olmalarının beklendiği, ancak yeni yazılım yüklemeye tamamen istekli oldukları durum. Öğretim seti mimarilerinin çeşitliliğindeki düşüş göz önüne alındığında, bu aşırı varsayımsal bir senaryo gibi görünüyor, ama emin değilim.


10
"Bir kullanıcının sisteminin C derleyicisini kesinlikle güncellememesi gereken, ancak yeni bir yazılım yüklemek için ücretsiz olduğu bir senaryo hayal edemiyorum." Yeterince gömülü iş yapmadınız ;-)
Philip Kendall

2
@PhilipKendall Hiçbir gömülü iş yapmadım. Beni bir cevapla aydınlatmanı teşvik ediyorum!
Praxeolitic

2
Bir standart oluşturulduktan sonra neredeyse sonsuza dek sürecektir. Bazen 2000 yıldan uzun .
Doc Brown

1
@DocBrown Ancak bu sayfanın bunun 2000 yıllık bir standart olduğu iddiasının yanlış olduğunu açıkladığını unutmayın.
Jesper

1
Böyle bir şey gördüğünüzde, sormanız gereken ilk soru, "Hangi platform (lar) ı hedeflemeyi amaçlıyor?" )?" Ardından, "Hangi C sürümleri projenin gereksinimleriyle en fazla uyumu sağlıyor?" Bir sonraki bölüm muhtemelen "Projenin çoğunluğu en çok tanıdık olan C sürümleri?"
Justin Time - Monica'ya geri

Yanıtlar:


14

... "eski ve standartlaştırılmış her zaman daha taşınabilir ve daha iyi" ki bu çok saçma ...

Bu ifade daha iyiye ulaştığında saçma oldu , ki bu tamamen öznel. Bir proje için bir dil ve standart seçmezsiniz, çünkü en son yaptığınız buluşmadaki insanların yarısı onu kullanıyordu; seçiyorsunuz çünkü çözdüğünüz sorunu incelediniz ve anladınız ve bunun iş için doğru araç olduğunu belirlediniz.

Genel olarak standartlar için, taşınabilirlik için bazı projelerde yapılması gereken bir durum vardır ve burada daha eski olanı seçmenin bir faydası vardır. Bu, özellikle başkaları için bir araç olan kütüphaneler ürün olarak geliştirirken geçerlidir. Yapmak istediğiniz son şey, satamayacağınız bir şey yazmaktır, çünkü henüz tanışmadığınız müşterilerin mevcut olamayacağı bir derleyici gerektirir. Philip Kendall'ın gömülü dünya hakkındaki yorumu yerinde; bunun etrafında bir sürü şey var, çünkü insanlar hala eski, istikrarlı platformlar için yeni kod yazmak zorunda veya ekstra özelliklerden yararlanmayan ve güncel bir derleyici almayanlar. Projenizin her yönünü tam olarak kontrol ettiğinizde, orada '

Özellikle C için, en son standarda uymak karşılığında ne elde edeceğiniz sorusu vardır. K & R-C89 geçişi, eski kodu temizlemek için çok çaba gerektiren ancak nihayetinde çok iyi olan büyük bir değişiklikti. C99 değişiklikler ve C11kıyaslandığında önemsizdir ve yeni geliştirilen CI karşılaşmasının çoğu yeni özellikleri kullanmadığı için hala C89'u geçecektir. C99'u C89 üzerinde zorunlu kılmanın doğru bir şey olacağını iddia etmek zor çünkü tek satırlı yorumları destekliyor, yerel bir Boolean veri türüne sahip ve değişken uzunlukta diziler yapabilir. Yorumlar ve Boolean'lar çirkin olmayan geçici çözümlere sahiptir ve VLA'lar biraz daha az verimli başka şekillerde ele alınabilir. C11, VLA'ları isteğe bağlı olarak indirdi ve bu, uygulamanızda belirgin bir şekilde anlaşılırlarsa eski C99'u seçmenin bir gerekçesi olabilir.


3
Değişken bildirimleri ve ifadelerin karıştırılması anlaşılırlık açısından oldukça iyidir. Satır içi işlevler, sınırlı unicode desteği ve long longayrıca olması güzel.
Tekilleştirici

Ayrıca, multithreading bazen olması güzel ...
Deduplicator

@Deduplicator C99 ve C11'de olanların iyileştirme olduğuna katılmıyorum. Eski ortamlara taşınabilirlik değerini aşan hoşnutlukların değeri için bir iş vakası yapabiliyorsanız, istediğiniz tüm C11'i yazabilirsiniz. Dosyayı "sorunu inceleyin ve iş için doğru aracı bulun."
Blrfl

2
Mesele şu ki, önemli gelişmelerden tam olarak bahsetmediniz .
Tekilleştirici

@Deduplicator: 1990'larda çok iş parçacıklı kod yazıyordum. Dil tabanlı iş parçacığı özelliklerine dayanan kod, Standardın gerektirdiği her şeyi desteklemeyen bağımsız uygulamalar üzerinde kullanılamazken, ihtiyaç duydukları işlevselliği destekleyen platform işlevlerini sarmak için kütüphaneleri kullananlar bu işlevleri destekleyen herhangi bir platforma uyarlanabilir olacaklardır. .
supercat

10

Geniş bir platform yelpazesinde taşınabilirlik önemli olduğunda. Bu, eski platformları ve yalnızca minimalist bir derleyicinin bulunduğu birçok yerleşik işlemciyi içerebilir.

Ayrıca C89'un "en düşük ortak payda" olduğu duygusu da var. Düzgün standartlaştırılmış ilk sürümdü ve bugün kullanılan hemen hemen her derleyicinin C89'un bazı üst kümesini uyguladığı varsayılabilir.

Microsoft Visual C ++ 'ın, C ++ standartlarına ayak uydurmada nispeten iyi olmasına rağmen, C modundayken C89'da uzun süre takılı kalması sorunu da var. Bu nedenle, en son Visual Studio'yu kullanmayan herkes C89 ile sınırlı olabilir.


Evet, lehte argüman taşınabilirliktir, ancak soru aslında sadece bir C89 derleyicisini kullanabilen ancak yeni yazılım dağıtımlarını derleyen varsayımsal olmayan sistemler olup olmadığıdır. Yani yeni bir C projesine başlamış olsaydım, C89'a bağlı kalmanın potansiyel kullanıcı sayısını artıp arttıramayacağına nasıl karar verebilirim? MSVC noktası iyidir.
Praxeolitic

1
@Praxeolitic Bu, çok çeşitli insanların kullanacağı kod yapıp yapmadığınıza dair bir sorudur. Çünkü orada eski derleyicileri kullanan çok fazla insan olacak, ya yükseltemedikleri ya da yükseltmek için çok fazla risk ve çaba düşündükleri için.
Simon B

3

Hala Microsoft nedeniyle sahte-C89 kodu (tam C99 uyumlu değil) yazıyorum itiraf etmeliyim. Windows tarafı için MSVC'ye yoğun bir şekilde yaslanıyorum ve hala C99 uyumlu değiller, bunun yerine odaklarının çoğunu C ++ 17 ve sonrasında yerleştiriyorlar.

Bunun üzerine, eklenti geliştiricilerinin eklenti geliştirmeleri için MSVC ve bazıları hala MSVC 2010'u kullandığı C SDK'ları üzerinde çalışıyorum. Bu yüzden hala çok egzotik olmayan platformlarda yaygın olarak kullanılan popüler derleyiciler var (siz düşünmedikçe) Windows egzotik) henüz C99'u tam olarak uygulamaz. En büyük derleyici yelpazesi ile geniş uyumluluğu hedeflediğinizde (SDK'nın C ++ ile değil C dilinde yazılmasının ana nedenlerinden biri), bunların arkasında hala kullanılan bir dizi (en azından MSVC) vardır. C desteği söz konusu olduğunda. C99'dan bu yana neredeyse birkaç on yıl geçti ve hala VLA'larımız yok, örneğin MSVC AFAIK'te (henüz MSVC 2017'de kontrol etmedim, ancak Microsoft'un C'ye karşı tutumu göz önüne alındığında, C99 ile çok daha uyumlu olduğundan şüpheliyim) .

Ve ne yazık ki hala tam olarak C99 uyumlu olmayan iyi optimize ediciler ve hata ayıklayıcılarla oldukça iyi olan yeni derleyiciler var. Tabii ki bu olmasaydı, C11'in her yerine atlardım.

Eklentiler ve MSVC ile kaynak uyumluluğunun yanı sıra, diğer dillerle birlikte çalışır. Diğer bazı diller SDK'yı bir FFI aracılığıyla kullanır ve bu FFI'lerin bazıları sadece C89'u anlar. Bir dylib'den fonksiyonları içe aktarırken anlamayabilirler boolveya _Boolbasit bir örnek olabilirler ve sadece anlayabilirler int.

Evet, lehte argüman taşınabilirliktir, ancak soru aslında sadece bir C89 derleyicisini kullanabilen ancak yeni yazılım dağıtımlarını derleyen varsayımsal olmayan sistemler olup olmadığıdır. Yani yeni bir C projesine başlamış olsaydım, C89'a bağlı kalmanın potansiyel kullanıcı sayısını artıp arttıramayacağına nasıl karar verebilirim?

Sadece bunu fark ettim ama bir çeşit yankılama Blrfl, C99 ve C11'i kullanarak üretkenlik kazancı benim durumumda çok büyük değilken, insanların eklentilerini MSVC'ye yazmalarına izin verme yeteneğini kaybetmek büyük bir maliyet olabilir (özellikle çalıştığım ürün açık, Windows tarafında en büyük pazar payına sahiptir ve ortalama bir kullanıcı genellikle birçok üçüncü taraf eklentisi satın alır ve indirir). Üzerinde çalıştığım ürün türü, programcılar / senaryo yazarları için bir geliştirme ortamı ve sanatçılar için bir kullanıcı sonu ürünü arasında neredeyse yarı yolda, çünkü birçok insan yeni yeteneklere izin vermek ve bir özel efekt elde etmek için üzerinde yeni şeyler geliştirmek istiyor. tür insanlar henüz görmedim. Benim durumumda C89'u en azından SDK için tercih etmek oldukça basit bir karardı.

Sanırım etrafınızdaki derleyicilere bir bakmanız ve hedef demografinizi bulmanız gerekiyor. Windows için bir eklenti mimarisi geliştirmiyorsanız veya herhangi bir gömülü programlama yapmıyorsanız veya orada en geniş derleyici ve diller tarafından kullanılabilecek bir yazılım geliştirme kiti oluşturmaya çalışıyorsanız, C99 + için işlere kolayca ulaşılmasını sağlar uzakta. Ayrıca, C99'dan itibaren ne kadar verimlilik artışı elde ettiğinizi düşünün. VLA'lar gibi şeylerden o kadar çok faydalanamıyorum çünkü veri uyuyor ve başka türlü yığın yaparken yığını kullanmak için yeterince basit yollara güveniyorum.

Ancak, MSVC gibi popüler derleyicilerden FFI'lara kadar popüler derleyicilerden, C işlevlerini doğrudan bir dylib'den içe aktarabilmeleri ve çağırabilmeleri açısından havalı olan birçok şey var. zamanlar. Bu nedenle, alan adınıza bağlı olarak, bir tür estetik için daha eski ve standartlaştırmayı tercih etmekten çok daha pratik iş şeyleri var.

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.