ここは電卓でもパソコンでも同じだよというところになってくると。
じゃあ中身どういうふうになっているのって話なんですが、
実は電卓もパソコンもほぼ同じでして、
内部的に半導体のチップがあって、
そいつが処理を担当して、
それを入力を受けて処理して、
その結果を表示の部分、液晶だったりだとか、
画面だったりだとかに出していくというような感じになってきます。
結局この処理している部分って何なのって言うんですが、
いわゆるノイマン型のコンピューターになりますよというようなところですね。
ここら辺は多分谷口さん以前にコンピューターアーキテクチャの勉強を
一緒にやったので少し覚えているかと思いますが、
ノイマン型のアーキテクチャってどんなんでしたっけ?
そうですね。先週も教えてもらったような気がするんですけど、
聞いたらああとはなるんですけど、すみません。ちょっと覚えてないです。
ざっくり言うと、このALUっていう計算やるやつがいますよというところで、
そこでできる計算のバリエーションがいくつかある。
例えば足し算、比算、掛け算、割り算、
もしかし不動演算だとか、ビット演算だとかみたいな感じでいろいろあると。
それが作業のあれですよね。
そういうふうな命令があって、それを計算できるよと。
計算した結果をレジスターに保持できたりして、
そのレジスターに保持したやつをさらに次の入力に使ったりもできるよというような感じですね。
イメージとしてはそんな感じで、ALU レジスター。
さらに今一つ一つの命令話しましたけどもですね、
それを順々に実行していくよっていうようなところですね。
それができるようになってくるので、いわゆる一般的にはインストラクションレジスター
というようなもので、プログラミングですよね。
プログラムを書くと、この命令をこの順々でやってくださいというところが決定するので、
それを上から順々にやってくる。
途中で分岐とかあるパターンありますけれどもですね。
そこら辺が順にできるよというところですね。
そんな感じで、命令をこの順でやりますよというような、
要は命令自体を保持するというインストラクションレジスターというのも
ノイマガトコンピューターには一般的にありますよという感じですね。
なので、ノイマガトコンピューターは基本的に流れとしては
インストラクションレジスターから今実行したやつの命令を呼び出してきて、
その前に呼び出してきても、どういうような制御の信号を作ればいいのかわからないので、
呼び出した命令をそれぞれのALUにはこういうようなモードに設定して、
レジスターのほうにはこういうような書き込み、読み込みのモードを設定してというような
各信号への変換というところをやりますので、
命令のデコードというような処理を行いますというところですね。
なので、命令が読み込んでデコードして、デコードすると各部分が
あなたはこういうような設定で動いてねというような感じで設定の値が来るので、
各部位はそれをもとに動作すると、全体的にいい感じに動くようになるというのが
ノイマガトコンピューターの最低限の部分になります。
実際のコンピューターだと、今言ったレジスターの部分だけじゃなくて、
さらにキャッシュだとか、メモリだとか、入出力のデバイスだとか、バースだとか、
いろいろあるわけですけれども、最低限の部分はそういったもので、
命令を読んでデコードして実行するというような感じですね。
さっきの電卓のところに戻しますけれども、これも結局やっていることとしては、
電卓でポチポチ打つということは、こういう実行をやってくださいという
命令を出してあげているわけなんですね。
この場合、1命令を実行するというようなイメージになります。
なので、ユーザーが入力して、それでイコールというふうに落ちそうですね。
内部的にそれを実行して、その結果がこの表示の部分に出てくるような感じですね。
なので、ほぼ同じものだというふうに思っていただけるといいかと思います。
ノイマガトの説明でだいぶ聞きましたけれども、結局こういうふうにALUがありますよ。
ALUの中でそれぞれの命令を実行しますよというような話ですよね。
それぞれの命令の回路はどういうふうに作られているかというと、
ここら辺は基本的には半導体の作りのところになってくるんですけれども、
基本的にはロジックゲートの組み合わせという部分になってきますよと。
これどういうことかというと、先ほどレジスターとALUがあって
レジスターの部分はいわゆる値を保持するというのが役割ですけれども、
ALUのほうに関しては演算を行うというところが役割になります。
演算ってどういうことかというと、基本的にはこのコンピューターって01の世界になりますので、
01に対して何らかの出力を出すよとなってくるわけですね。
それと基本的には基本的にはAND演算 OR演算 NAND演算 XOR演算
どんどんどんどんみたいな感じで、いわゆるロンリーゲートと呼ばれている、
01に対するこの値が入ってきたらこの値を返すというようなところの、
01の演算するゲートというものがになりますよということですね。
なので逆に言えば、こういう値が入ってきたらこういうふうに値を返すというプリミティブなゲートが作れれば、
これを加算演算、乗算演算とかいろいろありますけど、
結局この中身は構成要素としては基本的にはこの小さい演算のゲートがひたすら積み重なって作っていくものになります。
なのでゲートさえ作れれば、あとはよしなりにコンピューターの特にALUの部分に関しては作れるよというところが
結構肝になってくる話になってきますよというところです。
結局、このゲートを作れるかどうかというところで、コンピューターが作れるかどうかというところが結構決まってくるというようになります。
今度はTetrisでコンピューティングをやりましょうというふうになると、
Tetrisで何らかこのゲートを表現できる何かが作れればいいよねというところが出てきますね。
というようなところで、ここら辺からは実際のブログのサイトのほうを見ていただくのがいいかなというところで、
これ実際にTetrisでプログラミング、要はさっき言ったゲート演算とかそこら辺が全部できるようになるよというのを作った人がいまして、
この人がやっているやつで、いろんなの作っているんですけど、結構ぶっ飛んでる人なんですけれども、
この人が作ったのが、TetrisはCapable of Universal Computationなので、
Tetrisは汎用的なコンピューティング、計算の能力を持ってますよというようなものを、
2023年の1月に作ってますという感じになります。
これ何となく見てみると、ちょっと分かりづらいんで、じゃあ日本語に変えましょうか。
ここが分かりづらいですね。すいません。逆に分かりづらいのがあった。
ちょっと元に戻しますね。
ここですね。先ほど言っていた各ロジックのゲートですね。
NOT OR NOR AND X OR X NOR みたいなのですね。
ここら辺のロジックゲートというのが書いてありますよと。
さらには各ゲートから値をどういうふうにつないでいくかというところのワイヤーだとか、
そこからそれをもとに関数を作りましょうねというところの、
これどちらかというと結構プログラミングの話になってきますけれどもですね。
こういった感じでファンクションを作ってたとか、
あとさっき言ったパソコン作る予定になってきたときにですね、
じゃあ値をどういうふうに保持しましょうかというところでメモリーをやって、
さらには実際にコンピューターを作っていきましょうというところですね。
ここら辺そんなに細かく定義は書いてないですけれどもですね。
結構チューニングマシン、先ほどのノイマン型コンピューターとは別のマシンではあるんですけれどもですね。
01扱っているところでは同じですけれども、
チューニングマシンというのを作ってみるにはどうすればいいかだとか、
あとさっき言ったノイマン型のコンピューターを作るにはどうすればいいかというところですね。
さらに先ほどのインストラクションレジスターで命令をですね、
一個一個ですね、書いていくよというような話をしましたけれどもですね、
それって基本的に格納するのはですね、いわゆる機械語と呼ばれているですね、
01のですね、並びでですね、その命令を定義するんですが、
01の並びで命令を一個一個定義するのはですね、
結構ね扱いがしづらいので、
それをですね、人間でも読めるような表現に置き換えたものがある意味、
アセンブリ言語というふうに呼ばれますけれども、
そしてこのアセンブリ言語を自分で作ってですね、
結局これをもとに先ほどのテトリスのやつをですね、
プログラミングできるようにしましょうという感じで、
まさに本当にコンピューターのですね、ソフトウェアの設計を含めてですね、
そこら辺を実装に実際に組んでみるよというところをですね、
一通り語っているやつになりますよというような感じで、
とりあえずそのぐらいガチでコンピューター作ろうとしているよというところをですね、
ちょっと見えてきたかと思います。
じゃあ実際にこれをですね、どういうふうにですね、
テトリスでやるのという話なんですけれどもですね、
これはちょっと実際に見てもらうのが一番わかりやすいかなというふうに思いますが、
こういうふうな感じでプログラミングしますよというような感じで、
基本的にはまずこの座標形があります。
一応まあ列方向にですね、
とりあえずプラマイの方向に0123みたいな感じであったりすると、
とりあえずこういうふうに空間がまず定義されています。
その上で今度はですね、このテトリスといえばですね、
このテトリミのですね、
この1、2、3、4、5、6、7種類ですよね。
これありますよね。
テトリスやってれば普通に出てくるやつですよね。
4マスのマスクの合成からなるやつでして、
この種類ですよと。
一応これにはですね、それぞれ名前が与えられています。
TJZOSLAという感じですね。
まあそれぞれ単純にこの形をもとにですね、
表現しているやつなんで、
まあ結構わかりやすいかなというふうに思います。
とりあえずこれでですね、空間を定義できました。
あとはですね、テトリミのを定義できました。
というところができますよと。
じゃあこれをもとにどういうふうにプログラミングしていくの?
という話なんですけれども、
それはですね、次こちらですね。
一発目いけないわけがなくなりましたよ、
というところではありますけれども、
そんな怖くないです。大丈夫です。
ここでですね、見てみるとですね、
一番下がインプット、真ん中がロジック、
最後の上側がですね、アウトプットというような感じで書かれています。
これ見ていただくと先ほどちょっとこのテトリスのやつでですね、
少し話したところとですね、繋がるんですけれどもですね、
先ほどあのコンピューターとは何ぞやってところありましたけれどもですね、
結局何か入力して何か処理して何か出力するよというようなところですね。
この三つのですね、段階があるよって話がありました。
なのでですね、このテトリスで表現しているのも実は同じなんですよね。
何か入力をしてですね、そうすると中のですね、
何か処理がゴニョゴニョっていうふうに動いてですね、
その結果ですね、この出力が出てくるよと。
先ほど言ったように、このコンピューターというのは01の世界ですので、
0を入れて1が出てくるよというような感じの世界になってきますよと。
ちなみにここでも見ててですね、結構分かるかと思いますが、
ここですね、入力01出すんでですね、
0を入れるか1を入れるかというところが変えられますけれどもですね、
ここで見て分かるとおりですね、0の場合はですね、
1マス分の資料が出てきてですね、1の場合だとですね、
2マス分の1が出てくるというような感じですね。
なのでこの入力としてはですね、これがですね、
1マス分なのか2マス分なのかというところの、
1個だけ上下を動かすことができるわけですよ。
これ1個だけ上げると、その上の連中、上のですね、
テトリミーナーはですね、それに押されてですね、
ガチャガチャガチャガチャ動くわけですよね。
そうするとですね、それがどんどんどんどん連なっていって、
最終的に上の側、最後の上の方のですね、
アウトプットのフィールドにあるですね、ここの領域ですね、
この場合だと一番上のですね、行のところにですね、
少しちょっと枠が太くなってくるところがあるのが見えるかと思いますけれども、
そこがですね、押されるか押されないかによってですね、
そこが埋まった場合は0、埋まってない場合は0で、
埋まった場合は1というような感じの出力が出てくるという感じですね。
なのでですね、この入力を01にいじると何らか処理をして、
出力の01が決定するよというと、
ここら辺がまさにコンピューターのですね、
基本の部分のですね、処理になってくるというような感じです。
基本的にはこういう感じですね。
なので、いわゆる処理を組むというふうになったときには、
この真ん中のロジックの部分、
あとはその入力と出力をどういうふうな感じで定義するかというのはありますけれどもですね、
後半の部分となってくるのは、先ほど言ったそのテトリミーナーをですね、
ここにですね、実際に配置してですね、
この回路を築いていくよというのがですね、
この処理系がですね、基本的なイメージになります。
そこら辺が見えてくると、何となく分かりやすいかと思いますが、
結局何かこういうふうに入力と出力が確定すればですね、
それをさらに連んでいけばですね、
この場合ですね、1、2、3、3段かな、3段の処理系が出てきてですね、
結局何か十数つなぎでですね、
どんどんどんどん複雑な処理をですね、
処理ができますよというのがですね、結構分かるかと思いますというような感じですね。
こんな感じでですね、その処理をですね、
要は01でですね、計算してですね、
ゼロ値を出すというのがですね、実現できるよというようなイメージですね。
はい、そんな感じですね。
先ほど言ったように、入力に関しては、
入力及び出力に関してはですね、
縦2マスに対して上側が埋まっているか、
埋まっていないかによってですね、
ゼロ値というのをですね、表現しますよという話になります。
基本的にはこれだけなんですけれどもですね、
これで本当にできるのというような、
もしくは実際にプログラミングできるのという話なんですけれどもですね、
じゃあそのプログラミングをどういうふうにやっていくかというところをですね、
少し話していきたいと思いますというところで、
じゃあプログラミングを書くってなったときには、
どういうふうなことをですね、定義すればいいかというと、
基本的にやることとしては、
まず入力と出力がどういうふうな感じで定義されているかというところと、
プラスアルファで、
間の処理の部分ですね、
このテトリミンをどういうふうに配置するかというところをですね、
定義しなければいけません。
そこでこの場合、プログラミングするにあたっては、
基本的にはこのですね、
各テトリミンの先ほど7種類あると言いましたが、
それに対してですね、
それぞれのテトリミンをですね、
この形でこういうふうにですね、落としていくよというようなのをですね、
定義してあげるのがですね、
このプログラミングの処理になりますというところですね。
では具体的にどういうようなですね、
処理をですね、書くのかというとですね、
こんな感じで書きます。
で、先ほど言ったように、
この先ほどT,J,Z,O,S,L,N,Iというのがありましたけども、
それぞれのですね、向きに応じてですね、
さらにその、
このTであれば、
この出っ張ってる部分が下向きなのか、
左向きなのか、上向きなのか、
右向きなのかによって、
ダウン、レフト、アップ、ライトという感じでですね、
T,D,T,L,T,U,T,Rという感じになりますし、
Jであれば同じようにこのですね、
少しはみ出している部分がですね、
下なのか左なのか、上なのか、右なのかによってですね、
J,D,J,L,T,J,U,J,Rという感じになりますし、
Zに関してはですね、
横長の場合はですね、
ホリゾンタル、水平方向に長いよという意味のですね、
ZH。
縦方向に長ければバーティカルなのでですね、
ZVという感じになる。
で、Oに関しては回転しても何も変わらないのでですね、
基本的にはこれでOK。
Sと同じようにSHとSホリゾンタルとSバーティカルと、
LとIも基本的には同じですね。
こんな感じでですね、
どっち向きなのかというのを定義できるようになりましたよと。
じゃあ、あとは何をやればいいかの、
なのかなというような話になるとですね、
じゃあ結局、このテトリミノをどこの位置に、
どこにどういう向きで配置するのかというのをやればいいと。
実際にこれプログラミングした例ですけれどもですね、
Tをダウンの方向で1の場所に置いてください。
この場合はここですよね。
1のところにですね、Tのダウン方向で置く。
で、次はですね、Jのダウン方向でこうですよと。
Jのダウン方向でこうですよと。
というような感じですね。
基本的にどこがですね、ベースになるかというとですね、
この白丸の部分がですね、座標の中心になるのでですね、
それをベースに置いていけばいいよという感じですね。
こんな感じでですね、やると書くとですね、
こんな感じの回路ができるよというイメージになります。
で、あとはこれかな。
そうですね。
で、あとなんだっけな、これ。
で、これのですね、プログラミングが面白いのがですね、
実際にTetrisをプレイするような感じでですね、
配置ができてますよというような感じですね。
はい。
で、これ。
そうですね。
Shiftして、YSに戻して。
だからこの場合だとですね、
例えばこれでまずどの種類のですね、
Tetriminerをどこに置くのかというのを定義していますよね。
で、次のXSでですね、何をやるのかというとですね、
まず上の方に、無限遠方上の方にTetriminerがいますよと。
そいつをまずどこの列に移動させるかというのを決めますよね。
だからそれでですね、水平方向が決まると。
で、じゃあ次何をやるのかというとですね、
実は次まだあってですね、
一気に落とすんじゃなくてですね、
縦方向のここまで落としますよというところまでやるんですよ。
ここまで落として、
で、さらにそこからまた水平にずらしてみたいな感じですね。
基本的にTetrisをプレイしている感じですね。
落ちてきた水平にずらす。
で、それでその上でまた落とすというような感じですね。
この場合だとどういうふうな感じになっているのかというとですね、
そのDDをですね、1からこの1のところにですね、
この場合だとですね、
15だから本当に上の方まで落としてきて、
その上でですね、Xを2にずらしています。
だから一番下のやつに関してはですね、
ここの真ん中の部分がですね、あれでしたけどもですね、
落としてきて、2のところにして落としたから、
この2のところにですね、Tのやつがありますよと。
で、その上のやつも基本的には同じなんですけれどもですね、
基本的にはそうですね、そんな感じで送れるんですけども、
これが面白いのがですね、実はここでですね、
途中でYのここまで落とすっていうのがありますけれどもですね、
そこでもう既に積んでるやつがあった場合は、
そこで止まっちゃうんですよ、実は。
なので結構実際にもうここまで積まれてるやつをベースにですね、
この回路が作られ上げられていくのでですね、
結構ここら辺、実際のプレイする感覚でですね、
プログラミングができるってところが結構面白いというような感じですね。
実はですね、このはい、こいつですね、
この1のときはですね、こいつが右側に行こうとすると、
こういうのLがですね、もう止めてるんでですね、
実は動けなくてか、まあ出てくるというような感じですね。
そうなるんで、実はこの0と1によってですね、
作られるですね、回路が違ってくるよっていうのがですね、出てくる。
なので結構これ、テクニカルではなくて、
なかなかね、実際に動かしてみないと読めないんですけれどもですね、
まさにテトリスでこのプログラミングしてるなっていうのがですね、
結構面白くてですね、はい。
逆に今これ0のときだったらですね、
ずらせるんでですね、全体的に高くなるんでですね、
この1の上の部分が埋まるんで1になるよねと。
逆に1だったらですね、このこいつが左側、右側に行けないんで、
全体的に一つ低くなるんで0になるよねってところでですね、
つまりノットが実現できるよって感じになりますというところですね。
そういうような感じですね、はい。
あとはですね、同じような感じですね、はい。
じゃあ、ORはどういうふうにすればいいのって話ですが、
結局入力が2つあって、それに対してですね、
どっちかが立ったときにですね、片方が1になればいいんでですね、
それはこんな感じでですね、
どっちかが押し上げてあげればいいよっていう感じになればいいんで、
ORがだいぶ簡単な実装になるかと思いますよね、はい。
そんな感じでですね、ORは実現できて、
さっきのNORは今話したやつですね、2なりのようなやつになります。
ほぼさっきのやつと同じような感じかな、になってますね、はい。
さっきのNOTでその入力の部分を2つに分けたというようなやつですね、
になりますね、はい。
これがNORのゲートですよというようなところですね、はい。
NORの場合だとですね、結局さっき1つ上がったらこいつが邪魔してですね、
右に動かないとなりましたけども、
結局それの入力側を2つに分けてあげればですね、
どっちかが上がればですね、全体的に上がるんでですね、
この出力がゼロになるというようなところになりますよというところで、
こんなNORが実現できるという感じですね。
そんな感じでですね、同じようなのがですね、
1つどんどん出てくるというようなところですね、はい。
というような感じで、
ちょっとここら辺の具体的な動きはあれですけれどもですね、
同じような感じで何度だか僕はですね、
何度だかでも実現できるというような感じですね。
実際これなんかプログラミングやろうと思うと、
なんか途中でどういう挙動をするのっていうのが結構ね、
動きながらじゃないとわかりづらいのであれですけれども、
これ結構面白くできるんじゃないかなというところですね。
ちょっとここまでなくなりましたが、
冒頭の話、2次元のプログラミングについてというところでしたけれどもですね、
ちょっとTetrisのやつをいろいろと話してみましたというところですね。
そもそもこの2次元プログラミングについてという話しようと思ったのが、
正直このTetrisのやつが昔見つけて面白いなと思ったんですけれども、
実は似たような人が結構いてですね、
ただ全然結構違うようなプログラミングをやってる人でして、
これはなんかより複雑なやつをやっててですね。
正直私この仕様のやつ読んだんですけども、
全然よくわかってなくてですね。
ただこういうような感じでですね、書くことによってですね、
なんか数値、この場合だと円周率を計算してるらしくてですね、
ざっくりとですね、この3.14に近いような何かが計算されてるんですけれども、
それがどういうふうな理屈で計算されてるのか全くよくわかんなくてですね。
ただこういうような色のときはこういうふうに動くみたいな感じでですね、
定義されてるっぽいんですけども、
それで何か入力としているかどういうふうに何か設定されてるのかがですね、
いまいちよくわかんなくてですね。
ぱっと見よくわかんないなっていうところなんですけれども、
ただこれもまさにですね、先ほどのTetrisと同じような感じで、
2次元のブロック上にですね、何か表現することによって、
プログラミングをするよっていうところですね。
なんかちょっと面白いなと思ってですね、
シェアしようかなというふうに思ったってやつですね。
これはね、さっきのTetrisよりもだいぶですね、わかりづらいです。
ちょっと何かどっかまた時間あればですね、