comparison Paper/anatofuz.tex @ 14:56f4ac0231ee

tweak tex and add bibfile
author Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
date Tue, 06 Nov 2018 22:37:59 +0900
parents 80944267f9c7
children 8580ad6c50dd
comparison
equal deleted inserted replaced
13:80944267f9c7 14:56f4ac0231ee
4 %\documentclass[withpage,english]{ipsjprosym} 4 %\documentclass[withpage,english]{ipsjprosym}
5 5
6 \usepackage[dvipdfmx]{graphicx} 6 \usepackage[dvipdfmx]{graphicx}
7 \usepackage{latexsym} 7 \usepackage{latexsym}
8 \usepackage{comment} 8 \usepackage{comment}
9 \usepackage{listings}
10 \lstset{
11 language=C,
12 tabsize=2,
13 frame=single,
14 basicstyle={\ttfamily\footnotesize},%
15 identifierstyle={\footnotesize},%
16 commentstyle={\footnotesize\itshape},%
17 keywordstyle={\footnotesize\bfseries},%
18 ndkeywordstyle={\footnotesize},%
19 stringstyle={\footnotesize\ttfamily},
20 breaklines=true,
21 captionpos=b,
22 columns=[l]{fullflexible},%
23 xrightmargin=0zw,%
24 xleftmargin=1zw,%
25 aboveskip=1zw,
26 numberstyle={\scriptsize},%
27 stepnumber=1,
28 numbersep=0.5zw,%
29 lineskip=-0.5ex,
30 }
31 \renewcommand{\lstlistingname}{Code}
32 \usepackage{caption}
33 \captionsetup[lstlisting]{font={small,tt}}
9 \usepackage{url} 34 \usepackage{url}
10 \begin{document} 35 \begin{document}
11 36
12 % Title, Author %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 37 % Title, Author %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
13 \title{CbCを用いたPerl6処理系} 38 \title{CbCを用いたPerl6処理系}
54 そして今回改良した一部分と今後の展開について記す. 79 そして今回改良した一部分と今後の展開について記す.
55 80
56 \section{CbC} 81 \section{CbC}
57 \subsection{CbCの概要} 82 \subsection{CbCの概要}
58 CbCは当研究室で開発しているプログラミング言語である. 83 CbCは当研究室で開発しているプログラミング言語である.
59 CbCではCodeSegment(以下CS),DetaSegment(以下DS)を基本単位として記述するプログラミングスタイルを取る. 84 Cレベルでのプログラミングを行う場合,本来プログラマが行いたい処理の他にmallocなどを利用したメモリのアロケートやエラーハンドリングなどが存在する.
60 85 これらをmeta computationと呼ぶ.これらmeta computationと通常の処理を分離することでバグの原因がmeta computation側にあるか処理側にあるかの分離などが可能となる.
86 しかしC言語などを用いたプログラミングで分離を行おうとすると,それぞれ事細かに関数やクラスを分割せねばならず容易ではない.
87 CbCでは関数よりmeta computationを細かく記述する為にCodeSegmentという単位を導入した.
88 CbCではCodeSegment,DetaSegmentを基本単位として記述するプログラミングスタイルを取る.
89
90 \subsection{CodeSegmentとDataSegment}
91 CbCではCの関数の代わりにCodeSegmentを導入する.
92 CodeSegmentはCの関数宣言の型名の代わりに\_\_codeと書くことで 宣言できる.
61 93
62 \subsection{現在の実装} 94 \subsection{現在の実装}
63 CbCは現在主要なCコンパイラであるgcc及びllvmをバックエンドとしたclang上の2種類の実装が存在する. 95 CbCは現在主要なCコンパイラであるgcc及びllvmをバックエンドとしたclang上の2種類の実装が存在する.
64 gccはバージョン9.0.0に,clangは7.0.0に対応している. 96 gccはバージョン9.0.0に,clangは7.0.0に対応している.
97
98 \subsection{CbCコンパイラのバグ}
65 CbCコンパイラ自身はそれぞれ用意したテストスイートを通化するものの,MoarVMの様な巨大なプロジェクトのCSをコンパイルを実行する場合,予期せぬバグが発生した. 99 CbCコンパイラ自身はそれぞれ用意したテストスイートを通化するものの,MoarVMの様な巨大なプロジェクトのCSをコンパイルを実行する場合,予期せぬバグが発生した.
66 主にCS間のgotoにおけるtail callフラグの除去や,DSとして渡している構造体の変数のアドレスがスタックポインタの値より上位に来てしまい,通常のCの関数をcallした際にローカル変数の領域がDSのアドレスの周辺を利用してしまう. 100 主にCS間のgotoにおけるtail callフラグの除去や,DSとして渡している構造体の変数のアドレスがスタックポインタの値より上位に来てしまい,通常のCの関数をcallした際にローカル変数の領域がDSのアドレスの周辺を利用してしまう.
67 その為DSの構造体の値が書き換わり,CからDSにreturnした際にDSの構造体が破壊されるバグである. 101 その為DSの構造体の値が書き換わり,CからDSにreturnした際にDSの構造体が破壊されるバグである.
68 現状ではCbCコンパイラがプログラマの意図と反する挙動を取るためCbCコンパイラのバグを回避するプログラミングが要求されている. 102 現状ではCbCコンパイラがプログラマの意図と反する挙動を取るためCbCコンパイラのバグを回避するプログラミングが要求されている.
69 本来コンパイラ側のバグを回避するプログラミングをプログラマに要求するスタイルは好ましくない. 103 本来コンパイラ側のバグを回避するプログラミングをプログラマに要求するスタイルは好ましくない.
72 CbCはCコンパイラ上に実装している為,CSを利用しない場合は通常のCプログラムとして動作する. 106 CbCはCコンパイラ上に実装している為,CSを利用しない場合は通常のCプログラムとして動作する.
73 CbCコンパイラは内部的に与えられているソースコードがCbCであるかどうかを判断し,そうでない場合は通常のコンパイラとして動作する. 107 CbCコンパイラは内部的に与えられているソースコードがCbCであるかどうかを判断し,そうでない場合は通常のコンパイラとして動作する.
74 その為MoarVMのビルドにおいてもCbCで書き換えたソースコードがあるターゲットと,手を加えていないオリジナルのターゲットの2種類を同一のCbCコンパイラでビルドする事が可能である. 108 その為MoarVMのビルドにおいてもCbCで書き換えたソースコードがあるターゲットと,手を加えていないオリジナルのターゲットの2種類を同一のCbCコンパイラでビルドする事が可能である.
75 109
76 110
111 \subsection{言語処理系におけるCbCの応用}
112 CbCを言語処理系,特にスクリプト言語に応用すると幾つかの箇所に置いて利点があると推測される.
113 CbCにおけるCSはコンパイラの基本ブロックに相当する.
114
115
77 \section{Perl6の概要} 116 \section{Perl6の概要}
78 この章では現在までのPerl6の遍歴及びPerl6の言語的な特徴について記載する. 117 この章では現在までのPerl6の遍歴及びPerl6の言語的な特徴について記載する.
79 \subsection{Perl6の構想と初期の処理系} 118 \subsection{Perl6の構想と初期の処理系}
80 Perl6は2002年にLarryWallがPerlを置き換える言語として設計を開始した. 119 Perl6は2002年にLarryWallがPerlを置き換える言語として設計を開始した.
81 Perl5の言語的な問題点であるオブジェクト指向機能の強力なサポートなどを取り入れた言語として設計された. 120 Perl5の言語的な問題点であるオブジェクト指向機能の強力なサポートなどを取り入れた言語として設計された.
99 138
100 \subsection{Rakudo} 139 \subsection{Rakudo}
101 140
102 RakudoとはParrotで構想に上がったNQP,NQPに基づくPerl6を基にしたプロジェクトである. 141 RakudoとはParrotで構想に上がったNQP,NQPに基づくPerl6を基にしたプロジェクトである.
103 RakudoがPerl6のコンパイラかつインタプリタであると考えても良い. 142 RakudoがPerl6のコンパイラかつインタプリタであると考えても良い.
104 Rakudoの構成はNQPで記述されたPerl6,NQP自身,そしてNQPを解釈するVMという構成である. 143 Rakudoにおけるコンパイラとは厳密には2種類存在する.
144 まず第1のものがPerl6,もしくはNQPをMoarVM,JVMのバイトコードに変換するNQPコンパイラである.
145 次にそのNQPが出力したバイトコードをネイティブコードに変換するVMの2種類である.
105 このVMは現在MoarVM,JavaVM,Javascript,GraalVMを選択可能である. 146 このVMは現在MoarVM,JavaVM,Javascript,GraalVMを選択可能である.
106 NQPで書かれたPerl6のことをRakudoと呼ぶ. 147 NQPで主に書かれたPerl6のことをRakudoと呼ぶ.
107 RakudoStarとはこのMoarVM,NQP,Perl6が一体となったパッケージの事である. 148 Perl6はNQP以外にもPerl6独自の一種のシンタックスシュガーの様な物を持っており,これはNQPコンパイラ側で処理を行う.
108 149
109 \subsection{NQP} 150 \subsection{NQP}
151
110 RakudoにおけるNQP\cite{nqp}は現在MoarVM,JVM上で動作し,MoarVMを一部利用することでNodeJSからも動作させる事が可能である. 152 RakudoにおけるNQP\cite{nqp}は現在MoarVM,JVM上で動作し,MoarVMを一部利用することでNodeJSからも動作させる事が可能である.
111 NQPはPerl6のサブセットであるため主な文法などはPerl6に準拠しているが幾つか異なる点が存在する. 153 NQPはPerl6のサブセットであるため主な文法などはPerl6に準拠しているが幾つか異なる点が存在する.
112 NQP自身はStage0と呼ばれる名前空間上のモジュールのみ動作環境のVMのバイトコードを必要とするが,それ以外はNQPで記述されておりBootstrappingされている言語である. 154 NQP自身はStage0と呼ばれる名前空間上のモジュールのみ動作環境のVMのバイトコードを必要とするが,それ以外はNQPで記述されておりBootstrappingされている言語である.
113 その為Rakudoを動作させる為にはMoarVMなどのVM,VMに対応させる様にビルドしたNQPがそれぞれ必要となる. 155 その為Rakudoを動作させる為にはMoarVMなどのVM,VMに対応させる様にビルドしたNQPがそれぞれ必要となる.
114 現在のNQPではMoarVM,JVMに対応するStage0はそれぞれMoarVMbytecode,jarファイルが用意されており,Javascriptではバイトコードの代わりにランタイム独自のModuleLoaderなどが設計されている. 156 現在のNQPではMoarVM,JVMに対応するStage0はそれぞれMoarVMbytecode,jarファイルが用意されており,Javascriptではバイトコードの代わりにランタイム独自のModuleLoaderなどが設計されている.