<!DOCTYPE article PUBLIC "-//NLM//DTD JATS (Z39.96) Journal Archiving and Interchange DTD v1.0 20120330//EN" "JATS-archivearticle1.dtd">
<article xmlns:xlink="http://www.w3.org/1999/xlink">
  <front>
    <journal-meta />
    <article-meta>
      <title-group>
        <article-title>Yapısal Kod Klon Analizinde Metrik Tabanlı Teknikler</article-title>
      </title-group>
      <contrib-group>
        <contrib contrib-type="author">
          <string-name>Mustafa Kapdan</string-name>
          <email>1mkapdan@thy.com</email>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Mehmet Aktaş</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
          <xref ref-type="aff" rid="aff2">2</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Melike Yiğit</string-name>
          <email>3melikeyigit@thy.com</email>
          <xref ref-type="aff" rid="aff0">0</xref>
          <xref ref-type="aff" rid="aff1">1</xref>
        </contrib>
        <aff id="aff0">
          <label>0</label>
          <institution>Anahtar Kelimeler. Kod Klon Analizi, Yapısal Kod Klon Analizi</institution>
          ,
          <addr-line>Yazılım Metrikleri</addr-line>
          ,
          <country>Nesneye Dayalı Yazılım Metrikleri</country>
        </aff>
        <aff id="aff1">
          <label>1</label>
          <institution>Bilgisayar Mühendisliği Bölümü, Bahçeşehir Üniversitesi</institution>
          ,
          <addr-line>İstanbul</addr-line>
        </aff>
        <aff id="aff2">
          <label>2</label>
          <institution>Bilgisayar Mühendisliği Bölümü, Yıldız Teknik Üniversitesi</institution>
          ,
          <addr-line>İstanbul</addr-line>
        </aff>
      </contrib-group>
      <abstract>
        <p>Özet. Gereksiz tekrarlanmış kodlar (klonlar) iyi dokumante edilmemiş ve bakımı zor olan kodlardır. Bu tip kodlarda, tespit edilen bir hatanın tüm tekrarlarda düzeltilmesi gerekir. Bu durum yazılım bakım maliyetlerini önemli ölçüde artırdığı gibi kodların okunabilirliği ve anlaşılabilirliği için daha fazla çaba sarf edilmesini de gerektirir. Günümüz literatüründe kod klon problemlerini azaltmak ya da engellemek için birçok teknik önerilmiştir. Bu tekniklerin odağında klon kod tespiti yer almaktadır. Klon kod‟lar iki ana başlık altında incelenmektedir. Yazılım içerisinde kod parçacığının benzerliğinden kaynaklanan tekrarlamalara basit klon adı verilirken, sistem mimarisi içerisinde, soyutlandırmanın birden çok seviyesinde, aynı yapı ile inşa edilmiş program yapılarına yapısal klon denmektedir. Basit klon tespit teknikleri, tekrarlanan kod parçacıklarına geniş bir açıdan bakamadıkları için, bunların tasarım seviyesindeki olası tekrarlamalardan kaynaklanıp kaynaklanmadığını saptayamamaktadır. Buradaki eksikliği gidermeyi amaçlayan yapısal klon tespitleri ise, yazılımdaki üst seviye benzerliklerinin ortaya çıkartılması, yeniden kullanılabilirliğin artırılması ve yazılımın basitleştirilmesine odaklanan yöntemlerden oluşmaktadır. Son yıllarda, yapısal klon tespit teknikleri için, birbirinden farklı öneriler yapılmıştır. Bu çalışmada yapısal klonların tespitinde literatürde yapılmış olan çalışmaları analiz ederek, yazılım metriklerine dayalı olarak yapısal kod klon tespitinin nasıl yapılabileceği konusunda bir değerlendirme yapacağız.</p>
      </abstract>
    </article-meta>
  </front>
  <body>
    <sec id="sec-1">
      <title>Giriş</title>
      <p>
        Yazılım geliştirme süreçlerinde, var olan bir kodun kopyalanıp küçük değişiklikler
yapılarak ya da hiç değiştirilmeden kullanılması sıklıkla karşılaşılan bir durumdur. Bu
tarz yeniden kullanım şekline basit kod klon denmektedir. Sistemi oluşturan
mimarinin içerisinde tekrarlanan kod bulunan, soyutlandırmanın birden çok seviyesinde aynı
yapı ile inşa edilmiş program yapılarına ise yapısal klon denmektedir. Yazılım projesi
içerisinde klon bulunması, yazılım sisteminin kalitesinin kötü olduğunun bir işareti
olarak kabul edilmektedir [
        <xref ref-type="bibr" rid="ref1">1</xref>
        ]. Kod kalitesini arttırmak, daha etkin ve kullanışlı kodlar
üretebilmek için yazılım projelerinde kod klonlarının tespit edilmesi büyük önem
taşımaktadır. Bu amaçla kod klonlarının ortaya çıkma nedenleri, yazılım
projelerindeki büyüklükleri ve sebep oldukları olumsuzluklar detaylı olarak irdelenmelidir. Roy
ve Cordy [
        <xref ref-type="bibr" rid="ref2">2</xref>
        ], yaptıkları literatür taramasında bu konuları detaylı olarak
incelemektedir. Aşağıda bu literatür çalışmasını takip eden bir özet sunulmaktadır.
Kod klonlarının ortaya çıkma nedenleri: Kod tekrarlamalarının sebepleri çeşitlilik
göstermektedir. Bu çeşitlilikler; geliştirme stratejisi, geliştirme sürecindeki
çekinceler, kısıtlamaları aşma isteği, bilgi eksikliği ve yanlışlıkla kopyalama olarak 4
ana başlık altında incelenebilir.
      </p>
      <p>Geliştirme stratejisi: Yazılım sisteminin kendisinden önceki sistemleri
desteklemesi, farklı iki sistemin birleştirilmesi, otomatik kod üreten araçların
kullanılması gibi sebeplerden dolayı, projeler içerisinde klon kod oluşumları
gözlemlenmektedir.</p>
      <p>Geliştirme sürecindeki çekinceler: Geliştiriciler, kimi zaman yazacakları yeni
kodun hata oluşturması çekincesinden dolayı, var olan kodu kopyala/ yapıştır
yöntemi ile kullanmaktadırlar. Bunun yanı sıra yazılımın mimarisini bozmamak adına
da kod tekrarlamaları yapılabilmektedir. Aynı işi yapan farklı iki kod parçacığı
oluşturarak, birinin çökmesi durumunda diğer klon‟un cevap vermesi için program
içerisinde kasıtlı olarak klon gerçekleştirilir. Programın bir metodu çağırmasının
maliyetli olduğu durumlarda, metot çağırılması gereken yerde tekrar
kodlanabilmektedir.</p>
      <p>Kısıtlamaları aşma isteği: Programlama dilinin yeniden kullanılabilir kod
mekanizmasını desteklememesi, ya da yeniden kullanılabilir kodun yazılma-sının
çok zaman gerektirmesi ve hataya açık olmasından dolayı geliştiriciler kod
tekrarları yapmaktadırlar. Bunlarla birlikte geliştiricinin sistemi tam ola-rak anlamaması,
işin tamamlanması için zaman verilmesi ve günlük ürettiği kod satırı üzerinden
performans ölçümünün yapılması gibi sebepler de proje içerisinde klon kod
bulunmasına sebebiyet vermektedir.</p>
      <p>Bilgi eksikliği: Geliştiricilerin, nesneye dayalı tasarım, soyutlama ve kalıtım gibi
temel yazılım bilgilerinin eksik olmasından dolayı, modüler ve yeniden
kullanılabilir kod geliştirememesi ve aynı kodu farklı yerlerde kullanma yö-netimini
uygulamaları, kod klonlarının oluşmasına sebebiyet vermektedir.</p>
      <p>Yanlışlıkla kopyalama: Birbirinden habersiz bir şekilde birden fazla gelişti-ricinin
aynı işi yapan benzer kod kısımlarını geliştirmesi, ya da geliştiricinin önceden
karşılaştığı bir sorun için kullandığı çözüm yöntemini tekrar tekrar kullanmasından
kaynaklanan klon kodlardır.</p>
      <p>
        Kod klonlarının yazılım projelerindeki büyüklüğü: Son yıllarda yapılan
çalışmalar, tekrarlanmış kodlarla, endüstriyel yazılım sistemlerinde yaygın olarak
karşılaşıldığını ortaya koymaktadır [
        <xref ref-type="bibr" rid="ref3 ref4 ref5 ref6">3,4,5,6</xref>
        ].Yapılan araştırmalara göre, yazılımın alanı ile
alakalı olarak değişkenlik göstermekle birlikte; projelerin önemli bir kısmı klon
kodlardan oluşmaktadır [
        <xref ref-type="bibr" rid="ref7 ref8">7,8</xref>
        ]. Baker [
        <xref ref-type="bibr" rid="ref3">3</xref>
        ] yazılım projelerin %13-%20‟sinin klon koddan
oluşduğunu bildirmektedir. Lague [
        <xref ref-type="bibr" rid="ref9">9</xref>
        ] yazılım projelerinde sadece fonksiyonel
klonları incelemiş ve yaptığı araştırma sonucunda %6-8 arasında klon tespit etmiştir. Baxter
[
        <xref ref-type="bibr" rid="ref10">10</xref>
        ] yazılım projelerinin %31‟ini klon olarak kabul etmektedir. Mayrand [
        <xref ref-type="bibr" rid="ref11">11</xref>
        ]
