GoTo トラベル ~ GoTo トラブル

goto文 論争


「 構造化プログラミング 」 を提唱していたコンピュータ科学者らの一人であったダイクストラは、
1968年に Go To Statement Considered Harmful *1 という刺激的な記事を 国際学会ACM の 学会誌 Communications of the ACM に投稿し*2
こんにちでは 構造化プログラミング に関して最も良くその名前だけが知られている論争となっている *3

  クヌースの言葉を借りるならば、 「 go to 文 除去 の 話の二番目の場面は,多くの人たちが第一幕だと思っている事実である.」 *4

また considered harmful というフレーズはその後、定番ネタとして、しばしば似たような深刻な、あるいは軽妙な論争に関して付けられるものとなっている *5

ダイクストラの主張

“Go To Statement Considered Harmful”[4]の趣旨は次の通りである。

人間が時間によって変化するプロセスを把握する能力は、プログラムの静的な関係を把握する能力に比べて劣っているため、静的なプログラムテキストの構造と時間によって変化するプロセスの構造をなるべく近づけるのが重要である。
そのためにはプロセスの進捗を表す簡潔な指標が必要である。指標とは例えば実行中の行番号・その時点でのスタックトレース・行番号とループを回った回数のペアなどである。
例えば、1人が部屋に入るごとにカウンタを増やしていくプログラムにおいて、カウンタが室内の人数-1である瞬間はどこにあるのかという問いに答える際に、簡潔な指標があればすぐ答えられるが、簡潔な指標がなければ正確な答えは難しくなる。
goto文を無条件に許してしまうと簡潔な指標は得られなくなってしまうため、高水準プログラミング言語においてはgoto文は廃止するべきである。
その一方でクヌースの指摘[5]によると、ダイクストラは“Structured Programming”[6]においてはgoto文には触れていない。実際に“Structured Programming”においては“sequencing should be controlled by alternative, condtional and repetitive clauses and procedure calls, rather than by statements transferring control to labelled points.”との1文があるのみでそれ以外では触れていない。

また、「3つの基本構造」(後述)についても、“Go To Statement Considered Harmful”においては“I do not claim that the clauses mentioned (引用者註: 順次・分岐・手続き呼び出し・反復) are exhaustive in the sense that they will satisfy all needs”とし、「3つの基本構造」には固執していない。

「構造化プログラミングの観点からgoto文を使うのは望ましくない」ものの「単にgoto文を使わなければ見通しが良くなる」という考えは“Go To Statement Considered Harmful”[4]でも否定されており、goto文の有無のみに固執するのは不毛である。構造化プログラミングの本質の一つは、状態遷移の適切な表現方法とタイミングを見極めることである[7]。

3つの基本構造

「goto文有害説」は、ほとんどの場合、「構造化定理」(en:Structured program theorem)に結びつけて主張されたものだと誤解にもとづいて間違って信じられている。構造化定理は、

連接 (sequence): 文1; 文2
選択 (selection): if 式 then 文1 else 文2 fi
繰返し (iteration): do 文 od
という、「3つの基本構造」によって、フローチャートで記述された計算可能な関数は、全て表現できる、というものである。この定理の意味する所は、チャーチ=チューリングのテーゼと同じようなものである。すなわち、計算可能な関数について、それを計算するチューリングマシンを構成することもできるし、ラムダ計算によって計算することもできるし、帰納的関数として定義することもできる、といったことと同様に、フローチャートでも、あるいは「3つの基本構造」の組み合わせによってでも表現できる、ということである。

できる、というだけで、そのようにして表現されたものが人間にわかりやすいか否かについては全く何も主張していないにもかかわらず、「この理論に従えばgotoを除去できる」(これは正しい)、「ゆえにわかりやすいプログラムになる」(これは正しくない)というのが、「goto文有害説」であるとして信じられるようになったため、この記事内を含め、そういったような記述がしばしば見られるが、前提の時点で間違っている。

