summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Huwald <jh@sotun.de>2013-04-22 13:42:11 (GMT)
committerJan Huwald <jh@sotun.de>2013-04-22 13:42:11 (GMT)
commitf788d4c48f2d94fcfd73a093ab33d734ab427cb8 (patch)
treebe4c00d562ec75f746736b5e0788f2847f7b8baa
Initial commit
-rw-r--r--AbstractInterpreter.java17
-rw-r--r--BitString.java19
-rw-r--r--ExternalInterpreter.java33
-rw-r--r--Interpreter.java20
-rw-r--r--InterpreterStandalone.java14
-rw-r--r--README.md24
-rw-r--r--SElf REferential Code ARena0
-rw-r--r--TournementArena.java40
-rw-r--r--XorInterpreter.java9
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());
+ }
+}
contact: Jan Huwald // Impressum