<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Ahmet Yeniçeri on Medium]]></title>
        <description><![CDATA[Stories by Ahmet Yeniçeri on Medium]]></description>
        <link>https://medium.com/@yncrahmet?source=rss-7d0f5be900e5------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/1*bxQPmqYXCWtBkJDOl98Upg.jpeg</url>
            <title>Stories by Ahmet Yeniçeri on Medium</title>
            <link>https://medium.com/@yncrahmet?source=rss-7d0f5be900e5------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Mon, 25 May 2026 02:52:38 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@yncrahmet/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com" rel="hub"/>
        <item>
            <title><![CDATA[Clean Code (Temiz Kod) İlkesi]]></title>
            <link>https://yncrahmet.medium.com/yazilimda-clean-code-ilkesi-188eea1cb7d7?source=rss-7d0f5be900e5------2</link>
            <guid isPermaLink="false">https://medium.com/p/188eea1cb7d7</guid>
            <category><![CDATA[java]]></category>
            <category><![CDATA[geliştirme]]></category>
            <category><![CDATA[clean-code-java]]></category>
            <category><![CDATA[development]]></category>
            <category><![CDATA[spring-boot]]></category>
            <dc:creator><![CDATA[Ahmet Yeniçeri]]></dc:creator>
            <pubDate>Wed, 19 Mar 2025 12:22:02 GMT</pubDate>
            <atom:updated>2025-05-23T20:45:50.596Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*nzMeKkwLosYvOCnZnf9r4g.png" /></figure><p>Kod yazmak kolay, ama <strong>temiz kod</strong> yazmak? İşte orada işler karışıyor. Bir kod parçası, çalışıyor diye iyi yazılmış sayılmaz. Hele bir de altı ay sonra dönüp baktığında, “Bunu ben mi yazmışım lan?!” diyorsan, işte o zaman temiz kodun kıymetini anlıyorsun.</p><h4>🧼 Temiz Kod Nedir?</h4><p>Temiz kod, sadece <strong>bilgisayarın değil, insanların da anlayabileceği</strong> koddur. Okuması, anlaması ve değiştirmesi kolaydır. Bir kitap gibi akmalıdır, bulmaca gibi değil. Eğer kodunu yazarken şunları diyorsan:</p><p>❌ “Abi bu fonksiyon ne yapıyordu ya?”<br> ❌ “Şu değişkeni niye böyle isimlendirdim?”<br> ❌ “Şimdi bunu değiştirirsem ne patlar acaba?”</p><p>O kod temiz değildir, <strong>mayın tarlasıdır</strong>.</p><h4>📜 Temiz Kodun Altın Kuralları</h4><p>1️⃣ <strong>Anlamlı İsimler Kullan</strong></p><ul><li>x, y, data, temp gibi isimler yerine <strong>ne olduğunu anlatan</strong> değişken ve fonksiyon isimleri kullan.</li><li>Kötü: function process(d) {}</li><li>İyi: function calculateSalaries(salaryList) {}</li></ul><p>2️⃣ <strong>Tek Bir Şey Yap</strong></p><ul><li>Fonksiyonun tek bir işi olmalı. “Ama şu da olsun, bu da olsun” diyerek kodu şişirme.</li><li>Eğer fonksiyonunu anlatırken <strong>“ve”</strong> kelimesini kullanıyorsan, orada bir hata vardır.</li></ul><p>3️⃣ <strong>Kod Tekrarından Kaçın</strong></p><ul><li>Aynı kodu farklı yerlerde kopyalayıp yapıştırıyorsan, <strong>gelecekte kendine bela hazırlıyorsun</strong>.</li><li>Ortak işlemleri fonksiyonlara böl, bir değişiklik gerektiğinde her yerde tek tek uğraşma.</li></ul><p>4️⃣ <strong>Kısa ve Öz Tut</strong></p><ul><li>50 satırlık bir fonksiyonun varsa, onu bölmenin zamanı gelmiştir.</li><li>Bir fonksiyon en fazla 10–15 satır olmalı ki, <strong>beynin yanmadan okuyabil</strong>.</li></ul><p>5️⃣ <strong>Yorum Satırlarına Bağımlı Olma</strong></p><ul><li>Kodun kendini açıklamalı. Eğer kodun ne yaptığını anlamak için yorumlara muhtaçsan, kodu baştan yazmayı düşün.</li></ul><pre>// Kötü kullanım<br>int calculate(a, b) {<br> return a - b;<br>}<br><br>// İyi kullanım<br>int calculateUserAge(birthYear, currentYear) {<br>    return currentYear - birthYear;<br>}</pre><p>Yukardaki kodları incelediğinide alt tarafta yazılan fonksiyon gibi kodlarımız açıklayıcı olmalı ki başkası kodu okuduğu anda ne yaptığını anlasın.</p><p>6️⃣ <strong>Kodunu Başkası Okuyacakmış Gibi Yaz</strong></p><ul><li>Kendini hacker filmlerindeki dahi programcı sanıp, <strong>karışık kod yazma</strong>.</li><li>Unutma, gelecekte bu kodu ya başkası okuyacak, ya da sen! Ve büyük ihtimalle <strong>kendi yazdığın kodu çözmeye çalışırken vakit kaybedeceksin</strong>.</li></ul><h4>🚀 Temiz Kod Yazmanın Gerçek Gücü</h4><p>Temiz kod yazmak, sadece bug’lardan kaçınmak için değil, <strong>gelecekte hızlı geliştirme yapabilmek</strong> için de önemlidir. Kodun ne kadar temizse, projeye yeni biri katıldığında ya da sen bir süre sonra döndüğünde, her şey o kadar sorunsuz ilerler.</p><p>Peki, temiz kod yazmak sadece bir lüks mü, yoksa bir <strong>gereklilik</strong> mi? İşte asıl soru bu… 😏</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=188eea1cb7d7" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Spring Security Temelleri]]></title>
            <link>https://yncrahmet.medium.com/spring-security-temelleri-c4ff99f588b1?source=rss-7d0f5be900e5------2</link>
            <guid isPermaLink="false">https://medium.com/p/c4ff99f588b1</guid>
            <category><![CDATA[restful-api]]></category>
            <category><![CDATA[spring-web]]></category>
            <category><![CDATA[spring-boot]]></category>
            <category><![CDATA[spring-security-basics]]></category>
            <category><![CDATA[javaapps]]></category>
            <dc:creator><![CDATA[Ahmet Yeniçeri]]></dc:creator>
            <pubDate>Wed, 23 Oct 2024 10:12:56 GMT</pubDate>
            <atom:updated>2025-05-23T20:47:46.953Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*EmeHjw8LBlXxPS_q5h40Eg.png" /></figure><p>Spring Security, Java uygulamalarının güvenliğini sağlayan bir framework’tür. 2004 yılında bir proje olarak başladı ve 2007 yılında Spring ekosistemine dahil edildi. Rol ve session yönetimi, yetkilendirme gibi kritik işlemleri basitleştirmektedir. Bu yazıda, basit bir REST servisi oluşturup Spring Security ile bunu nasıl koruyacağımızı anlatacağım.</p><h4>Proje Kurulumu</h4><p>Basit bir spring projesi oluşturarak başlayalım. Spring Security frameworkünü kullanabilmek için pom.xml dosyamıza gerekli bağımlılıkları eklememiz gerekiyor.</p><pre>&lt;dependency&gt;<br>    &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;<br>    &lt;artifactId&gt;spring-boot-starter-security&lt;/artifactId&gt;<br>&lt;/dependency&gt;</pre><h4>RestController Oluşturma</h4><p>Projemizde bir RestController oluşturalım ve basit bir mesaj dönen endpoint hazırlayalım:</p><pre>@RestController<br>public class UserController {<br><br>    @GetMapping(&quot;/hello&quot;)<br>    public String helloWorld(){<br>        return &quot;Hello World!&quot;;<br>    }<br><br>}</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/1020/1*eWab1gXr6pSppr677CbcPA.png" /><figcaption>Varsayılan şifre konsolda karşımıza çıkmaktadır.</figcaption></figure><p>Projeyi çalıştırdığımızda, Spring Security bizlere hazır login formu karşımıza çıkarıyor. Bu form ile giriş yapıp endpointe ulaşıyoruz. İlk başta bu şifre konsola yazdırılır ve kullanıcı adı varsayılan olarak user olur.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/580/1*XVIfGO_glsqIufzBUR_QeA.png" /></figure><p>Bilgileri girip ilerledikten sonra istenilen sayfa karşımıza çıkmaktadır:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/542/1*3Flqj9WxCtpcuq9NNKB3DQ.png" /></figure><h4>Postman ile Test</h4><p>Postman gibi bir araçla Basic Authentication kullanarak da bu işlemi yapabiliriz. Authorization bölümünden Basic Auth seçerek kullanıcı adını user ve konsolda görünen şifreyi kullanabiliriz.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/926/1*3vQmQJppNBEx8ZLH033wSw.png" /></figure><h4>Sabit Kullanıcı Adı ve Şifre Ayarlama</h4><p>Her seferinde değişen şifrelerle uğraşmak yerine application.properties dosyasında sabit kullanıcı adı ve şifre belirleyebiliriz:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*8fcn9Ns-z2W6BSjsLgwPvw.png" /></figure><p>Kullanıcı adı ve şifre belirleyip projeyi çalıştırınca konsolda şifre gelmediğini görebilirsiniz. Artık belirlediğimiz kullanıcı adı ve şifre ile giriş yapabiliriz.</p><h4>Güvenli ve Güvensiz Sayfaların Ayrımı</h4><p>Bazı sayfalara herkesin ulaşmasını, bazılarının ise sadece oturum açmış kullanıcılar tarafından görüntülenmesini isteyebilirsiniz.</p><pre>@GetMapping(&quot;/dashboard&quot;)<br>    public String dashBoard(){<br>        return &quot;Giriş başarılı!&quot;;<br>    }</pre><p>Controller sınıfına yeni endpoint eklediğimizde ikisine de artık giriş yapılmasını istediğini görebilirsiniz. Ama biz /hello endpointine giriş yapmayanların da ulaşmasını ama /dashboard endpointine sadece giriş yapan kullanıcıların ulaşmasını diğerlerinin ulaşmamasını istiyoruz. Bu yüzden SecurityConfiguration sınıfı oluşturup bu ayarlamaları yapacağız:</p><pre>@Configuration<br>public class SecurityConfiguration {<br><br>    @Bean<br>    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {<br>        http<br>                .authorizeHttpRequests(auth -&gt; auth<br>                        .requestMatchers(HttpMethod.GET, &quot;/hello&quot;).permitAll()<br>                        .anyRequest().authenticated()<br>                )<br>                .httpBasic(Customizer.withDefaults());<br><br>        return http.build();<br>    }<br><br>}</pre><p>Burada /hello endpoint&#39;ine GET isteği atan kullanıcılara doğrulama olmadan erişebilmesini ve diğer metotlar için doğrulama gerektiğini belirtiyoruz.</p><p>Bu ayarlardan sonra projeyi çalıştırdığımızda, /hello sayfası herkesin erişimine açık olurken, /dashboard sayfası ise sadece giriş yapmış kullanıcılara açık oluyor.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/776/1*SIWbRVS6uFziaVd9qndddQ.png" /><figcaption>Giriş yapmadan erişim sağlıyoruz.</figcaption></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/925/1*ZVD3cQrXdaPw_PmDWUpZOw.png" /><figcaption>Doğrulama istediği için 401 (yetkilendirilmedi) hatası alıyoruz</figcaption></figure><p>Bu örnek proje ile Spring Security’nin temel işlevini basitçe anlattım. Spring Security, projelerimizi koruma altına almak için güçlü ve esnek bir çözüm sunmaktadır. Projenin kaynak kodlarına <a href="https://github.com/yncrahmet/SpringSecurity">buradan</a> ulaşabilirsiniz.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=c4ff99f588b1" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Http ve Restful API]]></title>
            <link>https://yncrahmet.medium.com/http-ve-restful-api-4f51cca18a32?source=rss-7d0f5be900e5------2</link>
            <guid isPermaLink="false">https://medium.com/p/4f51cca18a32</guid>
            <category><![CDATA[restful-api]]></category>
            <category><![CDATA[web-geliştirme]]></category>
            <category><![CDATA[backend]]></category>
            <category><![CDATA[katmanlı-mimari]]></category>
            <category><![CDATA[https]]></category>
            <dc:creator><![CDATA[Ahmet Yeniçeri]]></dc:creator>
            <pubDate>Wed, 22 May 2024 14:18:20 GMT</pubDate>
            <atom:updated>2025-02-23T10:27:01.493Z</atom:updated>
            <content:encoded><![CDATA[<p>HTTP, “Hiper Metin Transfer Protokolü” terimlerinden oluşmaktadır. İstemci-sunucu iletişimi için kullanılan bir protokoldür ve tarayıcılar ile web sunucuları arasındaki iletişimi düzenlemek için yaygın olarak kullanılır.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*xgCVkUUuCArPH_wIW01AUA.png" /><figcaption>HTTP İstek-Yanıt Döngüsü: Web tarayıcısı (istemci) ile web sunucusu arasındaki veri alışverişini gösteren basit bir şema.</figcaption></figure><p>HTTP, verilerin İnternet üzerinden aktarılmasını sağlayan bir veri aktarım protokolüdür. Web tarayıcıları (istemci) ile web sunucuları arasında bir köprü görevi görerek kullanıcıların web sitelerine erişmesine ve içeriği görüntülemesine olanak tanır.</p><p>HTTP protokolü, istemcilerin sunuculardan web sayfaları, resimler, videolar gibi kaynaklar talep etmesine ve sunucuların bu isteklere yanıt vermesine ve istenen kaynakları sunmasına olanak tanır. Bu veri aktarımı genellikle TCP/IP protokol ailesi kullanılarak yapılır.</p><p>HTTP, istemcilerin kaynakları nasıl istediğini ve sunucuların bu istekleri nasıl ele aldığını belirleyen kurallar ve yöntemler içerir. Örneğin, “GET” yöntemi bir web sayfasını görüntülemek için kullanılırken, “POST” yöntemi bir forma veri göndermek için kullanılır.</p><p>Modern web uygulamalarının temel yapı taşı olan HTTP, web sayfalarını tarayıcı aracılığıyla yüklemek, form verilerini göndermek ve dosyaları yüklemek/göndermek gibi birçok işlevi destekler. İnternetin işleyişinde önemli rol oynayan bir protokol, kullanıcıların Web deneyimini yaşamasını sağlar.</p><h3>RESTful API</h3><p>RESTful API, farklı uygulamaların veya sistemlerin HTTP protokolü üzerinden güvenli ve standart bir şekilde veri alışverişi yapmasını sağlayan bir arayüzdür. GET, PUT, POST, DELETE gibi HTTP metotlarını kullanarak verileri okuma, güncelleme, oluşturma ve silme işlemlerini gerçekleştirir. Web geliştirmede yaygın olarak kullanılan RESTful API’ler, esnek, ölçeklenebilir ve platform bağımsız çözümler sunar.</p><p>REST teknolojisi genellikle benzer diğer teknolojilere tercih edilir. Bunun nedeni, REST’in daha az bant genişliği kullanan ve daha verimli internet kullanımına daha uygun olan bir yapıya sahip olmasıdır. RESTful API’ler ayrıca JavaScript veya Python gibi programlama dilleriyle oluşturulabilir.</p><h4><strong><em>RESTful API Nasıl Çalışır?</em></strong></h4><p>RESTful API’ler, istemci-sunucu mimarisi üzerine kurulu bir iletişim yöntemidir ve temel olarak HTTP protokolünü kullanarak çalışır. İstemci (örneğin bir web tarayıcısı veya mobil uygulama), sunucuda bulunan belirli bir kaynağa (örneğin bir kullanıcı profili, ürün bilgisi veya hava durumu verisi) erişmek için API’ye bir HTTP isteği gönderir.</p><p>Bu istekler, HTTP metodları kullanılarak belirli eylemleri gerçekleştirir:</p><ul><li><strong>GET:</strong> Sunucudan belirli bir kaynağın verisini talep etmek için kullanılır.</li><li><strong>POST:</strong> Sunucuda yeni bir kaynak oluşturmak veya var olan bir kaynağa veri eklemek için kullanılır.</li><li><strong>PUT:</strong> Sunucudaki mevcut bir kaynağın verilerini güncellemek için kullanılır.</li><li><strong>DELETE:</strong> Sunucudaki belirli bir kaynağı silmek için kullanılır.</li></ul><p>İstemci, isteğiyle birlikte kaynağın yerini belirten bir URL (Uniform Resource Locator) ve isteğe bağlı olarak ek veriler (örneğin, yeni bir kullanıcı oluşturulurken kullanıcı bilgileri) gönderir.</p><p>Sunucu, gelen isteği alır, doğrular ve işler. İstek başarılı olursa, sunucu istenen veriyi içeren bir HTTP yanıtı gönderir. Bu yanıt genellikle JSON (JavaScript Object Notation) veya XML (Extensible Markup Language) formatında olur. İstemci, bu yanıtı alarak içindeki veriyi işler ve kullanıcıya sunar.</p><p><strong>RESTful API’lerin temel özellikleri şunlardır:</strong></p><ul><li><strong>Stateless (Durumsuz):</strong> Her istek, sunucu tarafından bağımsız olarak işlenir. Sunucu, istemcinin önceki isteklerini hatırlamaz. Bu, API’nin ölçeklenebilirliğini ve güvenilirliğini artırır.</li><li><strong>Client-Server (İstemci-Sunucu):</strong> İstemci ve sunucu birbirinden bağımsız olarak gelişebilir. Bu, API’nin farklı platformlarda ve farklı teknolojilerle kullanılabilmesini sağlar.</li><li><strong>Cacheable (Önbelleğe Alınabilir):</strong> Yanıtlar, istemci veya ara sunucular tarafından önbelleğe alınabilir. Bu, ağ trafiğini azaltır ve performansı artırır.</li><li><strong>Layered System (Katmanlı Sistem):</strong> API, birden fazla katmandan oluşabilir. Bu, güvenlik, yük dengeleme ve önbellekleme gibi işlemleri kolaylaştırır.</li><li><strong>Uniform Interface (Tekdüzen Arayüz):</strong> API, tüm kaynaklara erişmek için standart HTTP metodlarını kullanır. Bu, API’nin kullanımını kolaylaştırır.</li></ul><p>RESTful API’ler, modern web uygulamalarının temelini oluşturur. Farklı platformlarda çalışan uygulamaların birbirleriyle iletişim kurmasını ve veri alışverişini kolaylaştırır. Bu sayede, geliştiriciler daha esnek, ölçeklenebilir ve kullanıcı dostu uygulamalar oluşturabilirler.</p><h3><strong>HTTP ve RESTful Arasındaki İlişki</strong></h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/857/0*IaqPN8-O4_ZOJg9n.png" /></figure><p>REST API’ler, veri alışverişini sağlamak için internetin temel taşı olan HTTP protokolünü kullanır. Bu, sunucularla iletişim kurmanın evrensel bir yoludur. REST API’ler, HTTP’nin sunduğu GET, POST, PUT ve DELETE gibi çeşitli metotları kullanarak veri üzerinde işlemler gerçekleştirir.</p><p>GET metodu, sunucudaki belirli bir kaynağı (örneğin, bir kullanıcı profili veya bir ürün listesi) almak için kullanılır. POST, yeni bir kaynak oluşturmak (örneğin, yeni bir kullanıcı kaydetmek veya bir ürün eklemek) için kullanılırken, PUT mevcut bir kaynağı güncellemek için kullanılır. DELETE ise, tahmin edebileceğiniz gibi, bir kaynağı silmek için kullanılır.</p><p>HTTP sadece temel bir iletişim kanalı sağlamakla kalmaz, aynı zamanda REST API’lerin çalışma şeklini de büyük ölçüde etkiler. Örneğin, bir kaynağa erişmek için kullanılan URL’ler, HTTP standardının bir parçasıdır. İşlem sonuçlarını bildiren HTTP durum kodları (örneğin, 200 “Tamam” veya 404 “Bulunamadı”) ve ek bilgiler göndermek için kullanılan HTTP başlıkları da REST API’lerin ayrılmaz bir parçasıdır.</p><p>Özetle, REST API’ler, HTTP protokolünün üzerine inşa edilmiştir. Bu, onların sadece HTTP’nin sunduğu araçları kullanmakla kalmayıp, aynı zamanda HTTP’nin temel prensiplerine de uydukları anlamına gelir. Bu nedenle, REST API’leri anlamak için HTTP’yi anlamak çok önemlidir.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=4f51cca18a32" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[JVM Mimarisi]]></title>
            <link>https://yncrahmet.medium.com/jvm-mimarisi-c001a6e57673?source=rss-7d0f5be900e5------2</link>
            <guid isPermaLink="false">https://medium.com/p/c001a6e57673</guid>
            <category><![CDATA[java]]></category>
            <category><![CDATA[class]]></category>
            <category><![CDATA[jvm]]></category>
            <category><![CDATA[software]]></category>
            <category><![CDATA[virtual-machine]]></category>
            <dc:creator><![CDATA[Ahmet Yeniçeri]]></dc:creator>
            <pubDate>Sun, 11 Feb 2024 10:35:53 GMT</pubDate>
            <atom:updated>2024-02-11T10:35:53.555Z</atom:updated>
            <content:encoded><![CDATA[<p>JVM (Java Virtual Machine), Java uygulamalarını çalıştırmak için çalışma zamanı motoru (runtime engine) görevi yapan soyut bir bilgi işlem makinesidir. Java bayt kodunun yürütülebileceği çalışma zamanı ortamını sağlar.</p><p>JVM bilgisayarlarımızda bulunan bir sanal makinedir ve kullandığı makine dili ise bayt kodudur. Bu her farklı tip makine için farklı bir makine kodu yaratmak yerine JVM için sadece bayt kodu üretmesi gerektiğinden derleyicinin işini kolaylaştırır.</p><p>Ayrıca, JVM bellek yönetimi, çöp toplama ve çalışma zamanı optimizasyonu ile ilgilenerek onu Java programlarının verimli bir şekilde yürütülmesi için önemli bir bileşen haline getirir.</p><h4>JVM Bileşenleri ve İşlevleri</h4><p>JVM mimarisi, Java uygulamalarının yaşam döngüsünü yönetmek için birlikte çalışan birkaç bileşenden oluşur. Bu bileşenler şunları içerir:</p><ol><li><strong>Class Loader (Sınıf Yükleyici):</strong> JVM’nin ilk bileşeni olan Class Loader, Java sınıflarını yükler. Bu süreç, .class uzantılı Java kaynak dosyalarını içeren bytecode’ların belleğe yüklenmesini sağlar. Sınıf Yükleyici, sınıfları ihtiyaç duyulduğunda yükler ve yüklenen sınıfları JVM içinde kullanılabilir hale getirir. Classloader, Bootstrap Classloader ile başlayan, Extension Classloader ve Application Classloader ile devam eden bir temsil hiyerarşisini takip eder.</li><li><strong>Runtime Data Area (Çalışma Zamanı Veri Alanı): </strong>JVM, programın yürütülmesi sırasında Çalışma Zamanı Veri Alanları adı verilen bellek alanlarını tahsis eder. Bu bellek alanları, uygulamanın yaşam döngüsünün farklı yönleri için gerekli verileri depolayan Yığın, Yığın, Yöntem Alanı, Sabit Havuz ve PC Kayıtlarını içerir.</li><li><strong>Execution Engine (Çalıştırma Motoru): </strong>Yürütme Motoru, Java bayt kodunu yürütmekten sorumlu temel bileşendir. Bu bileşen, bytecode’ları JVM’nin anlayabileceği makine koduna çevirir ve bu kodu işletim sistemi ve donanım üzerinde çalıştırır. Java’nın platform bağımsızlığını sağlayan önemli bir bileşen olan Execution Engine, bytecode’ı herhangi bir işletim sisteminde ve donanımda çalıştırılabilir hale getirir. Tercüman, Tam Zamanında (JIT) Derleyici ve Çöp Toplayıcı gibi bileşenleri içerir.</li></ol><p>JVM mimarisi, Java’nın platform bağımsızlığını sağlayan ve yüksek performanslı, güvenli ve taşınabilir uygulamalar oluşturulmasını mümkün kılan önemli bir yapıdır. Bu mimari, Java’nın geniş kullanım alanı bulmasını sağlamış ve Java’nın popüler bir programlama dili olmasına katkıda bulunmuştur.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=c001a6e57673" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Compiler ve Interpreter]]></title>
            <link>https://yncrahmet.medium.com/compiler-ve-interpreter-974c9afc484a?source=rss-7d0f5be900e5------2</link>
            <guid isPermaLink="false">https://medium.com/p/974c9afc484a</guid>
            <category><![CDATA[compilers]]></category>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[software]]></category>
            <category><![CDATA[java]]></category>
            <category><![CDATA[interpreters]]></category>
            <dc:creator><![CDATA[Ahmet Yeniçeri]]></dc:creator>
            <pubDate>Wed, 07 Feb 2024 10:26:34 GMT</pubDate>
            <atom:updated>2024-02-07T10:26:34.865Z</atom:updated>
            <content:encoded><![CDATA[<p>Yazılım geliştirme sürecinde Compiler ve Interpreter kavramları sıkça karşımıza çıkar. Bu yazıda, Compiler ve Interpreter’ın ne olduğunu, nasıl çalıştıklarını ve aralarındaki temel farkları ele alacağım. Hem Compiler hem de Interpreter, yazılmış olan bir programın, insanların anlayabileceği dilden bilgisayarın anlayabileceği dile çevrilmesine yardımcı olan yazılım araçlarıdır. Ancak, her ikisi de farklı çalışma prensiplerine ve kullanım alanlarına sahiptir. Şimdi, Compiler ve Interpreter kavramlarına giriş yapalım ve aralarındaki temel farkları keşfedelim.</p><p><strong>Compiler Nedir?</strong></p><p>Compiler, Türkçe olarak derleyici, yazılım geliştirme sürecinde kullanılan bir araçtır ve kodu tamamen işlenmiş bir dosya formatına çevirir. Geliştirici kodunu yazdıktan sonra, compiler bu kodu anlayabilir bir dile çevirir ve genellikle bu çeviri sonucu olarak bir yürütülebilir dosya üretilir. Bu dosya daha sonra bilgisayar tarafından doğrudan çalıştırılır. Compiler, kodu ön işlemeye tabi tutar ve hataları tespit eder, ancak çalışma anında adım adım yorumlama yapmaz.</p><p><strong>Interpreter Nedir?</strong></p><p>Interpreter ise, geliştiricinin yazdığı kodu adım adım yorumlayarak çalıştırmasını sağlar. Türkçe karşılığı yorumlayıcıdır. Interpreter, kodu girilen her adımda işler ve sonuçları gözlemleme imkânı sunar. Bu sayede geliştirici, kodun her aşamasında ne olduğunu daha net bir şekilde görebilir ve olası hataları daha kolay tespit edebilir.</p><p><strong>Compiler ve Interpreter Arasındaki Farklar</strong></p><ul><li>Compiler bir programı bütün olarak alır ve çevirirken; Interpreter programı satır satır çevirir.</li><li>Compiler, ara kod veya hedef kodu oluşturur fakat Interpreter herhangi bir ara kod oluşturmaz. Bundan dolayı Compiler, kodun oluşturulması için daha fazla bellek gerektirir.</li><li>Compiler’da, bir hata oluştuğunda, çeviri işlemi durur ve hata giderildikten sonra bütün program yeniden çeviri işlemine tabi tutulur. Interpreter, bunun tam aksine olarak, eğer bir hata meydana geldiğinde, o anki çeviriyi engeller ve hata giderildiğinde çeviriyi kaldığı yerden devam ettirir. Bu yüzden debug işlemi daha kolaydır.</li><li>Compiler’da, Interpreter’e kıyasla hata bulma daha zordur.</li><li>Compiler, C, C++, C#, Scala, TypeScript gibi dillerde kullanılırken, Interpreter PHP, Perl, Ruby, Python gibi dillerde çalıştırılır.</li></ul><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=974c9afc484a" width="1" height="1" alt="">]]></content:encoded>
        </item>
    </channel>
</rss>