静的型付け、動的型付けの違い

静的型付けのコンパイル手順

今回は、typescriptの型アノテーションと動的型付けの違いを調べていくうちに、いつデータの型が役割を果たしているのか気になったので、静的型付けから調べました

この記事でコンパイルの手順が載っているので、参考にしました。
gccコマンドはソースファイルから実行ファイルa.outを生成するコマンド。
gccコマンドは複数の処理で構成されているので、それを一つずつみていきます。
それぞれの処理で中間ファイルが生成されるのでそれも記述していきます。
以下では、ソースファイルexample.cをコンパイルすると仮定します

1:前処理(cpp)中間ファイル「source.i」

コマンドcppはプリプロセッサと呼ばれ、ソースファイルの一行目にあるヘッダファイルをその場所に取り込むコマンドである。

#include <stdio.h>

ヘッダファイルstdio.hはディレクトリ/usr/include以下にある。
cppコマンドは、#include <...>があると、ヘッダファイルを見つけると、/usr/include以下に<...>で囲まれたファイル名のファイルを探し、あればそのファイルをinclude文と置き換える。
プリプロセッサは、ファイルの取り込みのほかにマクロの展開コメントの除去などを行う。
マクロの展開とは、マクロ名を定義された文字列に置換する操作。例えば、

#define MAX 10

という行を最初にかける。この時cppコマンドはプログラム内でマクロ名”MAX”を見つけるたびにそのマクロ名を定義された文字列”10”に置き換える。 コメントの除去とは、c言語だと、”//” 以降の文字列や”/* */”で囲まれた文字のことで、コードの注釈として除外する。

2:コンパイル(ccom)中間ファイル「source.s」

コンパイルはよく聞く単語ですが、このccomというコマンドは今回初めて知りました。
どうやら、このccomがコンパイラの本体みたいです。
役割は、プリプロセッサの出力を解析し、アセンプラプログラムを生成する。
アセンブラプログラムとは、アセンプリ言語(機械語と1対1に対応した最も低水準な言語)によって表現されたプログラム。 アセンブラプログラムはソースプログラムの一種で、作成・編集できる。
以下の記事で、アセンブリ言語の紹介をしています。
【5分で覚えるIT基礎の基礎】だれでも一度はアセンブラを学んでおこう! 第1回
ここでもコンパイラの話題などが出るので、今回のテーマの理解が深まると思います。
しかし、javascriptを勉強していってアセンブラを学ぶことになるとは、英語の文法を勉強してたら、英単語の語源のギリシャ語を勉強してるみたいですね。
💡 アセンブラについての豆知識: マシン語と対応するニックネームのことを「ニーモニック」と呼ばれる。
CPUの種類が異なれば、解釈・実行できるマシン語の種類も異なる。 つまり、「ニーモニック」の種類も異なります。

3:アセンブラ(as)中間ファイル「source.o」

コマンドasアセンブラと呼ばれる。アセンブラは、アセンブラプログラムを読み込んでオブジェクトプログラムを生成する。
オブジェクトプログラム機械語(1と0からなるコード)によって表現されたプログラム。
コンパイラの目的Object)がソースプログラムから機械語を生成することだから、オブジェクトプログラムと呼ばれる。
その生成したファイルはオブジェクトファイル(.o)と呼ばれる。

💡 ここでピン!ときていない人は、英語の復習です。
Object: 名)「物体」というイメージが強いですが、「目標」という意味もあるのでこれを踏まえるとオブジェクトファイルの意味がしっくりきます。 Objective:名)目標 でも確認できます。

4:リンク(ld)出力ファイル「a.out」

コマンドldリンカと呼ばれている。
リンカの役割は、アセンブラでアセンブラプログラムから作成したオブジェクトプログラム同士結合(リンク)し、実行ファイルを生成すること。
これで、コンパイルの手順を紹介しました。
では、本題に戻りましょう。

データ型はどこで反映されるでしょうか?

まず、cppコマンドでプリプロセッサで、#define #includeなどのマクロが展開され、size_tはunsigned longなどになります。

次に、ccomコマンドでコンパイルします。
その時にアセンブラに書き換わった時にも、まだデータ型は存在します。

上の記事を参考にすると、
アセンブラ言語でのデータ型は、
BYTE:1バイト
WORD:2バイト
DWORD:4バイト
です。
ここから、オブジェクトファイルになるときにこのデータ型が機械語になり、実行時に、その分のメモリ領域が変数として読み取られるというふうに解釈しました

この記事が気に入ったらサポートをしてみませんか?