view before_s6/2013/old/2013_12_17.html @ 5:ab2d529bb1d7

add slide
author Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
date Tue, 14 Oct 2014 19:17:35 +0900
parents 2013/old/2013_12_17.html@845ff8ff4fc9
children
line wrap: on
line source

<!DOCTYPE html>
<html>
  <head>
    <meta charset='utf-8'>
    
    <script src='./trunk/slides.js'></script>
    <script src='./mytrunk/customSlides.js'></script>
  </head>

  <body style='display: none'>
    <section class='slides layout-regular template-default'>

      <article>
	<h1>CbCコンパイラのLLVM3.4 → 3.5上での実装</h1>
        <p><br>Kaito Tokumori<br>December 17, 2013</p>
      </article>
      <article>
	<h3>研究目的</h3>
	<p> 当研究室ではプログラムをコードセグメント、データセグメントという単位を用いて書くという手法を提案している。その手法を用いてプログラミングを行う言語として"CbC"の開発を行っており、これはCの下位の言語である。CbCにおいてコードセグメント間の移動はgoto文を用いた軽量継続によって行われ、これはTail Call Eliminationという最適化の強制によって実現される。</p>
	<p>本研究過去に開発されたmicro-c,GCC版のコンパイラに続くLLVM/Clang上でのCbCコンパイラの開発を行う。</p>
      </article>

      <article>
	<h3>今回したこと</h3>
	<ul>
	  <li>環境付き継続に使用する__CbC_env構造体の自動生成。</li>
	  <li>__returnの実装。</li>
	  <li>LLVM/clang 3.4 から 3.5へアップデート<a href="javascript:jumpSlides(10)">.</a></li>
	</ul>
      </article>

      <article>
	<h3>__CbC_envの自動生成</h3>
	<ul>
	  <li>"__code"を見つけた時に自動的に生成するようにした。<ul>
	      <li>"__code"が宣言された時の処理を一旦置いといて先に構造体を作りに行く感じ。</li>
	  </ul></li>
	  <li>生成前に現在のスコープを確認して、global でない場合には生成しないように。<ul>
	      <li>へんなとこに作らないように。</li>
	  </ul></li>
	</ul>
      </article>

      <article>
	<h3>__returnの実装 (1)</h3>
	<ul>
	  <li>__returnを確認したらcode segmentへのポインタ型を宣言。</li>
	  <li>'__CbC_return'という変数名に。(__returnは使用できない)</li>
	  <li>__returnをキーワードとして登録せずにidentifierを読む度にチェックして__returnのときにはどうこうするーの方が良い?</li>
	  <li>名前テーブルからkw___returnを削除してidentifierとして再登録もいいかもしれない。そうしたら後は放っといてもidentifierとして処理される。</li>
	  <li>これらについては__environmentにも同じことが言える。</li>
	</ul>
      </article>

      <article>
	<h3>__returnの実装 (2)</h3>
	<object data="with_env_ex1.svg" type="image/svg+xml"></object>
      </article>

      <article>
	<h3>__returnの実装 (3)</h3>
	<object data="with_env_ex2.svg" type="image/svg+xml"></object>
      </article>

      <article>
	<h3>__returnの実装 (4)</h3>
	<object data="with_env_ex3.svg" type="image/svg+xml"></object>
      </article>

      <article>
	<h3>__returnの実装 (5)</h3>
	<ul>
	  <li>キーワードとして登録せずにidentifierが__returnである度にチェックするなら、Scopeの判別にgetCurScope()が使える。関数内部の時だけ生成であとは普通のidentifierにすればいいはず。</li>
	</ul>
      </article>

      <article>
	<h3>次回課題</h3>
        <ul>
          <li>環境付き継続実装継続<ul>
	      <li>__return宣言時の処理</li>
	      <li>__environment宣言時の処理</li>
	      <li>元の環境に戻る関数(return1)の生成</li>
	      <li>環境付き継続元の関数内でのsetjmpを使った構文の生成</li>
	  </ul></li>
        </ul>
      </article>

      <article>
	<h3>LLVMのお話</h3>
        <ul>
          <li>LLVMというのはプロジェクトの名前で、コンパイラやツールチェーン技術を開発するプロジェクト。</li>
          <li>単にLLVMというとLLVM Coreの事を指し、これはコンパイラの基板となるライブラリの集合。</li>
          <li>仮想機械を持ち、それをターゲットとした言語(LLVM IR)で書かれたプログラムの実行、最適化が可能。</li>
          <li>LLVM IRから特定のターゲットの機械語に変換することもできる。</li>
          <li>特定の言語をLLVMが受け付ける形に変換することができればLLVMの最適化機能や機械語への変換機能を利用できる。</li>
        </ul>
      </article>

      <article>
	<h3>clangのお話</h3>
        <ul>
          <li>C/C++/Obj-C コンパイラで、LLVMを使用する。</li>
          <li>clang側でC/C++/Obj-CをLLVM IRにして、そこから先はLLVMを利用してターゲットの機械語に変換する。</li>
          <li>最適化とかもLLVMを用いる。</li>
        </ul>
      </article>

      <article>
	<h3>たとえば clang auaua.cとかauaua.cppとかやった場合</h3>
	<br><br>
	<p align="center"><image src="LLVM_clang.png"></image></p>
	<p>clangがC/C++/Obj-CをLLVM IRにして、それからLLVM Core libraryを利用してmachine codeにする。</p>
      </article>

      <article>
	<h3>CbCのお話(1)</h3>
        <ul>
          <li>Continuaiton based Cの略で当研究室で開発中の言語。</li>
          <li>プログラムをcode segmentとdata segmentの二種に分けるという考え方を用いる。</li>
          <li>Cの関数呼び出しの代わりにgotoによる継続を使って処理を制御する。</li>
          <li>CbCのコンパイラとしては現在Micro-C,GCC上のものがある。</li>
        </ul>
      </article>

      <article>
	<h3>CbCのお話(2)</h3>
        <ul>
          <li>CbCではcode segmentを__codeというキーワードを使って宣言する。</li>
          <li>継続は"goto code_segment_name();"というように関数呼び出しのように行う。</li>
          <li>継続時に環境を破棄するので、継続先から戻ってくることはない。戻り値も返さない。</li>
        </ul>
      </article>

      <article>
	<h3>環境付き継続について(1)</h3>
	<p align="center"><image src="continuation_with_environment.png" ></image></p>
        <ul>
          <li>通常、CbCでは継続時に継続前の環境を保持しない。つまり継続前の環境に戻ることができない。</li>
          <li>戻れないということはCの関数の途中でcode segmentにgotoしてその後に何らかの処理をするというようなことができない。</li>
          <li>Cとの互換性を持つために環境を保持した継続が必要。</li>
        </ul>
      </article>

      <article>
	<h3>環境付き継続について(2)</h3>
	<p align="center"><image src="continuation_with_environment2.jpg" ></image></p>
        <ul>
          <li>環境付き継続があればこのように正しく戻れる。</li>
          <li>環境付き継続は"__return","__environment"という変数を用いて行う。</li>
          <li>"__return"は元の環境に戻るためのcode segmentへのポインタ,"__environment"は環境を保持する役割を持つ。</li>
        </ul>
      </article>

      <article>
	<p><a href="javascript:jumpSlides(4)">goto mainPresentation();</a></p>
      </article>

    </section>
  </body>
</html>