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

http://ufcpp.net/

元帥のイメージしかない

leave a comment »

昨日の深夜に、ちょっとばかし、marshallingという英単語の意味について思い悩んだり。

辞書で引いて、「整列する」っていう意味じゃないの?とか思うかもしれないですけど、実際その通りなんですけど、記事書いたり人に教えたりしようと思うと、それだけじゃ不十分だと思うんですよね。

英語ネイティブな人がmarshalという語に抱くイメージと、日本語ネイティブな人が整列という語に抱くイメージ、ほんとに一致してるのかなぁとか。

yield ― 単語の文化的背景

過去、C#にイテレーター構文が導入されたとき、yieldの意味に相当悩みました。

もちろん、辞書を引けば「譲る」なんですけども、この「譲る」がどうもしっくりこなくて。最初、財産譲渡的なイメージの「譲る」で考えていて、一度yield returnした後、次に処理を再開するイメージが付かず。

で、結局、納得いったのは何かというと、前方優先の道路標識が「YIELD」なのを見たとき。そういう意味の「譲る」なんだという。「他の車に道を譲る」ってのと同じイメージで、「他のスレッドなりタスクなりにCPUを譲る」様子を思い浮かべて初めてしっくりきたという。いったん停車して、後続の車に道譲っても、別に走行自体止めたわけじゃなく。

オオカミ ― 単語のイメージは文化に依存する

こういう、イメージまで作り上げなきゃとか思うと、やっぱり単語をただ訳すだけってだと不十分になってきます。たとえ、ほんとに同じものを指す単語であっても、イメージって文化によって違ったりするので。

良く引き合いに出されるのが、オオカミ(イヌ科のあれ)を比喩表現として使う場合にどういうイメージで使われるかというもの。日本語だと、たぶん、「オオカミみたい」っていうと、一匹狼のイメージ、要するに「孤高」だったりするわけです。一方で、英語でwolfishっていうと、残虐性・凶暴性を表す単語。狼男が月夜に暴れるあのイメージ。

言語をまたがなくても、日本みたいな均一化を好む社会の内部であってさえも、育ちが違えば言葉のイメージが変わったりします。

自分は、ある用語に対して直訳な訳語でしっくりきたとします。が、他の人は同じ単語に同じイメージを持っていないかもしれない。人に何かを教えるときには、そういうところにまで気を回さないと行けなかったりします。なるべく、1単語で済まさないで、いろんな言葉でイメージを伝えるのが意外と大事。

static ― 今でもその語が適切か

またもう、歴史的背景があったりすると、作られた当初の様子を知っているかどうかによって、納得しやすさがもろに変わるわけで。

例えば、JavaやC#だと、クラスに属する/インスタンスによらずクラスにつき1個だけのメンバーを静的(static)というわけですが。

内部実装を考えると確かにstatic(プログラムと同じ寿命で、ずっと同じ場所に確保され続ける)ですけども。意味的にはクラス メンバーとか、共有メンバーとか読んだ方がしっくりくるわけで。実際、OOP用語的にはクラス メンバーって言い方結構されますし、VBだとSharedキーワード使いますし。

元々はC言語由来で、関数ローカルなstatic変数(関数を抜けても値が残り続けるローカル変数。グローバル変数と同じ寿命になるものの、その変数を参照できるのは関数内でだけ)から来ていて、それをクラス メンバーに流用した(実際、コンパイル結果的には、スコープが狭まったグローバル変数でしかなく、関数内staticと一緒)のが始まりで。

でも、JavaやC#は、関数内staticもなく、内部実装を意識させるようなプログラミング言語でもなく。

特に、ベテランの人が新人相手に教える時ほど、これがネックになったりするんですよねぇ。長い歴史を経て今の自分があることを忘れて、自分基準で言葉を選んでしまったり。

おまけ: LPCTSTR ― 何それ?難読化?

ちょっと本題からそれますけども、昨日、ちょうど、Win32 APIの文字列(を表すtypedef)についての話なんかも出てたり。

