入門者のためのNode.js関連用語の意味と体系化 （注意：間違い多し）

公式ドキュメントやQiitaの解説は入門者には意味不明だったので、翻訳するための知識が必要と思ってここにまとめておく。執筆者が勉強中により内容が頻繁に書き換えられます。

>勉強中の関連記事まとめ
>[自分用の勉強記事をまとめた目次　~擬似知識体系~](https://qiita.com/oekaki-hoho-ron/items/3194f560efc461ec03b0)







#基礎知識がないと記憶が定着しない

まず、こんな記事をまとめる必要性を感じたキッカケについて。知識も経験を触りだけの初心者なりに公式チュートリアルを読みながら自分のサイトをNext.jsで再構築してみようと試みたところ、ある程度まではチュートリアルに言われた通りにやることは可能だったが、次第に「そのコードを書く意味は何？」という疑問が1ステップに1つついてくるようになり、疑問が山積みになったあたりで知識体系が完全崩壊し、学んできたことが記憶に定着しないという事態に陥った。つまり知識が蓄積されず仕舞いに終わったと言うことで、それならば今学習していることの知識が定着しないのであれば、さらにその下層の知識体系から構築する必要があると考えた。よって、Next.jsの前にNode.js、Node.jsの前にWEBアプリのアーキテクチャなどの基礎知識、というように疑問にぶち当たるたびに下層知識に学習をシフトしていった結果、とりあえず用語の意味の理解と体系化が必要だという結論に至った。

>参考文献
>[Node.jsの実行モデルを理解するために必要な前提知識を説明していく](https://qiita.com/junjis0203/items/7d3e63253a3d291a04c6)

以下は、上記の参考文献を初心者なりに再解釈して書き直した感じの内容となっている。

###システムコール

プログラミング言語にはファイルを扱う機能がある。ファイル管理はOSの仕事なので、プログラムでファイルを扱う際にはOSに処理を渡す必要がある。この流れを**システムコール**という。システムコールはOSによって異なるが、POSIXに準拠したOSにおいては**ファイルディスクリプタ**によってファイルにアクセスする基本的なシステムコールが用意されている。

-open：ファイルを開く
-read：ファイルから読み込む
-write：ファイルに書き込む
-close：ファイルを閉じる

### POSIX

Porable Operationing System Interfaceの略で、UNIXの標準規格のファイル管理システム。

#同期・非同期

同期処理では、呼び出し側が処理を呼び出すと処理が終わるまで返ってこない。例えば、ファイル読み込みであればファイルの内容を読み取るまで返ってこない。

非同期処理では、処理を呼び出したら処理が終わる前に返ってくる。通常のファイル読み込みでは読み込み結果を格納するメモリ領域を渡すが、非同期の場合は呼び出し直後に結果を参照しても値が入っている保証はない。

非同期処理のメリットは、**スループット**の向上にある。スループットは一定時間単位で処理できる量の評価基準。同期処理では一つの処理が完了するまで次の処理に着手しない。一方、非同期処理ではCPUが処理を呼び出しはするが実際の処理にはDMAを利用するためCPUが他の処理に着手することができる。その結果、長時間かかる処理と並行して小さな処理も行えるためより多くのタスクに着手することができ、スループットの向上につながる。

|用語|意味|
|---|---|
|RAM|Ramdom Access Memoryの略で、自由なアクセス可能な主記憶装置のこと。CPUが処理を行う際の作業台のようなメモリでなので頻繁にデータが書き換えられ、電源が切れると作業に使用していた一時データも消去される。|
|ROM|Read Only Memoryの略で、書き込み不可・読み出し専用、または単に内蔵ストレージおよび外付けストレージを指す補助記憶装置のこと。|
|CPU|Central Processing Unitの略で、記憶装置上にあるプログラムと呼ばれる命令列を順に読み込んで解釈・実行することでじょうほうの加工を行う中央処理装置。|
|I/O|CPUや主記憶装置などの機器やシステムに外部からデータや信号を入力したり、外部に出力するための回路、装置、ソフトウェアのこと。入力装置としてはキーボード、マウス、タッチパネルなど、出力装置としてはディスプレイ、スピーカー、モーターなどがある。|
|DMA|Direct Memory Accessの略で、CPUを介さないデータ転送を実現する設計思想のこと。本来ならCPUが処理するデータ転送を引き受けることで、CPUは他のタスクに着手することができる。|

>参考文献
>[DMAのメリットって何？（2/3）](https://ednjapan.com/edn/articles/1608/18/news015_2.html)

#ブロッキング・ノンブロッキング

Node.jsではノンブロッキングI/Oと呼ばれ、

|用語|意味|
|---|---|
|ブロッキング|先着のIO処理が完了するまで待ち時間が発生する性質|
|ノンブロッキング|IO処理に待ち時間が発生すると関数から返る性質。<br><br>簡単に言えば、処理が止まらない性質。<br><br>処理が止まりそうな場合はエラーを返してプログラムが完結しないように回避することで処理し続けることができる。|
|同期|IO処理が終わるまでブロックする性質|
|非同期|IO処理を別スレッドに渡す性質。<br><br>ノンブロッキングによって実現できる処理の仕方。<br><br>ある関数が呼び出されたとき、戻り値として本来渡したい結果は返さず、関数を終了させて呼び出し元に戻し、後で本来渡したかった値を返せる状態になったときにその値を通知する仕組み。|

|比較|類似性|
|---|---|
|同期とブロッキング|ほぼ同じ|
|非同期とノンブロッキング||

>参考文献
>[非同期とノンブロッキングとあと何か](https://keens.github.io/blog/2017/05/19/hidoukitononburokkingutoatonanika/)
>[非同期処理ってどういうこと？JavaScriptで一から学ぶ](https://qiita.com/kiyodori/items/da434d169755cbb20447)

#ソケット

|用語|意味|
|---|---|
|socket||
|bind||
|listen||
|accept||









#Node.jsの非同期処理

非同期処理ではIO処理の待ち時間ができないようにするが、必要としているのはIO処理の結果。別の処理をしつつ、結果が出たらそれを受け取ると言う処理はどうやっているか。正しい順序で処理が行われるようにしなくてはならない。

よそに依頼した処理がいつ終わるかは不明。処理完了は依頼された側しか分からないため、依頼した側に通知する仕組みが必要。

###Promise

非同期処理を実現するためのオブジェクト

- 関数の結果としてreturnできる
- メソッドを持っている
- 変数に格納できる

###async/await

Promise のシンタックスシュガー

>参考文献
>[Node.js 非同期処理・超入門 -- Promiseとasync/await](https://qiita.com/ef81sp/items/29b7b91a3f3e77cf2233)








#UML

UMLとは「Unified Modeling Language」の略で「統一モデリング言語」の意。分析、設計、実装のオブジェクト指向開発に用いられるモデリング手法。

UML図とは、ソフトウェアシステムの成果物を記述、視覚化、構築、文書化するために使用される国際的な業界標準のグラフィカル表記法。

>参考文献
>[初心者が押さえておくべきのUML入門知識](https://www.edrawsoft.com/jp/uml-introduction.php)