<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Codlook</title>
    <description>The latest articles on DEV Community by Codlook (@codlook).</description>
    <link>https://dev.to/codlook</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4123515%2Fa93bac14-d8a1-4931-af54-30b129168af7.png</url>
      <title>DEV Community: Codlook</title>
      <link>https://dev.to/codlook</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/codlook"/>
    <language>en</language>
    <item>
      <title>LOOK 1'den LOOK 2'ye: neler değişti</title>
      <dc:creator>Codlook</dc:creator>
      <pubDate>Mon, 12 Oct 2026 09:56:06 +0000</pubDate>
      <link>https://dev.to/codlook/look-1den-look-2ye-neler-degisti-3akl</link>
      <guid>https://dev.to/codlook/look-1den-look-2ye-neler-degisti-3akl</guid>
      <description>&lt;p&gt;&lt;code&gt;&lt;br&gt;
LOOK, web için yapılmış kendi dilimiz. LOOK 1 bugün yayında olan sürüm (1.0.x). LOOK 2&lt;/code&gt;v2` dalında geliştiriliyor ve henüz yayınlanmadı. Bu yazı ikisi arasındaki farkı anlatıyor: neyi, neden değiştirdik ve LOOK 1 ile yazılmış bir uygulama için bu ne anlama geliyor.&lt;/p&gt;

&lt;p&gt;Kısa cevap şu: LOOK 2 yeni özellik yığını değil. LOOK 1'de "bazen öyle, bazen böyle" davranan yerlerin her birine tek bir cevap veriyor ve sessizce yanlış sonuç üreten davranışları ya düzeltiyor ya da hataya çeviriyor.&lt;/p&gt;

&lt;h2&gt;
  
  
  Neden gerekti?
&lt;/h2&gt;

&lt;p&gt;LOOK 1'i gerçek uygulamalarla sınadıkça üç tür sorun tekrar tekrar karşımıza çıktı:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Paylaşılan veri.&lt;/strong&gt; Diziler ve map'ler referansla paylaşılıyordu. Bir fonksiyona verdiğiniz dizi, o fonksiyon içinde değişince sizin elinizdeki de değişiyordu. Web sunucusunda bunun en kötü hali, bir isteğin verisinin başka bir isteğe sızmasıydı. 1.0.3, 1.0.4 ve 1.0.5 sürümlerinin üçü de bu sınıftan hataları tek tek yamadı.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;İki motor, iki davranış.&lt;/strong&gt; LOOK'ta hızlı bir sanal makine (VM) ve onun yanında bir yorumlayıcı var. Aynı kod bazı durumlarda ikisinde farklı sonuç veriyordu: fazla argümanla çağrı birinde hata, diğerinde sessizce kabul; blok içinde tanımlanan değişken birinde görünür, diğerinde değil.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sessiz geri düşüş.&lt;/strong&gt; VM bir şeyi çalıştıramadığında uygulama haber vermeden yorumlayıcıya geçiyordu. Sonuç doğruydu ama yavaştı ve gerçek hataları gizliyordu.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;LOOK 2'nin ölçütü basit: her sorunun tek bir cevabı olsun ve hiçbir şey gizli kalmasın.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Diziler, map'ler ve struct'lar artık değer
&lt;/h2&gt;

&lt;p&gt;En büyük değişiklik bu.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;&lt;code&gt;php&lt;br&gt;
$a = [1, 2, 3]&lt;br&gt;
$b = $a&lt;br&gt;
$b[0] = 9          # LOOK 2: $a hâlâ [1, 2, 3].  LOOK 1: $a da değişirdi.&lt;br&gt;
&lt;/code&gt;&lt;code&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Atama, fonksiyona verme ve fonksiyondan döndürme, alan tarafa kendi değerini verir. Bu her derinlikte geçerli.&lt;/p&gt;

&lt;p&gt;Bunun bedeli kopyalama değil: atamada kopya yapılmaz. Değer yalnızca hâlâ paylaşılırken üzerine yazıldığında kopyalanır. Büyük bir diziyi yalnızca okuyan bir fonksiyona vermek hiçbir şeye mal olmaz.&lt;/p&gt;

&lt;p&gt;Kırılan kalıp, parametresini değiştirip geri döndürmeyen fonksiyondur:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;&lt;code&gt;php&lt;br&gt;
function add_total($order) { $order["total"] = 42 }&lt;br&gt;
add_total($o)      # LOOK 1: $o'da "total" var.  LOOK 2: $o değişmedi.&lt;br&gt;
&lt;/code&gt;&lt;code&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Doğrusu, değeri döndürüp atamak:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;&lt;code&gt;php&lt;br&gt;
function add_total($order) {&lt;br&gt;
    $order["total"] = 42&lt;br&gt;
    return $order&lt;br&gt;
}&lt;br&gt;
$o = add_total($o)&lt;br&gt;
&lt;/code&gt;&lt;code&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Bu, sessizce geçebilecek tek değişiklik olduğu için raporlanıyor: dosya yüklenirken bir uyarı satırı çıkar, &lt;code&gt;lk --check&lt;/code&gt; aynı bulguyu hata olarak verir ve bir derlemeyi durdurabilir.&lt;/p&gt;

&lt;p&gt;Aynı kuralın iki sonucu daha var:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;==&lt;/code&gt; içeriği karşılaştırır.&lt;/strong&gt; İki dizi, map ya da struct aynı şeyi tutuyorsa eşittir. LOOK 1'de diziler ve map'ler için sonuç her zaman &lt;code&gt;false&lt;/code&gt; idi.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Paylaşmak için tutamaç kullanılır.&lt;/strong&gt; Kanallar, WebSocket/SSE bağlantıları ve veritabanı bağlantıları değer değil tutamaçtır; kopyası aynı şeye işaret eder. İstekler arasında bilinçli paylaşımın yolu budur.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  2. Closure değeri yakalar
&lt;/h2&gt;

&lt;p&gt;Bir closure, yakaladığı şeyin oluşturulduğu andaki değerini alır ve onu değiştiremez.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;&lt;code&gt;php&lt;br&gt;
$n = 1&lt;br&gt;
$f = fn() =&amp;gt; $n&lt;br&gt;
$n = 2&lt;br&gt;
$f()               # LOOK 2: 1.  LOOK 1: 2.&lt;br&gt;
&lt;/code&gt;&lt;code&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Yakalanan değişkene closure içinden yazmak (atama, &lt;code&gt;+=&lt;/code&gt;, &lt;code&gt;++&lt;/code&gt;, &lt;code&gt;push&lt;/code&gt;) artık yükleme hatasıdır; program başlamaz. Yeni değeri döndürüp dışarıda atarsınız. Sonradan dışarıda yapılan değişikliğin closure'a yansımaması ise sessiz bir farktır; &lt;code&gt;lk --check&lt;/code&gt; bu yerleri satır numarasıyla listeler.&lt;/p&gt;

&lt;p&gt;LOOK 1'deki istekler arası sızıntıların arkasındaki kalıp buydu: closure'ın paylaşılan bir değişkeni değiştirmesi. LOOK 2'de bu kalıp yazılamıyor.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Struct'lar: tipli alanlar, sabit şekil
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;&lt;code&gt;plaintext&lt;br&gt;
struct User {&lt;br&gt;
    name  string&lt;br&gt;
    age   int = 18&lt;br&gt;
    score ?float        # null olabilir&lt;br&gt;
    tags  array&lt;br&gt;
}&lt;br&gt;
&lt;/code&gt;&lt;code&gt;&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tek yazım biçimi var:&lt;/strong&gt; &lt;code&gt;ad tip&lt;/code&gt;, isteğe bağlı &lt;code&gt;= varsayılan&lt;/code&gt;. LOOK 1'in iki eski yazımı artık ayrıştırma hatası.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tipler denetlenir&lt;/strong&gt;, hem oluştururken hem her atamada.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Şekil sabittir.&lt;/strong&gt; Bildirilmemiş bir alanı okumak ya da yazmak hatadır. LOOK 1 okumada &lt;code&gt;null&lt;/code&gt; döndürür, yazmada alanı sessizce eklerdi.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Varsayılansız alan sıfır değeriyle başlar&lt;/strong&gt; (&lt;code&gt;int&lt;/code&gt; 0, &lt;code&gt;string&lt;/code&gt; "", dizi boş). LOOK 1'de &lt;code&gt;null&lt;/code&gt; idi.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Struct dizi değildir.&lt;/strong&gt; &lt;code&gt;count($s)&lt;/code&gt; ve &lt;code&gt;array::&lt;/code&gt; fonksiyonları struct üzerinde hatadır.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bir struct bir kez, dosyanın en üst düzeyinde bildirilir.&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  4. Okuma, çağrı ve kapsam: tek kural
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;[...]&lt;/code&gt; ile okuma.&lt;/strong&gt; Olmayan anahtar &lt;code&gt;null&lt;/code&gt; verir. &lt;code&gt;null&lt;/code&gt;'dan okumak &lt;code&gt;null&lt;/code&gt; verir, bu yüzden &lt;code&gt;$row["address"]["city"] ?? ""&lt;/code&gt; zinciri özel bir kurala ihtiyaç duymaz. Ama bir string'i ya da sayıyı indekslemek hatadır: bu eksik değer değil, yanlış tiptir. LOOK 1'de bu, kodun hangi motorda çalıştığına göre değişiyordu.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Çağrı.&lt;/strong&gt; Bir fonksiyon, bildirdiği argümanlarla çağrılır. Fazla ya da eksik argüman hatadır. LOOK 1'in varsayılan motoru fazlayı atıyor, eksiği &lt;code&gt;null&lt;/code&gt; yapıyordu.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Kapsam.&lt;/strong&gt; Blok içinde ilk kez atanan değişken blok bitince yok olur; bu artık dosyanın en üst düzeyinde de geçerli.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Küçük eklemeler.&lt;/strong&gt; &lt;code&gt;$count["views"]++&lt;/code&gt; ve &lt;code&gt;++$cart.items&lt;/code&gt; artık çalışıyor. &lt;code&gt;++&lt;/code&gt; ya da &lt;code&gt;--&lt;/code&gt; ile başlayan satır kendi başına bir ifadedir.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Web tarafı
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Rota parametreleri ada göre verilir.&lt;/strong&gt; &lt;code&gt;route("GET", "/c/{id}/{slug}", function($slug) {...})&lt;/code&gt; LOOK 1'de &lt;code&gt;$slug&lt;/code&gt;'a sessizce &lt;code&gt;id&lt;/code&gt;'yi veriyordu. Artık her parametre aynı adlı yol parametresini alır; rotada olmayan bir ad uygulamayı başlangıçta durdurur.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Olmayan bir fonksiyonu çağıran rota uygulamayı başlangıçta durdurur.&lt;/strong&gt; &lt;code&gt;string::uper(...)&lt;/code&gt; gibi bir yazım hatası LOOK 1'de ilk isteğe kadar fark edilmiyordu.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;İş işleyicisi &lt;code&gt;true&lt;/code&gt; ya da &lt;code&gt;false&lt;/code&gt; döndürür ve yeniden deneme bekler.&lt;/strong&gt; LOOK 1'de &lt;code&gt;return&lt;/code&gt; yazmayı unutmak "başarısız" sayılıyor ve iş hemen yeniden çalışıyordu; bir e-posta üç kez gidebiliyordu. Artık yeniden denemeler 30, 60, 120 saniye arayla yapılır.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;İş işleyicileri ve zamanlayıcılar kendi isteklerinde çalışır.&lt;/strong&gt; Bir rotanın içinden başlatılan işleyici artık o isteğin parametrelerini okuyamaz, yanıtını değiştiremez.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Varsayılan 404 düz metindir.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;WebSocket/SSE bağlantılarında yerleşik sınır yok.&lt;/strong&gt; Sınırı işletim sistemi koyar. (Bu, 1.0.15 ile LOOK 1'e de geldi.)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  6. Motor: her şey VM'de
&lt;/h2&gt;

&lt;p&gt;LOOK 1'de web uygulamasının bazı parçaları her zaman yorumlayıcıda çalışıyordu: WebSocket ve SSE işleyicileri, zamanlayıcılar, iş işleyicileri, kendi dosyalarını dahil eden komut satırı betikleri. LOOK 2'de bunların hepsi VM'de.&lt;/p&gt;

&lt;p&gt;Hedef tek motor: VM bir uygulamayı derleyemiyorsa uygulama başlamaz ve nedenini söyler. Yorumlayıcı yalnızca testlerde karşılaştırma için kalır. Bu iş sürüyor; bugün &lt;code&gt;lk --vm-report&lt;/code&gt; çekirdek modüllerdeki 228 fonksiyonun hepsinin VM'de bulunduğunu doğruluyor.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ölçtüklerimiz
&lt;/h2&gt;

&lt;p&gt;Aşağıdaki rakamlar bu bilgisayarda, Docker içinde ölçüldü. Her biri tek bir senaryo içindir; genel bir "şu kadar kat hızlı" iddiası değildir.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Ölçüm&lt;/th&gt;
&lt;th&gt;LOOK 1&lt;/th&gt;
&lt;th&gt;LOOK 2&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Açık WebSocket bağlantısı başına sunucu belleği&lt;/td&gt;
&lt;td&gt;yaklaşık 38 KB&lt;/td&gt;
&lt;td&gt;0,89 KB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;700 bin açık WebSocket&lt;/td&gt;
&lt;td&gt;400 binde 11 GB, belleği yetmedi&lt;/td&gt;
&lt;td&gt;618 MB, hepsi açık&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Döngü ağırlıklı bir iş işleyicisi&lt;/td&gt;
&lt;td&gt;4,2 sn&lt;/td&gt;
&lt;td&gt;0,08 sn&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dosya dahil eden, döngü ağırlıklı komut satırı betiği&lt;/td&gt;
&lt;td&gt;3,7 sn&lt;/td&gt;
&lt;td&gt;0,07 sn&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Şablon ağırlıklı sayfa, uçtan uca&lt;/td&gt;
&lt;td&gt;2,7 bin istek/sn&lt;/td&gt;
&lt;td&gt;12 bin istek/sn&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Bağlantı ölçümü yalnızca boşta duran bağlantıları kapsıyor ve tek koşudur; mesaj trafiği altında ölçülmedi.&lt;/p&gt;

&lt;h2&gt;
  
  
  LOOK 1 uygulamanız için ne anlama geliyor?
&lt;/h2&gt;

&lt;p&gt;LOOK 2, LOOK 1 ile uyumlu değil; bu bilinçli bir karar. Ama değişikliklerin çoğu kendini belli eder:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Yükleme hatası:&lt;/strong&gt; program başlamaz, mesaj satırı söyler. (Eski struct yazımı, closure içinden yazma, rotada olmayan parametre adı.)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Çalışma zamanı hatası:&lt;/strong&gt; ifade hata verir, mesaj nedeni söyler. (Yanlış argüman sayısı, bildirilmemiş alan, string'i indeksleme.)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sessiz:&lt;/strong&gt; program çalışır ama farklı sonuç verir. Dikkatle okunması gerekenler bunlar: değer semantiği, closure'ın değeri yakalaması, &lt;code&gt;==&lt;/code&gt;, varsayılansız alanların sıfır değeri, rota parametrelerinin ada göre verilmesi.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Geçişte ilk adım, uygulamanın her dosyasında &lt;code&gt;lk --check&lt;/code&gt; çalıştırmak. Parametresini değiştirip döndürmeyen fonksiyonları, sonradan değişen yakalanmış değişkenleri ve yanlış argüman sayılarını satır numarasıyla listeler.&lt;/p&gt;

&lt;p&gt;Her değişikliğin tam listesi, ne göreceğiniz ve yerine ne yazacağınızla birlikte &lt;code&gt;docs/migrating-to-look-2.md&lt;/code&gt; dosyasında. O dosya her değişiklikle aynı commit'te güncelleniyor.&lt;/p&gt;

&lt;h2&gt;
  
  
  Şu an neredeyiz?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;LOOK 1&lt;/strong&gt; yayında ve güvenlik düzeltmeleri almaya devam ediyor; son sürüm 1.0.15.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LOOK 2&lt;/strong&gt; &lt;code&gt;v2&lt;/code&gt; dalında. Yukarıdaki dil kuralları yerinde ve her biri iki motorda testli. Yayın için kalan iş, kurulumun da tamamen VM'de çalışması, yani tek motor hedefinin tamamlanması.&lt;/li&gt;
&lt;li&gt;LOOK 2, uygulama tamamen VM'de çalıştığında yayınlanacak.
&lt;code&gt;&lt;/code&gt;`&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>look</category>
      <category>devops</category>
      <category>looklang</category>
      <category>webdev</category>
    </item>
    <item>
      <title>LOOK: A Web Programming Language Built Around the Web</title>
      <dc:creator>Codlook</dc:creator>
      <pubDate>Sun, 13 Sep 2026 19:10:40 +0000</pubDate>
      <link>https://dev.to/codlook/why-we-built-look-a-single-binary-programming-language-designed-for-the-modern-web-4pk5</link>
      <guid>https://dev.to/codlook/why-we-built-look-a-single-binary-programming-language-designed-for-the-modern-web-4pk5</guid>
      <description>&lt;h1&gt;
  
  
  LOOK: A Web Programming Language Built Around the Web
