路傍のプログラマ

只のプログラマが綴る愚痴と備忘録

Mixinの定義ってなにさ

2008-10-30 19:50:45 | プログラミング
wikipediaで見ると、

mixinとは、「サブクラスによって継承されることにより機能を提供し、単体で動作することを意図しないクラスである。」(日本語版)
「a mixin is a class that provides a certain functionality to be inherited by a subclass, but is not meant to stand alone. 」(英語版)

とあります。この説明自体は、なるほど、という感じです。

で、Mixinをサポートするプログラミング言語として列挙されているのは、

* D言語 ("template mixin"と呼ばれる)
* Dylan
* Perl
* Python
* Ruby
* Scala
* Strongtalk
* XOTcl (Tcl向けのオブジェクト指向拡張])

英語版では、これにさらに次の言語が加わってます。

* PLT Scheme
* Smalltalk

ここで、mixinをサポートする言語かどうかを判定している基準がよくわかりません。

Pythonがmixinをサポートしているとなっていますが、言語のキーワードにmixinがあるわけじゃないし。wikipediaの例は、単なる多重継承だし。

それだったら、C++のライブラリであるboostのiterator_adaptorなんかまさに上述の定義にはまってるから、C++もmixinをサポートする言語にれても良いんじゃないかという気がしますが・・・

謎。

(2008/10/31 タイポ等修正。)

Windows 7、デジャヴ

2008-10-29 11:18:19 | Birds-Of-Feather
記事「A first look at the Windows 7 PDC release」
http://content.zdnet.com/2346-12354_22-244222.html
によると、
Windows 7のタスクバーが、OS Xのドックみたいになってるのがわかります。

今(もっぱらウェブをだらだら見るのに)使ってるMacBookには「Start Menu」
http://www.crystalidea.com/freeware
というのをインストールしているのですが、

ぱっと見で、左端がファインダー(OSX + Start Menu)かスタートメニュー(Windows 7)かくらいの違いしかありません。

これでマルチタッチも入るとなると・・・

インストール星取り表 2008/10/27

2008-10-27 16:33:07 | その他
ごちゃごちゃとインストール。

VirtualBox 2.0.4(Vista 64bitホスト) ○?

1.4で作成して、2.0で運用していたUbuntu 8.04ゲストのイメージも動きました。

ただ、Gest AdditionsのCDがマウントできなくなってしまったので、イメージを作り直しました。シームレスモードが動かず、USBメモリの認識に失敗するのは変化無し。

Indexer Status Gadget 1.2 ○
うまく動いてます。以前のバージョンと全く同じ使いごこち。

このガジェットの責任ではないのですが、Windowsのインデックスサービスが「圧縮ファイルを見ない」設定にできないのは納得いかないところ。拡張子をひとつづつ設定すれば(.zipとか.tarとか)できるらしいけど、はっきりいってメンドクサイ。

WxPython 2.8 (Python 2.6, win32-unicode) ○
Ubuntuで使ってるPyCrustはIDLEよりも便利なので、WindowsでもPyCrustを使おうとインストールしてみました。

インストーラーが、
C:¥Python26¥Scripts¥pycrust.bat
にバッチファイル作ってくれました。きびきびした補完が好印象です。

IronPython 2.0 RC1 ○
インストーラーに「NGENするか?」というオプションができてました。

ダウンロードのページには、ngenすると起動がすごく速くなる、と書いてあるのでチェックしました。効き目のほどは・・・体感ではちょっと?分かりません。

Pystoneの1.1で試してみたところ、Vista 64bit、クアッドコアのマシン(ただしIronPythonもCPythonも32bit版、という変則的なものですが)、
IronPython 2.0 RC1 -> 115630
CPython 2.6 -> 89019
でした。この辺のチューニングはさすが。

後、ipy.exeをインタラクティブモードで起動するときは、コマンドラインに -X:TabCompletion を付けると補完が効いて楽。どうしてデフォルトじゃないんだろう。

番外編?

JerryCar ○?
iPhoneのアプリだそうです。が、もともとはBox360向けに開発されていたようです。

Windowsのバイナリも以下にありました。
http://jellycar.uptodown.com/en/

ただ、iPhoneのJerryCarと、上記Windowsのモノが同じかどうかは未検証。

Boost.Threadの解説記事

