<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="4.4.1">Jekyll</generator><link href="https://program.sonsuz.us/feed.xml" rel="self" type="application/atom+xml" /><link href="https://program.sonsuz.us/" rel="alternate" type="text/html" /><updated>2026-10-18T12:05:42+00:00</updated><id>https://program.sonsuz.us/feed.xml</id><title type="html">SonsuzUs</title><subtitle>Programlama ve Yazılım</subtitle><author><name>Sonsuz Us</name></author><entry><title type="html">C++ Fonksiyon Aşırı Yükleme: Tek İsim, Birden Fazla Yetenek</title><link href="https://program.sonsuz.us/posts/c-fonksiyon-asiri-yukleme-tek-isim-birden-fazla-yetenek/" rel="alternate" type="text/html" title="C++ Fonksiyon Aşırı Yükleme: Tek İsim, Birden Fazla Yetenek" /><published>2026-10-18T00:00:00+00:00</published><updated>2026-10-18T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/c-fonksiyon-asiri-yukleme-tek-isim-birden-fazla-yetenek</id><content type="html" xml:base="https://program.sonsuz.us/posts/c-fonksiyon-asiri-yukleme-tek-isim-birden-fazla-yetenek/"><![CDATA[<p>Bir hesap makinesindeki “topla” düğmesinin tam sayılar, ondalıklı sayılar ve hatta metinler için farklı davranabildiğini düşünün. C++ fonksiyon aşırı yükleme sayesinde benzer işlemleri yapan fonksiyonlara aynı ismi verebilir, kullanım sırasında hangi sürümün çalışacağını derleyiciye bırakabiliriz. Böylece <code class="language-plaintext highlighter-rouge">toplaTamSayilari</code>, <code class="language-plaintext highlighter-rouge">toplaOndalikliSayilari</code> gibi isimler üretmek yerine daha sade ve anlaşılır bir arayüz oluştururuz.</p>

<p>``</p>

<h2 id="fonksiyon-aşırı-yükleme-nedir">Fonksiyon aşırı yükleme nedir?</h2>

<p>Function overloading, aynı kapsam içerisinde aynı isimli fakat farklı parametre listelerine sahip birden fazla fonksiyon tanımlamaktır. Parametre listesindeki tür, sayı veya sıralama değiştiğinde yeni bir overload meydana gelir.</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;iostream&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;string&gt;</span><span class="cp">
</span>
<span class="kt">int</span> <span class="nf">topla</span><span class="p">(</span><span class="kt">int</span> <span class="n">a</span><span class="p">,</span> <span class="kt">int</span> <span class="n">b</span><span class="p">)</span> <span class="p">{</span>
    <span class="k">return</span> <span class="n">a</span> <span class="o">+</span> <span class="n">b</span><span class="p">;</span>
<span class="p">}</span>

<span class="kt">double</span> <span class="nf">topla</span><span class="p">(</span><span class="kt">double</span> <span class="n">a</span><span class="p">,</span> <span class="kt">double</span> <span class="n">b</span><span class="p">)</span> <span class="p">{</span>
    <span class="k">return</span> <span class="n">a</span> <span class="o">+</span> <span class="n">b</span><span class="p">;</span>
<span class="p">}</span>

<span class="n">std</span><span class="o">::</span><span class="n">string</span> <span class="nf">topla</span><span class="p">(</span><span class="k">const</span> <span class="n">std</span><span class="o">::</span><span class="n">string</span><span class="o">&amp;</span> <span class="n">a</span><span class="p">,</span> <span class="k">const</span> <span class="n">std</span><span class="o">::</span><span class="n">string</span><span class="o">&amp;</span> <span class="n">b</span><span class="p">)</span> <span class="p">{</span>
    <span class="k">return</span> <span class="n">a</span> <span class="o">+</span> <span class="n">b</span><span class="p">;</span>
<span class="p">}</span>

<span class="kt">int</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
    <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">topla</span><span class="p">(</span><span class="mi">4</span><span class="p">,</span> <span class="mi">7</span><span class="p">)</span> <span class="o">&lt;&lt;</span> <span class="sc">'\n'</span><span class="p">;</span>
    <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">topla</span><span class="p">(</span><span class="mf">2.5</span><span class="p">,</span> <span class="mf">1.8</span><span class="p">)</span> <span class="o">&lt;&lt;</span> <span class="sc">'\n'</span><span class="p">;</span>
    <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">topla</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">string</span><span class="p">(</span><span class="s">"Merhaba "</span><span class="p">),</span> <span class="n">std</span><span class="o">::</span><span class="n">string</span><span class="p">(</span><span class="s">"C++"</span><span class="p">));</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Burada <code class="language-plaintext highlighter-rouge">topla(4, 7)</code> çağrısı <code class="language-plaintext highlighter-rouge">int</code> sürümünü, ondalıklı argümanlar <code class="language-plaintext highlighter-rouge">double</code> sürümünü seçer. Son sürüm ise iki metni birleştirir. <code class="language-plaintext highlighter-rouge">const std::string&amp;</code> kullanılması, metinlerin gereksiz yere kopyalanmasını önler.</p>

<h2 id="derleyici-doğru-fonksiyonu-nasıl-seçer">Derleyici doğru fonksiyonu nasıl seçer?</h2>

<p>Derleyici, çağrıdaki argümanları mevcut adayların parametreleriyle karşılaştırır. Bu sürece <strong>overload resolution</strong> denir. Basitleştirilmiş biçimde her aday için bir dönüşüm maliyeti düşünülebilir:</p>

\[S = C_1 + C_2 + \cdots + C_n\]

<p>Burada $C_i$, ilgili argümanın parametre türüne dönüştürülme maliyetidir. En düşük $S$ değerine sahip aday seçilir. Tam eşleşme genellikle standart tür dönüşümünden, standart dönüşüm de kullanıcı tanımlı dönüşümden daha güçlüdür.</p>

<table>
  <thead>
    <tr>
      <th>Eşleşme türü</th>
      <th>Örnek</th>
      <th>Tercih düzeyi</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Tam eşleşme</td>
      <td><code class="language-plaintext highlighter-rouge">int</code> → <code class="language-plaintext highlighter-rouge">int</code></td>
      <td>En yüksek</td>
    </tr>
    <tr>
      <td>Terfi</td>
      <td><code class="language-plaintext highlighter-rouge">char</code> → <code class="language-plaintext highlighter-rouge">int</code></td>
      <td>Yüksek</td>
    </tr>
    <tr>
      <td>Standart dönüşüm</td>
      <td><code class="language-plaintext highlighter-rouge">int</code> → <code class="language-plaintext highlighter-rouge">double</code></td>
      <td>Orta</td>
    </tr>
    <tr>
      <td>Kullanıcı tanımlı dönüşüm</td>
      <td>Sınıf dönüşümü</td>
      <td>Daha düşük</td>
    </tr>
  </tbody>
</table>

<p><img src="/img/c-fonksiyon-asiri-87.svg" alt="c-fonksiyon-asiri-87" /></p>

<h2 id="neler-overload-oluşturur">Neler overload oluşturur?</h2>

<p>Aşağıdaki fonksiyonlar geçerli biçimde aşırı yüklenebilir:</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">void</span> <span class="nf">yazdir</span><span class="p">(</span><span class="kt">int</span> <span class="n">deger</span><span class="p">);</span>
<span class="kt">void</span> <span class="nf">yazdir</span><span class="p">(</span><span class="kt">double</span> <span class="n">deger</span><span class="p">);</span>
<span class="kt">void</span> <span class="nf">yazdir</span><span class="p">(</span><span class="kt">int</span> <span class="n">deger</span><span class="p">,</span> <span class="kt">int</span> <span class="n">tekrar</span><span class="p">);</span>
<span class="kt">void</span> <span class="nf">yazdir</span><span class="p">(</span><span class="k">const</span> <span class="n">std</span><span class="o">::</span><span class="n">string</span><span class="o">&amp;</span> <span class="n">metin</span><span class="p">);</span>
</code></pre></div></div>

<p>Birincisi ve ikincisi parametre türüyle, üçüncüsü parametre sayısıyla ayrılır. Ancak yalnızca dönüş türünü değiştirmek yeterli değildir:</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">int</span> <span class="nf">hesapla</span><span class="p">(</span><span class="kt">int</span> <span class="n">x</span><span class="p">);</span>
<span class="c1">// double hesapla(int x); // Hata: Parametre listesi aynı!</span>
</code></pre></div></div>

<p>Çağıran kod yalnızca <code class="language-plaintext highlighter-rouge">hesapla(5)</code> yazdığında hangi dönüş türünü istediğini derleyici kesin olarak anlayamaz. Bu nedenle dönüş türü, fonksiyon aşırı yükleme imzasının ayırt edici parçası değildir.</p>

<h2 id="belirsizlik-tuzağı">Belirsizlik tuzağı</h2>

<p>Dönüşümler eşit derecede uygun olduğunda derleyici seçim yapamaz:</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">void</span> <span class="nf">goster</span><span class="p">(</span><span class="kt">long</span> <span class="n">deger</span><span class="p">)</span> <span class="p">{}</span>
<span class="kt">void</span> <span class="nf">goster</span><span class="p">(</span><span class="kt">double</span> <span class="n">deger</span><span class="p">)</span> <span class="p">{}</span>

<span class="kt">int</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
    <span class="c1">// goster(10); // Belirsiz çağrı</span>
    <span class="n">goster</span><span class="p">(</span><span class="mi">10L</span><span class="p">);</span>   <span class="c1">// long sürümü</span>
    <span class="n">goster</span><span class="p">(</span><span class="mf">10.0</span><span class="p">);</span>  <span class="c1">// double sürümü</span>
<span class="p">}</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">10</code>, <code class="language-plaintext highlighter-rouge">int</code> türündedir ve hem <code class="language-plaintext highlighter-rouge">long</code> hem de <code class="language-plaintext highlighter-rouge">double</code> türüne dönüştürülebilir. <code class="language-plaintext highlighter-rouge">L</code> ve <code class="language-plaintext highlighter-rouge">.0</code> ekleriyle niyet açıkça belirtilir. Benzer sorunlar varsayılan parametrelerle de oluşabilir.</p>

<table>
  <thead>
    <tr>
      <th>Yaklaşım</th>
      <th>Avantaj</th>
      <th>Risk</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Farklı fonksiyon adları</td>
      <td>Seçim tamamen açıktır</td>
      <td>Gereksiz isim kalabalığı</td>
    </tr>
    <tr>
      <td>Overloading</td>
      <td>Temiz ve doğal API</td>
      <td>Belirsiz çağrı ihtimali</td>
    </tr>
    <tr>
      <td>Şablonlar</td>
      <td>Çok sayıda türü destekler</td>
      <td>Hata mesajları karmaşıklaşabilir</td>
    </tr>
  </tbody>
</table>

<h2 id="ne-zaman-kullanmalıyız">Ne zaman kullanmalıyız?</h2>

<p>Aşırı yüklenen fonksiyonlar kavramsal olarak aynı işi yapmalıdır. <code class="language-plaintext highlighter-rouge">yazdir</code>, <code class="language-plaintext highlighter-rouge">hesapla</code> veya <code class="language-plaintext highlighter-rouge">ekle</code> gibi işlemler bunun için uygundur. Bir overload dosya silerken diğeri matematiksel hesap yapıyorsa ortak isim geliştiriciyi şaşırtır.</p>