&lt;/h1&gt;

&lt;p&gt;Modern web development has become incredibly capable — but it has also become increasingly layered.&lt;/p&gt;

&lt;p&gt;A typical application may involve a programming language, a web framework, a package manager, database drivers, middleware libraries, authentication libraries, a process manager, a reverse proxy, build tools, configuration files, and a large dependency tree.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;LOOK takes a different approach.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;LOOK is a web scripting language written in &lt;strong&gt;C++23&lt;/strong&gt;, designed specifically around web application development.&lt;/p&gt;

&lt;p&gt;Instead of being a general-purpose language with web capabilities added later, LOOK puts the web at the center of the language.&lt;/p&gt;

&lt;p&gt;Routing, databases, sessions, JWT, validation, caching, WebSockets, SSE, concurrency, testing and other web-oriented capabilities are integrated into the LOOK runtime.&lt;/p&gt;

&lt;p&gt;The goal is simple:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Make building and deploying web applications simpler without giving up performance, security or control.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  What is LOOK?
&lt;/h2&gt;

&lt;p&gt;LOOK is not a web framework for another language.&lt;/p&gt;

&lt;p&gt;It is a programming language and runtime designed for web applications.&lt;/p&gt;

&lt;p&gt;A minimal LOOK application can look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;use jwt

