メルマガバックナンバー 第11回
もくじ
変態言語とチューリング完全とドラクエと
チューリング完全って?
前回「変態プログラミング言語の世界」の続きです。
BrainfuckやWhitespaceなど(良い意味で)変態なプログラミング言語を紹介しました。
そしてラストでこう述べました。
しかし馬鹿にしちゃいけません。
驚くべき事にB*ainfuckとWhitespaceの計算能力は、C言語やJava等と論理的に「互角」です。なぜならBra*nfuckもWhitespaceも、世の中にある「すべてのアルゴリズム」を実行できる事が証明されているからです。
つまり数学的には、Br*infuck・WhitespaceでもドラクエやFFやモンハンが作れます。誰もやらんでしょうが。
このすべてのアルゴリズムを実行できるという特徴を、 チューリング完全である と言います。
これを証明した数学者(アラン・チューリング 1912-1954)の名前にちなんでます。
チューリングは「コンピューター&人工知能の父」とも言われる天才ですが、波乱に満ちた生涯を送りました。
彼について詳しく知りたい方は、下のページで僕が紹介してる映画をご覧下さい。
イミテーション・ゲーム エニグマと天才数学者の秘密
執筆時点でAmazonプライムなら無料でした。
これだけ出来たらチューリング完全!
さてこれからチューリング完全について述べますが分かりやすさ重視です。
正確さはバッサリ省きます。
だからチューリング警察の方がいましたら、見逃して下さいお願いします。
それはさておき「すべてのアルゴリズムが実行できる」って凄い響きですけど…
実のところ、大半のプログラミング言語はチューリング完全です。
とういかチューリング完全じゃない言語を探す方が難しいです。
なにやら途端にオーラが薄れた気もしますが…
具体的には以下の機能を持ってれば、その言語はチューリング完全です。
・指定したアドレスを参照&変更できる → つまり変数がある
・足し算ができる
・引き算ができる
・条件分岐ができる 例:if文
・繰り返しができる(実は条件分岐の一種)
えぇ、できない言語を探すのが難しいくらい当たり前の機能ですね。
ちなみに前回紹介した「HQ9+」は、これを満たせない珍言語の一つです。
驚くべきことに、こんな単純な機能だけあれば「すべてのアルゴリズム」を実現できます。
つまりドラクエでもFFでも作れます。
これを証明したのが、アラン・チューリングの偉業です。天才ですね。
そして「チューリング完全な言語」は「すべてのアルゴリズム」を実行できるって事は…
理論上、Brain*uckとWhitespaceは(チューリング完全なので)ドラクエ・FF・モンハン・ワード・エクセルでも何でも作れます。ね、凄いでしょ??
数学世界と現実世界
さて、ここまでBrainf*ckを持ち上げて来ましたが、ここで一気に落としますよー。
「すべてのアルゴリズム」が実行できる!と言いましたが…これはあくまで理論上の話です。
「理論上」とは、時間が無限にあって、メモリも絶対不足しない世界を指します(つまり数学の世界)。
そんなもの現実にはありえないですね。
あればとっくに僕が行ってドカベンを全巻読破してます。
このように数学の世界では、メモリ容量や実行時間を一切考慮しません。
だから現実にBrainfu*kでドラクエを作るには、そびえ立つ高いハードルがあります。
言語仕様が○uckなので、プログラミングに恐ろしく時間がかかる
↓
DirectXにも対応してないので、ラッパーを用意するか同等のものを作らないと…
(もちろんBrainfuc*でな!)
↓
というかWindowsAPIすら呼べないじゃないか
↓
でも普通にアクセスしたら、OSのセキュリティに拒否られるんじゃ…
↓
そうか、だったらOSもファームウェアもみーんな*rainfuckで書き直せば良いんだ!
↓
頑張って1000年かけて書いたけど、動きもっさり・メモリリーク一杯でクソゲー認定されたよ\(^o^)/
といった具合に、我々の住む世界では制約が多すぎます。
だから誰もそんな苦行をしないわけです。
結論:現実世界では、*rainfuckでドラクエを作れない。
異論のある方は、自らの手で完成させてみて下さい。
プログラミングの本質
さてここからが本題です。
前述したチューリング完全の機能一覧を見ると外部との入出力がありません。
つまり、キーボード入力もマウス操作もなく、ディスプレイ表示もプリンタ出力もありません。
ただ一つ、ソースコードがあるだけです。
だから超純粋なチューリング完全言語があった場合…
出来たプログラムを動かしても、キー入力はできず、実行結果も確認できません。
超絶に不便ですが、それでもハード内部では「アルゴリズムを実行」できます。
だからコンピューター的にはOK、処理は完了です。
実はキー入力やディスプレイ表示というのは、我々人間の身勝手で付けた機能なんですね。
人間に結果が見えようが見えまいが、コンピューターにとっては、メモリをルール通り書き換えればアルゴリズムは成立します。
画面で確認する、キー入力で色んなパターンを試す、これらは全て「人間にとって便利にする」機能に過ぎません。
つまり大きく主張したいのは…
プログラミングの本質はアルゴリズムである
って事です。これ超重要。
それ以外は、人間の都合による便利なおまけ集です。
例えばドラクエでも、ルールに沿ってメモリの中が変わっていれば、本質的にはゲームが成立しています。
グラフィックが映るのは、コンピューターによる人間への甘やかしです。
また人間がキー入力しなくても、コンピューターは自動でキャラを動かせます。
つまり人間がいなくても、アルゴリズムは実行できます。
どうしても思い通りに動かしたいなら、ソースコードにあなたの操作を全て書けばOKです。
下ボタンを0.2秒押す → ○ボタンを0.3秒押す → 2秒待つ → ○ボタンを0.3秒押す → 以下略
こうやってタイトルからエンディングまで全部書いておいて下さい。
大変ですか?
心配ありません!時間もメモリも無限にありますから
こうすれば、理論上どんな人のプレイでも再現できます。
ゲームとはいったい…うごごご
どちらの世界で
要するにソフトウェアは「アルゴリズム」と「人間の都合」で成り立っています。
アルゴリズム:本質
人間の都合:おまけ
さて前号から長々と書いてきた最後の結論として、あなたにぜひ実践して欲しい事が一つあります。
プログラミングのふとした瞬間、こう考えてみて下さい。
いま自分は「アルゴリズム」と「人間の都合」どっちの部分を触っているのか?
この問いかけを繰り返すと、プログラムが本質とおまけのレゴブロックに見えてきます。
そして両者を、上手く離したりくっつけたりする計画が立てやすくなります。
達人プログラマーは2つを管理する能力に優れ、見やすく修正しやすいソースを組みます。
(無意識にやっちゃう人も多いですね…)
だから私達が達人に近付くには、この視点が欠かせません。
ぜひこの習慣を実践して、プログラム全体を見通す目を育てて欲しいと思います。
補足:今回を同じことを別の観点から書いたのが↓の記事ですね。併せてどうぞ。
【コラム】誰も言わないプログラミングの真実
Twitter(本当に)はじめました
ろくに更新してなかったTwitterに動きが!
先日つぶやいたザブングルのCGネタが少しバズった模様。
戦闘メカザブングルのプラモCM。CGではなく針金です。#若い人が見たらCGIだと思いそうな昔の特撮 https://t.co/joOEa2HrLG pic.twitter.com/VjiuvhSJf9
— K-Eba@プログラミング書籍の館 (@EndymionProgram) 2018年8月16日
今まで「いいね」が5個付けばヒャッハーなレベルでしたが、いきなり1000いいね&リツイートでたまげました。
なんか嬉しくなったので、これからは改心して真面目にTwitterやりたいと思います。
前回の反響とモビルスーツを探せ
Twitterキャンペーンの結果
前回、名言コーナーの完成を記念してこんなキャンペーンをぶち上げました。
・プログラミング書籍の館をフォローする
・そして、気に入った名言をツイートボタンから呟いて下さい
ツイートして下さった方が10人を超える毎に、私の黒歴史をサイトにアップします。
その結果、ゼロ人の方が呟いてくれました。わーい。
ちょっと無理のあった企画でした。反省しています。。。
黒歴史をアップするどころか製造しちゃいました…
恥ずかしいので、この企画は過去ログからも抹殺します。
ちなみに先週からツイートボタンがブルブル痙攣してるのは、私の心がシンクロしてます。
モビルスーツを探せ!2nd
では今回のクイズです。
一見しなくても僕の黒歴史ですが、画像の中にモビルスーツが2体隠れています。
そのモビルスーツ名をお答え下さい。
なお今回はストレートな問題です。目を凝らせば小学生でも?見付かります。
ちなみに画面左下にいるモザイクかかってないのが僕です。
むかしテレビに出た時の様子です。自信満々でしたが速攻で敗退しました。
正解した方の中から抽選3名様に、Amazonギフト券コード(500円分)をメールでお送ります。
応募は本メールに返信すればOKです。
※募集は終了しました
今回はここまでです。読んでいただきありがとうございました。
プログラミング書籍の館 江畑