5
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Javaのコードは人間のために書かれている

Posted at

プログラミング言語の発展は、人間のために行われてきました。機械語からアセンブリ言語、そして高水準言語へと進化してきたのは、人間がコードを書きやすく、読みやすくするための工夫の積み重ねです。

その証拠に、私たちが日々書いているコードのほとんどは、実は人間のために存在しています。

以下のコードを例に、段階的に「人間のための要素」を削ぎ落としていくことで、これを実感してみましょう。

ステップ1: 通常のJavaコード

class Calculator {
    private Result result;
    
    public void calculate(int type) {
        switch (type) {
            case 1:
                for (int i = 1; i <= 10; i++) {
                    result.add(i);
                }
                break;
            case 2:
                result.set(100);
                break;
        }
    }
}

class Result {
    private int value;
    
    public void add(int v) {
        value += v;
    }
    
    public void set(int v) {
        value = v;
    }
}

これは、誰もが読みやすい一般的なJavaコードです。2つのクラスと複数のメソッドで構成されています。では、ここから人間のための要素を1つずつ取り除いていきましょう。

ステップ2: アクセス修飾子を削除

class Calculator {
    Result result;
    
    void calculate(int type) {
        switch (type) {
            case 1:
                for (int i = 1; i <= 10; i++) {
                    result.add(i);
                }
                break;
            case 2:
                result.set(100);
                break;
        }
    }
}

class Result {
    int value;
    
    void add(int v) {
        value += v;
    }
    
    void set(int v) {
        value = v;
    }
}

privatepublic を削除しました。JVMから見れば、動作は全く変わりません。アクセス修飾子は純粋に人間がコードを理解し、適切に扱うための目印だったのです。

ステップ3: クラスを削除

int value;
int type;

void calculate() {
    switch (type) {
        case 1:
            for (int i = 1; i <= 10; i++) {
                add(i);
            }
            break;
        case 2:
            set(100);
            break;
    }
}

void add(int v) {
    value += v;
}

void set(int v) {
    value = v;
}

クラスを削除しても、メソッドと変数で処理は表現できます。クラスは人間がコードを整理し、グループ化するための仕組みでした。

ステップ4: メソッドを削除

int value;
int type;

switch (type) {
    case 1:
        for (int i = 1; i <= 10; i++) {
            value += i;
        }
        break;
    case 2:
        value = 100;
        break;
}

メソッドを削除しても、処理そのものは表現できます。メソッドは人間が処理を分割し、理解しやすくするための仕組みでした。

ステップ5: switch文をif文に置き換え

int value;
int type;

if (type == 1) {
    for (int i = 1; i <= 10; i++) {
        value += i;
    }
} else if (type == 2) {
    value = 100;
}

switch 文は if 文で完全に置き換え可能です。機械的には同じですが、switch は人間が意図を理解しやすくするために存在していました。

ステップ6: for文をgotoに置き換え

int value;
int type;
int i;

if (type == 1) {
    i = 1;
    loop_start:
    if (i > 10) goto loop_end;
    value += i;
    i++;
    goto loop_start;
    loop_end:
} else if (type == 2) {
    value = 100;
}

for 文は goto で表現できます。ループも実は条件判定とジャンプの組み合わせだったのです。

ステップ7: if-elseをgotoに置き換え

int value;
int type;
int i;

if (type != 1) goto label1;
i = 1;
loop_start:
if (i > 10) goto end;
value += i;
i++;
goto loop_start;
label1:
if (type != 2) goto end;
value = 100;
end:

if-elsegoto で表現できます。else も実は条件が偽の時に別の場所にジャンプするという goto の一種だったのです。構造化プログラミングの構文は、人間が処理の流れを理解しやすくするためのものでした。

ステップ8: 変数名を無意味化

int a;
int b;
int c;

if (b != 1) goto A;
c = 1;
B:
if (c > 10) goto C;
a += c;
c++;
goto B;
A:
if (b != 2) goto C;
a = 100;
C:

機械にとっては、変数名は何でも構いません。valuea も同じです。同様に、loop_startB も機械には違いがありません。意味のある名前は、人間がコードの意図を理解するために存在していました。

ステップ9: 10進数表記を2進数表記に変更

int a;
int b;
int c;

if (b != 0b1) goto A;
c = 0b1;
B:
if (c > 0b1010) goto C;
a += c;
c++;
goto B;
A:
if (b != 0b10) goto C;
a = 0b1100100;
C:

コンピュータは0と1しか理解できません。10進数(100)も2進数(0b1100100)も機械的には同じ値ですが、10進数表記は人間が数を理解しやすくするために存在しています。

ステップ10: 改行を削除

int a;int b;int c;if(b!=0b1)goto A;c=0b1;B:if(c>0b1010)goto C;a+=c;c++;goto B;A:if(b!=0b10)goto C;a=0b1100100;C:

改行やインデント、スペースも機械には不要です。すべてを1行に詰め込んでも、機械的には全く同じコードです。改行は人間が構造を理解するために存在していました。

ステップ11: すべてを0と1で表現

01101001 01101110 01110100 00100000 01100001 00111011
01101001 01101110 01110100 00100000 01100010 00111011
01101001 01101110 01110100 00100000 01100011 00111011
01101001 01100110 00101000 01100010 00100001 00111101
00110000 01100010 00110001 00101001 01100111 01101111
01110100 01101111 00100000 01000001 00111011 01100011
00111101 00110000 01100010 00110001 00111011 01000010
00111010 01101001 01100110 00101000 01100011 00111110
00110000 01100010 00110001 00110000 00110001 00110000
00101001 01100111 01101111 01110100 01101111 00100000
01000011 00111011 01100001 00101011 00111101 01100011
00111011 01100011 00101011 00101011 00111011 01100111
01101111 01110100 01101111 00100000 01000010 00111011
01000001 00111010 01101001 01100110 00101000 01100010
00100001 00111101 00110000 01100010 00110001 00110000
00101001 01100111 01101111 01110100 01101111 00100000
01000011 00111011 01100001 00111101 00110000 01100010
00110001 00110001 00110000 00110000 00110001 00110000
00110000 00111011 01000011 00111010

最終的には、intifgoto;()+=++といったすべての要素が0と1だけで表現されます。機械が理解できるのは、このような0と1の羅列だけなのです。

まとめ

このように、私たちが普段書いているJavaコードの大部分は、機械のためではなく、人間のために存在しています。

  • アクセス修飾子
  • クラス
  • メソッド
  • switch文
  • for文などの制御構文
  • if-else構文
  • 意味のある変数名
  • 10進数表記
  • 改行・インデント

これらすべてが、人間がコードを読み書きし、理解し、保守するために作られた仕組みなのです。

プログラミング言語の進化は、人間のための利便性を追求してきた結果なのです。

5
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?