endüstriyel yazılımlar üzerinde %5-20 arasında klon tespit etmiştir. Kasper ve Godfrey [
        <xref ref-type="bibr" rid="ref12">12</xref>
        ]
yazılım sisteminin %10-15‟nin klon olduğunu tespit etmiştir. Tüm bu araştırmalar
yazılım projelerinde kod klonlanmasının yaygın kullanılan bir yöntem olduğunu
göstermektedir.
      </p>
      <p>
        Kod klonlarının sebep oldukları olumsuzluklar: Büyük yazılım sistemleri
içerisinde, birçok nedenden dolayı klon kod bulunmaktadır. Sistemin içerisinde klon kodun
bulunması, sistemin çalışmasını etkilemez, fakat sistemin karmaşıklığını artırdığı için
olası yeni geliştirilmelerin maliyetinin yükselmesine [
        <xref ref-type="bibr" rid="ref13">13</xref>
        ] ve bunun yanında daha
birçok hataya sebebiyet vermektedir [
        <xref ref-type="bibr" rid="ref11 ref16 ref3 ref4 ref5 ref6">3,4,5,6,11,16</xref>
        ]. Kod klonlarından dolayı ortaya
çıkan problemleri aşağıdaki maddelerde özetleyebiliriz.
      </p>
      <p>
        Bakım maliyetlerinin artması: Eğer herhangi bir klonlanmış kod içerisinde bir
hata (bug) bulunursa, hatanın düzeltilmesi için öncelikle bu kodun klonu olan tüm
kodlar bulunmalıdır. Daha sonra bu hata her bir klon kod üzerinde düzeltilmelidir.
İçerisinde klon kod bulunduran yazılım sistemlerinin, klon bulundurmayan
sistemlere göre bakım maliyetlerinin yüksek olduğunu gös-teren birçok çalışma vardır
[
        <xref ref-type="bibr" rid="ref14 ref3">3,14</xref>
        ]. Yazılım sisteminin tesliminden sonra ya-pılan herhangi bir değişikliğin
maliyeti, yazılımın toplam maliyetinin %40 ile %70‟i arasında değişiklik
göstermektedir [
        <xref ref-type="bibr" rid="ref15">15</xref>
        ].
      </p>
      <p>
        Olası hata sayısının artması: Kopyalanıp ufak bir değişiklikle ya da deği-şiklik
olmaksızın kullanılan kodlar hataların yayılmasında önemli bir etkiye sahiptir.
Eğer kopyalanan kod, içerisinde bir hata barındıyorsa; bu hatanın kodun
kopyalandığı her yerde ortaya çıkma ihtimali oluşmakta ve toplamda-ki olası hata sayısı
artırmaktadır [
        <xref ref-type="bibr" rid="ref14">14</xref>
        ].
İyileştirme maliyetlerinin artması: Bir klon kod üzerinde yapılan iyileştirme
veya zenginleştirme çalışması da bu kodun her bir klonu üzerinde yapılmalıdır.
Buda bakım ve güncelleme kapsamındaki maliyetleri arttırmaktadır.
      </p>
      <p>Kaynak ihtiyacının artması: Sistemin boyutu, kopyala/yapıştır yöntemin-den
kaynaklanan kod tekrarlamalarından dolayı artmaktadır. Artan bu boyut kimi
alanlarda önemli olmaz iken, mobil sistemler gibi alanlarda yazılım ile birlikte
donanımında değişimini zorunlu kılmaktadır.</p>
      <sec id="sec-1-1">
        <title>Değişiklik taleplerine geç cevap verilmesi: Talep edilen değişiklerin ger</title>
        <p>çekleştirilmesi için gerekli olan düzenleme ve/veya yeni kod geliştirmenin
yapılabilmesi için sistemin tamamen anlaşılması gerekmektedir. Fakat klon-lanmış
kodlar yüzünden, sistemin ve kullanılmış kodların anlaşılması ekstra zaman
almaktadır.</p>
        <p>Kötü sistem mimarisi oluşması: Nesneye dayalı tasarım, soyutlama ve kalı-tım
gibi temel yazılım bilgilerinin eksik olmasından dolayı kaynaklanan kod klonları
sistem mimarisinin kötü olduğunu göstermektedir. Bu tarz klon kod-lar, sistem
içerisinde yeniden kullanılabilirliği zorlaştıracağı gibi bakım ma-liyetini de
artıracaktır.</p>
        <p>Yeni hata ihtimalinin artması: Önceden yazılmış olan kodların, yeni sis-temlere,
yeni programlama dilleri kullanılarak, taşınması aşamasında, çoğu zaman yazılım
geliştiriciler tekrarlanmış kodların mantık akışını değiştirme-den kullanırlar. Bu
kullanım yöntemi hataya açıktır ve sistem içerisinde yeni hatalar oluşaması
ihtimalini yaratmaktadır.</p>
        <p>Yukarıda bahsedilen olumsuzlukların ortadan kaldırılması için, yazılım sistemleri
içersindeki klon kodların tespiti büyük öneme sahiptir. Bunun için sözdizimsel ya da
işlevsel olarak birbirine benzeyen kod parçalarının ortaya çıkarılması gerekmektedir.
Literatürde, kod klonlarının türlerine dayalı olarak birçok tespit yöntemi önerilmiştir.
Basit klon tespit teknikleri, kaynak kod gösterimi ve karakteristiğine göre çeşitlilik
göstermektedir. Bu çeşitlilikler 5 farklı kategori altında incelenebilir: Metin Tabanlı,
Anahtar Tabanlı, Soyut Senkronize Ağaç Tabanlı, Program Bağımlı Çizge Tabanlı ve
Metrik Tabanlı. Bu basit klon tespit teknikleri, tekrarlanan kod parçacıklarına geniş
bir açıdan bakmadıkları için, bu tekrarlamaların tasarım seviyesindeki olası
tekrarlamalardan kaynaklanıp kaynaklanmadığını saptayamamaktadırlar. Bu nedenle,
programın üst seviye benzerliklerinin ortaya çıkarılması; programın anlaşılması, ileriki
geliştirilmelerden kaynaklanabilecek risklerin azaltılması, yeniden kullanılabilirliğin
artırılması, programının çıktılarını ve işlevlerini değiştirmeden içyapısının yeniden
düzenlenerek basitleştirilmesi için yapısal klonun tespit teknikleri gerekmektedir. Bu
makale yapısal kod klon tespit yöntemlerini detaylı olarak irdeleyerek, özellikle
metrik tabanlı yapısal kod klon tespit yöntemleri üzerinde, teknolojideki en son
gelişmeleri yansıtan bir değerlendirme yapmaktadır.</p>
        <p>Bu makalenin organizayon yapışı şu şekildedir. Birinci bölümde yazılım
projelerinde kod klonlarının ortaya çıkma sebepleri, kod klonlarının görülme sıklığı ve
ortaya çıkardıkları olumsuzluklar özetlenmiştir. İkinci bölümde yazılım kod klon
analiz ta-nımları verilmektedir. Üçüncü bölüm kod klon tespit yöntemleri üzerinde
literatüre taramasını vermektedir. Dördüncü bölüm yapısal klon tespiti için önerilen
metriklere dayalı mimari yapıyı anlatmaktadır. Sonuç bölümü araştırmalarımızı
özetleyerek ma-kaleyi sonlandırılmaktadır.
2</p>
      </sec>
    </sec>
    <sec id="sec-2">
      <title>Yazılım Kod Klon Analiz Tanımları</title>
      <p>Genel yazılım kod klon terminoloji terimleri Tablo 1‟de özetlenmekte ve açıklamaları
aşağıda verilmektedir. Bu terminoloji Kod Parçacığı, Kod Klon, Klon Çifti ve Klon
Sınıfı terimlerini içermektedir.</p>
      <p>Kod Parçacığı: Kod parçacığı, içerisinde yorum barındıran veya barındırmayan sıralı
kod satırlarıdır. Kod parçacıkları, kod içerisindeki herhangi bir sıralı ifade olabileceği
gibi, fonksiyon tanımlaması da olabilir. Kod parçacıkları bulunduğu orijinal dosyanın
ismi, dosyadaki başlangıç satırının numarası ve bitiş numarası ile gösterilmektedir.
Kod Klon: Bir kod parçacığı, başka bir kod parçacığı ile önceden tanımlanan
benzerlik fonksiyonuna göre benzerlik gösteriyorsa, bu kod parçacığına, benzediği kod
parçacığının klonu denilmektedir.</p>
      <p>Klon Çifti: Program içerisinde, sadece birbirlerine benzeyen iki kod parçacığının
oluşturduğu çifte klon çifti denilmektedir.</p>
      <p>Klon Sınıfı: Birbirine benzeyen kod parçacıklarının oluşturduğu kümeye kod klon
sınıfı denilmektedir. Kümedeki her kod parçacığı, geriye kalan diğer kod
parçacıklarına benzemektedir.</p>
      <p>Klon Tipleri: Kod Klon Tipleri basit klonlar ve yapısal klonlar ana başlıkları altında
incelenebilir. Basit klon tipinde, kod parçacıkları arasında 2 çeşit temel benzerlik
bulunmaktadır. Bu benzerlikler, programın metni bazında olabileceği gibi metinden
bağımsız olarak, işlevsel bazlı da olabilir. Bu benzerlikler temel olarak 4 ana başlık
altında aşağıda belirtildiği gibi incelenmektedir:</p>
      <p>Tip I: Yorumlar, boş satırlar ve kod düzeni haricinde kalan kod parçacıkları-nın
