« 2005年3月 | トップページ | 2005年5月 »

Adobe、Macromediaを買収

Adobe、Macromediaを約34億ドルで買収.

はーーーーー!?

エイプリルフールじゃないですよね?
ほんと、今年一番驚いたかもしれないです。こういうのって、独禁法にひっかからないのかなあ…。

| | コメント (3) | トラックバック (1)

Peggyスクリプト二つ登録しました

アンカーシステムズさんのスクリプトライブラリに、「menuComplete」と「doxygenTool」を登録しました。

doxygenToolの方は結構前からできていたのですが、menuCompleteの方にDoxygenのコマンドを補完する機能があって、これがないとちょっと使いにくいので、一緒に公開できるようになるまで待っていた次第です。

menuCompleteは、単語補完スクリプトなのですが、前々からずっとできないかなあと思っていた「構造体のメンバ名を補完する」機能がやっと実現できました。
人にPeggyを薦めるときに、「でもVisualStudioみたいに補完できないんでしょ?」と言われることがあって、何とかして部分的にでもできないものかと思っていたのです。(自分でも欲しかったんですけどね。)

今のところC/C++の構造体のメンバしか補完できないのですが、できればC++のクラスのメンバも補完できるようにしたいですね。継承とかの問題があって、現実的な速度を実現するのがかなり難しそうですが…。

以下に構造体メンバ補完とプログラムの仕様に関する考察(というか言い訳)をメモしておきます。

◇TAGSについて
このスクリプトでは、シンボル検索の際に生成されるTAGSファイルを利用しています。よって、「定義位置ブラウザ」ダイアログで「TAGSファイルを残す」設定をしておく必要があります。
スクリプトで構文解析をするのには限度があるので、どうしてもTAGSファイルを利用する必要があるのです。
「TAGSファイルを残す」設定なんて使うことないだろうと思っていたのですが、まさかこんな用途に使えるとは…。Junさんはこういうのを予測してたんでしょうか?

