++C++; // 未確認飛行 C ブログ

http://ufcpp.net/

Archive for 4月 2010

命令的とか宣言的とか

leave a comment »

こないだ、言葉の持ってる意味を分からずに使うの気持ち悪いみたいな感じの話を書いたわけですが、今日は今日で、命令的とか宣言的とかって言葉が気持ち悪くなってきたんでその話を。

文字通りの意味で捉えるなら、

  • 命令型言語
    • CPU に対する命令を直接書く
    • 今現在のいわゆるノイマン型コンピューターがチューリング機械モデルで動くんだから、必然的にチューリング機械モデルに近い ≒ 命令的
  • 宣言型言語
    • プログラマーが書きたいことをそのまま書く
    • となると、「何を書きたいか」によって、何が宣言的か変わるんじゃなかろうかと
      • 文字通りの意味で宣言的たろうとすると、DSL(Domain Specific Language)になっちゃうのかなぁ
    • 「関数型だから宣言型」とか「参照透過性持ってる言語が宣言的」とか「ラムダ計算に基づく言語が宣言的」とか言われると少々違和感あり

となるかなと。で、そうすると、命令的と宣言的は厳密に対義語じゃないですよね。確かに、チューリング機械モデルに近いような低レベルのモデルで書きたいことそのまま書けるかというと厳しいんですけど、だからと言って、低レベルなモデルから離れさえすれば書きたいとおりにかけるかというと必ずしもそうじゃない。

模式的に描くと、以下のような感じ。

計算モデルあれこれ

  • プログラミング言語の基礎となってる計算モデルって大きく分けると「チューリング機械モデル」と「ラムダ計算モデル」がある
  • 実際のCPUの構造に近いのはチューリング機械モデルの方
  • チューリング機械モデルそのままじゃ使いにくいんで、その上にちょっとずつ人の直観に近いモデルを被せて使ってる
  • (2次元的に分類できるわけでもない(もっと多次元的)と思うけど、まあ、ここは説明のために簡単化)

で、命令的って言葉の度合を考える場合は、実際の CPU の構造からの距離で考える。

命令的度合

  • 大きい円の中心辺りが命令型言語って言われるもの
  • 関数型言語 = 非命令型 って考え方はいいと思う
  • オブジェクト指向言語だって立派な非命令型言語

一方で、宣言的ってのの方の度合は、プログラマーが書きたいことってのを中心としてそこからの距離で考える。何を書きたいかって文脈に依存。

宣言的度合

  • 大きい円の中心辺りが宣言型言語って言われるもの
  • GUI開発の文脈だと、関数型言語って宣言型度合高くないと思う
    • ↑むしろ、オブジェクト指向言語の方がよっぽど宣言的
  • 今、データ並列がホットな話題だから、その文脈で宣言型度合の高い関数型が注目浴びてるというだけで

こう考えると、関数型言語に対する熱狂度合が人によってばらついてて、自分にとっては関数型言語の良さがしっくりきてなかった理由も納得がいくかなぁと。自分がデータ並列の文脈にあんまりいなかったからなんだと。関数型の良さを伝えたいって人も、「参照透過性大切」とか「immutable大切」って言い方じゃなくて、Map-Reduce型のモデルとかの説明を先にしてから、参照透過性あるとこんなに問題が解消されるでしょと話した方がいいのかもなぁと思ったり。

Written by ufcpp

2010年4月30日 at 14:40

カテゴリー: 未分類

4じげん×Hotmail、等々

leave a comment »

Written by ufcpp

2010年4月26日 at 12:52

カテゴリー: .NET

4/24 すまべん

leave a comment »

すまべん特別編「Windows Phone 7 開発スタートアップ」で講演してきたわけですが。

とりあえずプレゼン資料を公開。

http://cid-5c622397e11c979d.skydrive.live.com/self.aspx/ufcpp/%e5%8b%89%e5%bc%b7%e4%bc%9a%e8%b3%87%e6%96%99/20100424Silverlight%e3%81%ae%e3%83%97%e3%83%ad%e3%82%b0%e3%83%a9%e3%83%9f%e3%83%b3%e3%82%b0%e3%83%a2%e3%83%87%e3%83%ab.pptx

