パスワードを忘れた? アカウント作成
14074294 journal
日記

dotkuwaの日記: 非同期のひどさ 4

日記 by dotkuwa

同1.一つ一つ実行順序が決まっている
同2.前の処理の後処理の結果が、次の処理の前処理になる
y←f(x)
z←g(y)
「同期処理」に対して、
 
y←f(g(・), h(・), i(・), j(・))という関数が有った場合、
非1.g, h, i, j の実行順序が決まっていない。
  g→h→i→jの順番に実行するとは限らない。
非2.f の実行に対して、答えのy を直接的に入手できない。
  f の実行直後のタイミングで即座に答えを入手できない。
という「非同期処理」が有ります。
 
この「非同期処理」に対し、
・同期処理は古く、非同期処理が次代の要だ。
・オブジェクト型のプログラムはそれに対し弱く、関数型の
 プログラムが求められる。
と言った事が言われていますが、嘘だと思います。
 
まず、「同期処理が古い」かどうかですが、逆だと思います。
古いと言われているプログラミング言語のVB4, VB5, VB6 などは、
・イベント処理(ボタンを押したり、キーボードを押したりの処理)
 は、非同期処理しか無く
・VB 特有の(今では悪いと思われている、実際後で見て困る)くせは、
 『非同期処理しか無い』機能にグローバル変数のフラグなどを追加し、
 なんとか同期処理になる様にする

試みの為で、
VB より新しい言語は、同期処理が基本で、必要な時に非同期処理
機能を追加する形になっている筈です。
 
最近の、Webアプリのイベント処理も、
・入力(リクエスト)と出力(レスポンス)
が「同期」処理になっています。
 
さらに、「非同期処理」は、
非3.特に、f の実行がエラーだった場合、対処が即時には出来ない、
  エラー結果もタイムリーに見る事が出来ない or 永久に出来ない
為、
・うまく行かない事をどうしても無視する・後で補償する
 (伝票入力後に赤伝を入力するの様な)
ことしか出来ず、脆弱性の元になる傾向が有り、
より実用的なアプリはより「同期処理」に近づくのが普通です。
 
もっと言うと、関数型言語は、
・どんなに関数の実行を延期出来ても、
・関数を第一級の存在と出来ても、
「非同期処理に強く」はなりません。たんなる印象操作です。
 
・即座に結果の値を手に入れる事が出来ない為、複数の呼出
 プロトコルで結果を後から手に入れる、
というやり方を抽象化したものが(ものも)オブジェクト指向の
書き方で、逆に、
y←f(x)の様な書き方は、その表現自体が「同期処理」です。
 
この様な
・(俗に言われているのと逆で)古く
・(俗に言われているのと逆で)大多数の場合に不利になる
やり方を、広める事は、決して公共の福利を増大させないでしょう。

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
  • by miyuri (33181) on 2019年12月22日 1時03分 (#3735360) 日記

    ツッコミを入れたいけど、じょうずに書けないもどかしさ。
    (´・ω・`)

    • by dotkuwa (9387) on 2019年12月29日 8時23分 (#3738452) 日記

      もちろん、この件が同期非同期では無いと言われれば、その様にします。
      自分も、TDDと言われて嫌な思いをし続けているのですから。。。
       
      しかし、TDDとか言っている人間と違うのは、彼らは、実際にやるのは
      無智盲昧なお前らで、自分らは成った暁に、成果と名声を得る権利を
      留保することしかしていないのに対し、自分はそうでは無いです。

      親コメント
  • プログラミングについて全くの素人なんですが、マルチプロセッサにおけるマルチスレッド [oracle.com]についてはいかが考えますでしょうか?
    非同期が標準で、同期はなんらかの指示が必要と思うのですが。

    • 今回「非同期処理」をという事をいうのに、
      ・f の実行に対して、答えのy を直接的に入手できない
      という、
      ・ある1つの関数の入力と出力の因果関係が隠されている
       とより良いプログラムの書き方になる
      様な言い方にしました。
       
      しかし、ご指摘の文書では、
      ・複数の関数(同じものが複数の場合も、違う場合も有り)
       の実行に対して、互いの入力・出力を必要としない場合に
       効率が良くなる
      という、
      ・複数の関数の入力と出力に因果関係が無い場合、
       効率が良くなる
      という主張だと思います。
       
      前者は、VB4とかの頃は主流かつ異を唱える事が困難な、
      「確実に正しい」とされたやり方で、
      後者は、単なる事実です。
      現在でも、似たような言い方で、
      ・宣言的に表記するとより良くなる
      という事がよく言われますが、大抵だめになったり、
      します。
       
      -------------------
       
      想像ですが、技術的負債を言い逃れるのに都合が良いのが、
      (前者の定義の)非同期処理であり、宣言的表記だから
      なのだと思います。
      VB4、VB5、VB6にも言語として技術的負債が有ったのだと
      思います。古いCSSに技術的負債が有り、新しくなると
      それが減りますが、(前者の定義の)非同期であったのが、
      (前者の定義の)同期的になる方向の改善ばかりです。
       
      それに対しまして、マルチスレッドに関する議論は、
      ほぼ『物理的』事実といっていい、何の疑問点も無い
      事柄です。
      ですので、
      ある関数の出力と別の関数の入力に関する非同期は標準だと
      自分も思います。
       
      しかし、
      ある関数の入力とその関数の出力に関する非同期
      (因果関係の隠蔽、作りつけの隠された機構による
       「上手い」配慮、ブレーキフルードに溜まった泡)は
      問題の巣窟だと思います。
      #歴史的にこの「やり方」も『非同期処理』と呼ばれて
      #いたのは歴史的事実だと、強く確信します。

       
      -------------------
       
      ただし(これ以降「前者の定義の」同期・非同期を
      指定なしに記します)、
      ★非同期は良くない場合が多いが、決定的に必要な
       場合もない訳ではない。
      ★関数型プログラミングは同期しか扱えず、
       オブジェクト型プログラミングは同期も非同期も
       扱える
       ***ので***
       オブジェクト型言語は良くない。
      という主張は間違っていると思います。
      オブジェクト指向で主に同期処理を扱いさえすればよいだけ
      だと思います。

      親コメント
typodupeerror

皆さんもソースを読むときに、行と行の間を読むような気持ちで見てほしい -- あるハッカー

読み込み中...