2012年6月8日金曜日

数式型

さっきの記事にも書きましたが
僕は言語内言語をノウハウがたまってきた頃作成したいです
世間的にも自分的にも

ずっとなんとなくプログラミング言語に欲しいこと
それは数式型です

現状で数式を表現するとしたら
例えば数式っぽいメソッドを揃えたクラスの子クラスとして
プログラムとして数式を表現して解を返すとかなんかな?
そう言えば、最近Amazonで買った小飼弾氏の
「アルファギークに逢ってきた」という書籍の中で
Perlが数学を解く時に割と好まれるみたいな記述がありました
数式を解こうとしてるからここではPerlがメインとしてるのかな?

子クラスのプログラムとして数式を表現したいのではなく
「数式型」みたいのが欲しいんです
さっき出た最近書いたHSPのモジュール
(数値が指定の値より小さかったり別の指定の値より大きかったらメッセージが返ってくるやつ)
では数値と演算子を代入するんですけど(代入された演算子と数値によりメッセージを返すか判断してます)
本当は数式を指定したいんです

条件分岐クラスがあってtrueとfalseにメッセージを指定するとかもいいですね
でも条件分岐をインスタンスに設定するには現状では要素が不確定すぎます
x>minimumくらいの条件分岐ならいけそうですが
!((max>x)&&(x>min))とかも考えられ
set_numerical_formula(!((max>x)&&(x>min))),"illegal","normal")
p1:条件式
p2:条件を満たす時に返すメッセージ
p3:条件式を満たさない時に返すメッセージ
とかで値を設定したいんです

と、なんとなく考えていたことを書いてきましたが
だんだんあやふやになってきたので続きはいつか
(ものすごい遅いかもしれない 笑)

オブジェクト指向 その2

なんだかんだ言って、現在の僕はオブジェクト指向は
全然やったことありません
主にやってるのもオブジェクト指向が貧困なHSPですし
Perl5もオブジェクト指向弱いですし
でもちょっとずつわかってきました
たぶんJavaを勉強中だからだと思います
そんなオブジェクト指向使ったことのない僕における
オブジェクト指向の良さってのは
インスタンス変数のコピーです
後、アクセス許可とか
今やってるのはループのカウンタとかをインスタンスにして格納してます
違う変数にしちゃうと、共通の操作とかめんどいんで
インスタンスにすると楽ですね
違う変数なんだけど処理は同じっていう
そしてインスタンス変数に使用許可とかつけれることも
という訳でカウンタをゲッター取得にしちゃってます

そんな話はその概念が深まってからとして
最近はオブジェクトとメッセージの関係について考えていました
というのも僕がオブジェクト指向とはなんぞやっていう疑問に対する回答には
メッセージという概念が深く関わっています

HSPにモジュール変数が追加された時に(簡単なオブジェクト指向なんですけど)
その頃はたいしてプログラミングしてない頃で
カプセル化だの継承だのの利点はよくわからなく
でもメッセージという概念はしっくりきたんです
あの頃、図書館でオブジェクト指向に関する書籍を借りたりして
2、3冊読んだかな?
オブジェクトにメッセージを送り
オブジェクトがメッセージを受け取って
オブジェクトなりの振舞いをする
そんなかんじの説明がいいかんじでした

例えば(例は悪いかもしれませんが)
HSPだとボタンを押すと指定したラベルにjumpします
visualC++だとボタンを押すとイベントを起こすんです
僕は(楽だから 笑)jumpする方が好きですが
ボタンを押すとイベントを起こすイベント駆動の方が
メッセージの送り方、受け方的にオブジェクト指向なんだなって思います

最近、メッセージに注目したHSPのモジュールを書いてて
例えば自分のHPをインスタンスとしたモジュールで
敵が攻撃して自分のHPが0以下になったら"YouLose"というメッセージが返ってきます
"YouLose"というのは設定した文字列で設定しなければ"tooSmall"というメッセージが返ってきます
自分のHPが0以下にならなければメッセージは返って来なくて戦闘継続です
"YouLose"というメッセージが返って来たら戦闘終了という分岐です
これは条件分岐をメッセージの受け答えにした条件分岐です
確か2、3年くらい前になんとなく考えたのを思い出してやってみたら上手くいきました
条件分岐って意味が直観的にわからなくて
命令呼び出しにして、命令名で動作を匂わせるこの方式はアリだと思っています
中規模以上のプログラムのメインの処理って
即値や即計算ってのを極力排除して、全て名前付きの動作にするべきだと思ってたりします

