web-dev-qa-db-ja.com

Node.jsはフレームワークですか?

採用担当者や開発者などがNode.jsをフレームワークとして参照しているのを見続けています。私の意見では、これはNode.jsが実際に何であるかを無知ではありません。

多くの場合、ジョブの説明では、Node.jsは AngularJSReact などのライブラリとしてグループ化されています。一般的に、違い(人事、採用担当者など)を知っている。

私の意見では、Node.jsはプラットフォーム、またはランタイム環境です。ファイルシステムのような他のさまざまなAPIのDOM API(ブラウザーではJavaScript)を切り替えます(ブラウザーではなくサーバーとして実行されるため)。

Node.jsがフレームワークであると人々が考えるのはなぜですか。私が間違っている?それは実際にフレームワークですか?

36
ndugger

これらの単語は明確に定義されていないため、言うのは少し難しいです。一般的な言い方をすれば、Node.jsをフレームワークと呼ぶのは少し変則的だと思いますが、なぜそうでないのかについて、私は議論するのが難しいでしょう。

これはすべて厄介です、そして私はしばしば言語の本当に貧弱な使用法を見るので、私は明確にして下から始めます


JavaScriptはコンピュータ言語です。つまり、狭義には、一連のテキストを読み取って実行セマンティクスと解釈できるようにする一連の規則です。言語を一連の指示として解釈する方法」 interpreters compilers transpilers lintersと呼ばれるプログラムのクラス highlighters などはすべて、テキストを受け取り、この従来のコードの実行方法を理解した上で何かを試みます。

  • インタプリタ実際に perform 実行セマンティクスは、いくつかのマシン(通常はコンピュータ)を操作して実行します。 JavaScriptプログラムで記述された命令に基づいて、 "print this character"のようなスイッチを切り替えるコンピュータ内の小さな男と考えることができます。
  • CompilersJavaScriptテキストを、異なる言語の実行セマンティクスを持つ新しいテキストセットに変換しようとします。おそらく、コンピューターが直接できる特別なプロパティを持つテキストです。それを実行します。
  • Transpilersは、JavaScriptテキストを受け取り、他の言語のテキストを出力するという点で、コンパイラの一般化された形式です。したがって、違いは少し主観的ですが、通常、コンパイラは非常に低レベルのコードを出力し、トランスパイラは高レベルを出力すると考えますコード。
  • Lintershighlighterstype checkersなどはすべてJavaScriptテキストを取り込んで、ある種の分析結果を出力します。実行セマンティクスの影響を受けますが、実際にはそれを表すものではありません。

それでは、実行セマンティクスを少し掘り下げましょう。一般に、実行セマンティクスには、言語テキストを読み取り、抽象マシンの説明または観察可能な副作用の説明に到達するプロセスが含まれます。私が提案したいのは、これらの両方が、マシンを操作するため、または観察可能な効果を実行するために、何らかの「低レベルAPI」が必要であると想定していることです。これらは通常、ランタイム環境の一部と見なされます

  • ランタイム環境またはランタイムは、言語が想定するプリミティブのセットです慣習が機能するためには存在する必要があります。言語に関する限り、彼らの振る舞いについて何らかの仮定があるかもしれませんが、彼らは観察できません。上記のインタープリターの画像では、「内部の男」はランタイムのスイッチをフリックするだけです---彼は自分が何をしているかを個人的に検査することはできません。

単語 runtime は通常、想定されるプリミティブ自体のセットの両方の実際のインスタンス化の両方を意味するために悪用されます。


だから、今私たちは毛むくじゃらの何かに行きます。言語は、実行セマンティクスに意味を提供するためにランタイムの存在を前提とする一連の規則です。それらは範囲外であるため、「それらを調査する」ことはありません。

実際に use 言語を使用するには、ランタイム実装とともにコンパイラーまたはインタープリターのようなものが必要です。コンパイラー/インタープリターとこのランタイムは、実際に executing コードを連携させます。

  • Chromeの V8はしばしば engine と呼ばれ、インタープリター、コンパイラー、ECMA標準JavaScript規則で要求されるランタイム・インターフェースと互換性のあるランタイム実装。

では、Node.jsはこれにどこに適合するのでしょうか。

