質問

Ada が開発された時代には GC が人気がなかったことは知っていますが、組み込みプログラミングの主な使用例では、GC は依然として良い選択ではありません。

しかし、Ada が汎用プログラミング言語であることを考えると、言語とコンパイラの実装の後のリビジョンでは、部分的かつオプション (明示的にタグ付けされたメモリ オブジェクトのみをトレースする) ガベージ コレクターが導入されなかったのはなぜでしょうか。

ガベージ コレクターなしで通常のデスクトップ アプリケーションを開発することは、もう考えられません。

役に立ちましたか?

解決

エイダは心の軍事用途に設計されました。その設計における大きな課題の一つは、決定論でした。すなわち、一つは...すべてのオペレーティングシステムの下で、どのような環境では、エイダ・プログラムは、一貫し、正確に毎回同じように実行するためにそのちょっとの事を望んでいます。

ガベージコレクタは、互いに対して作動、二つに一つのアプリケーションをオンにします。 GCは、仕事に行くことを決定したとき、Javaプログラムは、ランダムな間隔でしゃっくりを開発し、それはそれについてあまりにも遅いです場合、アプリケーションが他時にはヒープが不足しないだろうという可能性があります。

の簡素化:ガベージコレクタは、設計者がたくなかったプログラムの中にいくつかの多様性を紹介します。あなたは混乱を作る - あなたはそれをクリーンアップ!同じコード、同じ動作毎回ます。

エイダは、あなたの心、荒れ狂う世界的な成功になっていないこと。

他のヒント

エイダはリアルタイムに武器をコントロールする防衛システムで使用するために設計されており、ガベージコレクションは、アプリケーションのタイミングを妨害したため。これは、長年にわたって、Javaはそれが医療や軍事制御システムに使用することができなかった警告してきた理由であり、これは危険です。

私は、基盤となるハードウェアは、Javaが優れたGCアルゴリズムやGCのよりよい制御を持っていることを事実としてはるかに高速にもなっていますので、Javaを使用し、このような免責条項は、もはや存在した理由があると信じています。

コンピュータは、彼らが今日よりもはるかに少ない強力だったときエイダは一度に1970年代と1980年代に開発された、および制御アプリケーションにタイミングの問題が最も重要だったことを覚えておいてください。

答えはさらに複雑です。Ada はリアルタイムの制約などのため、ガベージ コレクターを必要としません。ただし、この言語はガベージ コレクターの実装を可能にするように巧妙に設計されています。

多くの (ほぼすべての) コンパイラーにはガベージ コレクターが含まれていませんが、注目すべき実装がいくつかあります。

  • GNAT 用のパッチ
  • Java 仮想マシンをターゲットとする Ada コンパイラー (これらのプロジェクトがまだサポートされているかどうかはわかりません)。JVMのガベージコレクタを利用しました。

Web 上には、Ada のガベージ コレクションに関する情報源が他にもたくさんあります。このテーマは、主に 90 年代半ばの Java との熾烈な競争のため、長々と議論されてきました ( このページ: "Ada 95 is what the Java language should have been")、Microsoft が C# を採用する前、Java が「次なる目玉」だった頃。

まず第一に、この言語には実際には何もありません 禁止します ゴミ収集。

次に、いくつかの実装 ガベージコレクションを実行します. 。特に、JVM ガベージ コレクションを対象とするすべての実装。

第三に、 ある程度のガベージコレクションを取得する方法があります すべてのコンパイラで。ほら、アクセスすると タイプ が範囲外になる場合、オブジェクトの保存用にある程度のスペースを確保するように言語に具体的に指示した場合、そのスペースはその時点で破棄されます。私は過去にこれを使用して、ガベージコレクションを少し実行したことがあります。使用する宣言 voudo は次のとおりです。

type Foo is access Blah;
for Foo'storage_size use 100_000_000; --// 100K

これを行うと、Foo 型がスコープ外になったときに、Foo ポインタが指す Blah オブジェクトに割り当てられたすべてのメモリ (100K) がクリーンアップされます。Ada を使用すると、サブルーチンを他のサブルーチン内にネストできるため、これは特に強力です。

