Rust Programcıları İçin C: Sistem Programlamaya Tersten Bakış
Kaynak: Hacker News
İçindekiler 2 başlık
Çoğu geliştirici sistem programlamaya C veya C++ ile adım atıp ardından modern bir alternatif olan Rust'a geçer. Bu nedenle internette "C Programcıları İçin Rust" başlıklı sayısız kaynak bulabilirsiniz. Ancak ilk sistem programlama dili olarak doğrudan Rust'ı öğrenenler için C dünyasına adım atmak tam anlamıyla kafa karıştırıcı ve şaşırtıcı detaylarla doludur. Modern derleyici garantilerinden ve zengin tip sisteminden sonra C'nin kendine has tuhaflıklarına alışmak, yazılım mimarisi açısından farklı bir zihniyet dönüşümü gerektirir.
Bu yazıda, Rust kökenli bir bakış açısıyla C öğrenirken karşılaşılan iki temel yapısal farkı ve pratik çıkarımlarını inceliyoruz.
1. Boolean Değerler Varsayılan Olarak Yerleşik Değildir#
Rust'ta bool türü dilin en temel yapı taşlarından biridir; true ve false ise kesin anahtar sözcüklerdir. Oysa C dilinin orijinal sürümünde yerleşik bir boolean ilkel tipi bulunmuyordu. Koşullu ifadeler doğrudan tamsayılar üzerinden yürütülüyor; mantıksal doğruluk için 1, yanlışlık içinse 0 kullanılıyordu.
Bu durum C99 standardıyla esnetilerek <stdbool.h> başlık dosyası üzerinden boolean desteği getirildi. Ancak burada bile true ve false gerçek anahtar kelimeler değil, sırasıyla 1 ve 0 değerlerine açılan basit önişlemci makrolarıydı (#define true 1). C23 standardı ile boolean değerler nihayet gerçek bir dil ilkel türü haline gelmiş olsa da, eski standartları hedefleyen projelerde <stdbool.h> kütüphanesini manuel dahil etmek şarttır.
- Pratik Çıkarım: Rust'ın katı tip güvenliğinden gelen geliştiriciler, C'de türlerin örtük biçimde tamsayılara dönüşebilmesine ve derleyici standartlarının getirdiği davranış farklılıklarına karşı çok daha dikkatli olmalıdır.
2. Null ile Sonlandırılan Dizgiler (Null-Terminated Strings)#
Rust dilinde bir &str referansı 16 bayttır; 8 bayt bellek adresini (gösterici), 8 bayt ise dizginin uzunluğunu saklar. Bu dinamik boyutlu dil yapısı (fat pointer), dize uzunluğunu O(1) karmaşıklığında anında öğrenmeyi sağlar ancak her referans için fazladan bellek harcar.
C ise tamamen farklı bir mühendislik takası benimser: Dize uzunluğunu ayrı bir değişkende tutmaz, bunun yerine her dizeyi sonlandıran bir null baytı (\0) kullanır. Bu tercihin getirdiği önemli sonuçlar şunlardır:
- Programların dize yanında ek bir boyut değişkeni taşımasına gerek kalmaz.
- Her dize, null sonlandırıcı için fazladan 1 baytlık alana ihtiyaç duyar; yani boş bir dize
""bile bellekte 1 bayt yer kaplar. - Dizenin ortasında
\0baytı yer alamaz; aksi halde standartstring.hfonksiyonları dizeyi erken keser. - Sonlandırıcı baytı unutmak, sınır dışı bellek okumalarına (out-of-bounds read) ve güvenlik açıklarına yol açar.
Pratikte bu durum, C ile dize tersine çevirirken bile malloc(len + 1) ile fazladan yer ayırmayı ve sona açıkça \0 eklemeyi zorunlu kılar. Rust'ta dilin mülkiyet ve dilim (slice) modeli bunu arka planda güvenle çözerken, C'de tüm sorumluluk tamamen geliştiricidedir.
- Öğrenme Çıkarımı: C öğrenmek, bellek düzeninin ve veri temsillerinin donanım seviyesinde nasıl işlediğini kavramak açısından eşsiz bir yetkinlik kazandırır.
Kaynak ve atıf
Bu yazı, Hacker News üzerinde yayımlanan içerikten yararlanılarak Edumints tarafından yapay zekâ desteğiyle Türkçe hazırlandı. Ayrıntılar ve yazarların kendi anlatımı için orijinaline bakabilirsin:
- bd103.dev/blog/2026-10-07-c-for-rust-programmers