僕はこれでもプログラム言語を作成してみたいって思っているんですけど
僕はプログラムを書くのが遅すぎるので無理(笑)って思ってた時期もありますが
僕はプログラムを書くスピードは普通だと思いますが
プログラムの方針を決めるのが遅いです
そう言えばルートの計算のプログラムを書くの一年くらいかかりましたし(笑)
どうやって書けばわからないのでゆっくり考えているうちに一年くらいかかりました
普通に書けばいいのに、自分の感覚に近い形で書きたい。とか考えてたら遅くなるんです
まつもとひろゆきさんみたいにパッと決めてパッと実装できなきゃ
何万行もある動作の濃いプログラムは書けないと思ってました
僕は書きたい動作に集中できないタイプですし
でも、実験用の言語内言語なら書けるかもしれない。と思うようになってきて
スローペースでそんなかんじの写経をしています
でもオブジェクト指向の方針が決まってなくて
オブジェクト指向は上にある言語まんま利用すればいいかな?
と思ってたんですが
プログラム言語を作成するとしたら
メッセージを送る。受け取る。という機能に着目したオブジェクト指向を編み出したいですね
と言ってもすぐプログラム言語に全力を尽くす気もなく
このブログを書きながら3、4年たって
言語内言語作成のノウハウがたまってきたらってかんじですけど

オブジェクト指向

オブジェクト指向とは何ぞや?
その問いに一つの視点をみつけました

オブジェクト指向とは数値の単位みたいな面もあるのではないか?
例えば数値があって
あるオブジェクトの中ではcmだったり
あるオブジェクトの中ではkgだったりするんです
同じ数値とはいえ、意味が違う
更に数値が長さのオブジェクトがあったとしても
単位がcmだったりmだったりkmだったりフィートだったり
こういうのは数値を持つ意味は違えど変換できます
こういうのは同じ親クラスを持つ子クラスに分類できるかもしれません
Rubyだと数値もオブジェクトなので
intオブジェクトdoubleオブジェクトbignumオブジェクトとかが
この例にあてはまります

オブジェクトの中身がcmとgのオブジェクトがあったとして
それの値段を求める。とかはポリモーフィズムにあたります
中身の種類が違えど同じ操作をする

商品って色々ありますが
値段という共通の属性があります
オブジェクトの中身が商品というオブジェクトを扱うプログラムでは
値段はすべての親クラスになりますね
Objectクラスみたいなものです

オブジェクトの振舞いが、移動する。穴を掘る
特定の位置で穴をほれば、宝物が出る
その問題を解決するプログラムを考えてみよう
目的は宝物を入手することです
そのために穴を掘ったり移動したり探したりする
穴を掘る。のと、移動する。のは全然違う動作です
しかし宝物を入手するという目的において二つの動作の目的が一致します

オブジェクトがある。オブジェクトは振舞う。プログラムは目的がある
そう考えるなら、プログラムの発展の次のステージにはAIが必要かもしれません
目的を目指すために、振舞いを選択し、振舞うようにメッセージを送るのです
その選択、実行をAIが担うのです

例えばGoogleで検索という動作について考えてみましょう
オブジェクトとして
名称、種類。の二つを設定します
名称と種類の(あらかじめ格納してあるとする)リストを読み込んで
種類がGAMEなら「名称 攻略」で検索
種類が芸能人なら「名称 動画」で検索
これを発展させたAIを導入してAIで検索を決定し実行するのです
なんかAIよりデータベースの方が向いてそうですね
でも、GOOGLEで調べたいんだけど名称がわからない。そういう場合に利用できそうです