2008-10-27 02:19:03 | プログラミング
8/27のエントリで、Boost 1.36でBoost.Threadが変更されてるらしいと書きましたが、今日になってわかりやすい解説をみつけました。

Anthony Williamsさんの「Whats New in Boost Threads?」
http://www.ddj.com/cpp/211600441
です。

(この記事がすごく良くまとまっていると思うので、ここにだらだら書くのは自重しますが、)C++0xを取り入れて、使いやすくなってた訳ですね。

例のごちゃごちゃやってたコードも、move()やref()を使って書き換えよう・・・

BOF: MSもScalaの方向性に気がついた様子

2008-10-23 15:48:32 | Birds-Of-Feather
Java 6 update 10を調べているうちに、

Shalshcolonさん?の
「Anders HejlsbergとGuy Steeleが並列性から言語設計を語る 」
経由で、

Channel9「Anders Hejlsberg and Guy Steele: Concurrency and Language Design」
http://channel9.msdn.com/posts/Charles/Anders-Hejlsberg-and-Guy-Steele-Concurrency-and-Language-Design/

を発見。

C#のアーキテクトのAnders Hejlsbergさんが

・関数型スタイルの利点は(副作用がないことによる)自動的な並列化だ、
・徐々に関数型スタイルをデフォルトにしていく、
・関数型スタイルとのハイブリッドが望ましい、極端に関数型になることはない、なぜなら、画面に何かを表示するといったことは副作用として行われるのだから、

などと言ってます(私が聞き違えてない限り)。

その割には、MSから出てくるParallel Extensionsとかいうのはアレな感じですが・・・。まあ、これから出てくるものを楽しみにしててね、ということでしょうか。

(2008/10/29 追記)
Msdn Magagineの2008年10月号
http://msdn.microsoft.com/ja-jp/magazine/default.aspx
に、Parallel Extensions to .NETと、Visual Studio 2010の記事がありました。

Parallel Extensionsには特に関数型スタイル向けの機能はないようです。

が、VS 2010にはスタックフレームをツリーとして表示したり、マルチスレッド向けのプロファイリングが導入されていたりと、かなり面白そう。

「on-premise」って何

2008-10-20 21:34:42 | Birds-Of-Feather
ニュースをざっくり読んでいたら、「オンプレミス」なる語が。

何「オンプレミス」って、と思って調べました。

今日時点のen.wikipedia.orgによると、

「on-premise software」とは、同じ建物の中にあるコンピュータにインストールされたソフトのことで、反対語の「off-premises software」とはSaaSかクラウドのこと、だそうです。

別のサイトでは、on-premiseの対義語としてon-demandが使われてるし。

今までのソフトは「オタク」です、私は違います、みたいな。

あー、適当すぎ。

