← A–Z Röportajları

AWK

AWK: Alfred Aho

Bilgisayar bilimci ve derleyici uzmanı Alfred V. Aho, bilgisayar bilimi araştırmalarının ön saflarında yer alan bir isimdir. Bell Labs’te Computing Sciences Research Center’da başkan yardımcısı olarak çalıştığı günlerden, Columbia University’de Bilgisayar Bilimleri Bölümü’nde Lawrence Gussman Profesörü olarak görev yaptığı bugünkü konumuna kadar programlama dillerinin geliştirilmesinde yer almıştır.

Dragon kitap serisinin ortak yazarlığını yapmasının yanı sıra Aho, 1970’lerin ortasında Brian Kernighan ve Peter Weinberger ile birlikte AWK desen eşleştirme dilinin üç geliştiricisinden biriydi.

Computerworld yakın zamanda Profesör Aho ile AWK’nın geliştirilmesi hakkında daha fazla bilgi edinmek için konuştu.

AWK dilinin fikri/kavramı nasıl gelişti ve hayata geçti?

Birçok dilde olduğu gibi, bir ihtiyacı karşılamak zorunluluğundan doğdu. 1970’lerin başında Bell Labs’te araştırmacı olarak çalışırken bütçeleri ve editoryal yazışmaları takip ediyordum. O sırada yakındaki bir üniversitede ders de veriyordum, bu yüzden öğrenci notlarını da takip etmem gerekiyordu.

Bu işleri yapmak için bir ya da iki satırlık programlar yazabileceğim basit, küçük bir dil istiyordum. Laboratuvarlarda yan odada çalışan bir araştırmacı olan Brian Kernighan da benzer bir dil yapmak istiyordu. Günlük sohbetlerimiz, basit veri işleme görevlerine uygun bir desen eşleştirme dili geliştirme arzusuyla sonuçlandı.

Unix üzerinde popüler bir dize eşleştirme aracı olan ve araştırma merkezimizde geliştirilmiş grep’ten büyük ölçüde etkilendik. grep, sınırlı bir düzenli ifade biçiminden oluşan bir desene uyan satırları bulmak için bir metin dosyasını tarar ve ardından bu düzenli ifadeye uyan tüm satırları yazdırırdı.

Desen sınıfını, dizelerin yanı sıra sayılarla da çalışabilecek şekilde genelleştirmek istedik. Ayrıca, yalnızca desene uyan satırı yazdırmaktan daha fazla hesaplama yeteneğine sahip olmayı da istedik.

Böylece, desen-eylem işleme ilkesine dayanan AWK ortaya çıktı. Basit veri işleme yapmak için geliştirildi: günlük olarak rutin biçimde yaptığımız sıradan veri işleme işleri için. Amacımız, bizim ve bilgisayar konusunda çok bilgili olmayan kişilerin bile rutin veri işleme için geçici programlar yazabilmesini sağlayacak çok basit bir betik diline sahip olmaktı.

AWK’yı geliştirdiğiniz dönemde bu işlevlere zaten sahip olan programlar ya da diller var mıydı?

Özgün modelimiz grep’ti. Ancak grep, desen-eylem işlemenin çok sınırlı bir biçimine sahipti; bu nedenle grep’in yeteneklerini önemli ölçüde genelleştirdik. O dönemde derleyici uygulamaları için dize desen eşleştirme algoritmaları ve bağlamdan bağımsız dilbilgisi ayrıştırma algoritmalarıyla da ilgileniyordum. Bu da, AWK’nın yaptıkları ile derleyici yapım araçları olan lex ve yacc’ın yaptıkları arasında belirli bir benzerlik görmenizi sağlar.

lex ve yacc, üzerinde çalıştığım dize desen eşleştirme algoritmaları etrafında geliştirilmiş araçlardı: lex sözcüksel analiz, yacc ise sözdizimsel analiz yapmak üzere tasarlanmıştı. Bu araçlar, Bell Labs’te ve daha sonra başka yerlerde, her türden küçük dili geliştirmek için yaygın olarak kullanılan derleyici yapım yardımcı programlarıydı. Brian Kernighan bunları matematik dizgisi ve resim işleme için diller geliştirmekte kullanıyordu.

