İçeriğe atla

Erişilmez kod

Ulaşılamaz kod hatasını gösteren Eclipse 4.2 ekran görüntüsü

Erişilmez kod (yahut erişilemeyen kod, İngilizceunreachable code) bilgisayar programlamada programın başka yerlerinden kontrol akışı olmayan kaynak koduna verilen addır.[1]

Erişilmez kod, bazen ölü kodla karıştırılmaktadır. Hâlbuki ölü kod, yürütülmesine rağmen bir etkisi olmayan kod için kullanılır.

Erişilmez kod, genelde birkaç sebepten dolayı istenilmez. Bu sebepler arasında

  • gereksiz bellek kaplaması
  • gereksiz komutların mikroişlemcinin önbelleğine alınmasıyla gerekli başka verilere orada yer kalmaması
  • program bakımı açısından kullanılmayan kodun bakım ve belgelenmesi için gereksiz yere zaman ve gayret sarf edilmesi.

Sebepleri

Erişilmez kod, değişik sebeplerden dolayı olabilir:

  • karmaşık koşullu dallanmada programlama hataları;
  • eniyileyen derleyicinin dahili döngülerinin sonucunda;
  • yeni veya değiştirilmiş programın erişilmez koduna erişemeyen yetersiz test;
  • hata düzeltmeye çalışırken yanlışlıkla eklenen ikinci bir hatayla erişilmez kodu geçen ve testte de tespit edilemeyen kod;
  • işlevsel kodla iç içe olduğundan dolayı silinmemesi tercih edilmiş kullanılmayan kod
  • silinmesi unutulmuş kullanılmayan kod;
  • giriş verileri değişeceğinden dolayı artık erişilemeyecek kod;
  • kasten sonradan tekrar "canlandırılmak" üzere bırakılmış karmaşık kullanılmayak kod;
  • programdan daha uzaklaştırılmamış olan, hata ayıklamak veya geliştirmede faydası olduğundan eklenmiş kod.

Son beş durumda erişilmez kodun orada olma sebebi kalıtsal, yani artık kullanımda olmayan bu kod, eskiden kullanılmakta olan bir koddur.

Örnekler

Aşağıdaki C kodu parçasına dikkat ediniz:

int foo (int iX, int iY)
{
  return iX + iY;
  int iZ = iX*iY;
}

int iZ = iX*iY;'in tanımına işlev daha önce geri döndüğünden hiçbir zaman erişilememektedir. Dolayısıyla iZ'in tanımı ıskarta edilebilir.

Çözümleme

Erişilmez kodu tespit etmek, statik kod çözümlemesinin bir parçası olup kontrol akışı çözümlemesini kullanarak yürütüm süresince tanımlanan değişkenlere ve programın diğer durumlarına bakmadan hiç yürütülmeyen kodu bulmaya çalışır. Java gibi bazı bilgisayar dillerinde erişilmez kodun kimi çeşitleri menedilmiştir. Erişilmez kodu uzaklaştıran eniyilemeler (optimizasyon) ölü kod uzaklaştırması olarak bilinir.

Kod, eniyileştiren bir derleyicinin dâhilî değişmeleri sonucunda erişilmez olabilir. Buna örnek olarak common subexpression elimination sayılabilir.

Partikte çözümlemenin kapsamı, bulunan erişilmez kod yüzdesine kayda değer bir etkisi olur. Meselâ constant folding ve basit akış çözümlemesi, xyz komutunun aşağıda erişilmez olduğunu göstermektedir:

int iN = 2 + 1;

if (iN == 4)
{
  xyz
}

Aşağıdaki örnekte xyz'nin erişilemezliğinin tespîti için çok daha fazla kapsamlı çözümleme gerekmektedir.

double dX = sqrt(2);

if (dX > 5)
{
  xyz
}

Erişilmez kodu uzuklaştırma tekniği, ölü ve gereksiz kodu uzaklaştırmaya benzer.

Erişilmezliğe karşın profilleme

Bazı durumlarda pratik bir yaklaşım, basit erişilememezlik kriterleri ve daha karmaşık durumlar için bir profilere ihtiyaç vardır. Profilleme (profiling), genelde bir kod parçasının erişilememezliği konusunda hiçbir şeyi ispat edemese de erişilememezlik potansiyeli olan kodu bulabilmek için iyi bir bulgusal (heuristic) yaklaşımdır. Şüpheli bir kod parçası bir kere bulunduktan sonra daha güçlü bir çözümleme metodu yâhut elden incelenerek gerçekten erişilemez olup olmadığı tespit edilebilir.

Notlar

  1. ^ Debray, S. K. (1 Mart 2000). "Compiler techniques for code compaction" (PDF). ACM Transactions on Programming Languages & Systems (TOPLAS) (İngilizce). New York, USA. ss. 378-415. doi:10.1145/349214.349233. 24 Mart 2021 tarihinde kaynağından arşivlendi. Erişim tarihi: 25 Aralık 2011. 

Kaynakça

  • Appel, A. W. 1998 Modern Compiler Implementation in Java. Cambridge University Press.
  • Muchnick S. S. 1997 Advanced Compiler Design and Implementation. Morgan Kaufmann.

Ayrıca bakınız

İlgili Araştırma Makaleleri

<span class="mw-page-title-main">C (programlama dili)</span> programlama dili

C, yapısal bir programlama dilidir. Bell Laboratuvarları'nda, Ken Thompson ve Dennis Ritchie tarafından UNIX işletim sistemini geliştirebilmek amacıyla B dilinden türetilmiştir. Geliştirilme tarihi 1972 olmasına rağmen yaygınlaşması Brian Kernighan ve Dennis M. Ritchie tarafından yayımlanan "C Programlama Dili" kitabından sonra hızlanmıştır. Günümüzde neredeyse tüm işletim sistemlerinin yapımında %95'lere varan oranda kullanılmış, hâlen daha sistem, sürücü yazılımı, işletim sistemi modülleri ve hız gereken her yerde kullanılan oldukça yaygın ve sınırları belirsiz oldukça keskin bir dildir. Keskinliği, programcıya sonsuz özgürlüğün yanında çok büyük hatalar yapabilme olanağı sağlamasıdır. Programlamanın gelişim süreciyle beraber programlamanın karmaşıklaşması, gereksinimlerin artması ile uygulama programlarında nesne yönelimliliğin ortaya çıkmasından sonra C programcıları büyük ölçüde nesne yönelimliliği destekleyen C++ diline geçmişlerdir.

Komut kümesi mimarisi, CPU'nun yazılım tarafından nasıl kontrol edileceğini tanımlayan bilgisayar soyut modelinin bir parçasıdır. ISA, işlemcinin ne yapabileceğini ve bunu nasıl yapacağını belirterek donanım ve yazılım arasında bir arayüz gibi davranır.

<span class="mw-page-title-main">Java</span> açık kaynak kodlu, nesneye yönelik, zeminden bağımsız, yüksek verimli, çok işlevli, yüksek seviye, adım adım işletilen bir programlama dili

Java, Sun Microsystems mühendislerinden James Gosling tarafından geliştirilmeye başlanmış açık kaynak kodlu, nesneye yönelik, platform bağımsız, yüksek verimli, çok işlevli, yüksek seviye, hem yorumlanan hem de derlenen bir dildir.

<span class="mw-page-title-main">Visual Basic</span>

Visual Basic, Microsoft tarafından, Basic programlama dili üzerinde geliştirilmiş, olay yönlendirmeli, üst seviye, nesne tabanlı ve görsel bir programlama dilidir. Öğrenilmesi de kullanılması da oldukça kolaydır.

<span class="mw-page-title-main">Derleyici</span> kaynak kodunu bilgisayarın işleyebileceği koda dönüştüren program

Derleyici, kaynak kodu makine koduna dönüştüren yazılımdır. Bir programlama dilinin derleyicisi, o programlama dili kullanılarak yazılmış olan kodu hedef işlemci mimarisine göre uygun şekilde makine koduna derler ve genellikle çıktı olarak yürütülebilir dosyanın oluşturulmasını sağlar. Bu eyleme derleme denir. Bir başka ifadeyle derleyici, bir tür yazı işleyicidir; girdi olarak yazı alır ve çıktı olarak yazı verir.