metinsel olarak birbirinin tamamen aynı olmasıdır.</p>
      <p>Tip II: Tip II, Tip 1‟den farklı olarak, program içerisinde tanımlanan ifadele-rin
söz dizimsel olarak benzer olup olmadığını değerlendirmektedir. Program
içerisinde tanımlanan ifade metinsel olarak birbirine benzemese de, söz di-zimsel olarak
aynı olan ifadeleri yakalamaktadır. Örneğin, int a=3, ile int b=3 ifadesi her ne
kadar ifade (a, b) ismi metinsel olarak birbirine benzemese de işlevsel olarak her ikisi
de aynıdır.</p>
      <p>Tip III: Programdan kopyalanan kod parçacığının içerisindeki; ifade isimle-rinin
ve tiplerinin değiştirilmesinin yanı sıra, söz dizim içerisine fazladan ifade
ekleme/çıkarma yapılmasıyla oluşan klon tipidir.</p>
      <p>Tip IV: Aynı sonucu dönen fakat metinsel ve söz dizimsel olarak birbirinden
tamamen farklı olan iki veya daha fazla kod parçacığı bu klon tipini
oluşturmaktadır.</p>
      <p>Yukarıda bahsedilen klon tipleri daha çok kod parçacıkları üzerine çalışmaktadır.
Fakat bu kod parçacıkları arasındaki benzerlikler, üst seviyedeki mimari benzerlikten
dolayı da kaynaklanabilmektedir. Mimari yapının birbirine benzemesi sonucu oluşan
bu klon tipine ise yapısal klon denmektedir. Yapısal klon, benzerlik seviyesine göre
yukarıda bahsedilen 4 çeşit basit klon tipinden herhangi birini kapsayabilmektedir.</p>
      <sec id="sec-2-1">
        <title>Klon Çeşitleri Tip I Tip II Tip III</title>
        <p>Tip IV
Tablo 1. Klon tiplerinin sınıflandırılması
×</p>
      </sec>
      <sec id="sec-2-2">
        <title>Basit Klon</title>
        <p>Metin Bazlı Klon İşlevsel Klon
 ×
 ×
 ×




</p>
      </sec>
      <sec id="sec-2-3">
        <title>Yapısal Klon</title>
        <p>Tablo 1‟de klon türlerinin hangi klon çeşitlerini içerip hangilerini içermediği
gösterilmektedir. Bu bağlamda Yapısal Klon türünün diğer klon türlerinden farklı olarak
var olan tüm klon tiplerini içerdiği ve buna ek olarak programın genel mimarisindeki
klonları da kapsadığı görülmektedir.
3</p>
      </sec>
    </sec>
    <sec id="sec-3">
      <title>Tespit Yöntemleri Literatür Taraması</title>
      <p>Kod klonlar üzerinde Yazılım Mühendisliği alanında geniş kapsamlı araştırmalar
yapılmıştır. Literatüründe kod klon problemlerini azaltmak ya da engellemek için
birçok teknik önerilmiştir. Bu araştırmaların odağında ise kod klon tespiti yer
almaktadır. Bu açıdan, bu literatür taramasında kod klonlarının tespit yöntemleri üzerinde
yoğunlaşılmıştır.</p>
      <p>Bir yazılım projesini oluşturan kaynak dosyalarının metinleri içerisindeki, birbirine
yüksek oranda benzeyen kod parçaları klon algılayıcıları aracılığıyla
yakalanabilinmektedir. Klon algılayıcıları, sistemi oluşturan kaynak dosyaları içerisinde birbirine
yüksek oranda benzeyen kod parçalarını bulmaya çalışmaktadırlar. Fakat buradaki
temel sorun, hangi kod parçacığının birden çok kez kullanıldığının bilinmemesidir.
Bundan dolayı her bir kod parçacığı, diğer tüm parçacıklar ile tekrar tekrar
karşılaştırılmalıdır. Bu karşılaştırma oldukça yüksek bir hesaplama maliyeti doğurmaktadır. Bu
araştırma maliyetini düşürmek için bazı teknikler geliştirilmiştir. Bu tekniklerin temel
olarak akış diyagramları Şekil 1‟de gösterilmektedir.</p>
      <p>Şekil 1. Genel Klon Tespit Süreçleri
Literatürde birden fazla klon tespit aracı bulunmaktadır. Bunlardan bazıları akademik
olduğu gibi, ticari olanları da vardır. Tespit araçları temel olarak veriyi dönüştürme ve
benzerlik tespiti olmak üzere 2 aşamadan oluşmaktadırlar. Datayı dönüştürme
aşamasında programın kaynak kodu, benzerlik algoritmasının kolay ve verimli bir şekilde
çalışabileceği veri formatına çevrilir. Benzerlik tespiti aşamasında ise birbirlerine
benzer ya da eşit olan kod parçacıkları tespit edilir. Karşılaştırmayı ve dolayısıyla
sonucu etkilediği için veri formatı, tespit araçlarının sınıflandırılmasında önemli bir
rol oynamaktadır. Kod parçacıklarının karşılaştırılma seviyesi ve temel olarak alınan
klon tespit yöntemine göre bu araçlar birbirinden farklı tipte klon tespit
edebilmektedirler. Bu sebepten dolayı, tespit araçlarının kullandığı farklı teknikler aşağıdaki gibi
ayrıştırılmaktadır:
Metin Temelli Teknikler: Sadece metin bazlı birçok teknik bulunmaktadır. Bu
yaklaşım tekniğin de programın kaynak kodu sıralı cümleler (metinler) halinde
düşünülmektedir. Herhangi 2 kod parçacığı birbiri ile karşılaştırılarak aynı metin sırası
yakalanmaya çalışılmaktadır. Aynı olan maksimum sayıdaki metin satırı klon olarak
belirtilir. Bu teknikte kaynak kod verisi çok fazla dönüşüm işlemine tabi tutulmaz, çoğu
zaman kaynak kod doğrudan karşılaştırma algoritmasında kullanılmaktadır. Fakat
bazı yaklaşımlarda yorumların ve boşlukların kaldırılması gibi küçük çaplı dönüşüm
işlemleri gerçekleştirilmektedir. Satır satır karşılaştırılarak yapılan bu tespit yöntemi
bazı hatalara sebep olmaktadır, bu hataların bazıları aşağıda sıralanmaktadır.</p>
      <p>Satır sırasının kod stilinden dolayı yer değiştirmesi hataya yol açmaktadır.
Örneğin, Şekil 2‟de gösterilen her iki kod parçacığı birbirinin aynısı olmasına
rağmen klon olarak değerlendirilmemektedir.
İfadelerin isimlerinin değiştirilmesi tespit tekniğini hataya düşürmektedir. Örneğin,
Şekil 3‟te gösterildiği gibi her ne kadar her iki satır aynı işlevi yap-mış olsa da bu
satırlar klon olarak değerlendirilmemektedir.</p>
      <p>
        Tek satır ifadelere parantez ekleme ya da çıkarılması sonucu satır satır metin
karşılaştıran bu teknik klonu yakalayamamaktadır. Bu durum Şekil 4‟te
gösterilmektedir.
İlk gerçeklenen bazı klon algılayıcıları sözcüksel analiz tabanlıdır. Bu bağlamda
Baker [
        <xref ref-type="bibr" rid="ref17">17</xref>
        ], Dup adı verilen aracı ile kaynak koddaki satır sıralarını kullanarak, satır
satır klonları sözcüksel ve satır bazlı dizgi eşleştirme algoritması ile bulmaktadır. Dup
sekmeleri, boşlukları ve yorumları kaldırır; fonksiyonlardaki belirleyicileri,
değişkenleri ve tipleri değiştirir; bütün satırları birleştirerek analizin tek metin satırı içerisinde
yapılmasını sağlar; her bir satırı karşılaştırma için karıştırır ve son ek ağaç
algoritmasını kullanarak en uzun eşleştirilmiş klon çifti kümesini çıkarır. Dup ayrıca parametre
eşleştirmelerini de tespit eder ve bulunan eşleştirmeleri göstermek için rapor
oluşturur. Ancak bu araç kopyalanmış kodlar üzerinde araştırma ve navigasyon
yapamamaktadır. Çünkü farklı kod stili ile yazılmış ve farklı değişken ismi kullanılmış kod
klonlarını tespit edememektedir. Dup dizgilerdeki karakterleri karşılaştırmak yerine
sözcükleri karşılaştırarak yorumlarda ve boşluklardaki değişikliklerden dolayı oluşan
problemleri önlemektedir.
      </p>
      <p>Şekil 2. Kod stilinden kaynaklanan hatalı program örneği</p>
      <p>
        Şekil 3. İfade ismi değiştirilmiş hatalı program örneği
Ducase ve arkadaşları başka bir metin bazlı klon tespit yaklaşımı sunmaktadır [
        <xref ref-type="bibr" rid="ref18 ref19">18,19</xref>
        ].
Yaklaşım ayrıştırmaya dayanmamaktadır ve bundan dolayı herhangi bir dile kolayca
uyum sağlayabilmektedir. Bu yöntem kaynak kodları okur, satırlardan diziler
oluşturur, boşlukları ve yorum satırlarını kaldırır ve dizgi temelli Dinamik Model Eşleme
algoritmasını kullanarak eşleşmeleri tespit eder. Çıktı olarak, klon çiftlerinin satır
numaralarını ve onların içerisindeki olası silinmiş satırları verir. Ancak Ducase‟nin bu
yönteminin hesaplama karmaşıklığın boyutlu bir girdi de O (n2) olduğu için çok
masraflıdır.
      </p>
      <p>Şekil 4. Tek satır ifadelere parantez ekleme ve çıkarma hatalı program örneği
