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
79 yazı bulundu
Rastgelelik Algoritmaları: Fisher–Yates Shuffle, Reservoir Sampling, Weighted Random ve .NET'te Random.Shared, Shuffle, GetItems
Bilgisayar Bilimi Temelleri SERİ 27

Rastgelelik Algoritmaları: Fisher–Yates Shuffle, Reservoir Sampling, Weighted Random ve .NET'te Random.Shared, Shuffle, GetItems

Doğru shuffle Fisher–Yates'tir: her adımda yalnız kalan element'lerden seçer ve n! permütasyonun her birine tek bir yol bırakır. C# ile bias'lı iki yaygın karıştırmayı ölçüyor, reservoir sampling ile akıştan örnek alıyor, kümülatif dizi ve alias method ile ağırlıklı seçim yapıyor, XxHash3 ile kullanıcıya sabit yüzde 10 rollout kuruyor ve thread'ler arasında paylaşılan Random'un bozulduğunu gösterip seriyi kapatıyoruz.

15 Kas 2026 10 dk 7
Probabilistic Data Structure'lar: Bloom Filter, Count-Min Sketch ve HyperLogLog
Bilgisayar Bilimi Temelleri SERİ 26

Probabilistic Data Structure'lar: Bloom Filter, Count-Min Sketch ve HyperLogLog

Probabilistic data structure'lar küçük ve kontrollü bir hata payı karşılığında belleği yüzlerce kat azaltır: Bloom filter "kesinlikle yok / muhtemelen var" der, Count-Min Sketch frekansı fazla sayarak tahmin eder, HyperLogLog tekil sayısını sabit bellekle bulur. C# ile üçünü yazıyor, 1 milyon e-postada 1,14 MB ile yüzde 1,01 false positive, 16 KB ile yüzde 0,8 hatalı tekil ziyaretçi sayısı ölçüyoruz.

15 Kas 2026 10 dk 9
Interval Problemleri ve Sweep Line: Çakışan Aralıklar, Merge Intervals, Monotonic Stack ve Takvim/Slot Senaryoları
Bilgisayar Bilimi Temelleri SERİ 25

Interval Problemleri ve Sweep Line: Çakışan Aralıklar, Merge Intervals, Monotonic Stack ve Takvim/Slot Senaryoları

Aralık problemlerinin çoğu yarı açık [Start, End) tanımıyla, başlangıca göre sıralamayla ve sweep line ile O(n log n)'de çözülür. C# ile çakışma bulma, merge intervals, "aynı anda en fazla kaç" ve boşluk bulmayı yazıyor; dahil son günün gerçek bir kampanya çakışmasını nasıl gizlediğini, monotonic deque ile son 30 günün en düşük fiyatını ve time zone yüzünden aynı teslimatın iki güne düşmesini gösteriyoruz.

15 Kas 2026 11 dk 7
String Arama Algoritmaları: Naive, KMP, Rabin-Karp, Aho-Corasick ve .NET'in IndexOf/SearchValues<string>'i
Bilgisayar Bilimi Temelleri SERİ 24

String Arama Algoritmaları: Naive, KMP, Rabin-Karp, Aho-Corasick ve .NET'in IndexOf/SearchValues<string>'i

Tek pattern için KMP metinde hiç geri dönmeyerek O(n + m) garanti eder; çok pattern için Aho-Corasick trie'ye failure link'ler ekleyip hepsini tek geçişte bulur. C# ile naive, KMP, Rabin-Karp ve Aho-Corasick'i yazıyor, .NET'in vektörize IndexOf'u ve SearchValues<string>'in içindeki Teddy ve Aho-Corasick'le ölçüyor, Türkçe I tuzağını gösteriyoruz.

15 Kas 2026 11 dk 8
LRU ve LFU Cache: Dictionary + LinkedList ile O(1) Eviction ve .NET'teki Hazır Seçenekler
Bilgisayar Bilimi Temelleri SERİ 23

LRU ve LFU Cache: Dictionary + LinkedList ile O(1) Eviction ve .NET'teki Hazır Seçenekler

LRU cache, key'i bulmak için bir Dictionary'yi, kullanım sırasını tutmak için bir LinkedList'i birleştirir; Dictionary node'un kendisini tuttuğu için get ve put O(1) olur. C# ile LRU ve O(1) LFU yazıyor, List tabanlı versiyonun 13 kat yavaşladığını, tarama trafiğinde LRU'nun hit ratio'sunun yüzde 52'ye düştüğünü ve IMemoryCache'in neden bir LRU olmadığını ölçüyoruz.

15 Kas 2026 11 dk 8
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 12
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 12
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 12
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 12
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 11
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 11
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 9
Blog Haritası