web-dev-qa-db-ja.com

列挙型とコンパイラによるそれらの解釈

ほとんどではないにしても、多くのコンパイラが列挙型をその下のintとして扱うように思われます。 C/gccでは、enumsはintにコンパイルされます。 C#/ Visual C#では、基になるデータ型を次のように変更できます。

enum Days : byte {Sat=1, Sun, Mon, Tue, Wed, Thu, Fri};

ただし、タイプを変更しない場合は デフォルトはint (2番目の段落)です。

明らかな理由から、intsは効率的です。それらはALUを簡単に通過し、無駄な文字列比較を回避します。

一見すると、インタープリター型言語には列挙型が組み込まれているようには見えません(Ruby、Perl、JavaScript、その他のことは確かです)。ただし、エミュレートすることはできます。つまり JavaScriptの場合

私の質問:

  1. なぜ(一見)ほとんどのコンパイラが基礎となる型としてintを使用するのですか?その理由は歴史的/パフォーマンスに関連していますか?
  2. 列挙型をint(またはbytelong数値型..以外のものにコンパイルする言語はありますか? )?もしそうなら、なぜ彼らはそれを別の方法で行うことを選んだのですか?
1
Chris Cirefice

あなたの質問の最初の部分は、その決定がずっと前に行われたので答えるのが難しいでしょう、そして、Cのような言語の作成者に確実に知るように頼む必要があるでしょう。

あなたの2番目のポイントはかなり答えられます。

  • Javaは、適切に動作しないenum定数の広範な使用に対応して、int型を作成しました( Effective Java、Second Edition、Bloch 、Item 30/Page 147 )。たとえば、2つの整数定数を無意味な方法で乗算することはできますが、2つのenum値で同じことを行うことはできません。整数定数を使用する場合は、REDBLUEと乗算できますが、列挙型は使用できません。とにかく、それはどういう意味ですか?

    さらに、この決定は、列挙型が「よりスマート」である可能性があるために行われました。値を含めることができ、各列挙値内に動作をカプセル化することもできます。脆弱でメンテナンスの問題である列挙値に対してswitchを設定するのではなく、ロジックを反転して、各caseの本体を個々の列挙内に配置します。次に、列挙型変数のメソッドを呼び出し、 動的ディスパッチ を使用してスイッチを抽象化します。これで、列挙型の値と動作が同じクラスにローカライズされました。

  • C++ 11には、Javaが「インテリジェント」列挙型を実装して成功したために行われたenum class構造が含まれるようになりました。( C++プログラミング言語、第4版、 Stroustrup 、セクション8.4 /ページ218)。

3
user22815

私が最もよく知っている言語に基づいて、いくつかの光を当てようとします。

[〜#〜] d [〜#〜]

D言語の列挙子 は、コンパイル時定数を宣言するもう1つの方法です。それらは非常に柔軟性があり、文字列型の列挙型を許可しますが、これはあまり一般的ではありません。整数定数のサイズの制御も可能です。いくつかの例については、前のリンクのページの下部を参照してください。

C++

C++の古いスタイルのスコープなし列挙型は、C++ intオブジェクトのサイズである必要はありません。それらはそれより大きくなる可能性があります。引用 この参照

基になる型が固定されていないスコープ外の列挙型...この場合、基になる型はintであるか、すべての列挙値をintとして表すことができない場合は、実装定義です。すべての列挙値を表すことができるより大きな整数型。

したがって、これら2つのC++列挙子のサイズを比較すると次のようになります。

enum Test1 {
    A1,
    B1
};
enum Test2 {
    A2,
    B2 = 18446744073709551615ULL /* UINT64_MAX */
};

1つ目はデフォルトの整数のサイズ(int)で、2つ目は64ビット整数のサイズ(long long int)大きな定数に合わせる。

新しい enum class C++ 11で導入されたため、ユーザーは列挙型とその定数のサイズを指定できます。定数もスコープされます。これらはC#列挙子と非常によく似ています。

整数が一般的なケースである理由

単純さのために、プログラミング言語の列挙型のデフォルトの選択は整数であると推測します。マシンは実際には数字しか処理できません。テキスト文字列でさえ、プログラムによって特別な方法で解釈される数字の配列です。

2
glampert