Jeton Temelli Teknikler: Bu yaklaşımda, bütün kaynak kod jeton (token) sırası
halinde çevrilmektedir. Daha sonra bu sıralı jeton dizinleri, klon kodları bulmak için
taranmaktadır ve orijinal kod üzerinden klonlanmış sıralı alt jeton listeleri ortaya
çıkarılmaktadır. Metin tabanlı sistemlerle karşılaştırıldığında, metin tabanlı tekniklerde
ortaya çıkan kodlama formatı ve standardından kaynaklanan hatalar, bu teknikle
ortadan kaldırılmaktadır.</p>
      <p>
        Jeton bazlı tekniklerden en gelişmişi Kamiya ve arkadaşları [
        <xref ref-type="bibr" rid="ref5">5</xref>
        ] tarafından
gerçekleşti-rilmiş CCFinder uygulamasıdır. CCFinder, ilk olarak kaynak dosyaları
sözcüksel analiz programı ile jetonlara ayrıştırır ve ayrıştırılan jetonları birleştirerek
tek bir jeton sırası oluşturur. Sonrasında bu sıraya, jeton ekleyerek, silerek veya
değiştirerek yazılım dilinin kurallarına göre dönüşüm yapar. Her bir tanımlayıcı
değişkeni ve tipi özel jetonlarla değiştirilir. Bu tanımlayıcı değişimi ile kod
parçacıklarından farklı değişken isimli klon çiftleri oluşturulur ve sonrasında ekleme
tabanlı ağaç alt dizgi eşleme al-goritması ile dönüşümü yapılmış klon jeton dizisinden
benzer alt diziler bulunur ve bu diziler klon çifti / klon sınıfı olarak gruplanır.
      </p>
      <p>
        CCFinder dışında jeton temelli daha birçok çalışma yapılmıştır. Baker‟ın Dup
[
        <xref ref-type="bibr" rid="ref17 ref20 ref3">3,17, 20</xref>
        ] uygulaması jeton tabanlı CCFinder‟a benzer şekilde sözcüksel analiz
programını kullanıp kaynak kodu jetonlara ayırarak, ekleme tabanlı ağaç alt dizgi eşleme
algorit-ması ile kod klonları bulmaktadır. Dup‟ın CCFinder‟dan farkı dönüşüm
yapmaması-dır. CP-Miner [
        <xref ref-type="bibr" rid="ref21 ref7">7,21</xref>
        ] ise jeton bazlı klon tespiti için yapılmış olan başka bir
çalışma-dır. Bu çalışmada benzer parçalanmış ifadeler ardı ardına alt dizi madencilik
(mining) teknikleri kullanılarak bulunmaktadır.
      </p>
      <p>Ağaç Temelli Teknikler: Programın kaynak kodu, programlama diline bağlı olarak
soyut sözdizimi ağacına (Abstract Syntax Tree (AST) ) veya ayrıştırma ağacına
çevrilmektedir. Çevrilen ağaç üzerinde bazı eşleştirme ağacı yöntemleri kullanılarak, alt
ağaçlar aranmaktadır. Yakalanan alt ağaçlar sadece klon çifti ya da sınıfı olarak
gösterilmektedir.</p>
      <p>
        Soyut sözdizimli ağaç tekniklerinden en önemlisi Baxter ve arkadaşları tarafından
yapılmış olan CloneDR uygulamasıdır [
        <xref ref-type="bibr" rid="ref10">10</xref>
        ]. CloneDR derleyici kullanarak açıklamalı
ayrıştırılmış ağaç (annotated parse tree) oluşturur ve oluşturulan bu ağacın alt
ağaçlarını metrik tabanlı özet fonksiyonlar (hash function) ile karşılaştırarak ağaçları
eşleştirir. Benzer ağaçların kaynak kodu klon olarak gruplanır. Ağaç temelli teknikler için
yapılmış başka bir araç da Bauhaus‟un ccdiml [
        <xref ref-type="bibr" rid="ref22">22</xref>
        ] klon tespit aracıdır. ccdiml
CloneDR‟ye benzediği gibi benzerlik metrikleri ve özet fonksiyonları kullanmayarak
CloneDR‟den farklılıklar göstermektedir. Ayrıca, CloneDR eş zamanlı çalışıp, tutarlı
yeniden adlandırma kontrolleri yaparken, ccdiml bunları yapamamaktadır ve
CloneDR soyut sözdizimi ağaçlarını direk karşılaştırma amaçlı kullanırken, ccdiml„de
bu ağaçlar ara dil (intermediate language) olarak temsil edilmektedir.
      </p>
      <p>Program Bağımlı Çizge (Program Dependency Graph) Teknikler: Programın akış
kontrolü ile birlikte veri kontrolünü de içerisinde barındırmaktadır. Bu sayede diğer
tüm tekniklerden bir adım öteye geçerek, programın iş mantığı bilgisini de
barındırmaktadır. Programın çizgesi elde edildikten sonra, izomorfik alt çizge eşleme
algoritmaları kullanılarak klon alt çizgeler bulunmaktadır.</p>
      <p>
        Komondoor ve Horwitz [
        <xref ref-type="bibr" rid="ref23 ref24">23,24</xref>
        ] tarafından yapılan PDG-DUP aracı program
bağımlı çizge yaklaşımlarından biridir. PDG-DUP bölme programı (program slicing)
ile eş yapılı alt çizgeleri bulmaktadır. Komondoor ve Horwitz ayrıca tanımlanan
klonları orijinal kodun semantiğini bozmadan birlikte gruplamak için bir yaklaşım
sunmakta-dır. Başka bir program bölme temelli PDG-DUP‟a benzer bir çalışma ise
Gallagher ve Lucas [
        <xref ref-type="bibr" rid="ref25">25</xref>
        ] tarafından gerçekleştirilmiştir. Gallagher ve Luca‟nın amacı
ayrıştırılan parçacıkların klon olup olmadığı analizini program bölme aracını
sistemdeki bütün değişkenlere uygulayarak yapmaktır. Ancak, analizin sonucundan tam
emin olamadıklarından dolayı yalnızca avantajlarını ve dezavantajlarını
açıklamışlardır. Chen ve arkadaşları [
        <xref ref-type="bibr" rid="ref26">26</xref>
        ] ise kodun sözdizimsel ve veri akışını dikkate
alarak kod sıkıştırma için program bağımlı çizge tekniği sunmuştur.
      </p>
      <p>Metrik Temelli Teknikler: Metrik temelli yaklaşımlar kod parçacıkları için farklı
metrikleri toplar ve kodu direk karşılaştırmak yerine bu metrik vektörlerini
karşılaştırır. Benzer kodları tespit etmek için yazılım metriklerini kullanan birçok klon tespit
tekniği vardır. İlk olarak, parmak izi fonksiyonları adı verilen yazılım metrik kümesi
ile bir veya birden fazla sınıf, fonksiyon veya metot gibi sözdizimsel birimler
hesaplanır ve sonrasında bu birimler üzerindeki metrik değerleri karşılaştırılarak klonlar
bulunur. Birçok durumda, kaynak kod bu metriklerin hesaplanması için parçalanarak
onun soyut sözdizimi ağacı / program bağımlı çizge temsili oluşturulur.</p>
      <p>
        Patenaude ve arkadaşları [
        <xref ref-type="bibr" rid="ref27">27</xref>
        ] gerçekleştirdikleri metrik temelli çalışmada metot
içeri-sinden çağrılma sayısı, ifade sayısı, McCabe‟in siklometik karmaşıklık ölçüsü,
yerel olmayan değişkenlerdeki kullanılan tanımlama sayısı ve yerel değişken sayısı
gibi metot seviyesinde birbirine çok benzer metrikleri benzer metotları bulmak için
kul-lanmışlardır. Bu metrikleri Java programlama dili için tanımlamışlardır ve IBM
Datrix aracını yazılım kalite değerlendirmesinde Java‟yı desteklemesi için
genişletmişlerdir.
      </p>
      <p>
        Kanika ve arkadaşları [
        <xref ref-type="bibr" rid="ref28">28</xref>
        ] verilen Java programları için MCD Finder adı verilen
metrik hesaplama aracını sunmuşlardır. MCD Finder, kaynak kodu dönüştürüp metrik
hesaplaması yapmak yerine, metrik hesaplaması için Java programlarındaki bayt
kodları kullanmaktadır. Bayt kod kullanmasının nedeni ise platformdan bağımsız ve
yapısal olarak birleştirilmiş kod elde etmektir.
      </p>
      <p>Yapısal klon: Yapısal klon analizleri içinde, sözdizimsel olduğu kadar mantıksal
analiz de yapılmaktadır. Yazılım içersindeki kod kadar, yazılımın tasarım şablonları ve
kod yorumları yapısal klon analizinde kullanılmaktadır. Fakat çoğu zaman yazılı-mın
başlangıç aşamasında çizilen tasarım şablonları, yazılımın zaman içerisindeki
değişiklikleri ile birlikte geliştiriciler tarafından güncellenmemektedir. Başlangıçta çizilen
tasarım şablonları, sistemin yapısını özetlemekten uzak kalmaktadır. Yapısal klonların
tespiti, doğrudan alan analizi (domain analysis)‟ne bağlıdır. Farklı yapıdaki yapısal
klonları tespit etmek için farklı teknikler gerekmektedir. Bazı durumlarda uzman
geliştiricilerin yorumlamalarına ihtiyaç duymaktadır ki bu da tamamen otoma-tik bir
tespit aracının geliştirilmesini zorlaştırmaktadır. Fakat yine de yapısal klon tespit
araçları, basit klon tespit araçlarına göre, kullanıcıya mimari anlamda daha fazla bilgi
vermektedir.</p>
      <p>Yapısal klon tespiti için bazı araçlar geliştirilmiştir. Bu araçlardan bir tanesi Basit