lex, girdi metninde leksemleri arayan bir araçtır. Leksemler, mantıksal birimleri oluşturan karakter dizileridir. Örneğin, bir programlama dilindeki then gibi bir anahtar sözcük bir leksemdir. t karakteri tek başına ilginç değildir, h tek başına ilginç değildir, ancak then birleşimi ilginçtir. Bir derleyicinin yapması gereken ilk işlerden biri, kaynak programı okumak ve karakterlerini leksemlere ayırmaktır.

AWK bu tür metinsel işlemeden etkilenmiştir, ancak AWK veri işleme görevlerine yöneliktir ve kullanıcının programlama yetkinliği açısından çok az arka plan bilgisine sahip olduğunu varsayar.

Computerworld okuyucularına AWK’yı bir dil olarak kendi sözlerinizle kısaca özetleyebilir misiniz?

AWK, metin dosyalarını işlemek için kullanılan bir dildir. Bir dosya, bir kayıtlar dizisi olarak ele alınır ve varsayılan olarak her satır bir kayıttır. Her satır, alanlar dizisine bölünür; dolayısıyla bir satırdaki ilk sözcüğü birinci alan, ikinci sözcüğü ikinci alan olarak düşünebiliriz ve bu şekilde devam eder. Bir AWK programı, desen-eylem ifadelerinin bir dizisidir. AWK girdiyi satır satır okur. Programdaki her desen için satır taranır ve eşleşen her desen için ilişkili eylem yürütülür.

Basit bir örnek bunu netleştirecektir. Diyelim ki her satırında bir ad ve ardından bir telefon numarası bulunan bir dosyamız var. Dosyanın Naomi 1234 satırını içerdiğini varsayalım. AWK programında birinci alan $1, ikinci alan $2 olarak adlandırılır ve bu şekilde devam eder. Dolayısıyla Naomi’nin telefon numarasını almak için şu AWK programını yazmamız yeterlidir:

$1 == "Naomi" {print $2}

Bu, birinci alan Naomi ile eşleşirse ikinci alanı yazdır anlamına gelir. Artık siz bir AWK programcısısınız! Bu programı AWK’ya yazıp adlar ve telefon numaraları içeren dosyayı verdiğinizde, Naomi’nin telefon numarası olarak 1234 çıktısını üretir.

Tipik bir AWK programu birden fazla desen-eylem ifadesi içerir. Desenler dizelerin ve sayıların Boole kombinasyonları olabilir; eylemler ise C benzeri bir programlama dilindeki ifadeler olabilir.

AWK, her Unix sistemiyle birlikte gelen standart programlardan biri olduğu için popüler hale geldi.


AWK’nın geliştirilmesinde en çok neyle gurur duyuyorsunuz?

AWK üç kişi tarafından geliştirildi: ben, Brian Kernighan ve Peter Weinberger. Peter Weinberger, Brian ile benim yaptıklarımızla en başından itibaren ilgileniyordu. AWK için bir dilbilgisel belirtim oluşturmuştuk ancak henüz tam bir çalışma zamanı ortamı geliştirmemiştik. Weinberger gelip “hey, bu benim de kullanabileceğim bir dile benziyor” dedi ve bir hafta içinde AWK için çalışan bir çalışma zamanı geliştirdi. AWK’nın bu ilk biçimi, hepimizin ilgilendiği veri işleme rutinlerini yazmak için çok kullanışlıydı; ancak daha da önemlisi, dil için evrimleşebilir bir platform sağladı.

Bu projenin benim için en ilginç yönlerinden biri, Kernighan ve Weinberger’ın dil tasarımı hakkında nasıl düşündüklerini öğrenmem oldu; gerçekten ufuk açıcı bir süreçti! Elimizdeki esnek derleyici yapım araçlarıyla, dili çok hızlı bir şekilde yeni ve faydalı sözdizimsel ve anlamsal yapıları benimseyecek şekilde geliştirdik. Bir yıl boyunca, hangi yapıların dilde yer alması ya da almaması gerektiğini yoğun biçimde tartıştık.

