Mercurial > hg > Papers > 2021 > anatofuz-master
changeset 6:9ba5f87255e0
...
author | anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Tue, 26 Jan 2021 11:29:30 +0900 |
parents | cccd10b7a2dd |
children | ff17a9f0ea9a |
files | paper/chapter/02-perl.tex paper/master_paper.pdf paper/reference.bib |
diffstat | 3 files changed, 43 insertions(+), 5 deletions(-) [+] |
line wrap: on
line diff
--- a/paper/chapter/02-perl.tex Mon Jan 25 15:23:06 2021 +0900 +++ b/paper/chapter/02-perl.tex Tue Jan 26 11:29:30 2021 +0900 @@ -39,16 +39,44 @@ InterfaceのAPIを完全に実装するのを促す仕組みとして、Interfceの定義からエディタやツールが満たすべき関数と引数の組を自動生成するツールがある。 + +Javaでは様々な手法でこのツールを実装している。 +Microsoftが提唱しているIDEとプログラミング言語のコンパイラをつなぐプロトコルにLanguage Serverがある。 +Language Serverはコーディング中のソースコードをコンパイラ自身でパースし、 型推論やエラーの内容などをIDE側に通知するプロトコルである。 +主要なJavaのLanguage Serverの実装であるeclipse.jdt.ls\cite{eclipse.jdt.ls}では、 LanguageServerの機能として未実装のメソッドを検知する機能が実装されている。\cite{eclipse.jdt.pull322} + + golangの場合は主に\texttt{josharian/impl}\cite{golang_impl}が使われている。 -これはインストールすると\texttt{impl}コマンドが使用可能になり、 実装したいInterfaceとImplの型を与えると雛形が生成される。 +これはインストールすると\texttt{impl}コマンドが使用可能になり、 実装したいInterfaceの型と、 Interfaceを実装するImplの型(レシーバ)を与えることで雛形が生成される。 主要なエディタであるvscodeのgolangの公式パッケージである\texttt{vscode-go}\cite{vscode-go}でも導入されており、 vscodeから呼び出すことが可能である。 +vscode以外にもvimなどのエディタから呼び出すことや、 シェル上で呼び出して標準出力の結果を利用することが可能である。 GearsOSでも同様のプログラマ支援ツールを導入したい。 -先行事例を参考に、エディタ上より呼び出すか、 またはコマンドを実行して雛形ファイルを生成する機能をGearsOSに導入した。 +LanguageServerの導入も考えられるが、 今回の場合はC言語のLanguageServerをCbC用にまず改良し、 さらにGearsOS用に書き換える必要がある。 +現状のGearsOSが持つシンタックスはCbCのシンタックスを拡張しているものではあるが、これはCbCコンパイラ側には組み込まれていない。 +LanguageServerをGearsOSに対応する場合、 CbCコンパイラ側にGearsOSの拡張シンタックスを導入する必要がある。 +CbCコンパイラ側への機能の実装は、 比較的難易度が高いと考えらる。 +CbCコンパイラ側に手をつけず、 Interfaceの入出力の検査は既存のGearsOSのビルドシステム上に組み込みたい。 + +対してgolangの\texttt{impl}コマンドのように、 シェルから呼び出し標準出力に結果を書き込む形式も考えられる。 +この場合は実装が比較的容易かつ、 コマンドを呼び出して標準出力の結果を使えるシェルやエディタなどの各プラットフォームで使用可能となる。 +先行事例を参考に、コマンドを実行して雛形ファイルを生成するスクリプトをGearsOSに導入した。 Interfaceでは入力の引数がImplと揃っている必要があるが、 第一引数は実装自身のインスタンスがくる制約となっている。 実装自身の型は、Interface定義時には不定である。 その為、 GearsOSではInterfaceのAPIの宣言時にデフォルト型変数\texttt{Impl}を実装の型として利用する。 デフォルト型\texttt{Impl}を各実装の型に置換することで自動生成が可能となる。 + + +実装すべきCodeGearはInterfaceとImpl側の型を見れば定義されている。 +\texttt{\_\_code}で宣言されているものを逐次生成すればよいが、 継続として呼び出されるCodeGearは具体的な実装を持たない。 +GearsOSで使われているInterfaceには概ね次の継続である\texttt{next}が登録されている。 +\texttt{next}そのものはInterfaceを呼び出す際に、入力として与える。 +その為各Interfaceに入力として与えられた\texttt{next}を保存する場所は存在するが、 nextそのものの独自実装は各Interfaceは所持しない。 +したがってこれをInterfaceの実装側で明示的に実装することはできない。 +雛形生成の際に、入力として与えられるCodeGearを生成してしまうと、プログラマに混乱をもたらしてしまう。 + + +入力として与えられているCodeGearかどうかは、 Interfaceに定義されているCodeGearの引数を見れば良い。
--- a/paper/reference.bib Mon Jan 25 15:23:06 2021 +0900 +++ b/paper/reference.bib Tue Jan 26 11:29:30 2021 +0900 @@ -1,8 +1,18 @@ -@webpage{golang_impl, +@misc{golang_impl, title = {josharian/impl}, - author = {josharian}, + howpublished = {\url{https://github.com/josharian/impl}}, +} + +@misc{eclipse.jdt.ls, + title = {Eclipse JDT Language Server}, + howpublished = {\url{https://github.com/eclipse/eclipse.jdt.ls}}, +} + +@webpage{eclipse.jdt.pull322, + title = {Add unimplemented methods code action}, + author = {yaohaizh}, organization = "GitHub", - url = {\url{https://github.com/josharian/impl}}, + url = {\url{https://github.com/eclipse/eclipse.jdt.ls/pull/322}}, refdate = "2021-01-21", }