{"id":32092,"date":"2025-10-17T16:40:57","date_gmt":"2025-10-17T13:40:57","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=32092"},"modified":"2025-10-17T16:40:57","modified_gmt":"2025-10-17T13:40:57","slug":"javascript-kaynak-kodunu-soyut-sozdizimi-agaci-ast-ile-okumak","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/javascript-kaynak-kodunu-soyut-sozdizimi-agaci-ast-ile-okumak\/","title":{"rendered":"JavaScript Kaynak Kodunu Soyut S\u00f6zdizimi A\u011fac\u0131 (AST) ile Okumak"},"content":{"rendered":"<p><body><\/p>\n<h2>JavaScript Kaynak Kodunu Soyut S\u00f6zdizimi A\u011fac\u0131 (AST) ile Okumak<\/h2>\n<h3>Giri\u015f<\/h3>\n<p>JavaScript, web geli\u015ftirmenin temel ta\u015flar\u0131ndan biri olmas\u0131n\u0131n yan\u0131 s\u0131ra, giderek artan bir \u015fekilde sunucu taraf\u0131 uygulamalarda (Node.js), mobil uygulamalarda (React Native) ve masa\u00fcst\u00fc uygulamalarda (Electron) da kullan\u0131lmaktad\u0131r. Bu geni\u015f kullan\u0131m alan\u0131, JavaScript kodunun analiz edilmesi, d\u00f6n\u00fc\u015ft\u00fcr\u00fclmesi ve optimize edilmesi ihtiyac\u0131n\u0131 beraberinde getirmi\u015ftir. \u0130\u015fte tam bu noktada Soyut S\u00f6zdizimi A\u011fac\u0131 (Abstract Syntax Tree &#8211; AST) devreye girer. AST, kaynak kodunun yap\u0131sal bir temsilidir ve bir program\u0131n s\u00f6zdizimsel yap\u0131s\u0131n\u0131 hiyerar\u015fik bir a\u011fa\u00e7 format\u0131nda sunar. Bu makalede, JavaScript kaynak kodunu bir AST arac\u0131l\u0131\u011f\u0131yla nas\u0131l okuyaca\u011f\u0131m\u0131z\u0131, bunun neden \u00f6nemli oldu\u011funu, hangi ara\u00e7lar\u0131 kullanabilece\u011fimizi ve pratik uygulamalar\u0131n\u0131 derinlemesine inceleyece\u011fiz.<\/p>\n<h3>Soyut S\u00f6zdizimi A\u011fac\u0131 (AST) Nedir?<\/h3>\n<p>Soyut S\u00f6zdizimi A\u011fac\u0131 (AST), programlama dillerindeki kaynak kodunun soyut, hiyerar\u015fik bir temsilidir. Bir derleyici veya yorumlay\u0131c\u0131, kaynak kodu i\u015flerken ilk olarak bu kodu bir AST&#8217;ye d\u00f6n\u00fc\u015ft\u00fcr\u00fcr. Bu a\u011fa\u00e7, program\u0131n s\u00f6zdizimsel yap\u0131s\u0131n\u0131, her bir d\u00fc\u011f\u00fcm\u00fcn kodun bir yap\u0131s\u0131n\u0131 (\u00f6rne\u011fin, bir ifade, bir bildirim, bir operat\u00f6r) temsil etti\u011fi bir formatta g\u00f6sterir. &#8220;Soyut&#8221; kelimesi, a\u011fac\u0131n kodun her s\u00f6zdizimsel detay\u0131n\u0131 de\u011fil, yaln\u0131zca anlamsal a\u00e7\u0131dan \u00f6nemli olanlar\u0131 temsil etti\u011fini ifade eder. \u00d6rne\u011fin, noktal\u0131 virg\u00fcller veya parantezler gibi baz\u0131 s\u00f6zdizimsel \u00f6\u011feler genellikle AST&#8217;de do\u011frudan bir d\u00fc\u011f\u00fcm olarak temsil edilmez, ancak bunlar\u0131n varl\u0131\u011f\u0131 veya yoklu\u011fu, ilgili d\u00fc\u011f\u00fcmlerin yap\u0131s\u0131nda dolayl\u0131 olarak bulunur.<\/p>\n<p>AST&#8217;ler, kaynak kodunun daha y\u00fcksek seviyeli bir soyutlamas\u0131n\u0131 sa\u011flar. Bir program\u0131n metinsel g\u00f6steriminden farkl\u0131 olarak, AST, dilin s\u00f6zdizimsel kurallar\u0131na g\u00f6re yap\u0131land\u0131r\u0131lm\u0131\u015ft\u0131r. Her bir d\u00fc\u011f\u00fcm, program\u0131n bir b\u00f6l\u00fcm\u00fcn\u00fc (\u00f6rne\u011fin bir de\u011fi\u015fken bildirimi, bir fonksiyon \u00e7a\u011fr\u0131s\u0131, bir aritmetik i\u015flem) temsil eder. D\u00fc\u011f\u00fcmler aras\u0131ndaki ili\u015fkiler (ebeveyn-\u00e7ocuk, karde\u015f), kodun hiyerar\u015fik yap\u0131s\u0131n\u0131 yans\u0131t\u0131r. \u00d6rne\u011fin, <code>const a = 1 + 2;<\/code> gibi basit bir ifade, bir <code>VariableDeclaration<\/code> d\u00fc\u011f\u00fcm\u00fc, bunun alt\u0131nda bir <code>VariableDeclarator<\/code> d\u00fc\u011f\u00fcm\u00fc, onun alt\u0131nda bir <code>Identifier<\/code> (a) ve bir <code>BinaryExpression<\/code> (1 + 2) d\u00fc\u011f\u00fcm\u00fc olarak temsil edilebilir. <code>BinaryExpression<\/code> d\u00fc\u011f\u00fcm\u00fc ise kendi i\u00e7inde <code>Literal<\/code> (1), <code>operator<\/code> (+) ve <code>Literal<\/code> (2) d\u00fc\u011f\u00fcmlerine sahip olacakt\u0131r. Bu yap\u0131, kodun anlam\u0131n\u0131 ve ili\u015fkilerini kolayca analiz etmemizi sa\u011flar.<\/p>\n<h3>Neden JavaScript&#8217;te AST Kullanmal\u0131y\u0131z?<\/h3>\n<p>JavaScript&#8217;in dinamik do\u011fas\u0131 ve s\u00fcrekli geli\u015fen standartlar\u0131 (ES6+, ESNext), kodun programatik olarak i\u015flenmesini zorunlu k\u0131lar. AST&#8217;ler, bu zorluklar\u0131n \u00fcstesinden gelmek i\u00e7in g\u00fc\u00e7l\u00fc bir temel sunar. \u0130\u015fte JavaScript&#8217;te AST kullan\u0131m\u0131n\u0131n ba\u015fl\u0131ca nedenleri:<\/p>\n<p>*   <strong>Kod Analizi (Code Analysis):<\/strong> Linting ara\u00e7lar\u0131 (ESLint, JSHint) ve statik analizciler, olas\u0131 hatalar\u0131, k\u00f6t\u00fc pratikleri veya stil ihlallerini tespit etmek i\u00e7in AST&#8217;leri kullan\u0131r. AST, kodun metinsel bir dizesi yerine yap\u0131sal bir temsilini sundu\u011fu i\u00e7in, belirli desenleri veya anti-desenleri bulmak \u00e7ok daha kolayd\u0131r.<br \/>\n*   <strong>Kod D\u00f6n\u00fc\u015ft\u00fcrme (Code Transformation &#8211; Transpilation):<\/strong> Babel gibi d\u00f6n\u00fc\u015ft\u00fcr\u00fcc\u00fcler (transpilers), modern JavaScript kodunu (ES6+, TypeScript) daha eski taray\u0131c\u0131lar\u0131n veya ortamlar\u0131n anlayabilece\u011fi s\u00fcr\u00fcmlere (ES5) \u00e7evirmek i\u00e7in AST&#8217;leri yo\u011fun olarak kullan\u0131r. Bu s\u00fcre\u00e7, kaynak kodu AST&#8217;ye d\u00f6n\u00fc\u015ft\u00fcrmeyi, AST \u00fczerinde de\u011fi\u015fiklikler yapmay\u0131 ve ard\u0131ndan de\u011fi\u015ftirilmi\u015f AST&#8217;yi tekrar JavaScript koduna d\u00f6n\u00fc\u015ft\u00fcrmeyi i\u00e7erir.<br \/>\n*   <strong>Kod Optimizasyonu:<\/strong> Minifikat\u00f6rler (UglifyJS, Terser), kod boyutunu k\u00fc\u00e7\u00fcltmek ve performans\u0131 art\u0131rmak i\u00e7in AST&#8217;leri kullan\u0131r. Gereksiz karakterleri kald\u0131rman\u0131n \u00f6tesinde, de\u011fi\u015fken isimlerini k\u0131saltma, ifadeleri basitle\u015ftirme gibi daha karma\u015f\u0131k optimizasyonlar AST \u00fczerinde yap\u0131l\u0131r.<br \/>\n*   <strong>Kod \u00dcretimi (Code Generation):<\/strong> Kod iskeletleri (scaffolding), \u015fablon motorlar\u0131 veya otomatik kod olu\u015fturucular, belirli desenlere dayal\u0131 olarak JavaScript kodu \u00fcretmek i\u00e7in AST&#8217;lerden yararlanabilir.<br \/>\n*   <strong>Geli\u015ftirici Ara\u00e7lar\u0131 (Developer Tooling):<\/strong> IDE&#8217;ler (VS Code, WebStorm) ve metin d\u00fczenleyiciler, otomatik tamamlama, refactoring (yeniden d\u00fczenleme), kod navigasyonu ve hata ay\u0131klama gibi geli\u015fmi\u015f \u00f6zellikler sunmak i\u00e7in arka planda AST&#8217;leri kullan\u0131r.<br \/>\n*   <strong>Dil Anlay\u0131\u015f\u0131 ve \u00d6\u011frenme:<\/strong> AST&#8217;lerle \u00e7al\u0131\u015fmak, JavaScript dilinin s\u00f6zdizimsel yap\u0131s\u0131n\u0131 ve nas\u0131l \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 daha derinlemesine anlaman\u0131za yard\u0131mc\u0131 olur.<\/p>\n<h3>JavaScript&#8217;te AST Olu\u015fturma: Ara\u00e7lar ve S\u00fcre\u00e7<\/h3>\n<p>JavaScript kaynak kodunu bir AST&#8217;ye d\u00f6n\u00fc\u015ft\u00fcrme i\u015flemi, bir &#8220;ayr\u0131\u015ft\u0131r\u0131c\u0131&#8221; (parser) taraf\u0131ndan ger\u00e7ekle\u015ftirilir. Ayr\u0131\u015ft\u0131r\u0131c\u0131, kaynak kodunu okur ve dilin gramer kurallar\u0131na g\u00f6re analiz ederek bir AST olu\u015fturur. JavaScript ekosisteminde bu ama\u00e7la kullan\u0131lan birka\u00e7 pop\u00fcler k\u00fct\u00fcphane bulunmaktad\u0131r:<\/p>\n<p>*   <strong>Acorn:<\/strong> Hafif, h\u0131zl\u0131 ve ECMAScript standartlar\u0131na s\u0131k\u0131 s\u0131k\u0131ya ba\u011fl\u0131 bir ayr\u0131\u015ft\u0131r\u0131c\u0131d\u0131r. Bir\u00e7ok ara\u00e7 ve k\u00fct\u00fcphane taraf\u0131ndan temel ayr\u0131\u015ft\u0131r\u0131c\u0131 olarak kullan\u0131l\u0131r.<br \/>\n*   <strong>@babel\/parser (eski ad\u0131yla Babylonia):<\/strong> Babel&#8217;in kendi ayr\u0131\u015ft\u0131r\u0131c\u0131s\u0131d\u0131r ve en yeni ECMAScript \u00f6zelliklerini, deneysel \u00f6zellikleri ve JSX, TypeScript gibi uzant\u0131lar\u0131 destekler.<br \/>\n*   <strong>Esprima:<\/strong> JavaScript AST ayr\u0131\u015ft\u0131r\u0131c\u0131lar\u0131n\u0131n ilklerinden biridir ve bir\u00e7ok projenin temelini olu\u015fturmu\u015ftur.<br \/>\n*   <strong>TypeScript Compiler API:<\/strong> TypeScript kodu (ve dolay\u0131s\u0131yla JavaScript kodu) i\u00e7in g\u00fc\u00e7l\u00fc bir ayr\u0131\u015ft\u0131rma ve analiz yetene\u011fi sunar.<\/p>\n<p><strong>Basit Bir Acorn Kullan\u0131m \u00d6rne\u011fi:<\/strong><br \/>\nAcorn ile bir JavaScript kod dizesini AST&#8217;ye d\u00f6n\u00fc\u015ft\u00fcrmek olduk\u00e7a basittir.<\/p>\n<p>\u00d6ncelikle Acorn&#8217;u projenize kurman\u0131z gerekir:<\/p>\n<pre><code class=\"language-bash\">npm install acorn<\/code><\/pre>\n<p>Ard\u0131ndan, kodu ayr\u0131\u015ft\u0131rmak i\u00e7in \u015fu \u015fekilde kullanabilirsiniz:<\/p>\n<pre><code class=\"language-javascript\">import { parse } from 'acorn';\n\nconst code = <code>const greeting = \"Hello, world!\";\nfunction sayHello() {\n  console.log(greeting);\n}<\/code>;\n\nconst ast = parse(code, {\n  ecmaVersion: 2020, \/\/ ECMAScript s\u00fcr\u00fcm\u00fcn\u00fc belirtin\n  sourceType: 'module' \/\/ 'script' veya 'module'\n});\n\nconsole.log(JSON.stringify(ast, null, 2));<\/code><\/pre>\n<p>Bu kodu \u00e7al\u0131\u015ft\u0131rd\u0131\u011f\u0131n\u0131zda, <code>code<\/code> dizesinin hiyerar\u015fik bir JSON temsili olan AST&#8217;yi g\u00f6receksiniz. \u00c7\u0131kt\u0131, <code>Program<\/code> t\u00fcr\u00fcnde bir k\u00f6k d\u00fc\u011f\u00fcmle ba\u015flayacak ve i\u00e7inde <code>body<\/code> ad\u0131nda bir dizi bulunacak. Bu dizi, kaynak kodundaki her bir \u00fcst d\u00fczey bildirimi veya ifadeyi temsil eden d\u00fc\u011f\u00fcmleri i\u00e7erecektir (\u00f6rne\u011fin, <code>VariableDeclaration<\/code>, <code>FunctionDeclaration<\/code>).<\/p>\n<h3>AST Yap\u0131s\u0131n\u0131 Anlamak<\/h3>\n<p>Bir AST, d\u00fc\u011f\u00fcmlerden olu\u015fan bir a\u011fa\u00e7t\u0131r. Her d\u00fc\u011f\u00fcm, kodun belirli bir b\u00f6l\u00fcm\u00fcn\u00fc temsil eder ve genellikle \u015fu \u00f6zelliklere sahiptir:<\/p>\n<p>*   <strong><code>type<\/code>:<\/strong> D\u00fc\u011f\u00fcm\u00fcn t\u00fcr\u00fcn\u00fc belirtir (\u00f6rn. <code>Program<\/code>, <code>VariableDeclaration<\/code>, <code>Identifier<\/code>, <code>Literal<\/code>, <code>CallExpression<\/code>). Bu, AST&#8217;nin en \u00f6nemli \u00f6zelli\u011fidir.<br \/>\n*   <strong><code>loc<\/code>:<\/strong> Kaynak kodundaki konumunu (sat\u0131r, s\u00fctun) belirtir. Hata raporlamas\u0131 veya kaynak haritalar\u0131 i\u00e7in kullan\u0131\u015fl\u0131d\u0131r.<br \/>\n*   <strong><code>start<\/code> ve <code>end<\/code>:<\/strong> D\u00fc\u011f\u00fcm\u00fcn kaynak kodundaki ba\u015flang\u0131\u00e7 ve biti\u015f indekslerini belirtir.<br \/>\n*   <strong>D\u00fc\u011f\u00fcme \u00d6zg\u00fc \u00d6zellikler:<\/strong> Her d\u00fc\u011f\u00fcm t\u00fcr\u00fcn\u00fcn, temsil etti\u011fi kod yap\u0131s\u0131na \u00f6zg\u00fc ek \u00f6zellikleri bulunur. \u00d6rne\u011fin:<br \/>\n    *   <code>VariableDeclaration<\/code>: <code>kind<\/code> (var, let, const), <code>declarations<\/code> (de\u011fi\u015fken bildirimlerinin dizisi).<br \/>\n    *   <code>VariableDeclarator<\/code>: <code>id<\/code> (de\u011fi\u015fkenin ad\u0131 &#8211; bir <code>Identifier<\/code> d\u00fc\u011f\u00fcm\u00fc), <code>init<\/code> (ba\u015flang\u0131\u00e7 de\u011feri &#8211; bir ifade d\u00fc\u011f\u00fcm\u00fc).<br \/>\n    *   <code>Identifier<\/code>: <code>name<\/code> (tan\u0131mlay\u0131c\u0131n\u0131n ad\u0131).<br \/>\n    *   <code>Literal<\/code>: <code>value<\/code> (sabit de\u011fer), <code>raw<\/code> (kaynak kodundaki ham hali).<br \/>\n    *   <code>BinaryExpression<\/code>: <code>left<\/code> (sol operand), <code>operator<\/code> (i\u015flemci), <code>right<\/code> (sa\u011f operand).<br \/>\n    *   <code>CallExpression<\/code>: <code>callee<\/code> (\u00e7a\u011fr\u0131lan fonksiyon), <code>arguments<\/code> (arg\u00fcmanlar dizisi).<\/p>\n<p><strong>AST Dola\u015f\u0131m\u0131 (Traversal):<\/strong><br \/>\nBir AST \u00fczerinde i\u015flem yapmak i\u00e7in a\u011fac\u0131 dola\u015fmak (traverse) gerekir. Dola\u015f\u0131m, a\u011fa\u00e7taki her d\u00fc\u011f\u00fcm\u00fc sistematik bir \u015fekilde ziyaret etme i\u015flemidir. Genellikle derinlik \u00f6ncelikli arama (DFS) stratejisi kullan\u0131l\u0131r. Kendi dola\u015f\u0131m fonksiyonlar\u0131n\u0131z\u0131 yazabilece\u011finiz gibi, bu i\u015fi kolayla\u015ft\u0131ran k\u00fct\u00fcphaneler de mevcuttur:<\/p>\n<p>*   <strong><code>estree-walker<\/code>:<\/strong> Basit ve hafif bir AST dola\u015f\u0131m k\u00fct\u00fcphanesidir.<br \/>\n*   <strong><code>@babel\/traverse<\/code>:<\/strong> Babel ekosisteminin g\u00fc\u00e7l\u00fc dola\u015f\u0131m k\u00fct\u00fcphanesidir. Kapsam (scope) y\u00f6netimi ve kolay d\u00fc\u011f\u00fcm manip\u00fclasyonu gibi geli\u015fmi\u015f \u00f6zellikler sunar.<\/p>\n<p>Dola\u015f\u0131m s\u0131ras\u0131nda, her d\u00fc\u011f\u00fcm\u00fc ziyaret etti\u011finizde, d\u00fc\u011f\u00fcm\u00fcn t\u00fcr\u00fcne veya \u00f6zelliklerine g\u00f6re belirli eylemler ger\u00e7ekle\u015ftirebilirsiniz. Bu, bir linter kural\u0131 uygulamak, belirli bir ifadeyi bulmak veya kodu d\u00f6n\u00fc\u015ft\u00fcrmek i\u00e7in temel mekanizmad\u0131r.<\/p>\n<h3>AST ile Pratik Uygulamalar<\/h3>\n<p>\u015eimdi, AST&#8217;nin g\u00fcc\u00fcn\u00fc g\u00f6stermek i\u00e7in birka\u00e7 pratik \u00f6rne\u011fe g\u00f6z atal\u0131m. Bu \u00f6rneklerde genellikle <code>@babel\/parser<\/code> ve <code>@babel\/traverse<\/code> kullanaca\u011f\u0131z, \u00e7\u00fcnk\u00fc bunlar Babel ekosisteminin temelini olu\u015fturur ve modern JavaScript uygulamalar\u0131 i\u00e7in en kapsaml\u0131 deste\u011fi sunar.<\/p>\n<p>\u00d6ncelikle gerekli paketleri kural\u0131m:<\/p>\n<pre><code class=\"language-bash\">npm install @babel\/parser @babel\/traverse @babel\/generator<\/code><\/pre>\n<h4>\u00d6rnek 1: <code>console.log<\/code> \u00c7a\u011fr\u0131lar\u0131n\u0131 Bulma<\/h4>\n<p>Belirli bir fonksiyon \u00e7a\u011fr\u0131s\u0131n\u0131 (\u00f6rne\u011fin <code>console.log<\/code>) bulmak, kod analizi i\u00e7in yayg\u0131n bir senaryodur.<\/p>\n<pre><code class=\"language-javascript\">import * as parser from '@babel\/parser';\nimport traverse from '@babel\/traverse';\nimport generate from '@babel\/generator';\n\nconst code = <code>\nfunction greet(name) {\n  console.log(\"Hello, \" + name + \"!\");\n  const message = \"Welcome.\";\n  console.warn(message); \/\/ Bu \u00e7a\u011fr\u0131y\u0131 atlayaca\u011f\u0131z\n  console.log(\"End of greeting.\");\n}\n<\/code>;\n\nconst ast = parser.parse(code, {\n  sourceType: 'module',\n  plugins: ['jsx', 'typescript'] \/\/ \u0130htiyaca g\u00f6re eklentiler\n});\n\nlet consoleLogCalls = [];\n\ntraverse(ast, {\n  CallExpression(path) {\n    const callee = path.node.callee;\n    \/\/ console.log \u00e7a\u011fr\u0131s\u0131 m\u0131?\n    if (callee.type === 'MemberExpression' &&\n        callee.object.type === 'Identifier' &&\n        callee.object.name === 'console' &&\n        callee.property.type === 'Identifier' &&\n        callee.property.name === 'log') {\n      consoleLogCalls.push(path.node);\n    }\n  }\n});\n\nconsole.log(<code>Toplam ${consoleLogCalls.length} adet console.log \u00e7a\u011fr\u0131s\u0131 bulundu.<\/code>);\nconsoleLogCalls.forEach((call, index) => {\n  const { code: callCode } = generate(call);\n  console.log(<code>${index + 1}. \u00c7a\u011fr\u0131: ${callCode}<\/code>);\n});<\/code><\/pre>\n<p>Bu \u00f6rnekte, <code>CallExpression<\/code> d\u00fc\u011f\u00fcmlerini dola\u015f\u0131yoruz. Her bir <code>CallExpression<\/code> i\u00e7in, \u00e7a\u011fr\u0131lan fonksiyonun (<code>callee<\/code>) bir <code>MemberExpression<\/code> olup olmad\u0131\u011f\u0131n\u0131, <code>object<\/code>&#8216;in <code>console<\/code> ve <code>property<\/code>&#8216;nin <code>log<\/code> olup olmad\u0131\u011f\u0131n\u0131 kontrol ediyoruz.<\/p>\n<h4>\u00d6rnek 2: De\u011fi\u015fken \u0130simlerini Yeniden Adland\u0131rma<\/h4>\n<p>Bir de\u011fi\u015fkenin ad\u0131n\u0131 kod taban\u0131nda de\u011fi\u015ftirmek (refactoring), AST&#8217;nin d\u00f6n\u00fc\u015ft\u00fcrme yetene\u011fini g\u00f6sterir. Kapsam (scope) y\u00f6netimi olmadan bu \u00f6rnek basitle\u015ftirilmi\u015ftir. Ger\u00e7ek bir refactoring arac\u0131, de\u011fi\u015fkenin tan\u0131mland\u0131\u011f\u0131 kapsam\u0131 ve kullan\u0131ld\u0131\u011f\u0131 yerleri do\u011fru bir \u015fekilde takip etmelidir.<\/p>\n<pre><code class=\"language-javascript\">import * as parser from '@babel\/parser';\nimport traverse from '@babel\/traverse';\nimport generate from '@babel\/generator';\n\nconst code = <code>\nconst oldName = 10;\nfunction process() {\n  console.log(oldName);\n  const anotherVar = oldName * 2;\n  return anotherVar;\n}\n<\/code>;\n\nconst ast = parser.parse(code, { sourceType: 'module' });\nconst oldVarName = 'oldName';\nconst newVarName = 'newName';\n\ntraverse(ast, {\n  Identifier(path) {\n    \/\/ Sadece 'oldName' olan tan\u0131mlay\u0131c\u0131lar\u0131 hedef al\n    if (path.node.name === oldVarName) {\n      \/\/ E\u011fer bu tan\u0131mlay\u0131c\u0131 bir de\u011fi\u015fken bildirimi veya kullan\u0131m\u0131 ise\n      \/\/ (\u00f6rne\u011fin, bir nesne anahtar\u0131 de\u011filse) ad\u0131n\u0131 de\u011fi\u015ftir\n      \/\/ Daha geli\u015fmi\u015f senaryolarda <code>path.scope<\/code> kullan\u0131lmal\u0131d\u0131r\n      path.node.name = newVarName;\n    }\n  }\n});\n\nconst { code: newCode } = generate(ast);\nconsole.log('De\u011fi\u015ftirilmi\u015f kod:\\n', newCode);<\/code><\/pre>\n<p>Bu \u00f6rnek, <code>Identifier<\/code> d\u00fc\u011f\u00fcmlerini bulur ve <code>name<\/code> \u00f6zelli\u011fi <code>oldName<\/code> olanlar\u0131n ad\u0131n\u0131 <code>newName<\/code> olarak de\u011fi\u015ftirir. <code>path.scope<\/code> kullan\u0131m\u0131, ayn\u0131 ada sahip ancak farkl\u0131 kapsamdaki de\u011fi\u015fkenlerin yanl\u0131\u015fl\u0131kla de\u011fi\u015ftirilmesini \u00f6nlemek i\u00e7in ger\u00e7ek d\u00fcnya uygulamalar\u0131nda kritik \u00f6neme sahiptir.<\/p>\n<h4>\u00d6rnek 3: <code>debugger<\/code> \u0130fadelerini Kald\u0131rma<\/h4>\n<p>\u00dcretim ortam\u0131na da\u011f\u0131t\u0131lacak koddan <code>debugger<\/code> ifadelerini kald\u0131rmak, yayg\u0131n bir optimizasyon g\u00f6revidir.<\/p>\n<pre><code class=\"language-javascript\">import * as parser from '@babel\/parser';\nimport traverse from '@babel\/traverse';\nimport generate from '@babel\/generator';\n\nconst code = <code>\nfunction calculate() {\n  debugger;\n  let x = 10;\n  debugger;\n  console.log(x);\n}\n<\/code>;\n\nconst ast = parser.parse(code, { sourceType: 'module' });\n\ntraverse(ast, {\n  DebuggerStatement(path) {\n    \/\/ debugger ifadesini AST'den kald\u0131r\n    path.remove();\n  }\n});\n\nconst { code: newCode } = generate(ast);\nconsole.log('debugger kald\u0131r\u0131lm\u0131\u015f kod:\\n', newCode);<\/code><\/pre>\n<p><code>DebuggerStatement<\/code> t\u00fcr\u00fcndeki d\u00fc\u011f\u00fcmleri hedef al\u0131p <code>path.remove()<\/code> metodunu \u00e7a\u011f\u0131rarak bu ifadeleri AST&#8217;den tamamen siliyoruz. <code>generate<\/code> fonksiyonu daha sonra temizlenmi\u015f kodu \u00fcretir.<\/p>\n<h4>\u00d6rnek 4: Basit Bir Linter Kural\u0131 Olu\u015fturma (\u00f6rn. <code>var<\/code> kullan\u0131m\u0131n\u0131 yasaklama)<\/h4>\n<p><code>var<\/code> anahtar kelimesi yerine <code>let<\/code> veya <code>const<\/code> kullan\u0131lmas\u0131n\u0131 zorunlu k\u0131lan basit bir linter kural\u0131 olu\u015ftural\u0131m.<\/p>\n<pre><code class=\"language-javascript\">import * as parser from '@babel\/parser';\nimport traverse from '@babel\/traverse';\n\nconst code = <code>\nvar myVar = 10;\nlet myLet = 20;\nconst myConst = 30;\n\nfunction example() {\n  var anotherVar = \"hello\";\n  console.log(anotherVar);\n}\n<\/code>;\n\nconst ast = parser.parse(code, { sourceType: 'module' });\nconst errors = [];\n\ntraverse(ast, {\n  VariableDeclaration(path) {\n    if (path.node.kind === 'var') {\n      const { loc } = path.node;\n      errors.push({\n        message: \"Unexpected 'var' keyword. Use 'let' or 'const' instead.\",\n        loc: loc\n      });\n    }\n  }\n});\n\nif (errors.length > 0) {\n  console.log('Linter Hatalar\u0131:');\n  errors.forEach(error => {\n    console.log(<code>- ${error.message} (Sat\u0131r: ${error.loc.start.line}, S\u00fctun: ${error.loc.start.column})<\/code>);\n  });\n} else {\n  console.log('Kodda \"var\" kullan\u0131m\u0131 bulunamad\u0131. Temiz!');\n}<\/code><\/pre>\n<p>Burada, <code>VariableDeclaration<\/code> d\u00fc\u011f\u00fcmlerini inceliyoruz. E\u011fer bir bildirimin <code>kind<\/code> \u00f6zelli\u011fi <code>'var'<\/code> ise, bir hata kaydediyoruz ve bu hatan\u0131n konumunu (<code>loc<\/code>) da belirtiyoruz. Bu, ESLint gibi ara\u00e7lar\u0131n temel \u00e7al\u0131\u015fma prensibidir.<\/p>\n<h3>AST D\u00f6n\u00fc\u015f\u00fcm\u00fc<\/h3>\n<p>AST d\u00f6n\u00fc\u015f\u00fcm\u00fc, mevcut bir AST&#8217;yi al\u0131p \u00fczerinde de\u011fi\u015fiklikler yaparak yeni bir AST olu\u015fturma i\u015flemidir. Bu yeni AST daha sonra kaynak koda geri d\u00f6n\u00fc\u015ft\u00fcr\u00fclebilir. Babel gibi ara\u00e7lar, bu d\u00f6n\u00fc\u015f\u00fcm s\u00fcrecini kolayla\u015ft\u0131rmak i\u00e7in g\u00fc\u00e7l\u00fc bir API sunar.<\/p>\n<p><strong>D\u00f6n\u00fc\u015f\u00fcm Ara\u00e7lar\u0131:<\/strong><br \/>\n*   <strong><code>@babel\/traverse<\/code>:<\/strong> AST&#8217;yi dola\u015fmak ve d\u00fc\u011f\u00fcmler \u00fczerinde de\u011fi\u015fiklikler yapmak i\u00e7in kullan\u0131l\u0131r. <code>path<\/code> nesnesi, mevcut d\u00fc\u011f\u00fcme, onun ebeveynine, karde\u015flerine ve kapsam\u0131na eri\u015fim sa\u011flar. <code>path.replaceWith()<\/code>, <code>path.remove()<\/code>, <code>path.insertBefore()<\/code>, <code>path.insertAfter()<\/code> gibi metotlar d\u00fc\u011f\u00fcmleri manip\u00fcle etmek i\u00e7in kullan\u0131l\u0131r.<br \/>\n*   <strong><code>@babel\/types<\/code> (eski ad\u0131yla <code>babylon<\/code>):<\/strong> Yeni AST d\u00fc\u011f\u00fcmleri olu\u015fturmak i\u00e7in yard\u0131mc\u0131 fonksiyonlar sa\u011flar. \u00d6rne\u011fin, <code>t.identifier('newName')<\/code> yeni bir tan\u0131mlay\u0131c\u0131 d\u00fc\u011f\u00fcm\u00fc olu\u015fturur.<br \/>\n*   <strong><code>@babel\/generator<\/code>:<\/strong> De\u011fi\u015ftirilmi\u015f AST&#8217;yi tekrar JavaScript koduna d\u00f6n\u00fc\u015ft\u00fcr\u00fcr. Kaynak haritalar\u0131 (source maps) olu\u015fturma yetene\u011fine de sahiptir.<\/p>\n<p><strong>Basit Bir Babel Plugin \u00d6rne\u011fi: <code>const<\/code>&#8216;lar\u0131 <code>var<\/code>&#8216;a D\u00f6n\u00fc\u015ft\u00fcrme<\/strong><br \/>\nBu, modern JS&#8217;yi eski JS&#8217;ye d\u00f6n\u00fc\u015ft\u00fcrmenin (transpilation) basitle\u015ftirilmi\u015f bir \u00f6rne\u011fidir.<\/p>\n<pre><code class=\"language-javascript\">import * as parser from '@babel\/parser';\nimport traverse from '@babel\/traverse';\nimport generate from '@babel\/generator';\nimport * as t from '@babel\/types'; \/\/ Yeni d\u00fc\u011f\u00fcmler olu\u015fturmak i\u00e7in\n\nconst code = <code>\nconst myConst = 10;\nlet myLet = 20;\nfunction test() {\n  const innerConst = \"hello\";\n  console.log(myConst, innerConst);\n}\n<\/code>;\n\nconst ast = parser.parse(code, { sourceType: 'module' });\n\ntraverse(ast, {\n  VariableDeclaration(path) {\n    \/\/ Sadece 'const' bildirimlerini hedef al\n    if (path.node.kind === 'const') {\n      \/\/ Bildirimin t\u00fcr\u00fcn\u00fc 'var' olarak de\u011fi\u015ftir\n      path.node.kind = 'var';\n    }\n  }\n});\n\nconst { code: newCode } = generate(ast);\nconsole.log('D\u00f6n\u00fc\u015ft\u00fcr\u00fclm\u00fc\u015f kod (const -> var):\\n', newCode);<\/code><\/pre>\n<p>Bu \u00f6rnekte, <code>VariableDeclaration<\/code> d\u00fc\u011f\u00fcmlerini ziyaret ediyoruz. E\u011fer <code>kind<\/code> \u00f6zelli\u011fi <code>'const'<\/code> ise, bunu do\u011frudan <code>'var'<\/code> olarak de\u011fi\u015ftiriyoruz. Bu basit bir d\u00f6n\u00fc\u015f\u00fcm \u00f6rne\u011fidir; ger\u00e7ek Babel eklentileri \u00e7ok daha karma\u015f\u0131k mant\u0131klar i\u00e7erebilir ve <code>t<\/code> mod\u00fcl\u00fcn\u00fc kullanarak tamamen yeni AST d\u00fc\u011f\u00fcmleri olu\u015fturabilir.<\/p>\n<h3>Zorluklar ve Dikkat Edilmesi Gerekenler<\/h3>\n<p>AST ile \u00e7al\u0131\u015fmak g\u00fc\u00e7l\u00fc olsa da, baz\u0131 zorluklar\u0131 da beraberinde getirir:<\/p>\n<p>*   <strong>Karma\u015f\u0131kl\u0131k:<\/strong> B\u00fcy\u00fck ve karma\u015f\u0131k kod tabanlar\u0131 i\u00e7in AST&#8217;ler de \u00e7ok b\u00fcy\u00fck ve karma\u015f\u0131k olabilir. Bu, dola\u015f\u0131m ve d\u00f6n\u00fc\u015f\u00fcm mant\u0131\u011f\u0131n\u0131 yazmay\u0131 zorla\u015ft\u0131rabilir.<br \/>\n*   <strong>Kapsam (Scope) Y\u00f6netimi:<\/strong> De\u011fi\u015fkenlerin ve fonksiyonlar\u0131n tan\u0131mland\u0131\u011f\u0131 ve kullan\u0131ld\u0131\u011f\u0131 kapsam\u0131 do\u011fru bir \u015fekilde anlamak, g\u00fcvenli yeniden adland\u0131rma veya analiz i\u00e7in hayati \u00f6neme sahiptir. <code>@babel\/traverse<\/code> gibi k\u00fct\u00fcphaneler kapsam analizi yapma yetene\u011fi sunar.<br \/>\n*   <strong>Performans:<\/strong> \u00c7ok b\u00fcy\u00fck dosyalar\u0131 ayr\u0131\u015ft\u0131rmak ve \u00fczerinde dola\u015fmak zaman al\u0131c\u0131 olabilir. Performans optimizasyonlar\u0131 (\u00f6rne\u011fin, gereksiz dola\u015f\u0131mlardan ka\u00e7\u0131nma) \u00f6nemlidir.<br \/>\n*   <strong>S\u00fcr\u00fcm Uyumlulu\u011fu:<\/strong> ECMAScript standartlar\u0131 s\u00fcrekli geli\u015fti\u011fi i\u00e7in, kullan\u0131lan ayr\u0131\u015ft\u0131r\u0131c\u0131n\u0131n en yeni dil \u00f6zelliklerini destekledi\u011finden emin olmak gerekir. Aksi takdirde, kod ayr\u0131\u015ft\u0131r\u0131lamaz veya hatal\u0131 bir AST \u00fcretilir.<br \/>\n*   <strong>Hata Y\u00f6netimi:<\/strong> Ge\u00e7ersiz veya s\u00f6zdizimsel olarak hatal\u0131 kod, ayr\u0131\u015ft\u0131rma hatalar\u0131na yol a\u00e7ar. Bu durumlar\u0131n uygun \u015fekilde ele al\u0131nmas\u0131 gerekir.<br \/>\n*   <strong>Kaynak Haritalar\u0131 (Source Maps):<\/strong> Kodu d\u00f6n\u00fc\u015ft\u00fcrd\u00fckten sonra, ortaya \u00e7\u0131kan kodun orijinal kaynak koddaki konumlar\u0131yla e\u015fle\u015fmesini sa\u011flamak i\u00e7in kaynak haritalar\u0131 olu\u015fturmak \u00f6nemlidir. Bu, hata ay\u0131klama deneyimini iyile\u015ftirir. <code>@babel\/generator<\/code> bu yetene\u011fi sa\u011flar.<br \/>\n*   <strong>Yan Etkiler:<\/strong> AST&#8217;yi d\u00f6n\u00fc\u015ft\u00fcr\u00fcrken, kodun anlamsal b\u00fct\u00fcnl\u00fc\u011f\u00fcn\u00fc bozmamaya dikkat etmek gerekir. \u00d6rne\u011fin, bir ifadeyi kald\u0131r\u0131rken, o ifadenin ba\u015fka bir yerde kullan\u0131lan bir yan etkisi olup olmad\u0131\u011f\u0131n\u0131 d\u00fc\u015f\u00fcnmek \u00f6nemlidir.<\/p>\n<h3>Sonu\u00e7<\/h3>\n<p>JavaScript kaynak kodunu Soyut S\u00f6zdizimi A\u011fac\u0131 (AST) arac\u0131l\u0131\u011f\u0131yla okumak ve manip\u00fcle etmek, modern JavaScript geli\u015ftirme ara\u00e7lar\u0131n\u0131n temelini olu\u015fturur. Linting&#8217;den transpilation&#8217;a, kod optimizasyonundan otomatik kod \u00fcretimine kadar bir\u00e7ok alanda AST&#8217;ler vazge\u00e7ilmezdir. Acorn, @babel\/parser, @babel\/traverse ve @babel\/generator gibi g\u00fc\u00e7l\u00fc k\u00fct\u00fcphaneler sayesinde, geli\u015ftiriciler JavaScript kodunun derinlemesine analizi ve programatik olarak d\u00f6n\u00fc\u015ft\u00fcr\u00fclmesi i\u00e7in gereken ara\u00e7lara sahiptir.<\/p>\n<p>AST&#8217;lerle \u00e7al\u0131\u015fmak ba\u015flang\u0131\u00e7ta karma\u015f\u0131k g\u00f6r\u00fcnebilir, ancak dilin yap\u0131s\u0131n\u0131 anlamak ve bu yap\u0131 \u00fczerinde programatik olarak kontrol sahibi olmak, JavaScript ekosistemindeki ara\u00e7lar\u0131 daha iyi anlaman\u0131z\u0131 ve hatta kendi \u00f6zel ara\u00e7lar\u0131n\u0131z\u0131 geli\u015ftirmenizi sa\u011flar. Gelecekte, yapay zeka destekli kod analizi ve otomatik refactoring gibi alanlarda AST&#8217;lerin rol\u00fc daha da artacakt\u0131r. Bu nedenle, JavaScript geli\u015ftiricileri i\u00e7in AST kavramlar\u0131n\u0131 ve uygulamalar\u0131n\u0131 \u00f6\u011frenmek, yetenek setlerini geni\u015fletmek ad\u0131na de\u011ferli bir yat\u0131r\u0131md\u0131r.<\/body><\/p>\n","protected":false},"excerpt":{"rendered":"JavaScript Kaynak Kodunu Soyut S\u00f6zdizimi A\u011fac\u0131 (AST) ile Okumak\nGiri\u015f\nJavaScript, web geli\u015ftirmenin temel ta\u015flar\u0131ndan biri olmas\u0131n\u0131n yan\u0131 s","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":[129],"tags":[],"class_list":{"0":"post-32092","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-javascript","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>JavaScript Kaynak Kodunu Soyut S\u00f6zdizimi A\u011fac\u0131 (AST) ile Okumak - 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\/javascript-kaynak-kodunu-soyut-sozdizimi-agaci-ast-ile-okumak\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"JavaScript Kaynak Kodunu Soyut S\u00f6zdizimi A\u011fac\u0131 (AST) ile Okumak\" \/>\n<meta property=\"og:description\" content=\"JavaScript Kaynak Kodunu Soyut S\u00f6zdizimi A\u011fac\u0131 (AST) ile Okumak Giri\u015f JavaScript, web geli\u015ftirmenin temel ta\u015flar\u0131ndan biri olmas\u0131n\u0131n yan\u0131 s\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/javascript-kaynak-kodunu-soyut-sozdizimi-agaci-ast-ile-okumak\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-17T13:40:57+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=\"15 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/javascript-kaynak-kodunu-soyut-sozdizimi-agaci-ast-ile-okumak\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/javascript-kaynak-kodunu-soyut-sozdizimi-agaci-ast-ile-okumak\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"JavaScript Kaynak Kodunu Soyut S\u00f6zdizimi A\u011fac\u0131 (AST) ile Okumak\",\"datePublished\":\"2025-10-17T13:40:57+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/javascript-kaynak-kodunu-soyut-sozdizimi-agaci-ast-ile-okumak\/\"},\"wordCount\":2335,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"Javascript\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/javascript-kaynak-kodunu-soyut-sozdizimi-agaci-ast-ile-okumak\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/javascript-kaynak-kodunu-soyut-sozdizimi-agaci-ast-ile-okumak\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/javascript-kaynak-kodunu-soyut-sozdizimi-agaci-ast-ile-okumak\/\",\"name\":\"JavaScript Kaynak Kodunu Soyut S\u00f6zdizimi A\u011fac\u0131 (AST) ile Okumak - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-10-17T13:40:57+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/javascript-kaynak-kodunu-soyut-sozdizimi-agaci-ast-ile-okumak\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/javascript-kaynak-kodunu-soyut-sozdizimi-agaci-ast-ile-okumak\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/javascript-kaynak-kodunu-soyut-sozdizimi-agaci-ast-ile-okumak\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"JavaScript Kaynak Kodunu Soyut S\u00f6zdizimi A\u011fac\u0131 (AST) ile Okumak\"}]},{\"@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":"JavaScript Kaynak Kodunu Soyut S\u00f6zdizimi A\u011fac\u0131 (AST) ile Okumak - 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\/javascript-kaynak-kodunu-soyut-sozdizimi-agaci-ast-ile-okumak\/","og_locale":"tr_TR","og_type":"article","og_title":"JavaScript Kaynak Kodunu Soyut S\u00f6zdizimi A\u011fac\u0131 (AST) ile Okumak","og_description":"JavaScript Kaynak Kodunu Soyut S\u00f6zdizimi A\u011fac\u0131 (AST) ile Okumak Giri\u015f JavaScript, web geli\u015ftirmenin temel ta\u015flar\u0131ndan biri olmas\u0131n\u0131n yan\u0131 s","og_url":"https:\/\/fatihsoysal.com\/blog\/javascript-kaynak-kodunu-soyut-sozdizimi-agaci-ast-ile-okumak\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-10-17T13:40:57+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"15 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/javascript-kaynak-kodunu-soyut-sozdizimi-agaci-ast-ile-okumak\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/javascript-kaynak-kodunu-soyut-sozdizimi-agaci-ast-ile-okumak\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"JavaScript Kaynak Kodunu Soyut S\u00f6zdizimi A\u011fac\u0131 (AST) ile Okumak","datePublished":"2025-10-17T13:40:57+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/javascript-kaynak-kodunu-soyut-sozdizimi-agaci-ast-ile-okumak\/"},"wordCount":2335,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["Javascript"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/javascript-kaynak-kodunu-soyut-sozdizimi-agaci-ast-ile-okumak\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/javascript-kaynak-kodunu-soyut-sozdizimi-agaci-ast-ile-okumak\/","url":"https:\/\/fatihsoysal.com\/blog\/javascript-kaynak-kodunu-soyut-sozdizimi-agaci-ast-ile-okumak\/","name":"JavaScript Kaynak Kodunu Soyut S\u00f6zdizimi A\u011fac\u0131 (AST) ile Okumak - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-10-17T13:40:57+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/javascript-kaynak-kodunu-soyut-sozdizimi-agaci-ast-ile-okumak\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/javascript-kaynak-kodunu-soyut-sozdizimi-agaci-ast-ile-okumak\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/javascript-kaynak-kodunu-soyut-sozdizimi-agaci-ast-ile-okumak\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"JavaScript Kaynak Kodunu Soyut S\u00f6zdizimi A\u011fac\u0131 (AST) ile Okumak"}]},{"@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\/32092","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=32092"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/32092\/revisions"}],"predecessor-version":[{"id":32093,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/32092\/revisions\/32093"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=32092"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=32092"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=32092"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}