\documentclass[a4paper,11pt]{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[turkish]{babel}
\usepackage{listings}
\usepackage{multicol}
\usepackage{geometry}
\usepackage{titlesec}
\usepackage{fancyhdr}
\usepackage{graphicx}
\usepackage{url} 
\usepackage{calc}
%\usepackage{eso-pic}
%\usepackage{color}

\title{Common Lisp ile Yazılım Geliştirme}
\author{Aycan iRiCAN, Evrim ULU}
\date{11 Mayıs 2006}

% geometry
\geometry{includeall,left=2.5cm,right=0.5cm,top=3cm,bottom=2.5cm}

% daha küçük başlıklar
\titleformat*{\section}{\large\bfseries}

% üst ve altyazılar
\pagestyle{fancy}
\addtolength{\voffset}{-0.3in} % header'dan önce 0.5in boşluk (default 1in)
\addtolength{\headheight}{1in} % 1in header boyu
\addtolength{\textheight}{-0.6in}
\addtolength{\textwidth}{1cm}


\fancyhf{} %başlıkları sil
\fancyhfoffset{1pt}
\fancyhead[L]{\includegraphics[keepaspectratio,height=1in]{core-header.eps}} % başlığa resim ekle

\newcommand{\footerfont}{\footnotesize\fontseries{l}\selectfont}
\fancyfoot[C]{\footerfont Tuna Caddesi Halk Sokak 13/1 Yenişehir, ANKARA | Tel: (312) 433 2529 | Faks: (312) 435 8324\\
  bilgi@core.gen.tr | irc.core.gen.tr:7000\\ \thepage}
\renewcommand{\headrulewidth}{0.2pt}
\renewcommand{\footrulewidth}{0.2pt}

\hyphenation{ör-nek he-ce-le-me}

\begin{document}

% lisp code listing
\lstset{language=Lisp,basicstyle=\small\tt,identifierstyle=,keywordstyle=,showstringspaces=false}

\maketitle\thispagestyle{fancy}

\begin{abstract}
  Bu seminerde, Common Lisp (CL) programlama dilinin üstün özellikleri
  ve bu dilin programlama sorunlarına sunduğu çözümler anlatılacaktır.
  Seminerde, CL dili ile programlama yapabilmek için gerekli olan
  "Açık Kaynak Kodlu" araçların (EMACS, SLIME, SBCL, Darcs vb.)
  örneklenmesinin ardından, tarafımızdan geliştirilen projelerden
  (Portal-Base, Ajax-Lisp, Core-DB, GPRS-Server, Core-IRCBot,
  Hedee.com vb.) örnekler verilecektir.  Seminer sonunda, dinleyiciler
  CL dili ile yazılım geliştirmek için gerekli olan ön-bilgiye sahip
  olacaklardır.
\end{abstract}

\begin{multicols}{2}
\section{Giriş}
Lisp, 1950'lerde yaratılan ve o tarihlerden bu güne yazılım
araştırmalarında ve ileri düzey ar-ge çalışmalarında uzun zamandır
kullanılan köklü bir dildir.

Lisp'in geliştirilmesi ile 1970'lerde ortaya abartılı sayıda lisp
gerçekleştirimi çıktı. Bu çok seçenekliliğin dez avantajlarının
ayıklanması ve olumlu yanların birleştirilmesi ile Common Lisp
standardı başlatıldı. 1994'de ise bu yeni standart, ANSI standardı
(X3.226:1994) olarak kabul edildi.

Bu gün bir çok alanda kullanılan Common Lisp programlama dili,
ülkemizdeki yazılımcılar için henüz keşfedilmemiş bir hazine gibidir.

\section{Common Lisp'in Özellikleri}
Common Lisp ya da kısaca CL, bir gerçekleştirim (implementation)
olarak algılanmamalıdır. CL bir belirtimdir (specification). Açık
kaynak kodlu ve ticari bir çok gerçekleştirimi olan bir programlama
dili belirtimidir.

CL birden fazla programlama modelini kullanabileceğiniz bir dildir. CL
ile yordamsal, işlevsel ve nesnel programlama yapabilirsiniz. Ayrıca
kendi programlama modelinizi de kurabileceğiniz kadar
esnektir. Örneğin eşzamanlı ve paralel programlama gerçekleştirimleri
son zamanlarda geliştirilmiş modellerdir. Bu özellikleriyle piyasada
bulunan popüler dillere popüler olmayan bir alternatiftir.

CL dinamik bir dildir ve döngülü bir tasarım süreci sağlar. Bu nedenle
CL programcısı araştırmacı bir şekilde programlayabilir. Bir CL
programı çalışırken değiştirilebilir ve geliştirilebilir. CL
programcısı çoğu zaman yazdığı programın çalışan halini
programlamaktadır. Bu yönüyle servisin kesilmeksizin yamalanabilmesi
ve geliştirilebilmesine olanak sağlar, yaşamsal uygulamalar için çok
iyi bir yazılım tabanı oluşturur.

Tüm hata ayıklama işlemleri dilin kendi modeli içinde yapılır. CL'de
dilin modeli dışında bir hata üretilmez. Hatalar önceden
programlanabilir önlemlerle giderilebilir.

CL'nin nesne sistemi olan CLOS, gelişmiş bir nesnel programlama modeli
sunar. Bu sayede çoklu kalıtım, çoklu yöntemler, çalışma anında
sınıfların tekrar tanımlanması ve dinamik veri türü yaratma gibi
özellikleri kullanabilirsiniz. Başka hiçbir dil bu zengin özellikleri
sunmaz.

CL'de herşey nesnedir. Birinci sınıf veri türleri sayesinde nesne
modeliniz üzerinde çalışma anında değişiklik yapabilir, uygulamanız
üzerinde tam bir kontrol sağlayabilirsiniz.

Nesneler, veri yapıları, listeler, vektörler, ayarlanabilir diziler,
anahtarlı tablolar ve semboller CL'nin sayısız veri türlerinden sadece
bir kısmıdır. CL'nin aritmetik kütüphanesi sınırsız boyutta
tamsayılar, fraksiyonlar, karmaşık sayılar ve tam bir kayan-nokta
kütüphanesi içerir. Nümerik türler arasında çevirim otomatik
gerçekleştirilir.

CL'de aynı zamanda tamamen nesnel bir durum sistemi
mevcuttur. Düzeltme ve hatalardan kaçma gibi bir çok yönteme izin
verir. Bu sayede programınızın çalışması esnasında oluşacak durumları
değerlendirecek kodlar yazabilirsiniz ve bu sayede hatalara karşı
önlem alırsınız.

Common Lisp'in ilk günden öğrenilebilecek, basit ve kararlı bir
sözdizimi vardır. EMACS gibi gelişmiş metin düzenleyiciler ile CL
programı yazmak gerçekten çok zevkli ve kolaydır.

CL'nin kullanışlı makro sistemi CL programcısının gömülü diller
yaratmasına izin verir. Bu sayede Lisp alana özel bir problem çözme
aracı haline gelir.

CL tamamen yansımalı bir dildir. Genetik algoritmaları, evrimsel
programlamayı ve diğer yeni nesil programlama tekniklerini
destekler. CL programları kendilerini tarif edebilir ve
değiştirebilirler.

CL'de değişkenlerin değil değerlerin türü vardır. Yani değişkenler
gerçekten değişkendir. Bu nedenle ilgilendiğiniz veri türlerini
önceden tanımlamak zorunda kalmazsınız.

Yukarıda bahsi geçen konular CL'nin ilk akla gelen özelliklerinden
sadece bir bölümüdür. Ayrıntılı bilgilere internet üzerinden
erişebilirsiniz.

\section{Geliştirme Araçları}
Yazılım geliştirme sektörü oldukça çabuk yenilenen, ihtiyaçları da bir
o kadar hızlı değişen bir sektördür. CL ile yazılım geliştirmek için
tercih ettiğimiz araçlar aşağıda listelenmiştir.

\begin{itemize}
\item SBCL - Common-Lisp Sanal Makinası
\item Emacs - Metin Editörü
\item Darcs - Sürüm Kontrol Sistemi
\item Slime - Lisp-Emacs Etkileşim Eklentisi
\end{itemize}

\subsection{SBCL - Steel Bank Common Lisp, Common-Lisp Sanal Makinası}

SBCL, ANSI Common-Lisp yazılımları geliştirebileceğiniz açık-kaynak
kodlu bir derleyici ve işleticidir. Birçok diğer dilin aksine,
derleyici, lisp kodlarını makina diline çevirerek işletir, bu sebeple
oldukça hızlıdır. 1999 yılında CMUCL(Carnegie Mellon University
CL)'nin farklı platformlarda çalıştırılabilmesi ve
yaygınlaştırılabilmesi için ayrı bir proje haline getirilmiş ve
camianın geniş desteğini almıştır. Aşağıda SBCL'nin eklentilerinin
bazıları kısaca açıklanmıştır.
\footnote{http://www.sbcl.org/manual/Extensions.html\#Extensions}:

\begin{itemize}
\item Sistem Tanımlama Aracı (ASDF) - Üçüncül paketlerin sisteme
  yüklenmesini sağlar.
\item Yabancı Fonksiyon Arayüzü - C kütüphanelerini lisp makinası
  içersinden kullanmayı sağlar.
\item Özyineli (Recursive) Olay Döngüsü - Ayrı iş parçacıkları
  (Thread) kullanmadan ağ akımları üzerinde girdi/çıktı işlemlerinin
  yapılabilmesini sağlar.
\item Meta-Nesne Protokolü - SBCL içinde bulunan CLOS Meta-Nesne
  Protokolünün uygulamasıdır.
\item Yerel İş Parçacıkları (Native Threads) - İşletim sisteminin iş
  parçaçıkları desteğinin kullanılmasını sağlar, bu sayede, SBCL,
  mümkün olan en kısa sürede işlemleri tamamlamaya çalışır.
\item Ağ Arayüzü - BSD Soket arayüzü sayesinde alt-seviye ağ
  yazılımları yazılabilir.
\item Yansıma Olanakları - Yansıma arayüzü sayesinde, çalışan kod
  parçacıkları incelenebilir ve gerektiğinde müdahale edilebilir.
\item İşletim Sistemi Arayüzü - POSIX işletim sistemi standardlarının
  sağladığı işletim sistemi olanaklarının, lisp makinası içersinden
  çağırabilmesini sağlar.
\item İşletme Analizi (Profiling) - İşletme analiz araçları sayesinde
  çalışan sistemin işletme zamanları hesaplanabilir, bu sayede kod
  parçacıkları üzerinde iyileştirme çalışmaları yapılabilir.
\end{itemize}

SBCL, Linux, *BSD, Solaris, Mac OS X işletim sistemleri üzerinde
çalışabilmektedir. WIN32 sürümü ise tamamlanma aşamasındadır. SBCL,
x86, 64-bit x86, PowerPC, Sparcs, Alpha, MIPS mimarilerini
desteklemektedir.

\subsection{Emacs - Metin Düzenleyicisi}
Emacs el kitabı, Emacs'ı şöyle tanımlamaktadır:

\textit{``Emacs, geliştirilebilir, özelleştirilebilir, kendini
  belgeleyen gerçek zamanlı bir metin düzenleyicisidir.''}

Özgür yazılım felsefesinin lideri Richard Stallman (RMS) tarafından
1981 yılında ACM konferansında duyurulan Emacs projesi, bu felsefenin
en başarılı ürünlerinden biridir. Lisp dili ile oldukça haşır neşir
olan RMS, metin düzenlemeyi kolaylaştırmak üzere Emacs için özel bir
lisp lehçesi olan Elisp'i geliştirmiştir. Bu sayede, birçok eklentiler
yazılmış, yeni tuşlar tanımlanmış, özel metin düzenleme sistemleri
yaratılmıştır.

Kararlı Emacs 21 sürümü, AIX, FreeBSD, GNU/Linux, Mac-OS X, MS DOS, MS
Windows, NetBSD, OpenBSD, Solaris, SunOS, Ultrix işletim sistemlerini
desteklemektedir. Biz, geliştirme sürümü olan Emacs 22 sürümünü tercih
etmekteyiz.

\subsection{Darcs - Sürüm Kontrol Sistemi}
David Roundy tarafından geliştirilen ve \textit{Yamaların Teorisi}'ne
dayanan bir sürüm kontrol sistemidir.

CVS, Subversion gibi popüler araçların yapabildiği işlemler, darcs ile
gerçekleştirilebilir. En belirgin fark ise, darcs kod havuzlarının
merkezi bir sisteme ihtiyaç duymamasıdır.  Bu sayede, uzak havuzlara
yazma hakkınız olmasa bile, herhangi bir açık kaynak kodlu projeyi
yerel sisteminize çekerek geliştirmeye devam edebilir ve sürüm kontrol
sisteminden faydalanmaya devam edebilirsiniz. Ayrıca, yama teorisi
sayesinde, yamalarınızı metin dosyaları halinde, eposta aracılığı ile
gönderebilir, açık kaynak kodlu projelere katkı sağlayabilirsiniz.

DarcsCGI eklentisi, kod havuzlarını web'den gezilebilir, yamaları
takip edebilir hale getirmektedir.

\subsection{Slime - Lisp-Emacs Etkilişim Eklentisi}
SLIME, CL dili ile yazılım geliştirmeyi kolaylaştıran Emacs
eklentisidir. Bu eklenti sayesinde:

\begin{itemize}
\item Düzenlediğiniz herhangi bir kod bloğunun derlenmesini,
  işletilmesini sağlayabilir, macro açılımlarını anında
  görebilirsiniz.
\item Internet üzerindeki belgeleri, örneğin CL HyperSpec, Emacs
  içinden w3m metin bazlı web tarayıcısı ile görüntüleyebilir,
  geliştirme hızınızı arttırabilirsiniz.
\item M-. M-, tuş kombinasyonları sayesinde kod tanımları içinde
  gezebilirsiniz. (Cross-Reference)
\item ESC-TAB tuş kombinasyonu sayesinde sembol ve paket isimlerini
  BASH'teki gibi tamamlayabilirsiniz.
\item SLDB debugger sayesinde kodları istediğiniz gibi
  inceleyebilirsiniz.
\item REPL (read-eval-print-loop) sayesinde, verimli programlama
  yapabilir, büyük kod bloklarını küçük parçalar halinde deneyerek
  tasarlayabilir, sonuçları görebilirsiniz.
\end{itemize}

Ayrıca SLIME, Lisp makinasında çalıştırılan ve SLIME ile birlikte
gelen \textit{swank} sunucuna bağlanır.  Bu sayede, birden fazla Lisp
makinasını tek Emacs ile yönetebilirsiniz.

SLIME, Emacs 21 metin editörünü ve CMUCL, SBCL, OpenMCL, LispWorks,
Allegro CL, CLisp sanal makinalarını desteklemektedir.

\section{Geliştirme Döngüsü}
Günümüzde popüler programlama dillerinin en büyük dezavantajı
geliştirme döngüsünün programcıya aşırı zaman kaybettirmesidir. Bir
Java\footnote{Java, Sun Microsystems'in tescilli markasıdır.}
programcısı uygulamasına her ekleme yaptığında değişiklikleri görmek
için uygulamayı baştan derler ve yeniden başlatır. Eğer web
programlama yapıyorsa bu zaman kaybı yerleştirme nedeniyle
(deployment) daha da artabilmektedir. Bu aşırı zaman kaybı bir çok
programlama dilini kullanan geliştirici için üretkenliği azaltan bir
unsurdur.

Oysa CL tamamen dinamik bir dildir ve tüm kodlama çalışan uygulama
üzerinde yapılabilir. Örneğin tek bir ifadeyi yorumlatarak web
sayfanızın akış mantığını değiştirebilirsiniz. Ya da çalışan
uygulamanızdaki değişkenlere çalışma anında ulaşabilir, onları
değiştirebilir, nesnelerinize yeni ya da güncel yöntemler yazabilir ve
böylece tüm uygulamanız üzerinde tam bir hakimiyet kurabilirsiniz.

Geliştirme döngüsünü hayal edebilmeniz için bir projenin nasıl
geliştirildiğine örnek verebiliriz.

Öncelikle projenin tüm aşamalarında üretilecek bilgiyi sürümlü olarak
saklayacak bir depo açılır. Bu depo çoğunlukla tüm geliştiricilerin
ulaşabileceği bir sunucuda barındırılır. Depo açıldıktan sonra temel
olarak yazılım bileşenlerine uygun olarak geleneksel dizinler açılır
(src, test, doc v.b.).

Geliştiriciler ister kendi bilgisayarlarında ister uzak sunucuda EMACS
oturumlarını açarlar. Kendi uğraşları için bir SBCL çalıştırır ve
SLIME ile bu sanal makinaya bağlanırlar. Ortak depo üzerindeki
dosyaları kendi çalışacakları dizine çekerler. Ve daha sonra yazılımı
geliştirmeye başlarlar. 

Çalışacağınız dosyaları kişisel bilgisayarınızda da barındırmak
zorunda değilsiniz, EMACS uzak dosyaları da düzenleyebilir, bu kodları
istediğiniz sanal makina içerisinde işletebilir.

Geliştirme boyunca, başka yazılıma ihtiyaç duymadan EMACS içerisinden,
IRC ya da diğer anında mesajlaşma protokolleri ile haberleşmeye
devam ederler.

Yazılımda kararlı değişiklikler oluştuğunda, yazılımcı bu
değişiklikleri içeren yama dosyasını açıklama yazısı ile birlikte
ortak depoya gönderir. Bu işlem diğer yazılımcılara e-posta ile
bildirilir.

Yazılımda acil uygulanması gereken yamalar sunucu bilgisayarda çalışan
sanal makinaya bağlanarak yapılabilir. Örneğin bir sınıf tanımı
değişikliği gerekiyorsa, yazılımcı kendi bilgisayarındaki sanal makina
yerine uzak sunucudaki sanal makinaya bağlanır, bilgisayarındaki
güncel kodları uzak sunucuda işletir ve sanal makina güncellenmiş
olur.

DARCS sürüm kontrol sistemi ile dağınık depolarla çalışmak
mümkündür. Size uygun olmayan bir yama yayımlandığında bu yamayı kendi
deponuza uygulamak istemezsiniz. Ayrıca sizin deponuzda ortak depodaki
yamalardan farklı değişiklikler olabilir.

Programcı oluşturduğu dosya ve/veya dosyaların içerisindeki ifadeleri
tek tek ya da tümden yorumlatabilir. Bu sayede önceden yorumlanmış bir
fonksiyon, değişiklik yapıldıktan sonra tekrar yorumlatılır ve sistem
güncel kodla çalışmaya devam eder. Sistemin durdurulması ve yeni
kodlarla açılması gibi bir şey söz konusu değildir.

Meta-Nesne protokolü, geliştirme döngüsünün devamlılığının en önemli
yongasıdır. Bu protokol sayesinde, önceden tanımlanmış sınıflar
değiştirilebilir ve mevcut yaratılmış sınıf örnekleri otomatik olarak
yeni sınıf tanımına göre güncellenir. Bu işlem, kullanıcılar sınıfları
yeniden tanımladıkça kendiliğinden yapılır.
\section{Sonuç}
Yazılım geliştirme, dünyadaki en hızlı gelişen ve değişen sektörlerden
biridir. CL dili, bu değişime 50 yıl boyunca adapte olabilmiş ve
köklülüğünü ispat etmiştir. Eskiden yanlızca akedemik araştırmalar
için kullanılan CL dili, bugün kısıtlı sayıda insan tarafından da olsa
birçok farklı sorunu çözmek için kullanılmakta ve oldukça verimli
sonuçlar alınmaktadır.

Yazılım konusunda dünyanın ileri gelen ülkelerine göre kısır kalan
ülkemizin, ileride gelebilecek olan iç ve dış, maddi ve manevi
baskıları bertaraf edebilmesi açısından, CL dilinin önemli bir araç
olduğunu düşünüyoruz. Verimliliği arttırmanın ve teknoloji ihraç
etmenin oldukça önemli olduğu bu çağda, kısıtlı imkanlarla dahi olsa
CL dilini ve araçlarını kullanarak sonuç almanın mümkün olduğunu bu
belge ortaya koymaktadır. Düşüncemiz o'dur ki, yakın zamanda ülkemizde
CL dili yaygınlaşır, verimliliğimiz artar ve kendi teknolojimizi
üretip, dünyaya ihraç etmeye başlarız.
\end{multicols}

\section{Yazılım Geliştirme Araçları}
\begin{itemize}
\item EMACS - \url{http://www.gnu.org/software/emacs/}
\item SLIME - \url{http://common-lisp.net/project/slime/}
\item DARCS - \url{http://www.darcs.net/}
\end{itemize}

\section{Bazı Lisp Gerçekleştirimleri}
\label{sec:implementations}
\begin{itemize}
\item SBCL (Steel Bank Common Lisp) - \url{http://www.sbcl.org}
\item CMUCL - \url{http://www.cons.org/cmucl}
\item CLISP - \url{http://clisp.cons.org}
\item Allegro Common Lisp - \url{http://www.franz.com}
\item LispWorks - \url{http://www.lispworks.com}
\end{itemize}

\section{Belgeler}
\begin{itemize}
\item Practical Common Lisp (PCL): \\
  \url{http://www.gigamonkeys.com/book/}
\item Successful Lisp: \\ 
  \url{http://psg.com/~dlamkins/sl/cover.html}
\item An Introduction and Tutorial for Common Lisp: \\
  \url{http://www.apl.jhu.edu/~hall/lisp.html}
\item On Lisp: \\ 
  \url{http://www.paulgraham.com/onlisp.html}
\item The Common Lisp Cookbook: \\
  \url{http://cl-cookbook.sourceforge.net/}
\item UncommonWeb: \\ 
  \url{http://common-lisp.net/project/ucw/}
\item Ajax-Lisp: \\
  \url{http://common-lisp.net/project/ucw/repos/ucw_ajax}
\end{itemize}
\end{document}

