{"id":36699,"date":"2025-12-21T20:30:30","date_gmt":"2025-12-21T17:30:30","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/brewing-cappuccino-llvm-ir-olmadan-bir-derleyici-yazmak\/"},"modified":"2025-12-21T20:30:30","modified_gmt":"2025-12-21T17:30:30","slug":"brewing-cappuccino-llvm-ir-olmadan-bir-derleyici-yazmak","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/brewing-cappuccino-llvm-ir-olmadan-bir-derleyici-yazmak\/","title":{"rendered":"Brewing Cappuccino: LLVM IR Olmadan Bir Derleyici Yazmak"},"content":{"rendered":"<h2>Brewing Cappuccino: LLVM IR Olmadan Bir Derleyici Yazmak<\/h2>\n<p>Modern yaz\u0131l\u0131m d\u00fcnyas\u0131nda derleyiciler, y\u00fcksek seviyeli dilleri makine koduna d\u00f6n\u00fc\u015ft\u00fcrerek bilgisayarlar\u0131n anlayabilece\u011fi bir forma sokan temel ara\u00e7lard\u0131r. Bu s\u00fcre\u00e7te genellikle LLVM (Low Level Virtual Machine) projesi ve onun g\u00fc\u00e7l\u00fc ara temsili (IR) \u00f6n plana \u00e7\u0131kar. Ancak, LLVM&#8217;in sundu\u011fu kolayl\u0131klar ve optimizasyon yeteneklerine ra\u011fmen, bazen kendi derleyicimizi LLVM IR&#8217;a ba\u011f\u0131ml\u0131 kalmadan in\u015fa etme ihtiyac\u0131 do\u011fabilir. Bu makalede, LLVM IR&#8217;\u0131n \u00f6tesine ge\u00e7erek, bir derleyiciyi &#8220;s\u0131f\u0131rdan&#8221; in\u015fa etmenin inceliklerini, alternatif ara temsil yakla\u015f\u0131mlar\u0131n\u0131 ve bu &#8220;kendi kahvemizi demleme&#8221; s\u00fcrecinin neden cazip olabilece\u011fini ke\u015ffedece\u011fiz.<\/p>\n<h3>Neden LLVM IR&#8217;dan Vazge\u00e7meli?<\/h3>\n<p>LLVM, modern derleyici altyap\u0131lar\u0131 aras\u0131nda tart\u0131\u015fmas\u0131z bir liderdir ve bir\u00e7ok dilin (Rust, Swift, Clang\/C++ vb.) derleyicisi taraf\u0131ndan kullan\u0131lmaktad\u0131r. Ancak, her projede LLVM IR kullanmak zorunda de\u011filiz ve hatta baz\u0131 durumlarda bu tercih bize fayda sa\u011flayabilir.<\/p>\n<h4>Ba\u011f\u0131ml\u0131l\u0131klar\u0131 Azaltma<\/h4>\n<p>LLVM, b\u00fcy\u00fck ve karma\u015f\u0131k bir projedir. Bir derleyiciyi LLVM ile entegre etmek, bu b\u00fcy\u00fck k\u00fct\u00fcphaneye ba\u011f\u0131ml\u0131l\u0131k olu\u015fturur. Kendi IR&#8217;\u0131m\u0131z\u0131 tasarlamak, projenin ayak izini k\u00fc\u00e7\u00fclt\u00fcr, derleme s\u00fcrelerini azalt\u0131r ve ba\u011f\u0131ml\u0131l\u0131k y\u00f6netimi karma\u015f\u0131kl\u0131\u011f\u0131n\u0131 ortadan kald\u0131r\u0131r. \u00d6zellikle g\u00f6m\u00fcl\u00fc sistemler veya \u00f6zel donan\u0131mlar i\u00e7in derleyiciler geli\u015ftirirken bu ba\u011f\u0131ml\u0131l\u0131klar sorun yaratabilir.<\/p>\n<h4>\u00d6\u011frenme E\u011frisi ve Karma\u015f\u0131kl\u0131k<\/h4>\n<p>LLVM IR&#8217;\u0131 ve onunla birlikte gelen optimizasyon ge\u00e7i\u015flerini anlamak ve etkin bir \u015fekilde kullanmak ciddi bir \u00f6\u011frenme e\u011frisi gerektirir. Derleyici geli\u015ftirmeye yeni ba\u015flayanlar veya daha basit bir dil i\u00e7in derleyici yazmak isteyenler i\u00e7in LLVM&#8217;in t\u00fcm karma\u015f\u0131kl\u0131\u011f\u0131 gereksiz bir y\u00fck olabilir. Kendi IR&#8217;\u0131m\u0131z\u0131 tasarlamak, projenin \u00f6l\u00e7e\u011fini kontrol etmemizi ve sadece ihtiyac\u0131m\u0131z olan \u00f6zelliklere odaklanmam\u0131z\u0131 sa\u011flar.<\/p>\n<h4>\u00d6zelle\u015ftirilmi\u015f Optimizasyon \u0130htiyac\u0131<\/h4>\n<p>LLVM&#8217;in genel ama\u00e7l\u0131 optimizasyonlar\u0131 \u00e7o\u011fu dil i\u00e7in harikad\u0131r. Ancak, \u00e7ok spesifik bir dilin veya hedef mimarinin kendine \u00f6zg\u00fc ihtiya\u00e7lar\u0131 varsa, LLVM&#8217;in sundu\u011fu optimizasyonlar yetersiz kalabilir veya gereksiz yere karma\u015f\u0131k olabilir. Kendi IR&#8217;\u0131m\u0131z\u0131 kullanarak, dilimize ve hedefimize \u00f6zel, daha etkin optimizasyonlar geli\u015ftirebiliriz.<\/p>\n<h4>E\u011fitsel Ama\u00e7lar ve Temel Anlay\u0131\u015f<\/h4>\n<p>Bir derleyiciyi LLVM IR kullanmadan s\u0131f\u0131rdan in\u015fa etmek, derleyici teorisi ve prati\u011fi hakk\u0131nda \u00e7ok daha derin bir anlay\u0131\u015f kazand\u0131r\u0131r. Bu s\u00fcre\u00e7, soyut s\u00f6zdizimi a\u011fa\u00e7lar\u0131ndan (AST) makine koduna kadar her ad\u0131m\u0131n nas\u0131l i\u015fledi\u011fini, ara temsillerin neden gerekli oldu\u011funu ve optimizasyonlar\u0131n nas\u0131l uyguland\u0131\u011f\u0131n\u0131 deneyimleyerek \u00f6\u011frenmek i\u00e7in e\u015fsiz bir f\u0131rsatt\u0131r.<\/p>\n<h3>Derleyici Mimarisine Genel Bak\u0131\u015f<\/h3>\n<p>Bir derleyici genellikle \u00fc\u00e7 ana a\u015famadan olu\u015fur: \u00f6n u\u00e7 (frontend), orta u\u00e7 (mid-end) ve arka u\u00e7 (backend). LLVM IR kullanmasak bile bu temel mimari ge\u00e7erlili\u011fini korur.<\/p>\n<h4>\u00d6n U\u00e7: S\u00f6zdizimsel ve Anlamsal Analiz<\/h4>\n<p>\u00d6n u\u00e7, kaynak kodu al\u0131r ve onu derleyicinin daha kolay i\u015fleyebilece\u011fi bir yap\u0131ya d\u00f6n\u00fc\u015ft\u00fcr\u00fcr.<\/p>\n<ul>\n<li><strong>Lexical Analysis (S\u00f6zc\u00fcksel Analiz):<\/strong> Kaynak kodu token&#8217;lara (belirte\u00e7lere) b\u00f6ler. \u00d6rne\u011fin, <code>int x = 10;<\/code> ifadesi <code>int<\/code>, <code>x<\/code>, <code>=<\/code>, <code>10<\/code>, <code>;<\/code> gibi token&#8217;lara ayr\u0131l\u0131r.<\/li>\n<li><strong>Syntactic Analysis (S\u00f6zdizimsel Analiz):<\/strong> Token&#8217;lar\u0131 kullanarak kaynak kodunun dilin gramer kurallar\u0131na uygun olup olmad\u0131\u011f\u0131n\u0131 kontrol eder ve bir Soyut S\u00f6zdizimi A\u011fac\u0131 (AST) olu\u015fturur. AST, kodun hiyerar\u015fik yap\u0131s\u0131n\u0131 temsil eder.<\/li>\n<li><strong>Semantic Analysis (Anlamsal Analiz):<\/strong> AST \u00fczerinde tip kontrol\u00fc, de\u011fi\u015fken kapsam\u0131 kontrol\u00fc gibi anlamsal kontrolleri yapar. \u00d6rne\u011fin, bir de\u011fi\u015fkene atanmaya \u00e7al\u0131\u015f\u0131lan de\u011ferin tipi ile de\u011fi\u015fkenin tipi uyumlu mu?<\/li>\n<\/ul>\n<h4>Orta U\u00e7: Ara Temsil (IR) Olu\u015fturma ve Optimizasyon<\/h4>\n<p>Orta u\u00e7, \u00f6n u\u00e7tan gelen AST&#8217;yi al\u0131r ve derleyicinin kendi ara temsiline (IR) d\u00f6n\u00fc\u015ft\u00fcr\u00fcr. Bu IR, hedef makineden ba\u011f\u0131ms\u0131zd\u0131r ve \u00fczerinde \u00e7e\u015fitli optimizasyonlar uygulanabilir. LLVM IR bu a\u015famada kullan\u0131lan pop\u00fcler bir IR t\u00fcr\u00fcd\u00fcr, ancak biz kendi IR&#8217;\u0131m\u0131z\u0131 tasarlayaca\u011f\u0131z. Optimizasyonlar, \u00fcretilecek kodun daha h\u0131zl\u0131 ve\/veya daha k\u00fc\u00e7\u00fck olmas\u0131n\u0131 sa\u011flamak i\u00e7in yap\u0131l\u0131r.<\/p>\n<h4>Arka U\u00e7: Kod \u00dcretimi<\/h4>\n<p>Arka u\u00e7, optimize edilmi\u015f IR&#8217;\u0131 al\u0131r ve hedef makine mimarisine \u00f6zel makine koduna (assembly veya ikili kod) d\u00f6n\u00fc\u015ft\u00fcr\u00fcr. Bu a\u015fama, yazma\u00e7 tahsisi, talimat se\u00e7imi ve hedef makinenin \u00f6zelliklerine g\u00f6re kodu d\u00fczenleme gibi g\u00f6revleri i\u00e7erir.<\/p>\n<h3>Alternatif Ara Temsil (IR) Yakla\u015f\u0131mlar\u0131<\/h3>\n<p>LLVM IR&#8217;\u0131n karma\u015f\u0131kl\u0131\u011f\u0131ndan ka\u00e7\u0131nmak istiyorsak, derleyicimizin orta ucu i\u00e7in \u00e7e\u015fitli alternatif IR yakla\u015f\u0131mlar\u0131 mevcuttur.<\/p>\n<h4>Soyut S\u00f6zdizimi A\u011fac\u0131 (AST) Tabanl\u0131 IR<\/h4>\n<p>AST, \u00f6n u\u00e7 taraf\u0131ndan olu\u015fturulan do\u011fal bir ara temsildir. Baz\u0131 basit derleyiciler, AST&#8217;yi do\u011frudan yorumlayarak veya do\u011frudan makine koduna d\u00f6n\u00fc\u015ft\u00fcrerek IR olarak kullanabilir.<\/p>\n<pre><code class=\"language-csharp\">\n\/\/ \u00d6rnek bir AST d\u00fc\u011f\u00fcm\u00fc yap\u0131s\u0131\npublic abstract class AstNode { }\n\npublic class BinaryOperation : AstNode {\n    public AstNode Left { get; set; }\n    public AstNode Right { get; set; }\n    public string Operator { get; set; }\n}\n\npublic class NumberLiteral : AstNode {\n    public int Value { get; set; }\n}\n\npublic class VariableReference : AstNode {\n    public string Name { get; set; }\n}\n<\/pre>\n<p><\/code><br \/>\nAST'nin avantaj\u0131 basitli\u011fi ve kaynak koda yak\u0131nl\u0131\u011f\u0131d\u0131r, ancak optimizasyonlar\u0131 uygulamak genellikle daha zordur.<\/p>\n<h4>\u00dc\u00e7 Adresli Kod (Three-Address Code - TAC)<\/h4>\n<p>TAC, her talimat\u0131n en fazla \u00fc\u00e7 operand (iki kaynak, bir hedef) i\u00e7erdi\u011fi bir ara temsildir. Bu, kodu daha atomik ve optimizasyon i\u00e7in daha uygun hale getirir.<\/p>\n<pre><code class=\"language-plaintext\">\n\/\/ \u00d6rnek TAC\nt1 = b * c\nt2 = a + t1\nx = t2\n<\/pre>\n<p><\/code><br \/>\nTAC, Kontrol Ak\u0131\u015f Grafikleri (CFG) olu\u015fturmak i\u00e7in idealdir ve bir\u00e7ok klasik optimizasyon (ortak alt ifade eleme, d\u00f6ng\u00fc invaryant kodu ta\u015f\u0131ma vb.) TAC \u00fczerinde kolayca uygulanabilir.<\/p>\n<h4>Y\u0131\u011f\u0131n Tabanl\u0131 IR (Stack-Based IR)<\/h4>\n<p>Y\u0131\u011f\u0131n tabanl\u0131 IR'lar, Java Virtual Machine (JVM) bytecode veya .NET Common Intermediate Language (CIL) gibi sanal makinelerde kullan\u0131l\u0131r. \u0130\u015flemler, bir y\u0131\u011f\u0131n \u00fczerinde operandlar\u0131 itme ve \u00e7ekme \u015feklinde ger\u00e7ekle\u015ftirilir.<\/p>\n<pre><code class=\"language-plaintext\">\n\/\/ \u00d6rnek Y\u0131\u011f\u0131n Tabanl\u0131 IR (pseudo-kod)\nPUSH 5\nPUSH 10\nADD       \/\/ Y\u0131\u011f\u0131ndan 10 ve 5'i al\u0131r, toplar (15), sonucu y\u0131\u011f\u0131na iter\nSTORE x   \/\/ Y\u0131\u011f\u0131ndaki 15'i x de\u011fi\u015fkenine atar\n<\/pre>\n<p><\/code><br \/>\nBu t\u00fcr IR'lar, ta\u015f\u0131nabilirlik ve sanal makine tabanl\u0131 y\u00fcr\u00fctme i\u00e7in \u00e7ok uygundur.<\/p>\n<h4>Kontrol Ak\u0131\u015f Grafikleri (Control Flow Graphs - CFG)<\/h4>\n<p>CFG'ler, bir program\u0131n olas\u0131 y\u00fcr\u00fctme yollar\u0131n\u0131 g\u00f6steren grafiksel bir IR'd\u0131r. Her d\u00fc\u011f\u00fcm temel bir bloktur (tek giri\u015f, tek \u00e7\u0131k\u0131\u015fl\u0131 talimat dizisi) ve kenarlar kontrol ak\u0131\u015f\u0131n\u0131 temsil eder. CFG'ler, d\u00f6ng\u00fc optimizasyonlar\u0131 ve veri ak\u0131\u015f\u0131 analizleri i\u00e7in \u00e7ok g\u00fc\u00e7l\u00fcd\u00fcr. Genellikle TAC veya benzeri bir d\u00fc\u015f\u00fck seviyeli IR \u00fczerinden olu\u015fturulurlar.<\/p>\n<h3>Kendi IR'\u0131m\u0131z\u0131 Tasarlamak: \u0130lk Ad\u0131mlar<\/h3>\n<p>Kendi IR'\u0131m\u0131z\u0131 tasarlarken, dilimizin ve hedef mimarimizin ihtiya\u00e7lar\u0131n\u0131 g\u00f6z \u00f6n\u00fcnde bulundurmal\u0131y\u0131z.<\/p>\n<h4>IR'\u0131n Gereksinimleri ve Hedefleri<\/h4>\n<p>IR'\u0131m\u0131z ne kadar soyut olmal\u0131? Hangi veri tiplerini desteklemeli? Ne t\u00fcr kontrol ak\u0131\u015f\u0131 yap\u0131lar\u0131n\u0131 (ko\u015fullu dallanmalar, d\u00f6ng\u00fcler) temsil edebilmeli? Hedef makineye ne kadar yak\u0131n olmal\u0131? Bu sorular\u0131n cevaplar\u0131, IR'\u0131m\u0131z\u0131n tasar\u0131m\u0131n\u0131 \u015fekillendirecektir. Genellikle, IR'\u0131n hedef makineden ba\u011f\u0131ms\u0131z olmas\u0131, ancak ayn\u0131 zamanda makine kodu \u00fcretimi i\u00e7in yeterli detay\u0131 sa\u011flamas\u0131 istenir.<\/p>\n<h4>Basit Bir IR \u00d6rne\u011fi<\/h4>\n<p>Basit bir dil i\u00e7in, TAC benzeri bir IR tasarlayabiliriz. Her talimat bir <code>Instruction<\/code> nesnesi olabilir ve farkl\u0131 talimat t\u00fcrleri i\u00e7in alt s\u0131n\u0131flar olu\u015fturulabilir.<\/p>\n<pre><code class=\"language-csharp\">\n\/\/ Basit bir IR talimat s\u0131n\u0131f\u0131 hiyerar\u015fisi\npublic abstract class IrInstruction { }\n\npublic class AddInstruction : IrInstruction {\n    public IrValue Result { get; set; }\n    public IrValue Left { get; set; }\n    public IrValue Right { get; set; }\n}\n\npublic class StoreInstruction : IrInstruction {\n    public IrValue Target { get; set; }\n    public IrValue Source { get; set; }\n}\n\npublic class LoadInstruction : IrInstruction {\n    public IrValue Target { get; set; }\n    public IrValue Source { get; set; }\n}\n\npublic class LabelInstruction : IrInstruction {\n    public string Name { get; set; }\n}\n\npublic class JumpInstruction : IrInstruction {\n    public string TargetLabel { get; set; }\n}\n\n\/\/ De\u011fi\u015fkenler, sabitler vb. i\u00e7in bir de\u011fer s\u0131n\u0131f\u0131\npublic abstract class IrValue { }\npublic class IrVariable : IrValue { public string Name { get; set; } }\npublic class IrConstant : IrValue { public int Value { get; set; } }\n<\/pre>\n<p><\/code><br \/>\nBu yap\u0131, bir program\u0131n temel i\u015flemlerini temsil etmek i\u00e7in yeterli bir ba\u015flang\u0131\u00e7 noktas\u0131d\u0131r.<\/p>\n<h4>IR Optimizasyonlar\u0131: Temel Teknikler<\/h4>\n<p>Kendi IR'\u0131m\u0131z \u00fczerinde uygulayabilece\u011fimiz baz\u0131 temel optimizasyonlar \u015funlard\u0131r:<\/p>\n<ul>\n<li><strong>Sabit Katlama (Constant Folding):<\/strong> Derleme zaman\u0131nda bilinen sabit ifadelerin de\u011ferini hesaplama. \u00d6rne\u011fin, <code>x = 5 + 3;<\/code> yerine <code>x = 8;<\/code>.<\/li>\n<li><strong>\u00d6l\u00fc Kod Eleme (Dead Code Elimination):<\/strong> Program\u0131n \u00e7al\u0131\u015fmas\u0131n\u0131 etkilemeyen veya hi\u00e7bir zaman eri\u015filemeyen kod bloklar\u0131n\u0131 kald\u0131rma.<\/li>\n<li><strong>Ortak Alt \u0130fade Eleme (Common Subexpression Elimination - CSE):<\/strong> Ayn\u0131 ifadenin birden fazla yerde hesaplanmas\u0131n\u0131 \u00f6nleyerek, sonucu bir de\u011fi\u015fkende saklay\u0131p tekrar kullanma.<\/li>\n<li><strong>D\u00f6ng\u00fc \u0130nvariant Kodu Ta\u015f\u0131ma (Loop Invariant Code Motion - LICM):<\/strong> D\u00f6ng\u00fc i\u00e7inde her iterasyonda ayn\u0131 sonucu veren hesaplamalar\u0131 d\u00f6ng\u00fc d\u0131\u015f\u0131na ta\u015f\u0131ma.<\/li>\n<\/ul>\n<p>Bu optimizasyonlar, \u00fcretilen kodun performans\u0131n\u0131 \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131rabilir.<\/p>\n<h3>Arka U\u00e7 Geli\u015ftirme: Hedef Makine Kodu \u00dcretimi<\/h3>\n<p>IR'\u0131m\u0131z\u0131 tasarlad\u0131ktan ve optimize ettikten sonra s\u0131ra, onu ger\u00e7ek makine koduna d\u00f6n\u00fc\u015ft\u00fcrmeye gelir. Bu, derleyici geli\u015ftirmenin en karma\u015f\u0131k ve makineye ba\u011f\u0131ml\u0131 k\u0131sm\u0131d\u0131r.<\/p>\n<h4>Hedef Mimarinin Se\u00e7imi (x86, ARM, WebAssembly)<\/h4>\n<p>Hangi mimari i\u00e7in kod \u00fcretece\u011fimize karar vermeliyiz. Her mimarinin kendine \u00f6zg\u00fc talimat setleri, yazma\u00e7lar\u0131 ve bellek eri\u015fim modelleri vard\u0131r.<\/p>\n<ul>\n<li><strong>x86\/x64:<\/strong> Masa\u00fcst\u00fc ve sunucu sistemlerinde yayg\u0131n. Karma\u015f\u0131k talimat seti.<\/li>\n<li><strong>ARM:<\/strong> Mobil cihazlar ve g\u00f6m\u00fcl\u00fc sistemlerde yayg\u0131n. Daha basit, RISC tabanl\u0131 talimat seti.<\/li>\n<li><strong>WebAssembly (Wasm):<\/strong> Web taray\u0131c\u0131lar\u0131nda y\u00fcksek performansl\u0131 kod \u00e7al\u0131\u015ft\u0131rmak i\u00e7in tasarlanm\u0131\u015f, ta\u015f\u0131nabilir ikili talimat format\u0131. Sanal bir y\u0131\u011f\u0131n makinesi hedefi.<\/li>\n<\/ul>\n<p>Basit bir ba\u015flang\u0131\u00e7 i\u00e7in, Wasm gibi daha y\u00fcksek seviyeli veya hatta sanal bir makine i\u00e7in kod \u00fcretmek daha kolay olabilir.<\/p>\n<h4>Yazma\u00e7 Tahsisi ve Talimat Se\u00e7imi<\/h4>\n<p>Bu iki g\u00f6rev, arka ucun kalbidir.<\/p>\n<ul>\n<li><strong>Talimat Se\u00e7imi:<\/strong> IR talimatlar\u0131n\u0131 hedef mimarinin e\u015fde\u011fer makine talimatlar\u0131na d\u00f6n\u00fc\u015ft\u00fcrme. \u00d6rne\u011fin, <code>ADD t1, a, b<\/code> IR talimat\u0131 x86'da <code>ADD EAX, EBX<\/code> gibi bir talimata d\u00f6n\u00fc\u015febilir.<\/li>\n<li><strong>Yazma\u00e7 Tahsisi:<\/strong> De\u011fi\u015fkenleri ve ara sonu\u00e7lar\u0131 makinenin s\u0131n\u0131rl\u0131 say\u0131da yazmac\u0131na atama. Bu, karma\u015f\u0131k bir optimizasyon problemidir ve genellikle graf renklendirme algoritmalar\u0131 gibi tekniklerle \u00e7\u00f6z\u00fcl\u00fcr. Yazma\u00e7lar yetersiz kald\u0131\u011f\u0131nda, de\u011fi\u015fkenler belle\u011fe \"ta\u015f\u0131r\u0131l\u0131r\" (spill).<\/li>\n<\/ul>\n<h4>Makine Kodu \u00dcretimi ve Ba\u011flama<\/h4>\n<p>Talimatlar se\u00e7ilip yazma\u00e7lara tahsis edildikten sonra, bunlar hedef mimarinin ikili format\u0131na d\u00f6n\u00fc\u015ft\u00fcr\u00fcl\u00fcr. Bu genellikle bir montajc\u0131 (assembler) kullan\u0131larak veya do\u011frudan ikili talimatlar yaz\u0131larak yap\u0131l\u0131r. Son olarak, \u00fcretilen nesne dosyalar\u0131, standart k\u00fct\u00fcphaneler ve di\u011fer mod\u00fcllerle birlikte bir ba\u011flay\u0131c\u0131 (linker) arac\u0131l\u0131\u011f\u0131yla y\u00fcr\u00fct\u00fclebilir bir program haline getirilir.<\/p>\n<h3>Pratik Uygulamalar ve Zorluklar<\/h3>\n<p>LLVM IR olmadan bir derleyici yazmak heyecan verici olsa da, beraberinde baz\u0131 pratik zorluklar\u0131 da getirir.<\/p>\n<h4>Hata Ay\u0131klama ve Test Etme<\/h4>\n<p>Kendi IR'\u0131n\u0131z\u0131 ve arka ucunuzu geli\u015ftirirken, hatalar\u0131 ay\u0131klamak LLVM gibi olgun bir altyap\u0131ya g\u00f6re daha zor olabilir. IR'\u0131n\u0131zdaki bir hata, nihai makine kodunda anla\u015f\u0131lmas\u0131 g\u00fc\u00e7 bir davran\u0131\u015fa yol a\u00e7abilir. Kapsaml\u0131 bir test paketi ve iyi bir hata ay\u0131klama stratejisi (\u00f6rne\u011fin, IR'\u0131n\u0131z\u0131 metin olarak yazd\u0131rma, ad\u0131m ad\u0131m \u00e7al\u0131\u015ft\u0131rma) kritik \u00f6neme sahiptir.<\/p>\n<h4>Performans Kar\u015f\u0131la\u015ft\u0131rmalar\u0131<\/h4>\n<p>Kendi yazd\u0131\u011f\u0131n\u0131z derleyicinin performans\u0131n\u0131 LLVM tabanl\u0131 derleyicilerle kar\u015f\u0131la\u015ft\u0131rmak, genellikle kendi derleyicinizin daha yava\u015f kod \u00fcretti\u011fini g\u00f6sterecektir. LLVM, y\u0131llarca s\u00fcren optimizasyon \u00e7al\u0131\u015fmalar\u0131 ve binlerce m\u00fchendislik saati ile geli\u015ftirilmi\u015ftir. Kendi derleyicinizin performans\u0131n\u0131 art\u0131rmak i\u00e7in s\u00fcrekli iyile\u015ftirmeler ve derinlemesine optimizasyon bilgisi gerekecektir.<\/p>\n<h4>Topluluk Deste\u011fi ve Kaynaklar<\/h4>\n<p>LLVM'in geni\u015f bir toplulu\u011fu, zengin dok\u00fcmantasyonu ve bir\u00e7ok \u00f6rne\u011fi varken, kendi IR'\u0131n\u0131z\u0131 ve arka ucunuzu geli\u015ftirirken bu t\u00fcr bir deste\u011fe sahip olmayacaks\u0131n\u0131z. Sorunlarla kar\u015f\u0131la\u015ft\u0131\u011f\u0131n\u0131zda \u00e7\u00f6z\u00fcmleri kendiniz bulman\u0131z veya daha genel derleyici teorisi kaynaklar\u0131na ba\u015fvurman\u0131z gerekecektir. Bu, bir yandan ba\u011f\u0131ms\u0131zl\u0131\u011f\u0131 art\u0131r\u0131rken, di\u011fer yandan \u00f6\u011frenme s\u00fcrecini zorla\u015ft\u0131rabilir.<\/p>\n<h3>Sonu\u00e7<\/h3>\n<p>LLVM IR olmadan bir derleyici yazmak, \"kendi cappuccinomuzu demlemek\" gibidir; emek yo\u011fun, zorlu ama bir o kadar da \u00f6d\u00fcllendirici bir s\u00fcre\u00e7tir. Bu yolculuk, derleyici mimarisi, ara temsiller, optimizasyon teknikleri ve hedef makine kodu \u00fcretimi hakk\u0131nda derinlemesine bilgi edinmenizi sa\u011flar. Ba\u011f\u0131ml\u0131l\u0131klar\u0131 azaltma, \u00f6zelle\u015ftirilmi\u015f optimizasyonlar geli\u015ftirme ve e\u011fitsel ama\u00e7lar i\u00e7in bu yakla\u015f\u0131m olduk\u00e7a de\u011ferlidir. Her ne kadar LLVM'in sundu\u011fu kolayl\u0131klar ve performans avantajlar\u0131 inkar edilemez olsa da, kendi derleyicimizi in\u015fa etmek, yaz\u0131l\u0131m\u0131n en temel katmanlar\u0131ndan birini anlama ve kontrol etme yetene\u011fi sunar. Bu deneyim, sizi daha yetkin bir sistem programc\u0131s\u0131 haline getirecek ve karma\u015f\u0131k yaz\u0131l\u0131m projelerine farkl\u0131 bir bak\u0131\u015f a\u00e7\u0131s\u0131 kazand\u0131racakt\u0131r.<\/p>\n<h3>SSS (S\u0131k Sorulan Sorular)<\/h3>\n<h4>1. Kendi IR'\u0131m\u0131 tasarlamak yerine neden mevcut a\u00e7\u0131k kaynakl\u0131 bir IR'\u0131 kullanmayay\u0131m?<\/h4>\n<p>Mevcut a\u00e7\u0131k kaynakl\u0131 IR'lar (\u00f6rne\u011fin, MIR, RTL) genellikle belirli derleyici projeleri veya ara\u015ft\u0131rma ama\u00e7lar\u0131 i\u00e7in tasarlanm\u0131\u015ft\u0131r. Kendi IR'\u0131n\u0131z\u0131 tasarlamak, dilinizin ve hedefinizin benzersiz gereksinimlerine tam olarak uyan, minimal ve optimize edilmi\u015f bir temsil olu\u015fturman\u0131za olanak tan\u0131r. Bu, gereksiz karma\u015f\u0131kl\u0131\u011f\u0131 ortadan kald\u0131rabilir ve \u00f6\u011frenme s\u00fcrecinizi daha do\u011frudan hale getirebilir.<\/p>\n<h4>2. Kendi derleyicimi LLVM'siz yazmak ne kadar s\u00fcrer?<\/h4>\n<p>Bu, dilinizin karma\u015f\u0131kl\u0131\u011f\u0131na, hedef mimarinize ve deneyim seviyenize ba\u011fl\u0131d\u0131r. Basit bir dil ve temel bir arka u\u00e7 i\u00e7in birka\u00e7 hafta veya ay s\u00fcrebilirken, optimizasyonlar ve geli\u015fmi\u015f \u00f6zelliklerle dolu, \u00fcretim kalitesinde bir derleyici y\u0131llar alabilir. LLVM gibi b\u00fcy\u00fck projeler, binlerce m\u00fchendislik y\u0131l\u0131na dayan\u0131r.<\/p>\n<h4>3. Kendi IR'\u0131m\u0131 tasarlarken nelere dikkat etmeliyim?<\/h4>\n<p>IR'\u0131n\u0131z\u0131n hem \u00f6n u\u00e7tan gelen y\u00fcksek seviyeli dil yap\u0131lar\u0131n\u0131 kolayca temsil edebilmesi hem de arka u\u00e7ta makine koduna d\u00f6n\u00fc\u015f\u00fcm\u00fc kolayla\u015ft\u0131racak kadar d\u00fc\u015f\u00fck seviyeli olmas\u0131 aras\u0131nda bir denge bulmal\u0131s\u0131n\u0131z. Ayr\u0131ca, optimizasyonlar\u0131n kolayca uygulanabilece\u011fi bir yap\u0131ya sahip olmas\u0131 \u00f6nemlidir. Ba\u015flang\u0131\u00e7ta basit tutmak ve ihtiya\u00e7 duyulduk\u00e7a geni\u015fletmek iyi bir stratejidir.<\/p>\n<h4>4. Kendi derleyicimi yazmak i\u00e7in hangi programlama dilini kullanmal\u0131y\u0131m?<\/h4>\n<p>Derleyici yazmak i\u00e7in genellikle C++, Rust, Go veya hatta Python gibi diller tercih edilir. C++ ve Rust, performans ve d\u00fc\u015f\u00fck seviyeli kontrol i\u00e7in idealdir. Go, e\u015fzamanl\u0131l\u0131k ve h\u0131zl\u0131 derleme s\u00fcreleri sunar. Python ise prototipleme ve daha y\u00fcksek seviyeli derleyici bile\u015fenleri i\u00e7in kullan\u0131labilir, ancak nihai kod \u00fcretimi i\u00e7in genellikle daha performansl\u0131 bir dil tercih edilir.<\/p>\n","protected":false},"excerpt":{"rendered":"Brewing Cappuccino: LLVM IR Olmadan Bir Derleyici Yazmak\nModern yaz\u0131l\u0131m d\u00fcnyas\u0131nda derleyiciler, y\u00fcksek seviyeli dilleri makine koduna d\u00f6n\u00fc\u015ft\u00fcrerek&#8230;","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1],"tags":[],"class_list":{"0":"post-36699","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-genel","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Brewing Cappuccino: LLVM IR Olmadan Bir Derleyici Yazmak - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/brewing-cappuccino-llvm-ir-olmadan-bir-derleyici-yazmak\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Brewing Cappuccino: LLVM IR Olmadan Bir Derleyici Yazmak\" \/>\n<meta property=\"og:description\" content=\"Brewing Cappuccino: LLVM IR Olmadan Bir Derleyici Yazmak Modern yaz\u0131l\u0131m d\u00fcnyas\u0131nda derleyiciler, y\u00fcksek seviyeli dilleri makine koduna d\u00f6n\u00fc\u015ft\u00fcrerek...\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/brewing-cappuccino-llvm-ir-olmadan-bir-derleyici-yazmak\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-12-21T17:30:30+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"13 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/brewing-cappuccino-llvm-ir-olmadan-bir-derleyici-yazmak\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/brewing-cappuccino-llvm-ir-olmadan-bir-derleyici-yazmak\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Brewing Cappuccino: LLVM IR Olmadan Bir Derleyici Yazmak\",\"datePublished\":\"2025-12-21T17:30:30+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/brewing-cappuccino-llvm-ir-olmadan-bir-derleyici-yazmak\/\"},\"wordCount\":2334,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/brewing-cappuccino-llvm-ir-olmadan-bir-derleyici-yazmak\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/brewing-cappuccino-llvm-ir-olmadan-bir-derleyici-yazmak\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/brewing-cappuccino-llvm-ir-olmadan-bir-derleyici-yazmak\/\",\"name\":\"Brewing Cappuccino: LLVM IR Olmadan Bir Derleyici Yazmak - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-12-21T17:30:30+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/brewing-cappuccino-llvm-ir-olmadan-bir-derleyici-yazmak\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/brewing-cappuccino-llvm-ir-olmadan-bir-derleyici-yazmak\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/brewing-cappuccino-llvm-ir-olmadan-bir-derleyici-yazmak\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Brewing Cappuccino: LLVM IR Olmadan Bir Derleyici Yazmak\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Brewing Cappuccino: LLVM IR Olmadan Bir Derleyici Yazmak - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/brewing-cappuccino-llvm-ir-olmadan-bir-derleyici-yazmak\/","og_locale":"tr_TR","og_type":"article","og_title":"Brewing Cappuccino: LLVM IR Olmadan Bir Derleyici Yazmak","og_description":"Brewing Cappuccino: LLVM IR Olmadan Bir Derleyici Yazmak Modern yaz\u0131l\u0131m d\u00fcnyas\u0131nda derleyiciler, y\u00fcksek seviyeli dilleri makine koduna d\u00f6n\u00fc\u015ft\u00fcrerek...","og_url":"https:\/\/fatihsoysal.com\/blog\/brewing-cappuccino-llvm-ir-olmadan-bir-derleyici-yazmak\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-12-21T17:30:30+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"13 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/brewing-cappuccino-llvm-ir-olmadan-bir-derleyici-yazmak\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/brewing-cappuccino-llvm-ir-olmadan-bir-derleyici-yazmak\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Brewing Cappuccino: LLVM IR Olmadan Bir Derleyici Yazmak","datePublished":"2025-12-21T17:30:30+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/brewing-cappuccino-llvm-ir-olmadan-bir-derleyici-yazmak\/"},"wordCount":2334,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/brewing-cappuccino-llvm-ir-olmadan-bir-derleyici-yazmak\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/brewing-cappuccino-llvm-ir-olmadan-bir-derleyici-yazmak\/","url":"https:\/\/fatihsoysal.com\/blog\/brewing-cappuccino-llvm-ir-olmadan-bir-derleyici-yazmak\/","name":"Brewing Cappuccino: LLVM IR Olmadan Bir Derleyici Yazmak - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-12-21T17:30:30+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/brewing-cappuccino-llvm-ir-olmadan-bir-derleyici-yazmak\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/brewing-cappuccino-llvm-ir-olmadan-bir-derleyici-yazmak\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/brewing-cappuccino-llvm-ir-olmadan-bir-derleyici-yazmak\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Brewing Cappuccino: LLVM IR Olmadan Bir Derleyici Yazmak"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/36699","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=36699"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/36699\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=36699"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=36699"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=36699"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}