# HG changeset patch # User Takahiro SHIMIZU # Date 1541490892 -32400 # Node ID 80944267f9c7addcd200e2f50e4725053898c3de # Parent 02ae2227d0a38c4f3f4ed34912b7e0967951f700 tweak tex and mv footnote sites diff -r 02ae2227d0a3 -r 80944267f9c7 Paper/Makefile --- a/Paper/Makefile Tue Nov 06 14:39:20 2018 +0900 +++ b/Paper/Makefile Tue Nov 06 16:54:52 2018 +0900 @@ -32,4 +32,4 @@ clean: - rm -f *.dvi *.aux *.log *.pdf *.ps *.gz *.bbl *.blg *~ *.core + rm -f *.dvi *.aux *.log *.pdf *.ps *.gz *.bbl *.blg *~ *.core *.bbl diff -r 02ae2227d0a3 -r 80944267f9c7 Paper/anatofuz.tex --- a/Paper/anatofuz.tex Tue Nov 06 14:39:20 2018 +0900 +++ b/Paper/anatofuz.tex Tue Nov 06 16:54:52 2018 +0900 @@ -25,7 +25,7 @@ RakudoではPerl6自体をNQP(NotQuitPerl)と言われるPerl6のサブセットで記述し,NQPをVMが解釈するという処理流れになっている. このVMは任意のVMが選択できるようになっており,現在はMoarVM,JavaVM,Javascriptが動作環境として選択可能である. 主に利用されているVMにCで書かれたMoarVMが存在する. -MoarVMはJITコンパイルなどをサポートしているが,全体的な起動及び処理速度がPerl5と比較し非常に低速である. +MoarVMはJITコンパイルなどをサポートしているが,全体的な起動時間及び処理速度がPerl5と比較し非常に低速である. この問題を解決するためにContinuation based C (CbC)という言語を一部用いる. 本論文ではMoarVMの一部をCbCを用いて書き直し,実際にどのようなパフォーマンスが出るかを報告する. @@ -46,6 +46,7 @@ 現在RakudoはNQPを解釈できる実行環境として,C言語で実装されたMoarVM,JVM,Javascript上で動作する様に開発されている. Rakudoとして主に使われている処理系はMoarVMであるが,MoarVMの処理時間がPerl5などの多くのスクリプト言語と比較し非常に低速である. その為現在日本国内ではPerl6を実務として利用するケースは概ね存在しない. +Perl6の持つ言語機能や型システムは非常に柔軟かつ強力であるため実用的な処理速度に達すれば言語の利用件数が向上することが期待される. この問題を解決するために現在当研究室で開発しているContinuation Based C(以下CbC)を用いて改良を行う. CbCはCよりさらにきめ細やかな記述が可能であるためスクリプト言語などのプログラミング言語の記述と親和性が高い事が推測される. 故に本研究はCbCをスクリプト言語の実装に適応した場合,どのような利点やプログラミング上の問題点に遭遇するかCbCの応用としての側面でも行う. @@ -55,14 +56,22 @@ \section{CbC} \subsection{CbCの概要} CbCは当研究室で開発しているプログラミング言語である. +CbCではCodeSegment(以下CS),DetaSegment(以下DS)を基本単位として記述するプログラミングスタイルを取る. \subsection{現在の実装} CbCは現在主要なCコンパイラであるgcc及びllvmをバックエンドとしたclang上の2種類の実装が存在する. -これらは内部的に与えられているソースコードがCbCであるかどうかを判断し,そうでない場合は通常のコンパイラとして動作する. -その為MoarVMのビルドにおいてもCbCで書き換えたソースコードがあるターゲットと,手を加えていないオリジナルのターゲットの2種類を同一のコンパイラでビルドする事が可能である. - +gccはバージョン9.0.0に,clangは7.0.0に対応している. +CbCコンパイラ自身はそれぞれ用意したテストスイートを通化するものの,MoarVMの様な巨大なプロジェクトのCSをコンパイルを実行する場合,予期せぬバグが発生した. +主にCS間のgotoにおけるtail callフラグの除去や,DSとして渡している構造体の変数のアドレスがスタックポインタの値より上位に来てしまい,通常のCの関数をcallした際にローカル変数の領域がDSのアドレスの周辺を利用してしまう. +その為DSの構造体の値が書き換わり,CからDSにreturnした際にDSの構造体が破壊されるバグである. +現状ではCbCコンパイラがプログラマの意図と反する挙動を取るためCbCコンパイラのバグを回避するプログラミングが要求されている. +本来コンパイラ側のバグを回避するプログラミングをプログラマに要求するスタイルは好ましくない. +従ってCbCコンパイラ自身の信頼性を向上させる事も今後の課題となっている. \subsection{CbCとCの互換性} +CbCはCコンパイラ上に実装している為,CSを利用しない場合は通常のCプログラムとして動作する. +CbCコンパイラは内部的に与えられているソースコードがCbCであるかどうかを判断し,そうでない場合は通常のコンパイラとして動作する. +その為MoarVMのビルドにおいてもCbCで書き換えたソースコードがあるターゲットと,手を加えていないオリジナルのターゲットの2種類を同一のCbCコンパイラでビルドする事が可能である. \section{Perl6の概要} @@ -71,18 +80,18 @@ Perl6は2002年にLarryWallがPerlを置き換える言語として設計を開始した. Perl5の言語的な問題点であるオブジェクト指向機能の強力なサポートなどを取り入れた言語として設計された. Perl5は設計と実装が同一であり,Larryらによって書かれたC実装のみだった.Perl6は設計と実装が分離しており様々な処理系が開発されきた. -まず2005年に唐鳳によってHaskellで実装されたPugs\footnote{http://hackage.haskell.org/package/Pugs}が登場した. +まず2005年に唐鳳によってHaskellで実装されたPugs\cite{pugs}が登場した. Pugsは最初に登場したPerl6実装であり,この実装を基にしてPerl6の仕様も修正された. 現在Pugsは歴史的な実装となっており,更新はされていない. \subsection{Parrot} -その後Pythonとの共同動作環境としてParrot\footnote{http://parrot.org/}が実装された. +その後Pythonとの共同動作環境としてParrot\cite{parrot}が実装された. ParrotはPASMと呼ばれるバイトコードを解釈可能なレジスタマシンである. ParrotでのPerl6の実装はNQP(NotQuitPerl)と呼ばれるPerl6のサブセットでPerl6を記述するというアイディアの基実装された. ParrotVMは2006年のversion8.1.0が最後のリリースである. こちらもPugsと同様に現在のPerl6プロジェクトでは歴史的な実装とされている. 現在主に使用されている実装であるRakudoは2010年にRakudo-Starという一連のツール郡としてリリースされた. -Perl6処理系自体は現在も未完成であり,Perl6プロジェクトとして提供しているテストリポジトリ「Roast」\footnote{https://github.com/perl6/roast}で定義されているテストケースを完全に通化する処理系は現在未だ存在しない. +Perl6処理系自体は現在も未完成であり,Perl6プロジェクトとして提供しているテストリポジトリ「Roast\cite{roast}」で定義されているテストケースを完全に通化する処理系は現在未だ存在しない. Perl6は言語仕様及び処理実装がPerl5と大幅に異なっており,言語的な互換性が存在しない. 従って現在ではPerl6とPerl5は別言語としての開発方針になっている. @@ -98,7 +107,7 @@ RakudoStarとはこのMoarVM,NQP,Perl6が一体となったパッケージの事である. \subsection{NQP} -RakudoにおけるNQP\footnote{https://github.com/perl6/nqp}は現在MoarVM,JVM上で動作し,MoarVMを一部利用することでNodeJSからも動作させる事が可能である. +RakudoにおけるNQP\cite{nqp}は現在MoarVM,JVM上で動作し,MoarVMを一部利用することでNodeJSからも動作させる事が可能である. NQPはPerl6のサブセットであるため主な文法などはPerl6に準拠しているが幾つか異なる点が存在する. NQP自身はStage0と呼ばれる名前空間上のモジュールのみ動作環境のVMのバイトコードを必要とするが,それ以外はNQPで記述されておりBootstrappingされている言語である. その為Rakudoを動作させる為にはMoarVMなどのVM,VMに対応させる様にビルドしたNQPがそれぞれ必要となる. @@ -112,7 +121,7 @@ 実際にperl6を動かすためにはself buildしたNQPコンパイラが必要となる.その為にstage0を利用してStage1をビルドしNQPコンパイラを作成する. Roastやドキュメントなどによって設計が定まっているPerl6とは異なりNQP自身の設計は今後も変更になる可能性が開発者から公表されている. -現在の公表されているNQPのオペコードはNQPのGitHubリポジトリ\footnote{https://github.com/perl6/nqp/blob/master/docs/ops.markdown}に記述されているものである. +現在の公表されているNQPのオペコードはNQPのGitHubリポジトリ\cite{nqpopcode}に記述されているものである. \subsection{Rakudo Perl6} @@ -123,10 +132,14 @@ 言語的な特徴としてはPerl5とは違いアトミックに演算を行う事が可能なatom演算子や,すべてがオブジェクトであるオブジェクト指向言語としての進化も見られる. +\subsection{現在のPerl6} +Perl6の言語仕様\cite{perl6design}とその時点での実装状況を纏めた公式ドキュメント\cite{perl6doc}は分離している. +従来は言語仕様は自然言語の仕様書であったが,現在はテストスイートである「Roast\cite{roast}」そのものと定義されている. +現在のPerl6の仕様はRoastを確認し,現在rakudo上に実装されている機能を見る場合は公式ドキュメントを確認する. \section{CbCによるMoarVM} -この章では改良を行ったPerl6処理系であるMoarVMについて述べる. \cite{perl6doc} +この章では改良を行ったPerl6処理系であるMoarVMについて述べる. \subsection{CbCコンパイラによるバグ} \section{CbCを用いる事についての評価} diff -r 02ae2227d0a3 -r 80944267f9c7 Paper/reference.bib --- a/Paper/reference.bib Tue Nov 06 14:39:20 2018 +0900 +++ b/Paper/reference.bib Tue Nov 06 16:54:52 2018 +0900 @@ -6,9 +6,37 @@ %% Saved with string encoding Unicode (UTF-8) - +@misc{1pugs, + title = {Pugs: A Perl 6 Implementation}, + howpublished = {\url{http://hackage.haskell.org/package/Pugs}}, +} -@misc{perl6doc, +@misc{2perl6doc, title = {Perl6 Documentation}, howpublished = {\url{https://docs.perl6.org/}}, } + +@misc{perl6design, + title = {Perl 6 Design Documents}, + howpublished = {\url{https://design.perl6.org/}}, +} + +@misc{rost, + title = {Roast -- Perl6 test suite}, + howpublished = {\url{https://github.com/perl6/roast}}, +} + +@misc{parrot, + title = {Parrot}, + howpublished = {\url{http://parrot.org/}}, +} + +@misc{nqpopcode, + title = {NQP Opcode List}, + howpublished = {\url{https://github.com/perl6/nqp/blob/master/docs/ops.markdown}}, +} + +@misc{nqp, + title = {NQP - Not Quite Perl (6)}, + howpublished = {\url{https://github.com/perl6/nqp}}, +}