app::set("db", db::connect("mysql://root:@127.0.0.1/mydb"))

route("GET", "/products", function() {
    $rows = db::query(app::db(), "SELECT * FROM products", [])
    response::json(["ok" =&amp;gt; true, "data" =&amp;gt; $rows])
})

route("GET", "/ping", fn() =&amp;gt; response::json(["ok" =&amp;gt; true]))

route("POST", "/login", function() {
    $body = request::json()
    $token = jwt_sign(["id" =&amp;gt; $body.id], env("JWT_SECRET"))

    response::json(["token" =&amp;gt; $token])
})
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The syntax is deliberately compact.&lt;/p&gt;

&lt;p&gt;LOOK supports:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;fn() =&amp;gt; ...&lt;/code&gt; arrow functions&lt;/li&gt;
&lt;li&gt;optional semicolons&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;$row.col&lt;/code&gt; property access&lt;/li&gt;
&lt;li&gt;modules with &lt;code&gt;use&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;route groups&lt;/li&gt;
&lt;li&gt;middleware&lt;/li&gt;
&lt;li&gt;path parameters&lt;/li&gt;
&lt;li&gt;JSON APIs&lt;/li&gt;
&lt;li&gt;HTML templates&lt;/li&gt;
&lt;li&gt;database access&lt;/li&gt;
&lt;li&gt;authentication&lt;/li&gt;
&lt;li&gt;WebSockets&lt;/li&gt;
&lt;li&gt;SSE&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;route("GET", "/ping", fn() =&amp;gt; response::json(["ok" =&amp;gt; true]))
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;is enough to expose an HTTP endpoint.&lt;/p&gt;