ve arkadaşları [29] tarafından gerçekleştirilen Clone Miner‟dır. Clone Miner, ilk
aşama-da basit klonları tespit eder ve daha sonra tespit edilen bu basit klonları dosya
ya da sınıf seviyesinde gruplayarak yapısal klon analizi yapmaktadır.</p>
      <p>De Lucia ve arkadaşları [30] yapısal klon tekniğini kullanarak web sayfaları
üzerinde klon tespit çalışmasını gerçekleştirmişlerdir. Bu çalışmada herhangi bir web
sayfası verilen bir eşik değerine göre diğer sayfaya benziyorsa, bu iki sayfanın
birbirinin klonu olduğu iddia edilmektedir. Levenshtein uzaklık algoritmasını kullanarak,
sayfaların birbirine olan benzerliği ölçülmektedir.</p>
      <p>Gemini ve arkadaşları [31] ise yaptıkları yapısal klon çalışmasında sistem
içerisindeki dosyaların birbirlerine benzerliğini, dosya içerisinde bulunan basit klonlar
üzerinden yapmışlardır. Basit klonların tespiti için CCFinder aracını kullanmışlardır.
Çalışmala-rında dosyalar arasındaki ikili benzerlik oranını ortaya koymuşlarıdır fakat
grup ben-zerliğini yapamamışlardır. Birbirine benzer olan iki dosyanın birbirlerinin
klonu olup olmadığı yönünde karar vermekten kaçınmışlardır.</p>
      <p>De Lucia ve arkadaşları [30] yapısal klon tekniğine başka bir yaklaşımda
bulunarak web spesifik yapısal klonlarını tespit etmişlerdir. Web sayfalarını klonun
elemanı olarak değerlendirerek, sayfalar arasında geçişi sağlayan köprüler (hyperlink)
klon tespiti için ilişki olarak değerlendirilmiştir. Çalışmalarında çizge tabanlı şablon
eşleş-tirme algoritmalarını kullanmışlardır.</p>
      <p>Marcus ve Maletic‟in [32] öngördüğü klon tespit yaklaşımı diğerlerinden farklı bir
bakış açısına sahiptir. Şimdiye kadar incelenen klon tespit araçları kod içerisinde ki
tanımlayıcıların (identifier) benzerliğini göstermeyi hedeflemektedir. Bu çalışmada
ters akış mantığı ile kaynak kod içerisindeki tanımlayıcı isimlerinden yola çıkılarak
yapısal klon analizi yapılmaktadır. Tanımlayıcı isimleri birbirine benzeyen ve yapısal
olarak birbirinin klonu olan iki ayrı sistem için, tanımlayıcı isimlerinin değişmesiyle
bu çalışma yapısal klonları tespit etmede başarısız olacaktır.</p>
      <p>Yazılım sistemleri içerisindeki sınıfların yapısını oluşturan tasarım şablonlarına
ben-zer olan fakat uygulama seviyesinde soyutlama sağlayan yapılara mikro şablonlar
denmektedir [33]. Bu mikro tasarım şablonları üzerinden yapısal klon analizi
yapılabilmektedir. Benzer şekilde Shi ve Olsson [34] tarafından gerçekleştirilen Pinot
aracında da kaynak kod içerisinde tasarım şablonları aranmıştır. Bu yöntemlerin eksik
yanı, sistem içerisinde bilinen şablonları aramalarıdır. Fakat yapısal klon tespiti
bilinmeyen şablonlar üzerinde de arama yapabilmelidir.</p>
      <p>Bütün bu klon tespit teknikleri için yapılan çalışmalar Tablo 2‟de klon tespit
sınıfına ve kronolojik olarak gerçekleştirilme yılına göre gösterilmektedir.</p>
      <p>Tablo 2. Klon tiplerinin sınıflandırılması</p>
      <sec id="sec-3-1">
        <title>Klon Tespit Sınıfı</title>
      </sec>
      <sec id="sec-3-2">
        <title>Klon Tespit Tekniği Çalışma</title>
        <p>
          Baker, Dup [
          <xref ref-type="bibr" rid="ref16">16</xref>
          ]
Baxter ve arkadaşları,
CloneDR. [
          <xref ref-type="bibr" rid="ref9">9</xref>
          ]
Chen ve arkadaşları [
          <xref ref-type="bibr" rid="ref20">20</xref>
          ]
Patenaude ve
[31]
Marcus ve Maletic [
          <xref ref-type="bibr" rid="ref22">22</xref>
          ]
arkadaşları
Komondoor ve
PDG-DUP [
          <xref ref-type="bibr" rid="ref26">26</xref>
          ]
Kamiya ve
CCFinder [
          <xref ref-type="bibr" rid="ref4">4</xref>
          ]
Gallagher ve Lucas [
          <xref ref-type="bibr" rid="ref28">28</xref>
          ]
Horwitz,
arkadaşları,
Ducase ve arkadaşları [
          <xref ref-type="bibr" rid="ref19">19</xref>
          ]
Yıl
1992
1998
1999
1999
2001
2001
2002
2003
Basit / Yapısal
Basit /Yapısal
Bağımlı
/
/
Metin Temelli
Jeton Temelli
Ağaç Temelli
Program
Çizge
Metrik Temelli
Metin Temelli
Jeton Temelli
Program
Çizge
Jeton Temelli
Program
Çizge
Metin Temelli
        </p>
        <p>
          Bağımlı
Bağımlı
De Lucia ve arkadaşları [39]
Basit ve arkadaşları, Clone
Miner [38]
Li ve arkadaşları, CP-Miner
[
          <xref ref-type="bibr" rid="ref6">6</xref>
          ]
Bauhaus, ccdiml [
          <xref ref-type="bibr" rid="ref25">25</xref>
          ]
Shi ve Olsson, Pinot [42]
Kanika ve arkadaşları
[47], MCD Finder
Basit / Yapısal
Basit
Basit
Yapısal
Basit
Program
Çizge
Tüm Basit
Teknikleri
Jeton Temelli
Ağaç Temelli
Tüm Basit
Teknikleri
Metrik Temelli
        </p>
      </sec>
    </sec>
    <sec id="sec-4">
      <title>Yapısal Klon Analizinde Metriklerin Kullanılması</title>
      <p>Yazılım sistemlerinde basit klonların yoğun olarak bulunması, tasarım çözümlerinin
kopyalanması sonucu oluşan yüksek seviyede benzerliklerin bulunduğuna işaret
etmektedir. Bu tasarım çözümlerinin kopyalanmasının sebepleri aşağıdaki gibi
sıralanabilmektedir.</p>
      <p>
        Aynı analiz şablonlarının kullanılması [
        <xref ref-type="bibr" rid="ref3">3</xref>
        ],
Aynı tasarım şablonlarının kullanılması [35],
Mimari seviyede kullanılan parçaların tasarımlarının benzemesi,
      </p>
      <p>
        Benzer sorunu çözmek için, geliştiricinin aynı mimariyi kullanması [
        <xref ref-type="bibr" rid="ref10">10</xref>
        ].
Literatür taraması incelendiğinde yapısal klonların tespitinde metrik tabanlı
çalışmaların kullanılmadığı ve bu alanda bir eksiklik olduğu görülmektedir. Yapısal klonların,
yazılım metrik ölçüm değerlerine dayalı olarak tespit edilip edilemeyeceği, ne oranda
başarılı tespitler yapılabileceği irdelenmesi gereken bir araştırma sorusudur. Bu
bağlamda Şekil 5‟te, önerilen çalışma yöntemi gösterilmektedir.
      </p>
      <p>Şekil 5. Genel önerilen çalışma yöntemi</p>
      <sec id="sec-4-1">
        <title>Metrik</title>
        <p>Kategori
i
r
e
l
k
i
r
t
e
M
ı
s
ı
y
a
S
r
ı
t
a</p>
        <p>S
Bu makale ile yapısal kod klonlarının tespiti ile ilgili teknolojideki en son ürünler ile
ilgili bir durum tespiti yapıyoruz ve Tablo 3‟te gösterilen metriklerin yapısal kod klon
tespitinde kullanılmasını öneriyoruz. Bu amaçla henüz öncelikli olarak Yapısal Kod
Klonlarının tespiti için odaklanmış ve açık kaynaklı Sonar Metik Ölçüm sistemine
[36] entegre edilecek bir sistem üzerinde çalışıyoruz. Önerdiğimiz sistem mimarisi
Şekil 6‟ da verilmektedir. Bu mimari tasarımda da görüleceği gibi, hedefimiz farklı
yazılım kalite metrik ölçüm araçları kullanılarak oluşturulmuş bir yazılım metrik
ölçüm veri tabanı üzerinde çalışacak olan bir eklenti ile yapısal klon analizine olanak
sağlamaktır.</p>
        <p>Tablo 3. Yapısal kod klon analizi için metrik değerlendirmesi</p>
      </sec>
      <sec id="sec-4-2">
        <title>Metrik Ismi</title>
      </sec>
      <sec id="sec-4-3">
        <title>Metrik Açiklamasi</title>
      </sec>
      <sec id="sec-4-4">
        <title>Kullanım Amacı</title>
      </sec>
      <sec id="sec-4-5">
        <title>Metrik</title>
        <p>Yapısal Kod</p>
      </sec>
      <sec id="sec-4-6">
        <title>Klona Uygun?</title>
        <p>Satır sayısı
