LOOK: Web için tasarlanmış bir programlama dili — ve onunla yazılan LookPress

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 null olmaz; Undefined variable: $x hatası alırsınız. Bu, web uygulamalarındaki en sinsi hata sınıflarından birini kapatır.

  • Yerleşik fonksiyonlar modül::fonksiyon biç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.lk yazarak 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% ve MemoryMax=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.md içinde ayrı bir “Known limitations” bölümü var. Örneğin uzak MySQL bağlantısı varsayılan olarak şifresizdir; şifrelemek için mysqls://, sunucuyu doğrulamak için ?tls=verify kullanmanı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

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.

1 Beğeni

Keşke Github gibi bir siteye yönlendirme yapsaydınız.