見出し画像

Retro-gaming and so on

RE: プログラミング学習日記 2024/02/23〜

龍虎氏の記事(2024/02/26)に対するコメント。

 異質すぎるw リンク先の入門ページを見るのが楽しみナリ

異質だろ(笑)?
Prologって、フツーのプログラミング言語で培った「感覚」じゃとても扱えない言語なんだよ(笑)。
「だからこそ」学ぶ価値はある。使いこなせなくても「知っておいて」損は無いんだ。

まず、通常データベースって言うと、リレーショナルデータベースって言う「モデル採用」を指すのね。Googleが使ってるMariaDBとか、現在メジャーないわゆる「データベース」ってのは全部それだ。
一方、それが唯一のデータベースモデル、ってわけでもない。Prologが形作るデータベースを「ネットワーク型データベース」と呼ぶ。「ネットワーク」って聞くと難しそうなんだけど、いつか書いたけど、基本的には「循環があり得る木構造」の事だ。
そう、ザックリ言うと、Prologってのはネットワーク型データベースを対照としたクエリ言語なんだ。少なくともそういう側面がある。
Prologを使う、って事はProlog内部にネットワーク型データベースを作る、って事だ。あるいはPrologによるプログラミングは、ネットワーク型データベースを作る事に等しい。それに対して「検索を用いる」ってのがPrologのスタイル、って意味になる(※1)。

んでバックトラック、なんかも実は紫藤のページで軽く解説されている。多分、ホント初心者時点で読んだら「意味が分からん」だけど、今になると色々繋がってくるんだよな(笑)。僕もそうだった。「木」を深さ優先探索で潜っていって該当とする値を探し、葉に到達したら「一つ戻って」別の枝に入っていく。これがバックトラックだ。
そう、Prologってのはそういう視点だと、「木を対照にして検索する事に特化した」プログラミング言語で、他の言語で言うと「宿題で作るデータ構造」がそのまんまプログラミング言語としての実装になり、それに対する設定が「記述形式」になったような言語なんだ。
ここにも「理論と実践」の結実がある。繰り返すけどProlog自体が「直接木を持ってる」ようなプログラミング言語なんだ。

 さて、Brainfuck。Cametanさんの記事を読んだら力試しにならないので仕様だけ見て独力で挑戦してみる(当時記事を読んだがいい感じに忘れている)

うん、忘れて忘れて(笑)。
しかもあっちはコンパイラだしね。インタプリタじゃないんで今回は役立たない。
それに仰ってる通り、今の時点だと、「自分で考えないと」意味がない。

 多分だけどListを使うよりもVectorを使うべきかと。

そう、全く正しい。
こういう場合って「仕様に書いてる通りに地道に実装する」ってのが一番大事なの。「書かれてる通りに実装する」。
Wikipediaでの仕様に従うと「Vectorを採用する」ってのは全くその通りだ。正しい。

余談だけど、川合史朗さんもSchemeでBrainfuckを作る、って例示をやってる。しかもメモリをクロージャの連鎖、ってカンジで実装してんのね。
ただ、こういう「テクニック」ってのは自身が何度も言語実装を作って(それこそGaucheだ・笑)、そういう「経験」が「この場合はこういう風に仕様を解釈できんじゃね?」ってアイディアに繋がるわけじゃん?
最初からこうは出来ねぇよな、と(笑)。俺も無理だ(笑)。

結局、何にせよ、最初は「非効率」でも実直に「仕様に従って」実装を作ってみるべきだと思う。後でアイディアを思いついて「改造」なんつーのはいくらでも出来るしね。

 何ーッ!?]が打たれた時点で[から打ってたコマンドをループするってこと?それを最初に言ってよw 
 +インクリメントやーデクリメントを連続で入力して一気に増減も出来るとかも仕様に無かったぞ!

ふふふふふ(笑)。思った通りに「ハマってる」(笑)。
ごめん、意地悪じゃないんだ。「自覚してほしかった」んだ。
つまりだな、8つの条件のうち、6つは「関数」なんだよ。Brainfuck内では「ビルトインの基本関数」って意味になる。
こいつらをプログラミングするのは、さして難しくない。Lispで言うと「Lisp以外の言語でLispをプログラムする際に」carcdr、なんかをプログラムするのは比較的ラク、なんだ。
一方、実は[と]は「関数ではない」。こいつらは「制御機構」なんだ。プログラミング言語で言う「構文」にあたり、繰り返すけど「関数」ではない、んだ。Lispで言うとifとかだよな、そういうのをプログラムするのに等しい。
制御機構をプログラムするのは関数に比べると難しい。そしてそれがLispでマクロをプログラムするのがムズい、本質的な理由なんだよ。そしてLisp以外の言語ではユーザー定義構文、なんつー素っ頓狂なブツが無い理由だ。
今、Brainfuckを通じて初めて、龍虎氏はプログラミング言語の制御構造の仕組みと直に向き合ってるわけ。ハッキリ言うと、「制御機構をプログラムするのが難しい」ってのが分かるだけ、でも言語処理系のプログラミングに挑戦する価値がある、んだ。
言い換えると今、龍虎氏は(Brainfuckと言う名前の)CPUのジャンプ機能をどう実装するんだ?って問題と向き合ってるわけ(※2)。
さぁ、どうする(笑)?色々と考えてみよう。

※1: 「問い合わせ」をクエリ、と呼んだりする。データベースの価値は、「問い合わせ」に対して「適した解を返す」事であり、これがなければ意味がない、ってのは良く分かるだろう。Googleの検索ワード入力項は「クエリを受け付ける為の」場所だ。
リレーショナルデータベース用の「クエリ」として有名なのがSQL(Structured Query Language: 構造化問い合わせ言語)で、これが標準化してる。JISでも公式規格として制定されている。そしてデカイ(笑)。
しかしデカイ割には記述力が低い、と言う欠点がある。そして実の事を言うと、「標準SQLを完全に実装している」、つまり標準に準拠したリレーショナルデータベースは殆ど無いんじゃなかろうか。結局実装が大変になる割には記述力が低いんで、各リレーショナルデータベース実装は強力な検索機能を提供する為に独自の「プロシージャ」を提供している事が多い。つまりそのレベルでは各データベースに「共通性」は全くないわけだ(言い換えると、事実上「標準」は破綻してる)。
SQLに比べると、圧倒的にPrologの記述力は高い。「中途半端な言語」として設計されたSQLと「プログラミング言語として」設計されたPrologの違いはその辺にあって当然と言える。

※2: どうしてBrainfuckだろうと、言語処理系を一回実装してみた方が「コンピュータの動作が分かる」って意味になるのか、実感しただろう(笑)。
なお、Brainfuckの色々なプログラムがここに挙げられている。これらが「実行」出来れば、Brainfuckインタプリタが正常に動いた、って事だ。
ちなみに、僕が書いたBrainfuckコンパイラは全部はテストを通らなく、大きな理由は、僕が書いたコンパイラの「メモリの大きさは無制限」と言う前提と、Racketらしく数値の最大限が「無い」と言うのが原因。大きさに上限がある、と言うのも仕様の一部だったらしい。 
  • Xでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

最近の「RE: プログラミング学習日記」カテゴリーもっと見る

最近の記事
バックナンバー
人気記事