アセンブリ言語や機械語を書いたことのある人なら「ジャンプ命令」は知っていると思います。
「ジャンプ命令」とは、プログラムの実行位置(制御位置)を指定アドレスに移動する命令です。
アセンブリ言語では、for
文とかforeach
, while
, if
などの構造化文ありませんから、それらはジャンプ命令を使って実現します。
たとえば、次のD言語のコードを、Z80アセンブラで記述し、さらにD言語のコードに変換してみましょう。
void findXY(int m) | |
{ | |
int x = (int)sqrt(m), | |
y = 0; | |
int diff = x * x - y * y - m; | |
while(diff != 0){ | |
if(diff < 0) | |
++x; | |
else |
module map; | |
auto map(FT, ATR)(FT f, ATR x) | |
if(isInputRange!ATR && is(typeof(f(x.front))) && !is(typeof(f(x.front)) == void)) | |
{ | |
static struct R | |
{ | |
auto front() | |
{ | |
return f(x.front); |
void oct2bin(const char *oct, int n, int nbit, char *bin, int skipLast, int flip) | |
{ | |
int i, cnt = 0, skip = 0; | |
const static char octlist[8][3]={{1,1,1},{1,1,-1},{1,-1,1},{1,-1,-1},{-1,1,1},{-1,1,-1},{-1,-1,1},{-1,-1,-1}}; /* 0=>1, 1=>-1 */ | |
if(n * 3 >= nbit) | |
skip = skipLast ? nbit : (n * 3 - nbit); | |
for(i = 0; i < n * 3; ++i){ | |
if(skipLast){ |
void gen_legendre_sequence() | |
{ | |
int i; | |
for(i = 0; i < 10223; ++i) | |
legendre[i] = 1; | |
for(i = 0; i < 10224; ++i) | |
legendre[(i * i) % 10223] = -1; | |
legendre[0] = 1; |
/** ソースファイルの先頭に書かれた"//##"行を読み取って、コマンドを打ち込みます。 | |
* "//##"行は複数でも構いません。複数行の場合には、上から順番に実行されます。 | |
//##$ <commands> このようにすると、shellでコマンドを打ち込みます。 | |
commandsの中に"%identifier%"があれば、展開されます。 | |
commandsはスペース区切りで入力する必要があります。 | |
//##& set waitTime <long> プロセスを待つ最大の時間を設定します。 | |
//##& let <identifier> = <string> <identifier>を<string>に束縛します。 | |
<string>には%src%や%arg[n]%など%<identifier>%を入れることもでき、それらは展開されます。 |
配列というのは「メモリ上に連続した値のリスト(list)」です。
たとえばint
型の配列は、int
型の値がメモリ上に連続しているリストのことを言います。
配列を構成する個々の値のことを要素(element)とよび、各要素にアクセスするにはメモリ上での順番と同じインデックス(添字, Index)という整数値を使い、arr[idx]
とします。
arr
は配列型の値で、idx
はインデックスを表す整数型の値です。
インデックスはメモリ上での順番に沿って0, 1, 2, 3, ...
と割り振れるため、インデックスが0の要素arr[0]
を「先頭要素」、インデックスがidx
な要素arr[idx]
を「idx
番目の要素」などと言ったりします。
注意しなければいけないのは、「先頭要素」と「0番目の要素」は同じ意味です。