MCPcopy Index your code
hub / github.com/buraksenyurt/rust-training

github.com/buraksenyurt/rust-training @main

Chat with this repo
repository ↗ · DeepWiki ↗ · + Follow
270 symbols 393 edges 70 files 43 documented · 16%
What it actually does AI analysis from the code graph — generated when you open this
loading…
README

Rust Training

Rust ile ilgili temelden orta seviyeye eğitim vermek istesem hangi konuları hangi örneklerle ele alırdım sorusuna cevap aradığım repodur.

Buradaki konular ile ilgili birde Youtube serimiz var. "Birlikte Rust Öğrenelim"

Konular

S koduyla başlayan projelerde aşağıdaki konu başlıkları ele alınmıştır. Orijinal sıralama için youtube video serisine bakabilirsiniz. Buradaki kodlar anlatımları desteklemek amacıyla kullanılır.

  • [x] S00 - Hello World
  • [x] S01 - Variables, Mut and Scalar Types
  • [x] S02 - Vectors and Slices
  • [x] S03 - String and &str
  • [x] S04 - Functions
  • [x] S05 - Control Flows
  • [x] S06 - Ownership and Move
  • [x] S07 - Structs
  • [x] S08 - Lifetimes
  • [x] S09 - Enums
  • [x] S10 - Pattern Matching
  • [x] S11 - Generics
  • [x] S12 - Traits
  • [x] S13 - Built-In Traits
  • [x] S14 - Modules, Crates, Packages
  • [x] S15 - Error Handling
  • [x] S16 - Testing
  • [x] S17 - Closures
  • [x] S18 - Smart Pointers (Box, Rc ve RefCell)
  • [x] S19 - Concurrency (Threads, Arc ve Mutex)
  • [x] S20 - Channels, Deadlock & Thread Poisoning
  • [x] S21 - Macros
  • [x] S22 - Parallelism (Sequential vs Thread Based vs With Rayon)
  • [x] S23 - Asynchronous Programming
  • [x] S24 - File I/O Operations
  • [x] S25 - Stream Operations
  • [x] S26 - Unsafe Zone
  • [ ] S27 - Wasm (Web Assembly)

Yardımcılar

Rust dilinde isimlendirme standartları (Naming Conventions) da kod okunurluğu ve genel uyumluluk açısından önemlidir. Aşağıdaki isimlendirme önerilerine ait bilgilerin yer aldığı bir tablo bulunmaktadır.

Kategori İsimlendirme Standardı
Constants SCREAMING_SNAKE_CASE
Conversion constructors from_some_other_type
Crates unclear
Enum variants UpperCamelCase
Features unclear but see C-FEATURE
Functions snake_case
General constructors new / init
Lifetimes 'a, 'de, 'src
Local variables snake_case
Macros snake_case!
Methods snake_case
Modules snake_case
Statics SCREAMING_SNAKE_CASE
Traits UpperCamelCase
Type parameters T, K gibi olabilir
Types UpperCamelCase

S03 bölümünde string slice (&str) ve string literal karmaşası için ek bilgi.

