「可変長配列」の版間の差分

削除された内容 追加された内容
en:Variable-length array 2017-08-15T13:43:04版を訳出
誤訳を修正。
1行目:
[[プログラミング (コンピュータ)|プログラミング]]において、'''可変長配列'''(かへんちょうはいれつ、{{lang-en|variable-length array}}: VLA)とは、[[コンパイル]]時ではなく実行時に長さが決定される{{仮リンク|自動変数|en|Automatic variable|label=自動記憶期間}}の[[配列]][[データ構造]]である<ref name=cray>{{cite web |url=http://docs.cray.com/books/004-2179-001/html-004-2179-001/z893434830malz.html|title=Variable Length Arrays|publisher=|accessdate=2017-09-21}}</ref>。
 
VLAに対応している[[プログラミング言語]]には、[[Ada]]、[[ALGOL#ALGOL 68|ALGOL 68]](行は固定)、[[APL]]、[[C99]](<code>alloca()</code>などの関数で実装されていだし[[C11 (C言語)|C11]]ではサポート必須ではなくオプションに格下げとなった<ref>{{cite web |url=https://gcc.gnu.org/onlinedocs/gcc/Variable-Length.html|title=Variable Length - Using the GNU Compiler Collection (GCC)|publisher=|accessdate=2017-09-21}}</ref><ref>ISO 9899:2011 Programming Languages - C 6.7.6.2&nbsp; 4</ref>。またいくつかのプラットフォームにおいて、C99より前のバージョンでは<code>alloca()</code>あるいは類似の関数で実装されることがあった)、[[C Sharp|C#]](unsafeモードのスタック割り当て配列として)、[[COBOL]]、[[Fortran|Fortran 90]]、[[J (プログラミング言語)|J言語]]がある。また、[[Object Pascal]](Borland [[Delphi]]で使用される言語)でも対応している。
 
==メモリ==
 
===割り当て===
VLAによって、基本的なメモリ割り当ての問題がユーザに対して蔽される。[[ヒープ領域]]と[[コールスタック|スタック領域]]の間に明確な区別がある環境では、VLAがどちらのメモリ領域に格納されるかは、ユーザにはわからない<ref>{{cite web |url=https://archive.stsci.edu/fits/users_guide/node65.html|title=Variable Length Arrays|publisher=|accessdate=2017-09-21}}</ref>。
 
例えば、[[GNUコンパイラコレクション|GNU Cコンパイラ]]は、スタック上にVLAのメモリを割り当てる<ref>{{cite web |url=https://gcc.gnu.org/onlinedocs/gfortran/Code-Gen-Options.html|title=Code Gen Options - The GNU Fortran Compiler|publisher=|accessdate=2017-09-21}}</ref>。Cの他のオブジェクトと同様、VLAは<code>SIZE_MAX</code>バイトに制限されている<ref>§6.5.3.4 and §7.20.3 of the C11 standard (n1570.pdf)</ref>。
 
===変数アクセス===
いくつかのプログラミング言語では、[[ポインタ (プログラミング)|ポインタ]]を介してVLAにアクセスすることができるが、不完全な型と見なされるため、デリファレンス([[間接参照を解除す]])されるとサイズを取得できなくなる<ref>{{cite web |url=http://msdn.microsoft.com/en-us/library/4s7x1k91.aspx|title=sizeof Operator|publisher=|accessdate=2017-09-21}}</ref>。
 
==例==
27行目:
</source>
 
C99では、関数呼び出しにおける長さのパラメータは、可変長配列のパラメータよりも前に来なければならない<ref name=cray/>。
 
以下は[[Ada]]における同じ例である。Adaの配列は境界を持っている。従って、長さをProcess関数に渡す必要はない。
44行目:
</source>
 
[[Fortran|Fortran 90]]での同等の関数は次の通りである(コンパイル時にプロシージャ・インターフェスを検査するFortran 90の機能を利用する場合)。
 
<source lang="fortran">
61行目:
</source>
 
一方、関数がFortran 90以前の呼び出しインタフェスを使用する場合は、まず(外部)関数を宣言し、配列の長さを引数として明示的に渡す必要がある(Cの場合と同様)。
 
<source lang="fortran">
79行目:
</source>
 
次の[[COBOL]]のフラグメントコード断片は、<code>PEOPLE-CNT</code>値で指定された長さ(メンバー数)を持つレコードの可変長配列<code>DEPT-PERSON</code>を宣言する。
 
<syntaxhighlight lang="cobolfree">
91行目:
</syntaxhighlight>
 
次の[[C Sharp|C#]]のフラグメントコード断片は、整数型の可変長の整数配列を宣言する。"<code>unsafe"</code>というキーワードは、このコードを含むアセンブリが「安全でない」(unsafe) とマークされるこのコード含む必要とする<ref>より具体的にいうと、アセンブリのコンパイルオプションに "/unsafe" 追加する必要とすがある。 </ref>。
 
<source lang="csharp">
102行目:
 
==動的割り当てと自動割り当て==
[[Java]]や[[.NET Framework]]などの言語は、可変長配列を提供するとはみなされない。これらの言語では、全ての配列オブジェクト論理的に[[ヒープ]]に割り当てられ、配列に関して自動記憶期間というものを持たないためである(JavaとdotNetのコンパイラは、これらのヒープ割り当てを可能な限りスタック上に実際に配置するよう最適化できる)
 
==脚注==