プログラミング言語間の相互運用性を高める取り組み 29
ストーリー by hylom
C/C++となにか、なら話は早いのだが 部門より
C/C++となにか、なら話は早いのだが 部門より
insiderman 曰く、
近年では目的に応じてさまざまなプログラミングが使われるようになっている。そのような状況の下、異なる言語間での相互運用性を高める取り組みが注目されているようだ(本家/.)。
複数の言語を組み合わせてアプリケーションを作るというのは最近では珍しくないが、その場合、「親」となっているプログラムから「子」となっているプログラムをサブルーチンとして呼び出す、という形が一般的だ。しかし、たとえばC++とJavaの組み合わせのように、言語の組み合わせによってはさまざまな障害があり、これが難しい場合がある。
ACM Queueに掲載されている元ネタの論文では、障害の一例としてオブジェクトモデルの違い、メモリモデルの違い、例外処理やエラー処理の違い、ミュータビリティや「副作用」の有無などが挙げられているのだが、残念ながらそれらへの汎用的案対処法は明確には示されていない(個々の障害への対策法は示されているが)。
長らくソフトウェア開発においてはコードの再利用性や保守性などを高める手法が注目されていたが、今後はほかのプログラミング言語と組み合わせて使うための手法などが注目・開発されるのかもしれない。
SWIG (スコア:1)
これって、1996年公開のSWIGの主な機能だよね。
まあSWIGは、各種スクリプト言語→C or C++ なので、若干限定されてるけど。
ウェブAPIで疎結合 (スコア:1)
(記事はネイティブプログラムの話だと思うけど、、、)
複数の言語間で接続するのってCORBAとかなかったけ?
最近だと、システムとシステムとつなぐのに、プログラムの直接呼び出しではなくて、ウェブAPI等で接続するのが一般的になっている気が。
メモリやデータベースを直接いじらせなくて済むので、アクセスを制限して、接続を求めてくるシステムを信用する必要がなくて済むし。
ニコニコ動画なんか、ベースの部分はPHP、メッセージングはC++、大百科はRuby、他のサブシステムはPythonみたいな。
内部のウェブAPIで統一されてるんでサブシステムは何言語でもOK。
Re:ウェブAPIで疎結合 (スコア:1)
CORBA以外だと、MicrosoftのDCOMがそうですね。元ネタはCORBAですが。
あと、XMLベースのSOAPとかもありましたね。
これらのプロトコルは独自の型システムを持つ大掛かりなものでしたが、複雑すぎて結局使われませんでした。
いまでは、がんばって包括的なスキームを構築するより、
個々のアプリをサービスとして設計してウェブAPIで結合するのが一般的になってますね。
ウェブAPIでは主にテキストベースになりますので、ある意味、古き良きUNIX的なテキスト志向の勝利といえなくもないかな?
Re:ウェブAPIで疎結合 (スコア:2, 参考になる)
> 複雑すぎて結局使われませんでした
Mozilla系で使われているXPCOMはCORBA準拠で、C++とJavaScriptを共通のIDL(xpidl)で制御している。今でも。
あるいは、単純なデータのやりとりなら、最終的にはプロセス間通信すりゃいいわけで、d-busみたいなメッセージバスが屋台骨じゃないかな。速度的な問題はあるだろうけど。あと、今だと、ctypesをスクリプト言語で読むのが流行しているような。
python-ctypes [python.jp]
DL::Importer [ruby-lang.org]
js-ctypes [mozilla.org]
とりあえず、Cでライブラリを作っておけば、読めないスクリプト言語はない、という感じで。この辺、ヘッダ(*.h)をスクリプト言語に変換する機能とかがあれば猶いいんだろうけれど。
Re:ウェブAPIで疎結合 (スコア:1)
GnomeもCORBA使ってる。D-BUSも。
WindowsもターミナルサービスとかDCOM使ってるんじゃないの?
でもって、さらに遡ればいくつかRPCがあるし。
でもってXML-RPCとか。
元記事を踏まえると、密結合するのは色々面倒くさくて、歴史的には疎結合へ流れたってところですか。
Re:ウェブAPIで疎結合 (スコア:1)
MozillaはXPCOMをまた徐々に密結合(WebIDL bindings)に置き換えてる最中だけどね。
Re: (スコア:0)
複雑すぎてと言うより、ネットが遅くて分散処理するのは現実的じゃなかった。
Re: (スコア:0)
汎用的な話としていっているならば、「ああ、あそこで作ったあの仕組み使いたいなぁ…」っていうときに、公開APIを作ってなかったらいちいちWEB APIを作り、IOコストをかけてリクエストをおくらなきゃいけない。しかも別環境のデータを使わなきゃいけない時にはそれなりに改修を加えたりシなきゃいけない…というのが利便性や要件との適合性の観点で欠点なような…。
相互のメンテナンススケジュールを意識しあわなきゃいけないとか、やり始めるとそっちはそっちでも問題出てきますよね。
ところで、元ネタの話し的には、ActiveScriptingって先進的な事やってたよね…という話になるんじゃないかと思ったわけですが、あまり一般的ではないのかしら。
# VBとRubyをActiveScriptingで結合して作った物を本番に出そうとして上から怒られたなぁという十数年前の事を思い出しつつ、AC
CLI (スコア:0)
すべての言語をCLIで動かせば...
Re:CLI (スコア:1)
全てのブログラムをC++で書けばいいのだ
Cの様に低級な操作が出来て、javaやC#の様にメモリー管理を自動化でき、スクリプト言語のように型に依存しないプログラミングも出来る、黒魔術言語
Re:CLI (スコア:2, 興味深い)
> 全てのブログラムをC++で書けばいいのだ
全てC++って、ごく限られたメンバーからなる小規模なプロジェクトならまあまあ合理的ですけど、
ある程度規模が大きくなると適切な解とはいえないでしょうね。
C++って、(ほぼC言語に対し上位互換なので仕方ないんですが)C言語の落とし穴の
ほとんどがある上に、C++特有の落とし穴も沢山あり、おそらく利用者のスキルレベルが
もっともバラつく言語でしょうから。
たとえばGoogleって、ある程度以上のサイズの企業の中では、優れた開発者が占める割合が高い
企業だと思いますし、しかも現行システムの基幹部をC++で構築してきているわけですが、その
Googleでさえ、以下のような状況のようですから。
http://blogger.ukai.org/2013/12/code-readability.html [ukai.org]
こうなるのは、C++という言語の複雑さ、難しさが大きな理由でしょう。
> 黒魔術言語
黒魔術というのは、言いえて妙だと思います。
とても強力で、うまくやるとそこそこコンパクトに書ける言語だというのは間違いないですが、
スクリプト言語の代替として使うのに適切な言語だとは全く言えないと思います。
Re: (スコア:0)
GoがGoogle内部だけでも継続的に使用されて洗練されていくなら、そのうちネイティブ開発でC++を引退させる事も
できるようになるのかもしれない。言語の浸透には庇護する者が必要だから。
C++は無茶苦茶複雑なようで、それなりに人の包容力もある言語だけど、やっぱり正しく使いこなすには覚えることが多すぎて
入門者には勧め辛い。
他に優れた選択肢がなければね、迷わずC++1択なんだけれど…そりゃ当たり前か。
Re: (スコア:0)
GCが有る言語じゃ、C++の代替は無理、メモリー以外のリソースを掴んだオブジェクトはGCの有る言語では管理できない、
いつ開放されるかプログラマーが管理できないから、
Re: (スコア:0)
GCがある言語でも明示的に開放すればいいだけ
Re:CLI (スコア:1)
いいかげん制御文くらいは仕様統一してほしいよな
forとかifとかもう何言語分覚えたかわからん
つまらん個性を出さなくていいのに、とは思う
.NET (スコア:0)
静的型の言語でも、動的型も、関数型もそのまんま同居できるし、それぞれの言語間に親も子もありませんし。
Re:.NET (スコア:1)
宗教上の理由でMS製品を使えないんでしょ
Re:.NET (スコア:1)
そのためのMonoだろ。
Re: (スコア:0)
オープンソース界隈では毛嫌いしてる人が多いね。個人的にはGTKベースのアプリなんか開発し易くて結構重宝してるんだけど。
Re: (スコア:0)
> 宗教上の理由でMS製品を使えないんでしょ
その場合でも JVM 使うって手もありますね。
# CLRには設計時から言語独立って目標があったけど、現状見ると、むしろJVMの方が
# その上で走る言語が多い状況にある印象があるけど、気のせいかしら。
で、リンク先のACM Queueの記事でも、CLRやJVMは、ちゃんと言及されてますね。
Re: (スコア:0)
> # 現状見ると、むしろJVMの方が
> # その上で走る言語が多い状況にある印象があるけど、気のせいかしら。
http://en.wikipedia.org/wiki/List_of_JVM_languages [wikipedia.org]
http://en.wikipedia.org/wiki/List_of_CLI_languages [wikipedia.org]
に載ってる言語で数えると、 JVM : CLR = 72 : 38 ぐらいみたいですね。
Re: (スコア:0)
PHPからJavaコード呼ぶのを使った覚えがあるな。
逆もあるのかな。
Runtime.exec()じゃなくて。
Re: (スコア:0)
see JNI
Re:.NET (スコア:1)
WinMD (Windows Metadata)もこの種の取り組みですね。型情報を.NETと同じデータ構造で記述・公開して、ただし実装は.NET以外(ネイティブC++)でもできるようにしているというもの。
私の中でマイクロソフトは、COM、.NETと、多言語での相互利用を昔から大事に考えている印象がある。
Re: (スコア:0)
みなさんCLIのせいで
F#にはnullやダウンキャストが入った
型推論の完全性も失った
処女膜から声が出てない
相互運用性とやらが、相互リンクを意味しているなら (スコア:0)
Fortran2008程度の機能は、すべての言語が備えるべき。
ぱぱぱぱ (スコア:0)
pythonなら言語間の相互運用も割と簡単に実装できるんですんが。
100年後の言語ってどうなっているんでしょうねぇ。
サブジェクト (スコア:0)
仕様はどんな感じになるのだろう?
メモリ間の共有より、プロセス間のメッセージ通信みたいになるの?
GObjectがまさにそれ (スコア:0)
実はGObjectはその為に開発されたんだよね。
GTK+を知ってる人でもC言語で無理やりオブジェクト指向をする為だけのものと思っている人も
いるかも知れないけど、実は崇高な理念の下に作られている。
(実際、PythonとかJavaScriptとかでメソッド毎にラッパーを作らずにGTK+を使えたりしている)
ただ、無理やりオブジェクト指向をする所でのパフォーマンスの問題とかあって評判が良くないのが悲しいけど…