例えば僕はあの芸能人の名前誰だっけ?ってよくなるんですけど
「芸能人 女性 過去半年くらいの間でぴったんこかんかんに出てた」
ってかんじのキーワードからキーワードに当てはまる芸能人の女性のリストを出して欲しいんです
僕の例においては米倉涼子でした(笑)
GOOGLEで調べても全然わからなくてmixiのぴったんこかんかんのコミュで見つけました(笑)
でもこんなかんじでわからない名称をキーワードから探してくれるAIはあって良さそうです
最近は英語の翻訳とかも進化しているので、こんな発展もできそうですよね
僕は主にHSPを使用していますが、わからないことが、公式BBSにあることがあるらしく
検索すればいいみたいですが、名称がわからないと検索できないので
キーワードからリストアップして欲しいです

こう書くと高度なAIを想像するかもしれませんが
幾つかの条件分岐の集まりも簡単なAIと言っていいかもしれません
そう考えると、大体のプログラムはAIという形式ではなくとも
簡単なAIを構成していると言ってよいと思います
更にはプログラムを作成すること自体がAIを構成するという作業であり
プログラムを試行錯誤しながら作成することもAIを構成することでしょう
と、定義するならばプログラミング言語もAIを構成しやすい方向に進化するという考えもありですね
RubyはAIを使用しているという意見も読んだような読まないような

PCを使用していると情報が多く(このくだりにおいてはプログラミングにおいては。ですね)
こんなことをしたい。それにはどんなAPIを使用すればいいのか?
このAPIと似たAPIにはどのようなものがあるのか?
このAPIを使用したサンプルプログラムを探したい
探したいことも多いし、変な情報も多い
(知りたい情報という観点から変な情報ですね)
変な情報が多いのは仕方ないとしても
そういう時にAIが動作して探し物をしたい。とは思います

僕はAmazonで書籍を買うことも多いのですが
どんな書籍があるのか?
どのような時に読むべきか?
よくわからないので大体著者買いです
CDレンタルする時もどんな曲があるかわからないので
アーティスト名でレンタルします
期待している書籍(内容)からお勧めの書籍を推薦して欲しかったりします
ジャンルがわかってる時はジャンルで検索しますが
最近だとvisualC++で検索してExpressっぽい解説の書籍をAmazonで買いました
やっぱり体系だった解説だったり、全体像の把握はWEBでは拙いので
書籍は必要ですよね
書籍とはあれだけの量の文章が詰まっているんですもの
例えば、公式の(書籍において)宣伝文とかあって良いと思います
後、対象とかこんなことを読みたいと思っているであろうキーワードとか
NETで本を買うって割と普通になってきたので
なので公式の(書籍において)宣伝文とかキーワードがあって
NETに紹介する時はそれを掲載して良い。とかそういう制度が欲しいですね
逆にキーワードからこういう情報は望まれているけれど扱った書籍がない
という観点から書籍の発行を企画したり

PCには使用していると情報が多いと書きましたが
このくだりにおいてはPC操作という側面から書いてみます
例えば、僕はたまに思い浮かんだ鼻歌を携帯に録音するんですが
前の携帯で録音した鼻歌がサイズが大きくて再生できないんです
なのでPCに取り込もうとしてPCに接続してもPCから携帯にアクセスできない
携帯は接続しました。みたいなメッセージがあるんですけど
どうやったらアクセスできるかわからない
ドライバはDLしてインストールしたんですが
ショートカット作成します。とか出てたぶんそれに失敗したぽい
ウィルス駆除ソフトが活躍した疑惑
もう電話で問い合わせるしかないな。ってかんじです

PCを操作しているとどこをどうすればよくわからない
僕はノートPC派なんですけどWiFiの接続の仕方もよくわからない
そういう時にキーワードからやり方を教えて欲しいんです
マニュアルをきちんと読めって話でもありますが
キーワードによる検索はPCならではであり
なんか僕のノートPCはマニュアルが薄い気がし
昔のPCの方がマニュアルが厚かった気がし
高いお金を出して製造してるPCなんだから
オンラインマニュアルでいいからマニュアルを充実させて欲しいです
マニュアルのわかりやすさってPCの売りとしては弱いですが
メーカー的にマニュアルが充実しているかしていないかは方針としてありであり
結局はマニュアル読まないでサポート利用する人も多そうですが
メーカーの方針としてサポートの厚さは売りになると思う
そう言えば僕のDVD時代に買ったHDDR一回もDVDにバックアップしたことないな(笑)