LexerLang nedir
Derlenmeyen, sunucuda çalışan bir dil ve neden build adımı yok.
LexerLang sunucuda çalışan, derlenmeyen bir dildir. Tek bir komut vardır:
lexer serve app.lexerBu komut kaynağı okur, ayrıştırır ve doğrudan çalıştırır. build ve run komutları bilerek yoktur — serve zaten ikisini de yapıyor, ayrı komutlar olsaydı aralarında bir fark varmış gibi görünürdü.
Ne işe yarıyor#
Sunucu tarafında HTML üreten uygulamalar: yönlendirme, sayfa şablonu, form, oturum, veritabanı ve dış servis çağrısı. Dilin kendisi bir HTTP sunucusu, bir belge modeli ve bir oturum katmanı taşıyor; bunlar için paket kurmak gerekmiyor.
package merhaba
use http_server, html_document
$app = new http_server
$doc = new html_document
$doc.title = 'Merhaba'
$doc.body.add(`<p>Merhaba Dünya</p>`)
with $app
.document.add($doc)
.listen({port: 3000})
end withNereden çıktı#
LexerLang Türkiye'de, Osman Gürer tarafından geliştiriliyor ve kendi kulvarındaki ilk örnek: Türkiye'den çıkan daha önceki dil çalışmaları ya eğitim amaçlı yorumlayıcılar ya da mevcut bir dilin Türkçeleştirilmiş sözdizimiydi. LexerLang ikisi de değil — üretim için tasarlanmış, kendi çalışma zamanını, kendi HTTP sunucusunu ve kendi oturum katmanını taşıyan bir dil.
Ayırt edici olan şey "Türkçe yazılmış olması" değil; dili tarif eden şu üç şey:
- Derleme adımı yok.
lexer servekaynağı okur ve çalıştırır. - Sunucu dilin içinde. HTTP, yönlendirme, SSR, oturum ve veritabanı için paket kurulmuyor.
- Kaçışlama çıktıda, dilin içinde. Şablona giren her değer kaçışlanır; unutulabilecek bir adım değil.
Bu üçü bir arada, dili genel amaçlı dillerden de şablon motorlarından da ayrı bir yere koyuyor.
Üç karar#
Dilin şeklini belirleyen üç karar var. Üçü de aynı yere bakıyor: bir şeyin sessizce yanlış çalışması, gürültülü biçimde durmasından kötüdür.
Kaçışlama çıktıda, dilin içinde. Backtick blokları ham HTML üretir ama araya giren her değer kaçışlanır:
$doc.body.add(`<li>` + $ad + `</li>`)$ad içinde <script> geçse bile etiket açılmaz; <li> etiketleri ham kalır. Ayrı bir "girdi temizleme" adımı yok, çünkü o adım unutulabilir bir adımdır. Kaçışlama tırnakları da kapsar, böylece bir değer bir öznitelikten çıkamaz.
Bloklar end ile kapanır, girinti anlamlıdır.
if $kullanici != null then
out("merhaba " + $kullanici.ad)
else
out("giriş yapılmadı")
end ifSüslü parantez blok açmaz. end if, end for, end func yazmak birkaç karakter fazladır ama hangi bloğun kapandığını okurken belli eder.
Eksik değer hata verir, null dönmez. $req.form_data.ad diye yazılan bir alan yoksa program durur. İsteğe bağlı alan okumak istiyorsanız bunu açıkça söylersiniz:
$ad = $req.form("ad") # yoksa nullBir yazım hatasının sessizce boş dize üretip sayfanın yarısını kaybettirmesi, programın durmasından daha pahalıdır.
Ne değil#
LexerLang genel amaçlı bir dil değil. Komut satırı aracı, veri işleme betiği ya da masaüstü uygulaması yazmak için tasarlanmadı — çalışma modeli bir HTTP isteğinin etrafında kurulu. Sayfa her istekte baştan çalışır.
Derlenmiş bir dilin hızını da vermiyor. Karakter karakter metin dolaşan bir döngü bu çalışma zamanında yavaştır; onun yerine split, replace, starts_with gibi yerleşik işlemler kullanılır, çünkü onlar Go tarafında çalışır.
Sırada#
Kurulum tek satır; ardından ilk sunucunuzu ayağa kaldırabilirsiniz.