構造化定理に従って「gotoの無いプログラム」に書き換えたプログラムが実際のところどのようなものであるのかは、英語版記事の en:Structured program theorem#Single-while-loop, folk version of the theorem に示されている。クヌースは「go to 文を用いた構造的プログラミング」の中で、これと同様のプログラムを示し「これですべての goto 文を除去できたわけであるが,実際にはすべての構造を失ってしまっている.」と述べ、構造化定理が示すことは、全くの「非構造化プログラミング」であることを警告した。

goto擁護派

一方、goto文を使わずに3つの基本構造による代替を行うと、理論上は同値であっても実際にはプログラムの実行速度や記憶容量の点で性能が劣化する場合があることを示し、goto文を擁護する意見もあった[8]。

前の節で述べたように、本来の主張では、goto文は全て3つの基本構造による代替によって書けるのだから、それにより書き換えよう、などという主張ではなかったので、「理論上は同値であっても実際にはプログラムの実行速度や記憶容量の点で性能が劣化する場合があることを示し、goto文を擁護する意見」というものが、そもそも変である。

ACMの年次大会(1972)の討論会では、トップダウンでプログラムを分割するよりgoto文を使う方が適した事例があり、証明には関心がないという意見(William Wait)や、goto文を残せば選択の余地があるが、無くしてしまうと必要になったとき困るだろうという意見(Guy Steel)などが出された[9]。

条件文とgoto文を正しく使うことで、FORTRANでもALGOLの基本機能を実現できることを例に挙げ、プログラマは必要な機能がプログラミング言語で直接表現できないとき、どのように実装するか工夫できるべきであるという主張もあった(S.W.スリア)[10]。

また、ドナルド・クヌースは「go to 文を用いた構造的プログラミング」(『文芸的プログラミング』収録)の中で、いくつかのgotoを使ったほうが良いだろうという例を挙げているが、その中には、再帰呼出しのある正当なプログラムを、正当な変形によってループによるプログラムに書き換えた結果「ループの中に飛び込むgoto」になる、といったような例も挙げている[5][注釈 5]。

gotoの現在

現在C言語を除く主流派の言語では、そのままの goto 文は ほとんど見られなくなった。
替わりに break 文 、 continue 文 、 もしくは 例外処理のような特殊脱出(去勢された goto とも呼ばれる(実際には関数呼出しをまたいだ、いわゆる大域脱出もできるのだから、gotoよりも例外処理のほうが強力である(が、それを理解できない者も多い))) をサポートし、単純な制御構造だけでは弱いと考えられる部分を補っている。
さらにクロージャやコードブロック、継続のような強力な制御機構を使い、抽象度の低いgoto文を使う必要性を低くした言語もある。例えばHaskellにおいてはモナドを利用して例外や非決定性計算などの様々な制御構造を表現できる。また Smalltalk や Io においても制御構造はブロックを扱うメソッドとして表現している。Scheme 等 でサポートされている継続は 「 引数付き goto 」 と 呼ばれることもある。

一方で、例えば 1999年 から 設計された D言語 は goto 文 を含んでいる]。
PHPにも 2009年 にリリースされた 5.3 において制限された形ではあるが goto 文 が追加された。





*1:「Go To 文は有害(Harmful)とみなされる」

*2: ただし、本人が付けたタイトルは A Case Against the Goto Statement という穏便なもので、少なくとも タイトル の過 激さ と、レターとして発表を急いだことは、編集を担当していた ヴィルト によるものである

*3: その内実は言葉の有名さの割には全く知られていないし、そもそも内容や意味の理解は半世紀という時代の違いによって、かなり難しくなっていることも確かである

*4: という解説自体も 1974年に書かれたものである

*5: 英語版 en:Considered harmful の 記事などを参照