&lt;h1&gt;
  
  
  Not Just a One-File Language
&lt;/h1&gt;

&lt;p&gt;One important misconception about LOOK is that it is designed only for tiny one-file applications.&lt;/p&gt;

&lt;p&gt;It is not.&lt;/p&gt;

&lt;p&gt;A &lt;code&gt;.lk&lt;/code&gt; file can run independently, which makes scripts and CLI tools convenient.&lt;/p&gt;

&lt;p&gt;But real applications are structured into multiple files.&lt;/p&gt;

&lt;p&gt;A typical project can look like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;myapp/
├── index.lk
├── config/
│   └── app.json
├── views/
│   ├── layout.html
│   └── product.html
└── ~/.look/modules/
    ├── model/
    │   └── model.lk
    └── util/
        └── util.lk
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The entry file wires the application together.&lt;/p&gt;

&lt;p&gt;Configuration, templates and reusable modules can remain separate.&lt;/p&gt;

&lt;p&gt;This makes LOOK suitable for applications that grow beyond a prototype.&lt;/p&gt;




&lt;h1&gt;
  
  
  A Language Designed Around the Web
&lt;/h1&gt;

&lt;p&gt;Many programming languages started as general-purpose languages and later developed large web ecosystems.&lt;/p&gt;

&lt;p&gt;LOOK starts from the opposite direction.&lt;/p&gt;

&lt;p&gt;The web is one of its primary design targets.&lt;/p&gt;

&lt;p&gt;That means common web requirements are treated as language/runtime capabilities rather than a collection of unrelated framework components.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;route("GET", "/users/{id}", function($id) {
    $user = db::query(
        app::db(),
        "SELECT * FROM users WHERE id = ?",
        [$id]
    )

    response::json([
        "ok" =&amp;gt; true,
        "data" =&amp;gt; $user
    ])
})
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The route, database interaction and HTTP response are all part of the same environment.&lt;/p&gt;




