- 締切済み
制御系ってSTL必要なんですか?
私は、制御系・組み込み系の業務経験がありません。 UNIX C, Java, C#の経験があります。 最近、J2SE 5.0やC# 2.0などで、 「ジェネリック」という概念がでてきました。 C++のSTLがとても似ているように思えました。 自分の認識では、C++は今後、制御系などの分野 ぐらいしか用途がないように思っているのですが・・・ 制御系のC++でも、STLはバリバリ使うのでしょうか? それとも、制御系や組み込み系では、すべての ロジックが自作オンリーで、そのような汎用的な 車輪を使うことは不可能な世界なのでしょうか? この質問を至った経緯を以下に書きます。 1)Java 5.0, C# 2.0のジェネリックの概念を 学習するにあたって、C++のSTLを同時に学習した ほうが、効果的ではないかとおもった。 2)Java, C#でプログラムを組む以上。C++の存在価値が 制御系・組み込み系への準備という位置づけでしか 見出せなかった 3)しかし、コレクションクラスなどを使った。 Java, C#の開発になれているため、すべてのロジック をゴリゴリ書く開発に戻りたくないので、 C++なら、STLを使いたいと思った。 そして、それは(1)の目的を果たす意味で 重要だと感じた。 4)しかし、私は制御系、組み込み系の経験がないので、 C++でSTLというやりかたがその分野で通用するのか わからなかった。 いくら、(1)の目的で勉強になるからといって、 学生がPascalを勉強するような、実務に あまり関係のないことをやりたいとはおもわなかった ので、制御系、組み込み系でC++でSTLという 組み合わせが現実的に有りえるのかどうかを 制御系バリバリの方にいろいろ聞いてみたいと感じた。 以上がこの質問をした経緯です。 よろしくおねがいいたします。
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- sha-girl
- ベストアンサー率52% (430/816)
>「仮想メモリが存在するWindowsやlinux」でなければ >難しいですかぁ・・ >「仮想メモリが存在するWindowsやlinux」上で >制御系ってなにかありますか? >デバイスドライバとかですか? > >「仮想メモリが存在するWindowsやlinux」 >でなければ、難しいという状況は今後(近い将来) >はどうでしょうか? まず組込系や制御系の定義が曖昧です。 私の「制御系」の解釈としては例えばルーターのファームウェア のようなフラッシュメモリやROMに記憶されているソフトウェアと解釈しています。 URL: http://e-words.jp/a/E7B584E8BEBCE382B7E382B9E38386E383A0.html Windows上で動くシステムを組込系とは思っていません。 Windowsのデバイスドライバの開発はそれを専門にする開発ツールもありますが 普通言語はC/C++ですね。(インラインアセンブラも使います。) 制御系とは違う気がします。 >>>「仮想メモリが存在するWindowsやlinux」 >>>でなければ、難しいという状況は今後(近い将来) >>>はどうでしょうか? 既に他の回答者もいっていますが、信頼性に関わります。 仮想メモリがないということは、動的にメモリを確保しようとして 確保できない状況が発生します。(もちろん仮想メモリがあっても発生はしますが) 動的に確保するということは削除するときに メモリのフラグメンテーションが発生するわけですから時間が経過するにつれて 確保できなくなる可能性が高くなっていくわけです。 普通この手のソフトウェアで確保できない状況なんてことは許されないはずです。 >そうですか、でも、今後(近い将来、数年後)は >どうでしょうか? >は、今現在、C#、Javaで充分。飯の種になっています >が、今後について考えたいです。 JavaやC#はSI系ではずっと残っていくでしょうし C++がゲーム等のパッケージソフト開発のメインであることは 当分変わりそうにありません。勿論10年後、WindowsXpが廃れてLonghorn系が主流 等の状況になれば変わるかもしれません。 >>>2)Java, C#でプログラムを組む以上。C++の存在価値が >>> 制御系・組み込み系への準備という位置づけでしか >>> 出せなかった >> >>JavaもC#も基本的には仮想マシンがなければ動きません。 >>ネイティブ出力するツールはありますが、私の知っている限り >>かなりの制限があります。 > >経験不足で、真意がよくわかりませんが。 >ネイティブ出力がやりにくいとどんな不都合が >あるのかあまり想像できないです。 >ネイティブ出力を望んでいるので、あれば初めから >C>/C++等を使えば良いじゃないかと思ってしまいます。 ネイティブコードにしたければ、おっしゃるとおりC/C++を使えばよいのです。 私は(2)の返答としてC++の存在価値を述べたまでです。 ご覧になっているブラウザ(IEでもNNでもOperaでも)だってネイティブコードなわけですし ネイティブコードで出力できるメリットがあります。 ちなみにネイティブコードの利点としては ・OS(或いはハードウェア)の機能を最大限に発揮できる。 ・逆コンパイルはほぼ不可能 ・多言語と比べて実行速度の優位 etc...
- nitscape
- ベストアンサー率30% (275/909)
>制御系のC++でも、STLはバリバリ使うのでしょうか? >汎用的な車輪を使うことは不可能な世界なのでしょうか? ケースバイケースではないでしょうか? 「制御系」と一言で表現してもその内容は様々です。ものによってはSTLバリバリのものもあるでしょうし、逆にアセンブラなどで毎回作り上げているものもあります。 私は昔組み込み系のプログラミングをするときはアセンブラonlyでした。しかも汎用性とはかけ離れたプログラミングです。しかし今は(アセンブラを使うのが面倒なので)たいていCかC++で作ってしまいます(とは言うもののSTLは使いませんしあまり汎用的にはなっていませんが)。 これは昔のハードウエアに比べて処理速度が上がったというだけでなく、ROMやRAMが非常に大きくなったからです。昔は限られたRAMをどう変数に割り当てて使いまわさないとダメなのかを考えなければいけなかったですし、処理に必要なクロック数を足し算して”これじゃダメだ”みたいにプログラミングしていたため、キメの細かい処理がアセンブラと比べて面倒なCは使えなかったからです。 しかし今は性能が並みのシステムでもMBオーダーのRAMが載っているのは当たり前と言ってもいいくらいですし、下手をするとlinuxどころかWindowsを使ってしまうこともあるくらいです(組み込みでWindowsを使っていて信頼性あるのか~なんて議論もありますが、保守性や開発費downというメリットが信頼性を上回ることも度々です)。こうなってくるともう開発方法は何でもありです。実際PIOボードとVBで作らされたこともあります(組み込みでVBですよ!)。 そんなハードウエア性能が上がった現在でもRAMやROM容量を気にしながらアセンブラで開発しなければいけないこともまだあります。何せRAMやIOが限られている1チップCPUは1つあたりのコストが数十円と全然安いですし消費電力もまったくと言っていいいほどありません。大きさもほんのわずかです。この世界にまで踏み込むとCやC++の出番を探すのは難しくなると思います。 個人的にはジェネリックプログラミングが組み込みや制御系で「一般的に」使われるようになることはないと思います。WindowsプログラミングでのC++でさえ一般的になりそうな雰囲気はあまりないように思います。
補足
>「制御系」と一言で表現してもその内容は様々です。 あいまいにしたまま、質問をしてしまってるみたい ですね。 これでは、回答するほうも困る。 普段、自分の周りになかなかいないような人が 回答してれているようなので、いろんな考えが 読めてとても、意味があります。 >下手をするとlinuxどころかWindowsを使ってしまうこともあるくらいです >実際PIOボードとVBで作らされたこともあります(組み込みでVBですよ!)。 いろいろあるんですね。 というより、私の質問があいまい過ぎて、 いろんな話題がでてきているかもしれませんが。
- jacta
- ベストアンサー率26% (845/3158)
> 制御系の人はアセンブラ言語とかすごいが、 > 以外に最新技術に疎いとか。 制御系の人が疎いのは、他分野で注目されている最新技術ということかと思います。 例えば、C/C++を用いてハードウェアを含めたシステム設計を行うような最新技術などは、Webアプリ等の技術者は疎いはずですね。要はそういうことです。 > ハードウェアスペックがもっと向上してから > 制御系の方シフトしたほうが。 組み込みシステムの場合、時代とともに単純にハードウェアスペックが向上するわけではありません。 LSIの単価や消費電力の問題等があるので、用途によってはローエンドの機種が使い続けられるのです。 また、組み込み系で動的なメモリアロケーションが嫌われるのは、ハードウェアスペックだけの問題ではなく、信頼性の問題が深く関わっています。 > 純粋なオブジェクト指向のテクだけで、 > やっていけそうな気がするので、 オブジェクト指向にも向き不向きがあります。 何でもかんでもそれだけで解決するのは、あまりよい方法とは言えません。
補足
厳しいけど、わかりやすい回答ありがとう。
- jacta
- ベストアンサー率26% (845/3158)
現状のSTLがそのまま多用されるかどうかはともかく、組み込みシステムとジェネリックプログラミングはかなり相性がよいと思います。 組み込みではどうしても静的に解決することが要求されがちです。ポリモフィズムを実現する上でも、仮想関数等の動的な結合より、STLのアルゴリズムに見られるような静的な結合の方が好まれます。(サイズの肥大化を防ぐテクニックも同時に必要になりますが) ただ、現状では組み込み系の開発者でC++を使いこなせるのはほんの一握りです。ジェネリックプログラミングは、C++でも最上級の分野にあたりますので、今後の啓蒙活動次第では、主流の技術になりえると思います。
補足
>ポリモフィズムを実現する上でも、仮想関数等の動的な結合より、STLのアルゴリズムに見られるような静的な結合の方が好まれます。 制御系・組み込み系とか、オブジェクト指向とかの 関連について、Webで検索していくと、 オブジェクト指向のプログラム技術だけじゃなく +αとして制御系ならではの配慮みたいな話が どうしても出てくる。 制御系の人はアセンブラ言語とかすごいが、 以外に最新技術に疎いとか。 そういう内容の文章によく出くわす。 ハードウェアスペックがもっと向上してから 制御系の方シフトしたほうが。 純粋なオブジェクト指向のテクだけで、 やっていけそうな気がするので、 当面は、制御系・組み込み系方面の仕事は 敬遠していたほうがいいと思います。 この考え方について、なにか意見が ある方いるでしょうか?
- sha-girl
- ベストアンサー率52% (430/816)
STLって標準化されたテンプレートライブラリ群ですが そのほとんどはダイナミックにメモリを確保するものです。 勿論、vectorのreserve等で容量などは指定できますが 仮想メモリが存在するWindowsやlinuxのようなものでなければ 力を発揮できません。あまり組み込み系では使用しないでしょう。 そもそも使用するコンパイラによってはSTLに対応していない可能性もありますし。 STLというかテンプレートについては知っておいた方が良いかも。 JavaのGenerics自体C++のテンプレートの影響を強く受けています。 >C++は今後、制御系などの分野 >ぐらいしか用途がないように思っているのですが・・・ そんなことはないでしょう。 PS2等のコンシュマーゲームやPCのパッケージソフトの開発はC/C++がメインです。 今のところC#やJavaで作成した市販ソフトはみたことがありませんし。 >1)Java 5.0, C# 2.0のジェネリックの概念を > 学習するにあたって、C++のSTLを同時に学習した > ほうが、効果的ではないかとおもった。 どちらかを知っておけば一方の学習の効率があがるだけで 同時に学習する意味はないかと思います。 >2)Java, C#でプログラムを組む以上。C++の存在価値が > 制御系・組み込み系への準備という位置づけでしか > 出せなかった JavaもC#も基本的には仮想マシンがなければ動きません。 ネイティブ出力するツールはありますが、私の知っている限り かなりの制限があります。
補足
さっそく、返事をくれてどうもありがとう。 >STLって標準化されたテンプレートライブラリ群ですが >そのほとんどはダイナミックにメモリを確保するものです。 >勿論、vectorのreserve等で容量などは指定できますが >仮想メモリが存在するWindowsやlinuxのようなものでなければ >力を発揮できません。あまり組み込み系では使用しないでしょう。 「仮想メモリが存在するWindowsやlinux」でなければ 難しいですかぁ・・ 「仮想メモリが存在するWindowsやlinux」上で 制御系ってなにかありますか? デバイスドライバとかですか? 「仮想メモリが存在するWindowsやlinux」 でなければ、難しいという状況は今後(近い将来) はどうでしょうか? >そもそも使用するコンパイラによってはSTLに対応していない可能性もありますし。 そうなんですか・・。 >STLというかテンプレートについては知っておいた方が良>いかも。 >JavaのGenerics自体C++のテンプレートの影響を強く受けています。 >どちらかを知っておけば一方の学習の効率があがるだけで >同時に学習する意味はないかと思います。 よく、わかりました。ありがとう。 >そんなことはないでしょう。 >PS2等のコンシュマーゲームやPCのパッケージソフトの開発はC/C++がメインです。 >今のところC#やJavaで作成した市販ソフトはみたことがありませんし。 そうですか、でも、今後(近い将来、数年後)は どうでしょうか? 私は、今現在、C#、Javaで充分。飯の種になっています が、今後について考えたいです。 >JavaもC#も基本的には仮想マシンがなければ動きません。 >ネイティブ出力するツールはありますが、私の知っている限り >かなりの制限があります。 経験不足で、真意がよくわかりませんが。 ネイティブ出力がやりにくいとどんな不都合が あるのかあまり想像できないです。 ネイティブ出力を望んでいるので、あれば初めから C/C++等を使えば良いじゃないかと思ってしまいます。
補足
引き続き、あいまいな質問に対してありがとう。 http://e-words.jp/a/E7B584E8BEBCE382B7E382B9E38386E383A0.html このURLは私のような人間が、基本的なことを 理解するためにあるURLですね。 いままでの質疑応答についての「理由」みたいな ものが、わかったような気がします。 今度は、自分ももっと具体的な質問ができるように したいものです。 まだ、質問は締め切らずに数日間は放置しておきます。 特に、回答がないようであれば、締め切ります。 得点の発行は2つまでですね。 どの回答にするか、悩ましいです。