(しかしまぁ、SkyDrive はこの URL の長さほんとどうにかならないかな・・・)

  • XAML に対する最初のとっつきとしてはなかなかいい感じの資料になったんじゃないかと
    • 「XAML ってどう書けばいいの?」「てか、なんで XAML なの?」「XAML で何が嬉しいの?」という辺り
    • WP7 向けだけじゃなく、PC 版の Silverlight や、WPF の入門にも使えます
      • (てか、プログラミング モデルってレベルの話だとこの3者はほんと全く同じなんで。)
  • あと、ちょこっとだけ、WP7 における Silverlight の立ち位置の話とか、簡単に XNA の方の説明も入ってます

さて、プレゼン中ではデモを2つほど動かしたわけですが。片方だけ公開。2つ目はちょっと公開見合わせ中。公開する気ではいるんで、もうしばらくお待ちを。

  1. M-V-VM パターンの説明用の Silverlight 4 アプリ
  2. UI デザイナーさんの手を通す前後でアプリの見た目がどう変わるか比較サンプル
    • ブラウザー版みたいにウェブ越しに現物見れたりしないのが何とも
    • Silverlight 4 化してから公開するかも
    • WP7 版のソース自体はすぐに公開してもいいんだけど・・・
      • 実はまだデザイナーさんに手を入れてもらった部分の確認を自分でもしてないんで、それをやってから公開予定

Written by ufcpp

2010年4月24日 at 16:51

カテゴリー: 未分類

VS 2010 リリース記念 C# たん

leave a comment »

C++ たん、VB たん、F# たんと一通りそろったことだし再び C# たん描いてもらった。

Visual Studio 2010 も RTM になったことだし、なんとなくそんな雰囲気で。

004

作画: Paese

ちなみに、痛 IDE とかで使いたい場合、大きめのサイズもご用意いたしました

  • 今回絵師さんに付けた注文は「猫被ったバージョンって感じで」
  • C# たんはキャラ設定的に「目的のためには手段選ばない子」なんで、猫も被るときは被る
    • 普通に美形キャラ
    • お子様キャラのはずだけど、絵師さんには「OL 誌あたりを参考にして。ませガキというか、年相応に見えないキャラで。」とお願い

Written by ufcpp

2010年4月23日 at 15:58

カテゴリー: C#たん

Docs.com、WP7のプッシュ通知、等々

with 2 comments

  • Microsoft Docs
    • Facebook と連携して Word, Excel, PowerPoint, OneNote 文書を共有(みんなで編集も可能)できるサービス
      • 内部的に Office Web App(Skydrive で Office 文書見れるやつ)を使ってるらしい
        • なので、ウェブ上での編集も可能
      • 今のところ、文書のアップロードは招待性の限定メンバーのみができるみたい
    • 関連:
  • Implementing Push Notifications in Windows Phone 7
    • 「マルチタスクって言ったって、裏で定期的に HTTP Polling したいだけなんだろ。そういうの、消費電力的にもパフォーマンス的にも悪いからやめようよ。代わりにプッシュ通知の仕組み用意してるからさ。」みたいな話
    • 通知の種類
      • Raw: 起動中のアプリに通知イベントが行く
      • Toast: ポップアップで通知
      • Tile: メインスクリーンにピン止めしてあるアプリアイコンに通知が来てることを知らせる絵が付く
    • 通知の方法
      • MS の用意した Push Notification Service (以下、通知サーバー)ってのがいるらしい
      • WP7 側から通知サーバーにリクエスト出して、通知 URL をもらう → 自前サービスに対して通知 URL を渡す & WP7 上では通知イベントを購読
      • 自前サービスは以後、その URL にメッセージを投げれば WP7 にプッシュ通知されるようになる
  • 「IME 2010」、単体で無償配布へ Office XP以降のユーザー向け
    • そもそも Windows 標準添付のと Office 版とで分ける意味が分からないんですけどもねぇ
  • Microsoft Translator 開発者向けサービス
    • いつの間にか開発者向けのページが日本語になってた
    • といっても、トップページだけだけど
  • Studio Styles
    • VS 2010 のスタイル共有サイト
    • 黒背景が人気過ぎる・・・
      • 白背景だったら標準のスタイルで別にいいじゃないってことかな
  • SQL Server Modeling CTP (November 2009 Release 3) for Visual Studio 2010 RTM Now Available
    • 内容的には CTP Nov 2009 のままだけど、VS 2010 の RTM 版に対応

