<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html lang="ja"> 
  <HEAD>
    <title>Akihito Nagata's Page</title> 
    <link rel="stylesheet" href="stylesheet.css" type="text/css">
    <META http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
     <META http-equiv="Content-Style-Type" content="text/css">
    <meta name="robots" content="all">
     <LINK rel="INDEX" href="./index.html">
  </HEAD>
  <body>
    <h1>Introduction</h1>
    <h2>Background</h2>
    Schemeはプログラミング言語Lispの方言として定義される。
    Schemeは簡潔な文法で記述力が高い。実行時に動的に型のチェックが行われるので安全に実行することができる。
    JVMはバイトコードで書かれたプログラムを実行するための実行環境であり、今や多く広まっておりほとんどのarchitecture上で動かすことができる。このためバイトコードで書かれたプログラムは「Write once,Run anywhere」の言葉に表されるようにどのarchitectureでも動かすことができる。
    SchemeをJavaに変換するということはSchemeの表現力と安全性を持ったまま、JVMの持つポータビリティを受け継ぐことができる。またSchemeで扱うデータのガーベジコレクションもそのままJVMのGCを使うことができる。
    <h2>static or dynamic typing</h2>
    プログラムを安全に実行するためにはデータへの不正なアクセスを防ぐ必要がある。それを実現する方法の一つとして式に型を定義しその情報を用いることでデータへのアクセスの正当性を確かめることができるおうになる。型システムには以下にのべる静的な型検査と動的な型検査がある。<br>
    <ul>
      <li><h3>Static Typing</h3>
    静的な型検査とはML,Javaに代表されるやりかたで、コンパイル時にプログラム中の全ての表現に対して型を推論し、その型に対して不正なアクセスをしている箇所検出しそのプログラムを拒否することができる。これによりプログラマは実行前にバグを発見し訂正することができるようになる。静的な型検査の場合には安全な実行ができるだけではなく実行時には型検査とデータに付加する情報をいくらか減らすことができるので効率のよい実行が可能となる。<br>
しかしコンパイル時に型情報を得るためにはプログラム言語の文法に制限を加える必要がある。型の情報を多くするにはそれだけ文法を制限しなくてはならない。この場合、言語としての表現力は下がりプログラマーはまずこの型システムについて学ばなくてはならない。</li>
      <li><h3>Dynamic Typing</h3>
	動的な型検査とはLisp,scheme,perlなどに代表されるやりかたでプログラム中で扱われる全てのデータには型情報が付加され実行中にこのデータを利用し安全性を確かめながら実行する。この場合は全てのデータに型の領域を付加しなければならない上に演算を行う度に型の検査を行う必要があるので実行効率は下がることになる。<br>
	しかし実行中にも情報を保持しているため、コンパイル時に型検査の行われるプログラミング言語の場合は正当なプログラムであっても型の制限のために拒否されることとなり得るが、動的に型を検査するプログラムの場合は内容に誤りのあるプログラムでも実行中に誤りを検出すればよいのでコンパイル中に拒否する必要はない。
  つまり実行時に情報を持つことで言語に課せられる制限は少なくなり表現力のある文法を設計することができる。
      </li>
    </ul>
    <h2>Scheme to Java</h2>
    SchemeをJavaに変換するには静的な型システムをもつJavaを用いてSchemeの動的な型システムを実現しなくてはならない。またSchemeはlambda関数を局所的に定義でき、関数も一つのデータとして扱うことができる。
    しかしjavaの型システムは静的なものしかないのでjavaのクラスを利用してschemeの動的な型システムを実現する。プログラム中に現れる式を全てオブジェクトにし、基底となるオブジェクトで全ての受け渡しを行いプリミティブの関数を適用する際に望んでいるデータを取り出すために型チェックに相当するダウンキャストを行うKawaなどではこの方法で実現されている。<br>
    しかしこれでは全ての演算のためにダウンキャストをしまた全ての演算結果に対してオブジェクトを生成しなくてはならない。<br>
    Schemeでも静的な型推論を利用することにより式の型を確定することができる。この静的な型推論で型が確定する場合は型の動的なチェックが必要無くなる。
  </body>
</html>

 