Söylemesi biraz zor çünkü bu kelimeler iyi tanımlanmamış. Genel bakışta, bence Node.js 'i bir çerçeve olarak adlandırmak biraz atipik, elbette, ama bunun tam olarak neden olmadığı konusunda tartışmak zor olurdu.
Tüm bunlar zorlaşıyor, ve çoğu zaman dilin gerçekten kötü kullanımlarını görüyorum, bu yüzden açık olacağım ve en alttan başlayacağım
JavaScript, dar bir şekilde, bir metni bir dizi yürütme semantiğine sahip olarak okumamıza ve yorumlamamıza olanak tanıyan bir dizi sözleşme yani "dili bir talimat dizisi olarak yorumlamanın yolu" anlamına gelen bir sözcük dilidir. Denilen programların Sınıflar tercüman , derleyiciler , transpilers , linter , vurgulayıcılar vb tüm almak metin ve kod çalıştırmak için nasıl bu geleneksel anlayış şeyler yapmaya çabalamaktadırlar.
- Tercümanlar aslında bazı bilgisayarları çalıştırarak yürütme anlamını gerçekleştiriyorlar - genellikle de bilgisayarınızı. Bunları bilgisayarınızın içindeki küçük bir adam olarak düşünebilirsiniz, bu, JavaScript programında yazılı talimatlara dayanarak "bu karakteri yazdır" gibi anahtarları çevirir.
- Derleyiciler , JavaScript metnini, farklı bir dil için yürütme anlamında olan ve belki de bilgisayarların doğrudan yürütebildiği özel bir özelliğe sahip yeni bir metin grubuna dönüştürmeye çalışır.
- Transpilers , JavaScript metnini alıp başka bir dilin metnini çıkaran genel bir derleyici biçimidir. Bu nedenle fark biraz subjektiftir, ancak genellikle bir derleyicinin çok düşük seviyeli kod çıktısı olarak bir derleyiciyi ve yüksek seviyeli kod çıktısı olarak transpiler olduğunu düşünür .
- Linter , vurgulayıcılar , tip dama , vb yürütme semantik etkisinde, ama bunun aslında temsil etmeyen JavaScript metin ve çıkış analitik ürünün çeşit tüm almak, vurgulanan metin örneğin.
Şimdi biraz da yürütme semantiğine girelim. Genel olarak, yürütme semantiği, dil metnini okuma ve soyut bir makinenin bir tanımına veya gözlemlenebilir yan etkilerin bir tanımına ulaşma sürecini içerir . Önermek istediğim, her ikisinin de makineyi çalıştırmak veya gözlemlenebilir etkileri gerçekleştirmek için bir çeşit "düşük seviye API" olma ihtiyacını üstlendiğidir. Bunlar genellikle çalışma ortamının bir parçası olarak kabul edilir.
- Çalışma zamanı ortamı veya çalışma zamanı , dil kuralının çalışması için varolması gereken varsayılan ilkeler kümesidir. Dilin ilerleyişine bakıldığında, davranışlarıyla ilgili bazı varsayımlar olabilir, ancak gözlemlenemezler. Yukarıdaki tercümanın görüntüsünde, "içerideki adam" sadece çalışma zamanının anahtarlarını değiştirir --- ne yaptıklarını şahsen denetleyemez.
Çalışma zamanı sözcüğü genellikle varsayılan ilkellerin kendi kümesini ve bunların gerçek bir örneğini ifade etmek için kötüye kullanılır .
Şimdi kıllı birşeye ulaşıyoruz. Dil, yürütme anlamına anlam kazandırmak için bir çalışma zamanının varlığını varsayan bir kurallar kümesidir. Kapsam dışı oldukları için asla “kendilerine girmez”.
Bir dili gerçekten kullanmak için, bir çalışma zamanı uygulamasının yanında derleyici veya tercüman gibi bir şey istersiniz. Derleyici / yorumlayıcı ve bu çalışma zamanı gerçekten kodunuzu çalıştırmada el ele gider .
- Chrome'un genellikle motor olarak adlandırılan V8'i , ECMA standart JavaScript sözleşmelerinin talep ettiği çalışma zamanı arayüzü ile uyumlu bir tercüman, derleyici, çalışma zamanı uygulaması içeren bir paket anlaşmadır.
Peki Node.js bunun neresinde bulunuyor?
Parçalara ayırmalıyız:
- Node.js , ECMA standartlarının dışında kalan daha geniş bir çalışma zamanı ortamı ilkeleri kümesi sağlayarak JavaScript dilini genişletir . Bunlar, dosya g / Ç gibi şeyler içerir . Bu, Node.js'nin dili değiştirdiği ve bir anlamda yeni bir dil olduğu anlamına gelir : "Node.js JavaScript"
- Node.js, bir paket olarak, bir tercüman ve bir derleyici içerir. Sadece bunları V8'den çaldı.
- Node.js, "Node.js JavaScript" çalıştırılmasına izin veren Node.js çalışma zamanı ortamının bir uygulamasını sağlar.
- Node.js, "Node.js JavaScript" in son kullanıcıları için daha erişilebilir kılan yeni ilkellerin üzerine inşa edilmiş bir dizi standart kitaplık sunar .
Yani Node.js bir çok şey!
Ama bu bir çerçeve mi?
Terminolojinin tamamen parçalandığı yer burasıdır - hiç kimse bir çerçevenin gerçekte ne olduğuna dair iyi, tutarlı ve anlamlı bir tanımı yoktur.
Öfkeli tartışmalar var: “kütüphaneye karşı bir çerçeve nedir” ve “kütüphane çağırdığınız ve çerçeve sizi çağıran bir şey” gibi tatmin edici olmayan şeylerle biter. Gerçekten çok üzücü bir açıklama yapmak istiyorum, gün ışığına - ama JavaScript ve özellikle Node.js JavaScript, bu tanımlamaya büyük bir darbe çünkü geri aramadan geçen tüm teknikler sürekli arama yapmak arasında geçiş yaptığınız anlamına geliyor ve aranıyor.
Benim görüşüme göre, burada önemli bir şey var. Parlak bir çizgi çizmek istemiyorum ama sadece söyleyeceğim
- Bir kod kümesi, bir lego kümesi gibi çalışıyorsa kütüphane gibidir : bölünebilir ve montaj için üretilmiştir. Kütüphanenin nasıl kullanılacağına dair bazı örnekler olsa da, genellikle kullanıcının ihtiyaçlarına göre bir araya getirilmesi kendi üzerindedir.
- Bir kod kümesi bölünemezse ve kurallara uyuyorsa çerçeve şeklindedir *: parçalarını parçalara ayırmak birçok varsayımın başarısız olmasına neden olabilir, bu nedenle bir çerçeveyi doğru kullanmak için geleneksel kullanımı anlamanız gerekir.
Bu emin olmak için el dalgası bir çizgi, ama çerçeveler hakkında gerçekten ilginç bir nokta çizmek istiyorum:
Altyapılar, kodun nasıl yorumlanacağına dair bir takım sözleşmeleri ifade eder; bu nedenle kendi başlarına bir dildirler.
Bu, insanların da tartışmak istediği bir şey olabilir, ancak daha önceki tanımımı bir dilin sadece bir metin bloğuna hayat veren bir dizi sözleşme olduğunu kabul ettiyseniz, o zaman ne zaman yeni bir gelenek katmanı hazırladığınızı ' yeni bir dil kurdum. Belki çerçeveler ile ham maddeler, ham metin dosyaları yerine ana dillerinin semantik yorumlarıdır , ama fikir aynıdır!
Tüm bunlara rağmen, Node.js 'i normlara karşı biraz da olsa bir çerçeve olarak adlandırmaktan tamamen mutluyum! Node.js , dili genişletme biçiminde ham JavaScript'e işlevsellik ekler . Bununla beraber, bu genişletilmiş dilde çalışmak için yeni varsayımlar ve araçlar getiriyor. İşlevsel olarak, bu fikirler Ruby on Rails gibi iyi kabul edilmiş diğer çerçevelerin fikirleri ile aynıdır .
Eğer şu anda biraz tedirgin hissediyorsanız ve Ruby on Rails ile Node.js arasında bu tür şeyler arasında büyük bir bölünme olduğunu savunmak istersem , elbette tam oradayım . İkisinin içinde yaşadığı kavramsal dünyalar dramatik bir şekilde farklıdır - Ben sadece onların aynı şey olduğunu söylemek istiyorum: belirli bir alandaki bir baz dilin güçlerini genişletmek için kongre setleri.
Ayrıca Node.js sitesinin etki alanının küçük ve sıkı olduğunu ve bu nedenle eklediği sözleşmelerin basit ve makul şekilde düzeltilmesi kolay olduğunu belirtmekten memnuniyet duyuyorum. OTOH, Ruby on Rails "iş web uygulamaları" nın karmaşık, kötü tanımlanmış bir etki alanında yaşıyor, bu da koydukları sözleşmelerin kesinlikle bulanık ve bozuk olduğu anlamına geliyor.
Fakat bunların hepsi, uzun bir yoludur, evet, işe alım uzmanları bunu söylediğinde ne anlama geldiklerini bilmiyorlar. Sanırım "çerçeve" sadece "çalışma zamanı" veya "motor" dan daha iyi, daha somut bir kelime gibi geliyor.