Yorum sayısı</p>
        <p>Yoruma
alınmış kod satır
sayısı</p>
        <p>Yoruma
alınmış boş satır
sayısı</p>
        <p>Yoruma
alınmamış kod
satır sayısı</p>
        <p>Dönüştürülmüş
kod satır sayısı</p>
        <p>Projedeki toplam
kod satır sayısı</p>
        <p>Projedeki toplam
yorum sayısı</p>
        <p>Projedeki toplam
yoruma alınmış kod
satır sayısı</p>
        <p>Projedeki toplam
boş yorum satır
sayısı</p>
        <p>Projedeki toplam
işlevsel kod satır
sayısı</p>
        <p>Projedeki
jetonlarına ayrılmış
toplam kod satır sayısı
Hayır
Hayır
Hayır
Hayır
Hayır
Hayır
i
r
e
l
k
i
r
t
e
M
k
ı
l
k
ı
ş
a
m
r
a
K
r
e
l
k
i
r
t
e
M
ı
l
a
y
a
D
e
y
e
n
s
e
N</p>
        <p>Toplam ifade
sayısı</p>
        <p>Sınıf
karmaşıklığı</p>
        <p>Metot
karmaşıklığı</p>
        <p>Dosya
karmaşıklığı</p>
        <p>Dosya
bağımlılığı</p>
        <p>Ağaç derinliği</p>
        <p>Sınıf içerisinde
referans alınan
sınıf sayısı</p>
        <p>Türetilmiş alt
sınıf sayısı</p>
        <p>Projedeki
jetonlarına ayrılmış
toplam ifade sayısı
Sınıf içerisindeki
ortalama
karmaşıklık
Metot içerisinde
gerçekleştirilen ve
akışı değiştiren
kontrollerin toplam
sayısı</p>
        <p>Dosya
içerisindeki ortalama
karmaşıklık</p>
        <p>Paketler
arasındaki bağımlılığı
oluşturan dosyaların
sayısı</p>
        <p>Sınıfın, temel
sınıfa göre kalıtım
sayısı</p>
        <p>Bir sınıf
içerisindeki referans
alınan top-lam sınıf
sayısı</p>
        <p>Sınıftan doğrudan
ya da dolaylı yoldan
türetilmiş toplam
sınıf sayısı
Hayır</p>
      </sec>
      <sec id="sec-4-7">
        <title>Evet</title>
      </sec>
      <sec id="sec-4-8">
        <title>Evet</title>
      </sec>
      <sec id="sec-4-9">
        <title>Evet</title>
      </sec>
      <sec id="sec-4-10">
        <title>Evet</title>
      </sec>
      <sec id="sec-4-11">
        <title>Evet</title>
      </sec>
      <sec id="sec-4-12">
        <title>Evet Evet</title>
        <p>İçerisinde
karmaşıklığı birbirine benzer
sınıf barındıran
projeler, yapısal olarak da
birbirine benzeyebilir.
İçerisinde
karmaşıklığı birbirine benzer
metot barındıran
projeler, yapısal olarak da
birbirine benzeyebilir.
İçerisindeki
karmaşıklığı birbirine
benzer dosyalar
barındıran projeler, yapısal
olarak da birbirine
benzeyebilir.</p>
        <p>Paketler arasındaki
dosya bağımlılığı
birbirine benzer olan
projeler, yapısal olarak
da birbirine
benzeyebilir.
İçerisinde ağaç
derinliği birbirine benzer
sınıflar barındıran
projeler, yapısal olarak
da birbirine
benzeyeblir.</p>
        <p>Sınıf içerisinde
referans alınan sınıf sayısı
birbirine ben-zer olan
projeler, yapısal olarak
da birbirine
benzeyebilir.
İçerisindeki türetilen
toplam sınıf sayısı
birbirine benzer olan
projeler, yapısal olarak
da birbirine
benzeyebilir.</p>
        <p>Sınıfın başka
sınıflarda referans
verilme sayısı</p>
        <p>Bir sınıfın toplam
referans verilme
sayısı</p>
        <p>Metoda verilen
parametre sayısı</p>
        <p>Metoda verilen
toplam girdi sayısı
Metodun
döndüğü parametre
sayısı</p>
        <p>Metodun sonuç
ola-rak döndüğü
toplam çıktı sayısı
Metot
içerisinde başka
metotları çağırma
sayısı</p>
        <p>Bir metot
içerisinde çağrılan toplam
metot sayısı</p>
      </sec>
      <sec id="sec-4-13">
        <title>Evet Evet Evet Evet</title>
        <p>Programlama diline bağımlı olarak, yapısal klon analizinde kullanılacak metrikler
değişkenlik gösterebilmektedir. Bu metrikler; ifadeler seviyesinde olabileceği gibi
sınıf seviyesinde de olabilmektedir. Örnek olarak, Java programlama dili için yapısal
klon analizinde kullanılabilecek metriklerden bazıları; sınıf tanımlamaları, metot
tanımlamaları, koşullu veya döngülü ifadeler ve blok aralığı tanımlayıcılarıdır.</p>
        <p>Bu önerimizi takiben gerçekleştireceğimiz çalışmamızda, bu amaçla, Tablo 3‟te de
gösterildiği gibi Karmaşıklık metrikleri (sınıf karmaşıklığı, metot karmaşıklığı, dosya
bağımlılığı gibi), Satır sayısı metrikleri (kod satır sayısı, yorum satır sayısı, boş satır
sayısı gibi) ve Nesneye Yönelik Metrikler (ağaç derinliği, türetilmiş alt sınıf sayısı,
bir sınıf için çağrı sayısı, sınıf içindeki referans alınan sınıf sayısı gibi) incelenecek ve
yapısal kod tespiti ve analizinde kullanılabilecek metrikler belirlenecektir.</p>
        <p>Önerdiğimiz sistemde kullanmayı planladığımız araç Sonar [36] kalite metrik
ölçüm aracıdır. Sonar, projelerin teknik kalitesini ölçmek ve analiz etmek için
projenin bütü-nünden metotlarına kadar değişkenlik gösteren seviyelerde yönetim sunan
açık kay-naklı bir yazılım kalite yönetim sistemidir. Sonar aracı, 2.11 nolu sürümüne
kadar PMD-CPD [37] aracını kullanarak klon tespiti yapmıştır. Bu PMD-CPD tespit
aracı kaynak kod içerisindeki jetonları (token) kullanarak Tip I-II ve kısmen de olsa
Tip III olan basit klonları tespit edebilmektedir. Sonar içerisindeki bu klon tespit
yöntemi hesaplama yapmak için yüksek miktarda hafızaya ihtiyaç duyması, tek proje
içerisin-de klon tespiti yapabilmesi, java harici farklı dillere destek vermemesinden
dolayı Sonar-CPD adında yeni bir kütüphane kullanmaktadırlar. Bu kütüphane
Google Kod Yazı 2011 kapsamında geliştirilmiştir. Bir önceki sürümüne göre
farkları, birden fazla proje içerisinde klon tespiti yapabilmesi ve daha az hafıza
kullanmasıdır. Fakat yine basit klon tiplerinden Tip I-II ve kısmen de olsa Tip III
desteklemektedir. Sonar, kali-te ölçüm ve değerlendirilmelerinde kullanmak üzere
karmaşıklık, tasarım, doküman-tasyon ve boyut gibi farklı alanlarda toplamda 125
adet metrik barındırmaktadır.</p>
        <sec id="sec-4-13-1">
          <title>Proje Kodları Araçlar</title>
        </sec>
        <sec id="sec-4-13-2">
          <title>PROJE-1</title>
        </sec>
        <sec id="sec-4-13-3">
          <title>PROJE-2</title>
        </sec>
        <sec id="sec-4-13-4">
          <title>PROJE-3</title>
        </sec>
        <sec id="sec-4-13-5">
          <title>SONAR UNDERST AND</title>
          <p>Şekil 6. Yapısal Kod Klon Tespiti Sismei Genel Mimarisi
Hedeflenen yapı, basit klon tespiti yapan teknikler içersinde, hafızayı etkin bir şekilde
kullanma yöntemi olan metrik temelli tespit tekniği kullanarak yapısal klon analizi
yapmaktır. Bu noktada Sonar‟ın kullanmış olduğu metriklerin yanında yapısal klon
için kullanılabilecek gerekli ekstra parametreler de Sonar‟a tanıtılacaktır. Sonar‟ın
metrik ölçümlerinden çıkan sonuçlar ışığında Yapısal klon analizi yapılması
hedeflenmektedir.
5</p>
        </sec>
      </sec>
    </sec>
    <sec id="sec-5">
      <title>Sonuç ve Gelecek için Planlar</title>
      <p>Klon tespiti aktif olan araştırma alanlarından biridir ve literatürde klonları yazılım
sistemlerinden kaldırmak için birçok çalışma yapılmıştır. Ayrıca yazılım
sistemlerinin gelişim yaşam döngüsünde klonlardan korunmak için de çalışmalar yapılmaktadır.
Bu çalışmada, yazılım klon tespit araştırma alanında kullanılan klon tipleri, onların
tespit mekanizmaları ve ilgili araçları vurgulanarak, yapısal kod klon tekniği ile
metrik temelli kod klon tespit tekniği birleştirilerek klon tespiti için karma bir yapı
önerilmektedir. Önerilen bu yöntem klon tespit tekniğini kullanan potansiyel kullanıcılara
doğru klon tespit aracını seçmelerine yardımcı olmaktır.</p>
      <p>Gelecekte yapılacak araştırmamızı, bu makele ile önerdiğimiz metodolojinin