&lt;h1&gt;
  
  
  Databases Without a Traditional Driver Stack
&lt;/h1&gt;

&lt;p&gt;LOOK supports:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;MySQL&lt;/li&gt;
&lt;li&gt;MariaDB&lt;/li&gt;
&lt;li&gt;PostgreSQL&lt;/li&gt;
&lt;li&gt;SQLite&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The relational database protocols are implemented inside the LOOK core rather than depending on separate external database drivers.&lt;/p&gt;

&lt;p&gt;The project's CI tests database compatibility against multiple real database versions.&lt;/p&gt;

&lt;p&gt;The current documented matrix includes MySQL 5.7 through 9.x, MariaDB 10.11 through 12.x, PostgreSQL 14 and 18, and SQLite 3.47.2.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;app::set("db", db::connect(env("DB_DSN")))

route("GET", "/products", function() {
    $products = db::query(
        app::db(),
        "SELECT id, name, price FROM products ORDER BY id DESC",
        []
    )

    response::json([
        "ok" =&amp;gt; true,
        "data" =&amp;gt; $products
    ])
})
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Parameterized queries are part of the normal database API.&lt;/p&gt;

&lt;p&gt;This reduces the amount of infrastructure an application needs to assemble before it can start serving requests.&lt;/p&gt;




&lt;h1&gt;
  
  
  Authentication and Web APIs
&lt;/h1&gt;

&lt;p&gt;LOOK includes functionality for common API applications such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;JWT&lt;/li&gt;
&lt;li&gt;sessions&lt;/li&gt;
&lt;li&gt;cookies&lt;/li&gt;
&lt;li&gt;request validation&lt;/li&gt;
&lt;li&gt;middleware&lt;/li&gt;
&lt;li&gt;rate limiting&lt;/li&gt;
&lt;li&gt;JSON responses&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A route group can share authentication middleware:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$auth = function() {
    if (request::header("X-Api-Key") != env("API_KEY")) {
        response::json(["error" =&amp;gt; "forbidden"], 403)
        stop()
    }
}

route::group("/admin", [$auth], function() {
    route("GET", "/users", function() {
        response::json(["ok" =&amp;gt; true])
    })

    route("DELETE", "/users/{id}", function($id) {
        response::json(["deleted" =&amp;gt; $id])
    })
})
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The objective is to make common API patterns part of the language's natural development model.&lt;/p&gt;




&lt;h1&gt;
  
  
  WebSockets and Server-Sent Events
&lt;/h1&gt;

&lt;p&gt;Modern applications are not limited to request/response APIs.&lt;/p&gt;

&lt;p&gt;Real-time functionality is increasingly common:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;dashboards&lt;/li&gt;
&lt;li&gt;chat systems&lt;/li&gt;
&lt;li&gt;notifications&lt;/li&gt;
&lt;li&gt;monitoring&lt;/li&gt;
&lt;li&gt;live status pages&lt;/li&gt;
&lt;li&gt;collaborative interfaces&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;LOOK includes WebSocket and Server-Sent Events support.&lt;/p&gt;

&lt;p&gt;This means applications can use the same runtime for conventional HTTP endpoints and real-time communication instead of introducing an entirely separate service for every communication model.&lt;/p&gt;




&lt;h1&gt;
  
  
  Concurrency
&lt;/h1&gt;

&lt;p&gt;LOOK also provides concurrency primitives including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;parallel()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;channels&lt;/li&gt;
&lt;li&gt;FastCGI multi-worker execution&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The runtime is designed around a persistent process model rather than starting a completely fresh interpreter for every request.&lt;/p&gt;

&lt;p&gt;That design has an important performance benefit, but it also creates responsibilities for developers.&lt;/p&gt;

&lt;p&gt;Global state must be handled carefully, and code must be thread-safe where concurrency is involved.&lt;/p&gt;

&lt;p&gt;LOOK documents this trade-off explicitly rather than hiding it.&lt;/p&gt;




&lt;h1&gt;
  
  
  Performance
&lt;/h1&gt;

&lt;p&gt;Performance is one of the reasons LOOK was created.&lt;/p&gt;

&lt;p&gt;The project includes its own benchmarks.&lt;/p&gt;

&lt;p&gt;According to the current repository benchmark:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;direct-port HTTP throughput is around &lt;strong&gt;9,800 requests/second&lt;/strong&gt; in the documented test&lt;/li&gt;
&lt;li&gt;a database-heavy QR-menu JOIN benchmark over 50,000 rows reached &lt;strong&gt;2,837 req/s&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;the comparison was against PHP 8.3 + JIT + FPM at &lt;strong&gt;2,184 req/s&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;LOOK used approximately &lt;strong&gt;9–29 MB RAM&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;PHP used approximately &lt;strong&gt;43–47 MB RAM&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The database benchmark used the same host, schema and query, with controlled CPU and memory limits and equal pool sizes. The repository also explicitly notes that individual runs can be noisy, so these numbers should be treated as project benchmark results rather than universal performance guarantees.&lt;/p&gt;

&lt;p&gt;That distinction matters.&lt;/p&gt;

&lt;p&gt;A benchmark number without methodology is not particularly useful.&lt;/p&gt;

&lt;p&gt;The more interesting question is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Can a web language maintain low overhead while performing realistic application work?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;LOOK is attempting to answer that question through repeatable project benchmarks.&lt;/p&gt;




&lt;h1&gt;
  
  
  Runtime Architecture
&lt;/h1&gt;