Dil tasarımı son derece kişisel bir faaliyettir ve herkes, çözmek istediği problem sınıflarını ve bunların nasıl çözüleceğini dile taşır. AWK’yı geliştirmekten çok keyif aldım ve Kernighan ile Weinberger ile çalışmak kariyerimin en uyarıcı deneyimlerinden biriydi. Yine de, ikisinden biriyle bir programlama yarışmasına girmek istemeyeceğimi de öğrendim! Programlama yetenekleri gerçekten çok güçlü.

İlginçtir ki, dili üçümüz dışında kimsenin kullanmasını amaçlamamıştık. Ancak çok kısa sürede, pek çok başka kişinin de AWK’nın iyi olduğu rutin veri işleme türüne ihtiyaç duyduğunu fark ettik. İnsanlar, birkaç satır AWK ile yapılabilecek veri işleme işleri için yüz satırlık C programları yazmak istemiyordu; bu yüzden pek çok kişi AWK kullanmaya başladı.

Uzun yıllar boyunca AWK, Unix üzerindeki en popüler komutlardan biri oldu ve bugün, benzer başka birçok dil ortaya çıkmış olmasına rağmen, AWK hâlâ dünyadaki en popüler 25 ya da 30 programlama dili arasında yer alıyor. Ve her şey, üçümüzün kendi kullanımımız için faydalı bulacağı bir yardımcı araç geliştirmeye yönelik küçük bir alıştırma olarak başladı.


AWK’nın bu kadar popüler olması hakkında ne düşünüyorsunuz?

Başka insanların AWK’yı faydalı bulmasından çok mutluyum. Ayrıca AWK yalnızca çok sayıda kullanıcı çekmekle kalmadı, daha sonra başka dil tasarımcıları tarafından daha güçlü diller geliştirmek için bir model olarak da kullanıldı.

AWK geliştirildikten yaklaşık 10 yıl sonra Larry Wall, AWK ve bazı diğer Unix komutlarını temel alan Perl adlı bir dili geliştirdi. Perl günümüzde dünyanın en popüler programlama dillerinden biridir. Dolayısıyla AWK yalnızca ortaya çıktığında popüler olmakla kalmadı, aynı zamanda başka popüler dillerin geliştirilmesini de teşvik etti.


Daha önce de belirttiğiniz gibi, AWK pek çok başka dile ilham verdi: sizce bunun nedeni nedir?

AWK’yi başlangıçta popüler yapan şey, sadeliği ve yapmak üzere tasarlandığı görev türleriydi. Çok basit bir programlama modeline sahiptir. Desen-eylem programlama fikri insanlar için son derece doğaldır. Dili Unix’te borularla (pipes) uyumlu hâle de getirdik. AWK’deki eylemler, aslında C programlarının gerçekten basit biçimleridir. {print $2} gibi basit bir eylem yazabilirsiniz ya da bir desenle ilişkilendirilmiş, C benzeri çok daha karmaşık bir programı eylem olarak yazabilirsiniz.

Bazı Wall Street finans kuruluşları, AWK ilk ortaya çıktığında, AWK’de veri işleme programları yazmanın çok kolay olması nedeniyle muhasebelerini dengelemek için AWK kullandılar.

AWK, dilin öğrenme eğrisi çok sığ olduğu için birçok insanı programcı hâline getirdi. Günümüzde bile çok sayıda insan AWK kullanmaya devam ediyor ve Perl gibi dillerin fazla karmaşık hâle geldiğini söylüyor. Bazıları Perl’in o kadar karmaşık bir dil hâline geldiğini, programlar yazıldıktan sonra onları anlamanın neredeyse imkânsız olduğunu söylüyor.

AWK’nin bir başka avantajı da dilin kararlı olmasıdır. 1980’lerin ortalarından beri onu değiştirmedik. Ayrıca Windows gibi farklı platformlarda AWK sürümlerini gerçekleştirmiş pek çok başka kişi de var.


AWK’de baş harflerin sırasını nasıl belirlediniz?

Bu bizim seçimimiz değildi. Araştırma grubundaki meslektaşlarımız, üçümüzü birimizin ya da diğerimizin ofisinde gördüklerinde, açık kapının önünden geçer ve “AWK! AWK!” diye seslenirlerdi. Bu yüzden, meslektaşlarımızdan gördüğümüz iyi niyetli takılmalar nedeniyle dile AWK adını verdik. Ayrıca bunun harika bir isim olduğunu düşündük ve yayımladığımızda AWK kitabının kapağına alk kuşu resmini koyduk.