storage_size とストレージ プールができることの詳細については、次を参照してください。 LRM 13.11

第 4 に、適切に作成された Ada プログラムは、C プログラムほど動的メモリ割り当てに依存する傾向がありません。C には設計上の穴が多数あり、専門家はポインターを使用してペイントする方法を学びました。これらのイディオムの多くは Ada では必要ありません。

まず最初に、私はこれらの日エイダを使用しています誰が知っているように思います。私は実際には言語のように、さらにはLinuxの/エイダのためのGUIライブラリがありますが、私は何年も活発なエイダの開発については何も聞いていません。その軍事的な接続のおかげで、私は本当にそれが古代史やその使用の全ての言及が分類されるように乱暴に成功したかどうかわからない。

私はエイダでいないGCの理由のカップルだと思います。まず、何よりも、それが戻って主に使用されるほとんどのコンパイル言語は、スタックまたは静的メモリ、またはいくつかのケースでは、明示的なヒープが/自由を割り当て時代にまでさかのぼります。 OOPは、それをすべて実行するためのサイクルを惜しまのに十分強力改良されたメモリ管理アルゴリズムとプロセッサが自分に入ってきたときの一般的な考え方として、GCは本当にだけで約1990かそこらを脱ぎました。何単にコンパイルエイダは、1989年にIBM 4331メインフレームに行うことができ、単に無慈悲でした。今、私はそのマシンのCPUをアウトパフォームすることができ、携帯電話を持っています。

もう一つの良い理由は、厳格なプログラムの設計は、メモリリソースを正確に制御を含み、かつ動的に取得したオブジェクトは、フロートさせるための任意の許容差があってはならないということだと思う人がいるということです。ダイナミックメモリは、ルールより多くなったとして悲しいことに、あまりにも多くの人々は、メモリをリークしてしまいました。さらに、高レベル言語の上にアセンブリ言語の「効率性」、およびORMシステムに比べて、生のJDBCの「効率性」のように、手動メモリ管理の「効率性」とは、アップスケールとして(私が見てきたORMのベンチマークを反転する傾向がありますどこJDBCに相当)は、効率的として半分だけでした。直感的に、私は知っているが、これらの日のシステムは、グローバル最適化、大規模なアプリケーションではるかに優れている、加えて、彼らが検出に基づいてオンザフライで表面的にマイナーchanges.Including動的再バランシングアルゴリズムに応じて、ラジカルの再最適化を行うことができます負荷ます。

私は、リアルタイムシステムは、GCのメモリを買う余裕はないと言う人たちと異なるする必要がありますするつもりです怖いです。 GCは、もはやシステム全体に数分おきにフリーズ何かではありません。私たちは、これらの日のメモリを再利用するために多くの、よりインテリジェントな方法があります。

私は(すべてCプログラマに馴染みの方法で使用されるだろう)無料()プロシージャを実装する方法の本当に簡単な例を共有したいと思った...

with Ada.Integer_Text_IO, Ada.Unchecked_Deallocation;
use Ada.Integer_Text_IO;

procedure Leak is
   type Int_Ptr is access Integer;
   procedure Free is new Ada.Unchecked_Deallocation (Integer, Int_Ptr);

   Ptr : Int_Ptr := null;
begin
   Ptr := new Integer'(123);
   Free (Ptr);
end Leak;

プログラムの終了時に無料呼び出すと、ストレージプール(C用語で「ヒープ」)に割り当てられた整数を返します。あなたは、これは実際には4バイトのメモリがリークされるのを防ぐないことを実証するためにvalgrindのを使用することができます。

Ada.Unchecked_Deallocation(総称的に定義された手順が)(と思う)の「新しい」キーワードを使用して割り当てられることができる任意の型を使用することができます。エイダ・リファレンス・マニュアル(「13.11.2未確認のストレージ割り当て解除」)は詳細を持っています。

あなたの質問は間違っています。します。あなたのためのGCを扱うパッケージada.finalizationを参照してください。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top