<span class="mw-page-title-main">Assembly</span> uygulanan işlemlerle programlama dilinin birbirine çok yakın olduğu düşük seviye programlama dilleri

Assembly dili, bir işlemcinin komut kümesi üzerine tanımlanmış alt seviye bir dildir. Assembly dili kolay hatırlanabilir semboller tanımlar ve böylece işlemcinin makina koduna karşılık gelen sayı dizilerinin bilinmesine gerek kalmaz. Assembly dili, platformdan bağımsız yüksek seviyeli programlama dillerinin aksine, işlemci mimarisine bağımlıdır. Tipik uygulamaları; cihaz sürücüleri, alt seviyeli dahili (embedded) ve gerçek zamanlı sistemlerdir. Bır assembly programı assembler kullanılarak makine koduna çevrilir.

Cephe yönelimli programlama veya ilgiye yönelik programlama, çapraz kesim işlerini bölerek modülerliği artırmayı amaçlayan bir programlama yaklaşımıdır. Bütün programlama yaklaşımlarında kodlar uzadıkça, kodların anlaşılabilirliği çok düşmekte, bazen de içinden çıkılmaz bir hal almaktadır. Programlamanın varlığıyla birlikte bu sorun da hep var olmuştur. Bu sorunla savaşabilmek için sürekli çalışmalar devam etmektedir, bu süreçte ortaya çıkan önemli bir programlama yaklaşımı da Cephe Yönelimli Programlamadır.

<span class="mw-page-title-main">Çizgi integrali</span>

Matematikte bir çizgi integrali, integrali alınan fonksiyonun bir eğri boyunca değerlendirildiği integraldir. Çeşitli farklı çizgi integralleri kullanılmaktadır. Kapalı eğrinin kullanıldığı durumlarda integrale kontür integrali denildiği de olmaktadır.

Borel toplamı dizilerin toplamına ilişkin bir genellemedir. Bu terim, herhangi bir toplam değeri olmayan diziler için bile bir büyüklük değeri tanımlayabilmektedir.

Döngü açma, programın çalışmasını hızlandıran döngü dönüştürme yöntemlerinden biridir. Bu yöntem yazılan programın kod satır sayısını artırmaktadır. Döngülerdeki dönüşüm manuel olarak programcı tarafından yapılabileceği gibi kodlar derleyiciler tarafından da düzenlenebilmektedir.

Nesne yönelimli programlama dillerinde arayüz, değişik sınıflardan nesnelerin kategorize edilmesini sağlayan bir soyut tür çeşitidir. Tanımlanmakta olan kategorinin birbirleriyle alakasız sınıfları ortak bir çatı altında toplaması nedeniyle, arayüz tanımları, soyut sınıfların aksine, listeledikleri iletilerin gerçekleştirim ayrıntısı olan herhangi bir bilgi içeremezler. Dolayısıyla, bir arayüz tanımı iletilere karşılık gelen bir altyordam gövdesi veya altalan tanımı içeremez. Bir başka açıdan bakarsak, arayüz tanımında yer alan programlama öğelerinin zaman içinde değişme olasılığı düşük öğeler olması gerekir. Buna göre, arayüz tanımları gerçekleştirimci ile kullanıcının paylaştığı ve sabit olma özelliği bulunan altyordam imzaları ile simgesel sabit tanımlarını barındırabilir.

Ölü kod, bilgisayar programlamasında kullanılan bir terim olup yürütülmesine rağmen sonucu kullanılmayan kaynak koduna denir. Ölü kodun yürütülmesi, sonuçları hiçbir zaman kullanılmadığından hesaplama zamanını israf eder.

Gereksiz kod, bir programlama terimi olup bir sebepten dolayı gereksiz olup kaynak veya derlenmiş koda denir. Bu kod hiçbir zaman yürütülmemektedir. Çoğu zaman bu koda erişilmez kod da denir. Ayrıca yürülmesine rağmen dışarıda bir etkisi görünmeyen, yani çıktısını değiştirmeyen koda da gereksiz kod denmektedir. Bu tür koda ölü kod da denmektedir.

<span class="mw-page-title-main">Yazılım motoru</span> bilgisayar programının merkezi kısmı

