goo blog サービス終了のお知らせ 

路傍のプログラマ

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

メモ: Scalaのお勉強 #3 path-dependent typeとEnumeration

2008-11-05 22:27:55 | プログラミング
よく分からない。

object Direction extends Enumeration {
val North = Value("North")
val East = Value("East")
val South = Value("South")
val West = Value("West")
}

で、Directionというオブジェクトに結びついた型、Direction.Valueができるのは良いと思う。

でも、なぜ、forで回せるのだ。

scala> for (d <- Direction) print(d + " ")
North East South West

試しに、

object D extends Enumeration {
val North = 1
val East = 2
val South = 3
val West = 4
}

とすると、forで回せなくなる点からして、Value()というメソッドがなんかこっそりやってるのだろうなあ。

(2008/11/06 追記)

解決しました。

結論から言うと、メソッドValue -> Valのコンストラクタ -> 変数valuesという風になっていて、後は、for文のところで、for文 -> foreachメソッド -> ・・・ -> 変数values、となってます。

Enumeration.scalaに、

private val values: Map[Int, Value] = new HashMap

という行と(ここで、HashMapはmutableの方です)

protected final def Value: Value =
new Val(nextId, if (nextName.hasNext) nextName.next else null)

という行と

protected class Val(i: Int, name: String) extends Value {
・・・(略)・・・
values(i) = this
・・・(略)・・・
}

というのを見つけました。

後は、

for (d <- Direction) なんたら

がコンパイラによって、

Direction.foreach(d => なんたら)

に直されて、foreachメソッドの定義がどーたらこーたら、となります。

あーしんど。

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 タイポ等修正。)

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()を使って書き換えよう・・・

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が作れなくて一瞬焦る。
パッケージを作ってからじゃないとダメなのでした。
なるほどー。

Java 7に行くくらいだったら、Scala

2008-10-08 21:53:36 | プログラミング
またtodoが膨れあがる話。

Java 7について調べていたら、ため息が出てきました。クロージャとか、プロパティとか。部分的に演算子のオーバーロードも導入とか。

クロージャとプロパティがいっぺんに入ったりしたら、それこそGUI周りのコードは全部書き換えでしょう。というか、既にデリゲートとプロパティを導入しているC#のパクリみたいなコードになる可能性高し。

そこまで変えるなら、もうJava「プログラミング言語」と名乗らなくてもいいんじゃないか・・・と思っていたところで、

ふとScalaという言語がアンテナに引っかかりました。

ちょっと調べてみると、シンタックスもわかりやすいし、割と良い感じです。

JavaVM上で動作するから、Javaの資産を使えるらしいし。何より、もうScalaの動く処理系が出ているらしい。

個人的には、Java 7に行くよりは、Scalaかなあ。

PowerShellちょっとだけ触ってみた

2008-09-26 21:09:46 | プログラミング
PowerShellに徐々に慣れていこうと思います。

PowerShell v2 CTP2をダウンロードしました。

使いやすそうなGraphical PowerShellでやってみました。

・コマンド名も、オプション名もTabで補完が効いて快適。
・Ctrl + Cで実行を中断できない。→ Stopボタン(赤い四角の)を押す。
・Out-GridViewは便利。ソートやサーチも付いてるし。Get-Command | Out-GridViewして喜んでます。

・・・うう、素人丸出し。まだ道は遠そうだ。

メモ: boost 1.36, VC++ 2008 SP1

2008-08-27 19:18:56 | プログラミング
自分用メモ。
boost 1.36を、VC++ 2008 SP1向けにインストール。

(1) ダウンロードして、
c:¥boost_1_36_0
に展開。

(2) rmknさんのページを参考に、bjamを作成。
http://d.hatena.ne.jp/mrkn/20080212/1202801069

pushd c:¥boost_1_36_0¥tools¥jam¥src
build.bat
copy bin.ntx86¥bjam.exe ..¥..¥..
cd ..¥..¥..

(3) アールケー開発さんのページを参考に、コンパイル。
http://www.rk-k.com/memo/017.html

bjam.exe --toolset=msvc-9.0 --without-python --without-regex --stagedir=. link=static runtime-link=shared release stage
bjam.exe --toolset=msvc-9.0 --without-python --without-regex --stagedir=. link=static runtime-link=shared debug stage
bjam.exe --toolset=msvc-9.0 --without-python --without-regex --stagedir=. link=static runtime-link=static release stage
bjam.exe --toolset=msvc-9.0 --without-python --without-regex --stagedir=. link=static runtime-link=static debug stage
bjam.exe --toolset=msvc-9.0 --without-python --without-regex --stagedir=. link=shared runtime-link=shared release stage
bjam.exe --toolset=msvc-9.0 --without-python --without-regex --stagedir=. link=shared runtime-link=shared debug stage
bjam.exe --toolset=msvc-9.0 --without-python --without-regex --stagedir=. link=shared runtime-link=static release stage
bjam.exe --toolset=msvc-9.0 --without-python --without-regex --stagedir=. link=shared runtime-link=static debug stage

あとは、

(4) boostを使ったプログラムをコンパイルするときに、

ライブラリのパスとして、
C:¥boost_1_36_0¥lib
を指定。

(ちなみに、このディレクトリの中身は1.8GBくらい)

あってるかなあ。

以下蛇足。

boost::conditionに関しての変更

boost::conditionがboost::condition_variable_anyとboost::condition_variableに分化。boost::conditionはcondition_variable_anyの別名になっていた。

後者はメンバ関数のwait()に boost::unique_lockのインスタンスを渡さないといけないかわりに、最適化してあるそうな。

今までは、
#include <boost/thread.hpp>
だけでboost::conditionを使えたけれど、

1.36からは、明示的に、
#include <boost/thread/condition.hpp>
としないといけない。

(2008/09/04 一部修正)