◇MocaScriptについて
このスクリプトはかなり重い処理をしてます。なにせ、とてつもなく膨大になりうるTAGSアウトプットウィンドウから、一つずつ候補を探してくるわけですから…。(ちなみに、動作のテストはrubyのソースでやってました。)
それでも現実的な速度で動くMocaScriptは本当にスゴイです。おそらく世界最速のJavaScriptの実装でしょう(^^

◇補完の仕方について
構造体メンバの補完には、大きく分けて3つのステップがあります。

・変数名を取得する
変数名は、普通 . か -> の左にあります…が、キャストしていたりすると取得するのが難しくなります。現状は、変数が配列だったときに配慮しているくらいです。
キャストに関しては型名が書いてあるわけだから、逆になんとかなるかもしれないですね。

・型名を取得する
型名を取得するには、変数の宣言を見つける必要があります。変数の宣言は、

(1)ローカルで宣言されているとき
(2)関数の引数になっているとき
(3)グローバル変数のとき

の3つが考えられます。このスクリプトではあまり真面目に構文解析をしているわけではなくて、補完する位置から一行ずつ順番に見ていって、「宣言っぽい」ところを見つけた時点でそれを型名であると判断します。ただ、

return variable_name;

else variable_name = 0

みたいになっていることがあるので、これらのキーワードは型名ではないと判断します。っていうか、Cのキーワードリストを持っておいた方がいいのかもしれないですね。
(3)の場合は他のファイルにあるかもしれないので、TAGSファイルをgrepして探します。どちらかというとこっちの方が単純です。
プロジェクトに登録してある静的なTAGSは検索していないのですが、これはどちらかというと、実行速度のためです。

・型のメンバを取得する
最後はメンバ名の取得なのですが、これは完全にTAGSファイルに頼っています。構造体の型名を、前後64行も一緒に出力するオプションでgrepして、その中からメンバ名を探します。メンバ名であるかの判断は、インデントに頼っています。
これによって、取得できるメンバ名が64個までという制限が出てしまっているのですが。
こちらの方は、プロジェクトに登録してある静的なTAGSからも検索します。
プロジェクトに多数TAGSが登録してある場合は、探すのにかなり時間がかかってしまいます。

◇Rubyの場合
Rubyの場合、シンボル名が、最初に@や$があったり、最後に!や?があったりと特殊なので、特別な処理をしています。そのせいで正規表現にORを使う必要があって、実行速度が他より若干遅いんですけどね。

◇Doxygenのコマンド名補完
Ruby以外では、@から始まる語はDoxygenのキーワードと見なして補完します。これは静的なリストを使って行っています。

◇カーソルの右にも語が続いている場合について

hoge|moge

のように、カーソルの右側にも語が続いている場合は、それを削除して(この場合はmogeを削除して)選んだ語を入れます。例えば「hogepiyo」という語を選んだ場合は、

hogepiyo|

となります。この辺りの動作はVisualStudioにできるだけ似せています。

追記…Javaでもほとんど似たような方法で、クラスのメンバ補完ができるんじゃないかという気がしてきました。(言語機能がシンプルなぶん、C++より簡単そうです。)こっちを先にやってみようかな。Javaについては、もう補完スクリプトを作られている方がいるんですけどね…。

| | コメント (0) | トラックバック (0)

プログラミング言語C#がJISに制定

プログラミング言語C#がJISに制定

これでC#も勉強しやすい環境になりましたね。とても良いことだと思います。

学生時代にはJavaをよく使っていたのですが、GUI周りの機能を考えるとやっぱり.net frameworkの方に魅力を感じます。
C#に関しては、@IT私がJavaからC#に乗り換えた10の理由っていう面白い記事があったんですが、現場の気持ちが良く表れてるなあと思いました。きれいにまとまったJavaの機能も魅力的なんだけど、多少ごちゃごちゃしているように見えてもいろんなことができる(その気になったらポインタだって使えてしまう)C#の方が使えそうですよね。

これで.net frameworkがlinux上でも走るようになったら最高なんだけど、残念ながらきちんとした形にはならないだろうなあと思います。C# プログラミング言語の将来の機能という記事の中で、「Javaで機能追加されたジェネリクスは、仮想マシンにあまり変更を加えない実装を選んだが、私たちは仮想マシン自体をジェネリクスに対応させた」と主張してるんだけど、これはもの凄い開発能力を持っていてかつWindow向けに作れば済むマイクロソフトだからこそできることですよね。Javaのジェネリクスへの対応は、仮想マシンを実装している開発元に配慮した対応だとも言えるのではないでしょうか。
標準化で今後変わってくるといいんですが、いつまでもこういう態度を取っていたら、.net frameworkが他のOSできちんと走る日は来ないでしょうね。

まあ、僕としてはWindows上できちんと走れば実用上問題ないのですが(^^;

| | コメント (0) | トラックバック (0)

新しい言語

おかねさんに「Smalltalkが面白い」と教えていただいたこともあり、自由自在Squeakプログラミングという本でSmallTalk(と言ってもこれはSqueakという処理系ですが)を試してみました。

なるほど、これは刺激的ですね。ちょっと試してみただけなのですが、ほんとに全てがオブジェクトへのメッセージで構成されてるんです。例えば条件文は、trueやfalseにブロックを渡す形になります。rubyで書いたらこんな感じでしょうか。

class TrueClass

def is_true
yield
end

def is_false
end

end

class FalseClass

def is_true
end

def is_false
yield
end

end

(1 < 3).is_true do
puts "This block runs."
end

(1 < 3).is_false do
puts "This block does not run."
end

(1 > 3).is_true do
puts "This block does not run."
end

(1 > 3).is_false do
puts "This block runs."
end

Rubyが「Perl的なSmallTalk」と呼ばれている理由が分かった気がしました。
ただ、今のところRubyも勉強している途中なので、本格的にやるのはその後にしようかなと思っています。

達人プログラマーに「一年に一つ言語またはツールをマスターすること」と書いてあったので、何かをやりたいとは思っているのですが、まだちょっと迷っています。Rubyは文句なしに面白いんだけど、仕事のこと考えたらC#なんでしょうね。今WindowsのツールはC++Builderで作ることが多いんだけど、将来的にはVisualStudioになる(というかそうしたい)ので...。
ゲームプログラミング用途にはC++なんでしょうが、これは必要にならないと絶対やらない気がします(^^;

| | コメント (0) | トラックバック (1)

« 2005年3月 | トップページ | 2005年5月 »