Scala

ScalaのArrayとArrayBuffer

SwiftのArrayがおかしいって話があったので、たぶん、Scalaなら美しいだろうと思って調べてみました。 package s object main extends App { val a = Array(1,2,3) var b = a a(1) = 33 b(0) = 55 b = b :+ 2 var b2 = b :+ 2 println(a.mkString(" . ")) pr…

部分的型付け

多相型推論をする言語を作りたいのですが、その前に部分的型付けを勉強しておきたい所です。TAPLのrcdsubbot*1から型付け部分だけ抜き出して名前をオレオレに変換してScalaで書いてみました。TopはScalaでいうとAny型で、どんな型でもTopの子になります。Bot…

λで前方参照

Cっぽいλ計算にトポロジカルソートを利用した前方参照を付けてみました。 トップレベルだけは、前方参照できます。 main=mul(add(1)(2))(3) add=(a)=>(b)=>a+b mul=(a)=>(b)=>a*b なプログラムがちゃんと動きます。 以下ソースです。 package C2E7 import ut…

トポロジカルソート

前方参照できる型推論をするには依存関係を調べて順番に並べる必要があります。 どう調べたら良いのかと調べてたらトポロジカルソートをするのが基本みたいでした。https://gist.github.com/ThiporKong/4399695tsort.scalaで検索したら凄く短いけど、分から…

C2E6

いい加減な実装ですけど、関数を追加しました。ラムダ計算だと簡単に追加出来ていいです。 {val add = (a)=>(b)=>a+b; add(1)(2)} 1+2=3を計算出来ます。{(a)=>(b)=>a+b}(1)(2)だと名前無しで実行出来る。ひたすら手計算で環境をああしてこうしてって考えて…

C2E

C言語様な言語をML様な言語に変換するプログラムを作ってみました。 package C2E trait C case class CInt(a:Int) extends C case class CId(a:String) extends C case class CAdd(a:C,b:C) extends C case class CVal(a:String, b:C) extends C case class …

Scalaのパーサコンビネータで右結合

四則演算が出来るパーサに変数を追加して=演算子を使いたい場合に、右結合する演算子を作る必要性が出てきます。右再帰はしたいとかですね。LL文法では左再帰すると無限ループしてしまうので困るのですが、右再帰は特に問題ないはずです。しかし、現時点でグ…

#なコマンドライン解析

予約に失敗してD言語ハッカソン行けなかったので移植はコンパイルを通した状態で断念しました。 後しばらくは、Dの集まりもないだろう。やっぱりSML#だなということで、SML#に黙々と移植をしてました。 いちお、作っていたテストは全部通って、OpenGLを動か…

ScalaConfのHackathonに行ってきました。

結構黙々とコンパイラを作ってました。 話したい人は話してくださいとの事だったので、せっかくなので現状作っている言語の ソースをざざっと、話してきました。id:kmizu さんに以下のように書き換えると短くなると指摘してもらいました。 case class EOp(op…

とりあえず、これから作るもの

3. 変数付きスタックマシンインタプリタ var a:int = 2 var b:double = 3 + 3.5 var c:double = a + b c で、2+3+3.5なので、8.5になるというのを作れればいいと。4. 配列付きスタックマシンインタプリタ var a:int[10] = [1,2,3,4] a[3] = a[1] + a[2] a[3]…

pdp11のディスアセンブラ

日曜日に池袋バイナリ勉強会に行ってきました。 で、pdp11のエミュレータのようなものの手順書を貰ったのだけど、 Mountain LionにしたばっかりでMacPorts動かないんですけど、、、。 makeとか出来ないんですけど、、、。 って感じだったので、コマンド表み…

配列を作る

今週末は配列を作ってました。 だいたいコンパイルは通ったのだけど、もう少しの所で止まってます。ポインタ操作は64bitつまり8byte単位で行うことになるので、サイズや、レジスタの取り扱いがちょいと面倒なのですが、慣れの問題なのかな?先にlong(8byte長…

テストコード

テストをつけました。 今2日くらいで、以下のコードを12段階に分けて書く練習をしてます。 trait Exp case class Const(a:Int) extends Exp case class Var(a:String) extends Exp case class Add(a:Exp,b:Exp) extends Exp case class Let(a:String,b:Ex…

コンパイラ実装会行く

新宿でやってたので、行ってみました。 13:00からだったのですが、例によって悪い癖が出てしまって、遅刻してしまいました。 でも、とにかく、静かに作業が出来たのでよかった。作業内容住井さんのOCamlで型推論する記事をScalaに移植して理解する。 ってこ…

コンパイラ作り

暗黙の型変換をどうやったらいいんだ?よくわからんぞ。 って悩んでます。 基本は上の型に合わせてcastを追加する感じで演算は同じ型でやればいいらしいのだけど、、、。

Scalaでアンドロイドアプリを作ろう

かなり悩んだので、メモしておきます。使った環境 Mac OSX 10.7Eclipse Indigo Service Release 1 Scala Plugin 2.9.1 Android Plugin AndroidProguardScalaAndroid2.1で開発。Scala2.7時代と違うのは特に、scala-android.jarが無くてもとりあえず動いたこと…

ふわふわコンパイラ作成

https://github.com/hsk/tscala今週末は、今まで型を付けていなかったデータに対して型を付けました。 ScalaではNetBeansよりEclipseのほうが高速にコンパイル出来るので、 Eclipseで開発してJUnitでテストを書いて徐々にブラッシュアップして行こうとしてま…

Liveness Analysis

タイガーブックを読んで、JavaScriptで生存解析いうのがあって、書いてみました。 で、Liveness Analisisっていう用語があったので、ググったら非常に奇麗にScalaで書いた実装が見つかりました。http://d.hatena.ne.jp/matt-k/20080530おお、こんなに簡単に…

第二回Scala会議の資料

第二回Scala会議お疲れさまでした。 ライトニングトークをしたときの資料です。 http://hsk.github.com/x86_64/x86_64.pdfアセンブラを学びながらScalaで作るコンパイラバックエンド入門 http://hsk.github.com/x86_64/URLを変えただけです。やる気と環境が…

第二回Scala会議(12/10(土)) のお知らせ

12/10にScala会議が恵比寿のRed hatであるのですが、ライトニングトーク枠が空いていたので申し込んで滑り込みました。(w ということで、x86_64コンパイラをScalaで作る話を5分でしてこようと思います。前、Scala勉強会で話したときにもっとこうした方がよか…

アセンブラを学びながらScalaで作るコンパイラバックエンド入門(未完成)

http://hsk.github.com/timi/ソースコード http://github.com/hsk/timi/アセンブラを学びながらScalaで作るコンパイラバックエンド入門(未完成) を書いていた物を公開しました。未完成ですいませんが、徐々にバージョンアップしていく予定ですのでよろしくお…

きしださんがScalaで言語を作っています。

http://d.hatena.ne.jp/nowokay/いいかんじに、普通にパーサコンビネータを使って言語処理系を書いてます。 俺の言語と違って安心して見れます。俺の言語は何が不安かって、木への文法を書いてるんだけど、それを もう一度抽象構文木に落とすところが、なん…

コンパイラ入門

上からなめて、細かい修正をして、うーん。変な文章だなぁっと思ってます。 あと、バグがあるから、バグは潰さないとなぁ、テストしないとなぁ、ぐふっ っていうところで、バグがあったほうがいいのかもしれないけど、ないほうがいいかもしれず うーんっと悩…

解析

とりあえず、いい加減パーサがパースをして、それっぽいphpははくようになった。 でも、ほとんど全部、式として扱っているので、セミコロンをちゃんと付けたいとか、 変数をちゃんと扱いたいとか、細かい部分の変換がうまく行かないので、文と式くらいは 分…

社内のDev会で発表しました

ちょっと前に、時間貰ったので、今作ってるコンパイラの話をしました。最近はふと、flashのパーサの仕様を記述しておいて、パーサ自動生成だーっと思って、作りはじめて、優先順位地獄にはまって大変です。 普通のパーサのほうが楽なんじゃないかと思い始め…

AST2ST

抽象構文木から構文木への変換プログラムです。 手抜きはありますが、いちお、変換出来マッス。 object st2ast { def main(argv:Array[String]) { val st = ( ("main","=",("fun","(","void",")",( ("a","=",("add","(",((1,",",2),",",3),")")), "@", ("pri…

変換イメージ

コンパイラを作る上で大切なのがどんなデータがどう変換されていくかというイメージです。 それがはっきりしていればずっと、作るのが楽なはず。 そして、それだけを書き出してみるのはいい練習になると思います。 ということで、書いてみました。ソースコー…

パーサを書きなれよう

コンパイラのバックエンドを作っていて、あとはフロントエンドをくっつければ完成なわけですが、 フロントエンドも1からささっと作りたいけど、疲れて作れないのは悔しい。 ということで、1からささっとパーサを作る練習をしております。scalaで、clean bo…

関数ができたぞと

とりあえず、今週末は関数コールのコンパイルを作りました。 1から作るのは初めてなので、偉い、リファクタリングが必要だぁ。構造が変わるぅ。分けわかんねぇ。 あっちもこっちも直さないといけねぇ。っと、いろいろ大変でした。 でもまぁ、出来ました。 …

関数の定義だけ考える

昨日は、なんだか悩んでしまってたのですが、 関数には関数の呼び出し部分と、関数定義の2つがあって、当たり前なんですけど、 昨日はごっちゃになっていたので今日は関数定義の方だけ考えることにしました。 ということで、もう一度最初から int a(int a,i…