回答編集履歴

5

修正

2020/04/07 11:56

投稿

hayataka2049
hayataka2049

スコア30933

test CHANGED
@@ -30,7 +30,7 @@
30
30
 
31
31
 
32
32
 
33
- 改めて書きますが、コンパイル時に変数の型がわかるからこができるのです。動的型付け言語ではこういった方策は基本的には取れないため、別のやり方が必要になります(たとえば属性アクセスなら属性名でハッシュテーブルを探索して拾い上げる、とか)。
33
+ 改めて書きますが、コンパイル時に変数の型がわかるからこういったことができるのです。動的型付け言語ではこういった方策は基本的には取れないため、別のやり方が必要になります(たとえば属性アクセスなら属性名でハッシュテーブルを探索して拾い上げる、とか)。
34
34
 
35
35
 
36
36
 

4

表現の修正

2020/04/07 11:56

投稿

hayataka2049
hayataka2049

スコア30933

test CHANGED
@@ -26,7 +26,19 @@
26
26
 
27
27
 
28
28
 
29
+ ---
30
+
31
+
32
+
29
- 改めて書きますが、基本的にコンパイル時に変数の型がわかるからこれができるのです。動的型付け言語ではったく違う針で実装してで注意が必要す(たとえば属性アクセスなら属性名でハッシュテーブルを探索して拾い上げる、とか)。
33
+ 改めて書きますが、コンパイル時に変数の型がわかるからこれができるのです。動的型付け言語ではこういった方策は基本的には取れなため、別やり方が必要になります(たとえば属性アクセスなら属性名でハッシュテーブルを探索して拾い上げる、とか)。
34
+
35
+
36
+
37
+ ただし昨今のトレンドとしては、動的型付け言語でも型推論や実行時コンパイルなどの技術を適用して内部的に静的に処理してパフォーマンスを稼ぐ、という方法も出てきています(JavaScriptなど)。この場合は、(実行されるまでの処理は色々と増えますが)本質的な実行のされ方は私の回答で書いたような静的型付けオブジェクト指向言語のやり方とさほど変わりありません。
38
+
39
+
40
+
41
+ (maisumakunさんからのコメントでのご指摘を受けて、上記2段落は投稿当初から修正・追記しています。)
30
42
 
31
43
 
32
44
 

3

追記

2020/04/07 11:55

投稿

hayataka2049
hayataka2049

スコア30933

test CHANGED
@@ -14,7 +14,7 @@
14
14
 
15
15
 
16
16
 
17
- ついでに書いておくと、あるクラスを継承した新しいクラスでメンバを追加したとします。親クラスにあったメンバのアドレス位置はそのままにしておき、新しいメンバをその後ろに付け加えれば、親クラスにある属性は親クラスの場合と同じ操作で取り出せる訳です。
17
+ ついでに書いておくと、あるクラスを継承した新しいクラスでメンバを追加したとします。親クラスにあったメンバのアドレス位置はそのままにしておき、新しいメンバをその後ろに付け加えれば、親クラスにある属性は親クラスの場合と同じ操作で取り出せる訳です。親クラスの型の変数に子クラスのインスタンスを代入できる理由がこれです。
18
18
 
19
19
 
20
20
 

2

追記

2020/04/07 11:14

投稿

hayataka2049
hayataka2049

スコア30933

test CHANGED
@@ -10,7 +10,7 @@
10
10
 
11
11
 
12
12
 
13
- なお、メンバには値型と参照型の二種類があることに留意してください。値型は普通オブジェクトの領域にそのまま埋め込まれます。参照型はポインタが埋め込まれ、この場合実体はまた別のメモリ領域に置かれます。たとえば文字列は長さが変わる可能性があり、値型としてしまうと上で書いた方法は破綻してしまいますが、参照型としておけばポインタの長さは一定(64bitとか)なので困りません。
13
+ なお、メンバには値型と参照型の二種類があることに留意してください。値型はintなどで、普通オブジェクトの領域にそのまま埋め込まれます。参照型はポインタが埋め込まれ、この場合実体はまた別のメモリ領域に置かれます。たとえば文字列は長さが変わる可能性があり、値型としてしまうと上で書いた方法は破綻してしまいますが、参照型としておけばポインタの長さは一定(64bitとか)なので困りません。
14
14
 
15
15
 
16
16
 

1

追記

2020/04/07 11:02

投稿

hayataka2049
hayataka2049

スコア30933

test CHANGED
@@ -6,7 +6,7 @@
6
6
 
7
7
 
8
8
 
9
- この位置関係はクラスごとに(つまり型ごとに)決まっています。属性アクセスを試みたとして、変数の型は静的型付けならわかるので、あとはアドレス演算でメンバの値を取り出せる訳です。
9
+ この位置関係はクラスごとに(つまり型ごとに)決まっています。属性アクセスを試みたとして、変数の型は静的型付けならわかるので、あとはアドレス演算でメンバの値を取り出せる訳です。というか、実際はコンパイル時にアドレス演算に変換してしまう訳です。
10
10
 
11
11
 
12
12