← A–Z Röportajları

YACC

Yacc’ı geliştiren Stephen C. Johnson, AT&T mezunudur ve hâlen The MathWorks’te çalışmakta, burada günlük olarak MATLAB ile çalışmaktadır. Computerworld, yakın zamanda Al Aho ve Dennis Ritchie ile çalışmaya dair düşüncelerini ve Bison’un geliştirilmesini öğrenmek için bu fırsatı yakaladı.

Ayrıştırıcı üretecinize Neden Başka Bir Derleyici-Derleyici anlamına gelen bir kısaltma adını vermeye sizi ne yöneltti?

Bell Labs’ta, özellikle Multics projesinin bir parçası olarak kullanılan başka derleyici-derleyiciler vardı. McClure’un TMG’sinin bir sürümüne aşinaydım. Jeff Ullman programım hakkında duyduğunda şaşkınlıkla, “Bir tane daha derleyici-derleyici mi?” dedi. Böylece isim ortaya çıktı.

YACC’nin geliştirilmesine ne sebep oldu? AT&T Labs’ta belirli bir projenin parçası mıydı?

“Proje” kulağa çok resmî geliyor ve bu Bell Labs tarzı değildi. Bilgisayar Bilimleri Araştırma grubu kısa süre önce AT&T’yi Multics için milyonlarca dolar harcamaya ikna etmişti ve bunun gösterecek pek bir sonucu yoktu. Bazı çalışma arkadaşlarım grubun dağıtılabileceğini düşünüyordu. Ancak genel olarak Bell Labs zeki insanları işe alır, ortada pek çok ilginç problem bırakır ve insanlara faydalı işler yapmaları için yıllar tanırdı. Günümüzde neredeyse bilinmeyen bir ortamdır.

yacc benim için çok basit ve belirli bir problemi çözme girişimi olarak başladı.

Hangi problemi çözmeye çalışıyordunuz?

Dennis Ritchie, GE (daha sonra Honeywell) sistemimizde çalışan B adlı basit bir dil yazmıştı ve ben de bunu bazı sistem programları yazmak için kullanmaya başlamıştım. Dennis Unix üzerinde çalışmaya başlayınca derleyici sahipsiz kaldı ve ben onu benimsedim. Bilgisayardaki özel-VEYA (exclusive-or) işlemine erişmem gerekiyordu ve B’de bunu ifade etmenin bir yolu yoktu. Bu yüzden Dennis ile konuşarak bu işleç için uygun bir adın ne olacağına karar verdik ve ben de onu derleyiciye eklemeye koyuldum. Yaptım, ama hiç eğlenceli değildi.

Bir gün öğle yemeğinde bundan yakınıyordum ve Al Aho, “Knuth’un bir makalesi var – sanırım daha iyi bir yolu var,” dedi. Bunun üzerine Al, B ifade dilbilgisi için tabloları oluşturmayı kabul etti. Ona yaklaşık 30 dilbilgisi kuralı verdiğimi hatırlıyorum; depoya çıktı, yaklaşık 2’ye 3 fit boyutlarında büyük bir kâğıt aldı, karelere böldü ve içine girdiler yapmaya başladı. Onu bir saat izledikten sonra, “Bu biraz zaman alacak,” dedi. Gerçekten de yaklaşık iki gün sürdü.

Sonunda Al kâğıdı zaferle bana verdi ve ben, “Bununla ne yapacağım?” dedim. Tabloyu çözümleyiciyi yönlendirmek için nasıl yorumlayacağımı bana öğretti, ancak tabloyu yazıp ayrıştırmayı denediğimde hatalar vardı. Bulduğumuz her hata, Al’ın bir saatini daha alıyor ve tabloya birkaç satır daha eklenmesini gerektiriyordu. En sonunda, üçüncü kez ona “Tabloyu yaparken ne yapıyorsun?” diye sordum. Bana anlattı ve ben de “Bunu yapan bir program yazabilirim!” dedim. Ve yazdım.

YACC’ın geliştirilmesi sırasında özel olarak yaşadığınız sorunlar oldu mu?

Özellikle Unix’e geçtikten sonra, bellek boyutu ve performans bir takıntı hâline geldi. Program ve veriyi tutmak için en fazla 64K baytımız vardı ve Fortran çalıştırmak istiyorduk.

yacc ilk çalıştığında çok yavaştı – Knuth’un fikirlerini son derece birebir uyguluyordu. 50 kurallı bir dilbilgisi çalıştırmak yaklaşık 20 dakika sürüyordu; bu da beni çalışma arkadaşlarım arasında pek popüler yapmıyordu (“Lanet olsun, Johnson yine yacc çalıştırıyor!”). Boyut ve alan özelliklerini iyileştirmeye koyuldum. Sonraki birkaç yıl içinde programı ondan fazla kez yeniden yazdım ve onu yaklaşık 10.000 kat hızlandırdım. Hızlandırmalarımın birçoğu, şu ya da bu köşeyi kesebileceğimizi ve yine de geçerli bir ayrıştırıcıya sahip olacağımızı kanıtlayan teoremler ortaya koymayı içeriyordu. Önceliğin eklenmesi bunun bir örneğiydi.

Ben yacc’ı yazarken Dennis B üzerinde aktif olarak çalışıyordu. Bir gün geldim ve yacc derlenmiyordu – yer kalmamıştı. Meğer sembol tablosundaki her bir yuva kullanılmaktaymış. Bir önceki gece Dennis B’ye for deyimini eklemişti ve “for” sözcüğü bir yuva kaplayınca yacc artık sığmaz olmuştu.

