comparison Paper/anatofuz.tex @ 13:80944267f9c7

tweak tex and mv footnote sites
author Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
date Tue, 06 Nov 2018 16:54:52 +0900
parents 02ae2227d0a3
children 56f4ac0231ee
comparison
equal deleted inserted replaced
12:02ae2227d0a3 13:80944267f9c7
23 スクリプト言語であるPerl5の後継言語としてPerl6が現在開発されている. 23 スクリプト言語であるPerl5の後継言語としてPerl6が現在開発されている.
24 Perl6は設計と実装が区分されており様々な処理系が開発されている.現在主流なPerl6はRakudoと言われるプロジェクトである. 24 Perl6は設計と実装が区分されており様々な処理系が開発されている.現在主流なPerl6はRakudoと言われるプロジェクトである.
25 RakudoではPerl6自体をNQP(NotQuitPerl)と言われるPerl6のサブセットで記述し,NQPをVMが解釈するという処理流れになっている. 25 RakudoではPerl6自体をNQP(NotQuitPerl)と言われるPerl6のサブセットで記述し,NQPをVMが解釈するという処理流れになっている.
26 このVMは任意のVMが選択できるようになっており,現在はMoarVM,JavaVM,Javascriptが動作環境として選択可能である. 26 このVMは任意のVMが選択できるようになっており,現在はMoarVM,JavaVM,Javascriptが動作環境として選択可能である.
27 主に利用されているVMにCで書かれたMoarVMが存在する. 27 主に利用されているVMにCで書かれたMoarVMが存在する.
28 MoarVMはJITコンパイルなどをサポートしているが,全体的な起動及び処理速度がPerl5と比較し非常に低速である. 28 MoarVMはJITコンパイルなどをサポートしているが,全体的な起動時間及び処理速度がPerl5と比較し非常に低速である.
29 この問題を解決するためにContinuation based C (CbC)という言語を一部用いる. 29 この問題を解決するためにContinuation based C (CbC)という言語を一部用いる.
30 本論文ではMoarVMの一部をCbCを用いて書き直し,実際にどのようなパフォーマンスが出るかを報告する. 30 本論文ではMoarVMの一部をCbCを用いて書き直し,実際にどのようなパフォーマンスが出るかを報告する.
31 31
32 32
33 \end{abstract} 33 \end{abstract}
44 Perl6は設計と実装が区分されており,現在広く使われている実装はRakudoと呼ばれるプロジェクトである. 44 Perl6は設計と実装が区分されており,現在広く使われている実装はRakudoと呼ばれるプロジェクトである.
45 Rakudoの実装はPerl6コンパイラ開発者用のサブセットであるNQP(NotQuitPerl)で実装されているPerl6の事を指す. 45 Rakudoの実装はPerl6コンパイラ開発者用のサブセットであるNQP(NotQuitPerl)で実装されているPerl6の事を指す.
46 現在RakudoはNQPを解釈できる実行環境として,C言語で実装されたMoarVM,JVM,Javascript上で動作する様に開発されている. 46 現在RakudoはNQPを解釈できる実行環境として,C言語で実装されたMoarVM,JVM,Javascript上で動作する様に開発されている.
47 Rakudoとして主に使われている処理系はMoarVMであるが,MoarVMの処理時間がPerl5などの多くのスクリプト言語と比較し非常に低速である. 47 Rakudoとして主に使われている処理系はMoarVMであるが,MoarVMの処理時間がPerl5などの多くのスクリプト言語と比較し非常に低速である.
48 その為現在日本国内ではPerl6を実務として利用するケースは概ね存在しない. 48 その為現在日本国内ではPerl6を実務として利用するケースは概ね存在しない.
49 Perl6の持つ言語機能や型システムは非常に柔軟かつ強力であるため実用的な処理速度に達すれば言語の利用件数が向上することが期待される.
49 この問題を解決するために現在当研究室で開発しているContinuation Based C(以下CbC)を用いて改良を行う. 50 この問題を解決するために現在当研究室で開発しているContinuation Based C(以下CbC)を用いて改良を行う.
50 CbCはCよりさらにきめ細やかな記述が可能であるためスクリプト言語などのプログラミング言語の記述と親和性が高い事が推測される. 51 CbCはCよりさらにきめ細やかな記述が可能であるためスクリプト言語などのプログラミング言語の記述と親和性が高い事が推測される.
51 故に本研究はCbCをスクリプト言語の実装に適応した場合,どのような利点やプログラミング上の問題点に遭遇するかCbCの応用としての側面でも行う. 52 故に本研究はCbCをスクリプト言語の実装に適応した場合,どのような利点やプログラミング上の問題点に遭遇するかCbCの応用としての側面でも行う.
52 本稿ではまずCbC,Perl6の特徴及び現在の実装について述べ,次に改良を行うMoarVMの一連の処理流れについて述べる. 53 本稿ではまずCbC,Perl6の特徴及び現在の実装について述べ,次に改良を行うMoarVMの一連の処理流れについて述べる.
53 そして今回改良した一部分と今後の展開について記す. 54 そして今回改良した一部分と今後の展開について記す.
54 55
55 \section{CbC} 56 \section{CbC}
56 \subsection{CbCの概要} 57 \subsection{CbCの概要}
57 CbCは当研究室で開発しているプログラミング言語である. 58 CbCは当研究室で開発しているプログラミング言語である.
59 CbCではCodeSegment(以下CS),DetaSegment(以下DS)を基本単位として記述するプログラミングスタイルを取る.
58 60
59 61
60 \subsection{現在の実装} 62 \subsection{現在の実装}
61 CbCは現在主要なCコンパイラであるgcc及びllvmをバックエンドとしたclang上の2種類の実装が存在する. 63 CbCは現在主要なCコンパイラであるgcc及びllvmをバックエンドとしたclang上の2種類の実装が存在する.
62 これらは内部的に与えられているソースコードがCbCであるかどうかを判断し,そうでない場合は通常のコンパイラとして動作する. 64 gccはバージョン9.0.0に,clangは7.0.0に対応している.
63 その為MoarVMのビルドにおいてもCbCで書き換えたソースコードがあるターゲットと,手を加えていないオリジナルのターゲットの2種類を同一のコンパイラでビルドする事が可能である. 65 CbCコンパイラ自身はそれぞれ用意したテストスイートを通化するものの,MoarVMの様な巨大なプロジェクトのCSをコンパイルを実行する場合,予期せぬバグが発生した.
64 66 主にCS間のgotoにおけるtail callフラグの除去や,DSとして渡している構造体の変数のアドレスがスタックポインタの値より上位に来てしまい,通常のCの関数をcallした際にローカル変数の領域がDSのアドレスの周辺を利用してしまう.
67 その為DSの構造体の値が書き換わり,CからDSにreturnした際にDSの構造体が破壊されるバグである.
68 現状ではCbCコンパイラがプログラマの意図と反する挙動を取るためCbCコンパイラのバグを回避するプログラミングが要求されている.
69 本来コンパイラ側のバグを回避するプログラミングをプログラマに要求するスタイルは好ましくない.
70 従ってCbCコンパイラ自身の信頼性を向上させる事も今後の課題となっている.
65 \subsection{CbCとCの互換性} 71 \subsection{CbCとCの互換性}
72 CbCはCコンパイラ上に実装している為,CSを利用しない場合は通常のCプログラムとして動作する.
73 CbCコンパイラは内部的に与えられているソースコードがCbCであるかどうかを判断し,そうでない場合は通常のコンパイラとして動作する.
74 その為MoarVMのビルドにおいてもCbCで書き換えたソースコードがあるターゲットと,手を加えていないオリジナルのターゲットの2種類を同一のCbCコンパイラでビルドする事が可能である.
66 75
67 76
68 \section{Perl6の概要} 77 \section{Perl6の概要}
69 この章では現在までのPerl6の遍歴及びPerl6の言語的な特徴について記載する. 78 この章では現在までのPerl6の遍歴及びPerl6の言語的な特徴について記載する.
70 \subsection{Perl6の構想と初期の処理系} 79 \subsection{Perl6の構想と初期の処理系}
71 Perl6は2002年にLarryWallがPerlを置き換える言語として設計を開始した. 80 Perl6は2002年にLarryWallがPerlを置き換える言語として設計を開始した.
72 Perl5の言語的な問題点であるオブジェクト指向機能の強力なサポートなどを取り入れた言語として設計された. 81 Perl5の言語的な問題点であるオブジェクト指向機能の強力なサポートなどを取り入れた言語として設計された.
73 Perl5は設計と実装が同一であり,Larryらによって書かれたC実装のみだった.Perl6は設計と実装が分離しており様々な処理系が開発されきた. 82 Perl5は設計と実装が同一であり,Larryらによって書かれたC実装のみだった.Perl6は設計と実装が分離しており様々な処理系が開発されきた.
74 まず2005年に唐鳳によってHaskellで実装されたPugs\footnote{http://hackage.haskell.org/package/Pugs}が登場した. 83 まず2005年に唐鳳によってHaskellで実装されたPugs\cite{pugs}が登場した.
75 Pugsは最初に登場したPerl6実装であり,この実装を基にしてPerl6の仕様も修正された. 84 Pugsは最初に登場したPerl6実装であり,この実装を基にしてPerl6の仕様も修正された.
76 現在Pugsは歴史的な実装となっており,更新はされていない. 85 現在Pugsは歴史的な実装となっており,更新はされていない.
77 86
78 \subsection{Parrot} 87 \subsection{Parrot}
79 その後Pythonとの共同動作環境としてParrot\footnote{http://parrot.org/}が実装された. 88 その後Pythonとの共同動作環境としてParrot\cite{parrot}が実装された.
80 ParrotはPASMと呼ばれるバイトコードを解釈可能なレジスタマシンである. 89 ParrotはPASMと呼ばれるバイトコードを解釈可能なレジスタマシンである.
81 ParrotでのPerl6の実装はNQP(NotQuitPerl)と呼ばれるPerl6のサブセットでPerl6を記述するというアイディアの基実装された. 90 ParrotでのPerl6の実装はNQP(NotQuitPerl)と呼ばれるPerl6のサブセットでPerl6を記述するというアイディアの基実装された.
82 ParrotVMは2006年のversion8.1.0が最後のリリースである. 91 ParrotVMは2006年のversion8.1.0が最後のリリースである.
83 こちらもPugsと同様に現在のPerl6プロジェクトでは歴史的な実装とされている. 92 こちらもPugsと同様に現在のPerl6プロジェクトでは歴史的な実装とされている.
84 現在主に使用されている実装であるRakudoは2010年にRakudo-Starという一連のツール郡としてリリースされた. 93 現在主に使用されている実装であるRakudoは2010年にRakudo-Starという一連のツール郡としてリリースされた.
85 Perl6処理系自体は現在も未完成であり,Perl6プロジェクトとして提供しているテストリポジトリ「Roast」\footnote{https://github.com/perl6/roast}で定義されているテストケースを完全に通化する処理系は現在未だ存在しない. 94 Perl6処理系自体は現在も未完成であり,Perl6プロジェクトとして提供しているテストリポジトリ「Roast\cite{roast}」で定義されているテストケースを完全に通化する処理系は現在未だ存在しない.
86 95
87 Perl6は言語仕様及び処理実装がPerl5と大幅に異なっており,言語的な互換性が存在しない. 96 Perl6は言語仕様及び処理実装がPerl5と大幅に異なっており,言語的な互換性が存在しない.
88 従って現在ではPerl6とPerl5は別言語としての開発方針になっている. 97 従って現在ではPerl6とPerl5は別言語としての開発方針になっている.
89 Perl6は現在有力な処理系であるRakudoから名前を取り\texttt{Raku}という言語名に変更しようという動きが一部存在している. 98 Perl6は現在有力な処理系であるRakudoから名前を取り\texttt{Raku}という言語名に変更しようという動きが一部存在している.
90 99
96 このVMは現在MoarVM,JavaVM,Javascript,GraalVMを選択可能である. 105 このVMは現在MoarVM,JavaVM,Javascript,GraalVMを選択可能である.
97 NQPで書かれたPerl6のことをRakudoと呼ぶ. 106 NQPで書かれたPerl6のことをRakudoと呼ぶ.
98 RakudoStarとはこのMoarVM,NQP,Perl6が一体となったパッケージの事である. 107 RakudoStarとはこのMoarVM,NQP,Perl6が一体となったパッケージの事である.
99 108
100 \subsection{NQP} 109 \subsection{NQP}
101 RakudoにおけるNQP\footnote{https://github.com/perl6/nqp}は現在MoarVM,JVM上で動作し,MoarVMを一部利用することでNodeJSからも動作させる事が可能である. 110 RakudoにおけるNQP\cite{nqp}は現在MoarVM,JVM上で動作し,MoarVMを一部利用することでNodeJSからも動作させる事が可能である.
102 NQPはPerl6のサブセットであるため主な文法などはPerl6に準拠しているが幾つか異なる点が存在する. 111 NQPはPerl6のサブセットであるため主な文法などはPerl6に準拠しているが幾つか異なる点が存在する.
103 NQP自身はStage0と呼ばれる名前空間上のモジュールのみ動作環境のVMのバイトコードを必要とするが,それ以外はNQPで記述されておりBootstrappingされている言語である. 112 NQP自身はStage0と呼ばれる名前空間上のモジュールのみ動作環境のVMのバイトコードを必要とするが,それ以外はNQPで記述されておりBootstrappingされている言語である.
104 その為Rakudoを動作させる為にはMoarVMなどのVM,VMに対応させる様にビルドしたNQPがそれぞれ必要となる. 113 その為Rakudoを動作させる為にはMoarVMなどのVM,VMに対応させる様にビルドしたNQPがそれぞれ必要となる.
105 現在のNQPではMoarVM,JVMに対応するStage0はそれぞれMoarVMbytecode,jarファイルが用意されており,Javascriptではバイトコードの代わりにランタイム独自のModuleLoaderなどが設計されている. 114 現在のNQPではMoarVM,JVMに対応するStage0はそれぞれMoarVMbytecode,jarファイルが用意されており,Javascriptではバイトコードの代わりにランタイム独自のModuleLoaderなどが設計されている.
106 MoarVMのModuleLoaderはStage0あるMoarVMbytecodeで書かれた一連のファイルが該当する. 115 MoarVMのModuleLoaderはStage0あるMoarVMbytecodeで書かれた一連のファイルが該当する.
110 MoarVMに対してStage0のディレクトリにライブラリパスを設定し,nqp.moarvmを実行させることでnqpの対話型環境が起動する. 119 MoarVMに対してStage0のディレクトリにライブラリパスを設定し,nqp.moarvmを実行させることでnqpの対話型環境が起動する.
111 120
112 実際にperl6を動かすためにはself buildしたNQPコンパイラが必要となる.その為にstage0を利用してStage1をビルドしNQPコンパイラを作成する. 121 実際にperl6を動かすためにはself buildしたNQPコンパイラが必要となる.その為にstage0を利用してStage1をビルドしNQPコンパイラを作成する.
113 122
114 Roastやドキュメントなどによって設計が定まっているPerl6とは異なりNQP自身の設計は今後も変更になる可能性が開発者から公表されている. 123 Roastやドキュメントなどによって設計が定まっているPerl6とは異なりNQP自身の設計は今後も変更になる可能性が開発者から公表されている.
115 現在の公表されているNQPのオペコードはNQPのGitHubリポジトリ\footnote{https://github.com/perl6/nqp/blob/master/docs/ops.markdown}に記述されているものである. 124 現在の公表されているNQPのオペコードはNQPのGitHubリポジトリ\cite{nqpopcode}に記述されているものである.
116 125
117 126
118 \subsection{Rakudo Perl6} 127 \subsection{Rakudo Perl6}
119 Rakudo実装上におけるPerl6はRakudo Perl6と呼ばれているGitリポジトリで管理されているプログラムのことである. 128 Rakudo実装上におけるPerl6はRakudo Perl6と呼ばれているGitリポジトリで管理されているプログラムのことである.
120 前述した通りRakudo Perl6はPerl6のサブセットであるNQPを用いて記述されている. 129 前述した通りRakudo Perl6はPerl6のサブセットであるNQPを用いて記述されている.
121 従ってyaccやlexと言ったPerl5の文字解析,構文解析に利用していたプログラムは利用せず,NQP側で構文定義などを行っている. 130 従ってyaccやlexと言ったPerl5の文字解析,構文解析に利用していたプログラムは利用せず,NQP側で構文定義などを行っている.
122 NQPはNQP自身でBootstrappingされている為,Rakudo Perl6のbuild時にはNQPの実行環境として要したVM,それに基づいてbuildしたNQPがそれぞれ必要となる. 131 NQPはNQP自身でBootstrappingされている為,Rakudo Perl6のbuild時にはNQPの実行環境として要したVM,それに基づいてbuildしたNQPがそれぞれ必要となる.
123 132
124 言語的な特徴としてはPerl5とは違いアトミックに演算を行う事が可能なatom演算子や,すべてがオブジェクトであるオブジェクト指向言語としての進化も見られる. 133 言語的な特徴としてはPerl5とは違いアトミックに演算を行う事が可能なatom演算子や,すべてがオブジェクトであるオブジェクト指向言語としての進化も見られる.
125 134
135 \subsection{現在のPerl6}
136 Perl6の言語仕様\cite{perl6design}とその時点での実装状況を纏めた公式ドキュメント\cite{perl6doc}は分離している.
137 従来は言語仕様は自然言語の仕様書であったが,現在はテストスイートである「Roast\cite{roast}」そのものと定義されている.
138 現在のPerl6の仕様はRoastを確認し,現在rakudo上に実装されている機能を見る場合は公式ドキュメントを確認する.
126 139
127 140
128 \section{CbCによるMoarVM} 141 \section{CbCによるMoarVM}
129 この章では改良を行ったPerl6処理系であるMoarVMについて述べる. \cite{perl6doc} 142 この章では改良を行ったPerl6処理系であるMoarVMについて述べる.
130 \subsection{CbCコンパイラによるバグ} 143 \subsection{CbCコンパイラによるバグ}
131 144
132 \section{CbCを用いる事についての評価} 145 \section{CbCを用いる事についての評価}
133 Perl6処理系はまずPerl6の豊富な文法に対応する物を作成せねばならず,類似する他のプログラミング言語処理系と比較してもより複雑となっている. 146 Perl6処理系はまずPerl6の豊富な文法に対応する物を作成せねばならず,類似する他のプログラミング言語処理系と比較してもより複雑となっている.
134 実際にPerl5を始めとしたスクリプト言語とPerl6がどのような処理時間の違いが見られるかを実測する. 147 実際にPerl5を始めとしたスクリプト言語とPerl6がどのような処理時間の違いが見られるかを実測する.