Bu sitede bulunan yazılar memnuniyetsizliğiniz halınde olursa bizimle iletişime geçiniz ve o yazıyı biz siliriz. saygılarımızla

    programlama hatalarını bulma ve düzeltme işlemine ne denir

    1 ziyaretçi

    programlama hatalarını bulma ve düzeltme işlemine ne denir Ne90'dan bulabilirsiniz

    Programlama hatalarını bulma ve düzeltme işlemine ne denir? A- Hata ayıklama B-Problem çözme C-Anal.... Idea question from @Nisaergul

    Hata ayıklama da denilen programlama hatalarını bulma ve düzelme işlemine ne denir? a) Veri b) Yazılım c) Bug d) Debugging e) Donanım.

    ... konulu sunumlar: "Hata ayıklama da denilen programlama hatalarını bulma ve düzelme işlemine ne denir? a) Veri b) Yazılım c) Bug d) Debugging e) Donanım."— Sunum transkripti:

    1 Hata ayıklama da denilen programlama hatalarını bulma ve düzelme işlemine ne denir? a) Veri b) Yazılım c) Bug d) Debugging e) Donanım

    2 Programcıların programlamada yaptıkları hatalara ne denir
    Programcıların programlamada yaptıkları hatalara ne denir? a) Data b) Bug c) Yazılım d) Runtime e) Time Freeze

    3 Hangisi bir işletim sistemi değildir a) Windows-7 b) MacOS c) Pardus d) Linux e) Mozilla Firefox

    4 Bilgisayarın fiziksel parçalarına ne denir
    Bilgisayarın fiziksel parçalarına ne denir? a) Veri b) Yazılım c) Bug d) Runtime e) Donanım

    5 Doğruluğu kanıtlanmamış bilgiye ne ad verilir
    Doğruluğu kanıtlanmamış bilgiye ne ad verilir? a) Veri b) Hata c) Bug d) Debugging e) Sanal Dünya

    6 İnsanoğlunun tasarlayarak ürettiği yada uygulamaya koyduğu faydalı veya faydasız her türlü alet ve araçlara ne denir? a) Bilişim Teknolojisi b) İşletim Sistemi c) İnternet Teknolojisi d) Teknoloji e) Sistem Yöneticisi

    7 Bilginin üretilip insanların hizmetine sunulana kadar geçen süreçte kullanılan her türlü teknolojiye ne denir? a) Veri Madenciliği b) İşletim Sistemi c) Bilişim Teknolojisi d) Yazılım Mimarisi e) Sistem Yöneticisi

    8 Kullanıcıdan aldığı veriler üzerinde hızlı bir biçimde aritmetiksel ve mantıksal işlemler yapabilen, yaptığı işlemlerin sonucunu saklayabilen; sakladığı verilere istenildiğinde tekrar ulaşılabilmesine imkân sağlayan elektronik alet hangisidir? a) Bilgisayar b) İşlemci c) Donanım d) Ram e) Anakart

    9 Aşağıdakilerden hangisi üniversite ve akademik kuruluşların siteleri için kullanılan site uzantısıdır? a) net b) com c) edu d) k12 e) info

    10 Bireylerin ahlaklı ve erdemli bir hayat yaşayabilmesi için hangi davranışlarının doğru, hangilerinin yanlış olduğunu araştıran felsefe dalına ne ad verilir? a) Veri b) Güvenlik c) Edep d) Etik e) Data

    11 Bir problemin çözümünde izlenecek yol anlamına gelir ve problemin çözümünün adımlar halinde yazılmasıyla oluşturulur. a) Algoritma b) Problem c) Programlama d) Runtime e) İşlem Birimi

    12 Çözülmesi gereken sorun ya da aşılması gereken engele ne ad verilir
    Çözülmesi gereken sorun ya da aşılması gereken engele ne ad verilir? a) Algoritma b) Problem c) Programlama d) Runtime e) İşlem Birimi

    13 Çeşitli görevleri gerçekleştirmek amacıyla hazırlamış programlara ne denir?
    Donanım Yazılım Sabit Disk İşletim Sistemi Uygulama Yazılımı

    14 Kendi kendine çoğalan ve çalışabilen, bulaşmak için ağ bağlantılarını kullanan kötü niyetli programlara ne ad verilir? a) Debugging b) Hacker c) Virüs d) Trojan e) Bilgisayar Solucanı

    15 Bulaştıkları bilgisayar sisteminde çalışarak sisteme ya da programlara zarar vermek amacıyla oluşturulan zararlı yazılımlara ne ad verilir? a) Bug b) Hack c) Virüs d) Trojan e) Solucan

    16 Güçlü bir parola için aşağıdakilerden hangisi doğru bir kriter değildir? a) Parola, büyük/küçük harfler ile noktalama işaretleri ve özel karakterler içermelidir. b) Parola, -aksi belirtilmedikçe- en az sekiz karakter uzunluğunda olmalıdır. c) Parola, başkaları tarafından tahmin edilebilecek ardışık harfler ya da sayılar içermemelidir. d) Her parola için bir kullanım ömrü belirleyerek belirli aralıklar ile yeni parola oluşturulması gerekir. e) Ardışık karakterlerden oluşmalıdır.

    17 Bilgi ve iletişim teknolojilerini kullanarak bir birey ya da gruba, özel ya da tüzel bir kişiliğe karşı yapılan teknik ya da ilişkisel tarzda zarar verme davranışlarının tümüne ne denir? Siber Terörizm Siber Savaş Debugging Siber Zorbalık Siber saldırı

    18 Farklı bir ülkenin bilgi sistemlerine veya iletişim altyapılarına yapılan planlı ve koordineli saldırılara ne ad verilir? Siber Terörizm Siber Savaş Debugging Hack Siber saldırı

    19 Hedef seçilen şahıs, şirket, kurum, örgüt gibi yapıların bilgi sistemlerine veya iletişim altyapılarına yapılan planlı ve koordineli saldırıya ne ad verilir? Siber Terörizm Siber Savaş Debugging Hack Siber saldırı

    20 Bilişim teknolojileri kullanılarak gerçekleştirilen her tür yasa dışı işleme ne nedir?
    Bilişim suçu Siber Terörizm Siber Savaş Bug Hiçbiri

    Yazı kaynağı : slideplayer.biz.tr

    Hata Ayıklama Nedir?

    Hata Bulma ve Düzeltme teknikleri

    Elektronik ortamda veri aktarımları her zaman ideal şekilde gerçekleşmez. Elektronik cihazlar ve kablolar bir çok çevresel faktöre bağımlıdır. Cihazlar arası ve cihaz içi haberleşmelerde veri iletimi sırasında veri bitlerinde bozulmalar meydana gelebilir. Bu veri bitleri günümüzde hata olarak algılanıp belirli bir düzeye kadar düzeltilebilmektedir. Bu yazımızda bu veri bitlerinin hangi yöntemlerle algılanıp düzeltilebildiğini inceleyeceğiz.

    Veri alışverişi sırasında alıcı ve verici arasında gönderilen bitlerde bazen bozulmalar yaşanır. Bunlar ilk olarak hata algılama (error detection) dediğimiz tekniklerle belirlenir. Burada her hangi bir düzeltme işleminden bahsetmediğime dikkat edin. Sadece hatanın oluştuğunu ve verinin doğru şekilde iletilmediğini biliyorum. Bu durumda iki seçenek var. Alıcı vericiye bir mesaj iletir ve verinin yeniden gelmesini sağlar ki bu verinin orjinal hali gelene kadar sürecektir. Diğeri ise alıcı bu mesajı kendi bildiği teknik ve kod ile çözümleyerek hangi bitin hatalı olduğunu tesbit eder ve düzeltir. Burada kendi bildiği teknik ve kod aynı zamanda vericininde uyguladığı teknik ve kod ile aynı olmalıdır. Yani bu işlem karşılıklı veri kodlama tekniğidir.

    Buraya kadar hangi sonuçlara vardık bir göz gezdirelim.

    Hata algılama (Error detection) : Alıcıya gönderilen verinin gürültü ve diğer faktörlerin neden olduğu bozulmaların algılanması işlemidir.

    Hata düzeltme (Error correction) : Alıcının gönderilen verideki oluşan bozulmaları gidererek orjinal veriyi elde etmesi işlemidir.

    Uygulanan Yöntemler

    Parity Biti (kaynak)
    Eşitlik biti kullanarak hata algılama yöntemi en basit yöntemlerden biridir. Her bir byte için eşitlik bitinide hesaba katarak tek veya çift sayıda 1 değerini sayma işlemidir. Eğer sayımız teklik yada çiftlik durumunda bizim belirlediğimiz duruma uyuyorsa bu verinin hatasız geldiğini kabul ediyoruz. Burada bir noktaya dikkat çekmek istiyorum. Parity yöntemi 2 bit üzerinde oluşan hataları algılamayabilir. 110011110 (6) çift parity için gelen verim 111001110 (6) olsun. Verideki bozulmayı görebiliyoruz. Ancak veri bitlerim yine çift sayıda 1 içerdiği için her hangi bir hata algılanmayacaktır. Bu nedenle parity uygulamasi tek başına çok güvenli değil. Aynı zamanda hatayı algılasak bile düzeltmek için elimizde her hangi bir olanak yoktur.

    Checksum
    Bu yöntem verimizin codeword uzunluğunun sağlamasını yapar. Verimizin içeriğinden yararlanarak bir hesaplama yaparız ve bu sonucu paket verimizin içine ekleriz. Karşı taraf bunu veri paketini alıp içerik kısmında kontrol yapar ve checksum kodumuzla eşleşip eşleşmediğine bakar.

    Hamming Kodlama (kaynak)

    Hamming kodlama tekniği hataları bulduğu gibi mümkün olan hata düzeltme boyutunda hataları düzeltme imkanıda sağlamaktadır. Bunun için her bir code word dediğimiz iletilen veri için birden fazla eşitlik biti uygulaması yapılmaktadır. Eşitlik denetimlerine ilişkin ilave veri bitleride code wordlerimizle birlikte karşı tarafa iletilmektedir. İlk olarak veri bitleri arası uzaklık kavramına değinelim.

    Gönderebileceğimiz mümkün 4 veri kodumuz olsun.

    a)00000
    b)11100
    c)00111
    d)11011

    Bu 4 veri kodu içerisinde birbirlerine olan uzaklıklara bakalım. a ile b arası 3 bit uzaklık vardır. Uzaklıktan kastımız farklı olan bitlerdir. Bu 4 bit arasında minimum uzaklığın 3 bit olduğunu tespit edebiliriz.

    Buradan düzeltilebilecek hatalı bit sayısını hesaplamak için aşağı yuvarlayacak şekilde (floor) [(min — 1)/2] formulu uygulanır. Algılanabilecek max-hata sayısı ise direkt olarak min-1 dir.

    Şimdi basit bir örnek ile hamming kodlamasının nasıl gerçekleştiğine gözatalım.

    D3 D5 D6 D7 = 1 0 1 0 veri bitlerimiz olsun. Gönderen taraf parity bitlerini çift duruma göre hesaplıyor.

    !! + işareti ex OR a karşılık düşüyor!!
    P1 = D3+D5+D7 = 1+0+0 = 1
    P2 = D3+D6+D7 = 1+1+0 = 0
    P4 = D5+D6+D7 = 0+1+0 = 1

    Parity bitlerimiz her bir 3 lü için hesaplanmıştır. Gönderilecek veri kodu — P1P2D3P4D5D6D7 yani ((1011010))

    Veriyi alan taraf gelen veriden kontrol bitlerini hesaplar. Eğer tüm kontrol bitleri 0 çıkar ise verimizde her hangi bir hata olmamıştır. Yada algılanabilecek bir hata boyutunun dışına çıkmıştır.

    !! + işareti ex OR a karşılık düşüyor!!
    C1 = P1+D3+D5+D7 = 1+1+0+0 = 0
    C2 = P2+D3+D6+D7 = 0+1+1+0 = 0
    C3 = P4+D5+D6+D7 = 1+0+1+0 = 0

    C1C2C3 = 000 olduğu için her hangi bir hata bulamadık. Eğer 010 olsaydı buradan parity 2 bitimizin bozulduğu kanısına varabiliriz. Yada 110 olsaydı buradan D3 bitinin bozulduğu kanısına varabiliriz.

    Burada bir kaç bilgi vermek gerekli. Hamming kodlamada parity bitlerinin hangi basamakta olacağı 2^n şeklinde belirleniyor.Yani 4 parity varsa bunlar 2⁰ = 1, 2¹ = 2, 2² = 4, 2³ = 8 inci bitlerde olmak üzere konumlanacaktır. Bu boyle devam etmektedir. 16 32 diyerek.

    CRC(Cyclic redundancy check) [kaynak]

    CRC yöntemi veri bloklarındaki hataları algılamak için kullandığımız başka bir tekniktir. Bu teknik seri haberleşmede hata algılamak için yaygın olarak kullanılır. Checksum yönteminin aksine burada karakter bazlı bir kontrol söz konusu değildir. Veri bloğunu bir dizi olarak ele alır ve değerlendirir. 2 bitten fazla sayıdaki bozulmaları algılar. Yöntem temel olarak bir kod üretip bunu verinin sonuna ekler ve karşıya iletir. Her iki tarafın bildiği bir kod ile bu veri bölme işlemine tabi tutularak kontrol edilir. Kalan var ise bitlerde hata oluşmuş demektir. Şimdi ne demek istediğimi bir örnek ile anlatalım.

    CRC-4 ile kodlanmış bir verinin kontrolünü yapalım. CRC-4 demek 4 bit uzunluğunda bir veri kodu oluşturacağımı belirtir. Bölen değerim = 10011 olduğunu farzedelim. 5 bitlik bir bölen değerim var. Bu değer alıcı ve verici tarafından bilinmektedir.

    Verimiz = 11000110101101 Gönderilmek isteniyor.

    Verimizin sonuna 4 bit sıfır ekliyoruz. (CRC-4ten dolayı) 110001101011010000 Daha sonra 10011 ile bölme işlemi yapıyoruz. (Nasıl mı ?)

    Bölme işleminden bize kalan 01001 dir. Bu kod bizim CRC-4 kodumuz ve verimizin son 4 bitine ekliyoruz. Yani karşıya iletilecek verimiz artık 110001101011011001 oldu. Turuncu kısmın CRC-4 Kodu diğer kısmın veri bitleri olduğuna dikkat edelim. Karşı taraf bu veriyi aldığında yapacağı işlem bölme işlemidir. Böleni biliyor 10011. Verimizi biliyor. Bölme işleminde bize kalan 0 ise verimiz doğru iletilmiştir hayır değil ise verimizde bir hata vardır yeniden gönderilmelidir.

    Genel olarak hata algılama ve düzeltme tekniklerinden bahsettik. Bunlarla ilgili örneklendirme yaparak işlevlerini daha iyi anlayabilirsiniz. İyi çalışmalar.

    Yazı kaynağı : yazilimportal.com

    Bilgisayar Bilimi Ünite 2 / Tanımlar

    Hata bulma ve düzeltme

    Hata Ayıklama ve Ayrıntılı İnceleme

    Hata Ayıklama ve Ayrıntılı İnceleme

    Yazılım geliştirmenin altın kurallarından birisi yazdığınız programın sizin beklentinize göre değil programa yapacağı işi nasıl tarif ettiğinize göre çalışacağıdır. Bu dersimizde, hata barındıran ve beklediğimizden fazla kaynak tüketen programlarda hata ayıklama ve ayrıntılı inceleme için kullanacağımız faydalı yöntemleri inceleyeceğiz.

    Hata ayıklama (Debugging)

    Printf ile hata ayıklama ve loglama

    “En etkili hata ayıklama aracı dikkatli düşünce ve akıllıca kullanılmış print cümlecikleridir.” — Brian Kernighan, Unix for Beginners.

    Bir programda hata ayıklama için kullanılan ilk yöntem hatanın tespit edildiği kod bloklarının etrafına yerleştirilen print cümlecikleridir. Hata ile ilgili yeterince bilgi sahibi olana kadar print cümleciklerini ekleme işlemi yinelenir.

    İkinci yöntem ise print cümlecikleri yerine programınızda loglama yaklaşımını kullanmaktır. Loglama, birkaç sebeple print cümleciklerinden daha iyi bir yöntemdir:

    Mesajları loglayan örnek bir program kodunu şu Python dosyasından inceleyebilirsiniz:

    Log mesajlarını daha okunabilir hale getirmek için favori yöntemlerinden birisi logları renkler kullanarak kodlamaktır. Şu ana kadar terminalinizin bazı şeyleri daha okunaklı hale getirmek için renkleri kullandığının farkına varmışsınızdır. Pekiyi, terminal bunu nasıl yapar? ls veya grep gibi programlarANSI escape codes adı verilen özel karakter dizilimlerini kullanır. Bu karakter dizilimleri komut satırınıza çıktıları nasıl renklendirmesi gerektiğini söyler. Örneğin, echo -e "\e[38;2;255;0;0mBu satır kırmızı renktedir\e[0m" komutunu çalıştırdığınızda terminalinizde kırmızı renkli olarak Bu satır kırmızı renktedir mesajını yazacaktır. Aşağıdaki örnek script çoğu RGB kodlu rengin nasıl yazdırılabileceğini gösterir.

    3. parti program logları

    Daha kapsamlı programlar geliştirmeye başladıkça bu programların farklı programlara bağımlılıkları oluşmaya başlayacaktır. Web sunucuları, veritabanları veya mesajlaşma programları bu tür bağımlılıklar için tipik örneklerdir. Bu tür programlar ile etkileşim halinde zaman zaman bu programların loglarını da incelemeniz gerekecektir, sadece kendi programınızın logları bazı durumlarda yetersiz kalacaktır.

    Çoğu program kendi loglarını sistemlerinizde bir konuma yazarlar. UNIX ve benzeri sistemlerde bu logları /var/log dizinine yazmak genel geçer bir yöntemdir. Örneğin, NGINX web sunucusu loglarını /var/log/nginx dizinine yazar. Çoğu Linux sistem kurulu servisleri veya çalışan servisler gibi pek çok işlemi kontrol etmek için systemd adı verilen özel bir hayalet program (daemon) kullanır. systemd log çıktılarını /var/log/journal dizini içine özel bir formatta yazar. systemd loglarını incelemek için journalctl komutunu kullanabilirsiniz. Benzer şekilde macOS’da da /var/log/system.log dosyası yer alır ancak gün geçtikçe daha fazla sayıda program loglarını bu konuma değil sistemin kendi loguna yazar. macOS’da system.log içeriğini log show komutu ile görüntüleyebilirsiniz. Çoğu UNIX sistemde dmesg komutu ile işletim sisteminin kernel loglarını görüntüleyebilirsiniz.

    Sistemin kendi loguna yazmak için logger adı verilen komut satırı programını kullanabilirsiniz. Aşağıdaki örnekte logger kullanılarak sistem loguna yazma ve sistem logundan görüntüleme işlemlerinin nasıl yapılabileceğini görebilirsiniz. Çoğu programlama dili bindingler aracılığı ile sistem loguna erişim ve kullanım imkanı sunar.

    Veri işleme dersimizde de gördüğünüz üzere log mesajları büyük miktarda ve zengin içeriğe sahip oldukları için log mesajlarından faydalı bilgileri ayıklamak için bu mesajları işlemek ve filtrelemek gerekecektir. Eğer yoğun olarak journalctl ve log show ile log mesajlarını inceliyorsanız bu komutların flaglerini kullanarak ilk aşama filtreleme işlemlerini rahatlıkla yapabilirsiniz. Bununla birlikte gelişmiş log gösterim ve log dosyalarına konumlama özellikleri sunan lnav gibi araçları da kullanabilirsiniz.

    Hata ayıklayıcılar (Debuggers)

    printf cümlecikleri ile yapacağınız hata ayıklama işlemleri ihtiyacınızı karşılamıyorsa hata ayıklayıcı (debugger) adı verilen özel programları kullanmalısınız. Hata ayıklayıcılar programınız ile çalışma anında etkileşime geçmenizi sağlarlar. Bu sayede:

    Çoğu programlama dili ve ortamının kendi hata ayıklayıcısı vardır. Python için bu hata ayıklayıcı pdb komutu ile kullanabileceğiniz Python Debugger’dır.

    Aşağıda pdb‘nin desteklediği bazı komutlar yer almaktadır:

    Gelin şimdi pdb kullanarak aşağıdaki hatalı Python kodunu düzeltelim. (Ders videosuna bakınız).

    Python yorumlanan bir dil olduğu için komut satırından pdb‘yi kullanarak komutları ve kod parçalarını çalıştırabiliriz. pdb‘ye alternatif olarak IPython REPL ortamını kullanan ipdb‘yi de kullanabilirsiniz. ipdb cümle tamamlama, kod renklendirme, daha iyi yığın izleme ve daha iyi gözlemleme gibi imkanları pdb ile benzer bir ara yüz sağlayarak kullanabilmemizi sağlar.

    Daha alt seviyede programlama işlemleri için gdb ( gdb kullanımını kolaylaştıran pwndbg eklentisini de kullanabilirsiniz) ve lldb gibi araçları kullanabilirsiniz. Bu araçlar C benzeri dillerdeki hata ayıklama işlemleri için optimize edilmişlerdir ve aşağı yukarı yukarıda ele aldığımız iş akışını kullanarak program değişkenlerini görüntülemenizi sağlarlar.

    Özelleşmiş Araçlar

    Kendi geliştirmediğiniz ve derlenmiş bir programda hata ayıklama yapmanız gerektiğinde bu işlem için de özelleşmiş araçlar vardır. Programlar sadece işletim sistemi kernelinin yapabileceği işlemleri yapabilmek için Sistem çağrıları (System Calls) adı verilen komutları kullanırlar. Bu sistem çağırılarını Linux üzerinde strace, macOS ve BSD üzerinde isedtrace gibi araçlar ile yakalayıp inceleyebilirsiniz. dtrace, kendi dili olan D dilini kullandığı için kullanımı biraz zor olabilir. dtrace‘i kullanan ancak strace‘e benzer ara yüz sağlayan dtruss macOS ve BSD üzerinde size daha rahat bir kullanım sağlayacaktır (daha fazla ayrıntı için şu linkteki içeriği inceleyebilirsiniz).

    Aşağıdaki örnekte ls komutunun kullandığı stat sistem çağrısının izini sürmek için strace ve dtruss araçlarının kullanımını görebilirsiniz. strace hakkında daha ayrıntılı bilgi sahibi olmak için şu linkteki içeriği okumanızı tavsiye ediyorum.

    Programınızdaki bazı sorunları tespit etmek için programın ağ üzerinden alıp verdiği paketleri incelemeniz gerekebilir. Bu durumda tcpdump ve Wireshark gibi paket analizi araçlarını kullanarak ağ paketi içerikleri inceleyebilir ve çeşitili kriterlere göre filtreleyebilirsiniz.

    Web geliştiricileri için Chrome ve Firefox tarayıcılarının geliştirici araçları oldukça kullanışlıdır. Bu araçlardan bazıları şunlardır:

    Statik Kod Analizi

    Bazı hataları incelemek için herhangi bir kod çalıştırmanıza gerek yoktur. Örneğin, sadece yazılan kodu okuyarak bir döngünün sayaç değişkeninin dış bağlamdaki aynı isimli bir değişkeni gölgelediğini (döngünün dışındaki bağlamda yer alan değişkenin değerini bozma durumu) anlayabilirsiniz. Benzer şekilde sadece koda bakarak henüz tanımlanmamış bir değişkenin kullanılmaya çalışıldığını görebilirsiniz. Bu tür durumlarda statik kod analizi araçlarını kullanabilirsiniz. Statik kod analizi araçları kaynak kodunuzu girdi olarak alıp tanımlı kuralları kodunuza uygulayarak kodun doğruluğunu çıkarsamaya çalışırlar.

    Aşağıdaki Python kod parçasında birkaç hata var. İlk olarak foo isimli döngü sayaç değişkeni daha yukarıda tanımlanmış olan foo fonksiyonunu maskelemektedir. Ayrıca son satırda değişken olarak bar yerine baz isimli değişken kullanılmaya çalışılmış. Örnek kod parçası sleep çağrısı tamamlandıktan sonra (program çalıştırıldıktan aşağı yukarı 1 dakika sonra) hatalı bir şekilde sonlanır.

    Statik kod analizi araçları yukarıdakine benzer kod hatalarını tespit edebilirler. Yukarıdaki örnek kod parçasını pyflakes‘e verdiğimizde her iki hatanın da tespit edileceğini görürsünüz. Aynı kod parçasını mypy isimli tip kontrolü analizi yapan araca girdi olarak verdiğimizde bar değişkenin ilk anda tipinin int olduğunu ancak sonradan float tipine dönüştürüldüğü tespit edecektir. Tekrar etmek gerekirse, bu sorunları kod çalıştırmadan statik kod analizi araçları kullanarak tespit ettik.

    Komut satırı araçları dersimizde benzer statik analizi yapmamızı sağlayan shellcheck aracını ele almıştık.

    Çoğu entegre yazılım geliştirme (IDE) ortamı bu araçların çıktılarını gösterme ve ilgili kod satırlarına konumlanma desteği sunar. Bu yönteme genelde code linting denir ve kod yazım stili ve güvenlik gibi denetimler için de kullanılan bir yöntemdir.

    Vim kullanıyorsanız ale veya syntastic eklentileri ile benzer denetimlerin yapılmasını sağlayabilirsiniz. Python için pylint ve pep8 araçlarını kod yazımı stili denetimi için, bandit‘i ise yaygın güvenlik problemleri denetimi için kullanabilirsiniz. Diğer programlama dilleri için kullanabileceğiniz statik kod analizi araçlarının listesine Awesome Static Analysis sayfasından, linter araçları listesine de Awesome Linters sayfasından göz atabilirsiniz.

    Kod stili denetlemesi yapan araçları bütünleyici araçlar olarak kod formatlama araçları da kullanılır. Python için black, Go için gofmt, Rust için rustfmt ve JavaScript, HTML ve CSS için prettier bu araçlardan bazılarıdır. Bu araçlar kodunuzu ilgili programlama dili için tanımlı genel geçer yazım stili kurallarını kullanarak otomatik olarak formatlarlar. Kod stiliniz ile ilgili denetimleri bu araçların kontrolüne bırakmak istemiyor olabilirsiniz. Ancak, diğer yazılımcıların sizin kodunuzu daha rahata okuması, aynı zamanda da sizin diğerlerinin kodunu daha rahat okuyabilmeniz için kod stili standartlarının kullanımı önemlidir.

    Ayrıntılı İnceleme (Profiling)

    Kodunuz beklediğiniz gibi çalışıyor olsa bile, eğer kodunuz gereğinden fazla CPU veya bellek kullanıyorsa programınız yeterince iyi kodlanmamış demektir. Algoritma derslerinde genelde big O notasyonu öğretilir, ancak bu derslerde kötü performansa neden olan kod parçalarını nasıl tespit edebileceğiniz öğretilmez. Yazılımcılar arasında “vakitsiz optimizasyon tüm kötülüklerin anasıdır” (premature optimization is the root of all evil) şeklinde bir söylem vardır. Bu söylem performans optimizasyonun doğru anda yapılmasının değerini ifade eder, bu nedele programlarınızın çalışma anındaki performans karakteristiklerini ayrıntılı inceleme için faydalanabileceğini araçların (profiling ve monitoring araçları) kullanımı hakkında fikriniz olmalı. Bu araçlar sayesinde programlarınızın hangi kısımlarının en çok zaman ve kaynak harcadığını tespit ederek doğru anda nokta atışı optimizasyon çalışmaları ile program davranışını ideale yaklaştırabilirsiniz.

    Zamanlama

    İki kod satırı arasında programınızın programınızın harcadığı zamanı, hata ayıklama işleminde olduğu gibi, sadece print cümlecikleri ve zamanlayıcıları kullanarak tespit edebilirsiniz. Aşağıdaki Python kod örneğinde time modülü ile bu işlemin nasıl yapılabileceğini görebilirsiniz.

    Ancak, duvar saati ile yapılan yukarıdakine benzer bir zamanlama ölçümü sizi yanıltabilir. Çünkü, bilgisayarınız sadece sizin programınızı değil diğer programları da aynı anda çalıştırmaktadır veya bir olayın olmasını bekliyor olabilir. Bu nedenle, zamanlama ölçmek için kullanılan araçlar Gerçek (Real), Kullanıcı (User) ve Sistem (Sys)zamanları şeklinde üç kırılıma sahiptirler. Genel anlamda, Kullanıcı + Sistem zamanlarının toplamı programınızın gerçekte kullandığı CPU zamanını verirler. Daha fazla bilgi için şu linki inceleyebilirsiniz.

    Örneğin, time modülü kullanarak ağ üzerinden HTTP ile veri alan bir kod parçasının zamanlamasını incelediğimizde yavaş bir ağ bağlantısına sahipesiniz aşağıdaki gibi bir durum ile karşılaşırsınız. Bu durumda HTTP üzerinden yapılan talebin 2 saniyede tamamlandığını ancak programın sadece 15 milisaniye seviyesinde CPU Kullanıcı zamanı ve 12 milisaniye seviyesinde CPU Sistem zamanı harcadığını görürüz.

    Ayrıntılı İnceleme Araçları (Profilers)

    Merkezi İşlem Birimi (CPU)

    Ayrıntılı inceleme araçlarından bahsedilirken genelde CPU kullanımı ile ilgili inceleme yapmamızı sağlayan araçlar kastedilir. CPU kullanımını incelememizi sağlayan araçlar en sık rastladığımız ayrıntılı inceleme araçlarıdır. İki tür CPU inceleme aracı vardır: takip (tracing) ve örneklem (sampling) inceleme araçları. Takip tipindeki araçlar kodunuzun içindeki tüm fonksiyon çağırılarını izlenmesini ve takip edilmesini sağlarken örneklem tipindeki araçlar belirli aralıklarla (genelde her milisaniyede bir defa) programınıza göz atarak programınızın yığınını (stack) kayıt altına alırlar. Örneklem tipindeki araçlar topladıkları örneklemler üzerinde bir takım istatistikler yöntemler uygulayarak programınızın en çok hangi işlemlerde zaman harcadığını size raporlarlar. Bu konu hakkında daha ayrıntılı bilgi sahibi olmak isterseniz şu linkten erişebileceğiniz giriş seviyesindeki kaynaktan faydalanabilirsiniz.

    Çoğu programlama dili komut satırından kullanabileceğiniz CPU inceleme araçları ile birlikte gelir. Bu araçlar çoğu zaman entegre geliştirme ortamları (IDE) ile de çalışır, ancak bir bu dersimizde komut satırı araçlarını kullanacağız.

    Python için fonksiyon çağırıları için harcanan zamanı cProfile modülünü kullanarak ayrıntılı bir şekilde inceleyebiliriz. Aşağıda, bir dosya içinde grep benzeri bir yöntem ile arama yapan örnek bir Python kodu yer almaktadır.

    Yukarıdaki örnek programı aşağıda verilen komut ile ayrıntılı olarak inceleyebiliriz. İnceleme sonucuna baktığımızda en çok CPU zamanı harcayan işlemlerin I/O işlemleri ve regex işlemlerinin olduğunu görüyoruz. regex ifadelerini bir defa derleyip kod akışında derlenmiş ifadeyi kullanmak mümkün olduğu için re.compile() satırını döngü bloğundan çıkararak kodun zaman performansı açısından daha verimli hale getirebiliriz.

    Python ile hazır gelen cProfile modülünün ve diğer bir çok CPU incelemesi için kullanılan araçların temel sorunu zaman ölçümünü fonksiyon çağrısı bazında yapmalarıdır. Bu yöntem, özellikle 3. parti kütüphaneler kullanıyorsanız çok hızlı bir yöntemdir. Çünkü, bu yöntem ile bu kütüphanelerin içindeki fonksiyonlar da zaman ölçümüne dahil edilir.

    Ayrıntılı inceleme verisini göstermek için satır bazında harcanan zamanın gösterilmesi daha uygun ve anlaşılır bir yöntemdir. Bu yöntemi kullanan inceleme araçların satır bazlı incelem araçları denir.

    Örneğin, aşağıdaki Python kod parçası ders sitemizin içeriğini indirip, bu içerik içindeki tüm linkleri ayıklar.

    Eğer, Python ile hazır gelen cProfile‘ı kullansaydık inceleme çıktısı olarak 2500 satırlık bir sonuç ile karşılaşacaktık. 2500 satırlık bu sonucu satır satır sıralayıp incelemek bir zahmetli olacaktır. Bunun yerine aynı kod örneğini line_profiler aracını kullanarak çalıştırdığımızda fonksiyon içindeki her bir satır için aşağıdakine benzer bir çıktı elde ederiz.

    Bellek (Memory)

    C ve C++ gibi dillerde programlarınızda bellek sızıntısı (memory leak) oluşabilir ve bu durumda programınız işletim sisteminden aldığı belleği ihtiyacı olmadığı halde çalıştığı süre boyunca kendinde tutabilir. Bu tip durumları ayrıntılı bir şekilde incelemek için Valgrind benzeri bellek sızıntısı tespitinde size yardımcı olabilecek araçları kullanabilirsiniz.

    Python gibi ihtiyaç duyduğu belleği doğrudan işletim sisteminden değil de sanal makina benzeri bir yapı sunan kendi özgü çalışma ortamı olan diller için de bellek sızıntıları nadir de olsa karşılaşılan durumlardır. Bu tür dillere garbage collected diller denir ve bu dillerde yazdığımız kodun kullandığı bellek tüm bellek referansları geçersiz hale gelince garbage collector tarafından otomatik olarak geri alınır. Bu tür dillerde de nesnelere referans vermek için kullanılan işaretçiler nedeniyle bellek sızıntısının meydana gelebilir. Aşağıda, memory-profiler (@profile direktifini bu araçla da kullandığımıza dikkat edin) kullanarak bellek incelemesi yapılan bir Python programının çıktısı yer almaktadır.

    Olay Ayrıntı İncelemesi (Event Profling)

    Hata ayıklama için kullandığımız strace de olduğu gibi ayrıntılı inceleme yapmak istediğiniz kodu bir kara kutu olarak görmek isteyebilirsiniz. Bu durumda perf komutunu kullanabilirsiniz. perf komutu CPU mimarileri arasındaki farklar soyutlama ile ortadan kaldırıp zaman ve bellek kullanımı ölçmek yerine sistem olaylarını ve ilişkili aktiviteleri bize raporlar. Örneğin, perf komutu düşük cache yerelliği (cache locality) sorunlarını veya yüksek miktarda sayfa hatalarını (page fault) ve ortak kaynak kullanımını senkronize etmek için kullanılan kilit sorunlarını (livelock) kolayca raporlayabilir.

    Aşağıda perf komutunun kullanımı ile ilgili özet verilmiştir:

    Görselleştirme

    Gerçek dünyada olay inceleme araçları programların çok karmaşık olması nedeni ile büyük miktarda bilgi üretecektir. İnsanlar görsel canlılardır ve büyük miktardaki veriyi ve sayıyı yorumlamakta, anlamakta ve bir sonuç çıkarmakta güçlük çekerler. Bu nedenle olay inceleme araçlarının çıktılarını daha kolay anlaşılabilir hale getiren bir çok yardımcı araç vardır.

    Örneklem (sampling) tipindeki ayrıntı inceleme araçlarının çıktılarını incelemek için kullanılan görselleştirme yöntemlerinden bir tanesi Flame Graph adı verilen yöntemdir. Bu yöntemde fonksiyon çağırıları Y ekseninde yer alır ve her bir fonksiyon için harcanan süre de X ekseninde gösterilir. Bu grafikler aynı zamanda etkileşimlidir ve programınızın herhangi bir parçası ile ilgili kısmı yakınlaştırmanızı ve yığın bilgisini (stack trace) görmenizi sağlar (aşağıdaki görselde herhangi bir yere tıklamayı deneyin).

    Çağırı grafları veya akış kontrol grafları programınızdaki fonksiyonlar arasındaki ilişkileri görselleştirir. Bu graflarda fonksiyonlar düğüm, fonksiyon çağırıları da kenar olarak görselleştirilir. Python için pycallgraph kullanarak bu grafları üretebilirsiniz.

    Kaynak Kullanımı İzleme (Resource Monitoring)

    Programınızın performansı hakkında fikir sahibi olmak için ilk adım olarak programınızın kaynak kullanımını analiz etmeniz gerekir. Programlar genelde kısıtlı kaynak durumunda yavaş çalışırlar, örneğin yavaş ağ bağlantısı veya yeterli miktarda bellek olmadığı durumlarda. CPU kullanımıi bellek kullanımı, ağ performansı, disk kullanımı gibi sistem kaynaklarının kullanımını ölçmek bir çok araç vardır.

    Yukarıda bahsettiğimiz araçları ve komutları test etmek için stress komutu ile bilgisayarınızda yapay yük oluşturabilirsiniz.

    Özelleşmiş Araçlar

    Bazı durumlarda ayrıntıları ile ilgilenmeden iki aracın performansını karşılaştırmak isteyebilirsiniz. hyperfine gibi araçlar birbirinin alternatifi olan komut satırı araçlarının performanslarını karşılaştırmanızı sağlar. Örneğin, komut satırı ve scripting dersinde find komutu yerine fd komutunu kullanmanızı önermiştik. hyperfine ile bu iki komutu karşılaştırabiliriz. Aşağıdaki örneğimizde karşılaştırma sonucunda fd komutunun find komutundan 20 kat daha hızlı olduğunu görebilirsiniz.

    Hata ayıklama araçlarında olduğu gibi ayrıntılı inceleme araçları noktasında da web tarayıcıları olağanüstü yardımcı araçlara sahiptirler. Bu araçları kullanarak web sayfalarının yüklenme sürelerini, yükleme sırasında hangi işlemlerde zaman harcandığını (yükleme, görselleştirme, scripting vb.) inceleyebilirsiniz. Tarayıcı ayrıntılı inceleme araçlarının ayrıntıları için şu linklere Firefox, Chrome göz atabilirsiniz: .

    Alıştırmalar

    Hata Ayıklama

    Ayrıntılı İnceleme

    Yazı kaynağı : missing-semester-tr.github.io

    Yorumların yanıtı sitenin aşağı kısmında

    Ali : bilmiyorum, keşke arkadaşlar yorumlarda yanıt versinler.

    Yazının devamını okumak istermisiniz?
    Yorum yap