自作言語つくりたい
ある日、暇だったから 自作言語が作りたくなった
でも、私は知っている 自作言語は作るものが多いことを
…じゃあもう計算能力だけ当ててやるくらいならできるんじゃない?
あと言語もくっそ単純なアセンブラっぽいのを使えばできるんじゃね?
うちの学校
うちの学校はJavaのお勉強をしてるから…じゃあJavaにしよ
Main.java
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class Main {
@FunctionalInterface
public interface CPU_MEIREI {
void function(long[] registers, int a, int b);
}
//拡張性を持たせるため、Switchをつかってみた
public static void systemcall(long[] r, int a, int b){
switch (a) {
case 1:
System.out.println(r[b]);
break;
default:
break;
}
}
public static void main(String[] args) {
if(args.length < 1){
System.out.println("文字列に引数を指定してください");
return;
}
long registers[] = new long[4];
//命令セット
final CPU_MEIREI meirei[] = {
(r, a, b)-> r[a] = r[a] + r[b], //0
(r, a, b)-> r[a] = r[a] - r[b], //1
(r, a, b)-> r[a] = r[a] * r[b], //2
(r, a, b)-> r[a] = r[a] / r[b], //3
(r, a, b)-> r[a] = r[a] % r[b], //4
(r, a, b)-> r[a] = r[a] >> r[b], //5
(r, a, b)-> r[a] = r[a] << r[b], //6
(r, a, b)-> r[a] = r[a] ^ r[b], //7
(r, a, b)-> r[a] = r[b], //8
(r, a, b)-> r[a] = b, //9
Main::systemcall //10
};
if(args.length == 5){
registers[0] = Integer.parseInt(args[1]);
registers[1] = Integer.parseInt(args[2]);
registers[2] = Integer.parseInt(args[3]);
registers[3] = Integer.parseInt(args[4]);
}
//命令実行(ポインタとか使って、if,for,while文を使えるように…したいけど…)
try(BufferedReader br = new BufferedReader(new FileReader(args[0]))){
br.lines().forEach(str->{
//System.out.println(str);
String[] testa = str.split(" ");
if(testa.length != 3) return;
int meirei_tmp = Integer.parseInt(testa[0]);
int register1 = Integer.parseInt(testa[1]);
int register2 = Integer.parseInt(testa[2]);
meirei[meirei_tmp].function(registers, register1, register2);
});
}catch(IOException e){
e.printStackTrace();
}
StringBuilder sb = new StringBuilder();
sb.append("eax = ").append(registers[0]).append('\n');
sb.append("ebx = ").append(registers[1]).append('\n');
sb.append("ecx = ").append(registers[2]).append('\n');
sb.append("edx = ").append(registers[3]).append('\n');
System.out.println(sb);
}
}
自作プログラミング言語ファイル
自作言語
0 0 1
0 2 3
0 0 2
10 1 0
(4つの引数を受け取って、すべてを足すプログラム)
まとめ
まだまだ、改良の余地があるから、もうちょこっと…頑張りたい