Özellik String Literal (&'static str) String Slice (&str)
Lifetime 'static ömre sahiptir ve programın tamamı boyunca geçerlidir. Herhangi bir ömür ile kullanılabilir (örneğin bir fonksiyonun yerel değişkenini referans edebilir)
Memory Bellekte statik olarak saklanır, sabit yer kaplar. Dinamik String veya string literalinin bir dilimini(parçasını) referans edebilir.
Resource Sabit ve değiştirilmez stringlerdir. Bir String değişkenin ya da başka bir string'in bir parçası olabilir.
Usage Kaynak kodda doğrudan yazılan string değerleri ifade eder. Bir String'den veya string literalinden belirli bir kısmı almak için kullanılır.

S06 Ownership bölümünde Copy ve Clone trait'lerinden bahsedilmektedir. Burada Copy ve Clone arasındaki farkı da bilmek gerekir. Bu kavramlar bellekte veri çoğaltma işlemleriyle ilgilidir, ancak işleyişleri ve kullanım alanları farklıdır.

  • Copy
    • Copy özelliği, i32, f64, bool, char gibi küçük ve sabit boyutlu türlerde kullanılır.
    • Bir türün Copy davranışına sahip olması, onun bellekte kopyalanmasının çok hızlı ve maliyetsiz olduğunu da gösterir. (Shallow Copy) işlemi de diyebiliriz.
    • Copy işlemi, sadece basit ve küçük veri türleri için geçerlidir. String veya Vec gibi büyük veri yapıları tutmaya aday yapılar Copy davranışı sergilemezler, çünkü bunların derin kopyalanması (Deep Copy) gerekir.
  • Clone
    • Clone, bir veri yapısının derin kopyasını (Deep Copy) oluşturur. Verinin içeriği kopyalanarak yeni bir alan yaratılır.
    • Clone operasyonu daha maliyetlidir çünkü veri yapısının tamamının kopyalanmasını gerektirir.
    • String ve Vec gibi heap üzerinde veri tutan yapılar Clone trait implementasyonu kullanır (String türünün koduna bakılabilir).

Burada Shallow Copy ile Deep Copy kavramları zaman zaman birbirlerine karıştırılır. Shallow copy tekniğinde verinin sadece yüzeysel kopyalanması söz konusuru. Sadece adres işaretçisi (pointer) veya adres bilgisi kopyalanır. Ancak gösterilen asıl veri (heap'teki veri) kopyalanmaz. Bu durumda, hem orijinal hem de kopyalanan veri yapısı aynı heap alanını işaret eder.

Rust dilinde kullanılan i32, f64, bool, gibi basit türler stack alanında depolandığı için kopyalanmaları shallow copy gibidir keza verinin kendisi doğrudan kopyalanır ve heap'e erişim yoktur.

Deep copy dediğimizde ise verinin tamamının yani hem işaretçilerin hem de heap üzerindeki asıl verinin kopyalanmasını söz konusudur. Bu yeni bir bellek alanı tahsis edilmesi ve orijinal verinin açılan yeni alana tamamen kopyalanması demektir. Çok doğal olarak bunun bir maliyeti vardır. İşlem sonrasında orijinal veri ile kopyalanan veri birbirlerinden bağımsız kullanılabilirler.

Bir String nesnesi oluşturulduğunda, içerik bir vektör olarak karakter seti halinde heap bellek bölgesinde tutulur. Sadece shallow copy yapılırsa birbirine atanan iki string de aynı heap alanını işaret ederdi. Rust dilinde String veri türü Copy trait'ini bilinçli olarak uygulamaz ve bu tip referans eşleşmelerini zaten istemez. Ancak clone() metodu kullanılarak Deep Copy yapılabilir ve heap üzerindeki karakter serisi yeni bir alana kopyalanır.

S07 Struct konusunu işlerken dikkat edilmesi gereken bir kavram karmaşası var. Fonksiyon mu metot mu? Metotlar, fonksiyonlara benzer ancak metotlar esasında bir Struct Context'ine dahildir ve struct ile ilişkilendirilerler.

S14 isimli bölümde package, crate ve module kavramlarına kısaca değiniyoruz. Her uygulama çözümünde olduğu gibi rust tarafından da projelerin organizasyonu mümkün. Aşağıdaki şema bunu desteklemek amacıyla kullanılabilir.

image

Bir e-commerce sisteminin olduğunu düşünelim. Burada birçok işlevi içeren kütüpahenelerimiz bu kütüphaneleri referans olarak alan ve kullanan başka binary'lerimiz olabilir. Bir backend kütüphaneler topluluğu ve bir web uygulaması ya da api servisi olduğunu düşünelim. Klasik senaryo... En dış bloğu workspace olarak düşünebiliriz. Kendi Cargo.toml dosyasını içeren bir klasördür aslında. Diğer projeler (library ve binary türleri) bu workspace altına açılabilir. C# tarafındakiler için Workspace'in bir Solution olarak düşünülebileceğini söylesem sanırım yeterli olacaktır. Workspace aynı zamanda bir Package olarak da yorumlanabilir. Paketler birden fazla kütüphane barındıran toplu çözümlerdir. Crates.io sisteminde bu tip birçok kullanışlı paket yer alır. Bir paket içerisinde yer alan library ve binary'ler birer Crate olarak da düşünülebilir. Crate'ler içerisinde modüller (Modules) ve hatta alt modüller (Sub Modules) yer alır. Çalıştığımız projelerin structure iskeletini görebilmek cargo-modules aracından yararlanabiliriz.

cargo install cargo-modules

# ve örneğin
cargo modules structure --package S14_modules

Bu kullanım aşağıdakine benzer bir çıktı üretir.

image

S18' de ele alınan Smart Pointer konusu ile ilgili bazı notlar;

Pointer bellek üzerindeki bir veri bölgesini işaret eden adres bilgisini taşıyan değişken olduğunu tanımlanabilir.

Farkında olmadan şu ana kadar kullandığımız bir işaretçi de vardır esasında. Birçok yerde & sembolü ile datayı referans ederek kullandığımızı fark etmiş olmalısınız. Smart Pointer'lar ise işaretçilerin taşıdığı adresler bilgilerine ek farklı metadata bilgileri veya kabiliyetler içerirler. Aslında bu konu Rust diline özel bir kavram değildir ve esasen C++ orijinli bir unsurdur. Referanslar (yani & ile kullandığımız değişkenler) veriyi işaret ederken Smart Pointer’ lar genellikle verinin sahipliğini de alır (Sürpriz! String ve Vec türleri smart pointer olarak da geçer zira belli bir bellek adresindeki verinin sahipliğini alırlar ve onu manipüle etmemize izin verirler) * Deref ve Drop* trait’lerini implemente eden struct türleri olarak düşünebiliriz. Bir başka deyişle kendi Smart Pointer modellerimizi tasarlayabiliriz.

Rust standart kütüphanesinde bilinen ve sık kullanılan bazı Smart Pointer yapıları ise sırasıya Box < T > , * Rc < T > ve RefCell < T > orijinli Ref < T > ile RefMut < T > türleridir. Box nesnesi, değişken verisi için Heap' te yer ayrılmasına izin verir. Bunu normal şartlarda stack'e alınan bir veri türü için Heap' te yer ayrılmasına ve işaret edilmesine benzetebiliriz. Ne var ki asıl senaryolar daha farklı olabilir. Örneğin çok büyük bir verinin sahipliğinin taşınırken bu işin kopyalanmadan gerçekleştirilmesini istediğimiz durumlarda işe yarar. Rc işaretçisi birden fazla sahiplik (ownership) imkanı sağlayan ve bu referansları sayan türdendir. Burada sahiplik kalmayıncaya kadar aynı veriyi sahiplenen n sayıda referans olabileceğini ifade edebiliriz. Rust' ın resmi dokümanı bu konuda Tv odası örneğini verir. Televizyon Rc < T >* nesnesidir ve odaya gelen biri televizyonu açar. Odaya gelen diğer insanlar da televizyonu izleyebilir. En son kişi odadan çıkınca da televizyonu kapatır (Ya açık bırakıp giderse : P Olmuyor işte öyle bir şey) Burada Tv sahiplikleri de sayar ve kimse kalmayınca da kapanmış olur bir nevi belleten düşer diyebiliriz.

RefCell < T > türünün senaryosu ise biraz karışık gelebilir zira ödünç alma (borrowing) ilkelerinin derleme zamanı yerine çalışma zamanında (runtime) kullanılmasına olanak tanır. Neden böyle bir şeye ihtiyacımız olsun zira Rust' ın ana felsefesini çalışma zamanında niye kıralım gibi sorular aklımıza düşebilir elbette. Esasında bunun için gerekli senaryolar olur. Örneğin derleme zamanında izin verilmeyen ama memory safe olacağı garanti edilen bazı senaryoları çalışma zamanında işletmenin yolunu açar. Ancakkkk burada dikkat edilmesi gereken bir husus vardır. Herhangi bir ihlal çalışma zamanının panic! lemesine yol açar. Bu konuda Rust resmi kitabı kaynağı neredeyse 1900 yılına dayanan önemli bir problemi örnek gösterir. Dilimize Sonlanma Problemi olarak çevrilen Halting Problem. Bir programın sonsuz döngü halinde sonlanıp sonlanamayacağına karar verememesi gibi özetlenebilir sanıyorum ki ancak an itibariyle beni aşan bir konu. Zira hesaplanabilirlik kuramının bir parçası. Bolca matematik işte.

Smart Pointer kullanımı ile ilgili şöyle bir özet bilgi de verebiliriz.

image

S19' da ele alınmaya başlayan thread kavramı ayrıca Concurrency ve Parallel Programming gibi modellerle de yakın ilişkilidir. Bu noktada Concurrency (Eş Zamanlılık) ve paralel programlama modelleri arasındaki farkları da bilmek gerekir.

Concurrency modelinde temel amaç bir sistemin birden fazla görevi (task) yönetibilmesini veya reaksiyon verebilmesini sağlamaktır. Başlatılan görevler ya da işler aynı anda tamamlanmasa bile sistem sanki hepsini aynı anda çalıştırıyormuş gibi görünebilir. Esasında sistem başlatılan görevler arasında fark edilmeyecek kadar küçük zaman dilimlerinde geçişler yaparak planlı bir işleyişi yerine getirir. Bunu yaparken birden fazla thread kullanımı tekniklerden birisidir ama Event Loop yaklaşımının kullanıldığı da görülmektedir.

Parallel Programming modelinde amaç işlemleri (ya da hesaplamaları) aynı anda gerçekleştirmektir. Ancak bu yapılırken gerçekten de aynı anda çalışan fiziki iş parçacıkları söz konusudur. Dolayısıyla çekirdek sayısı ve buna bağlı kaynaklar (resources) bu metodolojide kilit noktadır. Örneğin büyük bir veri kümesinin sekiz parçaya bölünüp her parçanın bir CPU çekirdeği tarafından işlenmesi buna örnek gösterilebilir. Bu modelde thread'ler fiziksel olarak paralel şekilde çalıştırılır.

Concurrency Parallel Programming
Tanım Birden fazla işin aynı anda başlatılması ve yönetilmesi. Birden fazla işin fiziksel olarak aynı anda gerçekleştirilmesi.
Amaç Görevlerin birbirine karışmadan yönetilmesi. İşlerin gerçekten fiziksel kaynaklar arasında bölünerek hızlandırılması.
Araçlar async/await, Future, tokio, async-std thread::spawn, rayon, veya işlemci çekirdeği bazlı.
Planlama Zamanlayıcı bir araç söz konusudur (tokio gibi). OS veya kütüphane thread'ler üzerinden paralellik sağlar.
Eşzamanlılık İşler sırayla veya birbirine bağımlı olmadan çalışabilir. İşler fiziksel olarak aynı a

Extension points exported contracts — how you extend this code

Payment (Interface)
varsayılan trait kullanımı için bir başka örneği de şöyle yazabiliriz. Bir ödeme davranışımız var. Varsayılan olarak [3 …
S12_traits/src/main.rs
Draw (Interface)
Aşağıdaki örnekte ise Trait Object kullanımı söz konusudur. Bazı durumlarda belli bir Trait'in uygulayıcılarını nesne [3 …
S12_traits/src/main.rs
Service (Interface)
# Bir trait nasıl tanımlanır, nasıl uygulanır? Service isimli trait activate ve deactivate isimli iki fonksiyon tanı [2 …
S12_traits/src/main.rs

Core symbols most depended-on inside this repo

get_discount_amount
called by 6
S16_testing/src/accounting.rs
validate_nickname
called by 4
S16_testing/src/membership.rs
log_any
called by 4
S11_generics/src/main.rs
add
called by 3
S11_generics/src/main.rs
is_prime
called by 3
S22_parallelism/src/main.rs
run
called by 3
S23_asynchronous_programming/src/iot_sample.rs
fetch_sensor_data
called by 3
S23_asynchronous_programming/src/iot_sample.rs
fetch_metrics
called by 3
S23_asynchronous_programming/src/metric_sample.rs

Shape

Function 173
Method 43
Class 39
Enum 12
Interface 3

Languages

Rust99%
TypeScript1%

Modules by API surface

S12_traits/src/main.rs22 symbols
S13_built_in_traits/src/main.rs15 symbols
S10_pattern_matching/src/main.rs14 symbols
S09_enums/src/main.rs11 symbols
S07_structs/src/main.rs10 symbols
S06_ownership/src/main.rs10 symbols
S04_functions/src/main.rs9 symbols
S26_unsafe_coding/src/advanced.rs8 symbols
S16_testing/src/membership.rs8 symbols
S16_testing/src/accounting.rs8 symbols
S25_streams/src/basics.rs7 symbols
S11_generics/src/main.rs7 symbols

For agents

$ claude mcp add rust-training \
  -- python -m otcore.mcp_server <graph>

⬇ download graph artifact