laclefblog logo

Thu, 25 Feb 2010

ScalaのActorは遅いっぽい

groovypptest - Project Hosting on Google Codejetlang - Project Hosting on Google Code 速い!

ScalaがErlangに倣い過ぎてJVMの特性を見極めていないらしい。まあ、そもそもJVM上で実装されなければならない理由は無い言語だしなあ。出でよ、Native Scala。

Strongly Typed, Loosely Coupled: Groovy++ vs. Groovy vs. Java vs. Scala - Performance Update みたいな話もあるし、Scalaからjetlangを使うのが良いかな。

Fri, 31 Jul 2009

AndroidでScala

JVMがある環境なら、同じプログラムが動くという、便利さは、OSの垣根を越えるのみならず、ハードウェアの壁を越え、携帯電話までに浸透してきた。次はテレビか。

Google App EngineがJavaに対応して、Scalaが動くと(ちょっと)騒がれた熱が冷めない内に、Androidでも動くときた。Scalaの強さを携帯電話で活かせるのか、少々疑問だが、慣れているプログラミング言語を用いることが出来る、という横着が出来るのは嬉しい。

Sun, 07 Jun 2009

Brainfuck interpreter in Scala

何となく勢いがあったので、ScalaでBrainfuck(Brainf*ck)インタプリタを書いた。

import scala.collection.mutable.ArrayBuffer;

class BrainFuck(code:String) {
    var tape_ptr:Int = 0  // tape pointer
    var code_ptr:Int = 0  // code pointer
    var tape:ArrayBuffer[Int] = new ArrayBuffer[Int]

    def eval():Unit = {
        tape += 0
        while(code_ptr < code.length) {
            code(code_ptr) match {
                case '>' => tape_ptr += 1; if (tape_ptr >= tape.length) tape += 0;
                case '<' => tape_ptr -= 1;
                case '+' => tape(tape_ptr) += 1;
                case '-' => tape(tape_ptr) -= 1;
                case '.' => print(tape(tape_ptr).toChar);
                case ',' => tape(tape_ptr) = readInt;
                case '[' => if (tape(tape_ptr) == 0) {
                                var level:Int = 0
                                while(code(code_ptr) != ']' && level == 0) {
                                    code_ptr += 1
                                    if(code(code_ptr) == '[') level += 1
                                    if(code(code_ptr) == ']') level -= 1
                                }
                            }
                case ']' => if (tape(tape_ptr) != 0){
                                var level:Int = 0
                                while(code(code_ptr) != '[' && level == 0) {
                                    code_ptr -= 1
                                    if(code(code_ptr) == ']') level += 1
                                    if(code(code_ptr) == '[') level -= 1
                                }
                            }
                case _ => ()
            }
            code_ptr += 1
        }
        println()
    }
}

object Main {

    def main(args:Array[String]):Unit = {
        var code:String = """
        ++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++. >+.
        +++++++..+++.>++.<<+++++++++++++++.>.
        +++.------.--------.>+.>.
        """
        val bf = new BrainFuck(code)
        bf.eval()
    }
}

一部の既存実装では[]の入れ子に対応していないという妥協が見られたので、取り合えずそこは妥協せず書いた。適当に見つかったサンプルは動いたので良しとする。

Scalaらしさは出ていない。単に見易い手続き型だ。次回はcase classを使って構文木を生成してから、という手段を取ろうか。

Sat, 23 May 2009

ScalaのPDE

Scala版のProcessing Development Environment。

最近、エディタでファイルにプログラムを書いて動かすよりも、対話インタプリタとか、精々ProcessingのPDEくらいで、リターンキィなり再生ボタンなりでプログラムの動作確認をする場面の方が多くなってきた。まあ、それで済む内は良いけど、変な癖は付けたくないな。