scm2js -- Scheme to JavaScript Translator

2,230 views

Published on

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
2,230
On SlideShare
0
From Embeds
0
Number of Embeds
51
Actions
Shares
0
Downloads
0
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

scm2js -- Scheme to JavaScript Translator

  1. 1. <ul><ul><li>scm2js </li></ul></ul><ul><ul><li>〜 Scheme to Javascript Translator 〜 </li></ul></ul><ul><ul><li>mokehehe </li></ul></ul>'09/04/05
  2. 2. scm2jsとは? <ul><li>SchemeからJavaScriptへのソーストランスレータ </li></ul><ul><li>Githubにて絶賛未完成放置中 </li></ul><ul><ul><li>http://github.com/mokehehe/scm2js/tree/master </li></ul></ul><ul><li>Web上で動くデモ </li></ul>
  3. 3. 動機 <ul><li>Google Chromeがリリースされたころ </li></ul><ul><li>「速いっていう話だからなんかブラウザで動くもの作りたい」 </li></ul><ul><li>「でもJavaScriptあんま好きじゃないんだよなぁ…」 </li></ul><ul><li>「文法似てるからSchemeからトランスレートしたらいんじゃね?」 </li></ul>
  4. 4. SchemeとJavaScript <ul><li>置き換えで充分 </li></ul><ul><li>けどそれだとcall/ccは実現できない ->  とりあえず無視 </li></ul>
  5. 5. Schemeでトランスレータを実装 <ul><li>Gauche上で開発 </li></ul><ul><li>scmのソースを食わせてjsのソースを出力、ブラウザでリロードして確認 -> メンドイ… </li></ul><ul><li>BiwaSchemeがあるじゃない! </li></ul>
  6. 6. BiwaScheme <ul><li>yhara氏が作られた、JavaScriptで書かれたScheme処理系 </li></ul><ul><li>ブラウザ上で動かすことができる </li></ul><ul><li>仕様をほぼ実装してる、Guacheで作ってたプログラムがほとんどそのまま動いた!すげぇ! </li></ul>http://mono.kmc.gr.jp/~yhara/w/?BiwaScheme
  7. 7. BiwaScheme上で トランスレータを動かし実行 <ul><li>ブラウザのjs上で動くScheme処理系であるBiwaSchemeで、 </li></ul><ul><li>Schemeで書かれたscm->jsトランスレータを動かして、 </li></ul><ul><li>scmソースをトランスレート -> jsソース「文字列」が出力される </li></ul><ul><li>ブラウザのjs上でeval -> 実行 </li></ul>
  8. 8. Scm2js の行ってる トランスレート作業
  9. 9. リテラル <ul><li>ほとんど BiwaScheme のデータ構造を使用 </li></ul>
  10. 10. 変数参照 <ul><li>グローバル変数じゃなければ名前をそのまま使う </li></ul><ul><li>グローバル変数だったら、jsランタイムの特定オブジェクトのメンバ変数参照に </li></ul>
  11. 11. quote <ul><li>ペア以外はリテラルをそのまま出力 </li></ul><ul><li>ペアの場合は、consするコードを出力 </li></ul>
  12. 12. if <ul><li>値を返すため、jsの3項演算子 (a ? b : c) を使う </li></ul><ul><li>else部がない場合は undefined を返すコード </li></ul>
  13. 13. lambda <ul><li>基本的には(lambda (仮引数) 本体)を (function (仮引数) {本体})に置き換えるだけ </li></ul><ul><li>本体の最後の式に return をつける </li></ul><ul><li>内部defineは、var 変数名 = 値; に </li></ul><ul><li>任意長引き数を受け取る処理 </li></ul><ul><li>スコープ、環境の保存などはjsがやってくれるのでなにもしてない </li></ul>
  14. 14. define, set! <ul><li>変数名 = 値; に変換 </li></ul>
  15. 15. 関数適用 <ul><li>(func a b c) -> func(a, b, c) に置き換え </li></ul><ul><li>四則演算(+-*/)と比較演算子(<>=)は中置記法に変換 </li></ul><ul><ul><li>-と/は単項演算子のケースも考慮 </li></ul></ul>
  16. 16. マクロ <ul><li>begin, condなど、任意長引数が必須 </li></ul><ul><li>BiwaSchemeでは扱えなかった(当時) </li></ul><ul><ul><li>3impの論文ではその辺が省略されていて、組み込むには結構修正が必要 </li></ul></ul><ul><li>BiwaSchemeを改造して関数が任意長の引数を受け取れるよう変更 </li></ul>
  17. 17. 動作デモ
  18. 18. 残りの作業
  19. 19. 最終目標:セルフホスティング <ul><li>JavaScriptで書かれたBiwaScheme上で動かす -> オーバーヘッドが大きい </li></ul><ul><li>自分で自分自身をトランスレートしてjsに変換しておいて、トランスレータを動かしたい -> セルフホスティングできたらカコイイ! </li></ul><ul><li>未だバグありでちゃんと動いてない </li></ul><ul><ul><li>マクロがあると、BiwaSchemeの実行内部からさらにBiwaSchemeを呼び出す必要がある </li></ul></ul><ul><ul><li>マクロがどの層で動いてるのか自分でもわからなくなる </li></ul></ul>
  20. 20. 思わぬ壁 <ul><li>Git, githubの使い方がわからない、助けて! </li></ul>以上、ありがとうございました

×