3 puan yazan GN⁺ 2025-05-31 | Henüz yorum yok. | WhatsApp'ta paylaş
  • 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::Context gibi 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 fn anahtar 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, continue desteklenir; 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)
  • nextcase anahtar 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, try ile 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ğlar
  • catch anahtar 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 (macro anahtar 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_substruct vb.
  • Metaprogramming ve reflection için uygundur

Base64/Hex literalleri

  • b64"..." ve x"..." biçimiyle bayt dizileri doğrudan tanımlanabilir
  • Yerleşik $embed makrosu bu ihtiyacı azaltır (pratikte kullanım sıklığı düşüktür)

Primitive tipler

  • int, uint, char (daima unsigned), bool, float, int128/uint128 gibi çeşitli temel tipler bulunur
  • iptr, uptr, isz, usz gibi 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_DIR CMake bayrakları kullanılabilir)
  • Bazı dağıtımlarda LLD kütüphanesinin eksik olması nedeniyle binary dosyayı doğrudan indirmek önerilir
  • C3 derleyicisi libtinfo bağımlılığı gerektirir

Proje oluşturma

  • c3c init komutu ile standart klasör yapısı oluşturulur (LICENSE, README.md, project.json, src vb.)
  • Build, build hedefleri, kaynak ayarları gibi temel proje yapısı hazırlanır (Zig ve Cargo'ya benzer)
  • Varsayılan main.c3 dosyası 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

  • @pool ile 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) ve mem (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)
  • main fonksiyonunda 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 @maydiscard niteliğ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, foreach sözdizimi, switch-case (nextcase, örtük/açık break birleş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.

Henüz yorum yok.