Reverse Engineering, Duff’s Device, PI, PAIP, ELIZA, Haskell, Yeni Bir Kaynak Kod Kontrol Sistemi
Andrew Schulman, Dr. Dobb’s Journal dergisinin Eylül 2005 sayısında 3 aydır sürdürdüğü ve doğrudan “binary” koddan yola çıkarak, sadece disassembler ve awk kullanarak geliştirdiği kaynak kod analiz etme, kıyaslama, vs. yöntemlerine dair yazısını Finding Binary Clones With Opstrings & Function Digests: Part III başlıklı makalesi ile tamamlamış. Schulman bu pek de basit olmayan konuyu olağanüstü bir sadelik ve rahatlıkla anlatıyor (bu tarzın en önemli göstergesi okuyana, aaaa, bunu ben de akıl ederdim, ne kadar basit! dedirtmesi yani bir tür ilüzyon yaratması). Schulman’ın yazısında çok önemli makalelere de referanslar mevcut. Genellikle anti-virüs geliştiricilerinin ilgilendiği teknikleri zararlı olmayan büyük yazılımlara uygulayan Schulman, bazı durumlarda kod hırsızlığını tespit etmek için kaynak kod yerine derlenmiş koda bakmanın çok daha elverişli olabileceğini somut örneklerle gösteriyor.
Aynı kalitede bir başka yazı ise, DDJ’nin bir önceki sayısında yer alıyor. A Reusable Duff Device başlıklı makalenin konusu Duff’s Device. Yeni bir teknik olmamakla birlikte belli bir bağlama oturtulmuş olması ve pratik olarak nasıl kullanılabileceğini göstermesi açısından güzel.
DDJ’nin son iki sayısında dikkat çeken diğer başlıklara örnek vermek gerekirse: The Eclipse Modeling Framework, NPTL: The New Implementation of Threads for Linux , An STL-Compatible Hybrid of Linked List & Hash Map, Software Optimization & DSP Embedded Systems, C++ Exceptions & the Linux Kernel, The Extensible Firmware Interface.
DDJ’ye laf edenlerin kulakları çınlasın diyorum bir kez daha! Zaman zaman “çöplük” kategorisinde makaleler yayınlasa da yeri geldiğinde çok kaliteli bilgisayarcıların önemli makalelerine ev sahipliği yapan (Ritchie’nin “bakın C diye bir dil yaptık” makaleleleri, Gosling’in “bakın Java diye bir dil yaptık”)bu dergi kitaplığınızda bulunması gereken yayınlardan. Üstelik eğer doğrudan Internet sitesi üzerinden abone olursanız (min. 1 yıllık) aylık bedeli 7 YTL gibi bir şey tutuyor ki pek çok pespaye Türkçe bilgisayar dergisinden daha ucuza gelmiş oluyor. Şunu da belirteyim Türkiye’deki bir kitapçıdan/dergiciden almaya kalkarsanız sayı başına 25-30 YTL verme durumunuz söz konusu! (DDJ sevgimi benimle paylaşmaya başlayan yeni abonelerden Recai Oktaş’ın da bu vesile ile bir kez daha kulaklarını çınlatmış oluyoruz
Hazır konu düzgün teknik yazı yazabilen insanlardan söz açılmışken, Lisp’ten daha doğrusu Common Lisp’ten bahsetmemek olmaz elbette. Seibel’in Practical Common Lisp‘ini okumayı bitirdim ve şimdi sıra geldi Norvig‘in PAIP‘ini okumaya başladım. Eh, 21 Günde Değil 10 Yılda Programlama Öğrenin diyen üstadın kitabını okurken acele etmek doğru olmaz elbet! Yavaş yavaş ilerliyorum. YZ anlamında artık çok güncel olmasa karmaşık programların geliştirilme yöntemleri, Common Lisp’i ustaca kullanma şekilleri ve genel olarak yüksek seviyeli bir dil ile yazılım geliştirme bakımından hala en değerli kitaplardan biri kabul ediliyor. Söz gelimi artık doğal dil işleme bakımından (tarihi önemi ve ilk olması haricinde) hemen hiçbir şey ifade etmeyen ELIZA sisteminin anlatıldığı ve adım adım uygulandığı bölümde önemli Common Lisp teknikleri uygun bağlam içinde gösterilerek okuyucu motive ediliyor. Aslında burada anlatılan “pattern matching” konusu pek çok yerde, pek çok problemin çözümünde, Lisp içinde mini programlama dillerinin (DSL – Domain Specific Language) geliştirilmesinde kullanılabilen yöntemlerden biri. Yaklaşık 100 satırlık ve çok çok az sayıda kural içeren bir ELIZA uygulaması ile örnek bir diyaloğa bakacak olursak (ELIZA ile iletişim kurarken ve cevap alırken konulan parantezler Lisp “reader”ını fazla yormamak için o halde, yoksa onlardan kurtulmak zor değil, bölüm sonundaki kısa egzersizlerden biri — haydi şimdi “aman allahım çok fazla parantez var, korkunç!” korosu nakarata başlasın
:
CL-USER> (eliza)
ELIZA> (hello there)
(HOW DO YOU DO. PLEASE STATE YOUR PROBLEM.)
ELIZA> (i want to learn lisp)
(WHY DO YOU WANT TO LEARN LISP)
ELIZA> (i could see if it works)
(DO YOU REALLY THINK ITS LIKELY THAT IT WORKS)
ELIZA> (no not really)
(YOU ARE BEING A BIT NEGATIVE)
ELIZA> (no)
(YOU ARE BEING A BIT NEGATIVE)
ELIZA> (no)
(YOU ARE BEING A BIT NEGATIVE)
ELIZA> (forget it-- I was just wondering how general lisp is)
(WHY DO YOU TELL ME YOU WERE JUST WONDERING HOW GENERAL LISP IS NOW?)
ELIZA>
gibi bir konuşma seansı ile karşılaşabiliyoruz (meraklısına not: Emacs içinde, Emacs Lisp ile yazılmış Emacs Psychiatrist de bir tür ELIZA uygulaması ve epey eğlenceli şekilde sizin dertlerinizi dinleyebiliyor! Denemek için M-x doctor). PAIP’teki bu ELIZA kodları ile uğraşırken ziyadesiyle Emacs ve SLIME egzersizi yapma imkanı buldum ve birtakım tuş kombinasyonlarının kod düzenlerken ne kadar hayat kurtarıcı, işleri kolaylaştırıcı olduğunu fark edip Emacs+SLIME ortamına daha bir saygıyla, hürmetle yaklaşır oldum!
PAIP’in güzel yanlarından biri çok değişik zorluk seviyelerine sahip bölüm sonu egzersizleri ve soruları yani Practical Common Lisp’in en büyük eksikliği.
Düzgün yazılardan Lisp’e geçerken geçenlerde comp.lang.lisp’te gördüğüm bir ileti geldi aklıma. İspanyol bir Common Lisp çaylağı, PI sabitinin pek de sabit olmayan (!) rastsal algoritmalarla hesaplanabileceğinden dem vurmuş, misal Buffon’un iğnesi yöntemi (benim tarafımdan biraz İngilizceleştirilmiş hali):
(defun print-err (calculated-value real-value)
"Prints the value calculated and its error"
(format t "Calculated value: ~,5f ~5t Error: ~,3f%~%"
calculated-value (abs (* (/ (- calculated-value real-value) real-value) 100))))
(defun Buffon (&key (maximum 314159))
"Calculates the value of PI with a method proposed by Buffon"
(let ((pi-value 0)
(on 0))
(dotimes (shooting maximum)
(let* ((y0 (random 2.0))
(theta (random (* 2 pi)))
(y1 (+ y0 (sin theta))))
(when (or (< = y1 0) (>= y1 2))
(incf on))
(when (plusp on)
(setf pi-value (/ (+ 1.0 shooting) on))
(print-err pi-value pi))))))
PI takıntısı olanlar Are the Digits of Pi Random? başlıklı makaleye göz atabilirler.
Bilgi Üniversitesi’ndeki Lisp çalışma grubu bağlamında cl-wiki ile e-posta listelerinde dolanırken son zamanlarda sık sık adını duyduğum darcs isimli kaynak kod kontrol ve sürüm sistemi ile tekrar karşılaştım. cl-wiki’nin geliştiricisi bir darcs deposu açtığından ve çok kolay şekilde kullanılabildiğinden bahsediyordu (CVS ve Subversion’dan yorulan bünyeler için). Debian GNU/Linux paketi de bulunan bu sistem acaba hangi dil ile geliştirilmiş tahmin edin? Tıpkı Lisp gibi “gerçek hayatta ne işimize yarayacak ki ama?” sorusuna maruz kalan bir dil olan Haskell ile…
Benzer Yazılar / Similar Posts:
- Common Lisp ve Debian
- clbuild: Common Lisp Paket Yönetim Sistemi (bir nevi)
- Common Lisp, dilbilim, Debian
- Bir Common Lisp videosu daha: Lisp ile iş kurallarını kodlamak için DSL geliştirmek
- O’Reilly ve Common Lisp Rönesansı + Ltk; 2006 Avrupa Lisp Toplantısı
- gnuplot ve Common Lisp entegrasyonu
- After the cognitive science seminar: Eliza effect and a therapeutic role for robots
- Emre’nin penceresinden Lisp dünyasının bu haftaki durumu
- SBCL cephesinde enteresan gelişmeler
- Kutsal Keçi! Yeni gördüğüm bir karikatür sitesi
Leave a reply