Web Ekosistem

Deno Nedir? Neden Geliştirildi ?

Deno, Node.js ilk ortaya atan Ryan Dahl’ın eski Node.js tasarım kararlarında aldığı şu anda yanlış olduğunu, düzeltilemez olduğunu düşündüğü bir takım pişmanlıklardan dolayı Sunucu üzerinde çalışacak Güvenli ve TypeScript destekli yeni bir Runtime’dır

--

Ryan Dahl 2018 deki bir videosunda Node.js 10 pişmanlık duyduğu tasarım hatasını aşağıdaki video’da açıkladı. Bu sunumun Ryan Dahl gelmiş olması daha fazla önem taşıyor. Çünkü Node.js şu anda sunucu tarafından ve local bilgisayarlarda runtime arasında oldukça büyük bir paya sahip. Ve o Node.js ilk geliştirme sırasında kendi aldığı bir takım tasarım kararları bir çok projede aktif olarak kullanılıyor.

10 Things I Regret About Node.js — Ryan Dahl — JSConf EU

Node.js bu kadar yaygın kullanıma gelmiş iken, yeni bir Runtime oluşturma ihtiyacı hangi tasarım eksikliklerinden geldi ? Sunumdan alıntılar ile durumu anlatmaya çalışacağım.

2012 kadar kendisinin Node.js geliştirme ve yönetim tarafında olduğu. O zamanlar ana odak noktasının Event-Driven HTTP Server oluşturmak olduğunu ama bu odağın zaman içerisinde Server-Side JavaScript dönüştüğünü anlatıyor.

2012 yılında Node.js geliştirmelerini bıraktığında Runtime odak noktası Non-Blocking frameworkmüş.

  • Temel Protokollerin desteklendiği (HTTP, SSL..)
  • Farkı platformlarda çalıştırılabildiği; Windows(IOPC), Linux(epoll), Mac(kqueue) kullanımı
  • Stabil API küçük bir Core ile sağladıkları
  • Node.js external ekosistemi NPM ile birlikte gelişmekte olduğu

Yukarıda belirtilen bazı kavramları daha iyi anlayabilmek için aşağıda yazmış olduğum yazıları okuyabilirsiniz.

Dynamic Programlama dillleri (JavaScript, Python vb) Bilimsel Hesaplamalar için oldukça kullanışlı ve avantajlıdır çünkü temelde amacı algoritmanın veya modelin düzgün çalışmasıdır. Amacınız type hataları ile modülerlik yapıları ile uğraşmak değil bilimsel çalışmanız için hesaplamalara odaklanmaktır. Prototyping işlerinde de bu geçerlidir, amaç hızlı olmak hemen prototip ortaya çıkarmaktır.

Ama siz bu dil ile sunucu programlaması oluşturup bunla kurumsal işler yapmayı amaçlıyorsanız, burada dilden beklediğiniz yetenekler ve özellikler değişmeye başlar. Tüm sunucu kontrollerini elinizde tutabileceğiniz daha static type olaran bir dile ihtiyaç duyarsınız. Hem daha güvenli olmalı, hemde hata oluşmasını engelleyici bir yapıda olmalıdır.

Rayn Dahl JavaScript Dynamic Language içerisinde en iyisi olduğuna inanıyor. Bende bu fikre katılıyorum. Bu konuda

Enterprise alanda Java/C++ geliştirmelerinde JavaScript alternatifi olarak TypeScript tercih edildiğini aşağıdaki yazılarda anlatmıştım.

Pişmanlıklar (Regrets)

Tasarım aşamasında kendince yanlış bulduğu, pişmanlık duyduğu kısımları şöyle özetliyor Ryan Dahl;

1. Promise Kullanımını Zorlamamak

Aslında 2009 yılında Node.JS içerisine Promise sonradan bazı istek ve tasarım kararları doğrultusunda 2010 yılında çıkarıldı. Callback yapıları üzerinden işleyen async yapısı günümüz standartlarına eskide kalmış durumdadır.

JS Async Programlama için linkteki yazıları okuyabilirsiniz.

https://onurdayibasi.com/javascript-async-programming/

2. Güvenlik