🤒 286 ! 凸(-_-#)

TOKYO  Number of Infected 2020.07 🤒
      1 2 3 4
      67 107 124 131
   
5 6 7 8 9 10 11
111 102 106 75 224 243 206
   
12 13 14 15 16
206 119 143 165 286


だから、重要 なのは、新感染者数 ではなく、

陽性者率!。


すなわち、検査対象者数 と、
  その 対象 の 無作為 抽出さ で、


小池都知事によると、
 「 今日 の 検査件数 は、最多 の 4千数百 件 」。


すなわち、

286 4000 7.15
 
286 5000 5.72

である。


単位文字 %


余談であるが、

『 % 』 は、『 / 100 』 を、
  捩った 単位文字 である。





😷 災厄 になどに 負けぬ ため

Netflix and Chill


f:id:kiratei:20200716200822j:plain


Emergency in Calender

2020.06


x 01
36.4
 
x 02
35.8
*1
x 03
36.5
 
x 04
36.1
 
x 05
36.0
 
x 06
36.0
 
 
07
36.1
08
35.5
09
36.0
10
36.5
11
36.1
12
36.2
13
36.3
14
35.8
15
36.4
16
36.4
17
35.8
18
36.3
19
36.0
20
35.8
21
36.1
22
35.8
23
35.6
24
35.9
25
36.0
26
35.9
27
35.9
28
35.7
29
35.9
30
36.1


 

 

 
2020.07 01
36.5
 
02
35.9
 
03
36.0
 
04
36.1
💊
05
36.1
06
36.2
07
36.0
🏢
*2
08
35.7
09
36.0
10
36.5
11
36.0
12
36.1
13
36.1
14
36.1
15
36.2
16
36.1
17
 
18
 





 

 

 




f:id:kiratei:20200714200643j:plain:w200




Time Line
04.06 宣言対応 勤務体制 通達
04.07 緊急事態宣言 発令 7都府県対象 ~ 05.06
   
05.04 緊急事態宣言 期限 を 06 日 から 31 日 まで 延長
05.25 緊急事態宣言、全面解除
05.26 勤務体制継続  ~ 06.30
06.02 東京都 東京アラート 発動
06.11 東京都 東京アラート 解除
06.19 都道府県を跨ぐ移動を全面解除
06.21 勤務体制継続
07.07 出社 通達!。 連続テレワーク記録 更新 止了 (_ _) 
TOKYO  Number of Infected 2020.07 🤒
      67 107 124 131
111 102 106 75 224 243 206
206 119 143 165 286




*1: 東京都 東京アラート 発動

*2: 社長 との 意見交換会 で、約三ヶ月ぶりに 出社 か?。それ、「要」「急」か?。

茄子土鍋飯!

 

f:id:kiratei:20200716214742j:plain


街 の 中華料理屋 の 昼食ランチメニュー なら、

 土鍋に、
  ( 炊いてある ) 御飯 を 装って、
   作ってある、麻婆茄子 を 載せて
    レンジに掛けて、
     2 ~ 3分 ? で しょうか?


ここに、さらに、生玉子なり、鶉の玉子なり、載せて、
 さらに、刻みネギってのは *1
  無理なんですかねぇ …… 。


というわけで、街 の 中華料理屋 の 昼食ランチメニュー の、
 麻婆茄子 土鍋丼 + 雲呑汁 。


熱い っ てのは、 旨い !。



*1: 編集時、今になって 画像 を 見ると、刻みネギ が 載っている!w 。

愛用 弐号機宝珠 鉄帯 修理了 之 連絡

 

f:id:kiratei:20200715202300j:plain:w240 


愛してる!。

 すぐ、迎えに行く!。



…… 、これを、王国情報部に …… !。


  えっ、ぐっ  (x_x)。

    ま、まさか、貴様 …… !? (@O@) 。






新型ウィルス感染症発表に対する統計学的手法に基づく一考察

2020 .07
      67 107 124 131
111 102 106 75 224 243 206
206 119 143

 


毎日、
 決まった 不定な時刻に
  発表される
   感染者数ですが、

この数値に
 騙されてはいけません!。


重要なのは、
 その 母数 となる 「 検査者数 」 と、
  「 対象検査者 の 偏り の 無さ 」 です。



帝国 エレニウム工廠謹製 九五式 四核同調型 試作宝珠

 

f:id:kiratei:20200714214244j:plain:w240  

「 雑魚 など 知るか!
  なめくさった 敵司令部 を
    叩き潰す! 」


「 数的劣勢 を 考慮しろ。

  単なる 主軍援護 など
   破滅 の 先延ばしだ 」


「 ならば、基盤 を ひっくり返す。
  ゲーム の ルール を 変えてやる! 」

「 本国 から 逃げ出した 負け犬共 が。
  鎧袖一触 にしてやる! 」