Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
ナカナカピエロ
Search
ナカナカピエロ
September 16, 2023
Programming
0
73
ナカナカピエロ
このスライドはJavaプログラミングを学ぶ前に知っておくべき、Javaの処理系の話やコンピュータの内部のプログラムの動きについて説明したものです。
ナカナカピエロ
September 16, 2023
Tweet
Share
Other Decks in Programming
See All in Programming
動作確認やテストで漏れがちな観点3選
starfish719
5
830
2025.01.17_Sansan × DMM.swift
riofujimon
2
640
Vue.jsでiOSアプリを作る方法
hal_spidernight
0
120
振り返れば奴(Cline)がいる
keiyagi
0
120
個人アプリを2年ぶりにアプデしたから褒めて / I just updated my personal app, praise me!
lovee
0
300
DevFest - Serverless 101 with Google Cloud Functions
tunmise
0
140
Lookerは可視化だけじゃない。UIコンポーネントもあるんだ!
ymd65536
1
140
AWSマネコンに複数のアカウントで入れるようになりました
yuhta28
2
150
ゼロからの、レトロゲームエンジンの作り方
tokujiros
3
1.1k
『改訂新版 良いコード/悪いコードで学ぶ設計入門』活用方法−爆速でスキルアップする!効果的な学習アプローチ / effective-learning-of-good-code
minodriven
29
4.8k
法律の脱レガシーに学ぶフロントエンド刷新
oguemon
4
560
定理証明プラットフォーム lapisla.net
abap34
1
640
Featured
See All Featured
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
33
2k
GitHub's CSS Performance
jonrohan
1030
460k
Designing for humans not robots
tammielis
250
25k
VelocityConf: Rendering Performance Case Studies
addyosmani
327
24k
Building a Modern Day E-commerce SEO Strategy
aleyda
38
7.1k
Principles of Awesome APIs and How to Build Them.
keavy
126
17k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
29
2.4k
We Have a Design System, Now What?
morganepeng
51
7.4k
The Art of Programming - Codeland 2020
erikaheidi
53
13k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
113
50k
Reflections from 52 weeks, 52 projects
jeffersonlam
348
20k
For a Future-Friendly Web
brad_frost
176
9.5k
Transcript
1 イントロダクション1 Javaプログラミングをマスターしよう
2 コンピュータとは何か 何らかの手段で入力されたものを処理し結果を出力する機械 【入力】 ・キーボート ・マウス ・タッチパネル ・ファイル USBメモリや ハードディスク
に記録 などなど多数 【出力】 ・画面 ・プリンタ ・ファイル USBメモリや ハードディスク に記録 などなど多数 【処理】 でもコンピュータの中で何が行われているかはよく分からない。 ブラックボックス!
3 プログラムとは何か 何らかの手段で入力されたものを処理し結果を出力する手続きを表現したもの 入力 (INPUT) 処理 (Processing) でもコンピュータの中でプログラムがどのように実行されてい るかはよく分からない。 出力
(OUTPUT) 【プログラム】
4 OSの役割とプログラムとの関係 OSは全ての機器、アプリケーションを管理しているシステム基盤プログラム。 アプリケーションプログラムはOS上で動いている。 【入力機器】 ・キーボート ・マウス ・タッチパネル ・ファイル USBメモリや
ハードディスク に記録 などなど多数 【出力機器】 ・画面 ・プリンタ ・ファイル USBメモリや ハードディスク に記録 などなど多数 CPU、メモリ、ネットワーク、入力機器、出力機器など全ての機器 OS (Operating System)プログラム アプリケーション プログラム アプリケーション プログラム アプリケーション プログラム ・・・・・・・
5 プログラムはどう動くか? プログラムはコンパイラで翻訳されて動くものとインタプリタで逐次動的に動くものがある。 OS (Operating System)プログラム アプリケーションプログラム (実行可能モジュール) 中身はマシンコードが入っている コンパイラ・ソフトウェア
ソースプログラムからマシンコード に翻訳して変換する ソースプログラム C言語やC++言語などで書かれた プログラム インタプリタ ソースプログラムからプログラムを 読み取り一行ずつ実行する (内部的には疑似的な バイトコードに変換しながら実行) ソースプログラム PythonやRubyなどで書かれた プログラム 【インタプリタ】 【コンパイラ】
6 コンパイラ vs インタプリタ コンパイラとインタプリタにはメリット・デメリットがある コンパイラ インタプリタ メリット 実行速度が速い プログラムをただちに実行できる
OSが違っても動作する デメリット いちいちコンパイルが面倒 OSが違うと動かない 実行速度が遅い 特徴 大規模で計算量の多いシステムを 構成するのに適している 小規模のシステムや比較的単純な プログラムを書くのに適している 近年はコンピュータの性能が著しく進歩し インタプリタ型のプログラミング言語が活用されている場面も 多い
7 Javaプログラムはどう動くか? プログラムはJava VM(Virtual Machine)が動作するOS上でならどこでも動作する。 Write once, run anywhere バイトコードモジュール(.class)
Javaコンパイラ Javaソースプログラム(.java) JavaVM(仮想マシン) Windows OS Mac OS Linux OS ・・・・・・・ JavaVM(仮想マシン) JavaVM(仮想マシン) どこでも動作する ある意味良いとこ取り
8 Javaの高速化技術(JITコンパイラ) さらにJava VM(Virtual Machine)はプログラムを高速化するために内部で JIT(Just In Time)コンパイラを持っている。 バイトコードモジュール(.class) JavaVM(仮想マシン)
OS インタプリタ バイトコードを解釈 しながら実行する。 JITコンパイラ よく実行されるバイトコードを マシンコードに翻訳する。 マシンコード
9 イントロダクション2 コンピュータの仕組みを知ろう
10 コンピュータが扱うデータの単位を知ろう~ビットとバイト~ コンピュータが扱う情報の最小単位はビット (0または1)。 ビットを扱うときには、2進数を用いる。 (例) 0b001101 -> 10進数に変換 2^3*1+2^2*1+2^1*0+1=13
もっと大きい単位でデータを扱いたい 8ビットを1バイトという単位でデータを扱う。0~15(2^4-1)の値を表現できる。 バイトを扱うときには、16進数を用いる。 16進表記は、0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, Fで表現する。 (例) 0xFB -> 10進数に変換 16*15+11=251 良く使用されるバイト数 バイト数 ビット数 1バイト 8ビット 2バイト 16ビット 4バイト 32ビット 8バイト 64ビット 良く使用される単位 単位 バイト数 1K(キロ)バイト 1024バイト 1M(メガ)バイト 1024Kバイト 1G(ギガ)バイト 1024Mバイト 1T(テラ)バイト 1024Gバイト
11 CPUについて知ろう CPU(Central Processing Unit)はコンピュータの頭脳。 でもCPUは基本的な命令しか実行できない。 しかしCPUは高速にその命令を実行する。 (例) 周波数が1GHzで1命令1クロックで処理するCPUだと 1秒間に理論的には
1000*1000*1000=1,000,000,000命令を実行できる CPUが実行できる命令の例 デュアルコアならCPU2個分、クアッドコアならCPU4個分の 処理が並列に実行可能。 クロック周波数はコンピュータの同期を とるための信号のこと。 周波数はコンピュータのメトロノーム。 CPUが速いからと言ってプログラムが 早く動くとは限らない。何故か?
12 記憶域について知ろう CPUは速いが記憶域はそれに比べてとても遅い。 早くデータが欲しいよ!
13 プログラムはメモリ上で動作する プログラム ディスク レジスタ メモリ プログラム プログラムをメモリに割り当てることを プログラムをロードするという。 Javaでは最初のプログラム起動時と
import文がロードに該当する。
14 Javaのデータアクセス 0x4000000 0x4000004 0x4000008 0x4000010 0x4000018 0x4000020 Javaでは、データを直接扱う基本型 (整数型、浮動小数点型、文字型など)と
アドレス経由でデータを扱う参照型(クラス型、配列型、String型など)がある。 Javaでは参照型のアドレス値は直接操作することはできないようになっている。 よって不正アドレス参照などの実行時エラーは基本的には発生しない。(安全) 整数型(int)の変数 x、yには 値が入っている 25 25 x y x==yはtrue 文字列型Stringの変数 x、yには 参照値が入っている 0xXXXXXXXX x y x==yはfalseになることが ある 値の比較を行いたいときは x.equals(y)を使う。 “abc” 0xYYYYYYYY “abc”
15 プログラムはどのように実行されているか プログラムは簡単に言えば、以下の2つの記憶域で管理されて実行されている。 プログラムカウンタ(pc) 現在のプログラムの実行命令のアドレス スタックポインタ(sp) プログラムの状態を管理しているメモリのアドレス main関数 { 実行文1
実行文2 func1(); 実行文8 } func1関数 { 実行文3 実行文4 func2(); 実行文7 } func2関数 { 実行文5 実行文6 } この例では実行文1,2,3,4,5,6,7,8の順で実行される。 現在、実行文6を実行中の状態 前のフレームアドレス : 戻りアドレス(pcを退避) func2関数スタックフレーム 前のフレームアドレス : 戻りアドレス(pcを退避) func1関数スタックフレーム 前のフレームアドレス : 戻りアドレス(pcを退避) main関数スタックフレーム pc sp 0x0 未退避 0x0 前のフレーム なし プログラムはmain関数から始まる
16 プログラムはどのように実行されているか(アニメーション01) main関数 { 実行文1 実行文2 func1(); 実行文8 } func1関数
{ 実行文3 実行文4 func2(); 実行文7 } func2関数 { 実行文5 実行文6 } 前のフレームアドレス : 戻りアドレス(pcを退避) main関数スタックフレーム pc sp 0x0 前のフレーム なし 0x0 未退避
17 プログラムはどのように実行されているか(アニメーション02) main関数 { 実行文1 実行文2 func1(); 実行文8 } func1関数
{ 実行文3 実行文4 func2(); 実行文7 } func2関数 { 実行文5 実行文6 } 前のフレームアドレス : 戻りアドレス(pcを退避) main関数スタックフレーム pc sp 0x0 前のフレーム なし 0x0 未退避
18 プログラムはどのように実行されているか(アニメーション03) main関数 { 実行文1 実行文2 func1(); 実行文8 } func1関数
{ 実行文3 実行文4 func2(); 実行文7 } func2関数 { 実行文5 実行文6 } 前のフレームアドレス : 戻りアドレス(pcを退避) main関数スタックフレーム pc sp 0x0 前のフレーム なし 0x0 未退避
19 プログラムはどのように実行されているか(アニメーション04) main関数 { 実行文1 実行文2 func1(); 実行文8 } func1関数
{ 実行文3 実行文4 func2(); 実行文7 } func2関数 { 実行文5 実行文6 } 前のフレームアドレス : 戻りアドレス(pcを退避) func1関数スタックフレーム 前のフレームアドレス : 戻りアドレス(pcを退避) main関数スタックフレーム pc sp 0x0 未退避 0x0 前のフレーム なし
20 プログラムはどのように実行されているか(アニメーション05) main関数 { 実行文1 実行文2 func1(); 実行文8 } func1関数
{ 実行文3 実行文4 func2(); 実行文7 } func2関数 { 実行文5 実行文6 } 前のフレームアドレス : 戻りアドレス(pcを退避) func1関数スタックフレーム 前のフレームアドレス : 戻りアドレス(pcを退避) main関数スタックフレーム pc sp 0x0 未退避 0x0 前のフレーム なし
21 プログラムはどのように実行されているか(アニメーション06) main関数 { 実行文1 実行文2 func1(); 実行文8 } func1関数
{ 実行文3 実行文4 func2(); 実行文7 } func2関数 { 実行文5 実行文6 } 前のフレームアドレス : 戻りアドレス(pcを退避) func1関数スタックフレーム 前のフレームアドレス : 戻りアドレス(pcを退避) main関数スタックフレーム pc sp 0x0 未退避 0x0 前のフレーム なし
22 プログラムはどのように実行されているか(アニメーション07) main関数 { 実行文1 実行文2 func1(); 実行文8 } func1関数
{ 実行文3 実行文4 func2(); 実行文7 } func2関数 { 実行文5 実行文6 } 前のフレームアドレス : 戻りアドレス(pcを退避) func2関数スタックフレーム 前のフレームアドレス : 戻りアドレス(pcを退避) func1関数スタックフレーム 前のフレームアドレス : 戻りアドレス(pcを退避) main関数スタックフレーム pc sp 0x0 未退避 0x0 前のフレーム なし
23 プログラムはどのように実行されているか(アニメーション08) main関数 { 実行文1 実行文2 func1(); 実行文8 } func1関数
{ 実行文3 実行文4 func2(); 実行文7 } func2関数 { 実行文5 実行文6 } 前のフレームアドレス : 戻りアドレス(pcを退避) func2関数スタックフレーム 前のフレームアドレス : 戻りアドレス(pcを退避) func1関数スタックフレーム 前のフレームアドレス : 戻りアドレス(pcを退避) main関数スタックフレーム pc sp 0x0 未退避 0x0 前のフレーム なし
24 プログラムはどのように実行されているか(アニメーション09) main関数 { 実行文1 実行文2 func1(); 実行文8 } func1関数
{ 実行文3 実行文4 func2(); 実行文7 } func2関数 { 実行文5 実行文6 } 前のフレームアドレス : 戻りアドレス(pcを退避) func2関数スタックフレーム 前のフレームアドレス : 戻りアドレス(pcを退避) func1関数スタックフレーム 前のフレームアドレス : 戻りアドレス(pcを退避) main関数スタックフレーム pc sp 0x0 未退避 0x0 前のフレーム なし
25 プログラムはどのように実行されているか(アニメーション10) main関数 { 実行文1 実行文2 func1(); 実行文8 } func1関数
{ 実行文3 実行文4 func2(); 実行文7 } func2関数 { 実行文5 実行文6 } 前のフレームアドレス : 戻りアドレス(pcを退避) func1関数スタックフレーム 前のフレームアドレス : 戻りアドレス(pcを退避) main関数スタックフレーム pc sp 0x0 未退避 0x0 前のフレーム なし
26 プログラムはどのように実行されているか(アニメーション11) main関数 { 実行文1 実行文2 func1(); 実行文8 } func1関数
{ 実行文3 実行文4 func2(); 実行文7 } func2関数 { 実行文5 実行文6 } 前のフレームアドレス : 戻りアドレス(pcを退避) func1関数スタックフレーム 前のフレームアドレス : 戻りアドレス(pcを退避) main関数スタックフレーム pc sp 0x0 未退避 0x0 前のフレーム なし
27 プログラムはどのように実行されているか(アニメーション12) main関数 { 実行文1 実行文2 func1(); 実行文8 } func1関数
{ 実行文3 実行文4 func2(); 実行文7 } func2関数 { 実行文5 実行文6 } 前のフレームアドレス : 戻りアドレス(pcを退避) main関数スタックフレーム pc sp 0x0 前のフレーム なし
28 プログラムはどのように実行されているか(アニメーション13) main関数 { 実行文1 実行文2 func1(); 実行文8 } func1関数
{ 実行文3 実行文4 func2(); 実行文7 } func2関数 { 実行文5 実行文6 } 前のフレームアドレス : 戻りアドレス(pcを退避) main関数スタックフレーム pc sp 0x0 前のフレーム なし 0x0 未退避 プログラムが終了した
29 データはどのように管理されているか データは、以下の3つの記憶域(メモリ)で管理されている。 静的領域 プログラムがロードされてから終了するまで存在する領域。 プログラムコードや静的(static)データが置かれる。 動的領域 (ヒープ領域) プログラムから可変長の実データを動的(new演算子)に確保した 場合に格納される領域(String型、配列型、クラス型)。
スタック領域 関数内で宣言された変数に対して確保される領域。 基本型の場合はスタック領域に直接、値が格納される。 参照型の場合は動的に確保された実データの参照値が格納され る
30 データはどのように管理されているか(アニメーション01) main関数 { int x=10; int[]ary =new int[3]; func1(x,
ary); } func1(int xp, int [] aryp) { xp=20; ary[1]=5; } 前のフレームアドレス null 0 戻りアドレス(pcを退避) main関数スタックフレーム pc sp 0x0 前のフレームなし 0x0 未退避 関数の 戻り値を格納する領域 変数 x 変数 ary 静的領域 スタック領域 ヒープ領域
31 データはどのように管理されているか(アニメーション02) main関数 { int x=10; int[]ary =new int[3]; func1(x,
ary); } func1(int xp, int [] aryp) { xp=20; ary[1]=5; } 前のフレームアドレス null 0 戻りアドレス(pcを退避) main関数スタックフレーム pc sp 0x0 前のフレームなし 0x0 未退避 関数の 戻り値を格納する領域 変数 x 変数 ary 静的領域 スタック領域 ヒープ領域
32 データはどのように管理されているか(アニメーション03) main関数 { int x=10; int[]ary =new int[3]; func1(x,
ary); } func1(int xp, int [] aryp) { xp=20; ary[1]=5; } 前のフレームアドレス null 10 戻りアドレス(pcを退避) main関数スタックフレーム pc sp 0x0 前のフレームなし 0x0 未退避 関数の 戻り値を格納する領域 変数 x 変数 ary 静的領域 スタック領域 ヒープ領域
33 データはどのように管理されているか(アニメーション04) main関数 { int x=10; int[]ary =new int[3]; func1(x,
ary); } func1(int xp, int [] aryp) { xp=20; ary[1]=5; } 前のフレームアドレス 10 戻りアドレス(pcを退避) main関数スタックフレーム pc sp 0x0 前のフレームなし 0x0 未退避 関数の 戻り値を格納する領域 変数 x 変数 ary 静的領域 スタック領域 ヒープ領域 0 0 0
34 データはどのように管理されているか(アニメーション05) main関数 { int x=10; int[]ary =new int[3]; func1(x,
ary); } func1(int xp, int [] aryp) { xp=20; ary[1]=5; } 前のフレームアドレス 10 - 戻りアドレス(pcを退避) func1関数スタックフレーム 前のフレームアドレス 10 - 戻りアドレス(pcを退避) main関数スタックフレーム pc sp 0x0 前のフレームなし 0x0 未退避 関数の戻り値を 格納する領域 変数 x 変数 ary 静的領域 スタック領域 ヒープ領域 0 0 0 関数の戻り値を 格納する領域 変数 xp 変数 ary
35 データはどのように管理されているか(アニメーション06) main関数 { int x=10; int[]ary =new int[3]; func1(x,
ary); } func1(int xp, int [] aryp) { xp=20; ary[1]=5; } 前のフレームアドレス 10 - 戻りアドレス(pcを退避) func1関数スタックフレーム 前のフレームアドレス 10 - 戻りアドレス(pcを退避) main関数スタックフレーム pc sp 0x0 前のフレームなし 0x0 未退避 関数の戻り値を 格納する領域 変数 x 変数 ary 静的領域 スタック領域 ヒープ領域 0 0 0 関数の戻り値を 格納する領域 変数 xp 変数 ary
36 データはどのように管理されているか(アニメーション07) main関数 { int x=10; int[]ary =new int[3]; func1(x,
ary); } func1(int xp, int [] aryp) { xp=20; ary[1]=5; } 前のフレームアドレス 20 - 戻りアドレス(pcを退避) func1関数スタックフレーム 前のフレームアドレス 10 - 戻りアドレス(pcを退避) main関数スタックフレーム pc sp 0x0 前のフレームなし 0x0 未退避 関数の戻り値を 格納する領域 変数 x 変数 ary 静的領域 スタック領域 ヒープ領域 0 0 0 関数の戻り値を 格納する領域 変数 xp 変数 ary
37 データはどのように管理されているか(アニメーション08) main関数 { int x=10; int[]ary =new int[3]; func1(x,
ary); } func1(int xp, int [] aryp) { xp=20; ary[1]=5; } 前のフレームアドレス 20 - 戻りアドレス(pcを退避) func1関数スタックフレーム 前のフレームアドレス 10 - 戻りアドレス(pcを退避) main関数スタックフレーム pc sp 0x0 前のフレームなし 0x0 未退避 関数の戻り値を 格納する領域 変数 x 変数 ary 静的領域 スタック領域 ヒープ領域 0 5 0 関数の戻り値を 格納する領域 変数 xp 変数 ary
38 データはどのように管理されているか(アニメーション09) main関数 { int x=10; int[]ary =new int[3]; func1(x,
ary); } func1(int xp, int [] aryp) { xp=20; ary[1]=5; } 前のフレームアドレス 10 - 戻りアドレス(pcを退避) main関数スタックフレーム pc sp 0x0 前のフレームなし 0x0 未退避 関数の戻り値を 格納する領域 変数 x 変数 ary 静的領域 スタック領域 ヒープ領域 0 5 0 プログラムが終了した
39 プログラミングするときはコンピュータの内部の動きを想像しながら 書きましょう。