LPSTR, LPWSTR, LPTSTR, …とか、今見たらもう、難読化されたコードか何かに見えてくるよなーという。

  • L: long。昔、long pointerとshort pointerってのがあった。16ビットから32ビットへ移行した時期の名残。
  • P: pointer。
  • C: const。文字列内の書き換えができるかどうか。
  • W: wide。8ビット文字(char)か、16ビット文字(wchar_t)か。
  • T: textの略?コンパイル オプション次第でcharかwchar_tかを自動切り替え。

の組み合わせ。割かし黒歴史。

未だにWin32 APIが現役なので、WindowsでC++使うなら通らなきゃいけない道ですが。毎年、これを新人に教えるお仕事が待っています。

おまけ: ε-δ論法 ― 言葉の意味を考えて使っていますか?

そういや、専門用語ほど、みんな言葉の本来の意味を考えずに使ったりしますよねぇ…

大学数学で多くの学生をくじくことで有名なε-δ論法なんてその最たるもので。

|x|<δ → |y|<ε

みたいな式があったとき、この式だけを見てまず思いつきそうなのは、「δを決めればεが決まる」なんじゃないでしょうか。

ε-δ論法は、それを、「εの方を先に決める」というように、順序を逆にするのがポイント。どんなεだろうと、従属変数δ(ε)が求まる。だから、Greekアルファベット順だとδ→εなところが、逆のε→δの順番でならんでる。これが、極限という概念を厳密に定義するにことに成功した秘訣。

とかいう話を学生(理学系含め)相手にすると、十中八九びっくりされるんですよねぇ。

みんな、難しい理論だから難しい意味が込められているに違いないとか思うみたいです。そのせいか、あくまで用語として覚えてしまって、言葉に込められた意味まで考えてない。

marshalling ― 話を戻して

そんなくらい、言葉の持ってるイメージを気にするので、marshallingについても「整列」って何?とか思うわけです。

  1. メモリ レイアウトが違う可能性あるからレイアウト並べ直せという意味?
  2. serializationと同じ扱い受けてるみたいだし、結局、serializationと同じような感覚?
    • データをディスクに保存するにしろ、通信に使うにしろ、バイト ストリームを通すわけで、そこを通せるように直線的にデータを一直線にならべる = 直列化
    • スレッドとかプロセスとかの境界にも、そういうストリームが挟まっているイメージ?
  3. お家がくっついた際に、家紋を統合する作業をマーシャリングというらしいし、それのイメージも入ってたりする?

等々。

serialization(一直線に並べる)よりは、marshaling(並べるという意味合いだけ)の方が制約の少ない単語なので、1の意味合い(一直線でなくてもいいから、とにかく並べ直せ)なのかなぁ。

またもう、この単語、整列は整列でも、軍隊の部隊整列の意味で使われることが多い(名詞で使うと「元帥、最高司令官」の意味だし)んで、その軍隊色はイメージに含めた方がいいの?関係ないの?とかも悩んだり。ユーザー コードが整列するわけじゃなく、システム様がトップ ダウンで整列するわけですし。

そしてまた、staticみたいに、歴史的背景があって、この言葉が生まれた当初の背景を知っているともっとしっくりくる解釈ができたりするのかな?とかも勘ぐってみたりするわけです。marshallingという言葉を使いだしたのは、MicrosoftのCOM?

追記1: CORBA

夜が明けてから頂いたご意見1。

COMよりもCORBAの方が先っぽい。その当時、marshallingという用語を使っていたかどうかまでは不明とのこと。

追記2: 軍事/祭事のイメージであってるっぽい

同、ご意見2。

「システム全体を把握しているmarshal(名詞用法だと、司令官、所長、式典担当者)の案内がないと通れないのがプロセス境界」とのこと。

両側のプロセスのコンテキストを把握して、通るデータを適切に並べ直すのがmarshalのお仕事。

結局、タイトル通り、元帥のイメージでよかったようです。自分がしっくりきてなかったのは、「組織のトップ=構成員を正しく配置する人」というイメージがなかったせいかも。自分もやっぱり日本人だと思いました。

広告

Written by ufcpp

2012年1月11日 @ 23:22

カテゴリー: 未分類

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。