その他、近況: Windows Phone 7 用開発環境のためにいまだに Visual Studio 2010 が RC 版な日々・・・

Written by ufcpp

2010年4月22日 at 05:12

カテゴリー: .NET

共変性(Covariance)/反変性(Contravariance)の話

with 2 comments

ずっと思ってたことではあるけどいよいよ気になってきたんで、昔取ったメモを見返したり、圏論とか代数幾何を調べてみたりしながら書いてみる。

C#(に限った話じゃないんですけど)デリゲートとかジェネリクスの共変性・反変性、言いたいことはわかるんだけど、名が体を表してなくてものすごく気持ち悪いんですよねぇ。

元々、共変性・反変性って言葉の意味は「共に変化する」「反対に変化する」って意味だったんですけどね。デリゲートとかの共変性・反変性は何が共に変化して、何が反対に変化するか微塵も意味が残ってない。たどっていくとつながってないこともないんですけど、紆余曲折経てなんかよく分からないことに。

どうたどられていくかというと、デリゲートの共変性・反変性 → 圏論: 共変関手・反変関手 → 代数幾何学 → 多様体論における共変ベクトル。最後の共変ベクトルまで行くと、「基底と同じ変化の仕方をするベクトル」って意味になってるはず。

共変ベクトルと反変ベクトル(数ベクトルの場合)

直交座標しか使ってなかったり、座標変換ってものに触れないうちは気にしなくてもいいことなんですけども、ベクトルには座標変換のルールによって2つのタイプのものがあります。

  1. 共変ベクトル
    • 基底を e1, e2 とでも置くと、a = p・e1, b=  p・e2 となる (a, b) を作って、この数ベクトルで点 p  を表す方法
    • (a, b) の座標変換ルールは e1, e2 の座標変換ルールと同じになる(e1 を x 倍すると a も x 倍になる)
  2. 反変ベクトル
    • 基底を e1, e2 とでも置くと、p = a e1 + b e2 と書ける (a, b) を探してきて、この数ベクトルで点 p を表す方法
    • (a, b) の座標変換ルールは e1, e2 の座標変換ルールと逆になる(e1 を x 倍すると a は 1/x 倍になる)

ちなみに、共変ベクトルと反変ベクトルは互いに内積を取ると座標変換ルールが打ち消しあって、座標の取り方によらない量(スカラー)になります。こういう関係を「双対(dual)」といいます。

参考: 反変座標と共変座標

共変ベクトル(微分幾何学の場合)

力学(特に相対性理論とか)では、曲面上に拘束された物体の運動を微分方程式で表したりします。その過程で、微分可能な曲面とか立体の理論が発達しました。

概要だけいうと、以下のように共変ベクトルが定義されます。

  • 曲面上の任意の関数は、接線を1つ与えれば、その接線に沿った微分が定義できる
  • この「接線に沿った微分」のことを「接ベクトル」と呼ぶ
    • 実際、微分演算子ってのは線形性を持つ(線形空間をなす)ので、何らかの基底を与えてベクトルとして表すことができる
    • 例えば、偏微分演算子 ∂/∂x, ∂/∂y を基底として、a ∂/∂x + b ∂/∂y って感じのベクトルを作る。この微分演算子は接線に沿った微分を表す
  • こうやって作った「接ベクトル」は共変性を持つ(微小変分 dx とか同じ変換ルールになる)ので、共変ベクトルと呼ぶこともある

ちなみに、この場合、反変ベクトルの方はというと以下の通り。

  • 共変ベクトルの双対として定義
  • 共変ベクトルが接ベクトルになるのに対して、反変ベクトルは微分形式として理解できる
    • a dx + b dy みたいなの

