C3 Öğrenmek
(alloc.dev)- C3, C dilini temel alır ve modüller, operatör aşırı yükleme, generics, derleme zamanında çalıştırma gibi ileri düzey özellikler sunar
- Tanıdık C sözdizimini korurken, hata işleme, defer, foreach gibi üretkenlik ve güvenilirliği artıran sözdizimleri içerir
- Bildirimsel sözleşmeler (contracts) ile opsiyonel tipler ve hata işleme yaklaşımı sayesinde güvenlik ve açıklık artar
- Standart kütüphane ve build sistemi entegrasyonu, geçici bellek tahsisi gibi pratik bir geliştirme ortamı desteklenir
- Build, proje oluşturma ve kod yapısı gibi konularda Zig dili ile benzerlikler taşır ve yeni dil tasarımı deneyleri barındırdığı görülür
C3 genel bakış ve özellikler
C3 nedir?
- C3, mevcut C dilinin üzerine inşa edilmiş bir dildir; tanıdık sözdizimini korurken aynı anda C'de zor olan modül sistemi, operatör aşırı yükleme, generics, derleme zamanında çalıştırma, hata işleme, defer, value methods, kademeli sözleşmeler (contracts), slices, foreach, dinamik tip desteği gibi özellikler sunar
- Namespace kullanan modül yapısı ile isim çakışmalarını önler (
abc::Contextgibi bildirime dayalı namespace kullanımı) - Ana hedefi, üretkenliği artırmak ve modern sistem programlama özelliklerini güvenli biçimde sunmaktır
Dil özellikleri
Hello World örneği
- Sözdizimi açısından C'ye benzer
- Fonksiyon bildiriminde
fnanahtar sözcüğünün açıkça kullanılması gerekir - Girdi/çıktı gibi standart kütüphane işlevleri güçlüdür ve çeşitli tipler doğrudan yazdırılabilir
foreach döngüsü
- C'den farklı olarak foreach sözdizimini yerleşik olarak destekler
- Referans üzerinden yineleme için değişken adının önüne
&eklenir (ileri düzey özellik) break,continuedesteklenir; diğer dillerdeki foreach'e benzer
while döngüsü
- C99 öncesinde while koşul ifadesi içinde bildirim yazılamazken, C3'te iç bildirim mümkündür
enum ve switch ifadesi
- switch içinde örtük break desteği vardır (örtük/açık break karışımı tartışmalı olabilir)
nextcaseanahtar sözcüğü ile açık case geçişi desteği sunar (jump table uygulamayı kolaylaştırır)- Zig, C gibi mevcut dillerde karmaşık olan switch-case akışını daha sade biçimde kontrol etmeyi sağlar
defer anahtar sözcüğü
- Scope sona erdiğinde defer ile ertelenen ifadeleri ters sırada çalıştırarak kaynak temizliğini güvenli biçimde garanti eder
catch,tryile birlikte kullanılan defer yapıları da vardır (hata akışı kontrolü)
struct ve union
- struct içinde isimli/anonim alt struct/union kullanımına izin verir; bu da tagged union desenlerini tasarlamayı kolaylaştırır
- Anonimlik (aynı isimli alanların tekrarı) ile isim çakışması ayrımı katı biçimde tanımlanmıştır
Hata işleme yaklaşımı
?işareti ile opsiyonel tip desteği sunar; hata ile değer opsiyonlarını birleştirerek kullanım kolaylığı sağlarcatchanahtar sözcüğü ile boş durum (Optional'sız) / hata dallanması yapılabilir- Rust ve Zig'in aksine hata ile opsiyonel değer ayrımı zayıftır (artı: sadelik, eksi: amacın netliğinin azalması)
!operatörü (rethrow) ile istisna yukarı taşınabilir
Sözleşmeler (Contracts)
- Fonksiyon ön/son koşulları
Require/Ensure,<* .. *>arasında yazılır (koşullar derleme sırasında doğrulanır) - Derleme zamanında fold analizi de desteklenir (statik analiz henüz uygulanmamıştır)
struct metotları
- Tip belirtimi + nokta gösterimi (
Foo.next) ile ilişkili metotlar tanımlanır; namespace desteği vardır (primitive tipler dahil) - struct/union/enum gibi tüm tiplere metot tanımlanabilir
Makrolar
- Derleme zamanı değerlendirmesine dayalı makrolar (
macroanahtar sözcüğü) $ile derleme zamanı parametreleri,#ile değerlendirme öncesi aktarım uygulanır- C tarzına yakındır (iç içe geçen makro sorunlarını azaltır, AST kararlılığını vurgular,
@önek kontrolleri vb.) - Tip reflection ve derleme zamanında çalıştırma işlemleri makrolarla ele alınır
Tip özellikleri
alignof, kindof, extnameof, sizeof, typeid, methodsof, has_tagof, tagof, is_eq, is_ordered, is_substructvb.- Metaprogramming ve reflection için uygundur
Base64/Hex literalleri
b64"..."vex"..."biçimiyle bayt dizileri doğrudan tanımlanabilir- Yerleşik
$embedmakrosu bu ihtiyacı azaltır (pratikte kullanım sıklığı düşüktür)
Primitive tipler
int,uint,char(daima unsigned),bool,float,int128/uint128gibi çeşitli temel tipler bulunuriptr,uptr,isz,uszgibi pointer/boyut ailesine ait ayrı tipler de vardır (biraz daha az sezgisel olabilir)- C'den farklı olarak bit boyutu garantilidir
Diğer
- Operatör aşırı yükleme, struct alt tipleme, generics, runtime dispatch, any tipi, bitfield yapıları (bitstructs) gibi geniş bir özellik seti içerir
Uygulama: C3 deneyimi
C3 kurulumu
- Resmî siteden hazır binary indirme veya kaynaktan derleme olmak üzere iki yol desteklenir
- LLVM ve LLD kurulumu gerekir (bağlantı sorunlarında
-DLLVM_DIR,-DLLD_DIRCMake bayrakları kullanılabilir) - Bazı dağıtımlarda LLD kütüphanesinin eksik olması nedeniyle binary dosyayı doğrudan indirmek önerilir
- C3 derleyicisi
libtinfobağımlılığı gerektirir
Proje oluşturma
c3c initkomutu ile standart klasör yapısı oluşturulur (LICENSE,README.md,project.json,srcvb.)- Build, build hedefleri, kaynak ayarları gibi temel proje yapısı hazırlanır (Zig ve Cargo'ya benzer)
- Varsayılan
main.c3dosyası oldukça sadedir (görüş: yeni kullanıcılar için uygundur)
Hesap makinesi yapmak
Tasarım ve amaç
- Özyineli iniş ayrıştırıcısı (Recursive Descent Parser) ve hesap makinesinin temel mantığını kurarken C3'ün fonksiyonlar, girdi/çıktı, bellek yönetimi, döngüler gibi çeşitli sözdizimlerini pratikte denemek
- Sözdiziminin sezgiselliği, gerçek dünyadaki üretkenlik avantajları ve rahatsız eden yönlerini doğrudan görmek amaçlanır
Girdi işleme
@poolile geçici ayırıcı (tmem) kullanılır; scope bittiğinde bellek otomatik serbest bırakılır (arena allocator)- Standart bellek yönetimi olarak
tmem(geçici) vemem(genel) desteklenir; fonksiyon bazında allocator geçirme kalıbı kullanılır (Zig ile C'nin güçlü yanlarının birleşimi gibi) mainfonksiyonunda dönüş değeri mutlaka açıkça belirtilmelidir (derleyici tarafından zorunlu kılınır)- Dönüş değeri yok sayılabilen fonksiyonlar için
@maydiscardniteliği kullanılır (kötü niyetli görmezden gelmeyi önlemek için)
Tokenizer uygulaması
- Kullanıcı girdisi token listesine ayrılır
- C3 standart kütüphanesindeki
List,foreachsözdizimi,switch-case(nextcase, örtük/açıkbreakbirleşimi) gibi çeşitli kontrol yapıları kullanılır - Slice sözdiziminde (iki uç indeksin de dahil olması) ve 0 uzunluklu slice konusunda kafa karışıklığı olabilir (ayrı uzunluk belirtme sözdizimi de vardır)
- Geçici/genel allocator'ların birlikte kullanılması gibi yönler, bellek yönetiminde şeffaflık ve esneklik sağlar; Rust gibi diğer dillere kıyasla daha iyi bulunmuştur
Parser uygulaması
- Doğrudan parser yazma deneyimi (atlanmış)
Sonuç ve genel değerlendirme
- C3, geleneksel sistem dilleri ile modern tasarımın kesişim noktasını hedefler
- Zig, Rust ve C incelenerek, performans ile kod güvenliğini birlikte sağlayan bir dil olarak tasarlanmıştır
- Modülerlik, güvenli bellek/hata/sözleşme işleme, güçlü metaprogramming, sezgisel build sistemi gibi pek çok özellik öne çıkar
- Öğrenme eğrisi, C tecrübesi olanlar için kademeli biçimde aşılabilir durumdadır
- Dil sunucusu, IDE gibi ekosistem araçlarının olgunlaşmamış olması ve bazı sözdizim tercihleri geliştirmeye açıktır
- Gerçek dünyadaki low-level/sistem geliştirme işlerinde yeni nesil alternatif bir dil olarak dikkat çekmeye değerdir
Henüz yorum yok.