ナカナカピエロ おきらくごくらく

写真付きで日記や趣味を書くならgooブログ

【C++言語vsJava言語】C++テンプレートとJavaジェネリックの違い

2022-05-08 19:34:23 | 
【C++言語vsJava言語】C++テンプレートとJavaジェネリックの違い

C++のテンプレート(template)機能は、ある意味コンパイラ言語の

限界に挑戦した機能追加だった。

クラスの雛形や関数に抽象的な型変数としてさらに一段上の抽象化を

狙ったところまでは良かった。

しかしこのテンプレートの型は基本型から何から何でも放り込んで

矛盾が生じなければ、コンパイラを通してしまう構文規格にした

ところがまずかった。

結果、コンパイラはテンプレートの抽象型に型を放り込む(具体化)

するたびに、新しい型を生成して、出力されたオブジェクトファイル

には膨大な型シンボルやコードが生成され、しかも各オブジェクト毎に

同様の型で生成されたテンプレート型コードをリンカに全てお任せる

という言わば、リンカ泣かせの言語だったのだ。

その点、JavaのジェネリックはC++で失敗した同じ轍を踏まなかった。

JavaはObject型を全てのクラスの基底クラスとして位置づけ、

ジェネリックも基本型などは許さず、全てObject型から継承された

型でなければ許さなかった。

またコンパイル時に固有の型で生成(C++でいう具体化)したとしても

それはコンパイル時の型チェックを行うという目的でのみ許可して

最終的にはObject型として生成(ジェネリック)され、固有の型で

一時的に生成された型は全て型消去(Type Erasure)して、型爆発を

防いだ点も賢い。

JavaはC++言語と同じ失敗を嫌い、用意周到にジェネリックとして

機能追加を行った。さすがはSun MicroSystems(現Oracleに買収)

と言ったところだろうか。。

蛇足だが、昨今、PythonやJavaScriptなど型を指定しないで変数を

宣言できるインタープリタ言語では、そもそも型に依存しないクラス

や関数がかけるので、そもそもC++テンプレートやJavaジェネリック

などの特殊構文はないことを付け加えておくか。。。
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

【C言語】C言語のvolatileとは

2022-05-08 18:40:19 | 日記
【C言語】C言語のvolatileとは

volatileは「揮発性」という意味を持つC言語の型修飾子である。

大抵の人は、何のためにvolatileなるものがあるのか分からないまま、

volatileを使うことなくC言語でコーディングしてしまう人が多いと思う。

volatileを指定された変数は語源の通り、その値はその都度変わるため、

変数を参照するときには、大元の実体が格納されているメモリ

(スタック or グローバル or ヒープ)から必ずload命令を発行して値を

取り直さなければならない。

よってvolatileを指定された変数は一部のコンパイラ最適化を抑止する。

https://docs.oracle.com/cd/E19957-01/805-7885/6j7dqggcu/index.html

に記載があるように通常は以下の変数(オブジェクト)に使用される。

・メモリーにマップされた入出力ポートであるオブジェクト

・複数の並行プロセス間で共有されるオブジェクト

・非同期シグナルハンドラによって変更されるオブジェクト

・setjmp を呼び出す関数中で宣言され、その値が setjmp への呼び出し

 とそれに対応する longjmp への呼び出し間で変更される自動記憶オブジェクト

つまり一見、コード上変更がないため、そのまま値が変わらないであろうと

思われる変数でも変わる可能性があるため、必ず大元の実体から値を取って

こなければ駄目だよ、とコンパイラに暗にほのめかしているのである。

もし以下のコードのflagにvolatile指定があったとき、


flag = 1;
while (flag)
;


何らかの形で、flagに0が設定される可能性をコンパイラは排除できない。

だからコード上は一見して無限ループだが、volatileが指定されているときには

無限ループとして扱ってはならずということになる。
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする