- 【Python】スクリプト バトルロワイヤル45【pl,rb,php,js】
843 :733[sage]:2014/08/24(日) 00:32:22.62 ID:1ar9zXjo - Smalltalkの面白みは、生きたオブジェクトをストアできる
データベースのようなものの中に処理系が構築されている ところだと思います。クラスやインスタンスはもちろん メソッドもプロセスも実行コンテキストも、コンパイラも IDEもいっさいがっさいぜんぶDB内のデータとして 収められていて、どれも同じくアクセスしたり改変できるのが 心地いいです。 たとえばメソッドのソースコードは メソッドの属性として 扱われていたり、ユーザー操作もシステムの改変を伴うものは 全部データとして履歴が残るので、ファイルベースでは困難な メソッド単位のバージョン管理もあっけないほど単純な仕組みで 実現されているのが覗いていて楽しいです。
|
- 【Python】スクリプト バトルロワイヤル45【pl,rb,php,js】
856 :733[sage]:2014/08/24(日) 09:58:50.10 ID:1ar9zXjo - >>853
「オブジェクトストアの中に処理系ごと入ってい」という感覚は 通常の、とくにファイルベースのOS上でのコンピューティングになれていると ちょっと想像しにくいかもしれませんが、なんとか説明を試みてみます。 Smalltalkではオブジェクトストア(処理系を構成するオブジェクトも含む)は 仮想イメージと呼び、たしかにデータベースのようではあるのですが、これを 個々にマージするような作業はめったにしません。ユーザーごとにコピー(フォーク)して 使われる秘伝のタレみたいなものですね。 Smalltalkのコンパイルはメソッド定義時に行なわれます。 コードを書いたり、既存のコードを編集したときに保存するような操作をすると そのタイミングでメソッド(やはりオブジェクト)は新しいソースコードを元にした 新しいバイトコード列に置き換わります。ソースはメソッドの属性なので メソッドにたとえば getSource というメッセージを送ること得られます。 メソッドの定義や編集などのシステム改変を伴う操作はすべてChangeRecordというクラスに 属するオブジェクトとしてストアの中に蓄積されますので、あるメソッドの変更履歴がほしければ、 ChangeRecordのインスタンス群から注目するメソッドの改変に関わるインスタンスだけを抽出して 時系列で並べることで履歴が得られます。リバートは ChangeRecord にひも付けされた 古いソースでそのメソッドを再コンパイルして生成し既存のものと置き換えることで完了します。 古典的には ChangeRecord を集めた ChangeSet というオブジェクトをストア間でやりとり することで、マージなども可能となっていました。
|
- 【Python】スクリプト バトルロワイヤル45【pl,rb,php,js】
858 :733[sage]:2014/08/24(日) 10:15:57.05 ID:1ar9zXjo - >>857
メソッドごとにバージョンが管理されているというだけで、 コミットはチェンジセット(最新のメソッド変更のセット、組み合わせ)という単位で されるので問題はないです。
|
- 【Python】スクリプト バトルロワイヤル45【pl,rb,php,js】
860 :733[sage]:2014/08/24(日) 10:32:08.48 ID:1ar9zXjo - >>859
「保存」とか「データベース」というのが既存の使い方と紛らわしかったですね。すみません。 オブジェクトストア(仮想イメージ)は、通常のデータベースのように複数のユーザーで 同時に共有することはしないので[*]、「保存」のような操作というのはあくまで ファイルベースでいえば、編集したソースのファイルへ保存する程度の意味で使いました。 Smalltalk ではこのタイミングでメソッドがコンパイルされ、新しいバージョンに置き換わります。 複数ユーザーで開発する場合は、コミットは原則チェンジセット単位ですね。 [* GemStone/Sのように、オブジェクトストアを本格的OODBにしてしまった処理系もあります。] 書いていて思ったのですが、Smalltalk がメソッドレベルのバージョン管理など 便利な機能を容易に実現できているのは、オブジェクトストア(仮想イメージ)ベース ということももちろんあるのですが、オブジェクトによる言語要素の単純さと遅延結合を 徹底したことによって実現された、メソッド単位のインクリメンタルなコンパイルが可能であった ことのほうが大きいかもしれませんね。
|
- 【Python】スクリプト バトルロワイヤル45【pl,rb,php,js】
873 :733[sage]:2014/08/24(日) 11:41:09.58 ID:1ar9zXjo - >>870
Smalltlak では do it 、print it といったユーザーによる式の評価は 既存クラスへのメソッドの定義とみなされるので、履歴に残ります。 (かつては本当にその文脈での self の属するクラスのメソッドとして いったん定義され実行後、削除するといった実装になっていました) 履歴に残るか否かとは別に、オブジェクトストア内に生じたオブジェクトは GC されない範囲ですべて仮想イメージに保存されます。
|
- 【Python】スクリプト バトルロワイヤル45【pl,rb,php,js】
911 :733[sage]:2014/08/24(日) 14:26:20.34 ID:1ar9zXjo - >>874
遅レスすみません。(ちょっと出かけて帰ってみたらまた殺伐として…^^;) > バグに気付かず動き続けるってことは無い? バグってる状況がどういうものかにもよりますね。 たとえば、オブジェクトAにインスタンス変数を追加するような変更(厳密には オブジェクトAの属するクラスに対してインスタンス変数追加を指示)をした場合、 初期化のメソッドを追加しても、当然すでに存在するオブジェクトAには適用されませんから 追加したインスタンス変数を何かするメソッドは当然バグります。 ただこの手のトラブルはパターンとしてよく出くわすため、 動的にインスタンス変数を追加するような開発スタイルをとる場合は、 インスタンス変数へのアクセスは間接的(メソッドを介する)ようにして、 遅延初期化を行なうよう習慣づけられてもいます。 この手のはケント・ベックが「Smalltalkベストプラクティス・パターン」www.amazon.co.jp/dp/4894717549 にまとめているので興味があれば参考にしてみてください。 英語で大丈夫なら、ドラフト版がこちらなどから入手できます。 https://github.com/anapata/reading/blob/master/chapter14/Draft-Smalltalk%20Best%20Practice%20Patterns%20Kent%20Beck.pdf
|
- プログラミングのお題スレ Part4
803 :デフォルトの名無しさん[sage]:2014/08/24(日) 19:11:53.26 ID:1ar9zXjo - >>795
Squeak Smalltalk で。 49 * (1.0/(1 to: 49)) sum * 108 "=> 23703.9546504393 " 10000人で試行した場合、 50%の人がコンプするのに必要な金額は26136円。 最少額でのコンプは 9936円。もっとも金額がかかった人は71604円。 | N count stat sum size | N := 10000. count := (1 to: N) collect: [:idx | | bag | bag := Bag new. [bag add: 49 atRandom. bag asSet size = 49] whileFalse. bag size]. stat := count asBag sortedCounts. sum := 0. size := stat findFirst: [:kv | (sum := sum + kv key) > (N * 0.5)]. ^{((stat first: size) collect: #value) max. count min. count max} * 108 "=> #(26136 9936 71604) "
|