&lt;p&gt;LOOK is implemented in &lt;strong&gt;C++23&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Its architecture includes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Source (.lk)
      │
      ▼
    Lexer
      │
      ▼
    Parser
      │
      ▼
     AST
      │
      ▼
Bytecode / Execution Engine
      │
      ▼
   LOOK Runtime
      │
      ├── HTTP
      ├── WebSocket
      ├── SSE
      ├── Database
      ├── Sessions
      ├── JWT
      ├── Cache
      ├── Concurrency
      └── Other Web Services
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The project contains both execution paths and supporting infrastructure for its runtime and test systems.&lt;/p&gt;

&lt;p&gt;The persistent runtime model is an important architectural decision.&lt;/p&gt;

&lt;p&gt;It avoids treating every HTTP request as an entirely new process/interpreter lifecycle.&lt;/p&gt;

&lt;p&gt;But this also means that LOOK applications need to be written with persistent state and concurrency in mind.&lt;/p&gt;




&lt;h1&gt;
  
  
  Single-Binary Deployment
&lt;/h1&gt;

&lt;p&gt;One of the strongest ideas behind LOOK is deployment simplicity.&lt;/p&gt;

&lt;p&gt;A LOOK application can be deployed as a binary rather than requiring a large runtime installation and dependency tree.&lt;/p&gt;

&lt;p&gt;The official repository documents deployment through:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Linux&lt;/li&gt;
&lt;li&gt;Windows&lt;/li&gt;
&lt;li&gt;Docker&lt;/li&gt;
&lt;li&gt;CGI&lt;/li&gt;
&lt;li&gt;FastCGI&lt;/li&gt;
&lt;li&gt;Plesk&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A Docker installation can start a LOOK server with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;-p&lt;/span&gt; 8080:7400 codlook/look
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And an application can be mounted into &lt;code&gt;/app&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;This creates a particularly simple deployment model:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Application
    │
    ▼
 LOOK binary
    │
    ├── HTTP
    ├── Database
    ├── WebSocket
    ├── Sessions
    └── Runtime
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Instead of:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Application
   +
Framework
   +
Runtime
   +
Package manager
   +
Database drivers
   +
Multiple libraries
   +
Process configuration
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;the goal is to make the runtime itself provide the common foundation.&lt;/p&gt;




&lt;h1&gt;
  
  
  Security Is Part of the Runtime
&lt;/h1&gt;

&lt;p&gt;Performance without security is not useful.&lt;/p&gt;

&lt;p&gt;LOOK includes security-oriented functionality such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;parameterized SQL&lt;/li&gt;
&lt;li&gt;request body limits&lt;/li&gt;
&lt;li&gt;secure session token generation&lt;/li&gt;
&lt;li&gt;HttpOnly/SameSite cookie defaults&lt;/li&gt;
&lt;li&gt;PBKDF2-SHA256&lt;/li&gt;
&lt;li&gt;upload magic-byte validation&lt;/li&gt;
&lt;li&gt;SHA-256&lt;/li&gt;
&lt;li&gt;HMAC&lt;/li&gt;
&lt;li&gt;secure random generation&lt;/li&gt;
&lt;li&gt;WebSocket masking enforcement&lt;/li&gt;
&lt;li&gt;rate limiting&lt;/li&gt;
&lt;li&gt;file sandboxing&lt;/li&gt;
&lt;li&gt;parser depth protection&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The project also reports using:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AddressSanitizer&lt;/li&gt;
&lt;li&gt;UndefinedBehaviorSanitizer&lt;/li&gt;
&lt;li&gt;ThreadSanitizer&lt;/li&gt;
&lt;li&gt;fuzzing&lt;/li&gt;
&lt;li&gt;regression testing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The protocol parsers are implemented in the project itself and kept in a centralized area to make the attack surface easier to inspect.&lt;/p&gt;

&lt;p&gt;This is particularly important for a language whose runtime handles networking protocols directly.&lt;/p&gt;




&lt;h1&gt;
  
  
  The Trade-Offs
&lt;/h1&gt;

&lt;p&gt;LOOK is still an evolving language.&lt;/p&gt;

&lt;p&gt;It is important to talk about what it does &lt;strong&gt;not&lt;/strong&gt; solve yet.&lt;/p&gt;

&lt;p&gt;The current project documentation explicitly identifies several limitations.&lt;/p&gt;

&lt;p&gt;For example, the module system currently uses the LOOK module directory rather than arbitrary relative imports such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;include "./lib/foo.lk"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The persistent-process architecture also means that global state and thread safety require more discipline than in a request-reset model such as traditional PHP-FPM.&lt;/p&gt;

&lt;p&gt;The embedded mail server is still an evolving part of the project.&lt;/p&gt;

&lt;p&gt;SMTP has substantially more functionality, while the current IMAP implementation is explicitly a Milestone 1 implementation and does not yet provide the persistent UID behavior required by common desktop and mobile mail clients.&lt;/p&gt;

&lt;p&gt;These are not hidden limitations.&lt;/p&gt;

&lt;p&gt;They are documented engineering constraints.&lt;/p&gt;

&lt;p&gt;That is important for an emerging programming language.&lt;/p&gt;




&lt;h1&gt;
  
  
  Compatibility and the 1.x Line
&lt;/h1&gt;

&lt;p&gt;LOOK also has a compatibility policy for its 1.x series.&lt;/p&gt;

&lt;p&gt;The documented &lt;code&gt;mod::fn&lt;/code&gt; API is intended to remain stable throughout 1.x.&lt;/p&gt;

&lt;p&gt;Breaking changes are intended for a future major version rather than being silently introduced into a 1.x release.&lt;/p&gt;

