Öncelikle, izleyeceğimiz yöntemden biraz bahsedeyim. Burada kullanacağımız yöntem, çok orjinal bir yöntem değil aslında. Vaughan Pratt tarafından Recursive Descent ve Operator Precedence yöntemlerinin güzel yanlarını birleştiren bir parse yöntemi, 1973 yılında bir sempozyumda sunuldu. 2007 yılında, Douglas Crockford bu yöntemi kullanarak, Top Down Operator Precedence adında bir yazı yazdı. Bu yazıda, bir javascript parser'ı örnek gösteriliyordu. Bundan esinlenen Fredrik Lundh Simple Top-Down Parsing in Python yazısında, bu yöntemi kullanarak Python'un bir kısmını parse edebilen bir program örneği ve benchmarkları yayınladı. Ben burada, bu yöntemi anlaşılır bir şekilde sunmaya çalışacağım. Bahsi geçen Parser ve Lexer'ın kısmen bitmiş hallerine Lexer-Parser github deposu üzerinden ulaşabilirsiniz.
Aslında, geçen gün yazdığım Lexer için yazdığım Parser'ı tanıtacaktım. Parse kavramı üzerine internetten kolayca kaynak bulunabileceğini düşündüm. Ancak, biraz google araması yaptığımda karşıma gelen Türkçe sonuçlar pek tatmin edici olmadı. Bu sebeple, önce tanıtıcı bir yazıyla başlamak istedim. Bu yazının konuları şunlar olacak.
Bugünkü yazılar biraz spam gibi oldu kusura bakmayın, ama lexical analiz 2'deki lexer'a yapılabileceğinden bahsettiğim birkaç eklemeyi de göstereyim dedim.
Satır Sayma
Satır sayma konusu çok kolay,
_lexInitial ve
_lexString yeni satırla karşılaştıklarında, bir değişkeni artıracak.
Ayrıca, gönderdiğimiz tokenlere satır bilgisi de ekleyeceğiz.
lexical analiz karakter dizisini, token dizisine çevirme işlemine deniyor. Token dediğimiz şey ise, bir veya daha fazla karakterden oluşan ve grup olarak önem taşıyan karakter dizisi demek. Bu analizi yapan kodlara lexer deniyor. Çoğu zaman, lexer'ların oluşturduğu token dizisi, parser tarafından işlenir. Bunlar bir dil oluşturmak ve bu dili analiz etmek için kullanılır.
Hazır tatil, boş vaktim varken Haskell öğrenmeye bir şans daha vereyim dedim. Bir yandan öğrenirken, bir yandan da ufak bir Haskell tanıtımı yapayım (bkz: araklamak).
Haskell tamamen fonksiyonel bir dil. İmperatif dillerde, programa hangi adımları izleyeceğini adım adım anlatıp, neyin nasıl yapılacağını anlatıyoruz. Fonksiyonel dillerde ise, neyin ne olduğunu belirtiyoruz, nasıl yapılacağına program kendi karar veriyor.
Haskell tembel bir dil. Haskell size bir sonuç göstermek zorunda kalmadıkça, fonksiyon çalıştırmaz. Örneğin, bir liste döndüren bir fonksiyonu çalıştırıp, ilk iki elemanını ekrana basmak istediğinizde, Haskell ilk iki elemanı bulacak kadar fonksiyonu çalıştırıp, orada bırakıyor.
Haskell, statik tipleme kullanıyor. Yani, derleme sırasında bir takım hataları yakalayabiliyorsunuz. Ayrıca,
C'nin aksine, çıkarım yapma yoluyla veri tiplerini bulabiliyor. Örneğin,
a = 5 derseniz,
a'nın bir int
olduğunu belirtmenize gerek yok, Haskell kendi anlıyor.
Haskell zarif ve ifade gücü yüksek bir dil. Python'dan hatırlayacağınız, list comprehension yapısı Haskell kaynaklı. Ne kadar az kod, o kadar kolay bakım gereksinimi ve o kadar az bug demek.
Yazdığı kodları Windows'da son kullanıcıya dağıtmak isteyen Pythoncular bildiğim kadarıyla, iki farklı yol izliyor:
- Kullanıcıdan Python yüklemesini istemek
- cx_freeze, py2exe gibi programlarla Python ve yazılan uygulamayı tek dosya altında birleştirmek
Bu iki yöntemin de kendine göre bir takım sıkıntıları var. İlk yöntem, son kullanıcı açısından yorucu olabilir. Aynı zamanda, son kullanıcının Python'u kuracak ve sistem yoluna ekleyecek kadar bilgili olmasını gerektiriyor.
İkinci yöntem ise, hem bir açıdan kodları sakladığı için açık kaynak felsefesiyle ters düşüyor, diğer yandan bozuk exe dosyası üretme riski var. Ayrıca, şahsen hiç estetik bulmuyorum bu yöntemi.
Bu yazıda, muhtemel bir üçüncü yöntemden bahsedeceğim.
Python kullanım alanları yazısında, Python programlama dilinin hangi alanlarla kullanıldığına değinmiştim. Bu yazıda ise, Python ile neler yapılabileceği daha iyi anlaşılsın diye, Python ile yazılmış programlardan bahsedeceğim.
-
Reddit başlangıçta lisp ile, daha sonra baştan Python ile yazılmış. Python ile yazılım geliştirme süreci çok hızlı ve web uygulaması geliştirme çok yaygın olduğu için tercih etmişler. İsteyenler reddit kaynak kodlarını okuyabilir.
-
Django Siteleri sayı bakımından oldukça fazla. djangosites adresinde kayıtlı 4500 adet websitesi var.
Ben iyi bir programcı olduğumu iddia edemem. Ancak, kendi çabalarıyla programcılık hakkında bazı şeyler öğrenmiş ve hayatının belirli bir kısmında, amatör olarak da olsa, programcılıkla uğraşmış biriyim. Bu maceram boyunca, edindiğim deneyimler doğrultusunda, doğru veya yanlış, "iyi programcı nasıl olunur?", "iyi programcı olmak için neler yapmak gerekir", "yazılım konusunda kendini geliştirme nasıl mümkün olur" gibi sorulara bir cevap yazıyorum. Yazı iki kısımdan oluşuyor; önce bana göre iyi bir programcı olmak için ihtiyaç duyacağınız şeylerden bahsedeceğim, sonra kendinizi geliştirebilmeniz için bazı adımlar tavsiye edeceğim. Ancak, bunlara geçmeden önce şunu da belirtmek istiyorum ki, bunları benim gibi bu işin okulunu okumamış ve kendi çabalarıyla programlama konusunda bir yerlere gelmek isteyen kişileri düşünerek yazdım. Çünkü, burada tavsiye edeceğim adımlar, zaten bilgisayar mühendisliği bölümlerinde derslerde veriliyordur diye düşünüyorum. O yüzden, bu yazı okullulara çok hitap etmeyebilir.
Bence programcılar iki kısımdan oluşuyor. İlk grup, programcılığı programcılık için yapanlar grubu. Bu gruptaki kişiler, sırf eğlence olsun diye program yazan, farklı ve yeni şeyler denemeye yatkın kişilerdir. Diğer grup ise, programcılığı bir araç olarak kullanan ve programcılık aracılığıyla bir işini halletmesi gereken kişilerdir. Bunlara örnek olarak, bilimsel amaçlarla programcılık yapanları verebiliriz. Bu yazı ilk gruba yönelik olacak.