annotate paper/chapter3.tex @ 78:a456a90f9f35

add perl6 sample code
author anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
date Mon, 18 Feb 2019 20:29:10 +0900
parents 49e6b3116f12
children 0d4418a76093
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
15
83760be3f57f add chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1 \chapter{Perl6}
83760be3f57f add chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2 \section{Perl6の概要}
37
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
3 Perl6は2002年にLarryWallが、 Perl5を置き換える言語として設計を開始したプログラミング言語である。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
4 Perl5の言語的な問題点である、 オブジェクト指向機能の強力なサポートや、 正規表現の表現力の拡大などを取り入れた言語として設計された。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
5 Perl5は設計と実装が同一であり、 Unixベースの環境で主に利用されている perl はLarryらによって開発されているC言語による実装のみである。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
6 Perl6は仕様と実装が分離されており、 現在はテストスイートであるRoastが仕様となっている。
15
83760be3f57f add chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
7
83760be3f57f add chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
8 実装は歴史的に様々なものが開発されており、 Haskellで実装されたPugs、 Pythonとの共同実行環境を目指したParrotなどが存在する。
83760be3f57f add chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
9 PugsやParrotは現在は歴史的な実装となっており、 開発は行われていない。
83760be3f57f add chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
10 現在の主要な実装であるRakudoは、 Parrotと入れ替わる形で実装が進んでいる。
78
a456a90f9f35 add perl6 sample code
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 43
diff changeset
11
a456a90f9f35 add perl6 sample code
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 43
diff changeset
12 Perl6そのものはスクリプト言語として実装されている。
a456a90f9f35 add perl6 sample code
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 43
diff changeset
13 また、 Perl5の様に型が無い様にも振る舞えるが、 TypeScriptの様に型がある様にも振る舞う事が出来る。
a456a90f9f35 add perl6 sample code
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 43
diff changeset
14 この型システムの特徴を、漸進的型付けと呼び、 Perl6は漸進的型付け言語である。
21
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 20
diff changeset
15 言語的な特徴としては、 独自にPerl6の文法を拡張可能なGrammer、 Perl5と比較してオブジェクト指向言語としての機能の強化などが見られる。
78
a456a90f9f35 add perl6 sample code
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 43
diff changeset
16 Perl6の実際のサンプルコードをソースコード\ref{perl6_grammer}とソースコード\ref{p6_fizzbuzz}に示す。
a456a90f9f35 add perl6 sample code
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 43
diff changeset
17
a456a90f9f35 add perl6 sample code
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 43
diff changeset
18 \lstinputlisting[frame=lrbt, label=perl6_grammer, caption=Perl6のGrammerを利用したサンプルコード]{./codes/grammer.p6}
a456a90f9f35 add perl6 sample code
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 43
diff changeset
19 \lstinputlisting[frame=lrbt, label=p6_fizzbuzz, caption=Perl6の型システムを利用したfizzbuzz]{./codes/fizzbuzz.p6}
a456a90f9f35 add perl6 sample code
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 43
diff changeset
20
21
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 20
diff changeset
21
37
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
22 Perl6は言語的な仕様や、 実装がPerl5と大幅に異なっており、 言語的な互換性が存在しない。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
23 その為、 現在ではPerl5とPerl6は別言語として開発されており、 Perl6は主要な処理系であるRakudoから名前を取り、 Rakuという別名がついている。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
24
21
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 20
diff changeset
25 \section{Rakudo}
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 20
diff changeset
26
41
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
27 RakudoとはNQPによって記述され、 MoarVM、 JVM上で動作するPerl6の実装である。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
28 NQPとはNotQuitPerlの略であり、 Perl6のサブセットである。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
29
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
30 RakudoがPerl6のコンパイラかつインタプリタとして機能する。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
31 Rakudoの構成を図\ref{fig:perl6nqp}に示す。
15
83760be3f57f add chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
32
41
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
33 \begin{figure}[ht]
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
34 \caption{Rakudoの構成図}
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
35 \begin{center}
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
36 \includegraphics[width=50mm]{./fig/prosym/perl6nqp.pdf}
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
37 \end{center}
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
38 \label{fig:perl6nqp}
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
39 \end{figure}
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
40
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
41 Perl6そのものはNQPで大本が記述されており、 その上にPerl6自身で記述された箇所が存在する。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
42 図\ref{fig:perl6nqp}に示すとおり、 MoarVMが解釈するのはNQPが発行したMoarVMバイトコードである。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
43 Perl6のプログラムはPerl6及びNQPコンパイラによってMoarVMバイトコードに変換され、 MoarVMが評価する。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
44 現在はMoarVMの他にJVMも動作環境として選択可能であるが、 JVM側にはMoarVMと比較して実装された機能が少ないなどの特徴がある。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
45
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
46 MoarMVそのものはPerl6やNQPプログラムを直接は評価する事が出来ない。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
47 従って、 NQP及びPerl6で書かれているRakudoをソースコードからビルドする際は、 予めNQPインタプリタであるnqpをビルドする必要が存在する。
21
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 20
diff changeset
48 Rakudoのビルド時にはこのnqpと、 nqpが動作するVMを設定として与える必要がある。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 20
diff changeset
49 この両者を指定しない場合、 ビルド時に動的にNQP、 MoarVMをソースコードをダウンロードし、 ビルドを行う。
41
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
50 実際にNQPで記述されたRakudoの実装の一部をソースコード\ref{nqp_on_rakud}に示す。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
51 \lstinputlisting[frame=lrbt, label=nqp_on_rakud, caption=Rakudoの実装の一部]{./codes/src_main.nqp}
21
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 20
diff changeset
52
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 20
diff changeset
53 \section{MoarVM}
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 20
diff changeset
54 MoarVMとはRakudo実装で主に使われる仮想機械である。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 20
diff changeset
55 RakudoではPerl6とNQPを実行する際に仮想機械上で実行する。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 20
diff changeset
56 この仮想機械はOSレベルの仮想化に使用するVirtualBoxやqemuと異なり、プロセスレベルの仮想機械である。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 20
diff changeset
57 Rakudoではこの仮想機械にMoarVM、 Javaの仮想機械であるJVM(JavaVirtualMachine)が選択可能である。
36
25ef2b0220df add macro
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 32
diff changeset
58 MoarVMはこの中でRakudo独自に作成されたプロセス仮想機械であり、 現在のRakudoプロジェクトの主流な実装となっている。
21
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 20
diff changeset
59
36
25ef2b0220df add macro
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 32
diff changeset
60 MoarVMはC言語で実装されており、 レジスタマシンである。
21
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 20
diff changeset
61 MoarVMはNQPやPerl6から与えられたMoarVMバイトコードを評価する。
15
83760be3f57f add chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
62
37
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
63 MoarVM自体の改良は現在も行われているが、 開発者の多くは新機能の実装などを中心に行っている。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
64 速度上昇を目指したプロジェクトも存在はするが、 介入する余地があると考えられる。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
65 また、 内部ではLuaJitというJITコンパイル用のライブラリを利用しているが、 JITに対して開発者チームの力が注がれていない。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
66 その為、 本研究ではJITや速度上昇を最終的な目標として考え、 速度上昇までに必要なモジュール化などの実装を行う。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
67
15
83760be3f57f add chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
68 \section{NQP}
83760be3f57f add chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
69 NQPとはRakudoにおけるPerl6の実装に利用されているプログラミング言語である。
83760be3f57f add chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
70 NQP自体は、 Perl6のサブセットとして開発されている。
20
bb510f08d601 update chapter2
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 19
diff changeset
71 歴史的にはPerl6の主力実装がParrotであった際に開発され、 現在のRakudoに引き継がれている。
bb510f08d601 update chapter2
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 19
diff changeset
72 RakudoにおけるNQPは、 Parrot依存であった実装が取り払われている。
bb510f08d601 update chapter2
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 19
diff changeset
73
15
83760be3f57f add chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
74 基本文法などはPerl6に準拠しているが、 変数を束縛で宣言する。インクリメント演算子が一部利用できない。
83760be3f57f add chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
75 Perl6に存在する関数などが一部利用できないなどの制約が存在する。
83760be3f57f add chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
76
32
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 30
diff changeset
77 NQPのコード例をソースコード\ref{fib_nqp}に示す。
19
365856474363 update Makefile and main.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 18
diff changeset
78 \lstinputlisting[frame=lrbt, label=fib_nqp, caption=フィボナッチ数列を求めるNQPのソースコード]{./codes/fib.nqp}
15
83760be3f57f add chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
79
17
9d5db297d154 use listings for chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 16
diff changeset
80
9d5db297d154 use listings for chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 16
diff changeset
81 Perl6はNQPで実装されている為、 Perl6におけるVMはNQPの実行を目標として開発されている。
20
bb510f08d601 update chapter2
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 19
diff changeset
82
17
9d5db297d154 use listings for chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 16
diff changeset
83 NQP自体もNQPで実装されており、 NQPのビルドには予め用意されたMoarVMなどのVMバイトコードによるNQPインタプリタが必要となる。
32
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 30
diff changeset
84 実際にNQP内部で入力として与えられたNQPから加算命令を生成する部分をソースコード\ref{nqp_code_add_ops}に示す。
20
bb510f08d601 update chapter2
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 19
diff changeset
85
bb510f08d601 update chapter2
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 19
diff changeset
86 \lstinputlisting[frame=lrbt, label=nqp_code_add_ops, caption=NQPが加算命令を生成する箇所]{./codes/nqp_ops.nqp}
bb510f08d601 update chapter2
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 19
diff changeset
87
bb510f08d601 update chapter2
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 19
diff changeset
88
15
83760be3f57f add chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
89 MoarVMを利用する場合、 MoarVMの実行バイナリであるmoarに対して、 ライブラリパスなどを予め用意したNQPインタプリタのバイトコードに設定する。
37
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
90 moarの起動時の設定は、 コマンドライン引数のオプションで与える事が可能である。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
91 その為、 既に存在しているMoarVMバイトコードで記述されたNQPのインプリタファイルを、 適切にオプションで指定し、moarを実行することでNQPのインタプリタが起動する。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
92
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
93
43
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 41
diff changeset
94 NQPのビルドフローの一部を図\ref{fig:nqp_stage0_to_1}に示す。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 41
diff changeset
95
15
83760be3f57f add chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
96 NQPのビルドには、 このNQPインタプリタをまず利用し、 NQP自体のソースコードを入力して与え、 ターゲットとなるVMのバイトコードを生成する。
37
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
97 既に用意されている、 ターゲットのVMのバイトコード化しているNQPインタプリタの状態を Stage0 と呼ぶ。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
98 Stage0を利用し、NQPソースコードからビルドしたNQPインタプリタであるバイトコードを、 Stage1と呼ぶ。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
99
43
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 41
diff changeset
100 \begin{figure}[ht]
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 41
diff changeset
101 \caption{NQP Stage1のビルドフロー}
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 41
diff changeset
102 \begin{center}
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 41
diff changeset
103 \includegraphics[width=120mm]{./fig/nqp_stage0_to_1.pdf}
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 41
diff changeset
104 \end{center}
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 41
diff changeset
105 \label{fig:nqp_stage0_to_1}
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 41
diff changeset
106 \end{figure}
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 41
diff changeset
107
37
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
108 Stage1をmoarの起動時オプションにライブラリとして設定し、 起動したNQPインタプリタで再度ビルドしたNQPインタプリタを、 Stage2と呼ぶ。
20
bb510f08d601 update chapter2
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 19
diff changeset
109 この2度目のビルドで、ソースコードからビルドされたVMバイトコードでNQP自身をビルドした事になる。
37
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
110 処理系自身をその処理系でビルドする事をセルフビルドと呼び、 NQPはセルフビルドしたStage2のバイトコードを利用する。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
111 2度目のビルドの際に生成されたStage2を利用して、 moarを起動するスクリプトの事を小文字のnqpと呼び、これがNQPのインタプリタのコマンドとなる。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
112
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
113 nqpは使用しているVMのバイトコードを生成する機能があり、 Rakudoのビルド時にはこの機能を利用してバイトコードを生成する。
15
83760be3f57f add chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
114
83760be3f57f add chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
115
20
bb510f08d601 update chapter2
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 19
diff changeset
116
15
83760be3f57f add chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
117
83760be3f57f add chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
118 %Data Gear はデータの単位であり、int や文字列などの Primitive Type を持っている。
83760be3f57f add chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
119
83760be3f57f add chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
120 %Code Gear は 任意の数の Input Data Gear を参照して処理を行い、Output Data Gear を出力し処理を終える。
83760be3f57f add chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
121 %また、接続された Data Gear 以外には参照を行わない。
83760be3f57f add chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
122
83760be3f57f add chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
123 %処理やデータの構造が Code Gear、Data Gear に閉じているため、これにより実行時間、メモリ使用量などを予測可能なものにすることが可能になる。
83760be3f57f add chapter2.tex
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
124