それを部分に分解する必要があります:

  1. Node.js は、ECMAの標準の範囲外であるランタイム環境プリミティブのより大きなセットを提供することにより、JavaScript言語を拡張します。これらには、 file I/O のようなものが含まれます。これは、Node.js が言語を変更/し、ある意味で新しい言語である "Node.js JavaScript"であることを意味します
  2. Node.jsは、パッケージとして、インタープリターとコンパイラーを含みます。 V8からこれらを盗むだけです。
  3. Node.jsは、Node.jsランタイム環境の実装を提供して、「Node.js JavaScript」を実行できるようにします。
  4. Node.jsは、新しいプリミティブの上に構築された一連の標準ライブラリを提供します。これにより、「Node.js JavaScript」のエンドユーザーがアクセスしやすくなります。

したがって、Node.jsは多くのものです。

しかし、それはフレームワークですか?


ここで用語が完全にバラバラになります。フレームワークが実際に何であるかについて、誰もが適切で一貫した意味のある定義を持つことはありません。

「フレームワークとライブラリの違い」と呼ばれる論争があり、「ライブラリはあなたが呼ぶものであり、フレームワークはあなたを呼ぶもの」のような不十分なものに終わります。私は本当にそんな悲しい説明を一日の明かりで伝えたくありません。しかし、JavaScript、特にNode.js JavaScriptは、この定義に対する大きな打撃です。なぜなら、コールバックを渡すテクニック全体があなたを意味しているからです常に呼び出しと呼び出されている間を切り替えます。

私の個人的な見解では、ここには本質的なものがあります。明るい線を描きたくないので、

  • レゴのセットのように機能する場合、コードのセットはライブラリのようです:分割可能で、アセンブリ用に作成されます。ライブラリの使用例はいくつかあるかもしれませんが、一般的には、ニーズに合わせてライブラリを組み立てるのはユーザー自身です。
  • コードのセットは、分割不可能であり、規則を暗示する場合、フレームワークに似ています*:コードの一部を引き離すと、多くの仮定が失敗する可能性があるため、従来の使用法を順番に理解する必要がありますフレームワークを適切に使用するため。

これは確かに手波ですが、フレームワークについて非常に興味深い点を引き出したいと思います。

フレームワークは、コードを解釈する方法の一連の規則を意味します。したがって、それらはそれ自体が言語です。

これも人々が議論したいことかもしれませんが、私の以前の定義を購入した場合、言語はテキストのブロックに命を吹き込む一連の規則にすぎないとすると、新しい規則の層を置くたびにveは新しい言語を構築しました。おそらくフレームワークでは、原材料は生のテキストファイルではなく、ホスト言語のセマンティック解釈ですが、考え方は同じです!


以上のことから、Node.jsをフレームワークと呼んでも、それが標準に少し反していても、とても満足しています。 Node.jsは、生のJavaScriptに言語を拡張する機能を追加します。これにより、この拡張された言語で作業するための新しい前提条件とツールがもたらされます。機能的には、これらのアイデアは Ruby on Rails のような他の広く受け入れられているフレームワークのアイデアと同じです。

この時点で少し気分が悪く、Ruby on RailsとNode.jsの間に大きな隔たりがあることを主張したい場合、その後、私はあなたとすぐそこにいますもちろん、2人が住んでいる概念的な世界の種類は劇的に異なります —それらは同じ種類のものであると言いたいだけです。特定のドメイン内で基本言語の機能を拡張するための一連の規則です。

また、Node.jsのドメインは小さくてタイトであるため、追加された規則は理由を説明するのが簡単で、修正も比較的簡単であることも嬉しく思います。 OTOH、Ruby on Railsは、「ビジネスWebアプリケーション」の複雑で不十分に定義されたドメインに住んでいます。つまり、その規則は確かにあいまいで壊れています。


しかし、これらすべては長い言い方です、そうです、採用担当者はおそらくそれが何を意味するのかわからないでしょう。 「ランタイム」や「エンジン」よりも、「フレームワーク」のほうが、より良い、グロッカブルな言葉のように聞こえると思います。

44
J. Abrahamson

Node.js®は、ChromeのV8 JavaScriptエンジン上に構築されたJavaScriptruntimeです。

ソース

ノードはランタイムまたは環境です。フレームワークではありません。人々(私は感じます)は、エクスプレスのようなフレームワークがノードの至る所にあるので、しばしばこれを間違えます。

ランタイムvsフレームワークの詳細 興味がある場合。

20
rlemon