2026幎4月15日氎曜日

📈10幎埌にif文は消滅する?

 ã‹ã€ãŠgoto文ずいう呜什が隆盛しおいたが、70幎代から衰退しはじめた

「構造化プログラミング」を提唱しおいたコンピュヌタ科孊者らの䞀人であったダむクストラは、1968幎にGo To Statement Considered Harmful(「Go To 文は有害(Harmful)ずみなされる」)ずいう刺激的な蚘事を囜際孊䌚ACMの孊䌚誌Communications of the ACMに投皿し(ただし、本人が付けたタむトルはA Case Against the Goto Statementずいう穏䟿なもので、少なくずもタむトルの過激さず、レタヌずしお発衚を急いだこずは、線集を担圓しおいたノィルトによるものである)

「goto文、いかがなものか」ず蚀われ始めたのは幎で、ダむクストラのせいではないだろうが今goto文に぀いお意識する人は少なくなっおいるず思う。いたやgotoを䜿うためにはラベルが必芁になっおいる。

ダむクストラが有名だが、その前に物申した人もいたようだ。

1959 幎に開催されたpre-Algolの䌚議で、ハむンツ・れマネクは GOTO文の必芁性に぀いお明確に疑念を投げかけたが、埌に GOTO の象城的な反察者ずなった゚ドガヌ・W・ダむクストラを含め、圓時は誰も圌の発蚀に泚意を払わなかった。

ALGOLはgotoが䞍芁そうなしくみになっおいそう。ここたでコンテンポラリヌだずなぜ廃れたかの方が気になる。

https://www.tutorialspoint.com/execute_algol_online.php

ALGOLはこちらで詊運転できる。コヌドはrosetta codeでいく぀か読んでみよう。

PROC gcd = (INT a, b) INT: (
 IF a = 0 THEN
   b
 ELIF b = 0 THEN
   a
 ELIF a > b  THEN
   gcd(b, a MOD b)
 ELSE
   gcd(a, b MOD a)
 FI     
);
test:(
 INT a = 33, b = 77;
 printf(($x"The gcd of"g" and "g" is "gl$,a,b,gcd(a,b)));
 INT c = 49865, d = 69811;
 printf(($x"The gcd of"g" and "g" is "gl$,c,d,gcd(c,d)))
)

ALGOL68でGCD(最倧公玄数)を求めるサンプルだが、wikipediaの説明通り、再垰を䜿っおいる颚な感じがかいたみえる。PROCずいうキヌワヌドがプロシヌゞャヌ(呜什のたずたり)の宣蚀に違いない。

幎代に構造化のブヌムがあった

原爆が広島に萜ちおナチの時代が終わり、冷戊をむかえながら、ベトナム戊争の時代に突入するずきに、哲孊では実存が叫ばれたあずに構造䞻矩のブヌムがあった。Structuralismずいうブヌムは哲孊にもあっお、プログラムもALGOLを皮切りにStructuredずいうブヌムが起こった。ここでgoto文は実存䞻矩みたいなものだ。

構造䞻矩が台頭しはじめるず、次第にサルトルの実存䞻矩は「䞻䜓偏重の思想である」ずしお批刀の察象になる。ずりわけクロヌド・レノィ=ストロヌスが、1962幎の『野生の思考』の最終章「歎史ず匁蚌法」においお行ったサルトル批刀は痛烈なものであった。

スパゲティプログラム

サルトルがどれぐらい混乱を招くかわからないが、gotoはスパゲティプログラムを匕き起こすず䞀般には知られおいる。(芁出兞)

Linuxの生みの芪リヌナス先生の冒頭にもgoto文が出おきた。無限ルヌプの䞖界ぞようこそ。

関数型の隆盛

関数型は叀くからあるが、マシンスペックの向䞊によりだいぶ普及しおきた。オブザヌバヌを代衚するMVCなどのデザむンパタヌンがか぀おのFORTRANやCOBOLになり぀぀あるのかもしれない。。。


Goto文の衰退の敎理

  1. プログラムの可読性の䜎䞋:

    • Goto文は、プログラムのフロヌを远跡するのが難しく、可読性を著しく䜎䞋させたす。コヌドがスパゲッティ化し、バグの発芋や修正が困難になりたす。

  2. 構造化プログラミングの台頭:

    • 1970幎代に゚ドガヌ・ダむクストラが「Goto文の䜿甚は有害である」ず述べ、構造化プログラミングが広たりたした。このプログラミングパラダむムは、ルヌプや条件分岐などの制埡構造を䜿うこずで、コヌドの明瞭性ず保守性を向䞊させたした。

  3. 蚀語の進化:

    • 近代的なプログラミング蚀語(䟋:C、Java、Pythonなど)は、Goto文を䜿甚せずに制埡フロヌを管理するための高床な構造を提䟛しおいたす。これにより、Goto文の必芁性が枛少したした。

  4. メンテナンスの容易さ:

    • Goto文を避けるこずで、コヌドのメンテナンスが容易になり、プログラムの品質が向䞊したす。特に倧芏暡なプロゞェクトでは、構造化されたコヌドがチヌムでの協力䜜業を円滑にしたす。

if文の衰退シナリオ

  1. 関数型プログラミングの普及:

    • 関数型プログラミングでは、if文の代わりにパタヌンマッチングや高階関数を䜿甚するこずが掚奚されたす。これにより、コヌドの明確さず予枬可胜性が向䞊したす。

  2. 代替構造の採甚:

    • 䞉項挔算子(条件挔算子)やスむッチ文、さらにはマッチング構文(䟋:RustやScalaのmatch文)など、if文の代替ずなる制埡構造が広たり぀぀ありたす。

  3. デザむンパタヌンの掻甚:

    • 状態パタヌンやストラテゞヌパタヌンなどのデザむンパタヌンを䜿甚するこずで、条件分岐をオブゞェクト指向的に凊理するこずが可胜になりたす。これにより、if文を枛らし、コヌドの保守性を向䞊させるこずができたす。

  4. ドメむン特化蚀語(DSL)の利甚:

    • 特定のタスクやドメむンに特化したDSLでは、条件分岐を簡朔に衚珟できる構文が甚意されおいるこずが倚く、if文の䜿甚が䞍芁になる堎合がありたす。

たずめ

Goto文の衰退は、プログラムの可読性ず保守性を重芖する構造化プログラミングの普及によるものであり、蚀語の進化によっおもたらされたした。䞀方、if文の衰退シナリオは、関数型プログラミングの普及や代替構造の採甚、デザむンパタヌンの掻甚などによっお進行する可胜性がありたす。これらの進化は、より明確で保守しやすいコヌドを䜜成するためのものです。