Scala

関数コール

Macでの関数の呼び出しについて調べないと、関数が実装出来ません。 ということで、関数コールについて調べてみます。 void a(int a,int b, int c,int d, int e, int f, int g, int h,int i, int j) { printf("%d\n", a+b+c+d+e+f+g+h+i+j); } void ac() { a…

やっぱり、独自路線を行くことに

今、必要なのは、関数型言語で書いた、とっても簡単なネイティブコンパイラ入門なのです。 なので、特にレジスタ割り付けは必要なくて、メモリに割り付けてしまうのがいいんです。 でもって、プログラムはリストになっていて、そのリストをコンパイルするだ…

アセンブラ出力練習ソース

最近は、時間もないので、1日に1回くらい、Ifまでのアセンブラ出力部を空で書けるように練習してみてます。 以下が、昼休みに書いたアセンブラ出力部のプログラムです。 作成順、1、hello world的プログラムを書きます。 2、test.cという、printIntとpri…

コンパイラ動く

現状、a=1+2*3+4/5みたいな式をb=1 c=2 d=3 e=4 f=5 a=b+c*d+e/f と展開するプログラムと a=b+c*d+e/f をi1 = c*d i2 = b + i1 i3 = e / f i4 = i2 + i3 a = i4 のように展開するプログラムを作って、コンパイル出来るようになりました。 ここの展開を自分で…

アドレスを求める計算の練習

変数と値のリストから、アドレスを求めるプログラムを作ってみました。 マッチングやらタプルやら末尾再帰やら、やっぱりScala便利です。 object main { def main(argv:Array[String]) { val tes = List(("a",1),("b",2),("a",3),("d",5),("e",6)); val rc =…

scalaをマクロアセンブラのマクロ用言語にしてます

最近、川で遊んでて、emobileを流してしまったので、家でネットが出来ません。 かってくればいいんだけど、買いにいく気力がない。 ってことで、家だと黙々プログラム組むしかないんで、時間が出来たらアセンブラをいじってます。 昨日やったのは、Scalaの関…

OS判別

cmincamlっていうのを作ってるのですが、メインマシンがmacにしてコンパイルしたらうまく動きませんでした。 これは、osxに対応するしかない!ってことで、os判別して、mac osxでも動くバイナリ吐きだすぞー ってことで、os判別だけ作りました。以下ソースで…

cmincaml

この間、初めて Scala勉強会 in 渋谷 に行ってきました。 それで、mincamlの移植版の話を聞きたいといってもらったのですが、 ずいぶん触ってないソースになってたので、修正してみました。 変更した点は以下の点です。1. C言語風式言語ベースに修正して、今…

specs

テストをちゃんとしてあるプログラムは安心です。 しかし、今まで趣味のプログラムのテストはきっちりしていませんでした。 それでは使えるプログラムにはなりません。 テスト書けば、書くだけいいプログラムになるはず。ということでscalaのテスティングフ…

コレクションの翻訳に突っ込みを入れる。

id:kmizuさんのツイッターで呟いていたのでちょっとだけ、ご意見させてもらったら全部対応してもらってしまいました。 ありがとうございます。http://eed3si9n.github.com/scala-collections-doc-ja/凄く見やすくなっている。不満に思ったところがことごとく…

tiger作る

もはや、タイガーブックは読んでいませんでした。 大域的エラー復帰というのがあるらしい。ふーんって思ったくらいです。とにかく、コンパイルを通す。エラーは100個くらいあって気が滅入りました。 でも、型エラーが続いているだけなので、 それを1個ず…

tiny-cをscalaに移植する。(6)

マクロを組み込もうと思っていたのですが、その前にリファクタリングをしました。ScalaにはListがそのままあるので、AST内にあるLISTをなくして、ScalaのListに置き換えました。 これにより、list操作関数は消すことが出来ました。また、余計なマッチングが…

tiny-cをscalaに移植する。(5)

今日は tiny-c のフロントエンドをC言語風式言語 Compact を使うように書き換えました。 ソースでいうとCLex.javaとcparser.yをcompact.scalaとcompact2ast.scalaに置き換えを行いました。https://github.com/hsk/ctinyc処理内容compact.scalaで文字列をタプ…

mincamlj

同じような感じで、Scala版MinCamlを修正しました。 http://github.com/hsk/mincamlj/blob/master/src/emit_x86.scala 行数は増えたけど、見通しはよくなったんじゃないかと思います。

tinycをscalaに移植する。(4)

前回は、とりあえず、ゴリゴリとScalaに移植した状態でした。 ソース読みたくないって思ってた理由を考えてみました。 アセンブラの出力部分とコード生成部が一緒になっていて どんなアセンブラの命令を使っているのかがわからず、 めんどくさいと思っている…

tinycをscalaに移植する。(3)

今日は、コンパイラの移植をしました。 唯の移植作業なので、ゴリゴリ作業してコンパイル通れば、あとはちょいちょいっと Null Pointer Exception を消して完成。 とりあえず、test.cのコンパイルが通ってアセンブラのコードがなんか表示されました。 アセン…

tiny-cを移植中

とりあえず、悩んでる暇あったらコード書けってことでインタプリタが動くところまではゴリゴリ書きました。 文字列処理以外はうまく動いているっぽいので、これでOKってことにしました。 時間ないし、気合い入れて完成度を上げる必要があるものでもないの…

tiny-cをscalaに移植する。

移植し始めました。 scalaで書きなれるため、簡単なコンパイラってことで。 http://github.com/hsk/stinycソースはこちら。 レキサは手がき、パーサはjavaのパーサジェネレータでアセンブラを出力するものを作るのが目標。 問題は、tiny-cのコンパイラは完全…

タイガーブックchap4の抽象構文木

scalaだと、こんな感じになるんじゃないかっと。 class Absyn { type Pos = Int abstract case class Absyn(pos:Pos) abstract case class Var(override val pos:Pos) extends Absyn(pos) abstract case class Exp(override val pos:Pos) extends Absyn(pos)…

で四則演算コンパイラ

自分のライフワークである、言語作りですが、いよいよオリジナルコンパイラを作っていこうと思っています。 で、まずは、四則演算できるだけのコンパイラだよなってことで以下のサイトを参考に作ってみました。 http://www.sol.dti.ne.jp/~yoshinor/mysoft/S…

トランスレータを書いてみよう。

ちょっとだけ書いてみたScalaで書いたトランスレータを紹介します。 四則演算と、代入、if else 文と式しか対応してないので、まだまだトランスレータとして動かせる 物ではありませんけど。 tが文を処理する関数で、teが式を処理する関数です。 引数はAnyで…

mincaml

タプルがうまく動作していないバグを修正しました。 原因はパーサの型が合っていなかっただけでした。 let a = (1,2,3) in let (x,y,z) = a in let c = x+y+z in print_int (x+y+z)こんなコードが動きました。 今日はやる気ないのか、30分くらいしか作業し…

タイガーブックを読む(1)

タイガーブックが届いたので読んでいきたいと思います。 まずは、以下が目次です。第1部 コンパイラ基礎編 1.はじめに slp.sml 2.字句解析 driver.sml errormsg.sml sources.cm tiger.lex tokens.sig tokens.sml 3.構文解析 errormsg.sml parsetest.sml sour…

MinCaml読む

次の仕事が決まったので、自由な時間が短くなってしまいました。ってことで、ペースダウンしてしまいます。 てことで、Scalaに移植したものを読んでみてます。 うーん。やっぱりScalaいいよ。Scala。読みやすい。 ということで、MinCamlの把握をようやく出来…

mincamlのScalaへの移植

mincaml をScalaに移植する作業をしてたのですが、ようやく、全体のコンパイルが通りました。 型のチェックがしっかり効いているのでバグは少ないと思いますが、何をやってるかよく把握しない状態で 型だけあわせて行った感じなので、勘違いによるバグの混入…

OCamlのソースをScalaに移植する為のノウハウ(1)

計画 ここのところ、OCaml製の MinCaml を Scala に移植しています。リポジトリ: http://github.com/hsk/mincamlj/tree/結構規模が大きいので、(約 2000 行とはいえ圧縮されているので大きいんです) 闇雲に作業をしているとモチベーションが続きません。 こ…

構文木からAST(2)

タプルからASTに変換するプログラムを書いてみました。 今回は大部分のステートメントに対応しています。 エラー出力をどうするかの問題がありますが、とりあえず、構文木→抽象構文木の変換がどのようにやれば出来るのかが明確になったと思います。以下ソース

タプルからAST作成

構文木のパーサはそこそこ出来ていて構文木を嘗め回すインタプリタは作成しました。 JVMは構文木を嘗め回すのが妙に速いのでそれなりのスピードで動いてくれます。 しかしコンパイラを作る場合は抽象構文木(AST)に変換する必要があります。 通常の構文解析な…

Gizzard

http://www.publickey1.jp/blog/10/twittergizzard_scalasharding.htmlGizzardてのはtwitterで使われている技術でシャーディングを行うものだそうです。 シャーディングってのはパーティショニングとレプリケーションを使ってDBを分散して管理できるようにす…

SendaiLockサーバ

どうも、ずーっとプログラムを動かしているとエラーが出るので原因を調べると、 しばらくソケットが使えなくなることがあるそうです。 SO_LINGERとか、setReuseAddressとかを使うことで対応できるらしいので対応してみました。 phpのクライアントもSO_LINGER…