1 puan yazan GN⁺ 2024-07-19 | 1 yorum | WhatsApp'ta paylaş
  • AWK'in yaratıcısı Dr. Brian Kernighan ile kısa bir röportaj

    • Dr. Brian Kernighan'a giriş

      • Dr. Brian Kernighan, Bell Labs'ta UNIX'in geliştirilmesine katkıda bulunan Kanadalı bir bilgisayar bilimcisidir
      • Dennis Richie ile birlikte C programlama dili üzerine temel kitaplardan biri olan "The C Programming Language" kitabının ortak yazarıdır
      • 2000 yılından beri Princeton University'de yeni nesil programcılar yetiştirmektedir
      • İlk "Hello World!" programını yazan kişi olarak tanınır
    • AWK'nin yeni fikri

      • AWK'nin temel fikri ilişkilendirmeli dizilerdir (associative arrays)
      • O dönemde bu yeni bir kavramdı, ancak bugün çoğu dilde kütüphane işlevleri olarak (Java veya C++'ta hash map'ler) ya da dilin kendisinde (Perl ve Python'da dictionary'ler) kullanılmaktadır
      • İlişkilendirmeli diziler çok güçlü bir yapıdır ve çeşitli veri yapılarını simüle etmek için kullanılabilir
      • Pattern-action paradigması da o dönemde yaygın olarak kullanılmıyordu, ancak belirli hesaplamaları düzenlemek için etkili bir yöntemdir
    • Programlama dilini oluştururken başvurulan kaynaklar

      • Dr. Kernighan: "Yok"
      • 1970'lerde yeni özel amaçlı diller çok fazlaydı ve başvurulabilecek önceki kaynak neredeyse yoktu
      • Yacc, gramerleri kolayca oluşturup denemeyi mümkün kılan önemli bir araçtı
      • Lex, sözcüksel düzeyde aynı rolü üstlenerek birçok sıkıcı kodu bir kurallar kümesiyle değiştirdi
      • Lex ve Yacc, pattern-action dilinin örnekleriydi ve birbirlerini olumlu yönde besleyen bir döngü oluşturuyordu
    • Programlama dili tasarımıyla ilgilenen gençlere tavsiye

      • Küçük bir özel amaçlı dil tasarlayıp uygulamalarını tavsiye ediyor
      • Bunun çok eğlenceli ve faydalı olduğunu, ayrıca Rust ya da C++'a alternatif bir dil yapmaktan çok daha kolay olduğunu söylüyor
      • Otomatikleştirilebilecek bir iş bulunmasını ve buna uygun basit bir derleyici ile çalışma zamanı oluşturulmasını öneriyor
      • Jon Bentley'nin uzun zaman önce yazdığı ilgili bir makalenin hâlâ geçerli olduğunu belirtiyor
    • Görsel kaynağı

      • Wikimedia Commons

GN⁺ Özeti

  • Dr. Brian Kernighan, UNIX ve C dilinin geliştirilmesine katkıda bulunan önemli bir isimdir ve ilişkilendirmeli diziler ile pattern-action paradigmasını tanıtan AWK dilinin yaratıcısıdır
  • İlişkilendirmeli diziler, bugün çoğu programlama dilinde kullanılan güçlü bir veri yapısıdır
  • Genç programcılar için küçük özel amaçlı diller tasarlayıp uygulamak faydalıdır
  • Yacc ve Lex, gramer ve sözcüksel analizleri kolaylaştıran araçlardır ve pattern-action dilleri için iyi örneklerdir

