完全にWiiのパクリです。w
でもだまされて買った人ってかわいそう。威力棒っていう名前が笑える。
シアトル在住日本人ソフトウェアエンジニアのひとりごと
完全にWiiのパクリです。w
でもだまされて買った人ってかわいそう。威力棒っていう名前が笑える。
最近はPowerShellを中心にこのブログ上で活動しているが、もうちょっとまとまったコードを書いてコミュニティに貢献できないものかと考えている。次のようなのをやってみたいなあと思っている。
プログラミング言語には静的言語と動的言語がある。
静的言語というのはC++とかC#やJavaなどコンパイル時にすべての変数の型についてチェックをして矛盾があるものはエラーとして扱い、そのチェックがすべて通って初めてコンパイルされて機会言語(バイナリ)に変換される。例えば文字列型(String)を数値型としてなんの断りもなしに使ってはいけないのだ。例えば次のようなコードをC#として書いたとするとコンパイル時にエラーとなってしまう。実行できる状態になる前に却下だ。
string suuji = "11"; int tashizan = suuji + 10;
動的言語はそれをやってもコンパイル自体が行われないのでそれがない。それを実行したとしてもエラーが起きない。PowerShellで上と同じことをしてみよう。
11という文字列と10という文字列が連結されて単に1110という文字列ができたということだけだ。数学的な計算は行われていない。この事実は状況によってはとても怖いことなのだ。バグが実行時のエラーという形でさえ現れず人間がバグとして認識して初めてバグとなるのである。銀行や金融機関のシステムが動的言語で構築されたら背筋が凍る思いがするのである。
動的言語の利点は静的言語において短所である柔軟性がその長所だと思う。例えばちょっとしたテキストファイルのログを書き出すプログラムがほしい時には、目的によっても違うこともあるだろうが、PowerShellのSet-Contentで十分だし別にFileStreamとかStreamWriterを宣言してガシガシ書く必要はない。この程度で「ガシガシ」という表現を使うとCとかC++で苦労された人にしかられそうであるが・・・
もう一つの動的言語の利点はコードの量がより少なくて済むし比較的コードが読みやすいということだ。例えばWindows上にフォームを作って表示させる比較的単純なコードが30行も40行もあったら敷居が高く感じてしまいあきらめてしまうような気がする。それであきらめてしまった人は少なからずいると思うし私が知っている人にもいる。そういった意味で型などをあまり気にせずにプログラムを組めてしまう言語はプログラミングを知らない初心者には必要不可欠だと思う。そういえばVB.NETが出たときはVB6と同じにしてくれって署名をマイクロソフトに提出した人たちもいたっけなあ。彼らの心情として理解できるのはその表現力を失いたくないということだったろう。そういった意味で動的言語は静的言語よりも表現力が豊かなのかもしれない。表現力の豊かさをどう定義するかにもよるとは思うが。
ここで勘違いしていけないのは、動的言語とは型がないプログラミング(スクリプト)言語とは言えないということだ。PowerShellは動的言語に属するが変数を使うときに型を指定する必要はないものの.NETフレームワークを基本としているので型を理解していないとPowerShellでのプログラミングは困難になってくるだろう。VBScriptだってCIntやCStrなど型を変換する関数だって存在する。変数を扱うことに関しては静的言語と比べて非常に柔軟であるものの、動的言語においても型は意識しないといけないのである。Rubyでも同じことが言える。
これからさらにDLR(Dynamic Language Runtime)にIronRubyやIronPythonなどの動的言語が使われるようになり、動的言語が注目を浴びることになるだろう。F#という関数型言語も現在マイクロソフトによって開発されている。またこれからも静的言語はその地位を失わずに着実に仕事をこなしていくに違いない。まさにプログラミング言語ルネッサンスの時代が到来しようとしているのではないかという気さえしてきてしまう。
Rubyの開発者でありますまつもとゆきひろさんが「プログラミング言語論」というのを書かれています。静的言語と動的言語に関してブログしようとして検索していたら出くわしました。興味深いです。
ふう・・・やっと一段落ついた。現在夜の12時。あ、でもこの時間って日本で働いていらっしゃるエンジニアの皆さんには大した時間じゃないかもですね。
しかし寝る直前まで仕事をすると寝てからも頭の中でコードのこと考えてしまって眠りが浅くなってしまって嫌なんだよなあ。これってマリオを遊んだ直後に就寝すると頭の中でマリオがジャンプしまくってブロックを崩したり、コインを集め続けるのと同じなんだろうか。
まだ修正したいところは2,3いや4,5いや6,7あるがとりあえず後は明日以降修正していくということで。
Post Script:
ウマウマ頭にこびりついて離れません。宇宙仮面さん+えムナウさんにはやられました。バルサミコ酢やっぱいらへんで・・・完全にはまりました。w
撃沈・・・
この例はテキストファイルにしか有効ではないことを初めに断っておく。当たり前といえば当たり前なのだが。ある文字列を含むファイルを探すことはPowerShellだと一行で済んでしまう。二通り試してみたのでどちらも紹介することにしよう。
【例1】
dir -filter *.cs -recurse | where {(Get-Content $_.FullName) -match "検索文字"}
この後にさらにパイプを追加してやればコピーしたり、削除したり、リストにしたりいろいろ加工できる。例えば| foreach {notepad $_.FullName}とするとそのファイルをメモ帳で開いてくれるのだ。結果が多い場合には多分notepadのプロセスが何十個いや何百個にもなってしまいそうなので注意。
【例2】
dir -filter *.cs -recurse | where {$fs = $_.OpenRead(); `
$sr = New-Object System.IO.StreamReader($fs);$sr.ReadToEnd() -match "検索文字"}
この例はより長く読みにくいけど、例1よりずっと早かった。どうしてだろう?解明するにはGet-Contentの仕組みを理解する必要があるようだ。後で見てみることにしよう。