comparison Paper/anatofuz.tex @ 62:31637b77c722

update
author Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
date Mon, 19 Nov 2018 14:14:34 +0900
parents db9c52b9c219
children 98f4d19f474d
comparison
equal deleted inserted replaced
61:db9c52b9c219 62:31637b77c722
142 その為従来のスクリプト言語では主にcase文で記述していた命令コードディスパッチの箇所をCodeGearの遷移として記述する事が可能である. 142 その為従来のスクリプト言語では主にcase文で記述していた命令コードディスパッチの箇所をCodeGearの遷移として記述する事が可能である.
143 CbCは状態を単位として記述が可能であるため, 命令コードなどにおける状態を利用するスクリプト言語の実装は応用例として適していると考えられる. 143 CbCは状態を単位として記述が可能であるため, 命令コードなどにおける状態を利用するスクリプト言語の実装は応用例として適していると考えられる.
144 144
145 \section{Perl6の概要} 145 \section{Perl6の概要}
146 この章では現在までのPerl6の遍歴及びPerl6の言語的な特徴について記載する. 146 この章では現在までのPerl6の遍歴及びPerl6の言語的な特徴について記載する.
147 \subsection{Perl6の構想と初期の処理系} 147
148
149 \subsection{Perl6の構想}
148 Perl6は2002年にLarryWallがPerlを置き換える言語として設計を開始した. 150 Perl6は2002年にLarryWallがPerlを置き換える言語として設計を開始した.
149 Perl5の言語的な問題点であるオブジェクト指向機能の強力なサポートなどを取り入れた言語として設計された. 151 Perl5の言語的な問題点であるオブジェクト指向機能の強力なサポートなどを取り入れた言語として設計された.
150 Perl5は設計と実装が同一であり, Larryらによって書かれたC実装のみだった.Perl6は設計と実装が分離しており様々な処理系が開発されてきた. 152 Perl5は設計と実装が同一であり, Larryらによって書かれたC実装のみだった.
153 Perl6は設計と実装が分離している.
154 言語的な特徴としては, 独自にPerl6の文法を拡張可能なGrammar, Perl5と比較した場合のオブジェクト指向言語としての進化も見られる.
155 またPerl6は漸進的型付け言語である.
156 従来のPerlの様に変数に代入する対象の型や, 文脈に応じて型を変更する動的型言語としての側面を持ちつつ, 独自に定義した型を始めとする様々な型に, 静的に変数の型を設定する事が可能である.
157
158 Perl6は言語仕様及び処理実装がPerl5と大幅に異なっており, 言語的な互換性が存在しない.
159 従って現在ではPerl6とPerl5は別言語としての開発方針になっている.
160 Perl6は現在有力な処理系であるRakudoから名前を取りRakuという別名がつけられている.
161
162 \subsection{Pugs}
163 Perl6の実装は様々なものが実装された.
151 まず2005年に唐鳳によってHaskellで実装されたPugs\cite{pugs}が登場した. 164 まず2005年に唐鳳によってHaskellで実装されたPugs\cite{pugs}が登場した.
152 Pugsは最初に登場したPerl6実装であり, この実装を基にしてPerl6の仕様も修正された. 165 Pugsは最初に登場したPerl6実装であり, この実装を基にしてPerl6の仕様も修正された.
153 現在Pugsは歴史的な実装となっており, 更新はされていない. 166 現在Pugsは歴史的な実装となっており, 更新はされていない.
154 167
155 \subsection{Parrot} 168 \subsection{Parrot}
156 その後Pythonとの共同動作環境としてParrot\cite{parrot}が実装された. 169 その後Pythonとの共同動作環境としてParrot\cite{parrot}が実装された.
157 ParrotはPASMと呼ばれるバイトコードを解釈可能なレジスタマシンである. 170 ParrotはPASMと呼ばれるバイトコードを解釈可能なレジスタマシンである.
158 ParrotでのPerl6の実装はNQP(NotQuitPerl)と呼ばれるPerl6のサブセットでPerl6を記述するというアイディアの基実装された. 171 ParrotでのPerl6の実装はNQP(NotQuitPerl)と呼ばれるPerl6のサブセットでPerl6を記述するというアイディアの基実装された.
159 ParrotVMは2006年のversion8.1.0が最後のリリースである. 172 ParrotVMは2006年のversion8.1.0が最後のリリースである.
160 こちらもPugsと同様に現在のPerl6プロジェクトでは歴史的な実装とされている. 173 こちらもPugsと同様に現在のPerl6プロジェクトでは歴史的な実装とされている.
161 現在主に使用されている実装であるRakudoは2010年にRakudo-Starという一連のツール群としてリリースされた. 174
162
163 Perl6は言語仕様及び処理実装がPerl5と大幅に異なっており, 言語的な互換性が存在しない.
164 従って現在ではPerl6とPerl5は別言語としての開発方針になっている.
165 Perl6は現在有力な処理系であるRakudoから名前を取りRakuという別名がつけられている.
166 175
167 \subsection{Rakudo} 176 \subsection{Rakudo}
168 177
169 RakudoとはParrotで構想に上がったNQP, NQPに基づくPerl6を基にしたプロジェクトである. 178 RakudoとはParrotで構想に上がったNQP, NQPに基づくPerl6を基にしたプロジェクトである.
170 RakudoがPerl6のコンパイラかつインタプリタであると考えても良い. 179 RakudoがPerl6のコンパイラかつインタプリタであると考えても良い.
187 196
188 \subsection{NQP} 197 \subsection{NQP}
189 198
190 RakudoにおけるNQP\cite{nqp}は現在MoarVM, JVM上で動作し, MoarVMを一部利用することでNodeJSからも動作させる事が可能である. 199 RakudoにおけるNQP\cite{nqp}は現在MoarVM, JVM上で動作し, MoarVMを一部利用することでNodeJSからも動作させる事が可能である.
191 NQPはPerl6のサブセットであるため, 主な文法などはPerl6に準拠しているが幾つか異なる点が存在する. 200 NQPはPerl6のサブセットであるため, 主な文法などはPerl6に準拠しているが幾つか異なる点が存在する.
192 NQPは最終的にはNQP自身でブートストラップする言語であるが, ビルドの最初にはすでに書かれたMoarvMByteCodeを必要とする. 201 NQPは最終的にはNQP自身でブートストラップする言語であるが, ビルドの最初にはすでに書かれたMoarVMのバイトコードを必要とする.
193 このMoarVMByteCodeの状態をStage0と言い, ディレクトリ名として設定されている. 202 このMoarVMByteCodeの状態をStage0と言い, ディレクトリ名として設定されている.
194 Perl6の一部はNQPを拡張したもので書かれている為, Rakudoを動作させる為にはMoarVMなどのVM, VMに対応させる様にビルドしたNQPがそれぞれ必要となる. 203 Perl6の一部はNQPを拡張したもので書かれている為, Rakudoを動作させる為にはMoarVMなどのVM, VMに対応させる様にビルドしたNQPがそれぞれ必要となる.
195 現在のNQPではMoarVM, JVMに対応するStage0はそれぞれMoarVMBytecode, jarファイルが用意されており, JavaScriptではバイトコードの代わりにランタイム独自のModuleLoaderなどが設計されている. 204 現在のNQPではMoarVM, JVMに対応するStage0はそれぞれMoarVMBytecode, jarファイルが用意されており, JavaScriptではバイトコードの代わりにランタイム独自のModuleLoaderなどが設計されている.
196 MoarVMのModuleLoaderはStage0にあるMoarVMのバイトコードで書かれた一連のファイルが該当する. 205 MoarVMのModuleLoaderはStage0にあるMoarVMのバイトコードで書かれた一連のファイルが該当する.
197 206
224 Rakudo実装上におけるPerl6はRakudo Perl6と呼ばれているGitリポジトリで管理されているプログラムのことである. 233 Rakudo実装上におけるPerl6はRakudo Perl6と呼ばれているGitリポジトリで管理されているプログラムのことである.
225 前述した通りRakudo Perl6はPerl6のサブセットであるNQPを用いて記述されている. 234 前述した通りRakudo Perl6はPerl6のサブセットであるNQPを用いて記述されている.
226 従ってyaccやlexと言ったPerl5の文字解析, 構文解析に利用していたプログラムは利用せず, NQP側で構文定義などを行っている. 235 従ってyaccやlexと言ったPerl5の文字解析, 構文解析に利用していたプログラムは利用せず, NQP側で構文定義などを行っている.
227 NQPはNQP自身でBootstrappingされている為, Rakudo Perl6のbuild時にはNQPの実行環境として要したVM, それに基づいてbuildしたNQPがそれぞれ必要となる. 236 NQPはNQP自身でBootstrappingされている為, Rakudo Perl6のbuild時にはNQPの実行環境として要したVM, それに基づいてbuildしたNQPがそれぞれ必要となる.
228 237
229 言語的な特徴としては独自にPerl6の文法を拡張可能なGrammar, Perl5と比較した場合のオブジェクト指向言語としての進化も見られる.
230 またPerl6は漸進的型付け言語である.
231 従来のPerlの様に変数に代入する対象の型や文脈に応じて型を変更する動的型言語としての側面を持ちつつ独自に定義した型を始めとする様々な型に静的に変数の型を設定する事が可能である.
232 238
233 239
234 \subsection{現在のPerl6} 240 \subsection{現在のPerl6}
235 Perl6の言語仕様\cite{perl6design}とその時点での実装状況をまとめた公式ドキュメント\cite{perl6doc}は分離している. 241 Perl6の言語仕様\cite{perl6design}とその時点での実装状況をまとめた公式ドキュメント\cite{perl6doc}は分離している.
236 従来は言語仕様は自然言語の仕様書であったが, 現在はテストスイートであるRoast\cite{roast}そのものと定義されている. 242 従来は言語仕様は自然言語の仕様書であったが, 現在はテストスイートであるRoast\cite{roast}そのものと定義されている.