AWK’yi geliştirirken öğrendiklerinizden bugün hâlâ işinizde uyguladıklarınız nelerdir?

Araştırma uzmanlık alanlarım algoritmalar ve programlama dilleridir. Ancak pek çok kişi beni, bizzat kullandıkları için, AWK ile tanır. Daha az kişi ise teorik makalelerimle tanır; oysa bu makalelerdeki algoritmaların çeşitli araçlarda uygulanmış hâllerini kullanıyor olabilirler.

AWK’nin güzel yanlarından biri, AWK’yi geliştirdiğimiz dönemde üzerinde çalıştığım verimli dizge desen eşleme algoritmalarını bünyesinde barındırmasıdır. Bu desen eşleme algoritmaları, dizge desen eşleme algoritmalarıyla deneyler yaparken yazdığım iki dizge eşleme aracı olan egrep ve fgrep gibi diğer Unix yardımcı programlarında da bulunur.

AWK’nin temsil ettiği şey, teori ile pratiğin güzel bir evliliğidir. En iyi mühendislik genellikle sağlam bir bilimsel temel üzerine inşa edilir. AWK’de, bilgisayar bilimine dayanan anlatım gücü yüksek gösterimleri ve verimli algoritmaları alıp, pratikte iyi çalışacak şekilde mühendisliğini yaptık.

Harika insanlarla çalışarak bilgelik kazandığınızı düşünüyorum. Brian Kernighan, faydalı programlama dili tasarımında bir ustadır. Dil tasarımına ilişkin temel ilkesi, bir dili basit tutmaktır; böylece dil hem kolay anlaşılır hem de kolay kullanılır olur. Bunun her dil tasarımcısı için mükemmel bir tavsiye olduğunu düşünüyorum.


Yıllar içinde AWK’nin gelişme biçimiyle ilgili sizi şaşırtan şeyler oldu mu?

Bir pazartesi sabahı ofisime girdiğimde, Bell Labs mikro-elektronik ürün bölümünden bir kişinin AWK kullanarak birkaç bin satırlık bir bilgisayar destekli tasarım sistemi yaptığını öğrendim. Kelimenin tam anlamıyla şaşkına döndüm. Kimsenin birkaç satırdan fazla AWK programı yazmayacağını düşünüyordum. Oysa o, bunu çok hızlı ve büyük bir ustalıkla yapabildiği için AWK’de güçlü bir CAD geliştirme sistemi yazmıştı.

En büyük sürprizim, AWK’nin, hiçbirimizin başlangıçta öngörmediği pek çok farklı uygulamada kullanılmış olmasıdır. Ama belki de bu, iyi bir aracın göstergesidir; sonuçta bir tornavidayı yalnızca vidaları çevirmekten çok daha fazla iş için kullanırsınız.


Günümüzde hâlâ AWK ile çalışıyor musunuz?

Rutin veri işleme için çok yararlı olduğu için onu her gün kullanıyorum. Örneğin, makale ve kitap yazarken her zaman kullanırım. Birleştirici dizileri olduğu için, sembolik olarak adlandırılmış şekil ve örnekleri sayısal olarak kodlanmış şekil ve örneklere dönüştüren iki satırlık basit bir AWK programım var; örneğin, Figure AWK-program ifadesini Figure 1.1 hâline çevirir.

Bu AWK programı, makale ve kitaplarımda şekilleri ve örnekleri istediğim gibi yeniden düzenlememe ve yeniden numaralandırmama olanak tanır. Bir keresinde, bu iki satırlık AWK kodundan daha az işlevselliğe sahip 1000 satırlık bir C programı olan bir makale görmüştüm. AWK ile elde edebileceğiniz anlatım ekonomisi gerçekten çok etkileyici olabilir.


AWK’nin üç geliştiricisinden biri olmak kariyerinizi nasıl etkiledi?

