Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
ナカナカピエロ
Search
ナカナカピエロ
September 16, 2023
Programming
120
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
ナカナカピエロ
このスライドはJavaプログラミングを学ぶ前に知っておくべき、Javaの処理系の話やコンピュータの内部のプログラムの動きについて説明したものです。
ナカナカピエロ
September 16, 2023
Other Decks in Programming
See All in Programming
AI時代のコードレビューは人に向けるな、仕組みに向けろ
texmeijin
5
3.7k
外から家のPCの電源入れたい!をPHPで解決する
kawashimo0
1
130
作って学ぶSpring BootのAuto Configuration / JJUG Night Seminar 2026-10-19
rshindo
0
150
コードレビューのボトルネックを"する側"と"される側"の両面から解消する
yub0n
2
1.6k
すこし踏み込む CancellationToken
htkym
2
1.7k
[ハンズオン]AIへの指示だけで「五目並べ」を作ってみよう
satoshi256kbyte
1
380
残高管理から台帳サービスへの進化
artoy
1
200
Long Living Tokens, Die, Die, Die! (or: The One Ring is Banned in Modern)
sylph01
0
300
Railsバージョンを4倍にした話
optim
0
370
iOS 27でニュースアプリはどう変わる!? 〜日経電子版の新機能対応と、開発事例から〜
lynnswap
7
13k
複雑なUIコンポーネントとの ⻑い付き合い⽅:波及するバグからテスト戦略を経て、安全な再設計へ
mixplace
0
410
GemmaをJevのように使ってみる / Use Gemma like Jev
kishida
5
790
Featured
See All Featured
Large-scale JavaScript Application Architecture
addyosmani
516
110k
What’s in a name? Adding method to the madness
productmarketing
PRO
24
4.2k
Navigating Weather and Climate Data
rabernat
0
560
Primal Persuasion: How to Engage the Brain for Learning That Lasts
tmiket
0
500
How to Grow Your eCommerce with AI & Automation
katarinadahlin
PRO
2
330
AI Search: Where Are We & What Can We Do About It?
aleyda
0
8.1k
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
1
570
Code Review Best Practice
trishagee
74
20k
BBQ
matthewcrist
90
10k
Visualization
eitanlees
153
17k
Building Applications with DynamoDB
mza
96
7.2k
DBのスキルで生き残る技術 - AI時代におけるテーブル設計の勘所
soudai
PRO
68
58k
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 プログラミングするときはコンピュータの内部の動きを想像しながら 書きましょう。