use codepoints instead of strings, restructure bytecode interpreter