変態言語とチューリング完全とドラクエと

メルマガバックナンバー 2018/08/17発行

Twitter(本当に)はじめました

ろくに更新してなかったTwitterに動きが!
先日つぶやいたザブングルのCGネタが少しバズった模様。

今まで「いいね」が5個付けばヒャッハーなレベルでしたが、いきなり1000いいね&リツイートでたまげました。
なんか嬉しくなったので、これからは改心して真面目にTwitterやりたいと思います。

変態言語とチューリング完全とドラクエと

チューリング完全って?

前回「変態プログラミング言語とチューリング完全」の続きです。
BrainfuckWhitespaceなど(良い意味で)変態なプログラミング言語を紹介しました。

そしてラストでこう述べました。

しかし馬鹿にしちゃいけません。
驚くべき事にB*ainfuckとWhitespaceの計算能力は、C言語やJava等と論理的に「互角」です。

なぜならBra*nfuckもWhitespaceも、世の中にある「すべてのアルゴリズム」を実行できる事が証明されているからです。
つまり数学的には、Br*infuck・WhitespaceでもドラクエやFFやモンハンが作れます。誰もやらんでしょうが。

このすべてのアルゴリズムを実行できるという特徴を、 チューリング完全である と言います。

これを証明した数学者(アラン・チューリング 1912-1954)の名前にちなんでます。

アラン・チューリング
アラン・チューリング

チューリングは「コンピューター&人工知能の父」とも言われる天才ですが、波乱に満ちた生涯を送りました。

彼について詳しく知りたい方は、下のページで僕が紹介してる映画をご覧下さい。
イミテーション・ゲーム エニグマと天才数学者の秘密

2018年9月現在、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キャンペーンの結果

前回、名言コーナーの完成を記念してこんなキャンペーンをぶち上げました。

・プログラミング書籍の館をフォローする
・そして、気に入った名言をツイートボタンから呟いて下さい
ツイートして下さった方が10人を超える毎に、私の黒歴史をサイトにアップします。

その結果、ゼロ人の方が呟いてくれました。わーい。
ちょっと無理のあった企画でした。反省しています。。。

黒歴史をアップするどころか製造しちゃいました…
恥ずかしいので、この企画は過去ログからも抹殺します。

ちなみに先週からツイートボタンがブルブル痙攣してるのは、私の心がシンクロしてます。

モビルスーツを探せ!2nd

では今回のクイズです。

こちらのページをご覧下さい。

一見しなくても僕の黒歴史ですが、画像の中にモビルスーツが2体隠れています。

そのモビルスーツ名をお答え下さい。
なお今回はストレートな問題です。目を凝らせば小学生でも?見付かります。

ちなみに画面左下にいるモザイクかかってないのが僕です。
むかしテレビに出た時の様子です。自信満々でしたが速攻で敗退しました。

正解した方の中から抽選3名様に、Amazonギフト券コード(500円分)をメールでお送ります。

応募は本メールに返信すればOKです。
※募集は終了しました

今回はここまでです。読んでいただきありがとうございました。

プログラミング書籍の館 江畑


もっと知りたい?
C言語_初級 | C言語_中上級 | C++_初級 | C++_中上級 | C#_初級 | C#_中上級 | Java_初級 | Java_中上級 | コンピュータ_サイエンス | アルゴリズム_ | ゲーム_プログラミング | DirectX_ | Unity_ | ゲーム_デザイン | ゲームのしくみ_ | 数学_ | プログラミング_テクニック | 歴史_偉人 | ソフトウェア工学_ | 読み物_エッセー | 人生_生き方 | 創造_発想 | 雑誌_ | 漫画_小説_映画 | メルマガのバックナンバー_

無料メルマガ好評配信中!
直球より変化球主体で攻めるプログラミングのメルマガ

読むだけで使える!プログラマーの裏技と考え方

読むだけでもプログラミング力が上がる
上辺の技術ではないプログラミングの本質が分かる
ビギナーからプロのゲームプログラマーまで幅広い方が購読しています(感謝!

つまり、登録して一緒にプログラミングを楽しもうぜ!
ってことだよ。言わせんな恥ずかしい。


登録完了メールが届きます
届かない場合は迷惑メールフォルダや設定を御確認下さい
powered byメール配信CGI acmailer

Kuniaki Ebata 登録者

プログラマーで現役のスキー国体選手です。
頭脳と体を動かすのが大好きなフレンズなんだね。専門学校で先生もやってます。

教え子をゲーム会社にどんどん送り込み、世界を面白くする野望を実現中。

プログラミングが上達するメルマガやってます。

ここを見たゲーム業界の卒業生へ
新作が出たら、連絡するか現物を送ってくれると嬉しいです。
ただし18禁・CERO-Dの場合は、厳重に梱包の上、品名をパソコン部品にて送る事(だいじ)。