Mert Özen Her Satırda Daha İleri

Blog

Mert Özen'in yazılım geliştirme, backend, frontend ve DevOps üzerine blog yazıları.

Seriler
8 yazı bulundu
Kod Nasıl Çalışır Hâle Gelir: Compiler, Interpreter, JIT ve AOT'nin Haritası
Bilgisayar Bilimi Temelleri SERİ 01

Kod Nasıl Çalışır Hâle Gelir: Compiler, Interpreter, JIT ve AOT'nin Haritası

Derlenen ya da yorumlanan dil diye bir ayrım yok; aynı aşamaların hangisinin build'de, hangisinin çalışma anında yapıldığı implementation'ın seçimi. 1.500 kez çağrılan bir C# method'u JIT tarafından yalnız üç kez derleniyor, TypeScript tipleri build'de kontrol edilip siliniyor, V8 ise kodu önce yorumlayıp sonra Maglev ve TurboFan ile derliyor. Yazı compiler pipeline'ını gerçek çıktılarla gösteriyor ve seri boyunca yazılacak Bookstore filtre dilinin grammar'ını çıkarıyor.

15 Kas 2026 14 dk 3
Lexer Yazmak: Karakterlerden Token'lara, C# ile Bookstore Filtre Dili
Bilgisayar Bilimi Temelleri SERİ 02

Lexer Yazmak: Karakterlerden Token'lara, C# ile Bookstore Filtre Dili

Lexer, karakter dizisini token'lara bölen ve her token'ın satırını ve sütununu bilen bir state machine'dir. Bookstore filtre dili için ReadOnlySpan<char> üzerinde tek geçişte çalışan bir C# lexer'ı yazıyoruz: maximal munch, Türkçe culture'da bozulmayan keyword eşleşmesi, InvariantCulture ile sayı okuma, surrogate pair'e dayanıklı hata kurtarma ve anlaşılır hata mesajları. Regex ile lexer'ın nerede kırıldığını ve Roslyn'in boşlukları neden trivia olarak sakladığını gerçek çıktılarla gösteriyoruz.

15 Kas 2026 14 dk 6
Parser ve AST: Recursive Descent, Operator Precedence ve Pratt Parsing
Bilgisayar Bilimi Temelleri SERİ 03

Parser ve AST: Recursive Descent, Operator Precedence ve Pratt Parsing

Parser, token dizisini precedence ve associativity kurallarına göre tek bir AST'ye çevirir; Pratt parsing bu kuralları method zinciri yerine bir binding power tablosunda tutar. Bookstore filtre dili için grammar'dan recursive descent parser'ı türetiyor, aynı dili Pratt parser ile yazıp iki parser'ın aynı ağacı ürettiğini test ediyor, panic mode ile birden çok hata raporluyor ve AST'yi tree-walking interpreter ile çalıştırıyoruz.

15 Kas 2026 15 dk 9
Semantic Analysis ve Code Generation: Type Checking, Symbol Table ve AST'den Expression Tree'ye
Bilgisayar Bilimi Temelleri SERİ 04

Semantic Analysis ve Code Generation: Type Checking, Symbol Table ve AST'den Expression Tree'ye

Semantic analysis, parse edilmiş ağaçtaki isimleri symbol table'a bağlayıp tipleri kontrol eder; price = "abc" gibi bir hata böylece filtre hiçbir kitaba uygulanmadan yakalanır. Bookstore filtre dili için binder, implicit conversion ve constant folding yazıyor, doğrulanmış ağacı Expression<Func<Book,bool>>'a derleyip hem bellekte çalıştırıyor hem EF Core'un parametreli SQL'e çevirdiğini ToQueryString ile gösteriyoruz; uzunluk sınırının neden gerektiğini ve Roslyn'deki karşılığını da görüyoruz.

15 Kas 2026 16 dk 8
IL ve JIT Compiler: Tiered Compilation, Dynamic PGO, Inlining ve Escape Analysis
Bilgisayar Bilimi Temelleri SERİ 05

IL ve JIT Compiler: Tiered Compilation, Dynamic PGO, Inlining ve Escape Analysis

JIT bir method'u tek seferde değil kademeli derler: önce optimizasyonsuz Tier0, sonra sayaçlı bir kopya, en son toplanan profile göre optimize edilmiş Tier1. Bookstore koduyla IL'in stack tabanlı yapısını, OSR'ı, Dynamic PGO'nun interface çağrısını tip kontrolüyle doğrudan koda çevirmesini, bounds check eliminasyonunu ve .NET 10'un escape analysis'iyle 40 byte'lık allocation'ın sıfıra inmesini DOTNET_JitDisasm çıktılarıyla gösteriyor, V8'in hidden class ve deoptimization'ıyla karşılaştırıyoruz.

15 Kas 2026 19 dk 8
AOT Compilation: ReadyToRun, Native AOT ve Startup ile Throughput Arasındaki Seçim
Bilgisayar Bilimi Temelleri SERİ 06

AOT Compilation: ReadyToRun, Native AOT ve Startup ile Throughput Arasındaki Seçim

Native AOT, makine kodunu publish sırasında üretip startup'ı ve belleği belirgin şekilde azaltır; bedeli trimming, dynamic code yasağı, platforma özel build ve Dynamic PGO'nun yokluğudur. Aynı Bookstore API'sini JIT, ReadyToRun ve Native AOT ile publish edip startup, bellek ve throughput ölçüyor; filtre dilimizin AOT'de verdiği uyarıları, uyarı vermeden 500 dönen trimming hatasını ve Expression.Compile()'ın interpreter'a dönmesinin bedelini gösteriyoruz.

15 Kas 2026 13 dk 10
Garbage Collection Nasıl Çalışır: Mark-Sweep-Compact, Generational GC ve .NET'in Server GC'si
Bilgisayar Bilimi Temelleri SERİ 07

Garbage Collection Nasıl Çalışır: Mark-Sweep-Compact, Generational GC ve .NET'in Server GC'si

Tracing GC, root'lardan ulaşılabilen object'leri işaretleyip gerisini çöp sayar; .NET bu işi generation'lara bölüp write barrier ve card table ile gen0 GC'yi ucuz tutar. Bookstore filtre dilinin interpreter'ının beş saniyede 10 GB allocation ve 1.365 gen0 GC ürettiğini, derlenmiş delegate'in ise hiç GC tetiklemediğini dotnet-counters ve BenchmarkDotNet ile gösteriyor; LOH'u, Workstation, Server GC ve DATAS'ı, gerçek leak ile toplanmamış belleğin farkını ölçüyoruz.

15 Kas 2026 14 dk 10
Programlama Dilleri Nasıl Evrilir: Lisp'ten C#'a Paradigmalar ve Runtime Async'e Uzanan Yol
Bilgisayar Bilimi Temelleri SERİ 08

Programlama Dilleri Nasıl Evrilir: Lisp'ten C#'a Paradigmalar ve Runtime Async'e Uzanan Yol

Dil özellikleri çoğu zaman önce compiler'ın var olan yapılarla taklit ettiği bir hile olarak doğar, yaygınlaşınca runtime onu doğrudan destekler: generic'ler, lambda'lar ve .NET 11'in Runtime Async'i bunun örnekleri. Fortran ve Lisp'ten C#'a kısa bir soy ağacı, paradigmaların C#'ta bir arada kullanımı, static/dynamic ve strong/weak typing, C# ile TypeScript'in nominal ve structural farkı ve Runtime Async ile 13 satırdan 5 satıra inen canlı stack, gerçek çıktılarla.

15 Kas 2026 11 dk 8
Blog Haritası