&lt;p&gt;At the same time, the project distinguishes between true breaking changes and bug fixes.&lt;/p&gt;

&lt;p&gt;Security-default hardening can also be introduced within the 1.x line when the previous default is considered unsafe, with an explicit opt-out documented where appropriate.&lt;/p&gt;

&lt;p&gt;This is a practical approach for a young language that is still defining some semantic edge cases.&lt;/p&gt;




&lt;h1&gt;
  
  
  Real Applications
&lt;/h1&gt;

&lt;p&gt;LOOK is not limited to benchmark examples.&lt;/p&gt;

&lt;p&gt;The project currently demonstrates several applications running through a single LOOK process, including:&lt;/p&gt;

&lt;h3&gt;
  
  
  Blog
&lt;/h3&gt;

&lt;p&gt;Posts, administration, categories and cover image uploads.&lt;/p&gt;

&lt;h3&gt;
  
  
  QR Menu
&lt;/h3&gt;

&lt;p&gt;A restaurant menu with a REST API and route listing.&lt;/p&gt;

&lt;h3&gt;
  
  
  Chat
&lt;/h3&gt;

&lt;p&gt;Nickname, emoji and near-real-time messaging.&lt;/p&gt;

&lt;h3&gt;
  
  
  Products
&lt;/h3&gt;

&lt;p&gt;Products, categories, brands, variants and additional attributes.&lt;/p&gt;

&lt;h3&gt;
  
  
  AI
&lt;/h3&gt;

&lt;p&gt;An API integration with in-memory conversation state.&lt;/p&gt;

&lt;p&gt;These examples demonstrate an important aspect of the project:&lt;/p&gt;

&lt;p&gt;LOOK is intended to be used for complete web applications, not only isolated API benchmarks.&lt;/p&gt;




&lt;h1&gt;
  
  
  The Ecosystem
&lt;/h1&gt;

&lt;p&gt;The LOOK core is intentionally kept separate from optional integrations.&lt;/p&gt;

&lt;p&gt;The project maintains separate repositories for modules and packages.&lt;/p&gt;

&lt;p&gt;The current package ecosystem includes integrations such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Firebase&lt;/li&gt;
&lt;li&gt;iyzico&lt;/li&gt;
&lt;li&gt;PayTR&lt;/li&gt;
&lt;li&gt;Stripe&lt;/li&gt;
&lt;li&gt;S3&lt;/li&gt;
&lt;li&gt;Sentry&lt;/li&gt;
&lt;li&gt;Netgsm&lt;/li&gt;
&lt;li&gt;QR&lt;/li&gt;
&lt;li&gt;PDF&lt;/li&gt;
&lt;li&gt;image processing&lt;/li&gt;
&lt;li&gt;monitoring&lt;/li&gt;
&lt;li&gt;TCMB&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This allows the core language to remain focused while application-specific integrations can evolve independently.&lt;/p&gt;




&lt;h1&gt;
  
  
  Why Build Another Programming Language?
&lt;/h1&gt;

&lt;p&gt;This is probably the most important question.&lt;/p&gt;

&lt;p&gt;Why not simply use PHP, Go, Node.js, Python, Rust or another established language?&lt;/p&gt;

&lt;p&gt;Because the goal is not simply to create another syntax.&lt;/p&gt;

&lt;p&gt;The goal is to explore a different architecture for web development.&lt;/p&gt;

&lt;p&gt;LOOK asks:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What happens if the web is treated as a first-class environment of the programming language instead of a collection of frameworks and libraries around it?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That question affects everything:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;syntax&lt;/li&gt;
&lt;li&gt;runtime&lt;/li&gt;
&lt;li&gt;deployment&lt;/li&gt;
&lt;li&gt;database access&lt;/li&gt;
&lt;li&gt;HTTP&lt;/li&gt;
&lt;li&gt;concurrency&lt;/li&gt;
&lt;li&gt;security&lt;/li&gt;
&lt;li&gt;testing&lt;/li&gt;
&lt;li&gt;package architecture&lt;/li&gt;
&lt;li&gt;application structure&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The result is intentionally different from simply adding another web framework.&lt;/p&gt;




&lt;h1&gt;
  
  
  LOOK vs. Traditional Web Stacks
&lt;/h1&gt;

&lt;p&gt;A conventional stack might look like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Language
   +
Web Framework
   +
ORM / DB Driver
   +
Authentication Library
   +
HTTP Library
   +
WebSocket Library
   +
Cache Library
   +
Package Manager
   +
Process Manager
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;LOOK attempts to move much of that foundation into the language/runtime itself:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                LOOK
                  │
       ┌──────────┼──────────┐
       │          │          │
      HTTP       DB       Security
       │          │          │
   WebSocket   Sessions     JWT
       │          │          │
      SSE       Cache     Validation
       │          │          │
       └──────────┼──────────┘
                  │
              Runtime
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This does not mean external libraries disappear.&lt;/p&gt;

&lt;p&gt;It means the foundation becomes smaller and more integrated.&lt;/p&gt;




&lt;h1&gt;
  
  
  Where LOOK Could Fit
&lt;/h1&gt;

&lt;p&gt;LOOK is particularly interesting for applications such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;REST APIs&lt;/li&gt;
&lt;li&gt;SaaS backends&lt;/li&gt;
&lt;li&gt;admin panels&lt;/li&gt;
&lt;li&gt;dashboards&lt;/li&gt;
&lt;li&gt;internal systems&lt;/li&gt;
&lt;li&gt;CRUD applications&lt;/li&gt;
&lt;li&gt;real-time applications&lt;/li&gt;
&lt;li&gt;lightweight web services&lt;/li&gt;
&lt;li&gt;API gateways&lt;/li&gt;
&lt;li&gt;database-driven applications&lt;/li&gt;
&lt;li&gt;small and medium business applications&lt;/li&gt;
&lt;li&gt;self-hosted applications&lt;/li&gt;
&lt;li&gt;applications where deployment simplicity matters&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It can also be interesting for developers who want a language that feels closer to application-level web development than traditional systems programming.&lt;/p&gt;




