「低レベルプログラミング」について
プログラミングについて
最近は、強力なスクリプト言語である「Python」や、こどものプログラミング教育向けのグラフィカルな「Scratch」等が流行していると思います。
また、高度なプログラムを開発するための3rdパーティライブラリも充実していて、筆者も色々とお世話になっています。
プログラム開発言語や開発環境はどんどん進化していますが、それでも開発したプログラム(ソフトウェア、アプリ)は、最終的にはパソコンの内部でCPUやメモリ上で動作しています。
(最近は、グラフィックボードのGPUやその他のリソースも利用されていますが、この記事ではそのあたりは触れません…)
機械語とアセンブリ言語
CPUはコンパイル言語(C/C++/C#など)やスクリプト言語(Pyhotnなど)のソースコードは解釈できないので、コンパイラなどでCPUが解釈可能な『機械語』へ変換します。
変換された機械語は下記の様にただただ16進数の羅列なので、機械語を読解しようとするのは大変です。
+0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F 0123456789ABCDEF 0005D0 00 00 8B 30 E8 E5 23 00-00 57 56 FF 30 E8 1E FE ...0..#..WV.0... 0005E0 FF FF 83 C4 0C 8B F0 E8-12 05 00 00 84 C0 74 6B ..............tk 0005F0 84 DB 75 05 E8 0E 23 00-00 6A 00 6A 01 E8 59 02 ..u...#..j.j..Y. 000600 00 00 59 59 C7 45 FC FE-FF FF FF 8B C6 EB 35 8B ..YY.E........5. 000610 4D EC 8B 01 8B 00 89 45-E0 51 50 E8 70 18 00 00 M......E.QP.p... 000620 59 59 C3 8B 65 E8 E8 D3-04 00 00 84 C0 74 32 80 YY..e........t2. 000630 7D E7 00 75 05 E8 BE 22-00 00 C7 45 FC FE FF FF }..u..."...E.... 000640 FF 8B 45 E0 8B 4D F0 64-89 0D 00 00 00 00 59 5F ..E..M.d......Y_ 000650 5E 5B C9 C3 6A 07 E8 83-03 00 00 56 E8 F1 22 00 ^[..j......V..". 000660 00 FF 75 E0 E8 AD 22 00-00 CC E8 A3 02 00 00 E9 ..u..."......... 000670 74 FE FF FF 55 8B EC 8B-45 08 56 8B 48 3C 03 C8 t...U...E.V.H<..
人が理解可能なニーモニックを使ったアセンブリ言語だとある程度読解可能になるかと思います。
; Function compile flags: /Odtp _TEXT SEGMENT _c$ = -12 ; size = 4 _b$ = -8 ; size = 4 _a$ = -4 ; size = 4 _main PROC ; File c:\Test\sample.c ; Line 4 push ebp mov ebp, esp sub esp, 12 ; 0000000cH ; Line 5 mov DWORD PTR _a$[ebp], 1 ; Line 6 mov DWORD PTR _b$[ebp], 2 ; Line 8 mov eax, DWORD PTR _a$[ebp] add eax, DWORD PTR _b$[ebp] mov DWORD PTR _c$[ebp], eax ; Line 9 xor eax, eax mov esp, ebp pop ebp ret 0 _main ENDP _TEXT ENDS
記事の内容
下記の様な事を記載していく予定です。
- プログラムがPC上でどのように動作するか?
- コードの違いによる実行時の速度差
- 大きなデータを扱う際に気を付ける事
本記事では、アセンブリ言語は多少出てきますが、アセンブリ言語についての詳細の説明(個々のニーモニック等の説明)はしない予定です。
自分がプログラムコードを書く際に、どういう機械語に置き換わるかをイメージできると、自分の書いたプログラムコードが実行時に時間が掛かる場合、なぜそうなるのかのヒントになり、少し実行速度が速いプログラムを作成できる様になると思います。
自分で試す場合に必要なもの
この記事で書かれている内容を自分で試す場合は、以下の物が必要になります。
(多少バージョンが異なっても大丈夫だと思いますが、筆者は下記環境を利用しています。)
項目 | ツール名 | 補足 |
---|---|---|
PC | Intel(R) Core(TM) i7 | x86系なら特に問題なし |
OS | Windows 10 | Home/Proどちらでも |
開発環境 | Microsoft Visual Studio Community 2019 | ライセンスは確認しましょう |
記事一覧
No.01 | (この記事) |
No.02 | アセンブリコードの生成 |
No.03 | アセンブリコードの確認 |
No.04 | 関数について |
No.05 | 配列とポインタ |
No.06 | 条件分岐 |
No.07 | スタック領域とヒープ領域 |
No.08 | TIPS(C) |
No.09 | C#について |
No.10 | C#でポインタ |
No.11 | C#で画像(Bitmap)を扱う① |
No.12 | C#で画像(Bitmap)を扱う② |