Merhaba Pardus topluluğu,
Bu yazıda iki şeyi anlatacağım: önce LOOK’u, yani baştan sona web için tasarlanmış açık kaynak bir programlama dilini; sonra da tamamen LOOK ile yazılmış bir içerik yönetim sistemi olan LookPress’i. Yazı uzun, çünkü “şunu da destekliyor” listesi vermek yerine dilin nasıl düşündüğünü göstermek istiyorum. Kod örneklerinin hepsi gerçek LOOK çalışma zamanında denenmiştir.
1. Neden web’e özel bir dil?
Bugün bir web uygulaması yazmak için genelde şu katmanları üst üste koyarız: bir dil, onun üstüne bir framework, onun yanına bir paket yöneticisi, veritabanı sürücüsü, oturum kütüphanesi, şablon motoru, kuyruk sistemi… Her biri ayrı kurulur, ayrı güncellenir, ayrı denetlenir.
LOOK farklı bir yerden başlıyor: web’in ihtiyaç duyduğu şeyler dilin kendisinde. Yönlendirme (routing), veritabanı, oturum, JWT, doğrulama, önbellek, kuyruk, WebSocket, SSE — bunlar sonradan eklenen kütüphaneler değil, dilin yerleşik parçaları. Bir .lk dosyası yazarsınız ve çalıştırırsınız.
LOOK başka bir dilin yerine geçmek için yazılmadı; kendi çözümünü sunan, kendi başına bir dil. Aşağıdaki karşılaştırmalar yalnızca ölçüm ve bağlam içindir.
2. Kısaca LOOK
| Ne | Web betik dili |
|---|---|
| Yazıldığı dil | C++23 |
| Sürüm | 1.0.0 |
| Lisans | Apache 2.0 |
| Dağıtım | Tek ikili dosya (lk, lk-fcgi), Docker imajı |
| Yerleşik kütüphane | 29 modülde 237 fonksiyon |
| Veritabanı | MySQL, MariaDB, PostgreSQL, SQLite — sürücüler dilin içinde |
| Bağımlılık | Minimal dış çalışma-zamanı bağımlılığı |
“Sürücüler dilin içinde” ifadesi şunu anlatıyor: MySQL ve PostgreSQL’in ağ protokolü dilin çekirdeğinde uygulanmış. Yani libmysqlclient ya da libpq kurmanız gerekmiyor.
3. 60 saniyede deneyin (Pardus dahil)
En garantili yol Docker. Pardus’ta:
sudo apt install docker.io
sudo docker run -p 8080:7400 codlook/look
Başka bir uçbirimde:
curl localhost:8080
Canlı bir JSON yanıtı alırsınız. Bu kadar — bir web sunucusu çalışıyor. Kendi uygulamanızı çalıştırmak için klasörünüzü bağlayın (LOOK /app/index.lk dosyasını servis eder):
sudo docker run -p 8080:7400 -v "$PWD/app:/app" codlook/look
Docker kullanmak istemezseniz Releases sayfasından Linux paketini indirip kurabilirsiniz:
unzip look-lang-linux-1.0.0.zip && cd look-lang-linux-1.0.0
sudo bash install.sh
Not: Resmi paket Ubuntu / AlmaLinux / RHEL üzerinde doğrulanmış durumda. Pardus Debian tabanlı olduğu için aynı yolun çalışması beklenir; deneyip sonucu bu başlık altında paylaşırsanız çok sevinirim.
4. Dile hızlı bakış
Sözdizimi tanıdık gelecek. Değişkenler $ ile başlar, ; isteğe bağlıdır, yorumlar # ile yazılır:
use string
use json
fn selamla($ad) {
return "Merhaba, " . $ad . "!"
}
$kisiler = ["Ayşe", "Mehmet"]
foreach ($kisiler as $k) {
print(selamla($k))
}
# İlişkisel dizi (anahtar => değer) ve JSON
$urun = ["ad" => "Çay", "fiyat" => 45]
print(json::encode($urun)) # {"ad":"Çay","fiyat":45}
print($urun.ad) # nokta ile erişim
# Kapanışlar (closure) ve ok fonksiyonları
$kare = fn($n) => $n * $n
print($kare(7)) # 49
Birkaç tasarım kararı özellikle dikkat çekiyor:
-
Tanımsız değişken hatadır. Yazım hatası yaptığınız bir değişken sessizce
nullolmaz;Undefined variable: $xhatası alırsınız. Bu, web uygulamalarındaki en sinsi hata sınıflarından birini kapatır. -
Yerleşik fonksiyonlar
modül::fonksiyonbiçiminde çağrılır (string::upper,date::format). Kendi yazdığınız fonksiyonlar düz adlarıyla çağrılır. -
Her dosya tek başına çalışır.
lk rapor.lkyazarak bir betiği komut satırından çalıştırabilirsiniz; cron işleri ve CLI araçları için ayrı bir düzene gerek yok.
5. Web birinci sınıf vatandaş
LOOK’ta bir web servisi yazmak için framework kurmazsınız. Yönlendirme dilin bir parçası:
# Servisi bir kez kaydet, her route'ta kullan
app::set("db", db::connect(env("DB_DSN")))
route("GET", "/urunler", function() {
$rows = db::query(app::db(), "SELECT id, ad, fiyat FROM urunler", [])
response::json(["ok" => true, "data" => $rows])
})
# Yol parametresi
route("GET", "/urun/{id}", function() {
$rows = db::query(app::db(), "SELECT * FROM urunler WHERE id = ?", [request::param("id")])
if (count($rows) == 0) {
return response::error(404, "Ürün bulunamadı")
}
response::json($rows[0])
})
# Tek satırlık route
route("GET", "/ping", fn() => response::json(["ok" => true]))
# Grup: ortak önek + ortak ara katman (middleware)
$yetki = function() {
if (request::header("X-Api-Key") != env("API_KEY")) {
response::json(["hata" => "yetkisiz"], 403); stop()
}
}
route::group("/yonetim", [$yetki], function() {
route("GET", "/kullanicilar", function() { /* -> /yonetim/kullanicilar */ })
})
route("404", fn() => response::error(404, "Bulunamadı"))
Burada dikkat edilecek şey sorgunun parametreli olması: ? yer tutucusu ve ayrı bir değer dizisi. SQL enjeksiyonuna karşı doğru yol, dilin varsayılan yolu.
6. Şablon motoru
HTML üretimi için ayrı bir kütüphane gerekmez. Şablonlar kalıtımı, döngüyü ve koşulu destekler:
{#extends "views/layout"}
{#block content}
{#each yazilar as y}
<h2><a href="/blog/{$y.slug}">{$y.baslik}</a></h2>
{#empty}
<p>Henüz yazı yok.</p>
{/each}
{/block}
Kritik ayrıntı: {$degisken} çıktıyı varsayılan olarak HTML-kaçışlar. Ham HTML basmak için bilinçli olarak {!$degisken} yazmanız gerekir. Yani XSS’e karşı güvenli davranış varsayılan, güvensiz davranış ise açıkça istenmesi gereken bir şey.
7. “Piller dahil” ne demek?
29 yerleşik modülden bazıları:
| Alan | Modüller |
|---|---|
| Web | request, response, route, session, cookie, template, html |
| Veri | db, cache, json, validator |
| Güvenlik | auth (PBKDF2), crypto (SHA-256, HMAC, güvenli rastgele, UUID), JWT |
| Arka plan | queue, jobs, parallel (+ kanallar) |
| İletişim | http (istemci), mail, WebSocket, SSE |
| Genel | string, array, math, date, type, file, log |
Bunlara ek olarak gömülü bir SMTP sunucusu (STARTTLS, DKIM imzalama ve doğrulama, SPF denetimi) ve hız sınırlama (token bucket, IP başına + genel) da çekirdekte geliyor. IMAP sunucusu şimdilik yalnızca okuma destekli bir ilk aşamada.
8. Çalışma zamanı ve araçlar
LOOK kodu varsayılan olarak bir bytecode sanal makinesinde çalışır; ayrıca ağaç-yürüyen bir yorumlayıcı (interpreter) da vardır ve gerektiğinde ona geçilebilir.
| Araç | Ne işe yarar |
|---|---|
lk dosya.lk |
Betiği çalıştırır |
lk-fcgi |
Web sunucusu: FastCGI ya da --mode http ile doğrudan HTTP |
lk test |
Test çalıştırıcı |
lk repl |
Etkileşimli kabuk |
lk --check |
Yalnızca sözdizimi denetimi (CI için ideal) |
lk fmt |
Tek kanonik biçimlendirici, seçeneksiz |
VS Code için canlı sözdizimi denetimi yapan bir eklenti de mevcut.
9. Performans — yöntemiyle birlikte
Rakam vermeden önce yöntemi söylemek gerekir; yoksa rakamın anlamı olmaz. Projenin yayınladığı ölçüm şöyle:
-
Doğrudan portta yaklaşık 9.800 istek/sn.
-
Gerçek veritabanı yükünde (50 bin satır üzerinde JOIN’li bir QR menü sorgusu; 1 CPU / 1 GB; aynı makine, aynı şema ve sorgu; iki tarafta da
CPUQuota=100%veMemoryMax=1G; eşit havuz boyutu 32; TLS yok; eşzamanlılık 100; üç koşunun en iyisi): LOOK 2.837 istek/sn, PHP 8.3 + JIT + FPM 2.184 istek/sn. Bellek tarafında LOOK 9–29 MB, PHP 43–47 MB.
Bu bir “kim kimi geçti” iddiası değil, belirli bir iş yükünde belirli koşullarla alınmış bir ölçümdür. Kendi iş yükünüzde sonuç farklı çıkabilir; doğrusu kendi ölçümünüzü yapmanızdır.
10. Güvenlik yaklaşımı
Bir dilin “güvenli” olduğunu söylemek kolay, göstermek zordur. LOOK tarafında somut olarak yapılanlar:
-
Şablonlarda varsayılan kaçışlama, sorgularda parametre bağlama.
-
Çerezlerde güvenli varsayılanlar.
-
Ağ protokolü ayrıştırıcıları için fuzzing (libFuzzer), bellek ve eşzamanlılık hataları için sanitizer’lar (ASan / UBSan / TSan).
-
Veritabanı uyumluluğu varsayılmıyor; CI’da gerçek sunucu sürümlerine karşı sınanıyor (MySQL 5.7–9.x, MariaDB 10.11–12.x, PostgreSQL 14 ve 18).
-
Bilinen sınırlar gizlenmiyor;
SECURITY.mdiçinde ayrı bir “Known limitations” bölümü var. Örneğin uzak MySQL bağlantısı varsayılan olarak şifresizdir; şifrelemek içinmysqls://, sunucuyu doğrulamak için?tls=verifykullanmanız gerekir.
LookPress: LOOK ile yazılmış bir içerik yönetim sistemi
Bir dilin gerçekten işe yarayıp yaramadığını anlamanın en iyi yolu onunla gerçek bir ürün yazmaktır. LookPress bu amaçla doğdu: baştan sona LOOK ile yazılmış, modül tabanlı bir içerik yönetim sistemi.
Önemli bir ilke: LookPress, LOOK çekirdeğine hiç dokunmadan yazıldı. Yani PHP ile bir ürün nasıl geliştirilirse, LookPress de LOOK ile öyle geliştirildi. Bu, dilin kendi başına yeterli olup olmadığının dürüst bir sınavı.
Temel fikir: her şey bir modül
Bir otel sitesi, bir inşaat firması sitesi, bir haber portalı ve bir mağaza ilk bakışta çok farklı görünür. Ama LookPress’e göre hepsi aynı şeydir: modüllerden oluşan bir site.
Bir modül = bir içerik tipi + onun yapılandırması. Yönetim panelinden alanlarını tanımlayarak yeni bir modül oluşturursunuz (örneğin “Projeler”: başlık, açıklama, görsel, galeri). Kod yazmadan şunları elde edersiniz:
-
Yönetim panelinde liste ekranı (arama, sayfalama, seçtiğiniz kolonlar ve filtreler)
-
Alan tanımlarından otomatik üretilen form
-
Sürüm geçmişi ve tek tıkla geri dönüş
-
Zamanlanmış yayın
-
JSON okuma API’si (
/api/projeler) -
İsteğe bağlı olarak sitede yayınlanan sayfalar
Desteklenen alan tipleri: metin, uzun metin, markdown, blok içerik, sayı, ondalık, evet/hayır, tarih, seçim, görsel, galeri, ilişki, URL, e-posta, telefon, renk ve tekrarlayan satırlar.
Yönetim paneli
Sol menü modül yapılandırmasından otomatik üretilir ve altı gruba ayrılır:
| Grup | İçerik |
|---|---|
| Kurumsal | Sayfalar, slider, sabit alanlar |
| İçerik Yönetimleri | Haberler, duyurular, galeri, videolar, projeler, etkinlikler… |
| İletişim | İletişim formu, iş başvuruları, destek talepleri |
| E-Ticaret | Ürünler, kategoriler, markalar, varyantlar, siparişler, kuponlar |
| Ayarlar | Genel, SEO, tema, dil, modül yönetimi |
| Kullanıcı Yönetimi | Yöneticiler, üyeler, roller, yetkiler |
Bileşenlerle sayfa kurma
Sayfalar düz metin kutusuyla değil, bloklarla kurulur. On altı blok tipi var: başlık, paragraf, görsel, galeri, buton, alıntı, liste, ayraç, hero, slider, sütunlar, modül listesi, form, harita, video ve HTML.
Örneğin bir ana sayfa şöyle kurulabilir: hero → slider → son üç haber → iki sütun → projeler → iletişim formu → harita. “Modül listesi” bloğu herhangi bir modülün son içeriklerini kart olarak gösterir; yani bir sayfaya haber akışı eklemek için kod yazmazsınız.
Diğer özellikler
-
E-ticaret: iç içe kategoriler, markalar, ürün özellikleri, fiyat ve stok takipli varyantlar, sepet, sipariş, kupon.
-
Üyelik: kayıt, giriş, profil, sipariş geçmişi, şifre sıfırlama.
-
Formlar: gönderimler için durum akışı (açık / işlemde / kapalı), notlar ve CSV dışa aktarma.
-
Çok dil ve SEO: meta etiketleri, Open Graph, JSON-LD, site haritası, RSS.
-
Güvenlik: tüm formlarda CSRF koruması, giriş denemelerinde hız sınırı, güvenlik başlıkları (CSP, X-Frame-Options, HSTS), rol tabanlı yetkilendirme.
-
İşletim: tek komutla yedekleme ve geri yükleme, Docker ve Plesk kurulumu.
Kurulum
git clone https://github.com/codlook/lookpress && cd lookpress
sudo docker compose up # http://localhost:8080
İlk açılışta dolu bir kurumsal demo site gelir. Yönetim paneli /admin adresindedir. Varsayılan olarak SQLite kullanılır, yani geliştirme için veritabanı sunucusu kurmanız gerekmez; gerçek kullanımda DB_DSN değişkenini mysql://… ya da postgres://… olarak ayarlarsınız.
Canlı demo: https://test.codlook.com
Rakamlarla
LookPress’in tamamı yaklaşık 6.100 satır LOOK kodu (22 dosya) ve 2.100 satır şablon (40 dosya). Bu hacimde bir içerik yönetim sistemi, e-ticaret, üyelik ve yönetim paneli barındırması, “web ihtiyaçları dilin içinde” fikrinin pratikteki karşılığı.
Dürüst durum ve sınırlar
Bir projeyi anlatırken eksiklerini söylememek okuyucuya haksızlık olur:
-
LOOK genç bir dil. 1.0.0 sürümünde; ekosistemi ve topluluğu köklü dillerle kıyaslanamaz. Paket sayısı az.
-
LookPress aktif geliştirme aşamasında. Ödeme sağlayıcısı entegrasyonu, WordPress içe aktarıcı ve tam metin arama henüz tamamlanmadı.
-
Büyük uygulamalarda bilinen bir sorun var: LOOK 1.0’ın bytecode sanal makinesi, LookPress boyutundaki bir uygulamayı doğru derleyemiyor. Bu yüzden LookPress şu an yorumlayıcı modunda çalışıyor; sonuç doğru, ama istek başına daha yavaş. Çekirdek tarafında düzeltilmesi gereken bir konu.
-
Hedef kitle teknik kullanıcılar. LookPress şimdilik yazılımcılar ve ajanslar için; kod bilmeyen son kullanıcıya hitap eden bir tema özelleştirme arayüzü yok.
Kimler ilgilenmeli?
-
Web için bir dilin nasıl tasarlandığını merak edenler,
-
Küçük bir VPS’te az kaynakla çok iş yapmak isteyenler,
-
Tek ikili dosyayla dağıtımın sadeliğini sevenler,
-
Açık kaynak bir projeye erken aşamada katkı vermek isteyenler.
Bağlantılar
-
LookPress: https://github.com/codlook/lookpress
-
Docker imajı:
codlook/look -
VS Code eklentisi: Marketplace’te
codlook.look-lang -
Canlı demo: https://test.codlook.com
Sorularınızı, eleştirilerinizi ve özellikle Pardus üzerindeki deneyimlerinizi bu başlık altında bekliyorum. Hata bulursanız GitHub’da kayıt açmanız projeye yapılabilecek en değerli katkılardan biri.
İyi çalışmalar.