70277


言葉の意味がよくわからないのでご質問させてください。

例えば、nim言語（おそらくPHPなどでも同じでしょうが）では、  
ファイルの書き込みは以下の様に実現できます。

[code]

    var fw = open("test.txt" , FileMode.fmWrite)
    fw.write("hoge")
    fw.close
    
[/code]

また以下のように書いても同じ動作をしているようです。

[code]

    import streams
    
    var fw = newFileStream("test2.txt", fmWrite)
    fw.write("hoge")
    fw.close()
    
[/code]

この違いは何なのでしょうか？  
それぞれメリット・デメリットはあるのでしょうか？

ご存知の方がいらっしゃいましたら、ご教示いただけますと幸いです。  
よろしくお願いいたします。


CC BY-SA 4.0
2020-09-10T02:12:37.353
70274
2020-09-10T03:43:25.340
2020-09-10T03:43:25.340
35558
31257
question
アルゴリズム
fileの読み込みや、書き込みで出てくるstreamとは何でしょうか？


言語や処理系によって詳細は異なることがあるので一般論になってしまいますが、例えば [c](/questions/tagged/c "'c'
のタグが付いた質問を表示") においては「高水準入出力」「低水準入出力」と呼ばれる違いになります。

  * 高水準入出力  
プログラマにとって扱いやすいよう物理デバイス・物理機能を抽象化したものです。提示「ストリーム」はこっち。たいてい高度なバッファリング機能が実装されています。例えば
[c](/questions/tagged/c "'c' のタグが付いた質問を表示") の `fopen()` はこっち。

  * 低水準入出力  
物理デバイス・物理機能を直接取り扱うものです。そのデバイス・機能に特化した何かがしたいとき、あるいはバッファリング機能が邪魔になるような要望では、こっちを使います。同様
[c](/questions/tagged/c "'c' のタグが付いた質問を表示") の `open()` だったり `CreateFile()`
だったりは、こっち。

「ファイル」でも「ソケット」でも「 COM
ポート」でも「ネットワーク」でも、入出力ができることに違いはありません。高水準入出力と呼ばれるものは、これらの細かい違いをプログラマが気にすることなく入出力を行えるよう、言語処理系自体やライブラリや
OS
が抽象化したものです。そして、高水準入出力を使うと適切にバッファリングされることが多い、すなわち性能が出ます。低水準入出力は逆で、これを多用すると性能が出ませんが、そのデバイスに応じた機能が使えたりします。

使い分けなきゃならない例：例えばゲーム

  * 高水準入出力で「標準入力」を読むと「改行」が入力されるまでバッファリングしてしまいます。要するにリアルタイムに今この瞬間の入力状態を読むには向きません。
  * 低水準入出力で「キーボード」を読むとバッファリングされないので、１文字タイプされた時点でリアルタイムにそのキーコードを取得できたりします。

ほとんどの用途では高水準入出力を使って問題ないです・そのほうがいろいろと応用が利きます。低水準入出力は、それを使わないと「何とか機能」が実装できない場合に限って使います。

特別な例としてはデータベースソフトなどでは [c](/questions/tagged/c "'c' のタグが付いた質問を表示")
処理系が用意したバッファリングロジックでは性能が出せないなどの理由により、オレオレバッファリングロジックを実装して低水準入出力を使っていたりしますが、まあ普通のプログラマが普通に何かを作る際には高水準入出力を使えばよいですね。


CC BY-SA 4.0
2020-09-10T03:36:57.737
70277
2020-09-10T03:36:57.737
8589
70274
answer