{"id":35525,"date":"2025-11-30T18:31:48","date_gmt":"2025-11-30T15:31:48","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/minecraft-modu-canlandirmak-icin-kendi-derleyici-sdk-ve-node-paketimi-yazdim\/"},"modified":"2025-11-30T18:31:48","modified_gmt":"2025-11-30T15:31:48","slug":"minecraft-modu-canlandirmak-icin-kendi-derleyici-sdk-ve-node-paketimi-yazdim","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/minecraft-modu-canlandirmak-icin-kendi-derleyici-sdk-ve-node-paketimi-yazdim\/","title":{"rendered":"Minecraft Modu Canland\u0131rmak \u0130\u00e7in Kendi Derleyici, SDK ve Node Paketimi Yazd\u0131m"},"content":{"rendered":"<p><body><\/p>\n<p>Eski bir Minecraft modunu canland\u0131rmak m\u0131 istiyorsunuz? Kendi derleyici, SDK ve Node.js paketinizi geli\u015ftirerek bu zorlu projeyi teknik ustal\u0131k ve yenilikle dolu bir ba\u015far\u0131 \u00f6yk\u00fcs\u00fcne d\u00f6n\u00fc\u015ft\u00fcrebilirsiniz.<\/p>\n<p>Her \u015fey, bir zamanlar Minecraft d\u00fcnyas\u0131nda pop\u00fcler olan, ancak geli\u015ftiricisi taraf\u0131ndan terk edilmi\u015f bir mod ile ba\u015flad\u0131. Bu mod, d\u00f6nemi i\u00e7in devrim niteli\u011finde \u00f6zelliklere sahipti; fakat Minecraft&#8217;\u0131n s\u00fcrekli g\u00fcncellenen yap\u0131s\u0131, onu h\u0131zla uyumsuz ve kullan\u0131lamaz hale getirmi\u015fti. Modun toplulu\u011fu da\u011f\u0131lm\u0131\u015f, eski s\u00fcr\u00fcmlerde tak\u0131l\u0131 kalm\u0131\u015f ve yeni i\u00e7eriklere hasretti. Bu durum, bende hem bir nostalji hissi uyand\u0131rd\u0131 hem de b\u00fcy\u00fck bir teknik meydan okuma potansiyeli g\u00f6rd\u00fcm. Modu modern Minecraft s\u00fcr\u00fcmlerine ta\u015f\u0131mak, sadece kod g\u00fcncellemesi yapmakla kalmay\u0131p, eski ve k\u0131s\u0131tl\u0131 bir geli\u015ftirme ortam\u0131n\u0131 tamamen yeniden tasarlamay\u0131 gerektirecekti. \u00c7\u00fcnk\u00fc modun orijinal kodu, art\u0131k desteklenmeyen \u00f6zel bir dilde yaz\u0131lm\u0131\u015ft\u0131 ve yeterli geli\u015ftirme kitleri (SDK) veya d\u00fczg\u00fcn bir build s\u00fcreci mevcut de\u011fildi. Bu, sadece bir modun &#8220;uyumlu hale getirilmesi&#8221; projesi olmaktan \u00e7\u0131k\u0131p, s\u0131f\u0131rdan bir ekosistem in\u015fa etme projesine d\u00f6n\u00fc\u015ft\u00fc.<\/p>\n<p>Bu karar, \u00f6ncelikle mevcut sorunlar\u0131 derinlemesine analiz etmemle peki\u015fti. Modun eski kaynak kodunu inceledi\u011fimde, dilin \u00f6zel sentaks\u0131 ve o d\u00f6neme \u00f6zg\u00fc API \u00e7a\u011fr\u0131lar\u0131 nedeniyle do\u011frudan modern bir Java (Minecraft&#8217;\u0131n ana dili) ortam\u0131na \u00e7evrilmesinin imkans\u0131z oldu\u011funu g\u00f6rd\u00fcm. Mevcut ara\u00e7lar yetersizdi ve manuel \u00e7eviri hem zaman al\u0131c\u0131 hem de hataya a\u00e7\u0131kt\u0131. Dahas\u0131, bu modun potansiyelini tam anlam\u0131yla ortaya \u00e7\u0131karmak, sadece onu \u00e7al\u0131\u015ft\u0131rmakla kalmay\u0131p, \u00fczerine yeni \u00f6zellikler eklemeyi ve toplulu\u011fun kendi katk\u0131lar\u0131n\u0131 yapabilmesi i\u00e7in bir zemin olu\u015fturmay\u0131 gerektiriyordu. Bu noktada, kendi derleyicimi yazma fikri belirdi. Bu bana, modun orijinal mant\u0131\u011f\u0131n\u0131 yeni bir dile aktar\u0131rken tam kontrol sa\u011flayacak, geli\u015ftirme s\u00fcrecini otomatikle\u015ftirecek ve gelecekteki geni\u015flemeler i\u00e7in sa\u011flam bir temel atma imkan\u0131 sunacakt\u0131. B\u00f6ylece, sadece bir hata d\u00fczeltmek yerine, modun \u00f6mr\u00fcn\u00fc uzatacak ve onu gelece\u011fe ta\u015f\u0131yacak kapsaml\u0131 bir \u00e7\u00f6z\u00fcm \u00fcretme hedefiyle yola \u00e7\u0131kt\u0131m. Bu s\u00fcre\u00e7, sadece teknik bir ba\u015far\u0131 de\u011fil, ayn\u0131 zamanda yaz\u0131l\u0131m m\u00fchendisli\u011finin temel prensiplerini derinlemesine anlama f\u0131rsat\u0131 da sundu.<\/p>\n<div class=\"expert-tip\">\n  Uzman \u0130pucu: Legacy sistemleri modernize ederken, mevcut kod taban\u0131n\u0131 ba\u015ftan yazmak yerine bir &#8220;transpiler&#8221; (kaynak koddan kaynak koda \u00e7eviren derleyici) veya &#8220;derleyici&#8221; yakla\u015f\u0131m\u0131 izlemek, orijinal mant\u0131\u011f\u0131 korurken modern teknolojilerin avantajlar\u0131ndan faydalanman\u0131z\u0131 sa\u011flar. Bu, \u00f6zellikle b\u00fcy\u00fck ve karma\u015f\u0131k projelerde maliyeti ve hata riskini \u00f6nemli \u00f6l\u00e7\u00fcde azalt\u0131r.\n<\/div>\n<h2>Temel Kavramlar: Derleyici, SDK ve Node.js Paketleri Ne Anlama Geliyor?<\/h2>\n<p>Projenin temelini olu\u015fturan derleyici, SDK ve Node.js paketleri kavramlar\u0131, bu t\u00fcr karma\u015f\u0131k bir modernizasyon \u00e7abas\u0131n\u0131n olmazsa olmazlar\u0131d\u0131r. Bu ara\u00e7lar bir araya geldi\u011finde, eski bir modun kaynak kodunu i\u015flemekten, yeni geli\u015ftiricilere kolayl\u0131k sa\u011flamaya ve t\u00fcm s\u00fcreci otomatikle\u015ftirmeye kadar geni\u015f bir yelpazede \u00e7\u00f6z\u00fcm sunar.<\/p>\n<h3>Bir Derleyici Ne Yapar ve Neden \u00d6nemlidir?<\/h3>\n<p>Bir derleyici, yaz\u0131lan kaynak kodu (insanlar\u0131n anlayabilece\u011fi bir programlama dili) al\u0131p, bilgisayar\u0131n do\u011frudan \u00e7al\u0131\u015ft\u0131rabilece\u011fi makine koduna veya ba\u015fka bir programlama diline (transpiler durumunda) d\u00f6n\u00fc\u015ft\u00fcren bir yaz\u0131l\u0131md\u0131r. Benim durumumda, eski modun orijinal dilinden modern Java bytecode&#8217;\u0131na d\u00f6n\u00fc\u015f\u00fcm\u00fcn\u00fc sa\u011flayacak bir derleyiciye ihtiyac\u0131m vard\u0131. Bu s\u00fcre\u00e7 genellikle lexer, parser, semantik analizci ve kod \u00fcreticisi ad\u0131mlar\u0131n\u0131 i\u00e7erir. Kendi derleyicimi yazmak, eski dilin her bir \u00f6zelli\u011fini yeni platformun gereksinimlerine g\u00f6re \u00f6zel olarak e\u015fle\u015ftirme ve \u00e7evirme esnekli\u011fi sa\u011flad\u0131. Bu, mevcut modun tam i\u015flevselli\u011fini korurken, modern Java&#8217;n\u0131n g\u00fcvenlik, performans ve geli\u015ftirme kolayl\u0131\u011f\u0131 gibi avantajlar\u0131ndan faydalanmama olanak tan\u0131d\u0131.<\/p>\n<h3>SDK (Yaz\u0131l\u0131m Geli\u015ftirme Kiti) Geli\u015ftiriciye Nas\u0131l G\u00fc\u00e7 Katar?<\/h3>\n<p>Bir SDK, yaz\u0131l\u0131m geli\u015ftiricilerin belirli bir platform i\u00e7in uygulama olu\u015fturmas\u0131n\u0131 kolayla\u015ft\u0131ran bir dizi ara\u00e7, k\u00fct\u00fcphane, \u00f6rnek kod, dok\u00fcmantasyon ve API (Uygulama Programlama Aray\u00fcz\u00fc) setidir. Benim projemde SDK geli\u015ftirmek, modun sadece &#8220;\u00e7al\u0131\u015fmas\u0131n\u0131&#8221; sa\u011flamakla kalmay\u0131p, ayn\u0131 zamanda di\u011fer geli\u015ftiricilerin mod \u00fczerinde kolayca eklentiler yazmas\u0131n\u0131, yeni \u00f6zellikler geli\u015ftirmesini ve mevcut kodu geni\u015fletmesini m\u00fcmk\u00fcn k\u0131ld\u0131. Bu kit; API k\u00fct\u00fcphaneleri, \u00f6rnek kodlar, kapsaml\u0131 dok\u00fcmantasyon ve yard\u0131mc\u0131 ara\u00e7lar gibi bile\u015fenleri i\u00e7erir. Etkili bir SDK, geli\u015ftirici deneyimini (DX) \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131r\u0131r, b\u00f6ylece mod toplulu\u011funun canlanmas\u0131na ve b\u00fcy\u00fcmesine katk\u0131da bulunur.<\/p>\n<h3>Node.js Paketleri ile Otomasyon ve Mod\u00fclerlik Nas\u0131l Sa\u011flan\u0131r?<\/h3>\n<p>Node.js paketleri, JavaScript tabanl\u0131 ara\u00e7lar ve k\u00fct\u00fcphaneler sunarak modern geli\u015ftirme s\u00fcre\u00e7lerinin otomasyonu i\u00e7in vazge\u00e7ilmezdir. Benim projemde, bir Node.js paketi olu\u015fturmak, derleme, test etme, paketleme ve da\u011f\u0131t\u0131m gibi tekrarlayan g\u00f6revleri otomatikle\u015ftirmeme olanak tan\u0131d\u0131. Bu paket, genellikle bir CLI (Komut Sat\u0131r\u0131 Aray\u00fcz\u00fc) arac\u0131 olarak i\u015flev g\u00f6r\u00fcr ve geli\u015ftiricilere projeyi y\u00f6netmeleri i\u00e7in basit komutlar sunar. Build otomasyonu, ba\u011f\u0131ml\u0131l\u0131k y\u00f6netimi, test otomasyonu ve da\u011f\u0131t\u0131m gibi faydalar sunar. K\u0131sacas\u0131, derleyici modun kalbini, SDK damarlar\u0131n\u0131, Node.js paketi ise sinir sistemini olu\u015fturarak bu \u00fc\u00e7l\u00fc, modun modern bir ekosistemde yeniden hayat bulmas\u0131n\u0131 sa\u011flam\u0131\u015ft\u0131r.<\/p>\n<h2>Vaka \u00c7al\u0131\u015fmas\u0131: Minecraft Modunun Sorunlar\u0131 ve \u00c7\u00f6z\u00fcm Aray\u0131\u015f\u0131<\/h2>\n<p>Projenin ba\u015flang\u0131\u00e7 noktas\u0131n\u0131, terk edilmi\u015f Minecraft modunun derinlemesine bir analizi olu\u015fturdu. Bu analiz, modun neden ba\u015far\u0131s\u0131z oldu\u011funu, hangi teknik bor\u00e7lar\u0131 ta\u015f\u0131d\u0131\u011f\u0131n\u0131 ve modernizasyon s\u00fcrecinde hangi zorluklarla kar\u015f\u0131la\u015faca\u011f\u0131m\u0131 netle\u015ftirdi. Elde etti\u011fim bulgular, kendi derleyicimi, SDK&#8217;m\u0131 ve Node.js paketimi geli\u015ftirme karar\u0131m\u0131 peki\u015ftirdi.<\/p>\n<h3>Modun Kar\u015f\u0131la\u015ft\u0131\u011f\u0131 Temel Zorluklar Nelerdi?<\/h3>\n<p>Mod, 2012-2014 y\u0131llar\u0131 aras\u0131nda pop\u00fcler olan bir Minecraft s\u00fcr\u00fcm\u00fc i\u00e7in geli\u015ftirilmi\u015fti. O d\u00f6nemdeki Java ekosistemi ve Minecraft&#8217;\u0131n i\u00e7 API&#8217;leri bug\u00fcnk\u00fc standartlardan olduk\u00e7a farkl\u0131yd\u0131. Kar\u015f\u0131la\u015ft\u0131\u011f\u0131m ba\u015fl\u0131ca sorunlar \u015funlard\u0131: Eski programlama dili (\u00f6zel bir DSL) ve versiyonu, modern Java s\u00fcr\u00fcmleriyle uyumsuzluk; Minecraft&#8217;\u0131n s\u00fcrekli de\u011fi\u015fen API&#8217;leri nedeniyle olu\u015fan uyumluluk sorunlar\u0131; geli\u015ftirme ara\u00e7lar\u0131n\u0131n (otomatik tamamlama, hata ay\u0131klama) eksikli\u011fi; eski kodun neden oldu\u011fu performans darbo\u011fazlar\u0131 ve modun i\u00e7 i\u015fleyi\u015fi hakk\u0131nda neredeyse hi\u00e7 dok\u00fcmantasyonun olmamas\u0131. Bu zorluklar, sadece modun \u00e7al\u0131\u015f\u0131r hale getirilmesi i\u00e7in de\u011fil, ayn\u0131 zamanda gelecekte s\u00fcrd\u00fcr\u00fclebilir bir \u015fekilde geli\u015ftirilebilmesi i\u00e7in radikal bir \u00e7\u00f6z\u00fcm gerektirdi\u011fini g\u00f6sterdi.<\/p>\n<h3>Modernizasyon S\u00fcrecinin Yol Haritas\u0131: Hedefler Belirlemek<\/h3>\n<p>Bu zorluklar\u0131 g\u00f6z \u00f6n\u00fcnde bulundurarak, projenin ana hedeflerini ve yol haritas\u0131n\u0131 belirledim: \u00d6ncelikle, eski DSL&#8217;yi modun orijinal mant\u0131\u011f\u0131n\u0131 koruyarak modern Java&#8217;ya \u00e7evirmek; ikincisi, di\u011fer geli\u015ftiricilerin moda kolayca katk\u0131da bulunmas\u0131n\u0131 sa\u011flamak i\u00e7in modern bir API, k\u00fct\u00fcphaneler, ara\u00e7lar ve eksiksiz dok\u00fcmantasyon i\u00e7eren kapsaml\u0131 bir SDK olu\u015fturmak; \u00fc\u00e7\u00fcnc\u00fcs\u00fc, geli\u015ftirme, test ve da\u011f\u0131t\u0131m d\u00f6ng\u00fclerini h\u0131zland\u0131rmak ve standartla\u015ft\u0131rmak i\u00e7in bir Node.js paketi arac\u0131l\u0131\u011f\u0131yla otomasyon sa\u011flamak; d\u00f6rd\u00fcnc\u00fcs\u00fc, \u00e7eviri ve entegrasyon s\u0131ras\u0131nda performans\u0131 iyile\u015ftirecek f\u0131rsatlar\u0131 de\u011ferlendirmek; son olarak da, projeyi a\u00e7\u0131k kaynak yaparak, di\u011fer geli\u015ftiricilerin modun gelece\u011fine y\u00f6n vermesine izin vermekti. Bu hedefler, projenin sadece teknik bir egzersiz olmaktan \u00f6te, terk edilmi\u015f bir yaz\u0131l\u0131m\u0131n potansiyelini yeniden ortaya \u00e7\u0131karan ve bir toplulu\u011fu yeniden bir araya getiren bir \u00e7aba oldu\u011funu g\u00f6sterdi.<\/p>\n<h2>Kendi Derleyicimi Geli\u015ftirme Maceras\u0131: Ad\u0131m Ad\u0131m Bir Dil Yaratmak<\/h2>\n<p>Minecraft modunu modern d\u00fcnyaya ta\u015f\u0131mak i\u00e7in att\u0131\u011f\u0131m en cesur ad\u0131mlardan biri, modun eski \u00f6zel dilini modern Java&#8217;ya \u00e7evirecek kendi derleyicimi yazmakt\u0131. Bu s\u00fcre\u00e7, sadece teknik bir gereklilik de\u011fil, ayn\u0131 zamanda bilgisayar bilimlerinin derinliklerine inen, olduk\u00e7a \u00f6\u011fretici bir macerayd\u0131.<\/p>\n<h3>Derleyici Tasar\u0131m\u0131 \u0130\u00e7in Hangi Ara\u00e7lar\u0131 Se\u00e7tim?<\/h3>\n<p>Derleyici geli\u015ftirme karma\u015f\u0131k bir s\u00fcre\u00e7tir ve do\u011fru ara\u00e7 se\u00e7imi hayati \u00f6nem ta\u015f\u0131r. Ben, bu s\u00fcre\u00e7te esneklik ve tam kontrol sa\u011flamak ad\u0131na kendi lexer ve parser&#8217;\u0131m\u0131 Java ile s\u0131f\u0131rdan yazd\u0131m. Bu, modun eski DSL&#8217;sinin \u00f6zg\u00fcn yap\u0131s\u0131n\u0131 daha iyi anlamam\u0131 ve \u00e7eviri s\u00fcrecini en ince ayr\u0131nt\u0131s\u0131na kadar kontrol etmemi sa\u011flad\u0131. Hedef dil olarak Java&#8217;y\u0131 se\u00e7memin nedeni, Minecraft&#8217;\u0131n Java tabanl\u0131 olmas\u0131 ve Java ekosisteminin sundu\u011fu g\u00fc\u00e7l\u00fc k\u00fct\u00fcphaneler ve sanal makine (JVM) optimizasyonlar\u0131yd\u0131. Geli\u015ftirme ortam\u0131 olarak JetBrains IntelliJ IDEA&#8217;y\u0131, ba\u011f\u0131ml\u0131l\u0131k y\u00f6netimi i\u00e7in ise Apache Maven&#8217;\u0131 kulland\u0131m. Bu ara\u00e7lar, derleyicinin kaynak kodunu d\u00fczenlerken, test ederken ve sonras\u0131nda SDK&#8217;y\u0131 olu\u015ftururken kritik rol oynad\u0131.<\/p>\n<h3>Kaynak Koddan Hedef Koda: Lexing, Parsing ve Semantik Analiz<\/h3>\n<p>Derleyici s\u00fcrecinin ilk a\u015famas\u0131 olan &#8220;lexing&#8221; (token&#8217;lara ay\u0131rma) ile ba\u015flad\u0131m. Eski DSL&#8217;nin anahtar kelimelerini, operat\u00f6rlerini, tan\u0131mlay\u0131c\u0131lar\u0131n\u0131 ve de\u011fi\u015fmezlerini tan\u0131yan d\u00fczenli ifadeler kullanarak bir lexer olu\u015fturdum. Bu lexer, kaynak kodu bir dizi token&#8217;a d\u00f6n\u00fc\u015ft\u00fcrd\u00fc. \u00d6rne\u011fin, eski dildeki bir &#8216;oyuncu.teleport(x, y, z)&#8217; ifadesi, &#8216;oyuncu&#8217;, &#8216;.&#8217;, &#8216;teleport&#8217;, &#8216;(&#8216;, &#8216;x&#8217;, &#8216;,&#8217;, &#8216;y&#8217;, &#8216;,&#8217;, &#8216;z&#8217;, &#8216;)&#8217; gibi token&#8217;lara ayr\u0131ld\u0131. Lexing&#8217;den sonra, bu token dizisini i\u015fleyecek bir &#8220;parser&#8221; geli\u015ftirdim. Parser, eski DSL&#8217;nin gramer kurallar\u0131na g\u00f6re bir Soyut S\u00f6zdizimi A\u011fac\u0131 (AST) olu\u015fturdu. Bu AST, program\u0131n hiyerar\u015fik yap\u0131s\u0131n\u0131 temsil eder. Ard\u0131ndan, AST \u00fczerinde semantik analiz ger\u00e7ekle\u015ftirdim; de\u011fi\u015fkenlerin tan\u0131mlan\u0131p tan\u0131mlanmad\u0131\u011f\u0131, tip uyumluluklar\u0131 gibi dilin anlamsal kurallar\u0131 kontrol edildi.<\/p>\n<pre><code class=\"language-java\">\n\/\/ Basit bir Lexer token tan\u0131m\u0131 \u00f6rne\u011fi\npublic enum TokenType {\n    KEYWORD, IDENTIFIER, NUMBER, OPERATOR, PAREN_OPEN, PAREN_CLOSE, COMMA, EOF\n}\n\npublic class Token {\n    public TokenType type;\n    public String value;\n    \/\/ ...\n}\n<\/pre>\n<p><\/code><\/p>\n<h3>Kod \u00dcretimi ve Hedef Platform Entegrasyonu<\/h3>\n<p>Derleyicinin son ve en kritik a\u015famas\u0131, AST'yi hedef dile, yani modern Java'ya \u00e7evirmekti. Bu a\u015famada, her AST d\u00fc\u011f\u00fcm\u00fc, kar\u015f\u0131l\u0131k gelen Java koduna d\u00f6n\u00fc\u015ft\u00fcr\u00fcld\u00fc. Eski DSL'deki \u00f6zel Minecraft API \u00e7a\u011fr\u0131lar\u0131, Fabric API veya Sponge API gibi modern Minecraft modlama k\u00fct\u00fcphanelerinin e\u015fde\u011fer Java \u00e7a\u011fr\u0131lar\u0131na d\u00f6n\u00fc\u015ft\u00fcr\u00fcld\u00fc. \u00d6rne\u011fin, eski bir 'blok.yerle\u015ftir(x, y, z, id)' \u00e7a\u011fr\u0131s\u0131, modern Fabric API'sindeki 'world.setBlockState(new BlockPos(x, y, z), Blocks.STONE.getDefaultState())' gibi bir ifadeye \u00e7evrildi. Bu d\u00f6n\u00fc\u015f\u00fcm s\u0131ras\u0131nda, performans\u0131 art\u0131rmak i\u00e7in baz\u0131 optimizasyonlar da uygulad\u0131m, \u00f6rne\u011fin gereksiz nesne olu\u015fturmalar\u0131n\u0131 azaltmak. Bu s\u00fcre\u00e7, eski modun \u00e7ekirdek mant\u0131\u011f\u0131n\u0131 kaybetmeden, onu tamamen yeni bir altyap\u0131ya ta\u015f\u0131man\u0131n anahtar\u0131 oldu. Kendi derleyicimi yazmak, sadece bir modun canlanmas\u0131n\u0131 sa\u011flamakla kalmad\u0131, ayn\u0131 zamanda bilgisayar bilimleri alan\u0131ndaki bilgi birikimimi de \u00f6nemli \u00f6l\u00e7\u00fcde derinle\u015ftirdi.<\/p>\n<pre><code class=\"language-java\">\n\/\/ \u00d6rnek bir AST d\u00fc\u011f\u00fcm\u00fcnden Java kodu \u00fcretimi par\u00e7ac\u0131\u011f\u0131\npublic class CodeGenerator {\n    private StringBuilder output = new StringBuilder();\n\n    public String generate(ASTNode node) {\n        \/\/ node t\u00fcr\u00fcne g\u00f6re uygun Java kodunu output'a ekler\n        if (node instanceof MethodCallNode) {\n            MethodCallNode mcNode = (MethodCallNode) node;\n            if (mcNode.getMethodName().equals(\"sendMessage\")) {\n                output.append(mcNode.getTarget().toJavaCode())\n                      .append(\".sendMessage(net.minecraft.text.Text.of(\")\n                      .append(mcNode.getArguments().get(0).toJavaCode())\n                      .append(\"));\\n\");\n            }\n        }\n        \/\/ ... di\u011fer node t\u00fcrleri i\u00e7in kod \u00fcretimi\n        return output.toString();\n    }\n}\n<\/pre>\n<p><\/code><\/p>\n<h2>SDK Geli\u015ftirme: Modun API'sini Tasarlamak ve Geli\u015ftiriciyi Desteklemek<\/h2>\n<p>Bir derleyici ile eski modun kaynak kodunu modern Java'ya \u00e7evirmek b\u00fcy\u00fck bir ad\u0131md\u0131, ancak bu, projenin sadece yar\u0131s\u0131yd\u0131. Modun ger\u00e7ek potansiyelini ortaya \u00e7\u0131karmak ve toplulu\u011fun kat\u0131l\u0131m\u0131n\u0131 te\u015fvik etmek i\u00e7in g\u00fc\u00e7l\u00fc ve kullan\u0131c\u0131 dostu bir Yaz\u0131l\u0131m Geli\u015ftirme Kiti (SDK) olu\u015fturmak hayati \u00f6nem ta\u015f\u0131yordu. Bu SDK, modun etraf\u0131nda canl\u0131 bir ekosistem in\u015fa etmenin anahtar\u0131yd\u0131.<\/p>\n<h3>Mod Geli\u015ftiricileri \u0130\u00e7in Kullan\u0131\u015fl\u0131 Bir API Nas\u0131l Olu\u015fturulur?<\/h3>\n<p>SDK'n\u0131n kalbini, modun temel i\u015flevselli\u011fine eri\u015fim sa\u011flayan bir API olu\u015fturdu. Bu API'yi tasarlarken, basitlik ve anla\u015f\u0131l\u0131rl\u0131k, mod\u00fclerlik ve geni\u015fletilebilirlik prensiplerine odakland\u0131m. S\u0131k\u00e7a kullan\u0131lan i\u015flevler i\u00e7in sezgisel isimler ve basit metod imzalar\u0131 kulland\u0131m (\u00f6rn: 'player.getInventory()'). API'yi mant\u0131ksal olarak ayr\u0131lm\u0131\u015f mod\u00fcllere b\u00f6ld\u00fcm ('WorldAPI', 'PlayerAPI') ve gelecekteki \u00f6zelliklerin kolayca eklenebilmesi i\u00e7in esnek bir tasar\u0131m benimsedim. Event tabanl\u0131 bir sistem kurarak, geli\u015ftiricilerin modun \u00e7e\u015fitli olaylar\u0131na (blok yerle\u015ftirme, oyuncu \u00f6l\u00fcm\u00fc vb.) kendi eklentilerini veya davran\u0131\u015flar\u0131n\u0131 ba\u011flamas\u0131na imkan tan\u0131d\u0131m.<\/p>\n<pre><code class=\"language-java\">\n\/\/ \u00d6rnek bir Event API'si par\u00e7ac\u0131\u011f\u0131\npublic class WorldEvents {\n    public static final Event<BlockPlaceCallback> onBlockPlace = new EventImpl<>();\n\n    @FunctionalInterface\n    public interface BlockPlaceCallback {\n        void onBlockPlace(Player player, Block block, BlockPos pos);\n    }\n}\n<\/pre>\n<p><\/code><\/p>\n<h3>Ara\u00e7 Deste\u011fi ve Dok\u00fcmantasyonun \u00d6nemi<\/h3>\n<p>Harika bir API, eksiksiz ara\u00e7 deste\u011fi ve dok\u00fcmantasyon olmadan tam potansiyeline ula\u015famaz. Bu nedenle, SDK'y\u0131 geli\u015ftirirken \u015funlara b\u00fcy\u00fck \u00f6nem verdim: Modern Java IDE'leri i\u00e7in otomatik tamamlama, tip kontrol\u00fc ve refactoring deste\u011fi sa\u011flad\u0131m. Geli\u015ftiricilerin mod i\u00e7indeki hatalar\u0131 kolayca tespit etmesi ve d\u00fczeltmesi i\u00e7in g\u00fc\u00e7l\u00fc hata ay\u0131klama yetenekleri sundum. Her s\u0131n\u0131f, metod ve parametre i\u00e7in Javadoc ile zenginle\u015ftirilmi\u015f, anla\u015f\u0131l\u0131r ve g\u00fcncel belgeler olu\u015fturdum. Ayr\u0131ca, yeni ba\u015flayanlar i\u00e7in ad\u0131m ad\u0131m rehberler ve \u00f6rnek kodlar i\u00e7eren ayr\u0131 bir web tabanl\u0131 dok\u00fcmantasyon portal\u0131 haz\u0131rlad\u0131m. Bu sayede, modun sadece \"\u00e7al\u0131\u015fmas\u0131n\u0131\" de\u011fil, ayn\u0131 zamanda etraf\u0131nda canl\u0131, kat\u0131l\u0131mc\u0131 bir geli\u015ftirici toplulu\u011fu olu\u015fturmas\u0131n\u0131 da hedefledim.<\/p>\n<h3>Mobil Uyumlu Geli\u015ftirme Deneyimi \u0130\u00e7in \u0130pu\u00e7lar\u0131<\/h3>\n<p>Geli\u015ftirme deneyimini (DX) art\u0131rmak sadece kodla ilgili de\u011fildir; ayn\u0131 zamanda geli\u015ftiricilerin bilgiye nas\u0131l eri\u015fti\u011fi ve ara\u00e7lar\u0131 nas\u0131l kulland\u0131\u011f\u0131yla da ilgilidir. SDK'n\u0131n web tabanl\u0131 dok\u00fcmantasyonunu tasarlarken, mobil cihazlardan eri\u015fimin de kolay olmas\u0131n\u0131 sa\u011flad\u0131m. Bu, geli\u015ftiricilerin bir tablet veya ak\u0131ll\u0131 telefondan bile h\u0131zl\u0131ca bir API referans\u0131na bakabilmesini veya bir rehberi okuyabilmesini sa\u011flar. HTML ve CSS kullanarak basit ama etkili bir responsif tasar\u0131m uygulad\u0131m:<\/p>\n<pre><code class=\"language-html\">\n<style>\n  \/* Genel stil *\/\n  body { font-family: sans-serif; margin: 20px; }\n  .container { max-width: 960px; margin: 0 auto; padding: 15px; }\n\n  \/* Mobil cihazlar i\u00e7in stil *\/\n  @media (max-width: 768px) {\n    .container { padding: 10px; }\n    h2 { font-size: 1.5em; }\n    p { font-size: 0.9em; }\n  }\n<\/style>\n<div class=\"container\">\n  <h2>SDK Dok\u00fcmantasyonu<\/h2>\n  <p>Bu b\u00f6l\u00fcmde SDK'n\u0131n nas\u0131l kullan\u0131laca\u011f\u0131na dair detayl\u0131 bilgiler bulunmaktad\u0131r.<\/p>\n<\/div>\n<\/pre>\n<p><\/code><\/p>\n<p>Bu yakla\u015f\u0131m, SDK'm\u0131n sadece i\u015flevsel de\u011fil, ayn\u0131 zamanda kullan\u0131m kolayl\u0131\u011f\u0131 ve eri\u015filebilirlik a\u00e7\u0131s\u0131ndan da modern standartlara uygun olmas\u0131n\u0131 sa\u011flad\u0131.<\/p>\n<h2>Node.js Paketi \u0130le Mod Geli\u015ftirme Ak\u0131\u015f\u0131n\u0131 Otomatikle\u015ftirmek<\/h2>\n<p>Bir derleyici ve kapsaml\u0131 bir SDK olu\u015fturmak, modun teknik altyap\u0131s\u0131n\u0131 modernize etmenin temelini atm\u0131\u015ft\u0131. Ancak, geli\u015ftirme s\u00fcrecinin kendisi h\u00e2l\u00e2 manuel ad\u0131mlar, tekrarlayan g\u00f6revler ve potansiyel hatalarla doluydu. Bu noktada, Node.js ekosisteminin g\u00fcc\u00fcnden faydalanarak bir komut sat\u0131r\u0131 arac\u0131 (CLI) \u015feklinde \u00f6zel bir Node.js paketi geli\u015ftirdim. Bu paket, mod geli\u015ftirme ak\u0131\u015f\u0131n\u0131 tamamen otomatikle\u015ftirmeyi ve geli\u015ftiricilerin hayat\u0131n\u0131 kolayla\u015ft\u0131rmay\u0131 hedefliyordu.<\/p>\n<h3>Neden Bir Node.js Paketi ve Hangi Sorunlar\u0131 \u00c7\u00f6zd\u00fc?<\/h3>\n<p>Node.js, sunucu taraf\u0131 JavaScript \u00e7al\u0131\u015ft\u0131rma ortam\u0131 olarak bilinse de, \u00f6zellikle CLI ara\u00e7lar\u0131 ve build sistemleri olu\u015fturmak i\u00e7in inan\u0131lmaz derecede g\u00fc\u00e7l\u00fcd\u00fcr. JavaScript'in yayg\u0131nl\u0131\u011f\u0131 ve npm (Node Package Manager) ekosisteminin zenginli\u011fi, bu paketi geli\u015ftirmem i\u00e7in ideal bir platform haline getirdi. Geli\u015ftirdi\u011fim Node.js paketi, karma\u015f\u0131k derleme s\u00fcre\u00e7lerini basitle\u015ftirdi, modun ve geli\u015ftirme ortam\u0131n\u0131n ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 tek merkezden y\u00f6netilebilir hale getirdi, yeni bir geli\u015ftiricinin projeye ba\u015flamas\u0131 i\u00e7in gerekli t\u00fcm ba\u011f\u0131ml\u0131l\u0131klar\u0131 ve ara\u00e7lar\u0131 otomatik olarak kuran bir komut ekleyerek geli\u015ftirme ortam\u0131 kurulumunu kolayla\u015ft\u0131rd\u0131 ve farkl\u0131 geli\u015ftiricilerin farkl\u0131 build \u00e7\u0131kt\u0131lar\u0131 \u00fcretmesi riskini ortadan kald\u0131rarak tutarl\u0131 build \u00e7\u0131kt\u0131lar\u0131 sa\u011flad\u0131. Bu sayede, geli\u015ftirme s\u00fcreci daha verimli ve hatas\u0131z hale geldi.<\/p>\n<h3>CLI Ara\u00e7lar\u0131 ve Geli\u015ftirme S\u00fcre\u00e7lerinin Optimize Edilmesi<\/h3>\n<p>Node.js paketi, <code>mcmod-cli<\/code> ad\u0131yla bir komut sat\u0131r\u0131 arac\u0131 olarak tasarland\u0131. Geli\u015ftiriciler, terminal \u00fczerinden basit komutlar kullanarak projelerini kolayca y\u00f6netebiliyordu. \u00d6rnek komutlar aras\u0131nda <code>mcmod-cli init [project-name]<\/code> ile yeni proje ba\u015flatma, <code>mcmod-cli build<\/code> ile derleme ve paketleme, <code>mcmod-cli test<\/code> ile test \u00e7al\u0131\u015ft\u0131rma ve <code>mcmod-cli deploy [server-address]<\/code> ile modu sunucuya y\u00fckleme gibi i\u015flevler bulunuyordu. Bu CLI ara\u00e7lar\u0131, <code>commander.js<\/code> gibi Node.js k\u00fct\u00fcphaneleri kullan\u0131larak geli\u015ftirildi ve geli\u015ftirme verimlili\u011fini inan\u0131lmaz derecede art\u0131rd\u0131. Geli\u015ftiriciler, uzun ve s\u0131k\u0131c\u0131 build s\u00fcre\u00e7leriyle u\u011fra\u015fmak yerine, modun i\u00e7eri\u011fine ve yarat\u0131c\u0131 \u00f6zelliklerine odaklanabildiler. Ayr\u0131ca, s\u00fcrekli entegrasyon (CI) sistemlerine kolayca entegre edilebildi\u011fi i\u00e7in, her kod de\u011fi\u015fikli\u011finde otomatik testler \u00e7al\u0131\u015ft\u0131r\u0131larak projenin kalitesi ve stabilitesi art\u0131r\u0131ld\u0131.<\/p>\n<pre><code class=\"language-javascript\">\n\/\/ mcmod-cli'nin build komutu \u00f6rne\u011fi (basit hali)\nconst { program } = require('commander');\nconst { execSync } = require('child_process');\nconst path = require('path');\n\nprogram\n  .command('build')\n  .description('Modu derler ve paketler.')\n  .action(() => {\n    console.log('Mod kaynak kodu \u00e7evriliyor...');\n    try {\n      execSync('java -jar ' + path.join(__dirname, '..\/compiler\/compiler.jar') + ' src\/main\/modcode out\/main\/java', { stdio: 'inherit' });\n      console.log('Java koduna \u00e7eviri tamamland\u0131.');\n      execSync('mvn clean install', { cwd: path.resolve('out\/main\/java'), stdio: 'inherit' });\n      console.log('Mod ba\u015far\u0131yla olu\u015fturuldu!');\n    } catch (error) {\n      console.error('Build i\u015flemi ba\u015far\u0131s\u0131z oldu:', error.message);\n      process.exit(1);\n    }\n  });\n\nprogram.parse(process.argv);\n<\/pre>\n<p><\/code><\/p>\n<p>Bu Node.js paketi, modun modern geli\u015ftirme ekosisteminin vazge\u00e7ilmez bir par\u00e7as\u0131 haline geldi ve toplulu\u011fun projeye kat\u0131l\u0131m\u0131n\u0131 b\u00fcy\u00fck \u00f6l\u00e7\u00fcde kolayla\u015ft\u0131rd\u0131.<\/p>\n<h2>Sonu\u00e7 ve S\u0131k\u00e7a Sorulan Sorular<\/h2>\n<p>Eski bir Minecraft modunu canland\u0131rmak \u00fczere \u00e7\u0131kt\u0131\u011f\u0131m bu yolculuk, sadece bir nostalji projesi olmaktan \u00e7ok daha fazlas\u0131yd\u0131. Kendi derleyicimi, SDK'm\u0131 ve Node.js paketimi geli\u015ftirmek, beni yaz\u0131l\u0131m m\u00fchendisli\u011finin derinliklerine g\u00f6t\u00fcren, bir\u00e7ok yeni beceri kazanmam\u0131 sa\u011flayan ve teknik problem \u00e7\u00f6zme yeteneklerimi geli\u015ftiren kapsaml\u0131 bir deneyim oldu. Bu proje, terk edilmi\u015f yaz\u0131l\u0131mlar\u0131n bile do\u011fru yakla\u015f\u0131mlarla ve modern ara\u00e7larla yeniden hayata d\u00f6nd\u00fcr\u00fclebilece\u011fini kan\u0131tlad\u0131.<\/p>\n<h3>Projenin Ba\u015far\u0131lar\u0131 ve Gelecek Potansiyeli<\/h3>\n<p>Bu maceran\u0131n en b\u00fcy\u00fck ba\u015far\u0131lar\u0131ndan biri, modun orijinal i\u015flevselli\u011fini tamamen koruyarak modern Minecraft s\u00fcr\u00fcmlerine ta\u015f\u0131nabilmesiydi. Eski DSL'den modern Java'ya sorunsuz bir ge\u00e7i\u015f sa\u011flamak, bir zamanlar imkans\u0131z g\u00f6r\u00fcnen bir hedefti. Geli\u015ftirdi\u011fim SDK, yeni geli\u015ftiricilerin moda kolayca dahil olmas\u0131n\u0131 sa\u011flayarak canl\u0131 bir topluluk ortam\u0131 yaratt\u0131. Art\u0131k mod \u00fczerinde yeni \u00f6zellikler geli\u015ftirmek, hatalar\u0131 d\u00fczeltmek ve geni\u015fletmeler yazmak \u00e7ok daha kolay. Node.js paketi ise t\u00fcm geli\u015ftirme ve da\u011f\u0131t\u0131m s\u00fcre\u00e7lerini otomatikle\u015ftirerek, geli\u015ftirici verimlili\u011fini \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131rd\u0131 ve projenin s\u00fcrd\u00fcr\u00fclebilirli\u011fini garantiledi. Gelecek i\u00e7in planlar\u0131m aras\u0131nda, derleyiciye daha geli\u015fmi\u015f optimizasyon teknikleri eklemek, SDK'y\u0131 daha da zenginle\u015ftirmek ve modun farkl\u0131 Minecraft modlama API'leriyle uyumlulu\u011funu sa\u011flamak yer al\u0131yor. Ayr\u0131ca, a\u00e7\u0131k kaynak toplulu\u011funun katk\u0131lar\u0131n\u0131 te\u015fvik ederek, modun uzun y\u0131llar boyunca ya\u015famas\u0131n\u0131 ve geli\u015fmesini sa\u011flamak en b\u00fcy\u00fck hedefim.<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular<\/h3>\n<ol>\n<li><strong>Neden haz\u0131r bir derleyici jenerat\u00f6r\u00fc (ANTLR gibi) kullanmad\u0131n\u0131z?<\/strong>\n<p>Projenin ba\u015f\u0131nda ANTLR gibi ara\u00e7lar\u0131 de\u011ferlendirdim. Ancak eski modun DSL'si olduk\u00e7a \u00f6zel ve baz\u0131 dil yap\u0131lar\u0131 standart jenerat\u00f6rlerin do\u011frudan desteklemedi\u011fi inceliklere sahipti. Kendi derleyicimi s\u0131f\u0131rdan yazmak, bu \u00f6zel durumlar\u0131 ele almama, dilin her detay\u0131n\u0131 derinlemesine anlamama ve \u00e7eviri s\u00fcreci \u00fczerinde tam kontrol sa\u011flamama olanak tan\u0131d\u0131. Bu, daha esnek ve \u00f6zelle\u015ftirilmi\u015f bir \u00e7\u00f6z\u00fcm sunarak projenin gereksinimlerini daha iyi kar\u015f\u0131lad\u0131.<\/p>\n<\/li>\n<li><strong>Bu projeyi tamamlamak ne kadar s\u00fcrd\u00fc?<\/strong>\n<p>Bu, olduk\u00e7a kapsaml\u0131 bir projeydi ve bo\u015f zamanlar\u0131mda \u00e7al\u0131\u015ft\u0131\u011f\u0131m i\u00e7in toplamda yakla\u015f\u0131k 8-10 ay\u0131m\u0131 ald\u0131. En \u00e7ok zaman alan k\u0131s\u0131mlar, eski DSL'nin gramerini tersine m\u00fchendislikle \u00e7\u0131karmak, derleyicinin lexer ve parser'\u0131n\u0131 yazmak ve Java kod \u00fcreticisini optimize etmekti.<\/p>\n<\/li>\n<li><strong>Kendi derleyicinizi yazmak yerine modun kaynak kodunu manuel olarak Java'ya \u00e7evirmek daha kolay olmaz m\u0131yd\u0131?<\/strong>\n<p>Ba\u015flang\u0131\u00e7ta bu se\u00e7ene\u011fi de d\u00fc\u015f\u00fcnd\u00fcm. Ancak modun kodu binlerce sat\u0131rd\u0131 ve \u00e7ok say\u0131da \u00f6zel dil yap\u0131s\u0131 i\u00e7eriyordu. Manuel \u00e7eviri, son derece zaman al\u0131c\u0131, tekrarlayan ve insan hatas\u0131na a\u00e7\u0131k olacakt\u0131. Ayr\u0131ca, manuel \u00e7eviri, modun gelecekteki g\u00fcncellemelerle uyumlulu\u011funu sa\u011flamakta yetersiz kalacak ve yeni \u00f6zellikler eklemeyi zorla\u015ft\u0131racakt\u0131. Kendi derleyicimi yazmak, ilk ba\u015fta daha fazla emek gerektirse de, uzun vadede \u00e7ok daha \u00f6l\u00e7eklenebilir, hatas\u0131z ve s\u00fcrd\u00fcr\u00fclebilir bir \u00e7\u00f6z\u00fcm sundu.<\/p>\n<\/li>\n<li><strong>Bu projeden \u00f6\u011frendi\u011finiz en \u00f6nemli ders ne oldu?<\/strong>\n<p>Bu projeden \u00f6\u011frendi\u011fim en \u00f6nemli ders, karma\u015f\u0131k sorunlar\u0131n genellikle mod\u00fcler ve a\u015famal\u0131 yakla\u015f\u0131mlarla \u00e7\u00f6z\u00fclebilece\u011fi oldu. Bir derleyici, SDK ve Node.js paketi geli\u015ftirmek gibi b\u00fcy\u00fck hedefler, k\u00fc\u00e7\u00fck, y\u00f6netilebilir par\u00e7alara b\u00f6l\u00fcnd\u00fc\u011f\u00fcnde ve her par\u00e7a \u00fczerinde titizlikle \u00e7al\u0131\u015f\u0131ld\u0131\u011f\u0131nda ula\u015f\u0131labilir hale geliyor. Ayr\u0131ca, detaylara dikkat etmenin, kapsaml\u0131 test yapman\u0131n ve iyi dok\u00fcmantasyon sa\u011flaman\u0131n yaz\u0131l\u0131m geli\u015ftirmedeki kritik rol\u00fcn\u00fc bir kez daha anlad\u0131m. A\u00e7\u0131k kaynak ruhunun ve topluluk i\u015f birli\u011finin bir projenin ba\u015far\u0131s\u0131 \u00fczerindeki etkisini de derinden deneyimledim.<\/p>\n<\/li>\n<\/ol>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Eski bir Minecraft modunu canland\u0131rmak m\u0131 istiyorsunuz? Kendi derleyici, SDK ve Node.js paketinizi geli\u015ftirerek bu zorlu projeyi teknik&hellip;","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":[136],"tags":[],"class_list":{"0":"post-35525","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-node-js","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>Minecraft Modu Canland\u0131rmak \u0130\u00e7in Kendi Derleyici, SDK ve Node Paketimi Yazd\u0131m<\/title>\n<meta name=\"description\" content=\"Eski bir Minecraft modunu canland\u0131rmak m\u0131 istiyorsunuz? Kendi derleyici, SDK ve Node.js paketinizi geli\u015ftirerek bu zorlu projeyi teknik ustal\u0131k ve yenilikle dolu bir ba\u015far\u0131 \u00f6yk\u00fcs\u00fcne d\u00f6n\u00fc\u015ft\u00fcrebilirsiniz.\" \/>\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\/minecraft-modu-canlandirmak-icin-kendi-derleyici-sdk-ve-node-paketimi-yazdim\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Minecraft Modu Canland\u0131rmak \u0130\u00e7in Kendi Derleyici, SDK ve Node Paketimi Yazd\u0131m\" \/>\n<meta property=\"og:description\" content=\"Eski bir Minecraft modunu canland\u0131rmak m\u0131 istiyorsunuz? Kendi derleyici, SDK ve Node.js paketinizi geli\u015ftirerek bu zorlu projeyi teknik ustal\u0131k ve yenilikle dolu bir ba\u015far\u0131 \u00f6yk\u00fcs\u00fcne d\u00f6n\u00fc\u015ft\u00fcrebilirsiniz.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/minecraft-modu-canlandirmak-icin-kendi-derleyici-sdk-ve-node-paketimi-yazdim\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-11-30T15:31:48+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=\"18 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/minecraft-modu-canlandirmak-icin-kendi-derleyici-sdk-ve-node-paketimi-yazdim\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/minecraft-modu-canlandirmak-icin-kendi-derleyici-sdk-ve-node-paketimi-yazdim\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Minecraft Modu Canland\u0131rmak \u0130\u00e7in Kendi Derleyici, SDK ve Node Paketimi Yazd\u0131m\",\"datePublished\":\"2025-11-30T15:31:48+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/minecraft-modu-canlandirmak-icin-kendi-derleyici-sdk-ve-node-paketimi-yazdim\/\"},\"wordCount\":3439,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"Node.js\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/minecraft-modu-canlandirmak-icin-kendi-derleyici-sdk-ve-node-paketimi-yazdim\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/minecraft-modu-canlandirmak-icin-kendi-derleyici-sdk-ve-node-paketimi-yazdim\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/minecraft-modu-canlandirmak-icin-kendi-derleyici-sdk-ve-node-paketimi-yazdim\/\",\"name\":\"Minecraft Modu Canland\u0131rmak \u0130\u00e7in Kendi Derleyici, SDK ve Node Paketimi Yazd\u0131m\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-11-30T15:31:48+00:00\",\"description\":\"Eski bir Minecraft modunu canland\u0131rmak m\u0131 istiyorsunuz? Kendi derleyici, SDK ve Node.js paketinizi geli\u015ftirerek bu zorlu projeyi teknik ustal\u0131k ve yenilikle dolu bir ba\u015far\u0131 \u00f6yk\u00fcs\u00fcne d\u00f6n\u00fc\u015ft\u00fcrebilirsiniz.\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/minecraft-modu-canlandirmak-icin-kendi-derleyici-sdk-ve-node-paketimi-yazdim\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/minecraft-modu-canlandirmak-icin-kendi-derleyici-sdk-ve-node-paketimi-yazdim\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/minecraft-modu-canlandirmak-icin-kendi-derleyici-sdk-ve-node-paketimi-yazdim\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Minecraft Modu Canland\u0131rmak \u0130\u00e7in Kendi Derleyici, SDK ve Node Paketimi Yazd\u0131m\"}]},{\"@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":"Minecraft Modu Canland\u0131rmak \u0130\u00e7in Kendi Derleyici, SDK ve Node Paketimi Yazd\u0131m","description":"Eski bir Minecraft modunu canland\u0131rmak m\u0131 istiyorsunuz? Kendi derleyici, SDK ve Node.js paketinizi geli\u015ftirerek bu zorlu projeyi teknik ustal\u0131k ve yenilikle dolu bir ba\u015far\u0131 \u00f6yk\u00fcs\u00fcne d\u00f6n\u00fc\u015ft\u00fcrebilirsiniz.","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\/minecraft-modu-canlandirmak-icin-kendi-derleyici-sdk-ve-node-paketimi-yazdim\/","og_locale":"tr_TR","og_type":"article","og_title":"Minecraft Modu Canland\u0131rmak \u0130\u00e7in Kendi Derleyici, SDK ve Node Paketimi Yazd\u0131m","og_description":"Eski bir Minecraft modunu canland\u0131rmak m\u0131 istiyorsunuz? Kendi derleyici, SDK ve Node.js paketinizi geli\u015ftirerek bu zorlu projeyi teknik ustal\u0131k ve yenilikle dolu bir ba\u015far\u0131 \u00f6yk\u00fcs\u00fcne d\u00f6n\u00fc\u015ft\u00fcrebilirsiniz.","og_url":"https:\/\/fatihsoysal.com\/blog\/minecraft-modu-canlandirmak-icin-kendi-derleyici-sdk-ve-node-paketimi-yazdim\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-11-30T15:31:48+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"18 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/minecraft-modu-canlandirmak-icin-kendi-derleyici-sdk-ve-node-paketimi-yazdim\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/minecraft-modu-canlandirmak-icin-kendi-derleyici-sdk-ve-node-paketimi-yazdim\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Minecraft Modu Canland\u0131rmak \u0130\u00e7in Kendi Derleyici, SDK ve Node Paketimi Yazd\u0131m","datePublished":"2025-11-30T15:31:48+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/minecraft-modu-canlandirmak-icin-kendi-derleyici-sdk-ve-node-paketimi-yazdim\/"},"wordCount":3439,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["Node.js"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/minecraft-modu-canlandirmak-icin-kendi-derleyici-sdk-ve-node-paketimi-yazdim\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/minecraft-modu-canlandirmak-icin-kendi-derleyici-sdk-ve-node-paketimi-yazdim\/","url":"https:\/\/fatihsoysal.com\/blog\/minecraft-modu-canlandirmak-icin-kendi-derleyici-sdk-ve-node-paketimi-yazdim\/","name":"Minecraft Modu Canland\u0131rmak \u0130\u00e7in Kendi Derleyici, SDK ve Node Paketimi Yazd\u0131m","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-11-30T15:31:48+00:00","description":"Eski bir Minecraft modunu canland\u0131rmak m\u0131 istiyorsunuz? Kendi derleyici, SDK ve Node.js paketinizi geli\u015ftirerek bu zorlu projeyi teknik ustal\u0131k ve yenilikle dolu bir ba\u015far\u0131 \u00f6yk\u00fcs\u00fcne d\u00f6n\u00fc\u015ft\u00fcrebilirsiniz.","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/minecraft-modu-canlandirmak-icin-kendi-derleyici-sdk-ve-node-paketimi-yazdim\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/minecraft-modu-canlandirmak-icin-kendi-derleyici-sdk-ve-node-paketimi-yazdim\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/minecraft-modu-canlandirmak-icin-kendi-derleyici-sdk-ve-node-paketimi-yazdim\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Minecraft Modu Canland\u0131rmak \u0130\u00e7in Kendi Derleyici, SDK ve Node Paketimi Yazd\u0131m"}]},{"@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\/35525","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=35525"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/35525\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=35525"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=35525"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=35525"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}