comparison paper/nozomi-master.tex @ 153:528fca199827

add some source
author Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
date Mon, 29 Jan 2018 12:11:59 +0900
parents 9c1b9562f441
children 14e0a5a932cf
comparison
equal deleted inserted replaced
152:9c1b9562f441 153:528fca199827
491 491
492 492
493 493
494 \section{APIの改善} 494 \section{APIの改善}
495 \subsection{TAKE/PEEK} 495 \subsection{TAKE/PEEK}
496 InputAPIにはAliceと同じくTakeとPeekを用意した。
496 ChristieではInput DG の指定にはAnnotationを使う。 497 ChristieではInput DG の指定にはAnnotationを使う。
497 Annotationとは、Javaのクラスやメソッド、パッケージに対して付加情報を記述できる機能である。 498 Annotationとは、Javaのクラスやメソッド、パッケージに対して付加情報を記述できる機能である。
498 先頭に@をつけることで記述でき、オリジナルのAnnotationを定義することもできる。 499 先頭に@をつけることで記述でき、オリジナルのAnnotationを定義することもできる。
499 500
500 AliceではInputの受け皿であるReceiverを作り後からkeyをセットしていたが、 501 AliceではInputの受け皿であるReceiverを作り後からkeyをセットしていたが、
501 ChristieではInputのためのDGを作り、その上にAnnotationでKeyを指定する(\ref{src:take})。 502 ChristieではInputのためのDGを作り、その上にAnnotationでKeyを指定する(\ref{src:take})。
502 503
503 \lstinputlisting[label=src:take, caption=TAKEの例]{source/christie/InputDG.java} 504 \lstinputlisting[label=src:take, caption=Takeの例]{source/christie/InputDG.java}
504 505
505 506
506 Annotationで指定したInputDGは、CGを生成した際にCodeGear.class内で待ち合わせの処理が行われる。 507 Annotationで指定したInputDGは、CGを生成した際にCodeGear.class内で待ち合わせの処理が行われる。
507 これにはJavaのreflectionAPIを利用している。 508 これにはJavaのreflectionAPIを利用している。
509 Annotationの指定はRUNTIMEではできないため、動的なkeyの指定も防ぐことができる。
508 510
509 \ref{src:take}の2行目にあるように、InputDGを宣言する際には必ず型の指定が必要となる。 511 \ref{src:take}の2行目にあるように、InputDGを宣言する際には必ず型の指定が必要となる。
510 そのため、Christieでは他の部分を辿らなくてもCGを見るだけでインプットされるデータの型が分かる。 512 DataGearは様々な型のデータを扱うためにJavaの総称型で受け取るようにしており、<>内に指定した型でデータの型を限定できる。
511 また、取得してきたDGが指定と違う型であった場合エラーとなるため、型の整合性を保ちながら信頼性の高いプログラミングが可能となった。 513 このように記述することで、Christieでは他の部分を辿らなくてもCGを見るだけでインプットされるデータの型が分かるように可読性を向上させた。
512 514 また、取得してきたDGが指定と違う型であった場合はエラーとなるため、型の整合性を保ちながら信頼性の高いプログラミングが可能となった。
513 %Aliceではkeyと変数名の不一致から可読性が低くなっていた。しかし 515
514 %JavaのメタプログラミングAPIであるjavassistを用いてAnnotationから変数の自動生成も試みたが、javassistでは ため、実現できなかった。 516 また、Aliceではkeyと変数名の不一致から可読性が低くなっていた。
515 517 しかしChristieではkeyと変数名が一致しないとエラーとなるため、自然と読みやすいコードが書けるようになっている。
516 %リモートノードに対してTAKEする際は、REMOTETAKEのAnnotationを用いる。 518 この部分に関しては、JavaのメタプログラミングAPIであるjavassist\cite{}を用いてAnnotationから変数の自動生成も試みたが、javassistでは変数生成の前に他のどのクラスも生成してはならないという制限があったため、Christieでは実現できなかった。
517 %LocalかRemoteかはAnnotationが違うためひと目でわかる 519
518 %例 520
519 521 リモートノードに対してTake/Peekする際は、RemoteTake/RemotePeekのAnnotationを用いる(\ref{src:remotetake})。
520 %なお、圧縮を指定する際はAlice同様dgm名の前にcompressedをつける。Localでの圧縮は基本想定していない。しかし、RemoteTakeで間接的にすることは可能である。 522 そのため待ち合わせ先がLocalかRemoteかはAnnotationの違いからひと目でわかるようになった。
523
524 \lstinputlisting[label=src:remotetake, caption=RemoteTakeの例]{source/christie/RemoteInputDG.java}
525
526 なお、圧縮を指定する際はAlice同様DGM名の前にcompressedをつける。
527 LocalからのTAKEではDGM名の指定がないが、それはLocalでの圧縮は基本想定していないためである。
528 しかし、Localでの圧縮をしようと思えばRemoteTakeを用いて間接的にすることは可能である(\ref{src:compresslocal})。
529
530 \lstinputlisting[label=src:compresslocal, caption=Localへの圧縮の指定の例]{source/christie/CompressLocal.java}
531
532
521 533
522 \subsection{PUT/FLIP} 534 \subsection{PUT/FLIP}
523 %odsはない。dsmを指定して直接putする。 535 OutputAPIにはput/flipを用意した。
536 put/flipのメソッドはDGMに用意されている。
537 CodeGear.classにはDGMを取得するメソッドがあり、それを用いて書き込みたいDGMを指定して直接putする。
538 そのためLocal/Remoteの切り替えはDGMの切り替えによって行う。
539 ソースコード\ref{src:put}、\ref{src:remoteput}はLocalとRemoteにputする記述の例である。
540
541 \lstinputlisting[label=src:put, caption=Localへputする例]{source/christie/Put.java}
542 \lstinputlisting[label=src:remoteput, caption=Remoteへputする例]{source/christie/RemotePut.java}
543
544 flipも同様にDGMに直接DGを渡す(\ref{src:flip})。
545
546 \lstinputlisting[label=src:flip, caption=Remoteへflipする例]{source/christie/Flip.java}
547
548
549 ChristieではDGMに対して直接putするため、AliceのODSにあたる部分はない。
550 ODSを経由するより直接DGMに書き込むような記述のほうが直感的であると考えたためである。
551
552
524 553
525 \subsection{getData()} 554 \subsection{getData()}
526 %asClassに相当 555 AliceのasClassに相当するのがgetDataである。
527 %InputDGで指定した型は内部で保存され、通信先でも保存される。getDataで正しい型でとれる。 556 ソースコード\ref{src:getdata}はgetDataを用いてInputDGからデータを取得する例である。
557
558 \lstinputlisting[label=src:getdata, caption=getDataの例]{source/christie/GetData.java}
559
560 Aliceと違う点は、プログラマが型を指定しなくて良い点である。
561 4.2.1で示したように、InputDGを生成する際には型を指定する。
562 この型は内部で保存され、リモートノードと通信する際も保たれる。
563 このようにgetDataするだけでプログラマが指定しなくとも正しい型で取得できるため、プログラマの負担を減らし信頼性を保証することができる。
564
565
528 566
529 \section{CodeGearの記述方法} 567 \section{CodeGearの記述方法}
530 %以下のコードはLocalDSMにputした 568 %以下のコードはLocalDSMにputした
531 569
532 \lstinputlisting[label=src:StartCodeGear, caption=StartCodeGearの例]{source/christie/StartTest.java} 570 \lstinputlisting[label=src:StartCodeGear, caption=StartCodeGearの例]{source/christie/StartTest.java}
533 \lstinputlisting[label=src:TestCodeGear, caption=CodeGearの例]{source/christie/TestCodeGear.java} 571 \lstinputlisting[label=src:TestCodeGear, caption=CodeGearの例]{source/christie/TestCodeGear.java}
534 572
535 %CGを作るときはsetup。AliceではnewすればCGが待ちに入ったが、Annotationの処理を挟むには一度newしておかなければならないため、Christieではnewの後setupをして待ち合わせの処理を行う。 573 %CGを作るときはsetup。AliceではnewすればCGが待ちに入ったが、Annotationの処理を挟むには一度newしておかなければならないため、Christieではnewの後setupをして待ち合わせの処理を行う。
536 574
575
576
537 \section{DataGearManagerの複数立ち上げ} 577 \section{DataGearManagerの複数立ち上げ}
538 %CGMを2つつくればLocalが2つ作られる。Remoteへの接続と同じようにすれば良い 578 %CGMを2つつくればLocalが2つ作られる。Remoteへの接続と同じようにすれば良い
539 579
540 580
581
582
541 \section{DataGearの拡張} 583 \section{DataGearの拡張}
542 %別のclassに分けている。DataGearを継承したMessagePackDataGearと、それを更に継承したCompressedDataGearを用意した。 584 Aliceではデータの多態性を実現するためにDS内に複数のデータ形式を保持していた。
543 %そのため、どの形式をもっているかクラスを見るだけでわかるようになった 585 しかしChristieではデータ形式ごとに別のclassに分けている。
586 DataGearを継承したMessagePackDataGearと、それを更に継承したCompressedDataGearを用意した。
587 そのため子クラスは親クラスのデータ形式を保持しながら新しいデータ形式を持つ形になっている。
588 クラスを見るだけで今どの形式を保持しているかわかるようになったため、デバッグがしやすくなった。
589
590
591
544 592
545 \chapter{Christieの評価} 593 \chapter{Christieの評価}
546 \section{Akka} 594 \section{Akka}
547 \section{Corba} 595 \section{Corba}
548 \section{Erlang} 596 \section{Erlang}