Neden Common Lisp'i Seçtim
(blog.djhaskin.com)Hoşça kal, Clojure
- Yaklaşık 7 yıl boyunca Clojure kullandım, ancak CLI uygulamalarındaki "yavaş başlangıç hızı" sorunu nedeniyle artık memnun değildim
- babashka gibi projeler vardı, ancak GraalVM'nin native-image gibi araçlarıyla bile yavaş başlangıç hızını çözmek zordu
- "Tek başına çalışabilen ikili dosyaların hızlı açılış süresi" vazgeçilmez bir gereksinim haline geldi ve Clojure'un bunu karşılamadığına karar verdim
Yeni bir Lisp arayışı
- Yeni bir Lisp dili bulmak için çeşitli dilleri inceledim. Mevcut projelerde yaşadığım sorunları çözebilecek bir dil aradım
- "Açıkça tanımlanmış gereksinimler" olmasa da, sonuçta aşağıdaki ölçütleri netleştirdim
- "Bağımsız çalışabilen ve hızlı başlayan çalıştırılabilir dosyalar" makul bir toolchain ile üretilebilmeliydi (Clojure'daki temel şikayetimi çözmek için)
- Emacs kullanamadığım için, Vim'de kullanılabilir olmalıydı
- Windows ve Mac desteği şarttı; yalnızca Linux/POSIX işletim sistemlerini desteklemesi yeterli değildi
- Clojure ve Java örneğinde olduğu gibi, başka büyük topluluk dilleriyle eklenti düzeyinde birlikte çalışabilmesi iyi olurdu
- Çalışma zamanı hızı yeterince yüksek olmalıydı (tercihen en az Clojure seviyesinde)
- Multithreading desteği güçlü olmalıydı ve mümkünse GIL (Global Interpreter Lock) benzeri bir şey olmamalıydı
- Güçlü bir topluluk şarttı
- Zengin bir ekosisteme sahip olmalıydı ve en azından şu kütüphaneler bulunmalıydı:
- JSON ayrıştırma ve serileştirme
- Sqlite3 desteği
- HTTP istek kütüphanesi
- Clojure benzeri işlevsel veri yapıları desteği (ama bu kısım daha az önemliydi)
- İncelediğim diller
- Scheme : r6rs ve r7rs yüzünden standart sorunu nedeniyle topluluğu bölünmüş görünüyordu, bu yüzden bana cazip gelmedi; ayrıca ekosistemi küçüktü ve ihtiyaçlarımı karşılamıyordu
- Racket : Öğrencilik yıllarımda kullandım, ancak çalışma zamanı yavaş ve ağır hissettirdiği için tercih etmedim
- Common Lisp : lisp-lang.org'da keşfettim. Topluluğu ve kaynakları etkileyiciydi, bu yüzden denemeye karar verdim
Magic Happens Here
- Common Lisp öğrenme yolculuğumun tüm hikayesini atlıyorum, ancak öğrenme süreci zorluydu
- Başlangıç kötüydü. Noel'de CLtLv2 kitabını hediye aldım ve onu okuyarak başladım
- Sonrasında HyperSpec'i keşfettim ve okumaya başlayınca öğrenme çok daha iyi bir yöne girdi
- Common Lisp'in bazı benzersiz özellikleri vardı
- Standartlaştırılmış bir dil; bu yönüyle Java'dan çok C'ye benziyor
- Birden fazla derleyici, yorumlayıcı ve runtime bu standardı uyguluyor
- Çeşitli implementasyonları kurup yönetmeye yarayan Roswell gibi araçlar mevcut
- Toplulukta en popüler implementasyonun SBCL olduğu düşünülüyor
- Araştırmaya başlarken Janet'i bilseydim ne olurdu?
- Janet, aşağıdaki özellikleri sayesinde muhtemelen Common Lisp'i öğrenmeden önce beni tatmin edebilirdi
- Kısa ve öz sözdizimi, hızlı ve küçük çalıştırılabilir dosyalar, C FFI desteği
- Eğlenceli bir başlangıç rehberi var
- Benim için önemli olan tüm gereksinimleri karşılıyor
- Yine de neden Common Lisp'i seçtim
- Sonradan öğrendiğim CLOS ve Condition System gibi gelişmiş özellikleri kaçırmış olurdum
- Common Lisp daha güçlü bir dil
Gereksinimler karşılandı
Common Lisp'in gereksinimlerimi karşılayan bir dil olduğunu gördükten sonra onu bir sonraki Lisp dilim olarak seçtim ve hâlâ kullanıyorum. Başlıca gözlemlerim şunlar:
- Bağımsız çalıştırılabilir dosyalar:
- Common Lisp'te bağımsız çalıştırılabilir dosyalar üretmenin çeşitli yolları var
- Dosyaların başlangıç süresi, sıkıştırılıp sıkıştırılmadıklarına bağlı olarak saniyenin küçük bir kısmından neredeyse anında çalışmaya kadar değişebiliyor
- Bu özellik ek bir seçenek değil; Lisp programlarını dağıtmanın ana yöntemlerinden biri olarak tasarlanmış
- Vim iş akışı:
- Pek çok iyi seçenek var, ancak ben kişisel olarak kendi Vim iş akışımı kurup kullanıyorum
- Ayrıca VS Code'un Common Lisp IDE'si olarak kullanılabilecek kadar iyi olduğunu da gördüm
- Windows/Mac/Linux desteği:
- SBCL başlıca işletim sistemlerini iyi destekliyor
- Büyük imperative ekosistemlerle entegrasyon:
- Çoğu implementasyon C diliyle entegrasyonu iyi destekliyor ve bu, CFFI üzerinden kullanılabiliyor
- Çalışma zamanı hızı:
- SBCL'in çalışma zamanı performansı çok hızlı
- Multithreading:
- Common Lisp standardı multithreading için açık bir destek içermese de başlıca implementasyonlar bunu destekliyor
- Bordeaux-Threads adlı kütüphane, farklı implementasyonlar arasındaki farkları azaltıyor
- lparallel, cl-async, blackbird gibi kütüphanelerle multithreading ve asenkron programlama yapılabiliyor
- Güçlü topluluk:
- Topluluk etkinliklerini keşfettim ve katılmaya başladım
- 2024 topluluk anketi sonuçları ve European Lisp Symposium üzerinden Common Lisp topluluğunun ne kadar canlı olduğunu gördüm
- Blog ağı ve subreddit tarafında da topluluk desteği güçlü
- Ekosistem:
- Çoğu kişi Quicklisp kullanıyor, ancak ben paket yönetimi için kişisel olarak OCICL kullanıyorum
- Common Lisp Cookbook, CLiki, Awesome CL gibi kaynaklardan kütüphaneler ve teknik bilgiler keşfedilebiliyor
- Belirli kütüphane desteği:
- JSON: jzon
- Sqlite3: cl-sqlite
- HTTP istekleri: dexador
- İşlevsel veri yapıları: FSet, cl-hamt
Yeni gelenler için notlar
- Common Lisp Discord'unda yeni başlayanların sayısı arttığı için, Common Lisp'i neden seçtiğimi ve ona nasıl adapte olduğumu paylaşmak amacıyla bunu yazdım
- Umarım bu yazı Common Lisp'e ilgi duyanlara yardımcı olur
2 yorum
Hacker News görüşleri
SBCL kullanarak kaynak kod olmadan da bir sorunu çözmüş olması etkileyiciydi. Başka bir teknoloji yığınıyla, kaynak kod yokken bunu bu kadar hızlı düzeltemezdi
Common Lisp'ten Clojure'a geçiş deneyimini paylaşıyor; Clojure'un eşzamanlılık özellikleri cazipti
vim-slimekullanarak üretkenlik ve geliştirici memnuniyeti ciddi ölçüde artmıştıdoom-emacsda vim'e benzer şekilde üretkenliği artırabiliyorduLisp'in değerini anlayamamıştı ama onunla ilgili bir şarkıyı hatırlıyor
Emacs/slime'ın
vim-slime'dan daha iyi bir Lisp IDE'si olduğunu savunuyorCommon Lisp'i hobi olarak kullanıyor ve SBCL REPL içinde C# kodu çalıştırmak istiyor
Clojure ve babashka ile CLI uygulamaları geliştirme deneyimini paylaşıyor
methodicalkütüphanesiyle performansı iyileştirebilmiştinative-imagekullanırken sorun yaşamıştı ve Clojure'un neredeyse kusursuz bir dil olduğunu düşünüyorJanet diline ilgisini dile getiriyor; projenin GitHub README ve FAQ bölümlerinin faydalı olduğunu belirtiyor
Özellikle bir vim hayranı olan yazarın etkisiyle, kendisine Lisp öğrenme isteği uyandıran deneyimini paylaşıyor
Lisp'in değerini anlayamadım ama onunla ilgili şarkıları hatırlıyorum... Lisp hakkında çok şarkı var; YouTube'da
Land of Lispdiye bir şarkı da var ;-)