Node.js bir çerçeve midir? [kapalı]


35

İşe alım yapanlar, geliştiriciler vb. Görüyorum. Benim düşünceme göre, bu Node.js gerçekte ne olduğunun farkında değil.

Çoğu zaman, iş tanımlarında, Node.js, AngularJS , React , vb. Arasında bir kütüphane olarak gruplandırılmıştır . Genel olarak, farkı bilmeyen birisinin (İK, bir işveren vb.) Girdiğini görüyorum.

Kanımca, Node.js bir platform veya çalışma zamanı ortamıdır; DOM sistemi (tarayıcıda JavaScript), dosya sistemi gibi diğer tarayıcılar için (tarayıcıda değil sunucu olarak çalıştığı için) değiştirir.

Neden insanlar Node.js’in bir çerçeve olduğunu düşünüyor? Yanlış mıyım? Aslında bir çerçeve mi?



5
Özellikle değil, ama karışıklığı görebiliyordum.
gece

1
Uzun zaman önce, ilk düğüm ortaya çıktığında, SO üzerine bir düğüm yayınladığını söyleyen bir cevap verdim. O zamanlar bu cevap çok düşüktü. Bugün, düğümü kullanan çok az sayıda insan bunun bir çerçeve olduğuna inanıyor. Swift'in bir çerçeve veya Go'nun bir çerçeve veya Rust'un bir çerçeve olduğu aynı anlamda bir çerçevedir. Modern programlama dilleri basitçe çerçeveler olarak uygulanmakta olan çok üst düzey API'lere sahiptir. "Platform" iyi bir kelimedir. Ben bir tercüman olduğunu söyleyebilirim (bu kelimenin geleneksel unix anlamını kullanarak)
slebetman

Düğümün DOM API'sini devre dışı bırakmadığını ve javascript ile çalıştırabileceğiniz herhangi bir şeyin düğümlü veya düğümsüz olarak kullanılabileceğini unutmayın.
Rob,

@slebetman Tercümanın "diğer" anlamı nedir? Orada da bir tartışma olduğunu bilmiyordum! : S
J. Abrahamson,

Yanıtlar:


44

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:

  1. 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"
  2. Node.js, bir paket olarak, bir tercüman ve bir derleyici içerir. Sadece bunları V8'den çaldı.
  3. 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.
  4. 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.


hey, oldukça dengeli! öyleyse probably have no idea: 'çerçeve', bir programcı olmadan anlayabileceğiniz bir kelime, gerçekten ne zaman bir fark yaratacağından vazgeçerseniz kullanışlı bir özellik.
n611x007

"Node.js, dili genişletme biçiminde ham JavaScript'e işlevsellik ekliyor." Doğru değil, işlevselliği arttırıyor, dili değil, birçok çerçevenin gerektirdiği şekilde kod yazma şeklinizi değiştirmiyor. Dahil edilen bir kütüphane ekleyebileceğiniz gibi başka işlevler veya nesneler de eklenebilir. Herhangi bir yeni işlev veya nesne gibi onu arayabilir veya kullanabilirsiniz. Programlama stili değişmez, dil temelleri aynıdır ve sadece “bazı” işlevsellik katarlar. Bu yüzden bir çerçeve ya da dil genişletmek değil, eklenmiş varsayılan platform kitaplıklarıyla javascript ve dolayısıyla işlevsellik değildir.
Codebeat

Tabii ki, senin tarafını tamamen takip edebilirim. Bence buradaki çizgi bulanık. Her iki şekilde de bir anlam ifade eder. Kesin bir nokta olarak, düğüm bir FFI sağlayarak JS'yi genişletir, bu da düğümün daha sonra daha fazla sistem kütüphanesi sağlamasına izin veren çekirdek parçadır. Öte yandan, “çekirdek” düğüm sadece çalışma zamanı (ve bu FFI) iken, insanlar düğümü tartışırken çoğu zaman aslında “çekirdek çalışma zamanı, FFI uzantıları ve üzerine kurulu temel kitaplık işlevi” anlamına gelir. düğüm nasıl paketlenir.
J. Abrahamson,

20

Node.js®, Chrome'un V8 JavaScript motorunda yerleşik bir JavaScript çalışma zamanıdır .

kaynak

Düğüm bir çalışma zamanı veya ortamdır. Bu bir çerçeve değil. İnsanlar (hissettiğim) sıklıkla bunu yanlış anlarlar çünkü ekspres gibi çerçeveler düğümle her yerde bulunur.

Eğer ilgileniyorsanız çalışma zamanları ve çerçeveler hakkında daha fazla okuma .


inb4 "ama yaklaşık sayfa" Zaman uyumsuz bir olay odaklı çerçeve olarak "yazıyor." Biliyorum.
rlemon

3
Gömülü v8 çalışma zamanı değil mi? ;-)
johannes

@johannes Bu konuda sizinle aynı fikirdeyim. V8, çalışma zamanıdır ve düğüm basitçe geliştiricinin kullanabileceği araçları genişletir (http sunucusu, util, vb.) Bu nedenle çerçeve etiketinin hala çalıştığını düşünüyorum. Yine de, değiştirilmiş bir v8 ortamıdır; düğüm, projenize yalnızca "dahil ettiğiniz" bir şey değildir. Hepsi sanırım bir perspektif meselesi.
nick

@ rlemon, parça çerçevesi kaldırıldı.
ebram khalil
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.