diff options
-rw-r--r-- | AbstractInterpreter.java | 17 | ||||
-rw-r--r-- | BitString.java | 19 | ||||
-rw-r--r-- | ExternalInterpreter.java | 33 | ||||
-rw-r--r-- | Interpreter.java | 20 | ||||
-rw-r--r-- | InterpreterStandalone.java | 14 | ||||
-rw-r--r-- | README.md | 24 | ||||
-rw-r--r-- | SElf REferential Code ARena | 0 | ||||
-rw-r--r-- | TournementArena.java | 40 | ||||
-rw-r--r-- | XorInterpreter.java | 9 |
9 files changed, 176 insertions, 0 deletions
diff --git a/AbstractInterpreter.java b/AbstractInterpreter.java new file mode 100644 index 0000000..7e7b82d --- /dev/null +++ b/AbstractInterpreter.java @@ -0,0 +1,17 @@ +abstract class AbstractInterpreter implements Interpreter { + public String print(String code) { + return code; + } + + public String trace(String code, String param) { + return code; + } + + public int minLength() { + return 0; + } + + public int maxLength() { + return 1024 * 1024; + } +} diff --git a/BitString.java b/BitString.java new file mode 100644 index 0000000..3060178 --- /dev/null +++ b/BitString.java @@ -0,0 +1,19 @@ +import java.lang.StringBuilder; + +class BitString extends java.util.BitSet { + public BitString(String s) { + for (int i=0; i<s.length(); i++) + set(i, s.charAt(i) == '1'); + } + + public String toString() { + return toString(length()); + } + + public String toString(int size) { + java.lang.StringBuilder res = new java.lang.StringBuilder(); + for (int i=0; i<size; i++) + res.append(get(i)? "1" : "0"); + return res.toString(); + } +} diff --git a/ExternalInterpreter.java b/ExternalInterpreter.java new file mode 100644 index 0000000..04776a8 --- /dev/null +++ b/ExternalInterpreter.java @@ -0,0 +1,33 @@ +// because writing java violates human rights + +import java.lang.Runtime; + +class ExternalInterpreter extends AbstractInterpreter { + ExternalInterpreter(String cmdName) { + this.cmdName = cmdName; + } + + public String eval(String code, String param) { + java.lang.StringBuilder res = new java.lang.StringBuilder(); + try { + // exec program capturing its standart output + String[] cmd = {"timeout", "-s", "9", "1", cmdName, code, param}; + Process p = java.lang.Runtime.getRuntime().exec(cmd); + java.io.InputStream s = p.getInputStream(); + int c; + // read stdout + while (((c = s.read()) >= 0) && (res.length() < code.length())) { + switch (c) { + case '1': res.append("1"); break; + default: res.append("0"); + } + } + // pad string + while (res.length() < code.length()) + res.append("0"); + } catch (java.io.IOException e) {} + return res.toString(); + } + + String cmdName; +} diff --git a/Interpreter.java b/Interpreter.java new file mode 100644 index 0000000..6dbff12 --- /dev/null +++ b/Interpreter.java @@ -0,0 +1,20 @@ +interface Interpreter { + /** + * return result of intepreted code, given param as argument + */ + public String eval(String code, String param); + + /** + * print the program code parses to + */ + public String print(String code); + + /** + * print a trace of the intepretation of code given param + */ + public String trace(String code, String param); + + public int minLength(); + + public int maxLength(); +} diff --git a/InterpreterStandalone.java b/InterpreterStandalone.java new file mode 100644 index 0000000..8b33bde --- /dev/null +++ b/InterpreterStandalone.java @@ -0,0 +1,14 @@ +/** + * use an Interpreter interface to create a standalone application + * + * Copy this file and change XorInterpreter to the name of your + * intepereter. + */ +class InterpreterStandalone { + public static void main(String[] args){ + // use your interpreter here + Interpreter vm = new XorInterpreter(); + String res = vm.eval(args[0], args[1]); + System.out.println(res); + } +} diff --git a/README.md b/README.md new file mode 100644 index 0000000..a0d18d2 --- /dev/null +++ b/README.md @@ -0,0 +1,24 @@ +Self-referential code testbed +============================= + +This repository contains tools and examples to work with +self-referential code. + +Concepts +-------- + +- Code: a bitstring of length n, containing of the ASCII chars zero or one +- Interpreter: a program to interpret code as a program, run it given + code as input argument and return code as a result +- Arena: a program to orchestrate one or more interpreters to act one code + +Content +------- + +- TournementArena.java: an example arena +- Interpreter.java: java interface each Interpreter has to follow +- AbstractInterpreter.java: class to derive an interpreter; only eval is missing +- InterpreterStandalone.java: convert a java interpreter class into a standalone program +- XorInterpreter.java: an example interpreter +- ExternalInterpreter.java: a class to call an external interpreter +- BitString.java: helper to concert code into a BitSet for easier parsing diff --git a/SElf REferential Code ARena b/SElf REferential Code ARena new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/SElf REferential Code ARena diff --git a/TournementArena.java b/TournementArena.java new file mode 100644 index 0000000..5a61c42 --- /dev/null +++ b/TournementArena.java @@ -0,0 +1,40 @@ +class TournementArena { + TournementArena(Interpreter[] vms, String[] arena) { + codeLen = arena[0].length(); + this.vms = vms; + this.arena = arena; + rng = new java.util.Random(); + } + + String[] iterate() { + Interpreter vm = vms[rng.nextInt(vms.length)]; + String + code = arena[rng.nextInt(arena.length)], + param = arena[rng.nextInt(arena.length)], + res = vm.eval(code, param); + arena[rng.nextInt(arena.length)] = res; + String [] ret = {code, param, res}; + return ret; + } + + public static void main(String[] args){ + // init arena + Interpreter[] vms = { + new XorInterpreter(), + new ExternalInterpreter("/bin/echo") + }; + String[] arena = {"00", "01", "10", "11"}; // TODO: add random bit-strings + TournementArena a = new TournementArena(vms, arena); + + // run arena forever + while (true) { + String[] r = a.iterate(); + System.out.println(r[0] + " ( " + r[1] + " ) -> " + r[2]); + } + } + + int codeLen; + Interpreter[] vms; + String[] arena; + java.util.Random rng; +} diff --git a/XorInterpreter.java b/XorInterpreter.java new file mode 100644 index 0000000..1b0ee0f --- /dev/null +++ b/XorInterpreter.java @@ -0,0 +1,9 @@ +class XorInterpreter extends AbstractInterpreter { + public String eval(String code, String param) { + BitString + x1 = new BitString(code), + x2 = new BitString(param); + x1.xor(x2); + return x1.toString(code.length()); + } +} |