こんなことだからソフトウェア屋は(ry

(2008/10/28 追記)
PDC 2008のキーノートで、レイ・オジーさんも、「オンプレミス」って言ってますね。あちゃー。

ついでに、「Windows Azure」が一瞬「Windows Agile」って聞こえてぎょっとしました。

Scalaのお勉強 #2 implicit conversion

2008-10-14 14:24:32 | プログラミング
Scalaにはimplicit conversionというとてもパワフルな機能があります。

おおざっぱには、Javaでいうところのauto boxingをユーザー定義できるようにしたもの、というか、C++ 0xのconcept mapの代替とでもいえる機能のようです(まだきちんと調べたわけではないですけれども)。

(2008/11/06 追記)
C++ 0xのconcept mapは、duck typeを使うのであんまり似てないですね。すいません。
(2008/11/06 追記 ここまで)

とりあえず、詳しい説明は、先日コメントをいただいた水島さんの「Scalaミニチュートリアル Introduction to Scala」
http://www.java-users.jp/contents/events/ccc2008spring/materials/BOF1-Scala02.pdf

あるいは、Daniel Spiewakさんの「Implicit Conversions: More Powerful than Dynamic Typing?」
http://www.codecommit.com/blog/ruby/implicit-conversions-more-powerful-than-dynamic-typing

に譲りますが(なにぶん当方初心者のため)、

StringからIntへの暗黙の変換すら、
implicit def str2Int(str: String) = str.length
などとさらりと書けてしまうのには脱帽です。

Implicit conversionもそうですが、遅延評価と高階関数があったり、過剰なまでのシンタックスシュガーがあったり。

どうやら、Scalaの設計思想は(C++と同じく)開発者を信用して(悪用すれば簡潔だが読めない保守できないコードを書けてしまうような)パワフルな機能を提供しよう、というもののようです。

Java好きな人にScalaの話をしたら引かれてしまった理由が、少し分かりました・・・

メモリ効率のベンチマーク

2008-10-13 01:31:48 | プログラミング
Scalaについて調べているうちに、プログラミング言語のベンチマークのページを見つけました。

The Computer Language Benchmarks Game
http://shootout.alioth.debian.org/

実行するハードウェア x 言語とコンパイラ(やVM)で計測して、その結果を比較しています。

クアッドコアCPU、32bit OSでの結果を見てみました。

実行速度で比べると、予想通り、
C++ (gcc 4.2.3) > Java (Java 6 -server) >> Python (2.6)
でした。ただし、ここでC++とJavaの差はかなり小さなものでした。

面白かったのは、メモリ効率。結果は、
C++ > Python > Java
です。

ベンチマークでみると逼迫しているはずのJavaが、実際にプログラムを書いてみるとなんとなーくC++より遅いように感じられるのは、このメモリ効率が効いているのかも、と思わせる結果でした。

Scalaのお勉強

2008-10-09 15:22:52 | プログラミング
インストールしました。
Scalaチュートリアル読みました。

今、「First Steps to Scala」を読んでます。
http://www.artima.com/scalazine/articles/steps.html

気づいた点。

・構文がJavaとはいろいろ違う。

一番アレ?となったのは、[]が汎用型に使われていて、配列の要素のアクセスが()になってること。

・varとvalがある。後者があるのが関数型言語っぽい。

ただ、valはJavaのfinalみたいな扱いらしく、

val greetings: Array[String] = new Array[String](3)
greetings(0) = "hello"

とできるのがちょっとアレかも。

(2008/10/21 追記)
mutableな変数や配列の話も含めて、まとまった内容が見つかりました。

記事「Is Scala Not "Functional Enough" ?」
http://www.codecommit.com/blog/scala/is-scala-not-functional-enough
より。

内容はおおよそ、タイトル通り。MLやHaskellと比較して、あんまり関数型言語じゃない、型推論がしょぼいし副作用ありありだよ、と主張してます。

おっしゃるとおりですけど、そういうデザインだしなあ。
(2008/10/21 追記 ここまで)

・型システムが謎。

Javaのクラスをそのまま使えるようにしてるというのもあるけど、ごちゃごちゃしているかも。

val a: int = 1
val b: Int = 1
val c: java.lang.Integer = 1

とかできるのは参った。

isInstanceOfで判定すると、全部trueが返ってくる。

for (i <- d) {
| println(i.isInstanceOf[int])
| println(i.isInstanceOf[Int])
| println(i.isInstanceOf[java.lang.Integer])

よく分からない。

(2008/10/14 追記)
みずしまさんにコメントをいただきました。
intはIntの別名で、java.lang.IntegerとIntとは暗黙的に変換されるようです。
(2008/10/14 追記 ここまで)

・参考文献
samwynさん?の「Scala開眼」
http://www.h7.dion.ne.jp/~samwyn/Scala/scalaindex.htm
に密度の濃いーまとめがありました。

これを見て、Scalaが型推論、パターンマッチング、高階関数や遅延評価などを含んだ立派な関数型言語であることが分かりました。

共変性と反変性が簡潔に記述できるのも良い感じ。

アノテーションがJavaのそれとは違っていたりするのも面白い。

・参考文献2
syttruさんの日記経由で、
http://d.hatena.ne.jp/syttru/20080322/1206213360

Javaプログラマ向けのチートシート見つけました。
A. Sundararajanさん、「Scala for Java programmers」
http://blogs.sun.com/sundararajan/entry/scala_for_java_programmers

コンパクトでいい感じだ。

・開発環境
そろそろコンソールも飽きてきたので、Eclipseのプラグインを導入します。
AWAWAさんの「Scala開発環境の構築(Eclipse編)」
http://d.hatena.ne.jp/AWAWA/20080507/1210132904
を参考に。

ファイルメニューから、Scala objectが作れなくて一瞬焦る。
パッケージを作ってからじゃないとダメなのでした。
なるほどー。