マシン語の話し

 ※ Javaの話しとか、サイバー攻撃の話しの記事を読むとき、ある程度は理解しといたほうがいいと思われるのは、「マシン語」とか、「コンピューターが、動作する仕組み」とかの話しだ。                          『2段階方式で脱Java、JACICがオラクルと特別契約』
https://tech.nikkeibp.co.jp/atcl/nxt/column/18/00001/01412/?P=1

  それで、以下の投稿は、今年の3月に作ったものなんだが、まあ今でも役に立つところはある、と思われるので、紹介しとく。                  http://www.sankei.com/world/news/180316/wor1803160018-n1.html 
         
 『韓国の仲介で、米朝首脳会談が行われるような流れになってる感じだが、その裏で北朝鮮は活発に韓国にサイバー攻撃を行っていた訳だ。韓国の出方を探って、交渉を自国に有利に運ぼうという作戦だろう。
 その手口なんかをちょっと詳しく解説してるのが、以下の記事だ。このサイトは、ウイルス・マルウエアやダーク・ウェブ(ウイルスやマルウエアを有料で販売したりしてる、危ないサイト)、それらの作者への匿名でのインタビュー記事なんかが載ってるんで、結構参考になる。
(『北朝鮮のサイバー攻撃グループ「APT37」が活発化』
 https://the01.jp/p0006529/ )

それで、これらの記事に出てくるちょっと専門的な用語について、説明しておく。                                     
※ https://tech.nikkeibp.co.jp/it/article/lecture/20070820/279875/  画像は、ここからお借りした。

「コンパイル」:本来は、「翻訳する」とか「置き換える」、ってな意味だ。
 コンピューターは、結局CPU(Central Processing Unit 中央演算装置)で電子の0(電子がない)と1(電子がある)の情報(電子があると、電流が多く流れる。電子がないと、電流が少なく流れる。電子の有る無しを、電流の流れに置き換えて(交流の山と谷を、1と0と判定して)操作してるだけのもんで、8bitとか16bitとか32bitとか64bitとかいうのは、一度に処理できる「0と1の個数」を指している。
 8bitだと、一度に00101100みたいな8個の0と1の羅列を処理できるっていう話しで、16bitだとこれが16個という話しになる(bitというのは、1組の0と1という単位。デジタルの2値って、このこと)。32bitは32個、64bitは64個の0と1の羅列…という話し(32個の箱や64個の箱の中に、それぞれ0または1が入ってる、というイメージ)。
 だから、コンピューター(CPU)は、そもそもがこういう0と1の羅列しか取り扱えない。8bitのマシンは、00101100とか00101000とかしか取り扱えない。こういう、CPUで処理させようとする0と1の羅列を、「マシン語」という。
 コンピューター(CPU)の処理は、大体が指定されたデータの場所(アドレスという)のデータに対して、一定の処理をする(「命令」)という形になる(※ こういう0と1の羅列を、「データの場所」と「命令」に分けて取扱う(データの場所と命令を、混在させて取扱う)という仕組みを思いついた人が、フォン・ノイマンって人だ。まあ、天才の一人だな。イギリス国籍のユダヤ系の人だ。それで、このタイプのコンピューターを「ノイマン型」と言う)
 大体において、8bitの場合は上位4bitが「データの場所」を指して、下位4bitが「命令」を指していたり、レジスタ(CPU内部のデータを一時置いておく場所。まあ、高速メモリってな感じのもんだ)を2本使って、8bitの「データの場所」+8bitの「データの場所」計16bitのデータの場所という風に扱う場合もあるようだ。
 こんな風に、同じ0と1の羅列でも、それがどんな意味か、どういう「データの場所」の指定なのか、どういう「命令」なのかは、そのCPUで違う(CPUの設計・製造メーカーが、それぞれの設計・製造思想に基づいて設定してる)わけだよ。
 それで、このマシン語は、0と1の羅列で「00101100」とか「00101000」みたいなもんだから、これでプログラムを作るのは大変だ。まあ、初期の頃はシコシコやったらしいし、これでプログラムを作れる名人みたいな人もいたらしい(今でも、ソニーのプレステは、どっちかというとこのマシン語寄りでプログラムを作ってるという話しだ。そっちの方が、真似されにくいんで、わざとそういう風にしてるという話しも聞いた。だから、今でもXboxでは作り出すことが難しいタイプのゲームを作ることができて、競争力を保持してるという話しを聞いたことがあるぞ)。
 しかし、プログラミングの生産性は上がらないし、当然ミスも多くなる(0と1の1個でもミスったら、アウトだ)。いくら何でも酷くね、って話しになった。
 それで、登場したのが「プログラミング言語」だ。もう少し人間にも分かりやすい言語で書いて、それを「マシン語」に置き換えたらいいんじゃね、っていう発想だ(この、マシン語への翻訳・置き換えをコンパイルと言い、コンパイルするソフトを、コンパイラと言う)。
 最初に登場したのは、「アセンブリ言語」だ。
 例えば、「mov A B」(AをBに、移動する(move)する)、「comp A B」(AとBを比較(compare)する)、「add A B」(AにBを加える(add)する)みたいな感じで記述した。
 使われた記述が、「mov」「comp」「add」のような英単語を省略したようなもんなんで(英語圏の人にとっては)理解しやすいもんだったが、「A B」の部分が、前述した「レジスタ」に限定されていた(各CPUの内部に一般のプログラマーが自由に使える、高速メモリってな感じのものー(「汎用レジスタ」と言う)が設置されているんだが、CPU毎にバラバラ(前述のように、各CPUメーカーが、それぞれ勝手に設計・製造してた。今でも、そう)なんで、CPUが異なるマシンに向けて移植が大変だった)。また、命令がCPUのできる処理とほぼ1対1対応だったんで、あまり複雑な処理を記述するのに向かなかった。アセンブリ言語をマシン語に変換するソフトを、アセンブラ(コンパイラと対をなしてる感じだな)というらしいのだが、オレは使ったことはない。大体、アセンブリ言語も本で読んだことがあるだけだ。
 それで、1973年(たかだか、45年前の話しだ)に開発されたのが「C言語」だ。
「#include
int main(void)
{
printf(“Hello, world!\n”);
return 0;
}」
ってな感じのもんだ。
 ざっと意味を説明しようとしたんだが、長くなったし、あまり興味もなかろうと思うんで、省略する。
 上記の記述のプログラムをコンパイルして実行すると、使っているマシンのディスプレイに「Hello World!」って表示される。
 上記の記述をコンパイラでコンパイルすると、マシン語に変換されて、各CPUで実行することができる、ってわけだ。』