1 yorum

 
GN⁺ 2024-07-19
Hacker News yorumları
  • Brian Kernighan hakkında pek bilinmeyen çeşitli bilgiler: 2000’de Princeton CS bölümüne katıldı, ancak Bell Labs Research’te olduğu 1993 civarında Princeton’da zaten en az bir ders vermişti.
    Bir öğrenci sık sık pre-1.0 Linux çalışan bir 386sx dizüstü getirirmiş; Brian awk’nin ayrıntılı davranışını hatırlayamadığında o öğrenci awk komutunu çalıştırıp “referans implementasyonu” gösterirmiş. Yani Brian Linux’la görece erken dönemde tanışmış sayılır.
    1994 sonbaharında AT&T’nin ücretsiz telefon numarası rehberini internete koyduğuna dair bir yazı da var: https://www.cs.princeton.edu/~bwk/800.html

    • gawk’ın awk’nin referans implementasyonu mu olduğu, yoksa aslında büyük ölçüde farklı olanın gsed mi olduğu konusunda kafam karışıyor.
    • “O öğrenci”nin yazının sahibinin kendisi olduğu hissi geliyor.
  • İlginizi çekerse Lex Fridman’ın BK ile yaptığı bir buçuk saatlik röportaj epey iyi: https://www.youtube.com/watch?v=O9upVbGSBFo

    • Computerphile YouTube kanalında da BK röportajları çok: https://www.youtube.com/results?search_query=computerphile+kernighan
      Bazen bu çağda yaşıyor olmak inanılmaz bir ayrıcalıkmış gibi geliyor. Bir matematikçinin Euler’le ya da bir fizikçinin Newton’la röportaj yapabilmesine benziyor.
    • Eskiden onun bazı konuşmalarını izleyip pek beğenmemiştim, ama bu röportaj reklamdan sonra gerçek sohbetin başladığı ilk anlardan itibaren oldukça iyi görünüyor.
  • Masterminds of Programming kitabında Aho ve Weinberger’in de yer aldığı daha kapsamlı bir röportaj var. Şiddetle tavsiye ederim.

  • Bu hafta 1983 tarihli The Unix Programming Environment’ı okuyorum; yaklaşık 35 yıl gecikmiş sayılırım. Kitapta awk gerçekten öne çıkıyor ve bugün popüler olan JavaScript, Lua, Python, Perl, Tcl gibi dillere en yakın şey gibi görünüyor.
    awk’nin “ilişkisel dizi” dediği şeye JavaScript doğrudan “nesne” diyor. 1979’daki 7. sürüm Unix’in awk kaynak kodu https://www.tuhs.org/cgi-bin/utree.pl?file=V7/usr/src/cmd/awk ölçütüne göre yalnızca 2680 satır; çalıştırılabilir dosyanın 46KB olup PDP-11’in 64KB adres alanında çalışması şaşırtıcı. O sürümde ve 4 yıl sonra kitapta yer alan awk’de kullanıcı tanımlı fonksiyonlar yokmuş gibi görünüyor; V7 Bourne shell için de durum aynıymış gibi. Ama bc’de vardı.

    • Kullanıcı tanımlı fonksiyonları olmayan awk, old awk ya da tersinden adlandırılmış haliyle oawk olarak da bilinir. Heirloom’da, daha aşina olduğumuz nawk ile birlikte onun devamı gibi görünen bir implementasyon hâlâ duruyor: https://heirloom.sourceforge.net/man/awk.1.html
      46KB’lık çalıştırılabilir dosya Turbo Pascal 3.02’den de biraz büyüktü: https://prog21.dadgum.com/116.html Tabii Turbo Pascal’da regex motoru yoktu.
    • awk bundan da fazlası. function anahtar sözcüğü, for e in a, noktalı virgülsüz sözdizimi, string merkezli tip işleme, delete x[e] gibi öğelere bakınca JavaScript’in temelinin awk olduğu oldukça açık; Brendan Eich de böyle söylemişti: https://brendaneich.com/2010/07/a-brief-history-of-javascript/
    • Aynı kitabı okuyup ben de aynı sonuca vardım. Ardından The UNIX-Haters Handbook’u okuyunca awk gibi Unix araçlarının artık ne yazık ki yeterince iyi olmadığını hissettim.
    • 01983, 01979 gibi yazmak yıl yazma biçimi olmadığı gibi, aslında sayı yazma biçimi olarak da tuhaf.
    • Yılın başındaki 0 yüzünden epey kafam karıştı. Sanki anlaşılması güç bir tarih formatı sandım.
  • Uzun zaman önce birinin Usenet .sig’inde “Perl margarindir, awk tereyağıdır” yazdığını hatırlıyorum. Sırası ters de olabilir.
    Perl’in çok kusuru var, ama Perl’i keşfettikten sonra awk’yi çok daha az kullanır oldum.

  • 80'lerde Avustralya'daki bir Unix konferansında Dr. Kernighan'a imzalattığım K&R kitabım var. En değer verdiğim eşyalardan biri.
    O kitap, Kernighan/Pike'ın The Practice of Programming'i ve Byte dergisi gibi şeyler 1980'lerdeki benim “Stack Overflow”umdu.

  • Onun ilişkisel dizilerden “nispeten yeni bir şey” gibi söz etmesi ilginç. Çünkü Lisp'te neredeyse 20 yıl öncesinden beri vardı.

    • İnternet öncesinde, bir alanda deneyimli ve bilgili olsanız bile başka toplulukların temel kabul ettiği şeylerle hiç karşılaşmamak ya da bunların onlarca yıl içinde yavaş yavaş yayılması kolaydı.
      1990'larda programlamaya başladığımda bile C dünyasının önemli bir kısmı, hash table gibi ilişkisel veri yapılarını biraz egzotik görüyor ve ancak gerçekten başka çare kalmadığında başvurulacak şeyler olarak değerlendiriyordu. Programlama dünyasının hızlı hareket ettiğini düşünürüz ama aslında öyle değil; özellikle o dönemde daha da yavaştı. 1960'lar ve 70'lerde bazı dillerde ortaya çıkan özelliklerin yaygın biçimde benimsenmesi çoğu zaman birkaç on yıl aldı. Lisp'in performansı da o dönemde diğer seçeneklere kıyasla epey kötüydü; bu yüzden kendi özelliklerini tanıtmak için iyi bir örnek olmayabilirdi.
    • The AWK Programming Language'in ilk baskısının ücretsiz PDF'inde, ilişkisel dizilerin SNOBOL4 tablolarından esinlendiği ama daha genel olmadığı yazıyor.
      awk yavaş makineler ve küçük bellekler üzerinde doğdu; dizilerinin özellikleri de bu ortamın sonucuydu. İndekslerin string ile sınırlanması ve sözdizimsel kolaylıklar olsa bile tek boyutla sınırlı kalması bunun örnekleri. Daha genel bir uygulamanın çok boyutlu dizilere ya da en azından dizi elemanı olarak dizi koyma yöntemine izin vereceği söyleniyor. SNOBOL4'ün kararlı sürümü 1967: https://en.wikipedia.org/wiki/SNOBOL
    • Common Lisp'te elbette yerleşik hash table var. MacLisp'te Pitmanual'a bakınca yok gibi görünüyor; ZetaLisp/LML ve InterLisp'te ise var.
      Dolayısıyla Lisp'in yerleşik ilişkisel dizilerine alist veya property list'leri dahil etmezsek, awk'ın doğduğu dönemle hemen hemen aynı zamana ya da biraz sonrasına denk geliyor gibi görünüyor.
    • Lisp'in alist'i de bir anlamda “ilişkisel dizi” sayılır; ancak dil özelliği olmaktan çok listelerle kurulmuş bir yapı ve awk'ta kullanıldığı amaçlar için yeterince verimli değil.
      Herhangi bir dilde doğrusal aramayla birkaç dakika içinde ilişkisel dizi benzeri bir şey yapılabilir; ama bu, SNOBOL4, MUMPS, awk, Perl, Python, Tcl, Lua, JavaScript'te olduğu gibi dil özelliği olarak yerleşik olmasından tamamen farklıdır. İlk dönem Lisp'in veri yapılandırma için sunduğu şeyler cons, car, cdr idi; bunlar aynı şey değil. awk'tan önce Unix içinde de bağlayıcının sembolleri, C derleyicisi, assembler, dosya sistemi dizinleri biçimindeki çekirdek ve shell değişkenleri gibi ilişkisel diziler içeren programlar vardı; ama bunlar programlama dili özelliği olarak sunulmuyordu. Bourne shell, değişken adlarını birleştirerek eval myarray_$key=$val gibi bir şekilde bunu taklit edebildiği için en yakın örnekti; V7 Bourne shell'deki shell değişkeni işleme de ikili ağaç aramasıyla uygulanmıştı.
  • Düzenli ifadelerden lex, yacc ve awk'a uzanan gelişim çizgisi çok etkileyici. Önceki çalışmaların üzerine inşa edilerek daha genel sonuçlar üretildiği fikri ikna edici biçimde ortaya çıkıyor.

  • Tepki çekecek bir söz olacak ama GitHub'da, bu kodlama efsanelerinden daha iyi yazılmış depolara sahip çok sayıda programcı olduğunu düşünüyorum. O zamanlar yetenek havuzu çok daha küçüktü.

    • Günümüz insanlarından kimleri üstün bulduğunu merak ediyorum. Yeni kanın kariyerini ve ne yaptığını takip etmek her zaman eğlenceli.
    • Brian Kernighan'ın tarihin en iyi programcısı olduğunu kimsenin iddia ettiğini sanmıyorum.
    • Safça bir söz ama gerçekten merak ediyorum. Daha iyi olduğunu nasıl ölçeceksiniz?