11

テーブルの Lua の実装では、その要素を 2 つの部分 (配列部分とハッシュ部分) で保持します。

そのようなものは他の言語に存在しますか?

The Implementation of Lua 5.0 のセクション 4, Tables を見てください。

Lua 5.1 ソースコード - table.c

4

4 に答える 4

10

このアイデアは、RobertoIerusalimschyと残りのLuaチームが独自に作成したものです。ロベルトが2003年のMIT軽量言語ワークショップでそれについて話しているのを聞いた。この話で彼は以前の仕事について話し合い、そのアイデアは新しいものだと説得力を持って主張した。それ以来、他の言語がそれをコピーしたかどうかはわかりません。

オリジナルのAwkは、Luaよりもいくらか制限された言語モデルを持っています。数値または文字列のいずれかを配列のキーとして使用できますが、配列自体はファーストクラスの値ではありません。配列には名前が必要であり、配列を配列のキーとして使用することはできません。

実装に関しては、Brian Kernighanによって維持されている元のAwkのソースを確認しました。また、Awkの実装では、Luaのハイブリッド配列/テーブル構造ではなくハッシュテーブルを使用しています。Luaでは、テーブルが連続する整数キーで使用される場合、スペースのオーバーヘッドはC配列の場合と同じであるため、この区別は重要です。これは、元のAwkには当てはまりません。

私は、後のawkのすべての実装(Gnu Awk、mawkなど)をわざわざ調査したことはありません。

于 2010-01-26T01:58:19.507 に答える
4

編集:これは、実装に関する質問には答えません。

AWKもそれをしました。

一部の言語が、他の言語とは異なる操作をどのように統合するかは興味深いです。

  • リストの索引付け -a[10]
  • 連想索引 -a['foo']
  • オブジェクト フィールドへのアクセス -a.foo
  • 関数/メソッド呼び出し - a('foo')/a.foo()

非常に不完全な例:

  • Perl は、シーケンシャル/連想インデックス作成に別の構文 - a[10]/があるまれな言語a{'foo'}です。私の知る限り、クラスの実装者が使用したいと感じたものに応じて、オブジェクトフィールドは他の操作の1つにマップされます。

  • Python では、4 つすべてが区別されます。シーケンシャル/連想インデックスは同じ構文を使用しますが、個別のデータ型が最適化されています。

  • Ruby では、オブジェクト フィールドは引数のないメソッドa.fooです。

  • JavaScript では、オブジェクト フィールドa.fooは連想インデックスの構文糖衣ですa['foo']

  • Lua と AWK では、連想配列もシーケンシャル インデックスに使用されa[10]ます。

  • Arcでは、シーケンシャルおよび連想インデックス作成は関数呼び出しのように見えます - (a 10)/ 、これも構文シュガー(a "foo")だと思います(?)。a.foo

于 2010-01-24T08:46:11.723 に答える
2

私が考えることができる最も近いものは Javascript です。 で配列を作成し、new Array()数値または文字列値でインデックスを作成します。リンク先のLuaのドキュメントに記載されている理由により、一部のJavascript実装では2つの配列を使用することを選択するパフォーマンス上の理由が考えられます。

于 2010-01-24T02:33:38.070 に答える
0

ArrayWithHashは、配列とハッシュテーブルのハイブリッドを C++ で高速に実装したものです。

C++ は静的に型付けされた言語であるため、ArrayWithHash では整数キーのみが許可されます (文字列またはポインター キーを挿入する方法はありません)。つまり、大きなインデックスのハッシュ テーブル バックアップを備えた配列のようなものです。また、Lua テーブルの実装よりもメモリ効率が低い別のハッシュ テーブルの実装を使用します。

于 2016-07-27T04:11:31.680 に答える