Hello Java。

流行に乗ってるJavaを使えるようになって今時のITマンのふりをしよう。ということでJavaでなんかやってみる。今更流行に乗ってるとも言いがたいか。

参考このへん。
http://www.javaroad.jp/
http://sdc.sun.co.jp/java/docs/j2se/1.4/ja/docs/ja/api/index.html

試しにBrainFuckを作ってみるところまで。簡単でいいね。tryとかcatch、クラスとかよくわからんけど遊びでなんか作るくらいは直ぐできて面白い。オブジェクト指向プログラミングってなんだろうね。
というか「なんかString型とかあって便利なbetter C」程度の使い方しかしてないけど。
まずHello World
HelloWorld.java

public class HelloWorld{
  public static void main(String[] args){
    System.out.println("Hello World!");
  }
}

Systemというオブジェクトのoutっていうオブジェクトに仕込まれてるprintlnメソッドを読んだかんじ。たぶん。

% javac HelloWorld.java
% java HelloWorld
Hello World!

echoとかやってみよう。
Echo.java

import java.io.*;
public class Echo{
  public static void main(String[] args){
    int c;
    try{
      while((c = System.in.read()) != -1) System.out.write(c);
    }
    catch(IOException e){}
  }
}

tryとcatch。聞いたことある。なんか例外とかを掴まえてくれるらしい。とりあえずめんどくさいので無視。

% javac Echo.java 
% java Echo
こんにちはこんにちは!
こんにちはこんにちは!
aiueo.
aiueo.

よい。

じゃ次BrainFuck作ってみよう。

import java.io.*;
class BrainFuck{
  private char[] code;
  private int length;
  private char[] mem;
  private int mp;
  public BrainFuck(){
    code = new char[30000];
    mem = new char[30000];
  }
  public void putcode(char c){
    code[length] = c;
    ++length;
  }
  private int toloopstart(int p){
    int nest = 1;
    while(nest>0){
      switch(code[--p]){
        case '[': --nest; break;
        case ']': ++nest; break;
      }
    }
    return --p;
  }
  private int toloopend(int p){
    int nest = 1;
    while(nest>0){
      switch(code[++p]){
        case '[': ++nest; break;
        case ']': --nest; break;
      }
    }
    return p;
  }
  private char bfread(){
    try{
      return (char)System.in.read();
    }
    catch(IOException e){}
    return 0;
  }
  public void run(){
    int cp = 0;
    while(cp < length){
      switch(code[cp]){
        case '+': ++mem[mp]; break;
        case '-': --mem[mp]; break;
        case '>': ++mp; break;
        case '<': --mp; break;
        case '.': System.out.write(mem[mp]); break;
        case ',': mem[mp] = bfread(); break;
        case '[': if(mem[mp]==0) cp = toloopend(cp); break;
        case ']': cp = toloopstart(cp); break;
      }
      ++cp;
    }
    System.out.flush();
  }
  public void printcode(){
    for(int cp = 0;cp<length;++cp) System.out.write(code[cp]);
    System.out.println();
  } 
}
public class BFi{
  public static void main(String[] args){
    char[] code = new char[10000];
    int c;
    BrainFuck bf = new BrainFuck();
    try{
      while((c = System.in.read()) != -1)
       if(c=='+'|| c=='-' || c=='>' || c=='<' || c== '.' || c==',' || c=='[' || c==']') bf.putcode((char)c);
      //bf.printcode();
      bf.run();
    }
    catch(IOException e){}
  }
}
% javac BFi.java
% cat hello.bf 
>+++++++++[<++++++++>-]<.>+++++++[<++++>-]<+.+++++++..+++.[-]>++++++++[<++++>-]<.>+++++++++++[<+++++>-]<.>++++++++[<+++>-]<.+++.------.--------.[-]>++++++++[<++++>-]<+.[-]++++++++++.
% cat hello.bf |java BFi
Hello World!

動いた。ほとんどC言語で書いたやつと同じだけど。

test