Küçük bellek büyük bir sıkıntıydı, ama aynı zamanda programlarımızdan zihinsel dağınıklığı ayıklayan bir disiplin dayatıyordu ve bu çok iyi bir şeydi.

YACC’ı baştan geliştirme şansınız olsaydı, farklı yapacağınız bir şey olur muydu?

$1, $2, $$ vb. dışında bir gösterim bulmak için daha çok uğraşırdım. Basit ve sezgisel olmasına rağmen, bu gösterim dilbilgileri geliştikçe hata kaynağı oluyor.

YACC kullanan gördüğünüz en ilginç program hangisiydi?

Gördüğüm en ilginç kullanımlardan bazıları çok erken döneme aitti. Brian Kernighan, matematiksel denklemleri dizen eqn aracını yazdığında erken bir kullanıcıydı. Mike Lesk ise İngilizceyi ayrıştırmaya çalışmak için bir dilbilgisi yazdı. Her iki dilbilgisi de son derece belirsizdi ve yüzlerce çakışma içeriyordu. Al Aho onları düşündüğünde döküntü çıkaracak gibi olurdu, ama pratikte gayet iyi çalıştılar ve bana yacc’ın çok zorlu bazı pratik uygulamalarını sağladılar.

YACC’ın başlangıçta amaçlamadığınız bir şekilde kullanıldığını hiç gördünüz mü? Öyleyse neydi? Ve işe yaradı mı, yaramadı mı?

Mike’ın İngilizceyi ayrıştırmak için yacc kullanması buna bir örnekti. yacc tablolarını kullandı, ancak aynı anda birden fazla ayrıştırmayı elde tutan bir ayrıştırıcı yazdı. Pek başarılı olmadı, çünkü oldukça basit cümlelerin bile onlarca geçerli ayrıştırması vardı. Oynayabileceği yalnızca 64K bellekle, bunları çözmek için yapabileceği fazla bir şey yoktu.

Abraxas pcYACC ve Berkeley YACC gibi diğer programlar Unix sistemlerinde varsayılan ayrıştırıcı üreteçleri olarak öne geçtiğine göre, bugün ne hissediyorsunuz?

Aslında, 35 yıl sonra yacc’ın hâlâ ortalıkta olmasına şaşırıyorum. Bu, Knuth’un öngörülerine bir saygı duruşu. Ayrıca şunu da söylemeliyim ki yacc’ı çok hızlı ve güçlü hâle getirmek için harcadığım emek, onu aksi takdirde olacağından çok daha uzun süre ayakta tuttu.

Bison’ın geliştirilmesini öngörmüş müydünüz?

GNU’nun Unix’i çoğaltma isteği göz önüne alındığında, Bison kaçınılmazdı diye düşünüyorum. Bazı GNU insanlarının, GNU’nun Linux’a katkısının tanınmamasına bu kadar kızmasına şaşırıyorum; oysa Unix üzerinde çalışan bizlere olan borçlarını kendileri de yeterince kabul etmemiş durumdalar.

Sizce YACC, dil geliştirmeye nasıl kalıcı bir miras bıraktı?

yacc, dil uzmanı olmayan pek çok kişinin üretkenliklerini artırmak için küçük diller (alan-özgül diller olarak da adlandırılır) yapabilmesini mümkün kıldı. Ayrıca yacc’ın tasarım tarzı – programı sağlam teori üzerine kurmak, teoriyi iyi uygulamak ve teoriye uymayan yapmak istedikleriniz için bol miktarda kaçış noktası bırakmak – pek çok Unix aracının benimsediği bir yaklaşımdı. O günlerin atmosferinin bir parçasıydı ve bu tasarım tarzı o zamandan beri çalışmalarımın çoğunda varlığını sürdürdü.

Ayrıştırıcı üreteçlerinin geleceğini nerede görüyorsunuz?

yacc’ın temelindeki fikirler ve teknikler temeldir ve bilgisayar bilimi ile mühendisliğin birçok alanında uygulama bulur. Umut vadeden bir uygulama alanı olarak, GUI’leri tasarlamak için derleyici tasarım tekniklerinin kullanılmasını düşünüyorum – bence GUI tasarımcıları hâlâ GUI’leri, artık işe yaramayacak kadar karmaşık hâle gelmiş arayüzler için, bir tür assembly diline eşdeğer yöntemlerle yazıyorlar.

YACC’ın geliştirilmesi ve kullanımı açısından en çok neyle gurur duyuyorsunuz?

Bence bilişim bir hizmet mesleğidir. Yazdığım programlar (yacc, Lint, Portable C Compiler) başkaları için faydalı olduğunda en mutlu oluyorum. Bu bağlamda, yacc’ın Unix ve C’nin yayılmasına yaptığı katkı, en çok gurur duyduğum şeydir.

Bilgisayar programlama dillerinin gelecekte, özellikle önümüzdeki 5 ila 20 yıl içinde, nereye gittiğini düşünüyorsunuz?

Kısıt dillerini seviyorum; özellikle de paralel donanıma kolayca uyum sağlayabileceklerini düşündüğüm için.

Yeni yetişen programcılara herhangi bir tavsiyeniz var mı?

Bir programı çok fazla kez yeniden yazamazsınız; özellikle de her seferinde daha küçük ve daha hızlı olmasını sağlıyorsanız. Bir şeyin bir büyüklük mertebesi daha hızlı hâle geldiğinde niteliksel olarak farklılaştığını defalarca gördüm. İki büyüklük mertebesi daha hızlıysa, olağanüstü hâle geliyor. Google’ı düşünün; sorguların yanıtlanması 25 saniye sürseydi nasıl olurdu?

Bir tavsiye daha: Bir teorisyeni öğle yemeğine çıkarın.