Yazılım motoru, bilgisayar biliminde bir yazılımın altyapısı, temeli anlamına gelir. Yazılım motorları programı çalıştırabilmek için de kullanılmaktadır. Bu yazılımlar diğer programlardan farklıdır. Bir programın içerisinde çalışırlar veya bir bütün oluştururlar. Yazılım motorları bir tarayıcının içerisinde JavaScript motoru veya bir oyun motoru gibi çeşitli türlere sahiptirler. Web tarayıcısı içerisinde de JavaScript, AJAX gibi dillerde yazılmış eklentilerin çalışmasını sağlarlar.

<span class="mw-page-title-main">OpenMP</span>

OpenMP; Solaris, IBM AIX, HP-UX, GNU/Linux, MAC OS X ve Windows işletim sistemleri üzerinde çoğu işlemci mimarisi üzerinde Fortran, C++, C programlama dillerinde çoklu platform paylaşımlı bellek çoklu işlemeyi destekleyen bir uygulama geliştirme arayüzüdür, yani bir API'dir. OpenMP derleyici yönergelerinin kütüphane rutinlerini ve ortam değişkenlerinin çalışma zamanı davranışını etkileyen bir kümesini içerir.

Dart, ilk kez Google tarafından geliştirilen ve daha sonraları ECMA tarafından standart (ECMA-408) haline getirilen açık kaynaklı ve genel-amaçlı bir programlama dilidir. Dart dili kullanılarak web, sunucu, mobil uygulamalar ve IoT cihazları geliştirilebilir.

ReSharper [ˈɹiːˌʃɑːɹpɚ] yahut R# JetBrains tarafından Microsoft'un geliştirme ortamı Visual Studio için yayımlanan bir uzantısıdır. Şu anda desteklenen ReSharper sürümleri Visual Studio 2010, 2012, 2013, 2015 ve güncel yayın öncesi sürüm "15"'tir.

<span class="mw-page-title-main">Ayrıştırıcı (yazılım)</span>

Ayrıştırıcı, girdi verilerini alır ve girdinin yapısal bir temsilini vererek, süreçte doğru sözdizimini kontrol eden bir veri yapısı oluşturan bir yazılım bileşenidir. Ayrıştırma öncesinde veya sonrasında başka adımlar izlenebilir veya bunlar tek bir adımda birleştirilebilir. Ayrıştırıcı, genelde girilen karakter dizisinden belirteçler oluşturan ayrı bir sözcük tabanlı analiz motorunu takip eder. Ayrıştırıcılar elle programlanabilir veya bir ayrıştırıcı üreteci tarafından otomatik olarak veya yarı otomatik olarak oluşturulabilir. Ayrıştırma, biçimlendirilmiş çıktı üretimlerini tek bir şablonda tamamlama görevi görür. Bunlar, farklı etki alanlarına uygulanabilir, ancak bir derleyicinin girdi ve çıktı aşamaları gibi genellikle bir arada sunulur.

JIT ; bilgisayar kodunu çalıştırmanın bir yoludur. Yürütülmeden önce bir program yürütülürken çalışma zamanında derleyici içerir. Genellikle bu, kaynak kodu ve daha sonradan makine diline bytecode kod çevirisini içerir ve bu kod doğrudan doğruya çalıştırılır. Bir JIT derleyicisi uygulayan bir sistem genellikle yürütülen kodu sürekli olarak analiz eder, daha sonra derleme veya tekrar derlemeden elde edilen hızlanmanın bu kodun derlenmesinin yükünden daha ağır olacağı kod bölümlerini tanımlar.

SpiderBasic, Fantaisie Software tarafından geliştirilen, yerleşik BASIC kurallarına dayanan yeni bir web istemci tarafı programlama dilidir. iOS ve Android için mobil uygulama da dahil olmak üzere çok karmaşık, pencereli tabanlı web uygulamalarının geliştirilmesine olanak tanır. Karmaşık ve reaktif GUI, 2D oyunlar ve daha birçok şeyi tutarlı bir şekilde ele almak için geniş bir komut seti sağlar. Her kütüphane ve komut aynı şekilde davranır ve daha kolay ve daha hızlı öğrenme için benzer sözdizimine sahiptir.