&lt;h1&gt;
  
  
  What Makes the Project Interesting
&lt;/h1&gt;

&lt;p&gt;The most interesting aspect of LOOK is not any single feature.&lt;/p&gt;

&lt;p&gt;It is the combination.&lt;/p&gt;

&lt;p&gt;A language implemented in C++23.&lt;/p&gt;

&lt;p&gt;A persistent runtime.&lt;/p&gt;

&lt;p&gt;Native HTTP functionality.&lt;/p&gt;

&lt;p&gt;Built-in database protocols.&lt;/p&gt;

&lt;p&gt;WebSocket and SSE support.&lt;/p&gt;

&lt;p&gt;Built-in authentication primitives.&lt;/p&gt;

&lt;p&gt;Low deployment overhead.&lt;/p&gt;

&lt;p&gt;A relatively compact syntax.&lt;/p&gt;

&lt;p&gt;A single-binary deployment model.&lt;/p&gt;

&lt;p&gt;And an explicit focus on security and testing.&lt;/p&gt;

&lt;p&gt;Those decisions reinforce each other.&lt;/p&gt;




&lt;h1&gt;
  
  
  LOOK Is Still an R&amp;amp;D Project
&lt;/h1&gt;

&lt;p&gt;LOOK should not be presented as a finished replacement for every existing programming language.&lt;/p&gt;

&lt;p&gt;That would be neither accurate nor useful.&lt;/p&gt;

&lt;p&gt;It is an evolving programming language and runtime.&lt;/p&gt;

&lt;p&gt;There are still areas that require development:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;language semantics&lt;/li&gt;
&lt;li&gt;ecosystem growth&lt;/li&gt;
&lt;li&gt;module ergonomics&lt;/li&gt;
&lt;li&gt;tooling&lt;/li&gt;
&lt;li&gt;IDE support&lt;/li&gt;
&lt;li&gt;documentation&lt;/li&gt;
&lt;li&gt;platform maturity&lt;/li&gt;
&lt;li&gt;deeper database functionality&lt;/li&gt;
&lt;li&gt;mail protocol maturity&lt;/li&gt;
&lt;li&gt;broader independent benchmarking&lt;/li&gt;
&lt;li&gt;larger-scale production adoption&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is exactly what makes the project interesting from an engineering perspective.&lt;/p&gt;

&lt;p&gt;The important question is not:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Has LOOK already replaced everything?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It clearly has not.&lt;/p&gt;

&lt;p&gt;The better question is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Can a web-focused language reduce the complexity of modern web development while maintaining strong performance and control?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;LOOK is an attempt to explore that question seriously.&lt;/p&gt;




&lt;h1&gt;
  
  
  Getting Started
&lt;/h1&gt;

&lt;p&gt;The fastest way to try LOOK is Docker:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;-p&lt;/span&gt; 8080:7400 codlook/look
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl localhost:8080
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For a local source build, LOOK currently requires:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;C++23&lt;/li&gt;
&lt;li&gt;CMake 3.20+&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The project provides CLI, CGI and FastCGI binaries.&lt;/p&gt;

&lt;p&gt;The official repository also provides documentation for Linux, Windows, Docker and Plesk deployment.&lt;/p&gt;




&lt;h1&gt;
  
  
  Final Thoughts
&lt;/h1&gt;

&lt;p&gt;The web development ecosystem has spent decades adding layers around programming languages.&lt;/p&gt;

&lt;p&gt;Frameworks became larger.&lt;/p&gt;

&lt;p&gt;Dependency trees became larger.&lt;/p&gt;

&lt;p&gt;Build systems became more complicated.&lt;/p&gt;

&lt;p&gt;Deployment became increasingly dependent on infrastructure knowledge.&lt;/p&gt;

&lt;p&gt;LOOK explores the opposite direction:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;What if the language itself provided more of the web stack?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Not through magic.&lt;/p&gt;

&lt;p&gt;Not through an enormous framework.&lt;/p&gt;

&lt;p&gt;But through a runtime designed specifically for web applications.&lt;/p&gt;

&lt;p&gt;LOOK is still evolving, and its limitations should be taken seriously.&lt;/p&gt;

&lt;p&gt;But the architecture is interesting enough to experiment with.&lt;/p&gt;

&lt;p&gt;If the project continues to mature, the most valuable result may not be another framework.&lt;/p&gt;

&lt;p&gt;It may be a different way of thinking about what a web programming language should provide by default.&lt;/p&gt;




&lt;h2&gt;
  
  
  Explore LOOK
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://github.com/codlook/look" rel="noopener noreferrer"&gt;https://github.com/codlook/look&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Official website:&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://look.codlook.com" rel="noopener noreferrer"&gt;https://look.codlook.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Documentation:&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://look.codlook.com/docs.html" rel="noopener noreferrer"&gt;https://look.codlook.com/docs.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Package ecosystem:&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://github.com/Codlook/look-packages" rel="noopener noreferrer"&gt;https://github.com/Codlook/look-packages&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you are interested in programming languages, web runtimes, C++ systems programming or alternative approaches to web development, LOOK is an interesting project to watch.&lt;/p&gt;

</description>
      <category>looklang</category>
      <category>programming</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