V8 Engine çalışma mantığı sandbox içerisinde soyutlandığı için oldukça güvenlidir. Bu konuyu Chrome Nasıl Çalışır kısmında anlatmıştım. Multi process mimari ve navigasyon konularında JS kodlarını işleten V8 Engine nasıl diğer process erişemez şekilde olduğunu anlatmıştık.

https://onurdayibasi.com/chrome-nasil-calisir/

Bunun yanında bir tarayıcı içerisindeyken CORS dolayı başka domain altındaki network erişirken veya diske erişmek istediğinde WebAPI kısmında bir takım güvenlik engellerinin olduğunu farkedersiniz.

Node.JS ise V8 Engine üzerinde çalışıyor fakat tarayıcıdan farklı olarak diske ve network erişen güvenliğin baştan kapalı olmadığı, bir takım güvenlik ayarları baştan verilmediği bir durum söz konusu, kötü niyetli bir uygulama veya kod parçası sunucunuz ele geçirip istemediğiniz durumlara neden olabilme durumu var.

3. Build Sistemi

Node.js diğer dilller ile konuşmayı sağlayan bir build sistemi oluşturmak V8Engine kısmında C++ ile yazdığınız JS kodlarının bağlanması açısından oldukça önemlidir. Node.js önceleri bu iş için Google Chrome içerisinde kullandığı GYP kullanmışlar ama Google ekibi bu yapıyı GN ile değiştirince Node Ekibi bu yapıdan vazgeçmeyerek üzerine Wrapper yazılarak devam edilmiştir. Ortada eskiden kalma Non-JSON yarı Python olan bir binding yapısı kalmıştır.

4. package.json

Node projesinde ilk önce npm init ile bir package dosyası oluşturup, her bir kütüphane ve modülü npm üzerinden localimize indirip, buradan require ile kullanır hale geldik. package dosyası node projesinde bir başlangıç noktası olmaya ve zaman içerisinde içerik olarak başka başka bilgiler de tutmaya başladı. Node içerisinde npm ile birlikte bir standart birlikte gelmeye başladı

https://www.youtube.com/watch?v=M3BM9TB-8yA

5. node modules

Kütüphane mantığı Java’daki maven ve Jar mantığı gibi düşülse de Node içerisinde çok ufak bir çok kütüphane bulunabilmektedir. Veya kütüphane içerisindeki modüller npm içerisindeki diğer bir çok kütüphaneye bağımlılığı bulunmaktadır. Bu ufak granürlü yapı node_modules altında çok büyük bir dosya yapısı oluşturup projenin bu modül isimlerini çözümlemesi, parse etmesi özellikle büyük projelerde çok ciddi karmaşıklıklara, problemlere neden olabiliyor.

6. Require(module) extension kullanmadan modülü yüklemeye çalışması

Web’de bir yerden bir ts, js, css ne yüklerseniz yükleyin uzantı vermek durumundasınızdır. Fakat require(module) bunu vermenize gerek kalmadan default js yükleyip altına koymaya çalışıyor, bu tarz bir soyutlama doğru olmadığını düşünüyor. Bunun yerine module_loader bunu tahminlemesine gerek kalmadan bu dosya uzantılarından çıkarması gerektiğini düşünüyor.

7. Index.js

Webdeki index.html benzeri Web sunucusunda default index.js olması ve bunun üzerinden uygulamanın başlatılmasını module_loader bu şekilde çalışması düşünülmüş ama Rayn bu yaklaşımınıda doğru bulmuyor.

Sonuç

Bu pişmanlıklarından yola çıkaran Rayn Dahl yeni bir runtime çıkarır. isminide deno koyarlar. Sitesi https://deno.land/

"node".split("").sort().join("") // deno

Deno Nedir?

A secure runtime for JavaScript and TypeScript.
JavaScript ve TypeScript için güvenli bir runtime’dır.

Dilin özelliklerini bir sonraki yazımda anlatmaya devam edeceğim.

Referanslar

Okumaya Devam Et 😃

Bu yazının devamı veya yazı grubundaki diğer yazılara erişmek için bu linke tıklayabilirsiniz.

--

--