<p>Kısacası function overloading, C++ arayüzlerini esnek ve okunabilir hâle getirir. Parametre listelerini belirgin tuttuğunuz, örtük dönüşümleri sınırladığınız ve her sürüme aynı kavramsal sorumluluğu verdiğiniz sürece tek bir isim gerçekten birçok yeteneği zarifçe taşıyabilir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="c++" /><category term="fonksiyonlar" /><category term="function-overloading" /><category term="oop" /><category term="programlama" /><summary type="html"><![CDATA[Bir hesap makinesindeki “topla” düğmesinin tam sayılar, ondalıklı sayılar ve hatta metinler için farklı davranabildiğini düşünün. C++ fonksiyon aşırı yükleme sayesinde benzer işlemleri yapan fonksiyonlara aynı ismi verebilir, kullanım sırasında hangi sürümün çalışacağını derleyiciye bırakabiliriz. Böylece toplaTamSayilari, toplaOndalikliSayilari gibi isimler üretmek yerine daha sade ve anlaşılır bir arayüz oluştururuz.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/c-fonksiyon-asiri-87.png" /><media:content medium="image" url="https://program.sonsuz.us/img/c-fonksiyon-asiri-87.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">C++ İstisna Yönetimi: Hataları Güvenle Yakalamak</title><link href="https://program.sonsuz.us/posts/c-istisna-yonetimi-hatalari-guvenle-yakalamak/" rel="alternate" type="text/html" title="C++ İstisna Yönetimi: Hataları Güvenle Yakalamak" /><published>2026-10-18T00:00:00+00:00</published><updated>2026-10-18T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/c-istisna-yonetimi-hatalari-guvenle-yakalamak</id><content type="html" xml:base="https://program.sonsuz.us/posts/c-istisna-yonetimi-hatalari-guvenle-yakalamak/"><![CDATA[<p>Bir C++ programı derlenmiş olsa bile çalışma sırasında dosya bulunamaması, belleğin ayrılamaması veya geçersiz veriyle karşılaşılması gibi sorunlar yaşayabilir. İstisna yönetimi, bu beklenmedik durumları programı aniden sonlandırmadan uygun bir noktaya bildirmemizi sağlar. Kısacası <code class="language-plaintext highlighter-rouge">throw</code> alarmı çalıştırır, <code class="language-plaintext highlighter-rouge">try</code> riskli bölgeyi gözetler, <code class="language-plaintext highlighter-rouge">catch</code> ise olaya müdahale eder.
``</p>
<h2 id="i̇stisna-yönetiminin-temel-mantığı">İstisna yönetiminin temel mantığı</h2>

<p>Normal koşullarda fonksiyonlar sonuçlarını <code class="language-plaintext highlighter-rouge">return</code> ile döndürür. Ancak bir fonksiyon görevini tamamlayamıyorsa sıradan bir sonuç döndürmek yanıltıcı olabilir. Örneğin pozitif sayı bekleyen bir karekök fonksiyonuna negatif değer verilmesi ayrı bir kontrol akışı gerektirir.</p>

<p>İstisna oluştuğunda program, uygun bir <code class="language-plaintext highlighter-rouge">catch</code> bloğu bulana kadar çağrı zincirinde geriye ilerler. Bu sürece <strong>stack unwinding</strong> denir. Matematiksel olarak bir fonksiyonun geçerli kümesini şöyle gösterebiliriz:</p>

\[f(x) = \sqrt{x}, \qquad x \in [0, \infty)\]

<p>Burada $x &lt; 0$ olması, fonksiyon sözleşmesinin ihlal edildiğini belirtir.</p>

<table>
  <thead>
    <tr>
      <th>Araç</th>
      <th>Görevi</th>
      <th>Benzetme</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">try</code></td>
      <td>Hata oluşturabilecek kodu çalıştırır</td>
      <td>Güvenlik kamerası</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">throw</code></td>
      <td>İstisna üretir</td>
      <td>Alarm düğmesi</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">catch</code></td>
      <td>Belirli istisnayı yakalar</td>
      <td>Müdahale ekibi</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">noexcept</code></td>
      <td>Fonksiyonun istisna fırlatmayacağını bildirir</td>
      <td>Güvenlik garantisi</td>
    </tr>
  </tbody>
</table>

<h2 id="temel-try-throw-ve-catch-kullanımı">Temel <code class="language-plaintext highlighter-rouge">try</code>, <code class="language-plaintext highlighter-rouge">throw</code> ve <code class="language-plaintext highlighter-rouge">catch</code> kullanımı</h2>

<p>Aşağıdaki örnek, bölme işleminden önce paydayı denetler. Sıfıra bölme tespit edildiğinde <code class="language-plaintext highlighter-rouge">std::runtime_error</code> nesnesi fırlatılır:</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;iostream&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;stdexcept&gt;</span><span class="cp">
</span>
<span class="kt">double</span> <span class="nf">bol</span><span class="p">(</span><span class="kt">double</span> <span class="n">pay</span><span class="p">,</span> <span class="kt">double</span> <span class="n">payda</span><span class="p">)</span> <span class="p">{</span>
    <span class="k">if</span> <span class="p">(</span><span class="n">payda</span> <span class="o">==</span> <span class="mf">0.0</span><span class="p">)</span> <span class="p">{</span>
        <span class="k">throw</span> <span class="n">std</span><span class="o">::</span><span class="n">runtime_error</span><span class="p">(</span><span class="s">"Sıfıra bölme girişimi!"</span><span class="p">);</span>
    <span class="p">}</span>
    <span class="k">return</span> <span class="n">pay</span> <span class="o">/</span> <span class="n">payda</span><span class="p">;</span>
<span class="p">}</span>

<span class="kt">int</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
    <span class="k">try</span> <span class="p">{</span>
        <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">bol</span><span class="p">(</span><span class="mi">42</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span> <span class="o">&lt;&lt;</span> <span class="sc">'\n'</span><span class="p">;</span>
    <span class="p">}</span> <span class="k">catch</span> <span class="p">(</span><span class="k">const</span> <span class="n">std</span><span class="o">::</span><span class="n">runtime_error</span><span class="o">&amp;</span> <span class="n">hata</span><span class="p">)</span> <span class="p">{</span>
        <span class="n">std</span><span class="o">::</span><span class="n">cerr</span> <span class="o">&lt;&lt;</span> <span class="s">"Hata: "</span> <span class="o">&lt;&lt;</span> <span class="n">hata</span><span class="p">.</span><span class="n">what</span><span class="p">()</span> <span class="o">&lt;&lt;</span> <span class="sc">'\n'</span><span class="p">;</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<p>İstisnanın <code class="language-plaintext highlighter-rouge">const</code> referansla yakalanması gereksiz kopyalamayı engeller ve çok biçimliliği korur. <code class="language-plaintext highlighter-rouge">what()</code> metodu ise hatanın açıklamasını verir. Program kontrolsüz biçimde çökmek yerine kullanıcıya anlamlı bir mesaj sunar.</p>

<h2 id="standart-mı-özel-istisna-mı">Standart mı, özel istisna mı?</h2>

<p>C++ standart kütüphanesi <code class="language-plaintext highlighter-rouge">std::exception</code> tabanlı birçok hata türü sağlar.</p>

<table>
  <thead>
    <tr>
      <th>İstisna</th>
      <th>Uygun kullanım</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">std::invalid_argument</code></td>
      <td>Geçersiz fonksiyon argümanı</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">std::out_of_range</code></td>
      <td>Aralık dışı indeks</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">std::runtime_error</code></td>
      <td>Genel çalışma zamanı sorunu</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">std::bad_alloc</code></td>
      <td>Bellek ayırma başarısızlığı</td>
    </tr>
  </tbody>
</table>

<p>Uygulamaya özgü hatalar için özel bir sınıf da tanımlanabilir:</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;stdexcept&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;string&gt;</span><span class="cp">
</span>
<span class="k">class</span> <span class="nc">BakiyeHatasi</span> <span class="o">:</span> <span class="k">public</span> <span class="n">std</span><span class="o">::</span><span class="n">runtime_error</span> <span class="p">{</span>
<span class="nl">public:</span>
    <span class="k">explicit</span> <span class="n">BakiyeHatasi</span><span class="p">(</span><span class="k">const</span> <span class="n">std</span><span class="o">::</span><span class="n">string</span><span class="o">&amp;</span> <span class="n">mesaj</span><span class="p">)</span>
        <span class="o">:</span> <span class="n">std</span><span class="o">::</span><span class="n">runtime_error</span><span class="p">(</span><span class="n">mesaj</span><span class="p">)</span> <span class="p">{}</span>
<span class="p">};</span>

<span class="kt">void</span> <span class="nf">paraCek</span><span class="p">(</span><span class="kt">double</span> <span class="n">bakiye</span><span class="p">,</span> <span class="kt">double</span> <span class="n">miktar</span><span class="p">)</span> <span class="p">{</span>
    <span class="k">if</span> <span class="p">(</span><span class="n">miktar</span> <span class="o">&gt;</span> <span class="n">bakiye</span><span class="p">)</span> <span class="p">{</span>
        <span class="k">throw</span> <span class="n">BakiyeHatasi</span><span class="p">(</span><span class="s">"Yetersiz bakiye"</span><span class="p">);</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Bu yaklaşım, çağıran kodun banka işlemlerine özgü problemi diğer çalışma zamanı hatalarından ayırmasını sağlar.</p>

<h2 id="yakalama-sırası-ve-yeniden-fırlatma">Yakalama sırası ve yeniden fırlatma</h2>

<p><code class="language-plaintext highlighter-rouge">catch</code> blokları özel türden genel türe doğru sıralanmalıdır. Aksi hâlde <code class="language-plaintext highlighter-rouge">std::exception</code> gibi genel bir blok, türetilmiş bütün istisnaları önce yakalayabilir.</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">try</span> <span class="p">{</span>
    <span class="n">paraCek</span><span class="p">(</span><span class="mi">100</span><span class="p">,</span> <span class="mi">250</span><span class="p">);</span>
<span class="p">}</span> <span class="k">catch</span> <span class="p">(</span><span class="k">const</span> <span class="n">BakiyeHatasi</span><span class="o">&amp;</span> <span class="n">hata</span><span class="p">)</span> <span class="p">{</span>
    <span class="n">std</span><span class="o">::</span><span class="n">cerr</span> <span class="o">&lt;&lt;</span> <span class="n">hata</span><span class="p">.</span><span class="n">what</span><span class="p">()</span> <span class="o">&lt;&lt;</span> <span class="sc">'\n'</span><span class="p">;</span>
    <span class="k">throw</span><span class="p">;</span> <span class="c1">// Aynı istisnayı üst seviyeye iletir</span>
<span class="p">}</span> <span class="k">catch</span> <span class="p">(</span><span class="k">const</span> <span class="n">std</span><span class="o">::</span><span class="n">exception</span><span class="o">&amp;</span> <span class="n">hata</span><span class="p">)</span> <span class="p">{</span>
    <span class="n">std</span><span class="o">::</span><span class="n">cerr</span> <span class="o">&lt;&lt;</span> <span class="s">"Genel hata: "</span> <span class="o">&lt;&lt;</span> <span class="n">hata</span><span class="p">.</span><span class="n">what</span><span class="p">()</span> <span class="o">&lt;&lt;</span> <span class="sc">'\n'</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Parametresiz <code class="language-plaintext highlighter-rouge">throw;</code>, mevcut istisnayı türünü kaybetmeden yeniden fırlatır. Bu yöntem, alt seviyede kayıt tutup üst seviyede kullanıcıya cevap vermek için kullanışlıdır.</p>

<h2 id="güvenli-tasarım-için-kısa-kurallar">Güvenli tasarım için kısa kurallar</h2>

<p>İstisnaları sıradan döngü kontrolü amacıyla değil, gerçekten olağan dışı durumlar için kullanın. Kaynak yönetiminde RAII yaklaşımını tercih edin; <code class="language-plaintext highlighter-rouge">std::vector</code>, <code class="language-plaintext highlighter-rouge">std::string</code> ve akıllı işaretçiler stack unwinding sırasında otomatik olarak temizlenir. Yıkıcılar mümkünse istisna fırlatmamalıdır. Ayrıca yalnızca gerçekten garanti verebildiğiniz fonksiyonları <code class="language-plaintext highlighter-rouge">noexcept</code> olarak işaretleyin.</p>

<p>Doğru tasarlanmış istisna yönetimi hataları yok etmez; onları görünür, sınıflandırılabilir ve güvenli biçimde yönetilebilir hâle getirir. Böylece programınız ilk beklenmedik durumda havlu atmak yerine kontrollü bir iniş yapar.</p>

<p><img src="/img/c-istisna-yonetimi-33.svg" alt="c-istisna-yonetimi-33" /></p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="c++" /><category term="istisna yönetimi" /><category term="exception handling" /><category term="try-catch" /><category term="hata yönetimi" /><summary type="html"><![CDATA[Bir C++ programı derlenmiş olsa bile çalışma sırasında dosya bulunamaması, belleğin ayrılamaması veya geçersiz veriyle karşılaşılması gibi sorunlar yaşayabilir. İstisna yönetimi, bu beklenmedik durumları programı aniden sonlandırmadan uygun bir noktaya bildirmemizi sağlar. Kısacası throw alarmı çalıştırır, try riskli bölgeyi gözetler, catch ise olaya müdahale eder.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/c-istisna-yonetimi-33.png" /><media:content medium="image" url="https://program.sonsuz.us/img/c-istisna-yonetimi-33.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">C++ Şablonlarında Specialization ve Overloading: Derleyicinin İnce Seçim Oyunu</title><link href="https://program.sonsuz.us/posts/c-sablonlarinda-specialization-ve-overloading-derleyicinin-ince-secim-oyunu/" rel="alternate" type="text/html" title="C++ Şablonlarında Specialization ve Overloading: Derleyicinin İnce Seçim Oyunu" /><published>2026-10-18T00:00:00+00:00</published><updated>2026-10-18T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/c-sablonlarinda-specialization-ve-overloading-derleyicinin-ince-secim-oyunu</id><content type="html" xml:base="https://program.sonsuz.us/posts/c-sablonlarinda-specialization-ve-overloading-derleyicinin-ince-secim-oyunu/"><![CDATA[<p><img src="/img/c-sablonlarinda-specialization-82.svg" alt="c-sablonlarinda-specialization-82" /></p>

<p>C++ şablonlarında özelleştirme ve aşırı yükleme aynı hedefe gidiyormuş gibi görünür: belirli türlerde farklı davranmak. Fakat derleyicinin gözünde bunlar iki ayrı mekanizmadır. Overloading adaylar arasındaki yarışı belirlerken specialization, yarışı kazanan şablonun özel bir sürümünün bulunup bulunmadığına bakar. Küçük görünen bu sıra farkı, şaşırtıcı sonuçların kaynağıdır.</p>

<p>``</p>

<h2 id="i̇ki-mekanizmanın-temel-anlamı">İki mekanizmanın temel anlamı</h2>

<p>Bir fonksiyon şablonunu aşırı yüklediğimizde derleyicinin aday listesine yeni bir fonksiyon şablonu ekleriz. Açık özelleştirme ise yeni ve bağımsız bir aday oluşturmaz; mevcut birincil şablonun belirli argümanlar için alternatif uygulamasını tanımlar.</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;iostream&gt;</span><span class="cp">
</span>
<span class="k">template</span><span class="o">&lt;</span><span class="k">typename</span> <span class="nc">T</span><span class="p">&gt;</span>
<span class="kt">void</span> <span class="nf">goster</span><span class="p">(</span><span class="n">T</span><span class="p">)</span> <span class="p">{</span>
    <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">"Genel sürüm</span><span class="se">\n</span><span class="s">"</span><span class="p">;</span>
<span class="p">}</span>

<span class="k">template</span><span class="o">&lt;</span><span class="p">&gt;</span>
<span class="kt">void</span> <span class="n">goster</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span><span class="p">(</span><span class="kt">int</span><span class="p">)</span> <span class="p">{</span>
    <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">"int özelleştirmesi</span><span class="se">\n</span><span class="s">"</span><span class="p">;</span>
<span class="p">}</span>

<span class="k">template</span><span class="o">&lt;</span><span class="k">typename</span> <span class="nc">T</span><span class="p">&gt;</span>
<span class="kt">void</span> <span class="nf">goster</span><span class="p">(</span><span class="n">T</span><span class="o">*</span><span class="p">)</span> <span class="p">{</span>
    <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">"İşaretçi overload'u</span><span class="se">\n</span><span class="s">"</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Burada üç bildirim varmış gibi görünse de overload çözümlemesinde yalnızca <code class="language-plaintext highlighter-rouge">goster(T)</code> ve <code class="language-plaintext highlighter-rouge">goster(T*)</code> yarışır. <code class="language-plaintext highlighter-rouge">goster&lt;int&gt;</code> ise ilk şablona bağlı bir açık özelleştirmedir.</p>

<table>
  <thead>
    <tr>
      <th>Özellik</th>
      <th>Overloading</th>
      <th>Specialization</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Yeni aday oluşturur mu?</td>
      <td>Evet</td>
      <td>Hayır</td>
    </tr>
    <tr>
      <td>Fonksiyonlarda kısmi biçimi var mı?</td>
      <td>Overload ile benzetilebilir</td>
      <td>Hayır</td>
    </tr>
    <tr>
      <td>Seçim zamanı</td>
      <td>Overload çözümlemesi sırasında</td>
      <td>Birincil şablon seçildikten sonra</td>
    </tr>
    <tr>
      <td>Kapsam</td>
      <td>Fonksiyon ve normal fonksiyonlar</td>
      <td>Birincil şablona bağlı</td>
    </tr>
    <tr>
      <td>Temel amaç</td>
      <td>Farklı parametre biçimleri</td>
      <td>Belirli argüman için özel uygulama</td>
    </tr>
  </tbody>
</table>

<h2 id="derleyicinin-seçim-sırası">Derleyicinin seçim sırası</h2>

<p>Basitleştirilmiş süreç şöyledir:</p>

<ol>
  <li>Görünür fonksiyonlar ve fonksiyon şablonları aday kümeye alınır.</li>
  <li>Şablon argüman çıkarımı yapılır.</li>
  <li>Dönüşüm kalitesi ve şablonların kısmi sıralaması değerlendirilir.</li>
  <li>En iyi overload seçilir.</li>
  <li>Kazanan bir fonksiyon şablonuysa ona ait açık özelleştirme aranır.</li>
</ol>

<p>Bunu kabaca</p>

\[\text{çağrılacak fonksiyon} = \operatorname{specialization}(\operatorname{bestOverload}(C))\]

<p>şeklinde düşünebiliriz. Buradaki $C$, uygun adaylar kümesidir. İşlemlerin sırası ters değildir; specialization önce yarışıp overload’u yenemez.</p>

<h2 id="klasik-işaretçi-sürprizi">Klasik işaretçi sürprizi</h2>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">int</span><span class="o">*</span> <span class="n">p</span> <span class="o">=</span> <span class="nb">nullptr</span><span class="p">;</span>
<span class="n">goster</span><span class="p">(</span><span class="n">p</span><span class="p">);</span>
</code></pre></div></div>

<p>İlk bakışta <code class="language-plaintext highlighter-rouge">T = int*</code> olduğundan genel şablonun <code class="language-plaintext highlighter-rouge">int*</code> özelleştirmesinin aranacağı düşünülebilir. Ancak <code class="language-plaintext highlighter-rouge">goster(T*)</code>, <code class="language-plaintext highlighter-rouge">int*</code> argümanı için <code class="language-plaintext highlighter-rouge">goster(T)</code> şablonundan daha özeldir. Dolayısıyla pointer overload’u yarışı kazanır. Derleyici artık yalnızca bu kazanan şablona bağlı bir explicit specialization olup olmadığına bakar; diğer birincil şablonun özelleştirmesine geri dönmez.</p>

<p>Bu nedenle bir specialization’ın hangi birincil şablona bağlı olduğu kritik önemdedir. Bildirim sırası ve specialization bildiriminin çağrıdan önce görünür olması da ayrı derleme birimlerinde ciddi farklar yaratabilir. Açık özelleştirme, örtük örneklemeye yol açan ilk kullanımdan önce bildirilmelidir.</p>

<h2 id="neden-fonksiyon-şablonları-kısmen-özelleştirilemez">Neden fonksiyon şablonları kısmen özelleştirilemez?</h2>

<p>Sınıf şablonlarında kısmi özelleştirme geçerlidir:</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">template</span><span class="o">&lt;</span><span class="k">typename</span> <span class="nc">T</span><span class="p">&gt;</span>
<span class="k">struct</span> <span class="nc">Bilgi</span><span class="p">;</span>

<span class="k">template</span><span class="o">&lt;</span><span class="k">typename</span> <span class="nc">T</span><span class="p">&gt;</span>
<span class="k">struct</span> <span class="nc">Bilgi</span><span class="o">&lt;</span><span class="n">T</span><span class="o">*&gt;</span> <span class="p">{</span>
    <span class="k">static</span> <span class="k">constexpr</span> <span class="kt">bool</span> <span class="n">pointer</span> <span class="o">=</span> <span class="nb">true</span><span class="p">;</span>
<span class="p">};</span>
</code></pre></div></div>

<p>Fakat aşağıdaki fonksiyon biçimi geçersizdir:</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">template</span><span class="o">&lt;</span><span class="k">typename</span> <span class="nc">T</span><span class="p">&gt;</span>
<span class="kt">void</span> <span class="n">isle</span><span class="o">&lt;</span><span class="n">T</span><span class="o">*&gt;</span><span class="p">(</span><span class="n">T</span><span class="o">*</span><span class="p">);</span> <span class="c1">// Geçersiz kısmi specialization</span>
</code></pre></div></div>

<p>Fonksiyonlarda aynı niyet overload ile ifade edilir:</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">template</span><span class="o">&lt;</span><span class="k">typename</span> <span class="nc">T</span><span class="p">&gt;</span>
<span class="kt">void</span> <span class="nf">isle</span><span class="p">(</span><span class="n">T</span><span class="o">*</span><span class="p">)</span> <span class="p">{</span>
    <span class="c1">// Türetilen her işaretçi türü için ortak davranış</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Bunun önemli nedeni, fonksiyonlarda zaten overload çözümlemesi bulunmasıdır. Kısmi specialization da eklenseydi iki ayrı sıralama sistemi birbiriyle çakışabilirdi.</p>

<h2 id="pratik-tercih-rehberi">Pratik tercih rehberi</h2>

<p>Bir tür ailesini yakalamak istiyorsanız overload kullanın. Yalnızca tek ve kesin bir şablon argümanı kombinasyonunda davranışı değiştirecekseniz explicit specialization düşünülebilir. Bununla birlikte fonksiyonlarda overload çoğu zaman daha okunabilir ve öngörülebilirdir.</p>

<p>Modern C++ kodunda <code class="language-plaintext highlighter-rouge">if constexpr</code>, kavramlar ve <code class="language-plaintext highlighter-rouge">requires</code> ifadeleri de güçlü alternatiflerdir. Özellikle kısıtlı overload’lar, niyeti doğrudan tür sistemi üzerinden anlatır. Altın kural şudur: specialization’ı bağımsız yarışmacı sanmayın; o, ancak bağlı olduğu şablon yarışı kazandığında sahneye çıkan yedek oyuncudur.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="c++" /><category term="templates" /><category term="specialization" /><category term="overloading" /><category term="derleyici" /><category term="generic-programming" /><summary type="html"><![CDATA[C++ şablonlarında özelleştirme ve aşırı yükleme aynı hedefe gidiyormuş gibi görünür: belirli türlerde farklı davranmak. Fakat derleyicinin gözünde bunlar iki ayrı mekanizmadır. Overloading adaylar arasındaki yarışı belirlerken specialization, yarışı kazanan şablonun özel bir sürümünün bulunup bulunmadığına bakar. Küçük görünen bu sıra farkı, şaşırtıcı sonuçların kaynağıdır.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/c-sablonlarinda-specialization-82.png" /><media:content medium="image" url="https://program.sonsuz.us/img/c-sablonlarinda-specialization-82.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Fazladan Eklem, Fazladan Kaçış: Redundant Robot Kollarda Engel Atlama</title><link href="https://program.sonsuz.us/posts/fazladan-eklem-fazladan-kacis-redundant-robot-kollarda-engel-atlama/" rel="alternate" type="text/html" title="Fazladan Eklem, Fazladan Kaçış: Redundant Robot Kollarda Engel Atlama" /><published>2026-10-18T00:00:00+00:00</published><updated>2026-10-18T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/fazladan-eklem-fazladan-kacis-redundant-robot-kollarda-engel-atlama</id><content type="html" xml:base="https://program.sonsuz.us/posts/fazladan-eklem-fazladan-kacis-redundant-robot-kollarda-engel-atlama/"><![CDATA[<p>Bir robot kolunun görevi yalnızca hedefe ulaşmak değildir; bunu masaya, duvara veya merakla yaklaşan başka bir robota çarpmadan yapması gerekir. Redundant, yani artıklıklı çok eklemli kollar tam bu noktada avantaj sağlar. Uç efektörün konumu değişmeden dirseklerini ve diğer eklemlerini hareket ettirebilen bu robotlar, engeller karşısında adeta “hedefe bakarken belini büken” mekanik akrobatlara dönüşür.
``</p>
<h2 id="artıklılık-ne-anlama-gelir">Artıklılık ne anlama gelir?</h2>

<p>Bir manipülatörün eklem değişkenlerini $q \in R^n$, uç efektör görevini ise $x \in R^m$ ile gösterelim. İleri kinematik ilişki</p>

\[x = f(q)\]

<p>şeklindedir. Eğer eklem sayısı görev uzayının boyutundan büyükse, yani $n &gt; m$ ise sistem redundant kabul edilir. Örneğin üç boyutlu uzayda yalnızca uç noktanın konumunu kontrol etmek için üç bağımsız değişken yeterliyken yedi eklemli bir kol dört adet fazladan serbestlik derecesine sahiptir.</p>

<p>Bu fazlalık gereksiz değildir. Aynı uç efektör konumunu üreten birden fazla eklem yapılandırması bulunabilir. Robot böylece ana görevi bozmadan dirseğini bir engelden uzaklaştırabilir, eklem sınırlarından kaçabilir veya daha rahat bir duruş seçebilir.</p>

<table>
  <thead>
    <tr>
      <th>Özellik</th>
      <th>Minimum serbestlikli kol</th>
      <th>Redundant kol</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Aynı hedef için çözüm</td>
      <td>Genellikle sınırlı</td>
      <td>Çok sayıda</td>
    </tr>
    <tr>
      <td>Engel çevresinde hareket</td>
      <td>Kısıtlı</td>
      <td>Esnek</td>
    </tr>
    <tr>
      <td>Eklem sınırlarından kaçış</td>
      <td>Zor</td>
      <td>İkincil görevle mümkün</td>
    </tr>
    <tr>
      <td>Hesaplama maliyeti</td>
      <td>Daha düşük</td>
      <td>Daha yüksek</td>
    </tr>
    <tr>
      <td>Arıza toleransı</td>
      <td>Düşük</td>
      <td>Görece yüksek</td>
    </tr>
  </tbody>
</table>

<p><img src="/img/fazladan-eklem-fazladan-66.svg" alt="fazladan-eklem-fazladan-66" /></p>

<h2 id="jacobian-ve-sıfır-uzayı">Jacobian ve sıfır uzayı</h2>

<p>Eklem hızları ile uç efektör hızı arasındaki ilişki Jacobian matrisiyle kurulur:</p>

\[\dot{x} = J(q)\dot{q}\]

<p>Redundant bir sistemde ters çözüm tek değildir. Yaygın hız çözümü şöyledir:</p>

\[\dot{q} = J^+\dot{x} + (I-J^+J)z\]

<p>Burada $J^+$ Jacobian’ın sözde tersidir. İlk terim uç efektörü hedeflenen yönde hareket ettirir. İkinci terim ise Jacobian’ın sıfır uzayında kalır; başka bir deyişle uç efektör hareketini değiştirmeden eklemleri oynatır. Engel kaçınma sihrinin büyük bölümü bu ikinci terimdedir.</p>

<p>$z$ vektörü, robotu engelden uzaklaştıran bir maliyet fonksiyonunun negatif gradyanı olarak seçilebilir:</p>

\[z = -k \nabla H(q)\]

<p>$H(q)$ robot ile engel arasındaki mesafe azaldıkça büyüyen bir ceza fonksiyonu olabilir. Böylece robot bir eliyle hedefe ilerlerken “dirseğini içeri çekebilir.”</p>

<h2 id="basit-bir-hesaplama-örneği">Basit bir hesaplama örneği</h2>

<p>Aşağıdaki Python kodu, ana uç efektör hızına sıfır uzayı üzerinden ikincil bir kaçınma hareketi ekler:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="n">numpy</span> <span class="k">as</span> <span class="n">np</span>

<span class="k">def</span> <span class="nf">redundant_velocity</span><span class="p">(</span><span class="n">J</span><span class="p">,</span> <span class="n">target_velocity</span><span class="p">,</span> <span class="n">avoidance_gradient</span><span class="p">,</span> <span class="n">gain</span><span class="o">=</span><span class="mf">0.4</span><span class="p">):</span>
    <span class="n">J_pinv</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="n">linalg</span><span class="p">.</span><span class="nf">pinv</span><span class="p">(</span><span class="n">J</span><span class="p">)</span>
    <span class="n">identity</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">eye</span><span class="p">(</span><span class="n">J</span><span class="p">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span>

    <span class="n">primary</span> <span class="o">=</span> <span class="n">J_pinv</span> <span class="o">@</span> <span class="n">target_velocity</span>
    <span class="n">null_space</span> <span class="o">=</span> <span class="n">identity</span> <span class="o">-</span> <span class="n">J_pinv</span> <span class="o">@</span> <span class="n">J</span>
    <span class="n">secondary</span> <span class="o">=</span> <span class="n">null_space</span> <span class="o">@</span> <span class="p">(</span><span class="o">-</span><span class="n">gain</span> <span class="o">*</span> <span class="n">avoidance_gradient</span><span class="p">)</span>

    <span class="k">return</span> <span class="n">primary</span> <span class="o">+</span> <span class="n">secondary</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">primary</code> hedefe ulaşma görevini gerçekleştirir. <code class="language-plaintext highlighter-rouge">secondary</code> ise engel maliyetini azaltmaya çalışır. <code class="language-plaintext highlighter-rouge">null_space</code> izdüşümü sayesinde ikincil hareket, ideal matematiksel koşullarda uç efektörün istenen hızını bozmaz.</p>

<h2 id="potansiyel-alan-yaklaşımı">Potansiyel alan yaklaşımı</h2>

<p>Engeller çoğu zaman itici potansiyel alanlarla modellenir. Engel ile robot noktası arasındaki mesafe $d$, etkinin başladığı güvenli mesafe $d_0$ olsun:</p>

\[U(d) = \frac{1}{2}\eta\left(\frac{1}{d}-\frac{1}{d_0}\right)^2, \quad d &lt; d_0\]

<p>Robot engelden uzaktaysa ceza sıfırdır; yaklaştıkça hızla büyür. Bu yöntem sezgiseldir fakat yerel minimumlara takılabilir. Ayrıca yalnızca uç efektörü değil, dirsek ve bağlantılar üzerindeki örnek noktaları da kontrol etmek gerekir.</p>

<table>
  <thead>
    <tr>
      <th>Yaklaşım</th>
      <th>Avantaj</th>
      <th>Dezavantaj</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Potansiyel alan</td>
      <td>Hızlı ve sezgisel</td>
      <td>Yerel minimum oluşturabilir</td>
    </tr>
    <tr>
      <td>Sıfır uzayı kontrolü</td>
      <td>Ana görevi korur</td>
      <td>Tekilliklere duyarlıdır</td>
    </tr>
    <tr>
      <td>Optimizasyon tabanlı kontrol</td>
      <td>Kısıtları birlikte işler</td>
      <td>Daha fazla hesaplama ister</td>
    </tr>
  </tbody>
</table>

<p>Sonuç olarak fazladan serbestlik derecesi, robota yalnızca daha fazla hareket değil, aynı hedefe giderken daha iyi hareket seçme özgürlüğü verir. Doğru kontrol algoritmasıyla redundant kol; engellerden kaçınabilir, eklem sınırlarını koruyabilir ve çalışma alanında çok daha güvenli davranabilir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="robotik" /><category term="redundant manipülatör" /><category term="engel kaçınma" /><category term="ters kinematik" /><category term="jacobian" /><category term="optimizasyon" /><summary type="html"><![CDATA[Bir robot kolunun görevi yalnızca hedefe ulaşmak değildir; bunu masaya, duvara veya merakla yaklaşan başka bir robota çarpmadan yapması gerekir. Redundant, yani artıklıklı çok eklemli kollar tam bu noktada avantaj sağlar. Uç efektörün konumu değişmeden dirseklerini ve diğer eklemlerini hareket ettirebilen bu robotlar, engeller karşısında adeta “hedefe bakarken belini büken” mekanik akrobatlara dönüşür.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/fazladan-eklem-fazladan-66.png" /><media:content medium="image" url="https://program.sonsuz.us/img/fazladan-eklem-fazladan-66.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Java Operatörleri ve Kontrol İfadeleriyle Program Akışını Yönetmek</title><link href="https://program.sonsuz.us/posts/java-operatorleri-ve-kontrol-ifadeleriyle-program-akisini-yonetmek/" rel="alternate" type="text/html" title="Java Operatörleri ve Kontrol İfadeleriyle Program Akışını Yönetmek" /><published>2026-10-18T00:00:00+00:00</published><updated>2026-10-18T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/java-operatorleri-ve-kontrol-ifadeleriyle-program-akisini-yonetmek</id><content type="html" xml:base="https://program.sonsuz.us/posts/java-operatorleri-ve-kontrol-ifadeleriyle-program-akisini-yonetmek/"><![CDATA[<p>Bir Java programı yalnızca yukarıdan aşağıya çalışan komutlardan oluşsaydı, hesap makinesinden biraz daha heyecanlı uygulamalar geliştirmek zor olurdu. Operatörler verileri işlerken kontrol ifadeleri programın hangi yolu izleyeceğine karar verir. Başka bir deyişle operatörler soruları hazırlar, karar yapıları cevapları değerlendirir, döngüler ise gerekli işleri sabırla tekrarlar.
``</p>
<h2 id="operatörler-programın-hesaplama-araçları">Operatörler: Programın hesaplama araçları</h2>

<p>Operatörler, bir veya daha fazla değer üzerinde işlem yapan sembollerdir. Örneğin <code class="language-plaintext highlighter-rouge">+</code> toplama yaparken <code class="language-plaintext highlighter-rouge">&gt;</code> iki değeri karşılaştırır. Bir ifadenin sonucu başka bir operatörün girdisi olabilir. Bu nedenle işlem önceliğini anlamak önemlidir.</p>

<p>Örneğin aşağıdaki matematiksel ifade Java’da da aynı öncelik mantığıyla değerlendirilir:</p>

\[sonuc = 10 + 4 \times 2 = 18\]

<p>Çarpma önce çalışır. Sonucun <code class="language-plaintext highlighter-rouge">28</code> olması isteniyorsa parantez kullanılmalıdır: <code class="language-plaintext highlighter-rouge">(10 + 4) * 2</code>.</p>

<table>
  <thead>
    <tr>
      <th>Operatör grubu</th>
      <th>Örnekler</th>
      <th>Görevi</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Aritmetik</td>
      <td><code class="language-plaintext highlighter-rouge">+</code>, <code class="language-plaintext highlighter-rouge">-</code>, <code class="language-plaintext highlighter-rouge">*</code>, <code class="language-plaintext highlighter-rouge">/</code>, <code class="language-plaintext highlighter-rouge">%</code></td>
      <td>Matematiksel işlem yapar</td>
    </tr>
    <tr>
      <td>Karşılaştırma</td>
      <td><code class="language-plaintext highlighter-rouge">==</code>, <code class="language-plaintext highlighter-rouge">!=</code>, <code class="language-plaintext highlighter-rouge">&lt;</code>, <code class="language-plaintext highlighter-rouge">&gt;=</code></td>
      <td><code class="language-plaintext highlighter-rouge">boolean</code> sonuç üretir</td>
    </tr>
    <tr>
      <td>Mantıksal</td>
      <td><code class="language-plaintext highlighter-rouge">&amp;&amp;</code>, <code class="language-plaintext highlighter-rouge">||</code>, <code class="language-plaintext highlighter-rouge">!</code></td>
      <td>Koşulları birleştirir veya tersine çevirir</td>
    </tr>
    <tr>
      <td>Atama</td>
      <td><code class="language-plaintext highlighter-rouge">=</code>, <code class="language-plaintext highlighter-rouge">+=</code>, <code class="language-plaintext highlighter-rouge">-=</code></td>
      <td>Değişkene değer atar veya günceller</td>
    </tr>
    <tr>
      <td>Artırma-azaltma</td>
      <td><code class="language-plaintext highlighter-rouge">++</code>, <code class="language-plaintext highlighter-rouge">--</code></td>
      <td>Sayıyı bir artırır veya azaltır</td>
    </tr>
  </tbody>
</table>

<p><img src="/img/java-operatorleri-ve-60.svg" alt="java-operatorleri-ve-60" /></p>

<p>Mod alma operatörü <code class="language-plaintext highlighter-rouge">%</code>, özellikle çift-tek kontrolünde kullanışlıdır. Bir $n$ sayısı için $n \bmod 2 = 0$ ise sayı çifttir.</p>

<h2 id="karar-yapıları-yol-ayrımındaki-java">Karar yapıları: Yol ayrımındaki Java</h2>

<p><code class="language-plaintext highlighter-rouge">if</code>, <code class="language-plaintext highlighter-rouge">else if</code> ve <code class="language-plaintext highlighter-rouge">else</code>, koşullara göre farklı kod blokları çalıştırır. Koşulun sonucu mutlaka <code class="language-plaintext highlighter-rouge">true</code> veya <code class="language-plaintext highlighter-rouge">false</code> olmalıdır.</p>

<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">int</span> <span class="n">puan</span> <span class="o">=</span> <span class="mi">78</span><span class="o">;</span>

<span class="k">if</span> <span class="o">(</span><span class="n">puan</span> <span class="o">&gt;=</span> <span class="mi">85</span><span class="o">)</span> <span class="o">{</span>
    <span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"Pekiyi"</span><span class="o">);</span>
<span class="o">}</span> <span class="k">else</span> <span class="k">if</span> <span class="o">(</span><span class="n">puan</span> <span class="o">&gt;=</span> <span class="mi">50</span><span class="o">)</span> <span class="o">{</span>
    <span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"Geçti"</span><span class="o">);</span>
<span class="o">}</span> <span class="k">else</span> <span class="o">{</span>
    <span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"Kaldı"</span><span class="o">);</span>
<span class="o">}</span>
</code></pre></div></div>

<p>Bu kod, karşılaştırma operatörleriyle puanı sınıflandırır. Koşullar yukarıdan aşağıya sınanır ve ilk doğru bloğun ardından yapı sona erer. Dolayısıyla daha özel veya yüksek eşikli koşulların önce yazılması önemlidir.</p>

<p>Sabit seçeneklerin bulunduğu durumlarda <code class="language-plaintext highlighter-rouge">switch</code> daha okunaklı olabilir:</p>

<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nc">String</span> <span class="n">rol</span> <span class="o">=</span> <span class="s">"editor"</span><span class="o">;</span>

<span class="k">switch</span> <span class="o">(</span><span class="n">rol</span><span class="o">)</span> <span class="o">{</span>
    <span class="k">case</span> <span class="s">"admin"</span> <span class="o">-&gt;</span> <span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"Tam yetki"</span><span class="o">);</span>
    <span class="k">case</span> <span class="s">"editor"</span> <span class="o">-&gt;</span> <span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"İçerik düzenleme yetkisi"</span><span class="o">);</span>
    <span class="k">default</span> <span class="o">-&gt;</span> <span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"Sınırlı yetki"</span><span class="o">);</span>
<span class="o">}</span>
</code></pre></div></div>

<table>
  <thead>
    <tr>
      <th>Yapı</th>
      <th>En uygun kullanım</th>
      <th>Güçlü yönü</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">if-else</code></td>
      <td>Aralıklar ve karmaşık koşullar</td>
      <td>Esneklik</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">switch</code></td>
      <td>Belirli, ayrık seçenekler</td>
      <td>Okunabilirlik</td>
    </tr>
    <tr>
      <td>Üçlü operatör</td>
      <td>Kısa değer seçimi</td>
      <td>Az kod</td>
    </tr>
  </tbody>
</table>

<p>Üçlü operatörün biçimi <code class="language-plaintext highlighter-rouge">koşul ? doğruDeğer : yanlışDeğer</code> şeklindedir. Örneğin <code class="language-plaintext highlighter-rouge">yas &gt;= 18 ? "Yetişkin" : "Çocuk"</code> ifadesi kısa bir karar üretir; ancak iç içe kullanılırsa okunabilirliği hızla düşürür.</p>

<h2 id="döngüler-tekrarın-kontrollü-hâli">Döngüler: Tekrarın kontrollü hâli</h2>

<p>Döngüler, aynı işlemi belirli bir koşul sağlandığı sürece tekrarlar. <code class="language-plaintext highlighter-rouge">for</code> tekrar sayısı bilindiğinde, <code class="language-plaintext highlighter-rouge">while</code> koşul ön planda olduğunda, <code class="language-plaintext highlighter-rouge">do-while</code> ise bloğun en az bir kez çalışması gerektiğinde tercih edilir.</p>

<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">int</span> <span class="n">toplam</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span>

<span class="k">for</span> <span class="o">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">1</span><span class="o">;</span> <span class="n">i</span> <span class="o">&lt;=</span> <span class="mi">5</span><span class="o">;</span> <span class="n">i</span><span class="o">++)</span> <span class="o">{</span>
    <span class="n">toplam</span> <span class="o">+=</span> <span class="n">i</span><span class="o">;</span>
<span class="o">}</span>

<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="n">toplam</span><span class="o">);</span> <span class="c1">// 15</span>
</code></pre></div></div>

<p>Bu döngü $1+2+3+4+5=15$ toplamını hesaplar. Başlangıç değeri, devam koşulu ve artış işlemi aynı satırda görüldüğü için akış kolayca izlenebilir.</p>

<p><code class="language-plaintext highlighter-rouge">break</code> döngüyü tamamen sonlandırırken <code class="language-plaintext highlighter-rouge">continue</code> yalnızca mevcut turu atlar. Bunlar güçlü araçlardır; gereğinden fazla kullanılmaları akışı takip etmeyi zorlaştırabilir.</p>

<h2 id="kısa-devre-değerlendirmesi">Kısa devre değerlendirmesi</h2>

<p>Mantıksal <code class="language-plaintext highlighter-rouge">&amp;&amp;</code> operatörü ilk koşul yanlışsa ikinci koşulu çalıştırmaz. <code class="language-plaintext highlighter-rouge">||</code> ise ilk koşul doğruysa devamını değerlendirmez:</p>

<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">if</span> <span class="o">(</span><span class="n">kullanici</span> <span class="o">!=</span> <span class="kc">null</span> <span class="o">&amp;&amp;</span> <span class="n">kullanici</span><span class="o">.</span><span class="na">isActive</span><span class="o">())</span> <span class="o">{</span>
    <span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"Giriş başarılı"</span><span class="o">);</span>
<span class="o">}</span>
</code></pre></div></div>

<p>Burada önce <code class="language-plaintext highlighter-rouge">null</code> kontrolü yapılır. Böylece var olmayan bir nesne üzerinde metot çağrılması ve <code class="language-plaintext highlighter-rouge">NullPointerException</code> oluşması engellenir.</p>

<p>Sonuç olarak operatörler veriyi dönüştürür, karar ifadeleri uygun yolu seçer ve döngüler tekrarları yönetir. Sağlam bir Java programında bu üçlü birlikte çalışır: doğru koşul kurulur, akış bilinçli biçimde yönlendirilir ve her tekrarın ne zaman biteceği açıkça tanımlanır.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="java" /><category term="operatörler" /><category term="kontrol-akışı" /><category term="döngüler" /><category term="karar-yapıları" /><category term="programlama" /><summary type="html"><![CDATA[Bir Java programı yalnızca yukarıdan aşağıya çalışan komutlardan oluşsaydı, hesap makinesinden biraz daha heyecanlı uygulamalar geliştirmek zor olurdu. Operatörler verileri işlerken kontrol ifadeleri programın hangi yolu izleyeceğine karar verir. Başka bir deyişle operatörler soruları hazırlar, karar yapıları cevapları değerlendirir, döngüler ise gerekli işleri sabırla tekrarlar.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/java-operatorleri-ve-60.png" /><media:content medium="image" url="https://program.sonsuz.us/img/java-operatorleri-ve-60.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Java Tarihçesi ve Evrimi: Oak Ağacından JVM Dünyasına</title><link href="https://program.sonsuz.us/posts/java-tarihcesi-ve-evrimi-oak-agacindan-jvm-dunyasina/" rel="alternate" type="text/html" title="Java Tarihçesi ve Evrimi: Oak Ağacından JVM Dünyasına" /><published>2026-10-18T00:00:00+00:00</published><updated>2026-10-18T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/java-tarihcesi-ve-evrimi-oak-agacindan-jvm-dunyasina</id><content type="html" xml:base="https://program.sonsuz.us/posts/java-tarihcesi-ve-evrimi-oak-agacindan-jvm-dunyasina/"><![CDATA[<p>Java, bugün kurumsal uygulamalardan Android ekosistemine kadar pek çok alanda karşımıza çıksa da yolculuğuna web için değil, etkileşimli elektronik cihazlar için başladı. Dilin asıl başarısı yalnızca sözdiziminden kaynaklanmadı; farklı donanımlarda aynı programı çalıştırmayı hedefleyen taşınabilir mimarisi, yazılım dünyasının önemli problemlerinden birine güçlü bir cevap verdi.</p>

<p>``</p>

<h2 id="green-project-ve-oakın-doğuşu">Green Project ve Oak’ın Doğuşu</h2>

<p>Java’nın hikâyesi 1991 yılında Sun Microsystems bünyesindeki <strong>Green Project</strong> ile başladı. James Gosling, Mike Sheridan ve Patrick Naughton gibi mühendisler, televizyon kutuları ve ev cihazları için güvenilir bir yazılım platformu geliştirmeye çalışıyordu. C ve C++ güçlüydü; ancak donanıma bağımlılık, elle bellek yönetimi ve işaretçi hataları bu cihazlar için ciddi risk oluşturuyordu.</p>

<p>Gosling tarafından geliştirilen dil önce, ofisinin önündeki ağaçtan esinlenilerek <strong>Oak</strong> adını aldı. Oak isminin başka bir şirket tarafından tescillenmiş olması nedeniyle dilin adı daha sonra Java olarak değiştirildi. Projenin cihaz pazarı beklenen hızda büyümese de internetin yükselişi, taşınabilir kod fikrine yeni bir sahne hazırladı. Java, 1995 yılında resmen tanıtıldı.</p>

<p>Java’nın temel felsefesi şu sloganla özetlendi: <strong>Write Once, Run Anywhere</strong> — bir kez yaz, her yerde çalıştır.</p>

<table>
  <thead>
    <tr>
      <th>Özellik</th>
      <th>C/C++ yaklaşımı</th>
      <th>Java yaklaşımı</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Derleme hedefi</td>
      <td>Belirli işlemci ve işletim sistemi</td>
      <td>JVM üzerinde çalışan bayt kod</td>
    </tr>
    <tr>
      <td>Bellek yönetimi</td>
      <td>Çoğunlukla geliştiriciye ait</td>
      <td>Garbage Collector tarafından yönetilir</td>
    </tr>
    <tr>
      <td>İşaretçiler</td>
      <td>Doğrudan kullanılabilir</td>
      <td>Güvenli referans modeli kullanılır</td>
    </tr>
    <tr>
      <td>Taşınabilirlik</td>
      <td>Yeniden derleme gerekebilir</td>
      <td>Uygun JVM yeterlidir</td>
    </tr>
    <tr>
      <td>Güvenlik</td>
      <td>Ortama ve koda bağlıdır</td>
      <td>Doğrulama ve çalışma zamanı kontrolleri vardır</td>
    </tr>
  </tbody>
</table>

<p><img src="/img/java-tarihcesi-ve-53.svg" alt="java-tarihcesi-ve-53" /></p>

<h2 id="kaynak-koddan-bayt-koda">Kaynak Koddan Bayt Koda</h2>

<p>Java derleyicisi, kaynak kodunu doğrudan belirli bir işlemcinin makine diline dönüştürmez. Bunun yerine JVM’nin anlayabileceği ara temsil olan <strong>bayt kodu</strong> üretir.</p>

<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">public</span> <span class="kd">class</span> <span class="nc">MerhabaJVM</span> <span class="o">{</span>
    <span class="kd">public</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">main</span><span class="o">(</span><span class="nc">String</span><span class="o">[]</span> <span class="n">args</span><span class="o">)</span> <span class="o">{</span>
        <span class="kt">int</span> <span class="n">javaYasi</span> <span class="o">=</span> <span class="mi">2026</span> <span class="o">-</span> <span class="mi">1995</span><span class="o">;</span>
        <span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"Java yaklaşık "</span> <span class="o">+</span> <span class="n">javaYasi</span> <span class="o">+</span> <span class="s">" yaşında!"</span><span class="o">);</span>
    <span class="o">}</span>
<span class="o">}</span>
</code></pre></div></div>

<p>Bu sınıf şu komutla derlenir:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>javac MerhabaJVM.java
java MerhabaJVM
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">javac</code> komutu kaynak dosyadan <code class="language-plaintext highlighter-rouge">MerhabaJVM.class</code> dosyasını üretir. Bu dosya işlemciye özel makine kodu değil, JVM komutları içerir. <code class="language-plaintext highlighter-rouge">javap -c MerhabaJVM</code> komutu kullanılarak bayt kod talimatları incelenebilir.</p>

<p>Süreci matematiksel bir dönüşüm gibi gösterebiliriz:</p>

\[Kaynak\ Kod \xrightarrow{javac} Bayt\ Kod \xrightarrow{JVM} Makine\ Kodu\]

<p>Aynı <code class="language-plaintext highlighter-rouge">.class</code> dosyasının farklı sistemlerde çalışabilmesinin koşulu, her sistem için uygun bir JVM bulunmasıdır. Dolayısıyla taşınabilir olan JVM’nin kendisi değil, JVM üzerinde çalışacak şekilde üretilen bayt koddur.</p>

<h2 id="jvm-tam-olarak-ne-yapar">JVM Tam Olarak Ne Yapar?</h2>

<p><strong>Java Virtual Machine</strong>, fiziksel işlemci ile Java programı arasında soyut bir bilgisayar gibi davranır. Sınıfları yükler, bayt kodunu doğrular, belleği düzenler ve kodu çalıştırır. JVM’nin başlıca bileşenleri şunlardır:</p>

<ul>
  <li><strong>Class Loader:</strong> Gerekli sınıfları çalışma anında yükler.</li>
  <li><strong>Bytecode Verifier:</strong> Talimatların güvenli ve kurallara uygun olduğunu denetler.</li>
  <li><strong>Execution Engine:</strong> Bayt kodu yorumlar veya makine koduna dönüştürür.</li>
  <li><strong>Garbage Collector:</strong> Kullanılmayan nesnelerin belleğini otomatik olarak geri kazanır.</li>
  <li><strong>Runtime Data Areas:</strong> Heap, stack ve metot alanı gibi bellek bölgelerini yönetir.</li>
</ul>

<p>İlk JVM’ler bayt kodu çoğunlukla yorumluyordu. Modern JVM’lerdeki <strong>JIT derleyici</strong>, sık çalışan kod bölümlerini çalışma sırasında yerel makine koduna çevirir. Basitleştirilmiş performans fikri şöyle ifade edilebilir:</p>

\[T_{toplam} = T_{yükleme} + T_{JIT} + n \cdot T_{çalıştırma}\]

<p>Başlangıçta JIT maliyeti oluşsa da tekrar sayısı $n$ büyüdükçe optimize edilmiş kod önemli hız kazandırır.</p>

<h2 id="javanın-evrimi">Java’nın Evrimi</h2>

<p>Java zaman içinde yalnızca bir dil olmaktan çıkıp büyük bir platforma dönüştü. Java 5 generics ve annotation özelliklerini, Java 8 lambda ifadelerini ve Stream API’yi getirdi. Java 9 modül sistemini tanıttı; sonraki sürümler record, sealed class, pattern matching ve virtual thread gibi modern yetenekler ekledi.</p>

<p>Bugün Java’nın gücü; olgun kütüphane ekosistemi, geriye dönük uyumluluk yaklaşımı ve JVM’nin gelişmiş optimizasyonlarında yatıyor. Üstelik Kotlin, Scala ve Clojure gibi diller de JVM üzerinde çalışabiliyor. Kısacası Oak’ın küçük cihazlar için filizlenen fikri, milyonlarca uygulamayı taşıyan oldukça büyük bir ormana dönüştü.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="java" /><category term="jvm" /><category term="bayt-kod" /><category term="programlama-tarihi" /><category term="sanal-makine" /><category term="nesne-yönelimli-programlama" /><summary type="html"><![CDATA[Java, bugün kurumsal uygulamalardan Android ekosistemine kadar pek çok alanda karşımıza çıksa da yolculuğuna web için değil, etkileşimli elektronik cihazlar için başladı. Dilin asıl başarısı yalnızca sözdiziminden kaynaklanmadı; farklı donanımlarda aynı programı çalıştırmayı hedefleyen taşınabilir mimarisi, yazılım dünyasının önemli problemlerinden birine güçlü bir cevap verdi.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/java-tarihcesi-ve-53.png" /><media:content medium="image" url="https://program.sonsuz.us/img/java-tarihcesi-ve-53.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Robotikte A* ve RRT: Harita Okuyan Kâşif ile Rastgele Büyüyen Ağaç</title><link href="https://program.sonsuz.us/posts/robotikte-a-ve-rrt-harita-okuyan-kasif-ile-rastgele-buyuyen-agac/" rel="alternate" type="text/html" title="Robotikte A* ve RRT: Harita Okuyan Kâşif ile Rastgele Büyüyen Ağaç" /><published>2026-10-18T00:00:00+00:00</published><updated>2026-10-18T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/robotikte-a-ve-rrt-harita-okuyan-kasif-ile-rastgele-buyuyen-agac</id><content type="html" xml:base="https://program.sonsuz.us/posts/robotikte-a-ve-rrt-harita-okuyan-kasif-ile-rastgele-buyuyen-agac/"><![CDATA[<p>Bir robotun başlangıç noktasından hedefe gitmesi, düz bir çizgi çizmekten çok daha karmaşıktır. Duvarlar, hareket kısıtları, robotun boyutları ve bilinmeyen bölgeler devreye girdiğinde bir <strong>yol planlama algoritmasına</strong> ihtiyaç duyulur. A* ve RRT aynı soruya cevap arasa da bunu tamamen farklı biçimlerde yapar: A* düzenli bir haritada en umut verici hücreleri incelerken RRT, uzaya rastgele dallar uzatan meraklı bir ağaç gibi davranır.</p>

<p><img src="/img/robotikte-a-ve-74.svg" alt="robotikte-a-ve-74" /></p>

<p>``</p>

<h2 id="önce-problem-uzayını-tanıyalım">Önce problem uzayını tanıyalım</h2>

<p>Yol planlamada robotun bulunabileceği tüm durumlar <strong>konfigürasyon uzayı</strong>, yani $C$-space ile temsil edilir. İki boyutlu hareket eden noktasal bir robot için durum $(x,y)$ olabilir. Robotun yönü de önemliyse durum $(x,y,\theta)$ hâline gelir. Eklemli bir robot kolunda ise her eklem açısı yeni bir boyut ekler.</p>

<p>Engellerin kapladığı durumlar $C_{obs}$, güvenli durumlar ise $C_{free}$ olarak gösterilir. Amaç, başlangıç $q_{start}$ ile hedef $q_{goal}$ arasında tamamen $C_{free}$ içinde kalan bir yol bulmaktır.</p>

<p>A* çoğunlukla ayrıklaştırılmış grafiklerde çalışır. RRT ise sürekli ve yüksek boyutlu uzayları örnekleyerek grafik oluşturur. Temel ayrım burada başlar.</p>

<h2 id="a-maliyeti-ve-hedefi-birlikte-düşünmek">A*: Maliyeti ve hedefi birlikte düşünmek</h2>

<p>A*, incelenecek düğümleri şu puana göre seçer:</p>

\[f(n)=g(n)+h(n)\]

<p>Burada $g(n)$ başlangıçtan $n$ düğümüne kadar ödenen gerçek maliyet, $h(n)$ ise hedeften ne kadar uzakta olunduğunu tahmin eden sezgisel fonksiyondur. Izgara haritalarda Öklid uzaklığı $h(n)=\sqrt{(x_g-x_n)^2+(y_g-y_n)^2}$ olarak kullanılabilir.</p>

<p>Eğer $h(n)$ gerçek kalan maliyeti abartmıyorsa A*, en düşük maliyetli yolu bulmayı garanti eder. Ancak büyük veya çok boyutlu haritalarda bellekte tuttuğu açık ve kapalı düğüm kümeleri hızla büyüyebilir.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">from</span> <span class="n">heapq</span> <span class="kn">import</span> <span class="n">heappush</span><span class="p">,</span> <span class="n">heappop</span>

<span class="k">def</span> <span class="nf">astar</span><span class="p">(</span><span class="n">start</span><span class="p">,</span> <span class="n">goal</span><span class="p">,</span> <span class="n">neighbors</span><span class="p">,</span> <span class="n">heuristic</span><span class="p">):</span>
    <span class="n">queue</span> <span class="o">=</span> <span class="p">[(</span><span class="mi">0</span><span class="p">,</span> <span class="n">start</span><span class="p">)]</span>
    <span class="n">cost</span> <span class="o">=</span> <span class="p">{</span><span class="n">start</span><span class="p">:</span> <span class="mi">0</span><span class="p">}</span>
    <span class="n">parent</span> <span class="o">=</span> <span class="p">{</span><span class="n">start</span><span class="p">:</span> <span class="bp">None</span><span class="p">}</span>

    <span class="k">while</span> <span class="n">queue</span><span class="p">:</span>
        <span class="n">_</span><span class="p">,</span> <span class="n">current</span> <span class="o">=</span> <span class="nf">heappop</span><span class="p">(</span><span class="n">queue</span><span class="p">)</span>
        <span class="k">if</span> <span class="n">current</span> <span class="o">==</span> <span class="n">goal</span><span class="p">:</span>
            <span class="k">return</span> <span class="n">parent</span>

        <span class="k">for</span> <span class="n">nxt</span><span class="p">,</span> <span class="n">step_cost</span> <span class="ow">in</span> <span class="nf">neighbors</span><span class="p">(</span><span class="n">current</span><span class="p">):</span>
            <span class="n">new_cost</span> <span class="o">=</span> <span class="n">cost</span><span class="p">[</span><span class="n">current</span><span class="p">]</span> <span class="o">+</span> <span class="n">step_cost</span>
            <span class="k">if</span> <span class="n">nxt</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">cost</span> <span class="ow">or</span> <span class="n">new_cost</span> <span class="o">&lt;</span> <span class="n">cost</span><span class="p">[</span><span class="n">nxt</span><span class="p">]:</span>
                <span class="n">cost</span><span class="p">[</span><span class="n">nxt</span><span class="p">]</span> <span class="o">=</span> <span class="n">new_cost</span>
                <span class="n">priority</span> <span class="o">=</span> <span class="n">new_cost</span> <span class="o">+</span> <span class="nf">heuristic</span><span class="p">(</span><span class="n">nxt</span><span class="p">,</span> <span class="n">goal</span><span class="p">)</span>
                <span class="nf">heappush</span><span class="p">(</span><span class="n">queue</span><span class="p">,</span> <span class="p">(</span><span class="n">priority</span><span class="p">,</span> <span class="n">nxt</span><span class="p">))</span>
                <span class="n">parent</span><span class="p">[</span><span class="n">nxt</span><span class="p">]</span> <span class="o">=</span> <span class="n">current</span>
</code></pre></div></div>

<p>Bu sade uygulama, komşuları değerlendirerek en umut verici düğümü öncelik kuyruğundan seçer. Dönen <code class="language-plaintext highlighter-rouge">parent</code> sözlüğü geriye doğru izlenerek yol oluşturulur.</p>

<h2 id="rrt-boşluğa-rastgele-dallar-uzatmak">RRT: Boşluğa rastgele dallar uzatmak</h2>

<p>RRT başlangıç durumunu ağacın kökü yapar. Ardından uzaydan rastgele bir $q_{rand}$ noktası seçer, ağaçtaki en yakın $q_{near}$ düğümünü bulur ve ona doğru sınırlı bir adım atarak $q_{new}$ üretir. Bağlantı engelle çakışmıyorsa yeni düğüm ağaca eklenir.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">rrt</span><span class="p">(</span><span class="n">start</span><span class="p">,</span> <span class="n">goal</span><span class="p">,</span> <span class="n">sample</span><span class="p">,</span> <span class="n">nearest</span><span class="p">,</span> <span class="n">steer</span><span class="p">,</span> <span class="n">collision_free</span><span class="p">):</span>
    <span class="n">tree</span> <span class="o">=</span> <span class="p">[</span><span class="n">start</span><span class="p">]</span>
    <span class="n">parent</span> <span class="o">=</span> <span class="p">{</span><span class="n">start</span><span class="p">:</span> <span class="bp">None</span><span class="p">}</span>

    <span class="k">for</span> <span class="n">_</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="mi">5000</span><span class="p">):</span>
        <span class="n">random_state</span> <span class="o">=</span> <span class="nf">sample</span><span class="p">(</span><span class="n">goal</span><span class="p">)</span>
        <span class="n">near</span> <span class="o">=</span> <span class="nf">nearest</span><span class="p">(</span><span class="n">tree</span><span class="p">,</span> <span class="n">random_state</span><span class="p">)</span>
        <span class="n">new</span> <span class="o">=</span> <span class="nf">steer</span><span class="p">(</span><span class="n">near</span><span class="p">,</span> <span class="n">random_state</span><span class="p">)</span>

        <span class="k">if</span> <span class="nf">collision_free</span><span class="p">(</span><span class="n">near</span><span class="p">,</span> <span class="n">new</span><span class="p">):</span>
            <span class="n">tree</span><span class="p">.</span><span class="nf">append</span><span class="p">(</span><span class="n">new</span><span class="p">)</span>
            <span class="n">parent</span><span class="p">[</span><span class="n">new</span><span class="p">]</span> <span class="o">=</span> <span class="n">near</span>
            <span class="k">if</span> <span class="nf">collision_free</span><span class="p">(</span><span class="n">new</span><span class="p">,</span> <span class="n">goal</span><span class="p">):</span>
                <span class="n">parent</span><span class="p">[</span><span class="n">goal</span><span class="p">]</span> <span class="o">=</span> <span class="n">new</span>
                <span class="k">return</span> <span class="n">parent</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">sample(goal)</code> zaman zaman doğrudan hedefi seçerse <strong>goal bias</strong> uygulanır ve arama hızlanabilir. RRT bir çözümü çabuk bulabilir; fakat bulunan yol genellikle zikzaklıdır ve en kısa yol garantisi yoktur. Bu nedenle sonradan yol yumuşatma yapılır veya asimptotik olarak optimum çözüme yaklaşan RRT* kullanılır.</p>

<h2 id="hızlı-karşılaştırma">Hızlı karşılaştırma</h2>

<table>
  <thead>
    <tr>
      <th>Özellik</th>
      <th>A*</th>
      <th>RRT</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Arama biçimi</td>
      <td>Sistematik ve sezgisel</td>
      <td>Rastgele örnekleme</td>
    </tr>
    <tr>
      <td>Uzay</td>
      <td>Ayrık grafik/ızgara</td>
      <td>Sürekli konfigürasyon uzayı</td>
    </tr>
    <tr>
      <td>Optimumluk</td>
      <td>Uygun sezgiselle garantili</td>
      <td>Temel sürümde garantisiz</td>
    </tr>
    <tr>
      <td>Yüksek boyutlar</td>
      <td>Maliyetli</td>
      <td>Genellikle daha uygun</td>
    </tr>
    <tr>
      <td>Sonuç yolu</td>
      <td>Düzenli, maliyeti düşük</td>
      <td>Zikzaklı, yumuşatma gerektirebilir</td>
    </tr>
    <tr>
      <td>Tekrarlanabilirlik</td>
      <td>Genellikle aynı sonuç</td>
      <td>Rastgeleliğe bağlı</td>
    </tr>
  </tbody>
</table>

<h2 id="hangisini-seçmeli">Hangisini seçmeli?</h2>

<p>Depo robotu gibi iki boyutlu, bilinen bir maliyet haritasında çalışan sistemlerde A* güçlü ve öngörülebilir bir tercihtir. Robot kolu, insansız hava aracı veya karmaşık hareket kısıtları bulunan bir araç söz konusuysa RRT daha doğal olabilir. Pratik sistemler ikisini birleştirebilir: RRT ile uygulanabilir bir koridor bulunup A* veya optimizasyon yöntemleriyle yol iyileştirilebilir. Kısacası A* haritayı dikkatle okuyan bir kâşif, RRT ise hızla farklı yönlere dal uzatan bir öncüdür.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="robotik" /><category term="yol-planlama" /><category term="a-star" /><category term="rrt" /><category term="algoritma" /><category term="otonom-robotlar" /><summary type="html"><![CDATA[Bir robotun başlangıç noktasından hedefe gitmesi, düz bir çizgi çizmekten çok daha karmaşıktır. Duvarlar, hareket kısıtları, robotun boyutları ve bilinmeyen bölgeler devreye girdiğinde bir yol planlama algoritmasına ihtiyaç duyulur. A* ve RRT aynı soruya cevap arasa da bunu tamamen farklı biçimlerde yapar: A* düzenli bir haritada en umut verici hücreleri incelerken RRT, uzaya rastgele dallar uzatan meraklı bir ağaç gibi davranır.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/robotikte-a-ve-74.png" /><media:content medium="image" url="https://program.sonsuz.us/img/robotikte-a-ve-74.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Robotlar Görmeyi Nasıl Öğrenir? Etiketli Veri Darboğazı</title><link href="https://program.sonsuz.us/posts/robotlar-gormeyi-nasil-ogrenir-etiketli-veri-darbogazi/" rel="alternate" type="text/html" title="Robotlar Görmeyi Nasıl Öğrenir? Etiketli Veri Darboğazı" /><published>2026-10-18T00:00:00+00:00</published><updated>2026-10-18T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/robotlar-gormeyi-nasil-ogrenir-etiketli-veri-darbogazi</id><content type="html" xml:base="https://program.sonsuz.us/posts/robotlar-gormeyi-nasil-ogrenir-etiketli-veri-darbogazi/"><![CDATA[<p>Bir robotun masadaki bardağı tanıması bize son derece doğal görünebilir. Ancak robot için görüntü, anlamlı nesnelerden değil, sayısal piksel dizilerinden oluşur. Denetimli öğrenme bu sayılara anlam kazandırabilir; fakat bunun için binlerce, hatta milyonlarca doğru etiketlenmiş örnek gerekir. Robotik dünyasında bu gereksinim, algılama modellerinin önündeki en pahalı ve en inatçı engellerden biridir.
``</p>
<h2 id="denetimli-öğrenmenin-temel-mantığı">Denetimli öğrenmenin temel mantığı</h2>

<p>Denetimli öğrenmede model, giriş ve doğru çıktı çiftlerinden oluşan bir veri kümesiyle eğitilir. Bir kamera görüntüsü $x$, görüntüdeki nesnenin etiketi ise $y$ olsun. Modelin amacı, görüntüyü etikete dönüştüren yaklaşık bir $f_\theta$ fonksiyonu öğrenmektir:</p>

\[\hat{y} = f_\theta(x)\]

<p>Buradaki $\theta$, sinir ağının eğitim sırasında ayarlanan parametrelerini temsil eder. Model tahmini ile gerçek etiket arasındaki fark bir kayıp fonksiyonuyla ölçülür:</p>

\[\theta^* = \arg\min_\theta \frac{1}{N}\sum_{i=1}^{N} L(f_\theta(x_i), y_i)\]

<p>Kısacası model, yaptığı hataları azaltarak öğrenir. Fakat doğru cevapları gösteren $y_i$ etiketleri azsa, hatalıysa veya gerçek çalışma ortamını temsil etmiyorsa robot sağlam bir algı geliştiremez.</p>

<h2 id="robotikte-etiket-neden-pahalıdır">Robotikte etiket neden pahalıdır?</h2>

<p>İnternetteki kedi fotoğraflarını sınıflandırmak görece kolaydır. Robotik verilerde ise yalnızca “bu bir kutudur” demek yetmeyebilir. Kutunun piksel düzeyindeki sınırı, üç boyutlu konumu, yönelimi, uzaklığı ve tutulabilir bölgeleri de işaretlenebilir. LiDAR nokta bulutları, termal kameralar ve kuvvet sensörleri gibi farklı kaynaklar işi daha da zorlaştırır.</p>

<table>
  <thead>
    <tr>
      <th>Veri türü</th>
      <th>Gerekli etiket</th>
      <th>Başlıca zorluk</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>RGB görüntü</td>
      <td>Sınıf veya kutu</td>
      <td>Örtüşme ve ışık değişimi</td>
    </tr>
    <tr>
      <td>Segmentasyon</td>
      <td>Her pikselin sınıfı</td>
      <td>Çok yüksek işçilik</td>
    </tr>
    <tr>
      <td>Nokta bulutu</td>
      <td>3B kutu ve konum</td>
      <td>Uzman araç gereksinimi</td>
    </tr>
    <tr>
      <td>Robot kavrama</td>
      <td>Başarı, poz ve temas</td>
      <td>Fiziksel deneme maliyeti</td>
    </tr>
  </tbody>
</table>

<p>Üstelik fabrikada toplanan veriler, açık havada çalışan bir robotu temsil etmeyebilir. Bu durum <strong>dağılım kayması</strong> olarak adlandırılır. Eğitim verisi $P_{train}(x)$ ile gerçek ortam $P_{real}(x)$ farklı olduğunda yüksek laboratuvar başarısı sahada hızla düşebilir.</p>

<h2 id="az-etiketin-model-üzerindeki-etkileri">Az etiketin model üzerindeki etkileri</h2>

<p>Etiketli veri eksikliği yalnızca doğruluğu azaltmaz. Nadir nesneler yeterince görülmediği için sınıf dengesizliği oluşur. Model arka plan, renk veya ışık gibi yanıltıcı ipuçlarını ezberleyebilir. Yeni bir kamera açısı karşısında şaşırabilir ve belirsiz olduğu durumlarda bile aşırı güvenli tahminler üretebilir. Otonom araç veya cerrahi robot gibi güvenlik kritik sistemlerde bu, basit bir yazılım hatasından çok daha ciddi sonuçlar doğurur.</p>

<h2 id="darboğazı-aşma-yöntemleri">Darboğazı aşma yöntemleri</h2>

<table>
  <thead>
    <tr>
      <th>Yaklaşım</th>
      <th>Avantaj</th>
      <th>Sınırlama</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Veri artırma</td>
      <td>Ucuz ve hızlıdır</td>
      <td>Yeni sahne bilgisi üretmez</td>
    </tr>
    <tr>
      <td>Sentetik veri</td>
      <td>Otomatik etiket sağlar</td>
      <td>Simülasyon-gerçeklik farkı vardır</td>
    </tr>
    <tr>
      <td>Aktif öğrenme</td>
      <td>Yalnızca faydalı örnekleri seçer</td>
      <td>Döngüsel insan katkısı ister</td>
    </tr>
    <tr>
      <td>Yarı denetimli öğrenme</td>
      <td>Etiketsiz veriyi kullanır</td>
      <td>Hatalı sözde etiket yayılabilir</td>
    </tr>
    <tr>
      <td>Transfer öğrenmesi</td>
      <td>Daha az veriyle başlanır</td>
      <td>Kaynak alan uyumsuz olabilir</td>
    </tr>
  </tbody>
</table>

<p>Aktif öğrenmede model, en kararsız olduğu görüntüleri insana gönderir. Aşağıdaki basitleştirilmiş örnek, en düşük güvene sahip tahminleri seçer:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">etiketlenecekleri_sec</span><span class="p">(</span><span class="n">model</span><span class="p">,</span> <span class="n">etiketsiz_veri</span><span class="p">,</span> <span class="n">adet</span><span class="o">=</span><span class="mi">20</span><span class="p">):</span>
    <span class="c1"># Her örnek için sınıf olasılıklarını hesaplar.
</span>    <span class="n">olasiliklar</span> <span class="o">=</span> <span class="n">model</span><span class="p">.</span><span class="nf">predict_proba</span><span class="p">(</span><span class="n">etiketsiz_veri</span><span class="p">)</span>

    <span class="c1"># En yüksek olasılık düşükse model kararsız kabul edilir.
</span>    <span class="n">guvenler</span> <span class="o">=</span> <span class="n">olasiliklar</span><span class="p">.</span><span class="nf">max</span><span class="p">(</span><span class="n">axis</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
    <span class="n">indeksler</span> <span class="o">=</span> <span class="n">guvenler</span><span class="p">.</span><span class="nf">argsort</span><span class="p">()[:</span><span class="n">adet</span><span class="p">]</span>
    <span class="k">return</span> <span class="n">indeksler</span>
</code></pre></div></div>

<p>Bu yöntem, her görüntüyü etiketlemek yerine öğrenmeye en fazla katkı sağlayacak örneklere odaklanır. Sentetik veriyle birleştiğinde maliyet daha da düşürülebilir. Alan rastgeleleştirme kullanılarak simülasyondaki ışık, doku, kamera açısı ve nesne konumu sürekli değiştirilir; böylece model tek bir yapay görünüme bağlanmaz.</p>

<h2 id="sonuç">Sonuç</h2>

<p>Robotik algılamanın sınırı çoğu zaman model mimarisi değil, verinin kalitesi ve çeşitliliğidir. Daha büyük bir sinir ağı, eksik dünya bilgisini sihirli biçimde tamamlayamaz. Başarılı sistemler; az sayıdaki kaliteli etiketi, bol miktarda etiketsiz veri, simülasyon, aktif öğrenme ve dikkatli saha testleriyle birleştirir. Robotlara görmeyi öğretirken asıl soru “Kaç görüntümüz var?” değil, “Bu görüntüler robotun karşılaşacağı dünyayı ne kadar iyi anlatıyor?” olmalıdır.</p>

<p><img src="/img/robotlar-gormeyi-nasil-55.svg" alt="robotlar-gormeyi-nasil-55" /></p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="robotik" /><category term="denetimli öğrenme" /><category term="makine öğrenmesi" /><category term="bilgisayarlı görü" /><category term="veri etiketleme" /><category term="yapay zekâ" /><summary type="html"><![CDATA[Bir robotun masadaki bardağı tanıması bize son derece doğal görünebilir. Ancak robot için görüntü, anlamlı nesnelerden değil, sayısal piksel dizilerinden oluşur. Denetimli öğrenme bu sayılara anlam kazandırabilir; fakat bunun için binlerce, hatta milyonlarca doğru etiketlenmiş örnek gerekir. Robotik dünyasında bu gereksinim, algılama modellerinin önündeki en pahalı ve en inatçı engellerden biridir.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/robotlar-gormeyi-nasil-55.png" /><media:content medium="image" url="https://program.sonsuz.us/img/robotlar-gormeyi-nasil-55.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Shell Here-Document Girintisi: EOF Neden Bozulur ve Nasıl Düzeltilir?</title><link href="https://program.sonsuz.us/posts/shell-here-document-girintisi-eof-neden-bozulur-ve-nasil-duzeltilir/" rel="alternate" type="text/html" title="Shell Here-Document Girintisi: EOF Neden Bozulur ve Nasıl Düzeltilir?" /><published>2026-10-18T00:00:00+00:00</published><updated>2026-10-18T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/shell-here-document-girintisi-eof-neden-bozulur-ve-nasil-duzeltilir</id><content type="html" xml:base="https://program.sonsuz.us/posts/shell-here-document-girintisi-eof-neden-bozulur-ve-nasil-duzeltilir/"><![CDATA[<p>Shell betiklerinde <code class="language-plaintext highlighter-rouge">&lt;&lt;EOF</code> ile oluşturulan here-document yapısı, çok satırlı metinleri bir komuta aktarmanın en rahat yollarından biridir. Ancak kodu daha okunaklı yapmak için sınırlayıcıya girinti eklediğinizde Shell aniden metnin hiç bitmediğini düşünebilir. Sorun görsel hizalama değil, kapanış sınırlayıcısının karakter karakter eşleşmek zorunda olmasıdır.
``</p>
<h2 id="here-document-nasıl-çalışır">Here-document nasıl çalışır?</h2>

<p>Here-document, bir komutun standart girdisine çok satırlı içerik gönderir. Genel sözdizimi şöyledir:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">cat</span> <span class="o">&lt;&lt;</span><span class="no">EOF</span><span class="sh">
Merhaba dünya
</span><span class="no">EOF
</span></code></pre></div></div>

<p>Shell, <code class="language-plaintext highlighter-rouge">&lt;&lt;EOF</code> ifadesini gördüğünde sonraki satırları okumaya başlar. Yalnızca tamamı <code class="language-plaintext highlighter-rouge">EOF</code> olan bir satırla karşılaştığında okumayı bırakır. Buradaki <code class="language-plaintext highlighter-rouge">EOF</code> özel bir anahtar kelime değildir; <code class="language-plaintext highlighter-rouge">SON</code>, <code class="language-plaintext highlighter-rouge">METIN</code> veya başka bir ad da seçilebilir.</p>

<p>Bunu bir eşitlik gibi düşünebiliriz. Açılışta tanımlanan sınırlayıcı $D$ olsun. Kapanışın geçerli olması için okunan satır $L$ şu koşulu sağlamalıdır:</p>

\[L = D\]

<p>Satırın başında boşluk varsa gerçekte $L = \text{“    EOF”}$ olur. Bu değer <code class="language-plaintext highlighter-rouge">EOF</code> ile aynı değildir. Dolayısıyla $L \neq D$ ve here-document kapanmaz.</p>

<h2 id="girinti-neden-sınırlayıcıyı-bozar">Girinti neden sınırlayıcıyı bozar?</h2>

<p>Aşağıdaki kod estetik görünse de hatalıdır:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">if </span><span class="nb">true</span><span class="p">;</span> <span class="k">then
    </span><span class="nb">cat</span> <span class="o">&lt;&lt;</span><span class="no">EOF</span><span class="sh">
    Kullanıcı bulundu.
</span><span class="no">    EOF
</span><span class="k">fi</span>
</code></pre></div></div>

<p>Kapanış satırındaki dört boşluk da verinin parçasıdır. Shell <code class="language-plaintext highlighter-rouge">EOF</code> ararken `    EOF` görür. Bash çoğunlukla dosyanın sonuna kadar okumayı sürdürür ve sınırlayıcının bulunamadığını belirten bir uyarı verir.</p>

<table>
  <thead>
    <tr>
      <th>Yazım</th>
      <th>Sonuç</th>
      <th>Neden</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">EOF</code></td>
      <td>Çalışır</td>
      <td>Birebir eşleşir</td>
    </tr>
    <tr>
      <td>`    EOF`</td>
      <td>Çalışmaz</td>
      <td>Başında boşluk vardır</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">EOF </code></td>
      <td>Çalışmaz</td>
      <td>Sonunda boşluk vardır</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">\tEOF</code> ve <code class="language-plaintext highlighter-rouge">&lt;&lt;-EOF</code></td>
      <td>Çalışır</td>
      <td>Baştaki sekmeler temizlenir</td>
    </tr>
  </tbody>
</table>

<h2 id="çözüm-1-sınırlayıcıyı-satır-başına-taşımak">Çözüm 1: Sınırlayıcıyı satır başına taşımak</h2>

<p>En taşınabilir çözüm, kapanış sınırlayıcısını girintisiz yazmaktır:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">if </span><span class="nb">true</span><span class="p">;</span> <span class="k">then
    </span><span class="nb">cat</span> <span class="o">&lt;&lt;</span><span class="no">EOF</span><span class="sh">
Kullanıcı bulundu.
İşlem başlatılıyor.
</span><span class="no">EOF
</span><span class="k">fi</span>
</code></pre></div></div>

<p>Bu yaklaşım POSIX uyumludur. Dezavantajı, metnin çevresindeki kodla hizalanmamasıdır. Buna rağmen farklı Shell ortamlarında güvenilir davranması nedeniyle genellikle en güvenli seçimdir.</p>

<h2 id="çözüm-2--eof-ve-sekme-kullanmak">Çözüm 2: <code class="language-plaintext highlighter-rouge">&lt;&lt;-EOF</code> ve sekme kullanmak</h2>

<p>Tireli biçim, here-document satırlarının başındaki <strong>sekme karakterlerini</strong> kaldırır:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">if </span><span class="nb">true</span><span class="p">;</span> <span class="k">then
	</span><span class="nb">cat</span> <span class="o">&lt;&lt;-</span><span class="no">EOF</span><span class="sh">
	Kullanıcı bulundu.
	İşlem başlatılıyor.
</span><span class="no">	EOF
</span><span class="k">fi</span>
</code></pre></div></div>

<p>Bu kodda girintiler gerçek tab karakteri olmalıdır. Dört boşluk, ekranda sekmeyle aynı görünebilir fakat aynı karakter değildir. Matematiksel olarak temizleme işlemini $T$ ile gösterirsek, <code class="language-plaintext highlighter-rouge">&lt;&lt;-</code> için karşılaştırma $T(L)=D$ biçiminde yapılır; burada $T$, yalnızca baştaki tab karakterlerini siler.</p>

<table>
  <thead>
    <tr>
      <th>Özellik</th>
      <th style="text-align: right"><code class="language-plaintext highlighter-rouge">&lt;&lt;EOF</code></th>
      <th style="text-align: right"><code class="language-plaintext highlighter-rouge">&lt;&lt;-EOF</code></th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Baştaki boşlukları siler</td>
      <td style="text-align: right">Hayır</td>
      <td style="text-align: right">Hayır</td>
    </tr>
    <tr>
      <td>Baştaki sekmeleri siler</td>
      <td style="text-align: right">Hayır</td>
      <td style="text-align: right">Evet</td>
    </tr>
    <tr>
      <td>Girintili kapanışa izin verir</td>
      <td style="text-align: right">Hayır</td>
      <td style="text-align: right">Yalnızca tab ile</td>
    </tr>
    <tr>
      <td>POSIX desteği</td>
      <td style="text-align: right">Evet</td>
      <td style="text-align: right">Evet</td>
    </tr>
  </tbody>
</table>

<h2 id="değişken-genişletmesini-de-unutmayın">Değişken genişletmesini de unutmayın</h2>

<p>Sınırlayıcının tırnaklanması, içerikte değişkenlerin çalışıp çalışmayacağını belirler:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">name</span><span class="o">=</span><span class="s2">"Ada"</span>

<span class="nb">cat</span> <span class="o">&lt;&lt;</span><span class="no">EOF</span><span class="sh">
Merhaba </span><span class="nv">$name</span><span class="sh">
</span><span class="no">EOF

</span><span class="nb">cat</span> <span class="o">&lt;&lt;</span><span class="sh">'</span><span class="no">EOF</span><span class="sh">'
Bu kez </span><span class="nv">$name</span><span class="sh"> aynen yazılır.
</span><span class="no">EOF
</span></code></pre></div></div>

<p>İlk blok <code class="language-plaintext highlighter-rouge">Merhaba Ada</code> üretirken ikinci blok <code class="language-plaintext highlighter-rouge">$name</code> metnini değiştirmeden basar. Girinti problemiyle tırnaklama birbirinden ayrı konulardır: <code class="language-plaintext highlighter-rouge">&lt;&lt;-</code> sekmeleri yönetir, <code class="language-plaintext highlighter-rouge">'EOF'</code> ise değişken ve komut genişletmesini engeller.</p>

<h2 id="pratik-hata-ayıklama">Pratik hata ayıklama</h2>

<p>Editörünüz boşluk ve tab karakterlerini görünür yapabiliyorsa bu özelliği açın. Ayrıca sorunlu satırı incelemek için <code class="language-plaintext highlighter-rouge">sed -n l dosya.sh</code> kullanılabilir; tab karakterleri genellikle <code class="language-plaintext highlighter-rouge">\t</code> olarak görünür. Özetle kapanış sınırlayıcısını tamamen sola yaslamak en sade çözümdür. Kod hizalaması şartsa <code class="language-plaintext highlighter-rouge">&lt;&lt;-EOF</code> kullanın, fakat girintinin boşluk değil gerçek sekme olduğundan emin olun. Shell gözünde güzel hizalama değil, baytların birebir eşleşmesi önemlidir.</p>

<p><img src="/img/shell-here-document-73.svg" alt="shell-here-document-73" /></p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="shell" /><category term="bash" /><category term="heredoc" /><category term="girinti" /><category term="linux" /><category term="betik" /><summary type="html"><![CDATA[Shell betiklerinde &lt;&lt;EOF ile oluşturulan here-document yapısı, çok satırlı metinleri bir komuta aktarmanın en rahat yollarından biridir. Ancak kodu daha okunaklı yapmak için sınırlayıcıya girinti eklediğinizde Shell aniden metnin hiç bitmediğini düşünebilir. Sorun görsel hizalama değil, kapanış sınırlayıcısının karakter karakter eşleşmek zorunda olmasıdır.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/shell-here-document-73.png" /><media:content medium="image" url="https://program.sonsuz.us/img/shell-here-document-73.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Tek Bir Beyin Yok: Sürü Robotları Nasıl Birlikte Düşünüyor?</title><link href="https://program.sonsuz.us/posts/tek-bir-beyin-yok-suru-robotlari-nasil-birlikte-dusunuyor/" rel="alternate" type="text/html" title="Tek Bir Beyin Yok: Sürü Robotları Nasıl Birlikte Düşünüyor?" /><published>2026-10-18T00:00:00+00:00</published><updated>2026-10-18T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/tek-bir-beyin-yok-suru-robotlari-nasil-birlikte-dusunuyor</id><content type="html" xml:base="https://program.sonsuz.us/posts/tek-bir-beyin-yok-suru-robotlari-nasil-birlikte-dusunuyor/"><![CDATA[<p><img src="/img/tek-bir-beyin-30.svg" alt="tek-bir-beyin-30" /></p>

<p>Bir robotun odadaki nesneleri toplaması etkileyicidir; yüzlerce küçük robotun lider olmadan alan taraması, yük taşıması veya kayıp bir kişiyi araması ise bilim kurgu gibi görünür. Sürü robotiği, tam olarak bu kolektif davranışı inceler. Karıncaların yiyecek bulması ve kuşların çarpışmadan uçması gibi doğadaki örneklerden esinlenen yaklaşımda karmaşık görevler, basit yerel kurallara uyan çok sayıda robot tarafından çözülür.</p>

<p>``</p>

<h2 id="merkezi-olmayan-koordinasyon-nedir">Merkezi olmayan koordinasyon nedir?</h2>

<p>Geleneksel bir robot filosunda merkezi bilgisayar, her robota nereye gideceğini söyleyebilir. Sürü robotiğinde ise çoğunlukla böyle bir komutan bulunmaz. Her robot yalnızca sensörlerinden, yakın komşularından ve çevrede bırakılan dolaylı işaretlerden yararlanarak karar verir. Başka bir deyişle hiçbir robot büyük resmin tamamını görmez; ancak sürü, yerel etkileşimlerden küresel bir düzen üretir.</p>

<p>Bu olgu <strong>belirme</strong> veya <em>emergence</em> olarak adlandırılır. Bir robotun davranışını basitçe şöyle modelleyebiliriz:</p>

\[u_i(t)=f(x_i(t),\,N_i(t),\,E_i(t))\]

<p>Burada $u_i(t)$ robotun hareket komutunu, $x_i(t)$ kendi durumunu, $N_i(t)$ algıladığı komşuları ve $E_i(t)$ çevresel bilgiyi temsil eder. Fonksiyon basit olsa bile bütün robotların tekrar eden etkileşimi karmaşık sonuçlar doğurabilir.</p>

<table>
  <thead>
    <tr>
      <th>Özellik</th>
      <th>Merkezi sistem</th>
      <th>Merkezi olmayan sürü</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Karar noktası</td>
      <td>Tek sunucu veya lider</td>
      <td>Her robot</td>
    </tr>
    <tr>
      <td>Arıza etkisi</td>
      <td>Merkez bozulursa sistem durabilir</td>
      <td>Birkaç robot kaybedilse de görev sürebilir</td>
    </tr>
    <tr>
      <td>Ölçeklenme</td>
      <td>İletişim yükü hızla artar</td>
      <td>Yerel iletişimle daha kolaydır</td>
    </tr>
    <tr>
      <td>Küresel plan</td>
      <td>Genellikle güçlüdür</td>
      <td>Dolaylı biçimde ortaya çıkar</td>
    </tr>
    <tr>
      <td>Robot gereksinimi</td>
      <td>Daha karmaşık olabilir</td>
      <td>Basit ve düşük maliyetli olabilir</td>
    </tr>
  </tbody>
</table>

<h2 id="basit-kurallar-şaşırtıcı-sonuçlar">Basit kurallar, şaşırtıcı sonuçlar</h2>

<p>Sürülerde sık kullanılan üç hareket kuralı vardır: komşularla çarpışmayı önleyen <strong>ayrılma</strong>, aynı yönde ilerlemeyi sağlayan <strong>hizalanma</strong> ve grubun yakınında kalmayı sağlayan <strong>uyum</strong>. Robot $i$ için birleşik hız komutu şu şekilde yazılabilir:</p>

\[v_i=\alpha v_{ayrılma}+\beta v_{hizalanma}+\gamma v_{uyum}\]

<p>$[1m$</p>

<p>$[0m$\alpha$, $\beta$ ve $\gamma$ katsayıları sürünün karakterini değiştirir. Ayrılma ağırlığı düşükse robotlar birbirine girebilir; uyum aşırı yüksekse sürü hedef yerine kendi merkezine takıntılı hâle gelebilir. Robotların bile ayar tutturması gerekiyor!</p>

<p>Aşağıdaki Python benzeri kod, bir robotun komşularına göre yönünü güncelleyen sadeleştirilmiş bir kontrol döngüsüdür:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">yeni_hiz</span><span class="p">(</span><span class="n">robot</span><span class="p">,</span> <span class="n">komsular</span><span class="p">,</span> <span class="n">hedef</span><span class="p">):</span>
    <span class="n">ayrilma</span> <span class="o">=</span> <span class="nf">carpismadan_kac</span><span class="p">(</span><span class="n">robot</span><span class="p">,</span> <span class="n">komsular</span><span class="p">)</span>
    <span class="n">hizalanma</span> <span class="o">=</span> <span class="nf">ortalama_hiz</span><span class="p">(</span><span class="n">komsular</span><span class="p">)</span>
    <span class="n">uyum</span> <span class="o">=</span> <span class="nf">komsu_merkezine_git</span><span class="p">(</span><span class="n">robot</span><span class="p">,</span> <span class="n">komsular</span><span class="p">)</span>
    <span class="n">gorev</span> <span class="o">=</span> <span class="nf">hedefe_yonel</span><span class="p">(</span><span class="n">robot</span><span class="p">,</span> <span class="n">hedef</span><span class="p">)</span>

    <span class="nf">return </span><span class="p">(</span><span class="mf">1.5</span> <span class="o">*</span> <span class="n">ayrilma</span>
            <span class="o">+</span> <span class="mf">0.8</span> <span class="o">*</span> <span class="n">hizalanma</span>
            <span class="o">+</span> <span class="mf">0.6</span> <span class="o">*</span> <span class="n">uyum</span>
            <span class="o">+</span> <span class="mf">1.2</span> <span class="o">*</span> <span class="n">gorev</span><span class="p">)</span>
</code></pre></div></div>

<p>Bu fonksiyon merkezi bir plan istemez. Her robot aynı döngüyü kendi ölçümleriyle çalıştırır. Katsayılar simülasyonda denenebilir veya pekiştirmeli öğrenmeyle optimize edilebilir.</p>

<h2 id="sürü-görevleri-nasıl-bölüşür">Sürü görevleri nasıl bölüşür?</h2>

<p>Koordinasyon yalnızca birlikte hareket etmek değildir. Robotlar keşif, taşıma ve iletişim rölesi gibi rolleri de paylaşabilir. Örneğin bir robot hedef bulduğunda dijital bir “feromon” bırakabilir. Diğerleri bu işaretin yoğunluğunu takip ederken işaret zamanla buharlaşır. Böylece eski bilgiler unutulur, güncel ve kısa rotalar güçlenir.</p>

<p>Bir görevin robot tarafından seçilme olasılığı eşik modeliyle ifade edilebilir:</p>

\[P(task)=\frac{s^n}{s^n+\theta^n}\]

<p>Burada $s$ görevin uyarı gücü, $\theta$ robotun uzmanlık eşiğidir. Farklı eşikler, önceden lider atamadan doğal bir iş bölümü oluşturur.</p>

<h2 id="güçlü-ama-kusursuz-değil">Güçlü ama kusursuz değil</h2>

<p>Sürü robotiği arama-kurtarma, hassas tarım, depo otomasyonu, uzay keşfi ve çevresel izleme için dayanıklı çözümler sunar. Ancak zayıf iletişim, sensör gürültüsü, enerji sınırları ve yerel kuralların beklenmeyen davranışlar üretmesi ciddi sorunlardır. Ayrıca yüzlerce robotun güvenli olduğunu matematiksel olarak doğrulamak, tek robotu doğrulamaktan çok daha zordur.</p>

<p>Yine de yaklaşımın temel fikri son derece güçlüdür: Karmaşıklık her zaman karmaşık bir yöneticiden gelmek zorunda değildir. Doğru yerel kurallar, sürekli geri bildirim ve yeterli sayıda katılımcı birleştiğinde, sürü tek tek üyelerinden çok daha yetenekli bir sisteme dönüşebilir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="robotik" /><category term="sürü-robotiği" /><category term="yapay-zeka" /><category term="dağıtık-sistemler" /><category term="otonom-robotlar" /><category term="algoritma" /><summary type="html"><![CDATA[Bir robotun odadaki nesneleri toplaması etkileyicidir; yüzlerce küçük robotun lider olmadan alan taraması, yük taşıması veya kayıp bir kişiyi araması ise bilim kurgu gibi görünür. Sürü robotiği, tam olarak bu kolektif davranışı inceler. Karıncaların yiyecek bulması ve kuşların çarpışmadan uçması gibi doğadaki örneklerden esinlenen yaklaşımda karmaşık görevler, basit yerel kurallara uyan çok sayıda robot tarafından çözülür.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/tek-bir-beyin-30.png" /><media:content medium="image" url="https://program.sonsuz.us/img/tek-bir-beyin-30.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry></feed>