gelişti-rilmesi, değerlendirilmesi şeklinde planladık. Bu sistemin gerçeklenmesi
sonucunda ortaya çıkacak eklenti, Sonar açık kaynaklı aracı ile entegre kullanılabilecek ve
yapısal kod klon analizinde kullanılabilecek bir yazılım ortaya çıkartacaktır.</p>
    </sec>
    <sec id="sec-6">
      <title>Kaynaklar</title>
      <p>29. Basit, H. A., Jarzabek, S. Detecting Higher-level Similarity Patterns in Programs.
Accepted for ESEC-FSE'05, European Software Engineering Conference and ACM SIGSOFT
Symposium on the Foundations of Software Engineering, ACM Press, September 2005,
Lisbon.
30. De Lucia, A., Francese. R., Scanniello, G., and Tortora, G. Reengineering Web
Applications Based on Cloned Pattern Analysis. In Proceedings of the 12th Intl. Workshop on
Program Comprehension (IWPC '04). pp. 132-141, 2004.
31. Ueda, Y., Kamiya, T., Kusumoto, S., and Inoue, K. Gemini: Maintenance Support
Environment Based on Code Clone Analysis. In Proceedings of the 8th IEEE Symposium on
Software Metrics, pp. 67-76, 2002.
32. Andrian Marcus and Jonathan I. Maletic. Identification of high-level concept clones in
source code. In Proceedings of the 16th IEEE International Conference on Automated
Soft-ware Engineering (ASE'01), pp. 107-114, San Diego, CA, USA, November 2001.
33. J.Y. Gil and I. Maman, “Micro Patterns in Java Code,” Proc. 20th Object Oriented
Programming Systems Languages and Applications, pp. 97-116, 2005.
34. N. Shi and R.A. Olsson, “Reverse Engineering of Design Patterns from Java Source
Code,” Proc. 21st IEEE/ACM Int‟l Conf. Automated Software Eng., pp. 123-134, Sept.
2006.
35. Tibor Bakota, Rudolf Ference and Tibor Gyimothy. Clone Smells in Software Evolution.</p>
      <p>In Proceedings of the 23rd IEEE International Conference on Software Maintenance
(ICSM‟07), 10pp., Paris, France, October 2007.
36. Sonar, URL http://docs.codehaus.org/display/SONAR/Documentation Last accessed Jun
2013.
37. PMD‟s CPD. URL http://pmd.sourceforge.net/cpd.html Last accessed Jun 2013.</p>
    </sec>
  </body>
  <back>
    <ref-list>
      <ref id="ref1">
        <mixed-citation>
          1.
          <string-name>
            <given-names>M.</given-names>
            <surname>Fowler</surname>
          </string-name>
          .
          <article-title>Refactoring: Improving the Design of Existing Code</article-title>
          . Addison-Wesley,
          <year>2000</year>
        </mixed-citation>
      </ref>
      <ref id="ref2">
        <mixed-citation>
          2.
          <string-name>
            <given-names>C. K.</given-names>
            <surname>Roy</surname>
          </string-name>
          and
          <string-name>
            <given-names>J. R.</given-names>
            <surname>Cordy</surname>
          </string-name>
          .
          <article-title>A survey on software clone detection research</article-title>
          .
          <source>Technical Report 541</source>
          , Queen's University at Kingston,
          <year>2007</year>
        </mixed-citation>
      </ref>
      <ref id="ref3">
        <mixed-citation>
          3.
          <string-name>
            <given-names>Brenda</given-names>
            <surname>Baker</surname>
          </string-name>
          .
          <article-title>On Finding Duplication and Near-Duplication in Large Software Systems</article-title>
          .
          <source>In Proceedings of the Second Working Conference on Reverse Engineering (WCRE‟95)</source>
          , pp.
          <fpage>86</fpage>
          -
          <lpage>95</lpage>
          , Toronto, Ontario, Canada,
          <year>July 1995</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref4">
        <mixed-citation>
          4.
          <string-name>
            <given-names>Gerardo</given-names>
            <surname>Casazza</surname>
          </string-name>
          , Giuliano Antoniol, Umberto Villano, Ettore Merlo, Massimiliano Di Penta.
          <article-title>Identifying Clones in the Linux Kernel</article-title>
          .
          <source>In Proceedings of the 1st IEEE International Workshop on Source Code Analysis and Manipulation (SCAM‟01)</source>
          , pp,
          <fpage>90</fpage>
          -
          <lpage>97</lpage>
          , Florence, Italy,
          <year>November 2001</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref5">
        <mixed-citation>
          5.
          <string-name>
            <given-names>Toshihiro</given-names>
            <surname>Kamiya</surname>
          </string-name>
          , Shinji Kusumoto,
          <string-name>
            <given-names>Katsuro</given-names>
            <surname>Inoue. CCFinder: A Multilinguistic TokenBased Code Clone</surname>
          </string-name>
          <article-title>Detection System for Large Scale Source Code</article-title>
          .
          <source>Transactions on Softwa-re Engineering</source>
          , Vol.
          <volume>28</volume>
          (
          <issue>7</issue>
          ):
          <fpage>654</fpage>
          -
          <lpage>670</lpage>
          ,
          <year>July 2002</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref6">
        <mixed-citation>
          6.
          <string-name>
            <given-names>Kostas</given-names>
            <surname>Kontogiannis</surname>
          </string-name>
          .
          <article-title>Evaluation Experiments on the Detection of Programming Patterns using Software Metrics</article-title>
          .
          <source>In Proceedings of the 3rd Working Conference on Reverse Engineering (WCRE‟97)</source>
          , pp.
          <fpage>44</fpage>
          -
          <lpage>54</lpage>
          , Amsterdam, The Netherlands,
          <year>October 1997</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref7">
        <mixed-citation>
          7.
          <string-name>
            <given-names>Zhenmin</given-names>
            <surname>Li</surname>
          </string-name>
          ,
          <string-name>
            <given-names>Shan</given-names>
            <surname>Lu</surname>
          </string-name>
          , Suvda Myagmar, and
          <string-name>
            <given-names>Yuanyuan</given-names>
            <surname>Zhou</surname>
          </string-name>
          . CP-Miner:
          <article-title>Finding CopyPaste and Related Bugs in Large-Scale Software Code</article-title>
          .
          <source>In IEEE Transactions on Software Engineering</source>
          , Vol.
          <volume>32</volume>
          (
          <issue>3</issue>
          ):
          <fpage>176</fpage>
          -
          <lpage>192</lpage>
          ,
          <year>March 2006</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref8">
        <mixed-citation>
          8.
          <string-name>
            <surname>Lingxiao</surname>
            <given-names>Jiang</given-names>
          </string-name>
          , GhassanMisherghi, Zhendong Su, and
          <string-name>
            <given-names>Stephane</given-names>
            <surname>Glondu</surname>
          </string-name>
          . DECKARD:
          <article-title>Scalable and Accurate Tree-based Detection of Code Clones</article-title>
          .
          <source>In Proceedings of the 29th International Conference on Software Engineering (ICSE‟07)</source>
          , pp.
          <fpage>96</fpage>
          -
          <lpage>105</lpage>
          , Minnesota, USA, May
          <year>2007</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref9">
        <mixed-citation>
          9.
          <string-name>
            <surname>Bruno</surname>
            <given-names>Lague</given-names>
          </string-name>
          , Daniel Proulx, Jean Mayrand, Ettore M.
          <article-title>Merlo and John Hudepohl. Assessing the Benefits of Incorporating Function Clone Detection in a Development Process</article-title>
          .
          <source>In Proceedings of the 13th International Conference on Software Maintenance (ICSM‟97)</source>
          , pp.
          <fpage>314</fpage>
          -
          <lpage>321</lpage>
          , Bari, Italy,
          <year>October 1997</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref10">
        <mixed-citation>
          10.
          <string-name>
            <surname>Ira</surname>
            <given-names>Baxter</given-names>
          </string-name>
          , Andrew Yahin, Leonardo Moura, Marcelo Sant Anna.
          <article-title>Clone Detection Using Abstract Syntax Trees</article-title>
          .
          <source>In Proceedings of the 14th International Conference on Software Maintenance (ICSM‟98)</source>
          , pp.
          <fpage>368</fpage>
          -
          <lpage>377</lpage>
          , Bethesda, Maryland,
          <year>November 1998</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref11">
        <mixed-citation>
          11.
          <string-name>
            <surname>Jean</surname>
            <given-names>Mayrand</given-names>
          </string-name>
          , Claude Leblanc,
          <string-name>
            <given-names>Ettore</given-names>
            <surname>Merlo</surname>
          </string-name>
          .
          <article-title>Experiment on the Automatic Detection of Function Clones in a Software System Using Metrics</article-title>
          .
          <source>In Proceedings of the 12th International Conference on Software Maintenance (ICSM‟96)</source>
          , pp.
          <fpage>244</fpage>
          -
          <lpage>253</lpage>
          , Monterey, CA, USA,
          <year>November 1996</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref12">
        <mixed-citation>
          12.
          <string-name>
            <surname>Cory</surname>
            <given-names>J.</given-names>
          </string-name>
          <string-name>
            <surname>Kapser</surname>
            and
            <given-names>Michael W.</given-names>
          </string-name>
          <string-name>
            <surname>Godfrey</surname>
          </string-name>
          .
          <source>Supporting the Analysis of Clones in Software Systems: A Case Study. Journal of Software Maintenance and Evolution: Research and Practice</source>
          , Vol.
          <volume>18</volume>
          (
          <issue>2</issue>
          ):
          <fpage>61</fpage>
          -
          <lpage>82</lpage>
          ,
          <year>March 2006</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref13">
        <mixed-citation>
          13. Filip Van Rysselberghe,
          <string-name>
            <given-names>Serge</given-names>
            <surname>Demeyer</surname>
          </string-name>
          .
          <article-title>Evaluating Clone Detection Techniques</article-title>
          .
          <source>In Proceedings of the International Workshop on Evolution of Large Scale Industrial Applications (ELISA‟03)</source>
          ,
          <year>12pp</year>
          ., Amsterdam, The Netherlands,
          <year>September 2003</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref14">
        <mixed-citation>
          14.
          <string-name>
            <given-names>J Howard</given-names>
            <surname>Johnson</surname>
          </string-name>
          .
          <article-title>Identifying Redundancy in Source Code Using Fingerprints</article-title>
          .
          <source>In Proceeding of the 1993 Conference of the Centre for Advanced Studies Conference (CASCON‟93)</source>
          , pp.
          <fpage>171</fpage>
          -
          <lpage>183</lpage>
          , Toronto, Canada,
          <year>October 1993</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref15">
        <mixed-citation>
          15.
          <string-name>
            <surname>Penny</surname>
            <given-names>Grubb</given-names>
          </string-name>
          , and
          <article-title>Armstrong A Takang</article-title>
          .
          <source>Software Maintenance Concepts and Practice. 2nd edn. World Scientific</source>
          (
          <year>2003</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref16">
        <mixed-citation>
          16. G. Antoniol,
          <string-name>
            <given-names>U.</given-names>
            <surname>Villano</surname>
          </string-name>
          , E. Merlo, and
          <string-name>
            <given-names>M.D.</given-names>
            <surname>Penta</surname>
          </string-name>
          .
          <article-title>Analyzing cloning evolution in the linux kernel</article-title>
          .
          <source>Information and Software Technology</source>
          ,
          <volume>44</volume>
          (
          <issue>13</issue>
          ):
          <fpage>755</fpage>
          -
          <lpage>765</lpage>
          ,
          <year>2002</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref17">
        <mixed-citation>
          17.
          <string-name>
            <surname>Brenda</surname>
            <given-names>S.</given-names>
          </string-name>
          <string-name>
            <surname>Baker</surname>
          </string-name>
          .
          <article-title>A Program for Identifying Duplicated Code</article-title>
          .
          <source>In Proceedings of Computing Science and Statistics: 24th Symposium on the Interface</source>
          , Vol.
          <volume>24</volume>
          :
          <issue>4957</issue>
          ,
          <string-name>
            <surname>March</surname>
          </string-name>
          <year>1992</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref18">
        <mixed-citation>
          18.
          <string-name>
            <surname>Stephane</surname>
            <given-names>Ducasse</given-names>
          </string-name>
          , Oscar Nierstrasz, and
          <string-name>
            <given-names>Matthias</given-names>
            <surname>Rieger</surname>
          </string-name>
          .
          <article-title>Lightweight detection of duplicated codea language-independent approach</article-title>
          .
          <source>Technical report</source>
          , University of Bern, Institute of Computer Science and Applied Mathematics, Bern, Switzerland,
          <year>February 2004</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref19">
        <mixed-citation>
          19.
          <string-name>
            <surname>Stephane</surname>
            <given-names>Ducasse</given-names>
          </string-name>
          , Matthias Rieger,
          <string-name>
            <given-names>Serge</given-names>
            <surname>Demeyer</surname>
          </string-name>
          .
          <article-title>A Language Independent Approach for Detecting Duplicated Code</article-title>
          .
          <source>In Proceedings of the 15th International Conference on Software Maintenance (ICSM'99)</source>
          , pp.
          <fpage>109</fpage>
          -
          <lpage>118</lpage>
          , Oxford, England,
          <year>September 1999</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref20">
        <mixed-citation>
          20.
          <string-name>
            <surname>Brenda</surname>
            <given-names>S.</given-names>
          </string-name>
          <string-name>
            <surname>Baker</surname>
          </string-name>
          .
          <article-title>On Finding Duplication in Strings and Software</article-title>
          .
          <source>Journal of Algorithms</source>
          ,
          <year>1993</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref21">
        <mixed-citation>
          21.
          <string-name>
            <surname>Zhenmin</surname>
            <given-names>Li</given-names>
          </string-name>
          ,
          <string-name>
            <given-names>Shan</given-names>
            <surname>Lu</surname>
          </string-name>
          , Suvda Myagmar,
          <string-name>
            <given-names>Yuanyuan</given-names>
            <surname>Zhou</surname>
          </string-name>
          .
          <article-title>CP-Miner: A Tool for Finding Copy-paste and Related Bugs in Operating System Code</article-title>
          .
          <source>In Proceedings of the 6th Symposium on Operating System Design and Implementation (OSDI‟04)</source>
          , pp.
          <fpage>289</fpage>
          -
          <lpage>302</lpage>
          , San Francisco, CA, USA,
          <year>December 2004</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref22">
        <mixed-citation>
          22.
          <string-name>
            <surname>Aoun</surname>
            <given-names>Raza</given-names>
          </string-name>
          , Gunther Vogel,
          <article-title>Erhard Pl¨odereder. Bauhaus-A Tool Suite for Program Analysis and Reverse Engineering</article-title>
          .
          <source>In Proceedings of the 11th Ada-Europe International Conference on Reliable Software Technologies, LNCS 4006</source>
          , pp.
          <fpage>71</fpage>
          -
          <lpage>82</lpage>
          , Porto, Portugal,
          <year>June 2006</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref23">
        <mixed-citation>
          23.
          <string-name>
            <given-names>Raghavan</given-names>
            <surname>Komondoor</surname>
          </string-name>
          and
          <string-name>
            <given-names>Susan</given-names>
            <surname>Horwitz</surname>
          </string-name>
          .
          <article-title>Using Slicing to Identify Duplication in Source Code</article-title>
          .
          <source>In Proceedings of the 8th International Symposium on Static Analysis (SAS‟01)</source>
          , Vol.
          <source>LNCS 2126</source>
          , pp.
          <fpage>40</fpage>
          -
          <lpage>56</lpage>
          , Paris, France,
          <year>July 2001</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref24">
        <mixed-citation>
          24.
          <string-name>
            <given-names>Raghavan</given-names>
            <surname>Komondoor</surname>
          </string-name>
          .
          <source>Automated Duplicated-Code Detection and Procedure Extraction. Ph.D. Thesis</source>
          ,
          <year>2003</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref25">
        <mixed-citation>
          25.
          <string-name>
            <surname>Keith</surname>
            <given-names>Gallagher</given-names>
          </string-name>
          ,
          <string-name>
            <given-names>Lucas</given-names>
            <surname>Layman</surname>
          </string-name>
          .
          <source>Are Decomposition Slices Clones? In Proceedings of the 11th IEEE International Workshop on Program Comprehension (IWPC‟03)</source>
          , pp.
          <fpage>251</fpage>
          -
          <lpage>256</lpage>
          Portland, Oregon, USA, May
          <year>2003</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref26">
        <mixed-citation>
          26.
          <string-name>
            <surname>W-K. Chen</surname>
            ,
            <given-names>B.</given-names>
          </string-name>
          <string-name>
            <surname>Li</surname>
            , and
            <given-names>R.</given-names>
          </string-name>
          <string-name>
            <surname>Gupta</surname>
          </string-name>
          .
          <article-title>Code Compaction of Matching Single-Entry MultipleExit Regions</article-title>
          .
          <source>In Proceedings of the 10th Annual International Static Analysis Symposium ( SAS‟03 )</source>
          , pp.
          <fpage>401</fpage>
          -
          <lpage>417</lpage>
          , San Diego, CA, USA,
          <year>June 2003</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref27">
        <mixed-citation>
          27.
          <string-name>
            <surname>J.-F. Patenaude</surname>
            , E. Merlo,
            <given-names>M.</given-names>
          </string-name>
          <string-name>
            <surname>Dagenais</surname>
            , and
            <given-names>B.</given-names>
          </string-name>
          <string-name>
            <surname>Lague</surname>
          </string-name>
          .
          <article-title>Extending software quality assessment techniques to java systems</article-title>
          .
          <source>In Proceedings of the 7th International Workshop on Program Comprehension (IWPC‟99)</source>
          , pp.
          <fpage>4956</fpage>
          ,
          <string-name>
            <surname>Pittsburgh</surname>
          </string-name>
          , PA, USA, May
          <year>1999</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref28">
        <mixed-citation>
          28.
          <string-name>
            <surname>Raheja</surname>
            <given-names>K.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Tekchandani</surname>
            <given-names>R.</given-names>
          </string-name>
          ,
          <source>“An Emerging Approach towards Code Clone Detection: Metric Based Approach on Byte Code”</source>
          ,
          <source>International Journal of Advanced Research in Computer Science and Software Engineering</source>
          , vol.
          <volume>3</volume>
          , issue 5, May,
          <year>2013</year>
          .
        </mixed-citation>
      </ref>
    </ref-list>
  </back>
</article>