Söylediğim gibi, birçok programcı beni AWK ile tanır, ancak bilgisayar bilimi araştırma topluluğu teorik çalışmalarımı çok daha iyi bilir. Bu nedenle başlangıçta AWK’nin geliştirilmesini, düzenli araştırma faaliyetlerimin bir parçası olmaktan ziyade bir öğrenme deneyimi ve bir uğraş olarak gördüm. Bununla birlikte, AWK’nin gerçekleştirilmesi deneyimi, bugün programlama dilleri ve derleyiciler ile yazılım mühendisliğini nasıl öğrettiğimi büyük ölçüde etkiledi.

Fark ettiğim şey şu ki, bazı bilim insanları, birincil araştırma alanlarıyla değil, yararlı araçlarıyla daha geniş kitlelerce tanınıyor. Örneğin Don Knuth, dünyanın önde gelen bilgisayar bilimcilerinden biridir ve bilgisayar algoritmaları alanının kurucularındandır. Ancak teknik makalelerin dizgilenmesi için TeX adlı bir dil geliştirdi. Bu onun ana araştırma hattı değildi, ancak TeX, bilgisayar bilimi dışındaki pek çok bilim insanı tarafından dünya genelinde çok yaygın biçimde kullanılır hâle geldi. Knuth, güzel görünümlü makale ve kitaplar üretmek için kullanılabilecek matematiksel bir dizgi sistemi konusunda tutkuluydu.

Pek çok başka bilgisayar bilimi araştırmacısı da, ana araştırma çizgilerinin bir yan ürünü olarak yararlı programlama dilleri geliştirmiştir.

Bir başka örnek olarak, Bjarne Stroustrup, ağ simülatörleri yazmak istediği için yaygın olarak kullanılan C++ programlama dilini geliştirdi.


Geriye dönüp baktığınızda, AWK’nin geliştirilmesinde farklı yapacağınız bir şey olur muydu?

Farklı yapacağım şeylerden biri, dili geliştirmeye başlarken titiz test süreçlerini devreye sokmak olurdu. Başlangıçta AWK’yi atılabilir bir dil olarak oluşturduk; bu yüzden ilk gerçekleştirimimizin bir parçası olarak sıkı kalite kontrolü yapmadık.

Az önce size AWK’de bir CAD sistemi yazan kişiden bahsetmiştim. Onun başlangıçta bana gelmesinin nedeni, AWK derleyicisindeki bir hatayı bildirmekti. Bana oldukça sert davrandı; hayatının üç haftasını boşa harcadığımı söyledi, çünkü kendi kodundaki bir hatayı aramış ve sonunda bunun AWK derleyicisindeki bir hata olduğunu keşfetmişti!

Bundan sonra Brian Kernighan ile bir araya geldim ve kalite kontrol açısından gerçekten farklı bir şey yapmamız gerektiği konusunda anlaştık. Böylece AWK’nin tüm özellikleri için titiz bir gerileme testi süreci başlattık. O andan itibaren, üçümüzden herhangi biri dile yeni bir özellik eklemeden önce, mutlaka o yeni özellik için bir test yazmak zorundaydı.

Uzun yıllardır Columbia Üniversitesi’nde programlama dilleri ve derleyiciler dersini veriyorum. Dersin, öğrencilerin dörder ya da beşer kişilik ekipler hâlinde kendi yenilikçi küçük dillerini tasarladıkları ve bunun için bir derleyici yaptıkları, bir dönem süren bir projesi var. Derse gelen öğrenciler daha önce hiç bir derleyicinin içine bakmamış oluyor, ancak bu dersi verdiğim tüm yıllar boyunca, dersin sonunda çalışan bir derleyici teslim edemeyen tek bir ekip bile olmadı.

Tüm bunlar, Kernighan ve Weinberger ile AWK’yi geliştirirken edindiğim deneyim sayesinde oldu. Öğrenciler, dil ve derleyici tasarımının ilkelerini öğrenmenin yanı sıra iyi yazılım mühendisliği uygulamalarını da öğreniyorlar. Titiz test, öğrencilerin en baştan itibaren yaptığı bir şey. Ayrıca öğrenciler proje yönetimi, ekip çalışması ve hem sözlü hem yazılı iletişim becerilerinin unsurlarını da öğreniyorlar. Bu açıdan bakıldığında, AWK, programlama dilleri ve derleyiciler ile yazılım geliştirmeyi nasıl öğrettiğim üzerinde önemli bir etki yapmıştır.