Elixir におけるC言語コード生成・最適化の試み

Elixir におけるC言語コード生成・最適化の試み

我々は Pelemay Super-Parallelism と称する関数型言語ElixirからC言語へのコード生成・最適化を行う処理系を研究開発している
これは,ElixirにはElixirのコードをASTに変換する機構が備わることを利用し,並列化可能なコードを検出してC言語コードを生成し,Auto Vectorization を利用してSIMD並列化を行う処理系である
2019年10月に公開したバージョン0.0.4では,あらかじめテンプレートとして定義されたC言語コードにコードを埋め込む方式のコード生成を実装し,元のElixirコードと比べて約2倍の高速化が図れた
2019年11月現在研究開発中のバージョン0.1.0系列では,コード生成の方式を大幅に見直し,柔軟なコード生成を図れるようにする予定である
本発表では,その中で最も特徴的な型検査の最適化方法について提案する
これは,動的型言語であるElixirの型の特性と,NIFという Elixir とネイティブコードの間のFFIを利用して,型検査と型推論を並行して実行することで,型検査の最適化を図る方式である
今後,実装と性能評価を行う

83722380372c00bd75ac920f2089f6aa?s=128

Susumu Yamazaki (ZACKY)

January 11, 2020
Tweet

Transcript

  1. &MJYJSʹ͓͚Δ$ݴޠίʔυੜ੒ɾ࠷దԽͷࢼΈ ๺۝भࢢཱେֶࢁ࡚ਐɹٱߐ༤ت  զʑ͸1FMFNBZ4VQFS1BSBMMFMJTNͱশ͢Δؔ਺ܕݴޠ&MJYJS͔Β$ݴޠ΁ͷίʔυੜ੒ɾ࠷దԽΛ ߦ͏ॲཧܥΛݚڀ։ൃ͍ͯ͠Δ
 ͜Ε͸ɼ&MJYJSʹ͸&MJYJSͷίʔυΛ"45ʹม׵͢Δػߏ͕උΘΔ͜ͱΛར༻͠ɼฒྻԽՄೳͳίʔυ Λݕग़ͯ͠$ݴޠίʔυΛੜ੒͠ɼ"VUP7FDUPSJ[BUJPOΛར༻ͯ͠4*.%ฒྻԽΛߦ͏ॲཧܥͰ͋Δ  ೥݄ʹެ։ͨ͠όʔδϣϯͰ͸ɼ͋Β͔͡ΊςϯϓϨʔτͱͯ͠ఆٛ͞Εͨ$ݴޠίʔ υʹίʔυΛຒΊࠐΉํࣜͷίʔυੜ੒Λ࣮૷͠ɼݩͷ&MJYJSίʔυͱൺ΂ͯ໿ഒͷߴ଎Խ͕ਤΕͨ

     ೥݄ݱࡏݚڀ։ൃதͷόʔδϣϯܥྻͰ͸ɼίʔυੜ੒ͷํࣜΛେ෯ʹݟ௚͠ɼॊೈ ͳίʔυੜ੒ΛਤΕΔΑ͏ʹ͢Δ༧ఆͰ͋Δ  ຊൃදͰ͸ɼͦͷதͰ࠷΋ಛ௃తͳܕݕࠪͷ࠷దԽํ๏ʹ͍ͭͯఏҊ͢Δ
 ͜Ε͸ɼಈతܕݴޠͰ͋Δ&MJYJSͷܕͷಛੑͱɼ/*'ͱ͍͏&MJYJSͱωΠςΟϒίʔυͷؒͷ''*Λར ༻ͯ͠ɼܕݕࠪͱܕਪ࿦Λฒߦ࣮ͯ͠ߦ͢Δ͜ͱͰɼܕݕࠪͷ࠷దԽΛਤΔํࣜͰ͋Δ
 ࠓޙɼ࣮૷ͱੑೳධՁΛߦ͏ 1 ˜4VTVNV:BNB[BLJ
  2. &MJYJS ΤϦΫαʔ 
 1FMFNBZ ϖϨϝΠ 
 ͕ٻΊΒΕΔഎܠͱ͸ʁ 2 ˜4VTVNV:BNB[BLJ

  3. ৘ใྔരൃ ೥ʹσʔλͷ૯ྔ͕θλόΠτ ೥ʹθλόΠτʹୡ͢ΔݟࠐΈ 3 ˜4VTVNV:BNB[BLJ

  4. ৘ใྔരൃ ೥ʹຖ݄ΤΫαόΠτ૿Ճ ೥ʹຖ݄ΤΫαόΠτ૿ՃݟࠐΈ ৘ใͷ૿Ճྔ͕Ճ଎ 4 ˜4VTVNV:BNB[BLJ

  5. (Ͱ௨৴଎౓͸޲্͢Δ w (CQTΛ௒͑Δ௨৴ /55υίϞެࣜ  w (CQTΛ௒͑Δ௨৴Λୡ੒࣮ͨ͠ݧ݁Ռ͋Γ ӳޠ 8JLJQFEJB 

    w (ΑΓߴ͍प೾਺Λ༻͍Δ͜ͱ͔Βɼج஍ہ͔Βͷ࠷େ ڑ཭͕୹͍
 ˠج஍ہΛߴີ౓ʹઃஔ͠ͳ͍ͱ͍͚ͳ͍ w NTఔ౓ͷϨΠςϯγ ӳޠ8JLJQFEJB 5 ˜4VTVNV:BNB[BLJ
  6. ܭࢉೳྗ͕௥͍͔ͭͳ͍ )FOOFTZ1BUUFSTPO
 ೥ʹ$16ΫϩοΫप೾਺͸಄ଧͪʹ 6 ˜4VTVNV:BNB[BLJ

  7. ͳͥΫϩοΫप೾਺Λ৳͹ͤͳ͍͔ʁ w ΫϩοΫप೾਺ͷ૿େ͸ফඅిྗͱൃ೤ྔͷ૿େΛট͘ w ফඅిྗͱൃ೤ྔ͸ΫϩοΫप೾਺ʹൺྫɼిݯిѹͷ৐ʹൺྫɼ
 ΫϩοΫप೾਺Λ্͛Δͱిݯిѹ΋্͛Δඞཁ͕͋Δ w ిݯڙڅྔͱ೤఻ಋ཰͓Αͼྫྷ٫ೳྗ͕௥͍͔ͭͳ͍ w ʙ()[ఔ౓ͰৗԹͰ҆ఆಈ࡞͢ΔݶքΛܴ͍͑ͯΔ

    w ڝٕ༻ΦʔόʔΫϩοΫͰ͸ӷମ஠ૉ౳ʹਁ͚Δ౳ʹΑΓ()[Ҏ্ Ͱಈ࡞͍ͤͯ͞Δ w ௨ৗͷ1$΍αʔόʔͰ͸ৗԹՔಇͰ͖Δ͜ͱ͕ཁ݅ 7 ˜4VTVNV:BNB[BLJ
  8. ͔ΘΓʹίΞ਺͕૿Ճ w ೥Ҏ߱ͷ
 ϓϩηοαͷਐԽ w ºΫϩοΫप೾਺ w ˓ίΞ਺  ˜4VTVNV:BNB[BLJ

    *OUFM$PSF
 &YUSFNF9  $MPDL ()[ PG$PSFT  *OUFM$PSFJ
 9&  $MPDL ()[ PG$PSFT 
  9. (16 w࠷৽(16͸
 ()[Ҏ্ͷ
 ΫϩοΫप೾਺
  Ҏ্ͷ4*.%ίΞ  ˜4VTVNV:BNB[BLJ

  10. ,JMPDPSF w.*.%ํࣜίΞ w ϝϞϦϞδϡʔϧ w ONϓϩηεϧʔϧ w ࠷େ()[ 7 

    w 7࣌()[N8
 Q+໋ྩ w *OUFMJ΍/7*%*"(16ͱൺ΂ɼ 7࣌εϧʔϓοτഒҎ্ɼ
 ΤωϧΪʔޮ཰ഒҎ্  ˜4VTVNV:BNB[BLJ B. Bohnenstiehl et al., "KiloCore: A 32-nm 1000-Processor Computational Array," in IEEE Journal of Solid-State Circuits, vol. 52, no. 4, pp. 891-902, April 2017.
  11. 5IF$FSFCSBT8BGFS4DBMF&OHJOF 84& w ΢ΣϋʔαΠζͷνοϓ w ஹݸͷτϥϯδελ਺ w ล͕NN w (#ͷΦϯνοϓϝϞϦ

    wສίΞ w ফඅిྗL8  ˜4VTVNV:BNB[BLJ © 2019 Cerebras systems.
  12. ৘ใྔ૿େʴ௨৴଎౓޲্
 ˠٻΊΒΕΔܭࢉྔ૿େ ΫϩοΫप೾਺৳ͼ೰ΈʴίΞ਺૿େ
 ˠܭࢉྔΛ૿΍͢ʹ͸ฒྻॲཧ͕ඞཁ 12 ˜4VTVNV:BNB[BLJ

  13. 4IBSFE%BUB $PSF #1 $PSF2 3.14 ैདྷͷݴޠͷ໰୊఺ w ෳ਺ͷίΞͰσʔλΛڞ༗͠ ͍ͯΔͱԾఆ͢Δ 

    ˜4VTVNV:BNB[BLJ
  14. 4IBSFE%BUB $PSF #1 $PSF2 3.14 →1.5 ഁյతߋ৽͕ϘτϧωοΫ w ͋ΔίΞ͕ڞ༗σʔλΛ
 ഁյతߋ৽ͨ͠৔߹

    w ଞͷίΞʹ௨஌ͯ͠
 ॲཧΛࢭΊΔඞཁ͕͋Δ w ଎౓௿Լʹͭͳ͕Δ w ίΞ਺͕૿͑Ε͹૿͑Δ΄Ͳ
 ਂࠁͳӨڹΛ΋ͨΒ͢  ˜4VTVNV:BNB[BLJ 6QEBUF /PUJGZ 4UPQ1SPDFTTJOH
  15. 4IBSFE%BUB $PSF #1 $PSF2 3.14 &MJYJS͸શ͕ͯΠϛϡʔλϒϧͰ͋Δ w &MJYJSͰ͸σʔλͷഁյతߋ৽ ͕ൃੜ͢Δ͜ͱ͸ͳ͍ w

    ଞͷίΞͷॲཧΛࢭΊͳͯ͘ ྑ͍ w ίΞ਺͕૿͑ͯ΋ॲཧೳྗΛ ҡ࣋Ͱ͖Δ ‎ฒྻੑʹ༏ΕΔ  ˜4VTVNV:BNB[BLJ %PO`U
 6QEBUF %PO`UOFFEUP
 TUPQQSPDFTTJOH
  16. Elixir and Phoenix are the most promising solution for the

    Data Explosion problem Fedrecheski, G., Costa, L. C. P. and Zuffo, M. K.: Elixir programming language evaluation for IoT, 2016 IEEE International Symposium on Consumer Electronics (ISCE), pp. 105–106 (online), DOI: 10.1109/ISCE.2016.7797392 (2016). Java is defeated by highly frequent requests more than 1,200 Requests/sec Elixir endures highly frequent requests
 less than 1,800 Requests/sec Server: a quad-core computer with 6GB RAM Client: an eight-core computer with 12GB RAM ↑Slower ↓Faster
  17. &MJYJSͷಛ௃ w +PTÉ7BMJN͕։ൃ w 3VCZʹࣅͨจ๏Λ࣋ͪɼ3VCZPO3BJMTʹࣅͨ΢ΣϒϑϨʔϜϫʔΫ1IPFOJYΛ࣋ͭ w &SMBOHʹ༝དྷ͢Δฒྻॲཧੑೳͱ଱ো֐ੑ w -*41෩ͷϝλϓϩάϥϛϯά w

    ໋໊ͷ༝དྷ w ෆ࿝ෆࢮͷༀ ºϑΝΠφϧϑΝϯλδʔ ⚪+PTÉᐌ͘ʮΑ͍֮͑ͯ͘ͳ͍͕ɼ&SMBOHͱಉ͡&Ͱ࢝·Δޠײͷྑ͍ݴ༿͔ͩͬͨΒʯ &SMBOHͷ଱ো֐ੑ͕ɼෆ࿝ෆࢮͷΠϝʔδʹͭͳ͕͔ͬͨΒʁ 17 ˜4VTVNV:BNB[BLJ
  18. ˜4VTVNV:BNB[BLJ w ӈͷίʔυྫ w ͔Β  ·ͰͷϦετʹ w ֤ཁૉʹGPPΛద༻ Y

     w ֤ཁૉʹCBSΛద༻   w ͨ݁͠ՌΛಘΔ w ഁյతߋ৽ͳ͠Ͱ
 σʔλΛ্͔Βॱʹม׵͍ͯ͘͠
 ʮσʔλม׵ʯύϥμΠϜ w ಡΈ΍͘͢ɼอकੑʹ༏ΕΔ w ຊ࣭ඒͳͷͰʮષʯ 1..1_000_000 |> Enum.map(&M.foo(&1))
 |> Enum.map(&M.bar(&1))
 
 defmodule M do def foo( n ), do: n * 2 def bar( n ), do: n + 1 end &MJYJS;FOελΠϧ 18
  19. ˜4VTVNV:BNB[BLJ 19 w ࠷৽ͷ$16(16͸ϚϧνίΞΛ௒ ͑ͯϝχʔίΞ w ͜ͷίʔυ͸֤ཁૉؒʹґଘؔ܎͕ ͳ͘࠷େ  ฒྻͰ࣮ߦՄೳ

    w ͜ͷΑ͏ͳฒྻԽ༰қͳίʔυ
 ϒϩοΫΛݕग़ͯ͠ w ൃݟͨ͠ίʔυϒϩοΫΛฒྻԽ͢ ΔίʔυΛੜ੒ɾ࠷దԽ͢Δ w ຊൃදͷओ؟ ຊݚڀͷฒྻԽͷண؟఺ 1..1_000_000 |> Enum.map(&M.foo(&1))
 |> Enum.map(&M.bar(&1))
 
 defmodule M do def foo( n ), do: n * 2 def bar( n ), do: n + 1 end
  20. 1FMFNBZ4VQFS1BSBMMFMJTN wࢁ࡚ͱٱߐ͕೥͔Β։ൃ͠͸͡Ίͨ
 ฒྻॲཧܥ چ໊শ)BTUFHB  wएׯͷهड़ EFGQFMFNBZ Λ଍͚ͩ͢Ͱ$ݴޠ ͷωΠςΟϒίʔυΛੜ੒
 "VUP7FDUPSJ[BUJPOͰ$16ͷ4*.%໋ྩੜ੒

    wݱࡏ͸&OVNNBQͱ਺஋࢛ଇԋࢉΛαϙʔτ
 কདྷ͸&MJYJSશݴޠ࢓༷Λαϙʔτ༧ఆ wকདྷ͸$16(16Λϑϧ׆༻༧ఆ w࿦จ౤ߘ೥݄࣌఺Ͱόʔδϣϯ
 όοΫΤϯυίϯύΠϥ$MBOH wݱࡏ͸೥݄ެ։ͷόʔδϣϯ
 όοΫΤϯυίϯύΠϥ$MBOH ($$  ˜4VTVNV:BNB[BLJ ୯Ұ$16Ͱॲཧ def func(list) do
 list
 |> Enum.map(&foo(&1))
 |> Enum.map(&bar(&1))
 end ฒྻॲཧ EFGQFMFNBZEP
 EFGGVOD MJTU EP
 MJTU
 c&OVNNBQ GPP  
 c&OVNNBQ CBS  
 FOE
 FOE
  21. όʔδϣϯͷॲཧͷྲྀΕ w ݱࡏͷ࠷৽൛Ͱ͋Δόʔδϣϯ΋ಉ༷  &MJYJSʹඋΘ͍ͬͯΔϝλϓϩάϥϛϯάػߏʹΑΓEFGQFMFNBZEPʜFOEͷ۠ؒ Λೝࣝ͠ɼ1FMFNBZίϯύΠϥʹॲཧΛ౉͢  ۠ؒ಺ͷؔ਺ͱɼͦͷதʹهड़͞Ε͍ͯΔ&OVNNBQΛؚΉهड़ɼ&OVNNBQͷத ͷಗ໊ؔ਺Λೝࣝ͢Δ 

    /*'ͷελϒίʔυΛੜ੒͢Δ  ςϯϓϨʔτΛݩʹωΠςΟϒίʔυΛੜ੒͢Δ
 ͜ͷςϯϓϨʔτͰ͸"VUP7FDUPSJ[BUJPOͱ෼ذ༧ଌʹؔ͢ΔώϯτΛؚΉ$ݴޠ ίʔυʹͳ͍ͬͯΔ  $ݴޠίʔυΛ$MBOH όʔδϣϯͰ͸($$ʹ΋ରԠ ʹ౉ͯ͠ίϯύΠϧ͢Δ 21 ˜4VTVNV:BNB[BLJ
  22. ੜ੒ίʔυྫ 22 ˜4VTVNV:BNB[BLJ

  23. ੑೳධՁ؀ڥ ༧ߘఏग़࣌ 23 ˜4VTVNV:BNB[BLJ

  24. ੑೳධՁ ༧ߘఏग़࣌ J.BD1SPͰഒɼ3Z[FOͰഒ 24 ˜4VTVNV:BNB[BLJ 'BTUFS

  25. ༧ߘఏग़ޙʹ໌Β͔ʹͳͬͨࣄ࣮ w &MJYJS͕༻͍Δ&SMBOHΛίϯύΠϧ͢Δ$ίϯύΠϥʹΑͬͯɼ&OVN
 ϕϯνϚʔΫͷੑೳ͕େ͖͘ҟͳΔ w "QQMF$MBOH $MBOH $MBOH HDD HDDͰൺֱ

    w J.BD1SP"QQMF$MBOHɼHDD HDDͷํ͕$MBOHΑΓ ʙഒఔ౓଎͘ɼ$MBOHΑΓʙഒఔ౓଎͍ w 3Z[FOHDD HDDͷํ͕$MBOHΑΓʙഒఔ౓଎͘ɼ $MBOHΑΓഒఔ౓଎͍ w ݪҼʹ͍ͭͯ͸ɼݱࡏڀ໌த 25 ˜4VTVNV:BNB[BLJ
  26. ࠶ੑೳධՁͷํ਑ w &OVNͱ1FMFNBZͰ$ίϯύΠϥΛἧ͑ͯੑೳධՁ͢΂͖Ͱ͋Δ w $MBOH ($$ͱ΋ʹ೥݄ݱࡏͷ࠷৽TUBCMF൛ΛΧελϜϏϧυ͢Δ w $MBOHMMWNPSH w ($$HDD@@SFMFBTF

    w &MJYJS͕༻͍Δ&SMBOHΛ͍͔ͭ͘ͷ$ίϯύΠϥͰϏϧυ͢Δ w &SMBOH w ࠷దԽΦϓγϣϯΛ0GBTUͰἧ͑Δ w 1FMFNBZόʔδϣϯΛ༻͍ͯɼ&SMBOHͷϏϧυʹ༻͍ͨ$ίϯύΠϥΛ؀ڥม਺ $$Ͱ໌ࣔతʹࢦఆ࣮ͯ͠ߦ͢Δ 26 ˜4VTVNV:BNB[BLJ
  27. ੑೳධՁ ࠶ੑೳධՁ J.BD1SP$MBOHͰഒɼ3Z[FOͰഒ J.BD1SP($$Ͱഒɼ3Z[FOͰഒ 27 ˜4VTVNV:BNB[BLJ 'BTUFS

  28. ࠶ੑೳධՁͷߟ࡯ w &OVNͰ$MBOHͱ($$ͷ͕ࠩେ͖͍ͷʹର͠ɼ 1FMFNBZ͸͕ࠩ΄ͱΜͲͳ͍ w $MBOHͷ"VUP7FDUPSJ[BUJPO͸໌ࣔతʹ࠷దԽΛࢦࣔ ͠ͳ͍ͱ༗ޮʹͳΒͳ͍ͷʹର͠ɼ($$ͷ͸Մೳͳݶ Γੵۃతʹ࠷దԽ͢ΔΑ͏Ͱ͋Δ w 1FMFNBZ͕ੜ੒ͨ͠$ݴޠίʔυ͕$MBOHʹରͯ͠ॆ෼ͳ

    ίʔυ࠷దԽώϯτΛఏࣔͰ͖͍ͯΔ͜ͱΛ͍ࣔͯ͠ΔՄ ೳੑ͕ߴ͍ 28 ˜4VTVNV:BNB[BLJ
  29. όʔδϣϯͰ࠾༻༧ఆͷ࠷దԽ͞Εͨܕݕࠪ w ίʔυੜ੒ͷํࣜΛେ෯ʹݟ௚͠ɼॊೈͳίʔυੜ੒ΛਤΕΔΑ͏ ʹ͢Δ༧ఆͰ͋Δ w ࠷΋ಛ௃తͳ৽ػೳ͸ɼ࠷దԽ͞Εͨܕݕࠪ w ࣍ͷͭΛར༻͢Δ w ಈతܕݴޠͰ͋Δ&MJYJSͷܕͷಛੑ

    w /*'ͱ͍͏&MJYJSͱωΠςΟϒίʔυͷؒͷ''*Λར༻ w ܕݕࠪͱܕਪ࿦Λฒߦ࣮ͯ͠ߦ͢Δ͜ͱͰɼܕݕࠪͷ࠷దԽΛਤΔ 29 ˜4VTVNV:BNB[BLJ
  30. ܕݕࠪͷ࠷దԽͷඞཁੑ w &MJYJS͸ಈతܕ෇͚ݴޠͰ͋Γɼ$͸੩తܕ෇͚ݴޠͰ͋Δ w /*'Λ۪௚ʹ࣮૷ͨ͠৔߹ w ܕΛܾΊଧͪʹͯ͠஋ΛऔΓग़͢ˠܕ҆શͰ͸ͳ͍ w Մೳੑͷ͋Δ͢΂ͯͷܕʹ͍ͭͯܕݕࠪΛ͔ͯ͠Β஋Λ औΓग़͢ˠܕ҆શͰ͋Δ͕ɼ࣮ߦޮ཰͕ѱ͍

    w ͦ͜Ͱɼ࠷దԽͨ͠ཁྖͰܕݕࠪΛߦ͍ɼܕ҆શੑΛอূ ͭͭ͠ɼ࣮ߦޮ཰Λվળ͢Δ͜ͱΛߟ͑Δ 30 ˜4VTVNV:BNB[BLJ
  31. όʔδϣϯͷॲཧͷྲྀΕ  &MJYJSʹඋΘ͍ͬͯΔϝλϓϩάϥϛϯάػߏʹΑΓEFGQFMFNBZEPʜ FOEͷ۠ؒΛೝࣝ͠ɼ1FMFNBZίϯύΠϥʹॲཧΛ౉͢  ۠ؒ಺ͷؔ਺ͱɼͦͷதʹهड़͞Ε͍ͯΔ&OVNNBQΛؚΉهड़ɼ &OVNNBQͷதͷಗ໊ؔ਺Λೝࣝ͢Δ  /*'ͷελϒίʔυΛੜ੒͢Δ
 ͦͷࡍɼܕΤϥʔճ෮ͷͨΊͷίʔυΛੜ੒͢Δ

     ;&".*3Λੜ੒͠ɼͦΕʹج͍ͮͯωΠςΟϒίʔυΛੜ੒͢Δ
 ͦͷࡍɼܕݕࠪΛ࠷దԽ͠ɼ"VUP7FDUPSJ[BUJPOͱ෼ذ༧ଌʹؔ͢Δ ώϯτΛؚΉίʔυΛੜ੒͢Δ  $ݴޠίʔυΛ$MBOH΋͘͠͸($$ʹ౉ͯ͠ίϯύΠϧ͢Δ 31 ˜4VTVNV:BNB[BLJ
  32. όʔδϣϯͷॲཧͷྲྀΕ  &MJYJSʹඋΘ͍ͬͯΔϝλϓϩάϥϛϯάػߏʹΑΓEFGQFMFNBZEPʜ FOEͷ۠ؒΛೝࣝ͠ɼ1FMFNBZίϯύΠϥʹॲཧΛ౉͢  ۠ؒ಺ͷؔ਺ͱɼͦͷதʹهड़͞Ε͍ͯΔ&OVNNBQΛؚΉهड़ɼ &OVNNBQͷதͷಗ໊ؔ਺Λೝࣝ͢Δ  /*'ͷελϒίʔυΛੜ੒͢Δ
 ͦͷࡍɼܕΤϥʔճ෮ͷͨΊͷίʔυΛੜ੒͢Δ

     ;&".*3Λੜ੒͠ɼͦΕʹج͍ͮͯωΠςΟϒίʔυΛੜ੒͢Δ
 ͦͷࡍɼܕݕࠪΛ࠷దԽ͠ɼ"VUP7FDUPSJ[BUJPOͱ෼ذ༧ଌʹؔ͢Δώϯ τΛؚΉίʔυΛੜ੒͢Δ  $ݴޠίʔυΛ$MBOH΋͘͠͸($$ʹ౉ͯ͠ίϯύΠϧ͢Δ 32 ˜4VTVNV:BNB[BLJ
  33. ܕݕࠪͷ࠷దԽͷΞΠσΞ  w &MJYJSͷม਺͸ɼ಺෦తʹ͸&3-@/*'@5&3.ܕͷม਺ͱ ͯ͠ɼ࣮ࡍͷܕͷ৘ใͱͱ΋ʹهԱ͞Ε͍ͯΔ w FOJG@JT@ ؔ਺Ͱ&3-@/*'@5&3.ͷม਺ͷܕݕࠪΛߦ͑Δ w FOJG@HFU@

    ؔ਺Λ༻͍ͯ&3-@/*'@5&3.͔Β$ݴޠͷ஋ ΛಘΒΕΔ͕ɼͦͷࡍʹܕݕࠪΛಉ࣌ʹߦ͑Δ w FOJG@NBLF@ ؔ਺Λ༻͍ͯɼ$ݴޠͷ஋͔Β &3-@/*'@5&3.ܕͷม਺Λੜ੒͢Δ 33 ˜4VTVNV:BNB[BLJ
  34. ܕݕࠪͷ࠷దԽͷΞΠσΞ  w ਺Ͱ͸ͳ͍ܕͷม਺ΛಘΔ৔߹͸ɼFOJG@JT@ Λলུͯ͠ ࠷ॳ͔ΒFOJG@HFU@ Λߦ͏͜ͱͰɼܕݕࠪͷճ਺ΛݮΒ ͤΔ w ਺ͷܕͷ৔߹ʹ͸ɼ΋ͦ͠ͷ਺ͷ஋͕Ϗοτͷූ߸

    ෇ɾූ߸ͳ͠ͷ੔਺ͷൣғΛ͑ͨ͜੔਺஋Ͱ͋Δͱ͖ʹ ͸ɼFOJG@JT@OVNCFSͰਅΛฦ͢΋ͷͷɼFOJG@HFU@ Ͱ੔ ਺΍ුಈখ਺఺਺ʹม׵Ͱ͖ͳ͍ͷͰɼ͜ͷ৔߹͸/*'Ͱ ͸ѻ͑ͳ͍ͷͰɼద੾ʹॲཧ͢Δඞཁ͕͋Δ 34 ˜4VTVNV:BNB[BLJ
  35. ܕݕࠪͷ࠷దԽͷΞΠσΞ  w ϦετͰɼશͯͷཁૉͷܕ͕ಉҰͷܕ ୯Ұཁૉܕ Ͱ͋Δ ͱ͖ʹ͸ཁૉͷܕݕࠪΛলུ͢Δ࠷దԽΛద༻Ͱ͖Δ w ϦετͰɼ΄ͱΜͲͷཁૉͷܕ͕ಉҰͷܕͰ࣌ʑҟͳΔܕ ͕ࠞ͡Δ

    Ұ෦ෳ߹ཁૉܕͰ͋Δ ͱ͖ʹ͸ɼϏοτϕΫλ Λ༻͍Δ͜ͱͰཁૉͷܕݕࠪΛ࠷దԽͰ͖Δ w &MJYJSͷϦετΛ$ݴޠͷ഑ྻʹม׵ͯ͠ѻ͏ͱ͖ɼলϝϞ Ϧ΍4*.%໋ྩ׆༻ͷ؍఺͔Β͸ɼ੔਺஋ͷൣғΛݟۃΊ ͯɼͰ͖Δ͚ͩϏοτ෯ͷখ͍͞஋Ͱදͨ͠ํ͕ྑ͍ 35 ˜4VTVNV:BNB[BLJ
  36. ࠷దԽ͞ΕͨܕݕࠪͷΞϧΰϦζϜͷ֓ཁ  w ༩͑ΒΕͨҾ਺ͦΕͧΕʹ͍ͭͯܕݕࠪΛߦ͍ͬͯ͘ w Ҿ਺͕ۭϦετͰ͋ͬͨ৔߹͸ɼۭϦετͱͯ͠ѻ͏ w Ҿ਺͕ൣғܕͰ͋ͬͨ৔߹͸ɼ࢝఺͔Βऴ఺·Ͱͷ੔਺ Λཁૉͱͯ࣋ͭ͠୯Ұཁૉܕͷ੔਺Ϧετͱͯ͠ѻ͏ w

    Ҿ਺͕ϦετͰ͋ͬͨ৔߹ʹ͸ɼୈཁૉ͔Βॱ൪ʹܕݕ ͍͖ࠪͯ͠ɼܕͷස౓Λه࿥͍ͯ͘͠ɻ੔਺ܕͩͬͨ৔߹ ʹ͸஋ͷൣғ΋ه࿥͍ͯ͘͠ 36 ˜4VTVNV:BNB[BLJ
  37. ࠷దԽ͞ΕͨܕݕࠪͷΞϧΰϦζϜͷ֓ཁ  w ΋͠୯ҰཁૉܕͰ͋ͬͨ৔߹ʹ͸ɼҎޙɼ͜ͷϦετͷཁૉʹؔ͢Δܕݕࠪ͸লུͰ͖Δ w ͞Βʹཁૉͷܕ͕਺ͩͬͨ FOJG@JT@OVNCFSͰਅͰ͋Δ ৔߹ɼුಈখ਺఺਺ܕͰ͋Ε ͹ɼFOJG@HFU@EPVCMFΛ༻͍ͯEPVCMFܕͷ഑ྻʹม׵͢Δ w

    ͦ͏Ͱͳ͍৔߹͸੔਺ܕͰ͋Δͱߟ͑Δɻ੔਺஋ͷൣғ͕ɼJOUܕɼVOTJHOFEJOUܕɼ MPOHܕɼVOTJHOFEMPOHܕɼ&SM/JG*OUܕ ූ߸෇Ϗοτ੔਺ܕ ɼ&SM/JG6*OUܕ ූ߸ͳ͠Ϗοτ੔਺ܕ ͷॱͰܕݕࠪΛͯ͠஋͕ऩ·ΔͷͰ͋Ε͹ɼͦΕͧΕͷܕ ͷ഑ྻʹม׵Ͱ͖Δ w ੔਺஋ͷൣғ͕ऩ·Βͳ͍৔߹ʹ͸ɼ/*'Ͱѻ͏͜ͱ͕Ͱ͖ͳ͍ͷͰɼܕΤϥʔͱ͢ Δɻ͜ͷޙɼ&MJYJSଆͰΤϥʔճ෮͢ΔͨΊͷίʔυΛ࣮ߦ͢Δ w ཁૉͷܕ͕ϦετͰ͋Δ৔߹ʹ͸ɼଟ࣍ݩ഑ྻʹม׵͢Δ w ཁૉͷܕ͕ͦΕҎ֎ͷ৔߹͸ɼ౰ͯ͸·ΔܕΛه࿥্ͨ͠Ͱɼ&3-@/*'@5&3.ͷ·· ه࿥͢ΔɻҎޙ͸͜ͷه࿥ͨ͠ܕͰ͋Δ΋ͷͱͯ͠ɼඞཁʹԠͯ͡஋ΛऔΓग़͢ 37 ˜4VTVNV:BNB[BLJ
  38. ࠷దԽ͞ΕͨܕݕࠪͷΞϧΰϦζϜͷ֓ཁ  w Ҿ਺͕ϦετͰ͋ͬͨ৔߹ʹ͸ɼୈཁૉ͔Βॱ൪ʹܕݕࠪͯ͠ ͍͖ɼܕͷස౓Λه࿥͍ͯ͘͠ɻ੔਺ܕͩͬͨ৔߹ʹ͸஋ͷൣғ ΋ه࿥͍ͯ͘͠ w ΋͠Ұ෦ෳ߹ཁૉܕͰ͋Δ৔߹ʹ͸ɼ഑ྻʹରԠ͢ΔϏοτ ϕΫλΛ༻ҙ͠ɼϏοτ஋͕ͷ࣌ʹ͸ଟ͘ͷ৔߹ʹ౰ͯ͸· ΔํͷܕͰ͋Δͱͯ͠ܕݕࠪΛলུ͠ɼϏοτ஋͕ͷ࣌ͷΈ

    &3-@/*'@5&3.ͷ··ه࿥ͯ͠ܕݕࠪΛߦͬͯ஋ΛऔΓग़͢ w ҟͳΔܕ͕׬શʹࠞࡏ͢Δ ෳ߹ཁૉܕͰ͋Δ ৔߹ʹ͸ɼ &3-@/*'@5&3.ͷ഑ྻͱͯ͠อ࣋͠ɼ஋ͷऔΓग़͠ͷࡍʹܕ ݕࠪΛߦ͏ 38 ˜4VTVNV:BNB[BLJ
  39. ࠷దԽ͞ΕͨܕݕࠪͷΞϧΰϦζϜͷ֓ཁ  w Ҿ਺͕ൣғܕͰͳ͍ϚοϓͰ͋Δ৔߹ʹ͸ɼ &3-@/*'@5&3.ͷ··ه࿥͠ɼ౎౓ FOJG@HFU@NBQ@WBMVFΛ༻͍ͯ஋ΛऔΓग़͢ w Ҿ਺͕ͦΕҎ֎ͷܕͰ͋ͬͨ৔߹ʹ͸ɼରԠ͢Δܕͷม ਺ͰऔΓग़͢ 39

    ˜4VTVNV:BNB[BLJ
  40. ίʔυྫͷ঺հ 40 ˜4VTVNV:BNB[BLJ

  41. &MJYJSʹ͓͚Δ$ݴޠίʔυੜ੒ɾ࠷దԽͷࢼΈ ๺۝भࢢཱେֶࢁ࡚ਐɹٱߐ༤ت  զʑ͸1FMFNBZ4VQFS1BSBMMFMJTNͱশ͢Δؔ਺ܕݴޠ&MJYJS͔Β$ݴޠ΁ͷίʔυੜ੒ɾ࠷దԽΛ ߦ͏ॲཧܥΛݚڀ։ൃ͍ͯ͠Δ
 ͜Ε͸ɼ&MJYJSʹ͸&MJYJSͷίʔυΛ"45ʹม׵͢Δػߏ͕උΘΔ͜ͱΛར༻͠ɼฒྻԽՄೳͳίʔυ Λݕग़ͯ͠$ݴޠίʔυΛੜ੒͠ɼ"VUP7FDUPSJ[BUJPOΛར༻ͯ͠4*.%ฒྻԽΛߦ͏ॲཧܥͰ͋Δ  ೥݄ʹެ։ͨ͠όʔδϣϯͰ͸ɼ͋Β͔͡ΊςϯϓϨʔτͱͯ͠ఆٛ͞Εͨ$ݴޠίʔ υʹίʔυΛຒΊࠐΉํࣜͷίʔυੜ੒Λ࣮૷͠ɼݩͷ&MJYJSίʔυͱൺ΂ͯ໿ഒͷߴ଎Խ͕ਤΕͨ

     ೥݄ݱࡏݚڀ։ൃதͷόʔδϣϯܥྻͰ͸ɼίʔυੜ੒ͷํࣜΛେ෯ʹݟ௚͠ɼॊೈ ͳίʔυੜ੒ΛਤΕΔΑ͏ʹ͢Δ༧ఆͰ͋Δ  ຊൃදͰ͸ɼͦͷதͰ࠷΋ಛ௃తͳܕݕࠪͷ࠷దԽํ๏ʹ͍ͭͯఏҊ͢Δ
 ͜Ε͸ɼಈతܕݴޠͰ͋Δ&MJYJSͷܕͷಛੑͱɼ/*'ͱ͍͏&MJYJSͱωΠςΟϒίʔυͷؒͷ''*Λར ༻ͯ͠ɼܕݕࠪͱܕਪ࿦Λฒߦ࣮ͯ͠ߦ͢Δ͜ͱͰɼܕݕࠪͷ࠷దԽΛਤΔํࣜͰ͋Δ
 ࠓޙɼ࣮૷ͱੑೳධՁΛߦ͏ 41 ˜4VTVNV:BNB[BLJ