- C dilinin sözdizimini ve anlamını devralırken güvenlik ve kullanılabilirliği güçlendiren evrimsel bir dil olarak, mevcut C geliştiricileri için tanıdık bir ortamı korur
- Tam C ABI uyumluluğu sunar; bu sayede C/C++ projelerine doğrudan entegre edilebilir ve vkQuake’in bazı kodlarının C3’e dönüştürülerek
c3c derleyicisiyle derlendiği bir örnek bulunur
- Modül sistemi, operatör aşırı yükleme, derleme zamanı makroları gibi özelliklerle kod yapısını ve ifade gücünü geliştirir
- Sözleşme tabanlı programlama (Gradual Contracts), sıfır ek yükle hata işleme, çalışma zamanı ve derleme zamanı yansıması gibi modern özellikler içerir
- Debug modunda güvenlik kontrolleri ve ayrıntılı stack trace otomatik olarak sunulur; bu da hata tespiti ve kararlılık açısından avantaj sağlar
C3 genel bakış
- C3, C dilinin sözdizimi (syntax) ve anlamı (semantics) temel alınarak geliştirilmiş bir programlama dilidir
- Amaç, mevcut C programcıları için tanıdık yapıyı korurken dili ileri taşımaktır
- Doğru ve amaca yönelik operatör aşırı yükleme desteği sunar
- C++’taki karmaşık aşırı yükleme yapısı olmadan vektör, matris, sabit noktalı aritmetik işlemler doğal biçimde ifade edilebilir
- Sözleşme tabanlı programlama desteğiyle çalışma zamanı ve derleme zamanı kısıtları belirtilebilir
- Kodun güvenliğini ve spesifikasyon tutarlılığını güçlendirir
- Result tabanlı hata işleme ile exception yaklaşımının avantajlarını birleştirir
- C koduyla doğal biçimde bütünleşen bir hata yönetimi yapısı sağlar
- Tür bilgisi sorgulama (type introspection) hem derleme zamanında hem çalışma zamanında desteklenir
- Inline assembly: dizelere veya karmaşık kısıtlara ihtiyaç duymadan assembly, normal kod yazar gibi yazılabilir
- Debug modunda çalışma zamanında sınır kontrolleri (bound checks) ve değer kontrolleri (value checks) otomatik eklenir
- C3 standart kütüphanesi, debug build içinde varsayılan olarak ayrıntılı stack trace sunar
- Basit bir “segmentation fault” yerine hatanın somut konumu görülebilir
Ergonomics and Safety
- Optionals ile hata ve
null işlemede güvenlik sağlar
defer sözdizimiyle kaynak temizliğinin otomasyonu desteklenir
slices ve foreach ile güvenli yineleme işlemleri yapılabilir
- Yorum tabanlı contracts ile kod kısıtları açıkça belirtilebilir
@pool bağlamında belleğin otomatik serbest bırakılması desteklenir
Performance by default
- SIMD vektörleri doğrudan yazarak donanım düzeyinde kontrol sağlanabilir
- Farklı bellek ayırıcı seçenekleriyle ince performans ayarı desteklenir
- Hata işlemede ek yük oluşturmayan tasarım benimsenmiştir
- Hızlı derleme süreleri ve LLVM backend optimizasyonları kullanılır
- Kullanımı kolay inline assembly sunulur
Batteries included standard library
- Dinamik kapsayıcılar ve dizgiler dahil standart veri yapıları sunar
- Çapraz platform soyutlamalarıyla platformlar arası taşınabilirlik sağlar
- Gerektiğinde yerel platform erişimine izin verir
Leverage existing C or C++ libraries
- C3, C ABI ile tamamen uyumludur; ayrı “C uyumlu tipler” veya fonksiyon bildirimleri gerekmez
- C3 içinden C kodu bağlanabilir, C içinden de C3 kodu bağlanabilir
Modules are simple
- Basit ve sezgisel bir modül sistemi
- Varsayılan ayarlar makul biçimde yapılandırılmıştır ve geliştirme akışını kesintiye uğratmaz
- Modüller aracılığıyla namespace yönetimi sağlar
- Açık denetimle kapsülleme yapısını sadeleştirir
- Arayüzlerle paylaşılan davranışlar tanımlanabilir
- Generic modules özelliğiyle jenerik tip üretimi basit ve açık biçimde gerçekleştirilebilir
- Struct subtyping üzerinden yapısal yeniden kullanım desteklenir
Macros without a PhD
- Derleme zamanı makroları, normal fonksiyonlara benzer biçimde yazılabilir
- Kodun tür bilgisini anlayan type-aware makrolar desteklenir
- C ön işlemcisine göre daha açık ve daha güçlü kod üretimi sağlar
4 yorum
Oldukça çeşitli şeyler çıkıyor. LONG LIVE C-LANG !!!
Ama ileride c4 çıkarsa, gerçekten de patlayıcı bir popülerlik yakalar mı...
Zig her yıl breaking change getirdiği için, dili beğensem de artık elim gitmiyor.
Öte yandan C3’ün tanıtımına bakınca genel olarak C + Go hissi veriyor; okuyup yazması rahat ve sürüm yükseltmelerinden kaynaklanan stresin çok daha az olacağı izlenimini veriyor.
Biraz da destek olarak... Son zamanlarda kullanıyorum, eğlenceli.
C kullanırken rahatsız eden noktaları iyileştirmeye odaklanmış gibi hissettirdiği için hoşuma gidiyor.
Resmî dokümantasyon ise biraz olgunlaşmamış
(bir özelliği araştırmak için bakınca, açıklamaların alakasız yerlerde yazılı olduğu durumlar çok oluyor...)
Hacker News görüşleri
Yeni bir bellek modelini dayatmıyor, C++ olmaya da çalışmıyor
Özellikle tam ABI uyumluluğu sayesinde mevcut C build sistemlerine C3 dosyalarını doğrudan karıştırıp kullanabiliyorsunuz; binding yazmaya gerek kalmıyor
Devrimden çok evrimi hedefleyen geliştirici vizyonunu takdir ediyorum
Hafta sonunda öğrenilecek bir dil olarak tavsiye edilebilir. C99'dan daha modern ama tanıdık bir his veriyor
C'den tamamen vazgeçemememin nedeni cstring ve serbest bırakılmamış pointer'lar
Asıl tehlikeli olan C'nin kendisinden çok implementasyonlar ve ABI
fat pointer, geliştirilmiş varargs, UBSan, MTE gibi şeyler uygulanırsa oldukça iyi bir noktaya gelinebilir
Derleyicinin sözleşmeleri mutlaka denetlemesi gerekmiyorsa ve ihlal durumunda tanımsız davranış ortaya çıkabiliyorsa, buna nasıl güvenip kullanmak gerekir bilmiyorum
Güzel bir özellik ama biraz riskli görünüyor
Bunlar yok sayılabilir, çalışma zamanında denetlenebilir ya da her zaman doğru kabul edilip optimizasyonda kullanılabilir
Örneğin pointer geçerliliği denetlenebilir, tek sayı olma koşulu ise varsayım olarak bırakılabilir
Büyük ekipler bunu zorunlu kılabilir; Visual Studio gibi araçlar ise sadece uyarı gösterip kademeli öğrenmeye imkan tanıyabilir
assertile denetlenirYani geliştirme sırasında açıp dağıtımda kapatarak performansı etkilememesini sağlayabilirsiniz
Mutlaka denetlenmesi gereken koşullar fonksiyon içinde doğrudan kodla ele alınmalı
C'den farklı olarak header dosyaları yok, modül tabanlı namespace, slice'lar, operator overloading, generic modüller, Result tabanlı hata işleme, güvenli modda çalışma zamanı denetimleri gibi özellikler sunuyor
Kişisel olarak function overloading, varsayılan parametreler ve tuple dönüşleri eksik geliyor
Resultya daExpectediçin Optional adının kullanılması kafa karıştırıcıBunun “T veya boş” değil, “T veya E” anlamına gelmesi gerekirken isim yanlış seçilmiş gibi duruyor
İlgili belge bağlantısı
Option<T>ya daResult<T, E>ile aynı değilHata tipi tek bir tamsayı koduyla sınırlı ve bu da “devrim değil, evrim” felsefesiyle uyumlu
type?sözdizimi de sezgiselC'nin anlamını korurken out param yükünü azaltan bir tasarım
Resultzaten genel bir dönüş değeri anlamı taşıdığı için karışıklık yaratabilirYouTube oynatma listesi
Üç dilin birbirleriyle rekabet etmekten çok birbirlerinin trade-off'larından öğrenen bir ilişki içinde olması etkileyiciydi
Bunun yerine makrolar ve reflection gibi özellikler eklenmiş
En büyük tür kadar bellek kaplıyorlar ve akışı çalışma zamanındaki tür denetimine taşıyarak statik tipli dillerin avantajlarını azaltıyorlar
Gerektiğinde bunları elle uygulamak daha iyi olabilir
C içinde generic'leri, slice'ları ve hata yayılımını kendim uyguladım ama derleyici yazmak fazla karmaşık
Bu yüzden ben C varyantları ile Go'yu birlikte kullanıyorum
Hatta bir günde prototip çıkarabilecek kadar giriş eşiği düşük
Yeni bir paradigmayı gerçeğe dönüştürmenin tek yolu budur
Dil; sözdizimi, standart kütüphane, tooling ve runtime'ı birlikte uyumlu hale getirmeyi gerektirdiği için zor ama bu yüzden geleceğe etkisi de büyüktür
LLVM sayesinde yeni bir derleyiciyi kendisi inşa edebilmiş
Tek başına kullanılan bir C varyantı sorun olmayabilir ama başkalarıyla işbirliği yapmak veya dış kütüphaneler kullanmak için ortak bir dil gerekir
Bir de exception'lara “Excuses” demeleri sevimli ve esprili
Özellikle gezinme menüsünde Discord bağlantısı olması bu izlenimi güçlendiriyor