参考: 共変ベクトルと反変ベクトル

共変ベクトル(多様体)

近代数学の進化の方向性の1つに「座標系の取り方によらない理論を作る」というのと「そもそも何らかの座標系の存在を仮定しない内在的な(intrinsic)な定義を目指す」というのがあります。で、曲面とか立体を、intrinsic な定義を目指して抽象化したものを多様体(manifold)といいます。

具体的にどうするかというと、

  • 「共変ベクトル = 微分演算子」という考え方はそのまま使う
  • 微分演算子の定義の仕方を、∂/∂x とかせず、以下のように行う
    • 多様体(曲面とか立体)上の任意の関数 f, g に対して以下の条件を満たす写像 v を接ベクトルと呼ぶ
      1. v(f + g) = v(f) + v(g)
      2. v(a f) = a v(f)
      3. v(f g) = v(f) g + f v(g)

要するに、共変ベクトル = 接ベクトル = 微分演算子を以下のようにとらえる。

  • 微分演算子ってのは 関数 → 関数 の変換(こういうのを、圏論的には関手(functor)と呼ぶ)
  • 微分演算子は線形性を持つ(1 と 2)
  • 微分演算子は積の法則(3)を持つ

こういう定義の仕方なら、座標(x とか y とか)が一切出てこないので、座標の存在を一切仮定しない = 内在的な定義って言われる。

参考: 接ベクトル・微分形式の内在的定義

代数幾何とか

上述の通り、共変ベクトルってのは微分演算子のことで、それは結局のところ、関数 → 関数 の変換の一種。

で、代数幾何学って分野において、「この 関数 → 関数 の変換って実は圏論(category theory)ってやつでいうところの関手(functor)よね」ということに気付いた(実際には代数幾何の発展の過程でそういう理論が整備された)らしく、共変ベクトルの性質を圏論を使って調べられるようになったとか。

参考(ただしソースは Wikipedia): 圏論関手

多分、そういう歴史的背景から、共変ベクトルに相当する関手が共変関手、その双対(反変ベクトル)に相当するのが反変関手って名前になったんじゃないかと。(この辺りからちょっと自信ない。誰か詳しい人はいないものか・・・。)

ここまで来ると、こういう歴史的背景というか、順を追って理論知ってる人でないと元の言葉の意味(共に変化する・反対に変化する)が全く意味不明。

プログラミング言語における型の共変性・反変性

で、ようやくプログラミング言語における型の共変性と反変性って言葉。

  • 型の継承関係的な順序を保つのが共変
    • string ―[inherits]→ object なのに対して、IEnumerable<string> ―[assignable]→ IEnumerable<object>
      • 戻り値にだけ型が使われてる
    • 共変関手を使って説明できるとかなんとか
  • 型の順序を逆にするのが反変
    • string ―[inherits]→ object なのに対して IComparable<string> ←[assignable]― IComparable<object>
      • 引数にだけ型が使われてる
    • 反変関手を使って(以下同文)

参考: 共変性と反変性(圏論由来関連のとこにある説明はたぶん誤訳。正しくは「圏論における定義によって、計算機科学におけるこの用語の定義とベクトルにおけるこの用語の定義が統一的に理解できる。」とかかと。)

一応、「型の順序関係を反対にする方が反変」って覚え方はできるものの、もともとの「共に変化・反対に変化」ってニュアンスとはずいぶん変わってるんですよねぇ。

正直、最初にこれを共変性・反変性と呼んだ人は結構罪深いと思う。あと、C# で covariance/contravariance とかそれに類するキーワードじゃなくて in/out ってキーワードにしたのは非常にいい判断だと思う。(これに対して、MSIL の仕様上は covariant フラグと contravariant フラグって名前になってる。いまいち。)

なんかもっといい呼び名はなかったものかなぁ・・・

Written by ufcpp

2010年4月19日 at 13:53

カテゴリー: Computers and Internet

C# 4.0 and beyond、ジェスチャー制御&全方位プロジェクター、Silverlight 4 リリース、等々

with 2 comments

Written by ufcpp

2010年4月18日 at 15:10

カテゴリー: .NET