about summary refs log tree commit diff stats
path: root/cpp
diff options
context:
space:
mode:
Diffstat (limited to 'cpp')
-rw-r--r--cpp/.traces/add6
-rw-r--r--cpp/.traces/add_literal2
-rw-r--r--cpp/.traces/and6
-rw-r--r--cpp/.traces/array-from-args4
-rw-r--r--cpp/.traces/array_length10
-rw-r--r--cpp/.traces/assert2
-rw-r--r--cpp/.traces/brace_conversion4
-rw-r--r--cpp/.traces/brace_conversion_and_run16
-rw-r--r--cpp/.traces/break_cascading6
-rw-r--r--cpp/.traces/break_cascading210
-rw-r--r--cpp/.traces/break_empty_block4
-rw-r--r--cpp/.traces/break_if10
-rw-r--r--cpp/.traces/break_label4
-rw-r--r--cpp/.traces/break_nested10
-rw-r--r--cpp/.traces/break_nested_degenerate8
-rw-r--r--cpp/.traces/break_nested_degenerate26
-rw-r--r--cpp/.traces/break_unless8
-rw-r--r--cpp/.traces/buffer-append-works28
-rw-r--r--cpp/.traces/calling_recipe4
-rw-r--r--cpp/.traces/channel6
-rw-r--r--cpp/.traces/channel-initialization6
-rw-r--r--cpp/.traces/channel-new-empty-not-full6
-rw-r--r--cpp/.traces/channel-read-increments-full10
-rw-r--r--cpp/.traces/channel-read-not-full10
-rw-r--r--cpp/.traces/channel-wrap18
-rw-r--r--cpp/.traces/channel-write-full8
-rw-r--r--cpp/.traces/channel-write-increments-free8
-rw-r--r--cpp/.traces/channel-write-not-empty8
-rw-r--r--cpp/.traces/check_string_in_memory8
-rw-r--r--cpp/.traces/closure26
-rw-r--r--cpp/.traces/convert_names2
-rw-r--r--cpp/.traces/convert_names_handles_containers4
-rw-r--r--cpp/.traces/convert_names_passes_default_space2
-rw-r--r--cpp/.traces/convert_names_passes_dummy2
-rw-r--r--cpp/.traces/convert_names_passes_raw2
-rw-r--r--cpp/.traces/convert_names_transforms_container_elements4
-rw-r--r--cpp/.traces/convert_names_warns2
-rw-r--r--cpp/.traces/copy4
-rw-r--r--cpp/.traces/copy_array10
-rw-r--r--cpp/.traces/copy_array_indirect12
-rw-r--r--cpp/.traces/copy_exclusive_container8
-rw-r--r--cpp/.traces/copy_handles_nested_container_elements8
-rw-r--r--cpp/.traces/copy_indirect6
-rw-r--r--cpp/.traces/copy_literal2
-rw-r--r--cpp/.traces/copy_multiple_locations6
-rw-r--r--cpp/.traces/deref_sidesteps_default_space10
-rw-r--r--cpp/.traces/deref_sidesteps_default_space_in_get12
-rw-r--r--cpp/.traces/deref_sidesteps_default_space_in_index14
-rw-r--r--cpp/.traces/divide6
-rw-r--r--cpp/.traces/divide_literal2
-rw-r--r--cpp/.traces/divide_with_remainder6
-rw-r--r--cpp/.traces/divide_with_remainder_literal2
-rw-r--r--cpp/.traces/equal6
-rw-r--r--cpp/.traces/equal26
-rw-r--r--cpp/.traces/first_recipe2
-rw-r--r--cpp/.traces/first_scenario_checking_trace2
-rw-r--r--cpp/.traces/first_scenario_checking_trace_negative2
-rw-r--r--cpp/.traces/first_scenario_in_mu2
-rw-r--r--cpp/.traces/get6
-rw-r--r--cpp/.traces/get_address6
-rw-r--r--cpp/.traces/get_address_indirect8
-rw-r--r--cpp/.traces/get_default_space4
-rw-r--r--cpp/.traces/get_handles_nested_container_elements8
-rw-r--r--cpp/.traces/get_indirect8
-rw-r--r--cpp/.traces/greater_or_equal6
-rw-r--r--cpp/.traces/greater_or_equal26
-rw-r--r--cpp/.traces/greater_or_equal36
-rw-r--r--cpp/.traces/greater_than6
-rw-r--r--cpp/.traces/greater_than26
-rw-r--r--cpp/.traces/include_nonderef_properties8
-rw-r--r--cpp/.traces/index10
-rw-r--r--cpp/.traces/index_address10
-rw-r--r--cpp/.traces/index_direct_offset12
-rw-r--r--cpp/.traces/index_indirect12
-rw-r--r--cpp/.traces/ingredient6
-rw-r--r--cpp/.traces/integer-to-decimal-digit-negative4
-rw-r--r--cpp/.traces/integer-to-decimal-digit-positive4
-rw-r--r--cpp/.traces/integer-to-decimal-digit-zero4
-rw-r--r--cpp/.traces/interpolate-at-end8
-rw-r--r--cpp/.traces/interpolate-at-start8
-rw-r--r--cpp/.traces/interpolate-works8
-rw-r--r--cpp/.traces/jump_backward6
-rw-r--r--cpp/.traces/jump_can_skip_instructions4
-rw-r--r--cpp/.traces/jump_if4
-rw-r--r--cpp/.traces/jump_if_fallthrough4
-rw-r--r--cpp/.traces/jump_unless4
-rw-r--r--cpp/.traces/jump_unless_fallthrough4
-rw-r--r--cpp/.traces/lesser_or_equal6
-rw-r--r--cpp/.traces/lesser_or_equal26
-rw-r--r--cpp/.traces/lesser_or_equal36
-rw-r--r--cpp/.traces/lesser_than6
-rw-r--r--cpp/.traces/lesser_than26
-rw-r--r--cpp/.traces/loop8
-rw-r--r--cpp/.traces/loop_label4
-rw-r--r--cpp/.traces/loop_nested10
-rw-r--r--cpp/.traces/loop_unless8
-rw-r--r--cpp/.traces/maybe_convert8
-rw-r--r--cpp/.traces/maybe_convert_fail8
-rw-r--r--cpp/.traces/maybe_convert_named8
-rw-r--r--cpp/.traces/multiply6
-rw-r--r--cpp/.traces/multiply_literal2
-rw-r--r--cpp/.traces/new6
-rw-r--r--cpp/.traces/new_array6
-rw-r--r--cpp/.traces/new_concurrent8
-rw-r--r--cpp/.traces/new_overflow4
-rw-r--r--cpp/.traces/new_string4
-rw-r--r--cpp/.traces/next_ingredient6
-rw-r--r--cpp/.traces/next_ingredient_missing4
-rw-r--r--cpp/.traces/not4
-rw-r--r--cpp/.traces/or6
-rw-r--r--cpp/.traces/parse_comment_after_instruction2
-rw-r--r--cpp/.traces/parse_comment_amongst_instruction2
-rw-r--r--cpp/.traces/parse_comment_amongst_instruction22
-rw-r--r--cpp/.traces/parse_comment_amongst_instruction34
-rw-r--r--cpp/.traces/parse_comment_outside_recipe2
-rw-r--r--cpp/.traces/parse_multiple_ingredients2
-rw-r--r--cpp/.traces/parse_multiple_products2
-rw-r--r--cpp/.traces/parse_multiple_properties2
-rw-r--r--cpp/.traces/parse_multiple_types2
-rw-r--r--cpp/.traces/parse_properties2
-rw-r--r--cpp/.traces/reply8
-rw-r--r--cpp/.traces/reply_container8
-rw-r--r--cpp/.traces/reply_same_as_ingredient8
-rw-r--r--cpp/.traces/return_on_fallthrough12
-rw-r--r--cpp/.traces/rewind_ingredients10
-rw-r--r--cpp/.traces/run_dummy2
-rw-r--r--cpp/.traces/run_label4
-rw-r--r--cpp/.traces/scheduler6
-rw-r--r--cpp/.traces/scheduler_interleaves_routines10
-rw-r--r--cpp/.traces/set_default_space6
-rw-r--r--cpp/.traces/store_indirect4
-rw-r--r--cpp/.traces/string-append-18
-rw-r--r--cpp/.traces/string-equal-common-lengths-but-distinct8
-rw-r--r--cpp/.traces/string-equal-distinct-lengths8
-rw-r--r--cpp/.traces/string-equal-identical8
-rw-r--r--cpp/.traces/string-equal-reflexive6
-rw-r--r--cpp/.traces/string-equal-with-empty8
-rw-r--r--cpp/.traces/string_literal2
-rw-r--r--cpp/.traces/string_literal_and_comment2
-rw-r--r--cpp/.traces/string_literal_nested2
-rw-r--r--cpp/.traces/string_literal_with_colons2
-rw-r--r--cpp/.traces/subtract6
-rw-r--r--cpp/.traces/subtract_literal2
-rw-r--r--cpp/.traces/surrounding_space12
-rw-r--r--cpp/.traces/trace2
-rw-r--r--cpp/.traces/trace_in_mu2
-rw-r--r--cpp/.traces/wait_for_location10
-rw-r--r--cpp/011load.cc25
-rw-r--r--cpp/013literal_string.cc2
149 files changed, 476 insertions, 477 deletions
diff --git a/cpp/.traces/add b/cpp/.traces/add
index 2c5b25d7..7af4bafe 100644
--- a/cpp/.traces/add
+++ b/cpp/.traces/add
@@ -1,10 +1,10 @@
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "23", value: 0, type: 0, properties: ["23": "literal"]}
 parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "34", value: 0, type: 0, properties: ["34": "literal"]}
 parse/0:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
-parse/0: instruction: 2
+parse/0: instruction: add
 parse/0:   ingredient: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
 parse/0:   ingredient: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
 parse/0:   product: {name: "3", value: 0, type: 1, properties: ["3": "integer"]}
diff --git a/cpp/.traces/add_literal b/cpp/.traces/add_literal
index 514fb805..3b55e4c0 100644
--- a/cpp/.traces/add_literal
+++ b/cpp/.traces/add_literal
@@ -1,4 +1,4 @@
-parse/0: instruction: 2
+parse/0: instruction: add
 parse/0:   ingredient: {name: "23", value: 0, type: 0, properties: ["23": "literal"]}
 parse/0:   ingredient: {name: "34", value: 0, type: 0, properties: ["34": "literal"]}
 parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
diff --git a/cpp/.traces/and b/cpp/.traces/and
index 58acd4d5..37454d4a 100644
--- a/cpp/.traces/and
+++ b/cpp/.traces/and
@@ -1,10 +1,10 @@
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "1", value: 0, type: 0, properties: ["1": "literal"]}
 parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 parse/0:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
-parse/0: instruction: 7
+parse/0: instruction: and
 parse/0:   ingredient: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
 parse/0:   ingredient: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
 parse/0:   product: {name: "3", value: 0, type: 1, properties: ["3": "integer"]}
diff --git a/cpp/.traces/array-from-args b/cpp/.traces/array-from-args
index d2b9380f..9dd11874 100644
--- a/cpp/.traces/array-from-args
+++ b/cpp/.traces/array-from-args
@@ -1,9 +1,9 @@
-parse/0: instruction: 114
+parse/0: instruction: init-array
 parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 parse/0:   ingredient: {name: "1", value: 0, type: 0, properties: ["1": "literal"]}
 parse/0:   ingredient: {name: "2", value: 0, type: 0, properties: ["2": "literal"]}
 parse/0:   product: {name: "1", value: 0, type: 2-5-1, properties: ["1": "address":"array":"location"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "1", value: 0, type: 2-5-1, properties: ["1": "address":"array":"location", "deref": ]}
 parse/0:   product: {name: "2", value: 0, type: 5-1, properties: ["2": "array":"location"]}
 after-brace/0: recipe test-array-from-args
diff --git a/cpp/.traces/array_length b/cpp/.traces/array_length
index c42d8aa0..937d5d5c 100644
--- a/cpp/.traces/array_length
+++ b/cpp/.traces/array_length
@@ -1,16 +1,16 @@
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "3", value: 0, type: 0, properties: ["3": "literal"]}
 parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "14", value: 0, type: 0, properties: ["14": "literal"]}
 parse/0:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "15", value: 0, type: 0, properties: ["15": "literal"]}
 parse/0:   product: {name: "3", value: 0, type: 1, properties: ["3": "integer"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "16", value: 0, type: 0, properties: ["16": "literal"]}
 parse/0:   product: {name: "4", value: 0, type: 1, properties: ["4": "integer"]}
-parse/0: instruction: 24
+parse/0: instruction: length
 parse/0:   ingredient: {name: "1", value: 0, type: 5-1, properties: ["1": "array":"integer"]}
 parse/0:   product: {name: "5", value: 0, type: 1, properties: ["5": "integer"]}
 after-brace/0: recipe main
diff --git a/cpp/.traces/assert b/cpp/.traces/assert
index 78fcb823..ae903831 100644
--- a/cpp/.traces/assert
+++ b/cpp/.traces/assert
@@ -1,4 +1,4 @@
-parse/0: instruction: 19
+parse/0: instruction: assert
 parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 parse/0:   ingredient: {name: "this is an assert in mu", value: 0, type: 0, properties: ["this is an assert in mu": "literal-string"]}
 after-brace/0: recipe main
diff --git a/cpp/.traces/brace_conversion b/cpp/.traces/brace_conversion
index 639751a8..99c3b723 100644
--- a/cpp/.traces/brace_conversion
+++ b/cpp/.traces/brace_conversion
@@ -1,6 +1,6 @@
 parse/0: label: {
-parse/0: instruction: 32
-parse/0: instruction: 1
+parse/0: instruction: break
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
 parse/0: label: }
diff --git a/cpp/.traces/brace_conversion_and_run b/cpp/.traces/brace_conversion_and_run
index 65b150b9..72792c3e 100644
--- a/cpp/.traces/brace_conversion_and_run
+++ b/cpp/.traces/brace_conversion_and_run
@@ -1,27 +1,27 @@
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "5", value: 0, type: 0, properties: ["5": "literal"]}
 parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "1", value: 0, type: 0, properties: ["1": "literal"]}
 parse/0:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
 parse/0: label: {
-parse/0: instruction: 13
+parse/0: instruction: equal
 parse/0:   ingredient: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
 parse/0:   ingredient: {name: "1", value: 0, type: 0, properties: ["1": "literal"]}
 parse/0:   product: {name: "3", value: 0, type: 3, properties: ["3": "boolean"]}
-parse/0: instruction: 33
+parse/0: instruction: break-if
 parse/0:   ingredient: {name: "3", value: 0, type: 3, properties: ["3": "boolean"]}
-parse/0: instruction: 4
+parse/0: instruction: multiply
 parse/0:   ingredient: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
 parse/0:   ingredient: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
 parse/0:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
-parse/0: instruction: 3
+parse/0: instruction: subtract
 parse/0:   ingredient: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
 parse/0:   ingredient: {name: "1", value: 0, type: 0, properties: ["1": "literal"]}
 parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
-parse/0: instruction: 35
+parse/0: instruction: loop
 parse/0: label: }
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
 parse/0:   product: {name: "4", value: 0, type: 1, properties: ["4": "integer"]}
 brace/0: 1000: push (open, 2)
diff --git a/cpp/.traces/break_cascading b/cpp/.traces/break_cascading
index 7cabc61b..c9c2dedd 100644
--- a/cpp/.traces/break_cascading
+++ b/cpp/.traces/break_cascading
@@ -1,11 +1,11 @@
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
 parse/0: label: {
-parse/0: instruction: 32
+parse/0: instruction: break
 parse/0: label: }
 parse/0: label: {
-parse/0: instruction: 32
+parse/0: instruction: break
 parse/0: label: }
 brace/0: 1000: push (open, 1)
 brace/0: push (close, 3)
diff --git a/cpp/.traces/break_cascading2 b/cpp/.traces/break_cascading2
index 76005d1c..636bf3d4 100644
--- a/cpp/.traces/break_cascading2
+++ b/cpp/.traces/break_cascading2
@@ -1,17 +1,17 @@
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 parse/0:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
 parse/0: label: {
-parse/0: instruction: 32
-parse/0: instruction: 1
+parse/0: instruction: break
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 parse/0:   product: {name: "3", value: 0, type: 1, properties: ["3": "integer"]}
 parse/0: label: }
 parse/0: label: {
-parse/0: instruction: 32
+parse/0: instruction: break
 parse/0: label: }
 brace/0: 1000: push (open, 2)
 brace/0: push (close, 5)
diff --git a/cpp/.traces/break_empty_block b/cpp/.traces/break_empty_block
index 1b752c4d..f31738bb 100644
--- a/cpp/.traces/break_empty_block
+++ b/cpp/.traces/break_empty_block
@@ -1,8 +1,8 @@
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
 parse/0: label: {
-parse/0: instruction: 32
+parse/0: instruction: break
 parse/0: label: }
 brace/0: 1000: push (open, 1)
 brace/0: push (close, 3)
diff --git a/cpp/.traces/break_if b/cpp/.traces/break_if
index ad96ee07..109f95f4 100644
--- a/cpp/.traces/break_if
+++ b/cpp/.traces/break_if
@@ -1,18 +1,18 @@
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 parse/0:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
 parse/0: label: {
-parse/0: instruction: 33
+parse/0: instruction: break-if
 parse/0:   ingredient: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 parse/0:   product: {name: "3", value: 0, type: 1, properties: ["3": "integer"]}
 parse/0: label: }
 parse/0: label: {
-parse/0: instruction: 32
+parse/0: instruction: break
 parse/0: label: }
 brace/0: 1000: push (open, 2)
 brace/0: push (close, 5)
diff --git a/cpp/.traces/break_label b/cpp/.traces/break_label
index 54cbc9a4..5dc39132 100644
--- a/cpp/.traces/break_label
+++ b/cpp/.traces/break_label
@@ -1,8 +1,8 @@
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
 parse/0: label: {
-parse/0: instruction: 32
+parse/0: instruction: break
 parse/0:   ingredient: {name: "+foo", value: 0, type: 0, properties: ["+foo": "offset"]}
 parse/0: label: }
 brace/0: 1000: push (open, 1)
diff --git a/cpp/.traces/break_nested b/cpp/.traces/break_nested
index 189b357e..088b4742 100644
--- a/cpp/.traces/break_nested
+++ b/cpp/.traces/break_nested
@@ -1,17 +1,17 @@
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
 parse/0: label: {
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 parse/0:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
-parse/0: instruction: 32
+parse/0: instruction: break
 parse/0: label: {
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 parse/0:   product: {name: "3", value: 0, type: 1, properties: ["3": "integer"]}
 parse/0: label: }
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 parse/0:   product: {name: "4", value: 0, type: 1, properties: ["4": "integer"]}
 parse/0: label: }
diff --git a/cpp/.traces/break_nested_degenerate b/cpp/.traces/break_nested_degenerate
index 5dbbdacb..649afcdb 100644
--- a/cpp/.traces/break_nested_degenerate
+++ b/cpp/.traces/break_nested_degenerate
@@ -1,14 +1,14 @@
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
 parse/0: label: {
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 parse/0:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
-parse/0: instruction: 32
+parse/0: instruction: break
 parse/0: label: {
 parse/0: label: }
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 parse/0:   product: {name: "4", value: 0, type: 1, properties: ["4": "integer"]}
 parse/0: label: }
diff --git a/cpp/.traces/break_nested_degenerate2 b/cpp/.traces/break_nested_degenerate2
index 63c761c4..46a5d360 100644
--- a/cpp/.traces/break_nested_degenerate2
+++ b/cpp/.traces/break_nested_degenerate2
@@ -1,11 +1,11 @@
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
 parse/0: label: {
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 parse/0:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
-parse/0: instruction: 32
+parse/0: instruction: break
 parse/0: label: {
 parse/0: label: }
 parse/0: label: }
diff --git a/cpp/.traces/break_unless b/cpp/.traces/break_unless
index ece4a491..059b99ca 100644
--- a/cpp/.traces/break_unless
+++ b/cpp/.traces/break_unless
@@ -1,13 +1,13 @@
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 parse/0:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
 parse/0: label: {
-parse/0: instruction: 34
+parse/0: instruction: break-unless
 parse/0:   ingredient: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 parse/0:   product: {name: "3", value: 0, type: 1, properties: ["3": "integer"]}
 parse/0: label: }
diff --git a/cpp/.traces/buffer-append-works b/cpp/.traces/buffer-append-works
index b7e64ecd..c4b4b221 100644
--- a/cpp/.traces/buffer-append-works
+++ b/cpp/.traces/buffer-append-works
@@ -1,55 +1,55 @@
-parse/0: instruction: 38
+parse/0: instruction: new
 parse/0:   ingredient: {name: "location", value: 0, type: 0, properties: ["location": "type"]}
 parse/0:   ingredient: {name: "30", value: 0, type: 0, properties: ["30": "literal"]}
 parse/0:   product: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]}
-parse/0: instruction: 101
+parse/0: instruction: init-buffer
 parse/0:   ingredient: {name: "3", value: 0, type: 0, properties: ["3": "literal"]}
 parse/0:   product: {name: "x", value: 0, type: 2-9, properties: ["x": "address":"buffer"]}
-parse/0: instruction: 20
+parse/0: instruction: get
 parse/0:   ingredient: {name: "x", value: 0, type: 2-9, properties: ["x": "address":"buffer", "deref": ]}
 parse/0:   ingredient: {name: "data", value: 0, type: 0, properties: ["data": "offset"]}
 parse/0:   product: {name: "s1", value: 0, type: 2-5-4, properties: ["s1": "address":"array":"character"]}
-parse/0: instruction: 104
+parse/0: instruction: buffer-append
 parse/0:   ingredient: {name: "x", value: 0, type: 2-9, properties: ["x": "address":"buffer"]}
 parse/0:   ingredient: {name: "97", value: 0, type: 0, properties: ["97": "literal"]}
 parse/0:   product: {name: "x", value: 0, type: 2-9, properties: ["x": "address":"buffer"]}
-parse/0: instruction: 104
+parse/0: instruction: buffer-append
 parse/0:   ingredient: {name: "x", value: 0, type: 2-9, properties: ["x": "address":"buffer"]}
 parse/0:   ingredient: {name: "98", value: 0, type: 0, properties: ["98": "literal"]}
 parse/0:   product: {name: "x", value: 0, type: 2-9, properties: ["x": "address":"buffer"]}
-parse/0: instruction: 104
+parse/0: instruction: buffer-append
 parse/0:   ingredient: {name: "x", value: 0, type: 2-9, properties: ["x": "address":"buffer"]}
 parse/0:   ingredient: {name: "99", value: 0, type: 0, properties: ["99": "literal"]}
 parse/0:   product: {name: "x", value: 0, type: 2-9, properties: ["x": "address":"buffer"]}
-parse/0: instruction: 20
+parse/0: instruction: get
 parse/0:   ingredient: {name: "x", value: 0, type: 2-9, properties: ["x": "address":"buffer", "deref": ]}
 parse/0:   ingredient: {name: "data", value: 0, type: 0, properties: ["data": "offset"]}
 parse/0:   product: {name: "s2", value: 0, type: 2-5-4, properties: ["s2": "address":"array":"character"]}
-parse/0: instruction: 13
+parse/0: instruction: equal
 parse/0:   ingredient: {name: "s1", value: 0, type: 2-5-4, properties: ["s1": "address":"array":"character"]}
 parse/0:   ingredient: {name: "s2", value: 0, type: 2-5-4, properties: ["s2": "address":"array":"character"]}
 parse/0:   product: {name: "1", value: 0, type: 3, properties: ["1": "boolean", "raw": ]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "s2", value: 0, type: 2-5-4, properties: ["s2": "address":"array":"character", "deref": ]}
 parse/0:   product: {name: "2", value: 0, type: 5-4, properties: ["2": "array":"character", "raw": ]}
 parse/0: label: +buffer-filled
-parse/0: instruction: 104
+parse/0: instruction: buffer-append
 parse/0:   ingredient: {name: "x", value: 0, type: 2-9, properties: ["x": "address":"buffer"]}
 parse/0:   ingredient: {name: "100", value: 0, type: 0, properties: ["100": "literal"]}
 parse/0:   product: {name: "x", value: 0, type: 2-9, properties: ["x": "address":"buffer"]}
-parse/0: instruction: 20
+parse/0: instruction: get
 parse/0:   ingredient: {name: "x", value: 0, type: 2-9, properties: ["x": "address":"buffer", "deref": ]}
 parse/0:   ingredient: {name: "data", value: 0, type: 0, properties: ["data": "offset"]}
 parse/0:   product: {name: "s3", value: 0, type: 2-5-4, properties: ["s3": "address":"array":"character"]}
-parse/0: instruction: 13
+parse/0: instruction: equal
 parse/0:   ingredient: {name: "s1", value: 0, type: 2-5-4, properties: ["s1": "address":"array":"character"]}
 parse/0:   ingredient: {name: "s3", value: 0, type: 2-5-4, properties: ["s3": "address":"array":"character"]}
 parse/0:   product: {name: "10", value: 0, type: 3, properties: ["10": "boolean", "raw": ]}
-parse/0: instruction: 20
+parse/0: instruction: get
 parse/0:   ingredient: {name: "x", value: 0, type: 2-9, properties: ["x": "address":"buffer", "deref": ]}
 parse/0:   ingredient: {name: "length", value: 0, type: 0, properties: ["length": "offset"]}
 parse/0:   product: {name: "11", value: 0, type: 1, properties: ["11": "integer", "raw": ]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "s3", value: 0, type: 2-5-4, properties: ["s3": "address":"array":"character", "deref": ]}
 parse/0:   product: {name: "12", value: 0, type: 5-4, properties: ["12": "array":"character", "raw": ]}
 new/0: location -> 1
diff --git a/cpp/.traces/calling_recipe b/cpp/.traces/calling_recipe
index 8e00e3fd..c2d96247 100644
--- a/cpp/.traces/calling_recipe
+++ b/cpp/.traces/calling_recipe
@@ -1,5 +1,5 @@
-parse/0: instruction: 1001
-parse/0: instruction: 2
+parse/0: instruction: f
+parse/0: instruction: add
 parse/0:   ingredient: {name: "2", value: 0, type: 0, properties: ["2": "literal"]}
 parse/0:   ingredient: {name: "2", value: 0, type: 0, properties: ["2": "literal"]}
 parse/0:   product: {name: "3", value: 0, type: 1, properties: ["3": "integer"]}
diff --git a/cpp/.traces/channel b/cpp/.traces/channel
index 4a3b4c1c..39e30c03 100644
--- a/cpp/.traces/channel
+++ b/cpp/.traces/channel
@@ -1,11 +1,11 @@
-parse/0: instruction: 108
+parse/0: instruction: init-channel
 parse/0:   ingredient: {name: "3", value: 0, type: 0, properties: ["3": "literal", "capacity": ]}
 parse/0:   product: {name: "1", value: 0, type: 2-10, properties: ["1": "address":"channel"]}
-parse/0: instruction: 109
+parse/0: instruction: write
 parse/0:   ingredient: {name: "1", value: 0, type: 2-10, properties: ["1": "address":"channel"]}
 parse/0:   ingredient: {name: "34", value: 0, type: 0, properties: ["34": "literal"]}
 parse/0:   product: {name: "1", value: 0, type: 2-10, properties: ["1": "address":"channel"]}
-parse/0: instruction: 111
+parse/0: instruction: read
 parse/0:   ingredient: {name: "1", value: 0, type: 2-10, properties: ["1": "address":"channel"]}
 parse/0:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
 parse/0:   product: {name: "1", value: 0, type: 2-10, properties: ["1": "address":"channel"]}
diff --git a/cpp/.traces/channel-initialization b/cpp/.traces/channel-initialization
index 7b89ea19..6ae08803 100644
--- a/cpp/.traces/channel-initialization
+++ b/cpp/.traces/channel-initialization
@@ -1,11 +1,11 @@
-parse/0: instruction: 108
+parse/0: instruction: init-channel
 parse/0:   ingredient: {name: "3", value: 0, type: 0, properties: ["3": "literal", "capacity": ]}
 parse/0:   product: {name: "1", value: 0, type: 2-10, properties: ["1": "address":"channel"]}
-parse/0: instruction: 20
+parse/0: instruction: get
 parse/0:   ingredient: {name: "1", value: 0, type: 2-10, properties: ["1": "address":"channel", "deref": ]}
 parse/0:   ingredient: {name: "first-full", value: 0, type: 0, properties: ["first-full": "offset"]}
 parse/0:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
-parse/0: instruction: 20
+parse/0: instruction: get
 parse/0:   ingredient: {name: "1", value: 0, type: 2-10, properties: ["1": "address":"channel", "deref": ]}
 parse/0:   ingredient: {name: "first-free", value: 0, type: 0, properties: ["first-free": "offset"]}
 parse/0:   product: {name: "3", value: 0, type: 1, properties: ["3": "integer"]}
diff --git a/cpp/.traces/channel-new-empty-not-full b/cpp/.traces/channel-new-empty-not-full
index 94914ebe..d28c1a7a 100644
--- a/cpp/.traces/channel-new-empty-not-full
+++ b/cpp/.traces/channel-new-empty-not-full
@@ -1,10 +1,10 @@
-parse/0: instruction: 108
+parse/0: instruction: init-channel
 parse/0:   ingredient: {name: "3", value: 0, type: 0, properties: ["3": "literal", "capacity": ]}
 parse/0:   product: {name: "1", value: 0, type: 2-10, properties: ["1": "address":"channel"]}
-parse/0: instruction: 112
+parse/0: instruction: channel-empty?
 parse/0:   ingredient: {name: "1", value: 0, type: 2-10, properties: ["1": "address":"channel"]}
 parse/0:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
-parse/0: instruction: 110
+parse/0: instruction: channel-full?
 parse/0:   ingredient: {name: "1", value: 0, type: 2-10, properties: ["1": "address":"channel"]}
 parse/0:   product: {name: "3", value: 0, type: 1, properties: ["3": "integer"]}
 after-brace/0: recipe test-channel-new-empty-not-full
diff --git a/cpp/.traces/channel-read-increments-full b/cpp/.traces/channel-read-increments-full
index 0dd58952..6346dc7f 100644
--- a/cpp/.traces/channel-read-increments-full
+++ b/cpp/.traces/channel-read-increments-full
@@ -1,19 +1,19 @@
-parse/0: instruction: 108
+parse/0: instruction: init-channel
 parse/0:   ingredient: {name: "3", value: 0, type: 0, properties: ["3": "literal", "capacity": ]}
 parse/0:   product: {name: "1", value: 0, type: 2-10, properties: ["1": "address":"channel"]}
-parse/0: instruction: 109
+parse/0: instruction: write
 parse/0:   ingredient: {name: "1", value: 0, type: 2-10, properties: ["1": "address":"channel"]}
 parse/0:   ingredient: {name: "34", value: 0, type: 0, properties: ["34": "literal"]}
 parse/0:   product: {name: "1", value: 0, type: 2-10, properties: ["1": "address":"channel"]}
-parse/0: instruction: 111
+parse/0: instruction: read
 parse/0:   ingredient: {name: "1", value: 0, type: 2-10, properties: ["1": "address":"channel"]}
 parse/0:   product: {name: "_", value: 0, type: 0, properties: ["_": "dummy"]}
 parse/0:   product: {name: "1", value: 0, type: 2-10, properties: ["1": "address":"channel"]}
-parse/0: instruction: 20
+parse/0: instruction: get
 parse/0:   ingredient: {name: "1", value: 0, type: 2-10, properties: ["1": "address":"channel", "deref": ]}
 parse/0:   ingredient: {name: "first-full", value: 0, type: 0, properties: ["first-full": "offset"]}
 parse/0:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
-parse/0: instruction: 20
+parse/0: instruction: get
 parse/0:   ingredient: {name: "1", value: 0, type: 2-10, properties: ["1": "address":"channel", "deref": ]}
 parse/0:   ingredient: {name: "first-free", value: 0, type: 0, properties: ["first-free": "offset"]}
 parse/0:   product: {name: "3", value: 0, type: 1, properties: ["3": "integer"]}
diff --git a/cpp/.traces/channel-read-not-full b/cpp/.traces/channel-read-not-full
index 8f754bad..9cacc02b 100644
--- a/cpp/.traces/channel-read-not-full
+++ b/cpp/.traces/channel-read-not-full
@@ -1,18 +1,18 @@
-parse/0: instruction: 108
+parse/0: instruction: init-channel
 parse/0:   ingredient: {name: "1", value: 0, type: 0, properties: ["1": "literal", "capacity": ]}
 parse/0:   product: {name: "1", value: 0, type: 2-10, properties: ["1": "address":"channel"]}
-parse/0: instruction: 109
+parse/0: instruction: write
 parse/0:   ingredient: {name: "1", value: 0, type: 2-10, properties: ["1": "address":"channel"]}
 parse/0:   ingredient: {name: "34", value: 0, type: 0, properties: ["34": "literal"]}
 parse/0:   product: {name: "1", value: 0, type: 2-10, properties: ["1": "address":"channel"]}
-parse/0: instruction: 111
+parse/0: instruction: read
 parse/0:   ingredient: {name: "1", value: 0, type: 2-10, properties: ["1": "address":"channel"]}
 parse/0:   product: {name: "_", value: 0, type: 0, properties: ["_": "dummy"]}
 parse/0:   product: {name: "1", value: 0, type: 2-10, properties: ["1": "address":"channel"]}
-parse/0: instruction: 112
+parse/0: instruction: channel-empty?
 parse/0:   ingredient: {name: "1", value: 0, type: 2-10, properties: ["1": "address":"channel"]}
 parse/0:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
-parse/0: instruction: 110
+parse/0: instruction: channel-full?
 parse/0:   ingredient: {name: "1", value: 0, type: 2-10, properties: ["1": "address":"channel"]}
 parse/0:   product: {name: "3", value: 0, type: 1, properties: ["3": "integer"]}
 after-brace/0: recipe test-channel-read-not-full
diff --git a/cpp/.traces/channel-wrap b/cpp/.traces/channel-wrap
index 8b55b85b..53e74673 100644
--- a/cpp/.traces/channel-wrap
+++ b/cpp/.traces/channel-wrap
@@ -1,35 +1,35 @@
-parse/0: instruction: 108
+parse/0: instruction: init-channel
 parse/0:   ingredient: {name: "1", value: 0, type: 0, properties: ["1": "literal", "capacity": ]}
 parse/0:   product: {name: "1", value: 0, type: 2-10, properties: ["1": "address":"channel"]}
-parse/0: instruction: 109
+parse/0: instruction: write
 parse/0:   ingredient: {name: "1", value: 0, type: 2-10, properties: ["1": "address":"channel"]}
 parse/0:   ingredient: {name: "34", value: 0, type: 0, properties: ["34": "literal"]}
 parse/0:   product: {name: "1", value: 0, type: 2-10, properties: ["1": "address":"channel"]}
-parse/0: instruction: 111
+parse/0: instruction: read
 parse/0:   ingredient: {name: "1", value: 0, type: 2-10, properties: ["1": "address":"channel"]}
 parse/0:   product: {name: "_", value: 0, type: 0, properties: ["_": "dummy"]}
 parse/0:   product: {name: "1", value: 0, type: 2-10, properties: ["1": "address":"channel"]}
-parse/0: instruction: 20
+parse/0: instruction: get
 parse/0:   ingredient: {name: "1", value: 0, type: 2-10, properties: ["1": "address":"channel", "deref": ]}
 parse/0:   ingredient: {name: "first-free", value: 0, type: 0, properties: ["first-free": "offset"]}
 parse/0:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
-parse/0: instruction: 20
+parse/0: instruction: get
 parse/0:   ingredient: {name: "1", value: 0, type: 2-10, properties: ["1": "address":"channel", "deref": ]}
 parse/0:   ingredient: {name: "first-free", value: 0, type: 0, properties: ["first-free": "offset"]}
 parse/0:   product: {name: "3", value: 0, type: 1, properties: ["3": "integer"]}
-parse/0: instruction: 109
+parse/0: instruction: write
 parse/0:   ingredient: {name: "1", value: 0, type: 2-10, properties: ["1": "address":"channel"]}
 parse/0:   ingredient: {name: "34", value: 0, type: 0, properties: ["34": "literal"]}
 parse/0:   product: {name: "1", value: 0, type: 2-10, properties: ["1": "address":"channel"]}
-parse/0: instruction: 20
+parse/0: instruction: get
 parse/0:   ingredient: {name: "1", value: 0, type: 2-10, properties: ["1": "address":"channel", "deref": ]}
 parse/0:   ingredient: {name: "first-free", value: 0, type: 0, properties: ["first-free": "offset"]}
 parse/0:   product: {name: "4", value: 0, type: 1, properties: ["4": "integer"]}
-parse/0: instruction: 111
+parse/0: instruction: read
 parse/0:   ingredient: {name: "1", value: 0, type: 2-10, properties: ["1": "address":"channel"]}
 parse/0:   product: {name: "_", value: 0, type: 0, properties: ["_": "dummy"]}
 parse/0:   product: {name: "1", value: 0, type: 2-10, properties: ["1": "address":"channel"]}
-parse/0: instruction: 20
+parse/0: instruction: get
 parse/0:   ingredient: {name: "1", value: 0, type: 2-10, properties: ["1": "address":"channel", "deref": ]}
 parse/0:   ingredient: {name: "first-full", value: 0, type: 0, properties: ["first-full": "offset"]}
 parse/0:   product: {name: "5", value: 0, type: 1, properties: ["5": "integer"]}
diff --git a/cpp/.traces/channel-write-full b/cpp/.traces/channel-write-full
index 8385986c..857b4756 100644
--- a/cpp/.traces/channel-write-full
+++ b/cpp/.traces/channel-write-full
@@ -1,14 +1,14 @@
-parse/0: instruction: 108
+parse/0: instruction: init-channel
 parse/0:   ingredient: {name: "1", value: 0, type: 0, properties: ["1": "literal", "capacity": ]}
 parse/0:   product: {name: "1", value: 0, type: 2-10, properties: ["1": "address":"channel"]}
-parse/0: instruction: 109
+parse/0: instruction: write
 parse/0:   ingredient: {name: "1", value: 0, type: 2-10, properties: ["1": "address":"channel"]}
 parse/0:   ingredient: {name: "34", value: 0, type: 0, properties: ["34": "literal"]}
 parse/0:   product: {name: "1", value: 0, type: 2-10, properties: ["1": "address":"channel"]}
-parse/0: instruction: 112
+parse/0: instruction: channel-empty?
 parse/0:   ingredient: {name: "1", value: 0, type: 2-10, properties: ["1": "address":"channel"]}
 parse/0:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
-parse/0: instruction: 110
+parse/0: instruction: channel-full?
 parse/0:   ingredient: {name: "1", value: 0, type: 2-10, properties: ["1": "address":"channel"]}
 parse/0:   product: {name: "3", value: 0, type: 1, properties: ["3": "integer"]}
 after-brace/0: recipe test-channel-write-full
diff --git a/cpp/.traces/channel-write-increments-free b/cpp/.traces/channel-write-increments-free
index 1f5b701b..753221a1 100644
--- a/cpp/.traces/channel-write-increments-free
+++ b/cpp/.traces/channel-write-increments-free
@@ -1,15 +1,15 @@
-parse/0: instruction: 108
+parse/0: instruction: init-channel
 parse/0:   ingredient: {name: "3", value: 0, type: 0, properties: ["3": "literal", "capacity": ]}
 parse/0:   product: {name: "1", value: 0, type: 2-10, properties: ["1": "address":"channel"]}
-parse/0: instruction: 109
+parse/0: instruction: write
 parse/0:   ingredient: {name: "1", value: 0, type: 2-10, properties: ["1": "address":"channel"]}
 parse/0:   ingredient: {name: "34", value: 0, type: 0, properties: ["34": "literal"]}
 parse/0:   product: {name: "1", value: 0, type: 2-10, properties: ["1": "address":"channel"]}
-parse/0: instruction: 20
+parse/0: instruction: get
 parse/0:   ingredient: {name: "1", value: 0, type: 2-10, properties: ["1": "address":"channel", "deref": ]}
 parse/0:   ingredient: {name: "first-full", value: 0, type: 0, properties: ["first-full": "offset"]}
 parse/0:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
-parse/0: instruction: 20
+parse/0: instruction: get
 parse/0:   ingredient: {name: "1", value: 0, type: 2-10, properties: ["1": "address":"channel", "deref": ]}
 parse/0:   ingredient: {name: "first-free", value: 0, type: 0, properties: ["first-free": "offset"]}
 parse/0:   product: {name: "3", value: 0, type: 1, properties: ["3": "integer"]}
diff --git a/cpp/.traces/channel-write-not-empty b/cpp/.traces/channel-write-not-empty
index 8b361b26..42d19d26 100644
--- a/cpp/.traces/channel-write-not-empty
+++ b/cpp/.traces/channel-write-not-empty
@@ -1,14 +1,14 @@
-parse/0: instruction: 108
+parse/0: instruction: init-channel
 parse/0:   ingredient: {name: "3", value: 0, type: 0, properties: ["3": "literal", "capacity": ]}
 parse/0:   product: {name: "1", value: 0, type: 2-10, properties: ["1": "address":"channel"]}
-parse/0: instruction: 109
+parse/0: instruction: write
 parse/0:   ingredient: {name: "1", value: 0, type: 2-10, properties: ["1": "address":"channel"]}
 parse/0:   ingredient: {name: "34", value: 0, type: 0, properties: ["34": "literal"]}
 parse/0:   product: {name: "1", value: 0, type: 2-10, properties: ["1": "address":"channel"]}
-parse/0: instruction: 112
+parse/0: instruction: channel-empty?
 parse/0:   ingredient: {name: "1", value: 0, type: 2-10, properties: ["1": "address":"channel"]}
 parse/0:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
-parse/0: instruction: 110
+parse/0: instruction: channel-full?
 parse/0:   ingredient: {name: "1", value: 0, type: 2-10, properties: ["1": "address":"channel"]}
 parse/0:   product: {name: "3", value: 0, type: 1, properties: ["3": "integer"]}
 after-brace/0: recipe test-channel-write-not-empty
diff --git a/cpp/.traces/check_string_in_memory b/cpp/.traces/check_string_in_memory
index 69b0852b..3830dc47 100644
--- a/cpp/.traces/check_string_in_memory
+++ b/cpp/.traces/check_string_in_memory
@@ -1,13 +1,13 @@
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "3", value: 0, type: 0, properties: ["3": "literal"]}
 parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "97", value: 0, type: 0, properties: ["97": "literal"]}
 parse/0:   product: {name: "2", value: 0, type: 4, properties: ["2": "character"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "98", value: 0, type: 0, properties: ["98": "literal"]}
 parse/0:   product: {name: "3", value: 0, type: 4, properties: ["3": "character"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "99", value: 0, type: 0, properties: ["99": "literal"]}
 parse/0:   product: {name: "4", value: 0, type: 4, properties: ["4": "character"]}
 after-brace/0: recipe test-check_string_in_memory
diff --git a/cpp/.traces/closure b/cpp/.traces/closure
index d9fff00a..047b3a7d 100644
--- a/cpp/.traces/closure
+++ b/cpp/.traces/closure
@@ -1,41 +1,41 @@
-parse/0: instruction: 38
+parse/0: instruction: new
 parse/0:   ingredient: {name: "location", value: 0, type: 0, properties: ["location": "type"]}
 parse/0:   ingredient: {name: "30", value: 0, type: 0, properties: ["30": "literal"]}
 parse/0:   product: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]}
-parse/0: instruction: 1001
+parse/0: instruction: init-counter
 parse/0:   product: {name: "1", value: 0, type: 2-5-1, properties: ["1": "address":"array":"location", "names": "init-counter"]}
-parse/0: instruction: 1002
+parse/0: instruction: increment-counter
 parse/0:   ingredient: {name: "1", value: 0, type: 2-5-1, properties: ["1": "address":"array":"location", "names": "init-counter"]}
 parse/0:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer", "raw": ]}
-parse/0: instruction: 1002
+parse/0: instruction: increment-counter
 parse/0:   ingredient: {name: "1", value: 0, type: 2-5-1, properties: ["1": "address":"array":"location", "names": "init-counter"]}
 parse/0:   product: {name: "3", value: 0, type: 1, properties: ["3": "integer", "raw": ]}
-parse/0: instruction: 38
+parse/0: instruction: new
 parse/0:   ingredient: {name: "location", value: 0, type: 0, properties: ["location": "type"]}
 parse/0:   ingredient: {name: "30", value: 0, type: 0, properties: ["30": "literal"]}
 parse/0:   product: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "23", value: 0, type: 0, properties: ["23": "literal"]}
 parse/0:   product: {name: "x", value: 0, type: 1, properties: ["x": "integer"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "3", value: 0, type: 0, properties: ["3": "literal"]}
 parse/0:   product: {name: "y", value: 0, type: 1, properties: ["y": "integer"]}
-parse/0: instruction: 29
+parse/0: instruction: reply
 parse/0:   ingredient: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]}
-parse/0: instruction: 38
+parse/0: instruction: new
 parse/0:   ingredient: {name: "space", value: 0, type: 0, properties: ["space": "literal"]}
 parse/0:   ingredient: {name: "30", value: 0, type: 0, properties: ["30": "literal"]}
 parse/0:   product: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]}
-parse/0: instruction: 26
+parse/0: instruction: next-ingredient
 parse/0:   product: {name: "0", value: 0, type: 2-5-1, properties: ["0": "address":"array":"location", "names": "init-counter"]}
-parse/0: instruction: 2
+parse/0: instruction: add
 parse/0:   ingredient: {name: "y", value: 0, type: 1, properties: ["y": "integer", "space": "1"]}
 parse/0:   ingredient: {name: "1", value: 0, type: 0, properties: ["1": "literal"]}
 parse/0:   product: {name: "y", value: 0, type: 1, properties: ["y": "integer", "space": "1"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "234", value: 0, type: 0, properties: ["234": "literal"]}
 parse/0:   product: {name: "y", value: 0, type: 1, properties: ["y": "integer"]}
-parse/0: instruction: 29
+parse/0: instruction: reply
 parse/0:   ingredient: {name: "y", value: 0, type: 1, properties: ["y": "integer", "space": "1"]}
 name/0: recipe increment-counter is surrounded by init-counter
 new/0: location -> 1
diff --git a/cpp/.traces/convert_names b/cpp/.traces/convert_names
index d4586867..4d8a676b 100644
--- a/cpp/.traces/convert_names
+++ b/cpp/.traces/convert_names
@@ -1,4 +1,4 @@
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 parse/0:   product: {name: "x", value: 0, type: 1, properties: ["x": "integer"]}
 name/0: assign x 1
diff --git a/cpp/.traces/convert_names_handles_containers b/cpp/.traces/convert_names_handles_containers
index 0073519a..1b50d2fb 100644
--- a/cpp/.traces/convert_names_handles_containers
+++ b/cpp/.traces/convert_names_handles_containers
@@ -1,7 +1,7 @@
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 parse/0:   product: {name: "a", value: 0, type: 6, properties: ["a": "point"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 parse/0:   product: {name: "b", value: 0, type: 1, properties: ["b": "integer"]}
 name/0: assign a 1
diff --git a/cpp/.traces/convert_names_passes_default_space b/cpp/.traces/convert_names_passes_default_space
index fc78640e..c3a163bc 100644
--- a/cpp/.traces/convert_names_passes_default_space
+++ b/cpp/.traces/convert_names_passes_default_space
@@ -1,4 +1,4 @@
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 parse/0:   product: {name: "default-space", value: 0, type: 1, properties: ["default-space": "integer"]}
 parse/0:   product: {name: "x", value: 0, type: 1, properties: ["x": "integer"]}
diff --git a/cpp/.traces/convert_names_passes_dummy b/cpp/.traces/convert_names_passes_dummy
index 9ec0fca9..83d5c510 100644
--- a/cpp/.traces/convert_names_passes_dummy
+++ b/cpp/.traces/convert_names_passes_dummy
@@ -1,4 +1,4 @@
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 parse/0:   product: {name: "_", value: 0, type: 0, properties: ["_": "dummy"]}
 parse/0:   product: {name: "x", value: 0, type: 1, properties: ["x": "integer"]}
diff --git a/cpp/.traces/convert_names_passes_raw b/cpp/.traces/convert_names_passes_raw
index a012d363..e1d35cb7 100644
--- a/cpp/.traces/convert_names_passes_raw
+++ b/cpp/.traces/convert_names_passes_raw
@@ -1,4 +1,4 @@
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 parse/0:   product: {name: "x", value: 0, type: 1, properties: ["x": "integer", "raw": ]}
 after-brace/0: recipe main
diff --git a/cpp/.traces/convert_names_transforms_container_elements b/cpp/.traces/convert_names_transforms_container_elements
index 3dbd14a4..64200f1e 100644
--- a/cpp/.traces/convert_names_transforms_container_elements
+++ b/cpp/.traces/convert_names_transforms_container_elements
@@ -1,8 +1,8 @@
-parse/0: instruction: 20
+parse/0: instruction: get
 parse/0:   ingredient: {name: "0", value: 0, type: 6, properties: ["0": "point"]}
 parse/0:   ingredient: {name: "y", value: 0, type: 0, properties: ["y": "offset"]}
 parse/0:   product: {name: "a", value: 0, type: 1, properties: ["a": "integer"]}
-parse/0: instruction: 20
+parse/0: instruction: get
 parse/0:   ingredient: {name: "0", value: 0, type: 6, properties: ["0": "point"]}
 parse/0:   ingredient: {name: "x", value: 0, type: 0, properties: ["x": "offset"]}
 parse/0:   product: {name: "b", value: 0, type: 1, properties: ["b": "integer"]}
diff --git a/cpp/.traces/convert_names_warns b/cpp/.traces/convert_names_warns
index 93676ca2..3a4204dc 100644
--- a/cpp/.traces/convert_names_warns
+++ b/cpp/.traces/convert_names_warns
@@ -1,4 +1,4 @@
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "y", value: 0, type: 1, properties: ["y": "integer"]}
 parse/0:   product: {name: "x", value: 0, type: 1, properties: ["x": "integer"]}
 warn/0: use before set: y in main
diff --git a/cpp/.traces/copy b/cpp/.traces/copy
index 70927741..17a10725 100644
--- a/cpp/.traces/copy
+++ b/cpp/.traces/copy
@@ -1,7 +1,7 @@
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "23", value: 0, type: 0, properties: ["23": "literal"]}
 parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
 parse/0:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
 after-brace/0: recipe main
diff --git a/cpp/.traces/copy_array b/cpp/.traces/copy_array
index 67d33ad7..693d0c56 100644
--- a/cpp/.traces/copy_array
+++ b/cpp/.traces/copy_array
@@ -1,16 +1,16 @@
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "3", value: 0, type: 0, properties: ["3": "literal"]}
 parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "14", value: 0, type: 0, properties: ["14": "literal"]}
 parse/0:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "15", value: 0, type: 0, properties: ["15": "literal"]}
 parse/0:   product: {name: "3", value: 0, type: 1, properties: ["3": "integer"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "16", value: 0, type: 0, properties: ["16": "literal"]}
 parse/0:   product: {name: "4", value: 0, type: 1, properties: ["4": "integer"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "1", value: 0, type: 5-1, properties: ["1": "array":"integer"]}
 parse/0:   product: {name: "5", value: 0, type: 5-1, properties: ["5": "array":"integer"]}
 after-brace/0: recipe main
diff --git a/cpp/.traces/copy_array_indirect b/cpp/.traces/copy_array_indirect
index 663c4068..e09614f9 100644
--- a/cpp/.traces/copy_array_indirect
+++ b/cpp/.traces/copy_array_indirect
@@ -1,19 +1,19 @@
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "3", value: 0, type: 0, properties: ["3": "literal"]}
 parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "14", value: 0, type: 0, properties: ["14": "literal"]}
 parse/0:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "15", value: 0, type: 0, properties: ["15": "literal"]}
 parse/0:   product: {name: "3", value: 0, type: 1, properties: ["3": "integer"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "16", value: 0, type: 0, properties: ["16": "literal"]}
 parse/0:   product: {name: "4", value: 0, type: 1, properties: ["4": "integer"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "1", value: 0, type: 0, properties: ["1": "literal"]}
 parse/0:   product: {name: "5", value: 0, type: 2-5-1, properties: ["5": "address":"array":"integer"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "5", value: 0, type: 2-5-1, properties: ["5": "address":"array":"integer", "deref": ]}
 parse/0:   product: {name: "6", value: 0, type: 5-1, properties: ["6": "array":"integer"]}
 after-brace/0: recipe main
diff --git a/cpp/.traces/copy_exclusive_container b/cpp/.traces/copy_exclusive_container
index 3b6ce08c..e6add356 100644
--- a/cpp/.traces/copy_exclusive_container
+++ b/cpp/.traces/copy_exclusive_container
@@ -1,13 +1,13 @@
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "1", value: 0, type: 0, properties: ["1": "literal"]}
 parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "34", value: 0, type: 0, properties: ["34": "literal"]}
 parse/0:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "35", value: 0, type: 0, properties: ["35": "literal"]}
 parse/0:   product: {name: "3", value: 0, type: 1, properties: ["3": "integer"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "1", value: 0, type: 8, properties: ["1": "integer-or-point"]}
 parse/0:   product: {name: "4", value: 0, type: 8, properties: ["4": "integer-or-point"]}
 after-brace/0: recipe main
diff --git a/cpp/.traces/copy_handles_nested_container_elements b/cpp/.traces/copy_handles_nested_container_elements
index 85c31ba6..f220c077 100644
--- a/cpp/.traces/copy_handles_nested_container_elements
+++ b/cpp/.traces/copy_handles_nested_container_elements
@@ -1,13 +1,13 @@
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "34", value: 0, type: 0, properties: ["34": "literal"]}
 parse/0:   product: {name: "12", value: 0, type: 1, properties: ["12": "integer"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "35", value: 0, type: 0, properties: ["35": "literal"]}
 parse/0:   product: {name: "13", value: 0, type: 1, properties: ["13": "integer"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "36", value: 0, type: 0, properties: ["36": "literal"]}
 parse/0:   product: {name: "14", value: 0, type: 1, properties: ["14": "integer"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "12", value: 0, type: 7, properties: ["12": "point-integer"]}
 parse/0:   product: {name: "15", value: 0, type: 7, properties: ["15": "point-integer"]}
 after-brace/0: recipe main
diff --git a/cpp/.traces/copy_indirect b/cpp/.traces/copy_indirect
index 033c5364..72f4fe80 100644
--- a/cpp/.traces/copy_indirect
+++ b/cpp/.traces/copy_indirect
@@ -1,10 +1,10 @@
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "2", value: 0, type: 0, properties: ["2": "literal"]}
 parse/0:   product: {name: "1", value: 0, type: 2-1, properties: ["1": "address":"integer"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "34", value: 0, type: 0, properties: ["34": "literal"]}
 parse/0:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "1", value: 0, type: 2-1, properties: ["1": "address":"integer", "deref": ]}
 parse/0:   product: {name: "3", value: 0, type: 1, properties: ["3": "integer"]}
 after-brace/0: recipe main
diff --git a/cpp/.traces/copy_literal b/cpp/.traces/copy_literal
index 6b553106..6c3d0d7a 100644
--- a/cpp/.traces/copy_literal
+++ b/cpp/.traces/copy_literal
@@ -1,4 +1,4 @@
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "23", value: 0, type: 0, properties: ["23": "literal"]}
 parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
 after-brace/0: recipe main
diff --git a/cpp/.traces/copy_multiple_locations b/cpp/.traces/copy_multiple_locations
index 8e574786..815d4ea9 100644
--- a/cpp/.traces/copy_multiple_locations
+++ b/cpp/.traces/copy_multiple_locations
@@ -1,10 +1,10 @@
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "34", value: 0, type: 0, properties: ["34": "literal"]}
 parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "35", value: 0, type: 0, properties: ["35": "literal"]}
 parse/0:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "1", value: 0, type: 6, properties: ["1": "point"]}
 parse/0:   product: {name: "3", value: 0, type: 6, properties: ["3": "point"]}
 after-brace/0: recipe main
diff --git a/cpp/.traces/deref_sidesteps_default_space b/cpp/.traces/deref_sidesteps_default_space
index dc42c84e..4d406fc7 100644
--- a/cpp/.traces/deref_sidesteps_default_space
+++ b/cpp/.traces/deref_sidesteps_default_space
@@ -1,16 +1,16 @@
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "34", value: 0, type: 0, properties: ["34": "literal"]}
 parse/0:   product: {name: "3", value: 0, type: 1, properties: ["3": "integer"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "5", value: 0, type: 0, properties: ["5": "literal"]}
 parse/0:   product: {name: "1000", value: 0, type: 1, properties: ["1000": "integer"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "1000", value: 0, type: 0, properties: ["1000": "literal"]}
 parse/0:   product: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "3", value: 0, type: 0, properties: ["3": "literal"]}
 parse/0:   product: {name: "1", value: 0, type: 2-1, properties: ["1": "address":"integer"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "1", value: 0, type: 2-1, properties: ["1": "address":"integer", "deref": ]}
 parse/0:   product: {name: "8", value: 0, type: 1, properties: ["8": "integer", "raw": ]}
 after-brace/0: recipe main
diff --git a/cpp/.traces/deref_sidesteps_default_space_in_get b/cpp/.traces/deref_sidesteps_default_space_in_get
index 8f82f134..0bc10c1e 100644
--- a/cpp/.traces/deref_sidesteps_default_space_in_get
+++ b/cpp/.traces/deref_sidesteps_default_space_in_get
@@ -1,19 +1,19 @@
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "34", value: 0, type: 0, properties: ["34": "literal"]}
 parse/0:   product: {name: "12", value: 0, type: 1, properties: ["12": "integer"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "35", value: 0, type: 0, properties: ["35": "literal"]}
 parse/0:   product: {name: "13", value: 0, type: 1, properties: ["13": "integer"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "5", value: 0, type: 0, properties: ["5": "literal"]}
 parse/0:   product: {name: "1000", value: 0, type: 1, properties: ["1000": "integer"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "1000", value: 0, type: 0, properties: ["1000": "literal"]}
 parse/0:   product: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "12", value: 0, type: 0, properties: ["12": "literal"]}
 parse/0:   product: {name: "1", value: 0, type: 2-6, properties: ["1": "address":"point"]}
-parse/0: instruction: 20
+parse/0: instruction: get
 parse/0:   ingredient: {name: "1", value: 0, type: 2-6, properties: ["1": "address":"point", "deref": ]}
 parse/0:   ingredient: {name: "1", value: 0, type: 0, properties: ["1": "offset"]}
 parse/0:   product: {name: "9", value: 0, type: 1, properties: ["9": "integer", "raw": ]}
diff --git a/cpp/.traces/deref_sidesteps_default_space_in_index b/cpp/.traces/deref_sidesteps_default_space_in_index
index 0c273faa..97d3e806 100644
--- a/cpp/.traces/deref_sidesteps_default_space_in_index
+++ b/cpp/.traces/deref_sidesteps_default_space_in_index
@@ -1,22 +1,22 @@
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "2", value: 0, type: 0, properties: ["2": "literal"]}
 parse/0:   product: {name: "12", value: 0, type: 1, properties: ["12": "integer"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "34", value: 0, type: 0, properties: ["34": "literal"]}
 parse/0:   product: {name: "13", value: 0, type: 1, properties: ["13": "integer"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "35", value: 0, type: 0, properties: ["35": "literal"]}
 parse/0:   product: {name: "14", value: 0, type: 1, properties: ["14": "integer"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "5", value: 0, type: 0, properties: ["5": "literal"]}
 parse/0:   product: {name: "1000", value: 0, type: 1, properties: ["1000": "integer"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "1000", value: 0, type: 0, properties: ["1000": "literal"]}
 parse/0:   product: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "12", value: 0, type: 0, properties: ["12": "literal"]}
 parse/0:   product: {name: "1", value: 0, type: 2-5-1, properties: ["1": "address":"array":"integer"]}
-parse/0: instruction: 22
+parse/0: instruction: index
 parse/0:   ingredient: {name: "1", value: 0, type: 2-5-1, properties: ["1": "address":"array":"integer", "deref": ]}
 parse/0:   ingredient: {name: "1", value: 0, type: 0, properties: ["1": "literal"]}
 parse/0:   product: {name: "9", value: 0, type: 1, properties: ["9": "integer", "raw": ]}
diff --git a/cpp/.traces/divide b/cpp/.traces/divide
index 514c94e0..87c827d6 100644
--- a/cpp/.traces/divide
+++ b/cpp/.traces/divide
@@ -1,10 +1,10 @@
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "27", value: 0, type: 0, properties: ["27": "literal"]}
 parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "3", value: 0, type: 0, properties: ["3": "literal"]}
 parse/0:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
-parse/0: instruction: 5
+parse/0: instruction: divide
 parse/0:   ingredient: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
 parse/0:   ingredient: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
 parse/0:   product: {name: "3", value: 0, type: 1, properties: ["3": "integer"]}
diff --git a/cpp/.traces/divide_literal b/cpp/.traces/divide_literal
index e42b09a6..9b3c8934 100644
--- a/cpp/.traces/divide_literal
+++ b/cpp/.traces/divide_literal
@@ -1,4 +1,4 @@
-parse/0: instruction: 5
+parse/0: instruction: divide
 parse/0:   ingredient: {name: "8", value: 0, type: 0, properties: ["8": "literal"]}
 parse/0:   ingredient: {name: "2", value: 0, type: 0, properties: ["2": "literal"]}
 parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
diff --git a/cpp/.traces/divide_with_remainder b/cpp/.traces/divide_with_remainder
index 97549ee6..3f680232 100644
--- a/cpp/.traces/divide_with_remainder
+++ b/cpp/.traces/divide_with_remainder
@@ -1,10 +1,10 @@
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "27", value: 0, type: 0, properties: ["27": "literal"]}
 parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "11", value: 0, type: 0, properties: ["11": "literal"]}
 parse/0:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
-parse/0: instruction: 6
+parse/0: instruction: divide-with-remainder
 parse/0:   ingredient: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
 parse/0:   ingredient: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
 parse/0:   product: {name: "3", value: 0, type: 1, properties: ["3": "integer"]}
diff --git a/cpp/.traces/divide_with_remainder_literal b/cpp/.traces/divide_with_remainder_literal
index bd76621f..01e4abb0 100644
--- a/cpp/.traces/divide_with_remainder_literal
+++ b/cpp/.traces/divide_with_remainder_literal
@@ -1,4 +1,4 @@
-parse/0: instruction: 6
+parse/0: instruction: divide-with-remainder
 parse/0:   ingredient: {name: "9", value: 0, type: 0, properties: ["9": "literal"]}
 parse/0:   ingredient: {name: "2", value: 0, type: 0, properties: ["2": "literal"]}
 parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
diff --git a/cpp/.traces/equal b/cpp/.traces/equal
index 6f561c1f..7c5a280a 100644
--- a/cpp/.traces/equal
+++ b/cpp/.traces/equal
@@ -1,10 +1,10 @@
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "34", value: 0, type: 0, properties: ["34": "literal"]}
 parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "33", value: 0, type: 0, properties: ["33": "literal"]}
 parse/0:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
-parse/0: instruction: 13
+parse/0: instruction: equal
 parse/0:   ingredient: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
 parse/0:   ingredient: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
 parse/0:   product: {name: "3", value: 0, type: 1, properties: ["3": "integer"]}
diff --git a/cpp/.traces/equal2 b/cpp/.traces/equal2
index 2ca201bd..e76a9aff 100644
--- a/cpp/.traces/equal2
+++ b/cpp/.traces/equal2
@@ -1,10 +1,10 @@
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "34", value: 0, type: 0, properties: ["34": "literal"]}
 parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "34", value: 0, type: 0, properties: ["34": "literal"]}
 parse/0:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
-parse/0: instruction: 13
+parse/0: instruction: equal
 parse/0:   ingredient: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
 parse/0:   ingredient: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
 parse/0:   product: {name: "3", value: 0, type: 1, properties: ["3": "integer"]}
diff --git a/cpp/.traces/first_recipe b/cpp/.traces/first_recipe
index 5fc3dbfd..5cfc15c8 100644
--- a/cpp/.traces/first_recipe
+++ b/cpp/.traces/first_recipe
@@ -1,3 +1,3 @@
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "23", value: 0, type: 0, properties: ["23": "literal"]}
 parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
diff --git a/cpp/.traces/first_scenario_checking_trace b/cpp/.traces/first_scenario_checking_trace
index b7922463..0d7566ff 100644
--- a/cpp/.traces/first_scenario_checking_trace
+++ b/cpp/.traces/first_scenario_checking_trace
@@ -1,4 +1,4 @@
-parse/0: instruction: 2
+parse/0: instruction: add
 parse/0:   ingredient: {name: "2", value: 0, type: 0, properties: ["2": "literal"]}
 parse/0:   ingredient: {name: "2", value: 0, type: 0, properties: ["2": "literal"]}
 parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
diff --git a/cpp/.traces/first_scenario_checking_trace_negative b/cpp/.traces/first_scenario_checking_trace_negative
index 90c36f6f..d84f4e82 100644
--- a/cpp/.traces/first_scenario_checking_trace_negative
+++ b/cpp/.traces/first_scenario_checking_trace_negative
@@ -1,4 +1,4 @@
-parse/0: instruction: 2
+parse/0: instruction: add
 parse/0:   ingredient: {name: "2", value: 0, type: 0, properties: ["2": "literal"]}
 parse/0:   ingredient: {name: "2", value: 0, type: 0, properties: ["2": "literal"]}
 parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
diff --git a/cpp/.traces/first_scenario_in_mu b/cpp/.traces/first_scenario_in_mu
index 1473e211..6b664104 100644
--- a/cpp/.traces/first_scenario_in_mu
+++ b/cpp/.traces/first_scenario_in_mu
@@ -1,4 +1,4 @@
-parse/0: instruction: 2
+parse/0: instruction: add
 parse/0:   ingredient: {name: "2", value: 0, type: 0, properties: ["2": "literal"]}
 parse/0:   ingredient: {name: "2", value: 0, type: 0, properties: ["2": "literal"]}
 parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
diff --git a/cpp/.traces/get b/cpp/.traces/get
index 5cb3bffa..22a263e7 100644
--- a/cpp/.traces/get
+++ b/cpp/.traces/get
@@ -1,10 +1,10 @@
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "34", value: 0, type: 0, properties: ["34": "literal"]}
 parse/0:   product: {name: "12", value: 0, type: 1, properties: ["12": "integer"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "35", value: 0, type: 0, properties: ["35": "literal"]}
 parse/0:   product: {name: "13", value: 0, type: 1, properties: ["13": "integer"]}
-parse/0: instruction: 20
+parse/0: instruction: get
 parse/0:   ingredient: {name: "12", value: 0, type: 6, properties: ["12": "point"]}
 parse/0:   ingredient: {name: "1", value: 0, type: 0, properties: ["1": "offset"]}
 parse/0:   product: {name: "15", value: 0, type: 1, properties: ["15": "integer"]}
diff --git a/cpp/.traces/get_address b/cpp/.traces/get_address
index 1cf720e0..a08a0ba4 100644
--- a/cpp/.traces/get_address
+++ b/cpp/.traces/get_address
@@ -1,10 +1,10 @@
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "34", value: 0, type: 0, properties: ["34": "literal"]}
 parse/0:   product: {name: "12", value: 0, type: 1, properties: ["12": "integer"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "35", value: 0, type: 0, properties: ["35": "literal"]}
 parse/0:   product: {name: "13", value: 0, type: 1, properties: ["13": "integer"]}
-parse/0: instruction: 21
+parse/0: instruction: get-address
 parse/0:   ingredient: {name: "12", value: 0, type: 6, properties: ["12": "point"]}
 parse/0:   ingredient: {name: "1", value: 0, type: 0, properties: ["1": "offset"]}
 parse/0:   product: {name: "15", value: 0, type: 2-1, properties: ["15": "address":"integer"]}
diff --git a/cpp/.traces/get_address_indirect b/cpp/.traces/get_address_indirect
index 45b0664b..e933a536 100644
--- a/cpp/.traces/get_address_indirect
+++ b/cpp/.traces/get_address_indirect
@@ -1,13 +1,13 @@
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "2", value: 0, type: 0, properties: ["2": "literal"]}
 parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "34", value: 0, type: 0, properties: ["34": "literal"]}
 parse/0:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "35", value: 0, type: 0, properties: ["35": "literal"]}
 parse/0:   product: {name: "3", value: 0, type: 1, properties: ["3": "integer"]}
-parse/0: instruction: 21
+parse/0: instruction: get-address
 parse/0:   ingredient: {name: "1", value: 0, type: 2-6, properties: ["1": "address":"point", "deref": ]}
 parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: ["0": "offset"]}
 parse/0:   product: {name: "4", value: 0, type: 1, properties: ["4": "integer"]}
diff --git a/cpp/.traces/get_default_space b/cpp/.traces/get_default_space
index 3b5a9cd2..c24a357c 100644
--- a/cpp/.traces/get_default_space
+++ b/cpp/.traces/get_default_space
@@ -1,7 +1,7 @@
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "10", value: 0, type: 0, properties: ["10": "literal"]}
 parse/0:   product: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]}
 parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer", "raw": ]}
 after-brace/0: recipe main
diff --git a/cpp/.traces/get_handles_nested_container_elements b/cpp/.traces/get_handles_nested_container_elements
index 797b8e80..15563354 100644
--- a/cpp/.traces/get_handles_nested_container_elements
+++ b/cpp/.traces/get_handles_nested_container_elements
@@ -1,13 +1,13 @@
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "34", value: 0, type: 0, properties: ["34": "literal"]}
 parse/0:   product: {name: "12", value: 0, type: 1, properties: ["12": "integer"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "35", value: 0, type: 0, properties: ["35": "literal"]}
 parse/0:   product: {name: "13", value: 0, type: 1, properties: ["13": "integer"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "36", value: 0, type: 0, properties: ["36": "literal"]}
 parse/0:   product: {name: "14", value: 0, type: 1, properties: ["14": "integer"]}
-parse/0: instruction: 20
+parse/0: instruction: get
 parse/0:   ingredient: {name: "12", value: 0, type: 7, properties: ["12": "point-integer"]}
 parse/0:   ingredient: {name: "1", value: 0, type: 0, properties: ["1": "offset"]}
 parse/0:   product: {name: "15", value: 0, type: 1, properties: ["15": "integer"]}
diff --git a/cpp/.traces/get_indirect b/cpp/.traces/get_indirect
index a084d7cf..abf734c2 100644
--- a/cpp/.traces/get_indirect
+++ b/cpp/.traces/get_indirect
@@ -1,13 +1,13 @@
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "2", value: 0, type: 0, properties: ["2": "literal"]}
 parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "34", value: 0, type: 0, properties: ["34": "literal"]}
 parse/0:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "35", value: 0, type: 0, properties: ["35": "literal"]}
 parse/0:   product: {name: "3", value: 0, type: 1, properties: ["3": "integer"]}
-parse/0: instruction: 20
+parse/0: instruction: get
 parse/0:   ingredient: {name: "1", value: 0, type: 2-6, properties: ["1": "address":"point", "deref": ]}
 parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: ["0": "offset"]}
 parse/0:   product: {name: "4", value: 0, type: 1, properties: ["4": "integer"]}
diff --git a/cpp/.traces/greater_or_equal b/cpp/.traces/greater_or_equal
index 3b581053..8f20b947 100644
--- a/cpp/.traces/greater_or_equal
+++ b/cpp/.traces/greater_or_equal
@@ -1,10 +1,10 @@
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "34", value: 0, type: 0, properties: ["34": "literal"]}
 parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "33", value: 0, type: 0, properties: ["33": "literal"]}
 parse/0:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
-parse/0: instruction: 16
+parse/0: instruction: greater-or-equal
 parse/0:   ingredient: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
 parse/0:   ingredient: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
 parse/0:   product: {name: "3", value: 0, type: 1, properties: ["3": "integer"]}
diff --git a/cpp/.traces/greater_or_equal2 b/cpp/.traces/greater_or_equal2
index 8e514bb9..dc98460f 100644
--- a/cpp/.traces/greater_or_equal2
+++ b/cpp/.traces/greater_or_equal2
@@ -1,10 +1,10 @@
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "34", value: 0, type: 0, properties: ["34": "literal"]}
 parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "34", value: 0, type: 0, properties: ["34": "literal"]}
 parse/0:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
-parse/0: instruction: 16
+parse/0: instruction: greater-or-equal
 parse/0:   ingredient: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
 parse/0:   ingredient: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
 parse/0:   product: {name: "3", value: 0, type: 1, properties: ["3": "integer"]}
diff --git a/cpp/.traces/greater_or_equal3 b/cpp/.traces/greater_or_equal3
index 8a65d26b..53bf6b3b 100644
--- a/cpp/.traces/greater_or_equal3
+++ b/cpp/.traces/greater_or_equal3
@@ -1,10 +1,10 @@
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "34", value: 0, type: 0, properties: ["34": "literal"]}
 parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "35", value: 0, type: 0, properties: ["35": "literal"]}
 parse/0:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
-parse/0: instruction: 16
+parse/0: instruction: greater-or-equal
 parse/0:   ingredient: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
 parse/0:   ingredient: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
 parse/0:   product: {name: "3", value: 0, type: 1, properties: ["3": "integer"]}
diff --git a/cpp/.traces/greater_than b/cpp/.traces/greater_than
index fce3579a..648d5e5a 100644
--- a/cpp/.traces/greater_than
+++ b/cpp/.traces/greater_than
@@ -1,10 +1,10 @@
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "34", value: 0, type: 0, properties: ["34": "literal"]}
 parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "33", value: 0, type: 0, properties: ["33": "literal"]}
 parse/0:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
-parse/0: instruction: 14
+parse/0: instruction: greater-than
 parse/0:   ingredient: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
 parse/0:   ingredient: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
 parse/0:   product: {name: "3", value: 0, type: 1, properties: ["3": "integer"]}
diff --git a/cpp/.traces/greater_than2 b/cpp/.traces/greater_than2
index bcf94b01..50a39727 100644
--- a/cpp/.traces/greater_than2
+++ b/cpp/.traces/greater_than2
@@ -1,10 +1,10 @@
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "34", value: 0, type: 0, properties: ["34": "literal"]}
 parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "34", value: 0, type: 0, properties: ["34": "literal"]}
 parse/0:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
-parse/0: instruction: 14
+parse/0: instruction: greater-than
 parse/0:   ingredient: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
 parse/0:   ingredient: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
 parse/0:   product: {name: "3", value: 0, type: 1, properties: ["3": "integer"]}
diff --git a/cpp/.traces/include_nonderef_properties b/cpp/.traces/include_nonderef_properties
index 1af02dd2..184127b8 100644
--- a/cpp/.traces/include_nonderef_properties
+++ b/cpp/.traces/include_nonderef_properties
@@ -1,13 +1,13 @@
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "2", value: 0, type: 0, properties: ["2": "literal"]}
 parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "34", value: 0, type: 0, properties: ["34": "literal"]}
 parse/0:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "35", value: 0, type: 0, properties: ["35": "literal"]}
 parse/0:   product: {name: "3", value: 0, type: 1, properties: ["3": "integer"]}
-parse/0: instruction: 20
+parse/0: instruction: get
 parse/0:   ingredient: {name: "1", value: 0, type: 2-6, properties: ["1": "address":"point", "deref": , "foo": ]}
 parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: ["0": "offset"]}
 parse/0:   product: {name: "4", value: 0, type: 1, properties: ["4": "integer"]}
diff --git a/cpp/.traces/index b/cpp/.traces/index
index 006eb847..2ff0d46a 100644
--- a/cpp/.traces/index
+++ b/cpp/.traces/index
@@ -1,16 +1,16 @@
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "3", value: 0, type: 0, properties: ["3": "literal"]}
 parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "14", value: 0, type: 0, properties: ["14": "literal"]}
 parse/0:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "15", value: 0, type: 0, properties: ["15": "literal"]}
 parse/0:   product: {name: "3", value: 0, type: 1, properties: ["3": "integer"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "16", value: 0, type: 0, properties: ["16": "literal"]}
 parse/0:   product: {name: "4", value: 0, type: 1, properties: ["4": "integer"]}
-parse/0: instruction: 22
+parse/0: instruction: index
 parse/0:   ingredient: {name: "1", value: 0, type: 5-1, properties: ["1": "array":"integer"]}
 parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 parse/0:   product: {name: "5", value: 0, type: 1, properties: ["5": "integer"]}
diff --git a/cpp/.traces/index_address b/cpp/.traces/index_address
index 59ab5e2c..57e6b672 100644
--- a/cpp/.traces/index_address
+++ b/cpp/.traces/index_address
@@ -1,16 +1,16 @@
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "3", value: 0, type: 0, properties: ["3": "literal"]}
 parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "14", value: 0, type: 0, properties: ["14": "literal"]}
 parse/0:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "15", value: 0, type: 0, properties: ["15": "literal"]}
 parse/0:   product: {name: "3", value: 0, type: 1, properties: ["3": "integer"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "16", value: 0, type: 0, properties: ["16": "literal"]}
 parse/0:   product: {name: "4", value: 0, type: 1, properties: ["4": "integer"]}
-parse/0: instruction: 23
+parse/0: instruction: index-address
 parse/0:   ingredient: {name: "1", value: 0, type: 5-1, properties: ["1": "array":"integer"]}
 parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 parse/0:   product: {name: "5", value: 0, type: 1, properties: ["5": "integer"]}
diff --git a/cpp/.traces/index_direct_offset b/cpp/.traces/index_direct_offset
index 6437422e..4b15fa3b 100644
--- a/cpp/.traces/index_direct_offset
+++ b/cpp/.traces/index_direct_offset
@@ -1,19 +1,19 @@
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "3", value: 0, type: 0, properties: ["3": "literal"]}
 parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "14", value: 0, type: 0, properties: ["14": "literal"]}
 parse/0:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "15", value: 0, type: 0, properties: ["15": "literal"]}
 parse/0:   product: {name: "3", value: 0, type: 1, properties: ["3": "integer"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "16", value: 0, type: 0, properties: ["16": "literal"]}
 parse/0:   product: {name: "4", value: 0, type: 1, properties: ["4": "integer"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 parse/0:   product: {name: "5", value: 0, type: 1, properties: ["5": "integer"]}
-parse/0: instruction: 22
+parse/0: instruction: index
 parse/0:   ingredient: {name: "1", value: 0, type: 5-1, properties: ["1": "array":"integer"]}
 parse/0:   ingredient: {name: "5", value: 0, type: 1, properties: ["5": "integer"]}
 parse/0:   product: {name: "6", value: 0, type: 1, properties: ["6": "integer"]}
diff --git a/cpp/.traces/index_indirect b/cpp/.traces/index_indirect
index 0f2ccc49..d2963e34 100644
--- a/cpp/.traces/index_indirect
+++ b/cpp/.traces/index_indirect
@@ -1,19 +1,19 @@
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "3", value: 0, type: 0, properties: ["3": "literal"]}
 parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "14", value: 0, type: 0, properties: ["14": "literal"]}
 parse/0:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "15", value: 0, type: 0, properties: ["15": "literal"]}
 parse/0:   product: {name: "3", value: 0, type: 1, properties: ["3": "integer"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "16", value: 0, type: 0, properties: ["16": "literal"]}
 parse/0:   product: {name: "4", value: 0, type: 1, properties: ["4": "integer"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "1", value: 0, type: 0, properties: ["1": "literal"]}
 parse/0:   product: {name: "5", value: 0, type: 2-5-1, properties: ["5": "address":"array":"integer"]}
-parse/0: instruction: 22
+parse/0: instruction: index
 parse/0:   ingredient: {name: "5", value: 0, type: 2-5-1, properties: ["5": "address":"array":"integer", "deref": ]}
 parse/0:   ingredient: {name: "1", value: 0, type: 0, properties: ["1": "literal"]}
 parse/0:   product: {name: "6", value: 0, type: 1, properties: ["6": "integer"]}
diff --git a/cpp/.traces/ingredient b/cpp/.traces/ingredient
index 0abe066b..ae8b90f3 100644
--- a/cpp/.traces/ingredient
+++ b/cpp/.traces/ingredient
@@ -1,10 +1,10 @@
-parse/0: instruction: 1001
+parse/0: instruction: f
 parse/0:   ingredient: {name: "1", value: 0, type: 0, properties: ["1": "literal"]}
 parse/0:   ingredient: {name: "2", value: 0, type: 0, properties: ["2": "literal"]}
-parse/0: instruction: 28
+parse/0: instruction: ingredient
 parse/0:   ingredient: {name: "1", value: 0, type: 0, properties: ["1": "literal"]}
 parse/0:   product: {name: "12", value: 0, type: 1, properties: ["12": "integer"]}
-parse/0: instruction: 26
+parse/0: instruction: next-ingredient
 parse/0:   product: {name: "13", value: 0, type: 1, properties: ["13": "integer"]}
 parse/0:   product: {name: "1", value: 0, type: 3, properties: ["1": "boolean"]}
 after-brace/0: recipe main
diff --git a/cpp/.traces/integer-to-decimal-digit-negative b/cpp/.traces/integer-to-decimal-digit-negative
index c7976d26..05521c72 100644
--- a/cpp/.traces/integer-to-decimal-digit-negative
+++ b/cpp/.traces/integer-to-decimal-digit-negative
@@ -1,7 +1,7 @@
-parse/0: instruction: 105
+parse/0: instruction: integer-to-decimal-string
 parse/0:   ingredient: {name: "-1", value: 0, type: 0, properties: ["-1": "literal"]}
 parse/0:   product: {name: "1", value: 0, type: 2-5-4, properties: ["1": "address":"array":"character", "raw": ]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "1", value: 0, type: 2-5-4, properties: ["1": "address":"array":"character", "deref": , "raw": ]}
 parse/0:   product: {name: "2", value: 0, type: 5-4, properties: ["2": "array":"character", "raw": ]}
 after-brace/0: recipe test-integer-to-decimal-digit-negative
diff --git a/cpp/.traces/integer-to-decimal-digit-positive b/cpp/.traces/integer-to-decimal-digit-positive
index 76a65c1e..eaa0ee3b 100644
--- a/cpp/.traces/integer-to-decimal-digit-positive
+++ b/cpp/.traces/integer-to-decimal-digit-positive
@@ -1,7 +1,7 @@
-parse/0: instruction: 105
+parse/0: instruction: integer-to-decimal-string
 parse/0:   ingredient: {name: "234", value: 0, type: 0, properties: ["234": "literal"]}
 parse/0:   product: {name: "1", value: 0, type: 2-5-4, properties: ["1": "address":"array":"character", "raw": ]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "1", value: 0, type: 2-5-4, properties: ["1": "address":"array":"character", "deref": , "raw": ]}
 parse/0:   product: {name: "2", value: 0, type: 5-4, properties: ["2": "array":"character", "raw": ]}
 after-brace/0: recipe test-integer-to-decimal-digit-positive
diff --git a/cpp/.traces/integer-to-decimal-digit-zero b/cpp/.traces/integer-to-decimal-digit-zero
index 0a5c53da..9d5fb6e3 100644
--- a/cpp/.traces/integer-to-decimal-digit-zero
+++ b/cpp/.traces/integer-to-decimal-digit-zero
@@ -1,7 +1,7 @@
-parse/0: instruction: 105
+parse/0: instruction: integer-to-decimal-string
 parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 parse/0:   product: {name: "1", value: 0, type: 2-5-4, properties: ["1": "address":"array":"character", "raw": ]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "1", value: 0, type: 2-5-4, properties: ["1": "address":"array":"character", "deref": , "raw": ]}
 parse/0:   product: {name: "2", value: 0, type: 5-4, properties: ["2": "array":"character", "raw": ]}
 after-brace/0: recipe test-integer-to-decimal-digit-zero
diff --git a/cpp/.traces/interpolate-at-end b/cpp/.traces/interpolate-at-end
index 02ec2bfc..b2085a50 100644
--- a/cpp/.traces/interpolate-at-end
+++ b/cpp/.traces/interpolate-at-end
@@ -1,14 +1,14 @@
-parse/0: instruction: 38
+parse/0: instruction: new
 parse/0:   ingredient: {name: "hello, _", value: 0, type: 0, properties: ["hello, _": "literal-string"]}
 parse/0:   product: {name: "1", value: 0, type: 2-5-4, properties: ["1": "address":"array":"character", "raw": ]}
-parse/0: instruction: 38
+parse/0: instruction: new
 parse/0:   ingredient: {name: "abc", value: 0, type: 0, properties: ["abc": "literal-string"]}
 parse/0:   product: {name: "2", value: 0, type: 2-5-4, properties: ["2": "address":"array":"character", "raw": ]}
-parse/0: instruction: 107
+parse/0: instruction: interpolate
 parse/0:   ingredient: {name: "1", value: 0, type: 2-5-4, properties: ["1": "address":"array":"character", "raw": ]}
 parse/0:   ingredient: {name: "2", value: 0, type: 2-5-4, properties: ["2": "address":"array":"character", "raw": ]}
 parse/0:   product: {name: "3", value: 0, type: 2-5-4, properties: ["3": "address":"array":"character", "raw": ]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "3", value: 0, type: 2-5-4, properties: ["3": "address":"array":"character", "raw": , "deref": ]}
 parse/0:   product: {name: "4", value: 0, type: 5-4, properties: ["4": "array":"character", "raw": ]}
 new/0: hello, _ -> 0
diff --git a/cpp/.traces/interpolate-at-start b/cpp/.traces/interpolate-at-start
index 51a4c657..f30ef81f 100644
--- a/cpp/.traces/interpolate-at-start
+++ b/cpp/.traces/interpolate-at-start
@@ -1,14 +1,14 @@
-parse/0: instruction: 38
+parse/0: instruction: new
 parse/0:   ingredient: {name: "_, hello!", value: 0, type: 0, properties: ["_, hello!": "literal-string"]}
 parse/0:   product: {name: "1", value: 0, type: 2-5-4, properties: ["1": "address":"array":"character", "raw": ]}
-parse/0: instruction: 38
+parse/0: instruction: new
 parse/0:   ingredient: {name: "abc", value: 0, type: 0, properties: ["abc": "literal-string"]}
 parse/0:   product: {name: "2", value: 0, type: 2-5-4, properties: ["2": "address":"array":"character", "raw": ]}
-parse/0: instruction: 107
+parse/0: instruction: interpolate
 parse/0:   ingredient: {name: "1", value: 0, type: 2-5-4, properties: ["1": "address":"array":"character", "raw": ]}
 parse/0:   ingredient: {name: "2", value: 0, type: 2-5-4, properties: ["2": "address":"array":"character", "raw": ]}
 parse/0:   product: {name: "3", value: 0, type: 2-5-4, properties: ["3": "address":"array":"character", "raw": ]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "3", value: 0, type: 2-5-4, properties: ["3": "address":"array":"character", "raw": , "deref": ]}
 parse/0:   product: {name: "4", value: 0, type: 5-4, properties: ["4": "array":"character", "raw": ]}
 new/0: _, hello! -> 0
diff --git a/cpp/.traces/interpolate-works b/cpp/.traces/interpolate-works
index ef70cc9f..c7dc2ee9 100644
--- a/cpp/.traces/interpolate-works
+++ b/cpp/.traces/interpolate-works
@@ -1,14 +1,14 @@
-parse/0: instruction: 38
+parse/0: instruction: new
 parse/0:   ingredient: {name: "abc _", value: 0, type: 0, properties: ["abc _": "literal-string"]}
 parse/0:   product: {name: "1", value: 0, type: 2-5-4, properties: ["1": "address":"array":"character", "raw": ]}
-parse/0: instruction: 38
+parse/0: instruction: new
 parse/0:   ingredient: {name: "def", value: 0, type: 0, properties: ["def": "literal-string"]}
 parse/0:   product: {name: "2", value: 0, type: 2-5-4, properties: ["2": "address":"array":"character", "raw": ]}
-parse/0: instruction: 107
+parse/0: instruction: interpolate
 parse/0:   ingredient: {name: "1", value: 0, type: 2-5-4, properties: ["1": "address":"array":"character", "raw": ]}
 parse/0:   ingredient: {name: "2", value: 0, type: 2-5-4, properties: ["2": "address":"array":"character", "raw": ]}
 parse/0:   product: {name: "3", value: 0, type: 2-5-4, properties: ["3": "address":"array":"character", "raw": ]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "3", value: 0, type: 2-5-4, properties: ["3": "address":"array":"character", "raw": , "deref": ]}
 parse/0:   product: {name: "4", value: 0, type: 5-4, properties: ["4": "array":"character", "raw": ]}
 new/0: abc _ -> 0
diff --git a/cpp/.traces/jump_backward b/cpp/.traces/jump_backward
index 529d4f50..524894a7 100644
--- a/cpp/.traces/jump_backward
+++ b/cpp/.traces/jump_backward
@@ -1,8 +1,8 @@
-parse/0: instruction: 10
+parse/0: instruction: jump
 parse/0:   ingredient: {name: "1", value: 0, type: 0, properties: ["1": "offset"]}
-parse/0: instruction: 10
+parse/0: instruction: jump
 parse/0:   ingredient: {name: "1", value: 0, type: 0, properties: ["1": "offset"]}
-parse/0: instruction: 10
+parse/0: instruction: jump
 parse/0:   ingredient: {name: "-2", value: 0, type: 0, properties: ["-2": "offset"]}
 after-brace/0: recipe main
 after-brace/0: jump ...
diff --git a/cpp/.traces/jump_can_skip_instructions b/cpp/.traces/jump_can_skip_instructions
index ecc70839..ced4b32e 100644
--- a/cpp/.traces/jump_can_skip_instructions
+++ b/cpp/.traces/jump_can_skip_instructions
@@ -1,6 +1,6 @@
-parse/0: instruction: 10
+parse/0: instruction: jump
 parse/0:   ingredient: {name: "1", value: 0, type: 0, properties: ["1": "offset"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "1", value: 0, type: 0, properties: ["1": "literal"]}
 parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
 after-brace/0: recipe main
diff --git a/cpp/.traces/jump_if b/cpp/.traces/jump_if
index bcb3f09e..9e63fab6 100644
--- a/cpp/.traces/jump_if
+++ b/cpp/.traces/jump_if
@@ -1,7 +1,7 @@
-parse/0: instruction: 11
+parse/0: instruction: jump-if
 parse/0:   ingredient: {name: "999", value: 0, type: 0, properties: ["999": "literal"]}
 parse/0:   ingredient: {name: "1", value: 0, type: 0, properties: ["1": "offset"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "1", value: 0, type: 0, properties: ["1": "literal"]}
 parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
 after-brace/0: recipe main
diff --git a/cpp/.traces/jump_if_fallthrough b/cpp/.traces/jump_if_fallthrough
index f638d21c..a3b5e347 100644
--- a/cpp/.traces/jump_if_fallthrough
+++ b/cpp/.traces/jump_if_fallthrough
@@ -1,7 +1,7 @@
-parse/0: instruction: 11
+parse/0: instruction: jump-if
 parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 parse/0:   ingredient: {name: "1", value: 0, type: 0, properties: ["1": "offset"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "1", value: 0, type: 0, properties: ["1": "literal"]}
 parse/0:   product: {name: "123", value: 0, type: 1, properties: ["123": "integer"]}
 after-brace/0: recipe main
diff --git a/cpp/.traces/jump_unless b/cpp/.traces/jump_unless
index 0bfd970a..31055471 100644
--- a/cpp/.traces/jump_unless
+++ b/cpp/.traces/jump_unless
@@ -1,7 +1,7 @@
-parse/0: instruction: 12
+parse/0: instruction: jump-unless
 parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 parse/0:   ingredient: {name: "1", value: 0, type: 0, properties: ["1": "offset"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "1", value: 0, type: 0, properties: ["1": "literal"]}
 parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
 after-brace/0: recipe main
diff --git a/cpp/.traces/jump_unless_fallthrough b/cpp/.traces/jump_unless_fallthrough
index 2714a51b..0785e2d0 100644
--- a/cpp/.traces/jump_unless_fallthrough
+++ b/cpp/.traces/jump_unless_fallthrough
@@ -1,7 +1,7 @@
-parse/0: instruction: 12
+parse/0: instruction: jump-unless
 parse/0:   ingredient: {name: "999", value: 0, type: 0, properties: ["999": "literal"]}
 parse/0:   ingredient: {name: "1", value: 0, type: 0, properties: ["1": "offset"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "1", value: 0, type: 0, properties: ["1": "literal"]}
 parse/0:   product: {name: "123", value: 0, type: 1, properties: ["123": "integer"]}
 after-brace/0: recipe main
diff --git a/cpp/.traces/lesser_or_equal b/cpp/.traces/lesser_or_equal
index 62e3dbe4..803ee048 100644
--- a/cpp/.traces/lesser_or_equal
+++ b/cpp/.traces/lesser_or_equal
@@ -1,10 +1,10 @@
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "32", value: 0, type: 0, properties: ["32": "literal"]}
 parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "33", value: 0, type: 0, properties: ["33": "literal"]}
 parse/0:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
-parse/0: instruction: 17
+parse/0: instruction: lesser-or-equal
 parse/0:   ingredient: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
 parse/0:   ingredient: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
 parse/0:   product: {name: "3", value: 0, type: 1, properties: ["3": "integer"]}
diff --git a/cpp/.traces/lesser_or_equal2 b/cpp/.traces/lesser_or_equal2
index 17f80df3..306bb53f 100644
--- a/cpp/.traces/lesser_or_equal2
+++ b/cpp/.traces/lesser_or_equal2
@@ -1,10 +1,10 @@
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "33", value: 0, type: 0, properties: ["33": "literal"]}
 parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "33", value: 0, type: 0, properties: ["33": "literal"]}
 parse/0:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
-parse/0: instruction: 17
+parse/0: instruction: lesser-or-equal
 parse/0:   ingredient: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
 parse/0:   ingredient: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
 parse/0:   product: {name: "3", value: 0, type: 1, properties: ["3": "integer"]}
diff --git a/cpp/.traces/lesser_or_equal3 b/cpp/.traces/lesser_or_equal3
index e9a79334..73148c77 100644
--- a/cpp/.traces/lesser_or_equal3
+++ b/cpp/.traces/lesser_or_equal3
@@ -1,10 +1,10 @@
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "34", value: 0, type: 0, properties: ["34": "literal"]}
 parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "33", value: 0, type: 0, properties: ["33": "literal"]}
 parse/0:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
-parse/0: instruction: 17
+parse/0: instruction: lesser-or-equal
 parse/0:   ingredient: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
 parse/0:   ingredient: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
 parse/0:   product: {name: "3", value: 0, type: 1, properties: ["3": "integer"]}
diff --git a/cpp/.traces/lesser_than b/cpp/.traces/lesser_than
index 470f121e..9295dc29 100644
--- a/cpp/.traces/lesser_than
+++ b/cpp/.traces/lesser_than
@@ -1,10 +1,10 @@
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "32", value: 0, type: 0, properties: ["32": "literal"]}
 parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "33", value: 0, type: 0, properties: ["33": "literal"]}
 parse/0:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
-parse/0: instruction: 15
+parse/0: instruction: lesser-than
 parse/0:   ingredient: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
 parse/0:   ingredient: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
 parse/0:   product: {name: "3", value: 0, type: 1, properties: ["3": "integer"]}
diff --git a/cpp/.traces/lesser_than2 b/cpp/.traces/lesser_than2
index 2f8fc6b3..cb26c302 100644
--- a/cpp/.traces/lesser_than2
+++ b/cpp/.traces/lesser_than2
@@ -1,10 +1,10 @@
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "34", value: 0, type: 0, properties: ["34": "literal"]}
 parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "33", value: 0, type: 0, properties: ["33": "literal"]}
 parse/0:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
-parse/0: instruction: 15
+parse/0: instruction: lesser-than
 parse/0:   ingredient: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
 parse/0:   ingredient: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
 parse/0:   product: {name: "3", value: 0, type: 1, properties: ["3": "integer"]}
diff --git a/cpp/.traces/loop b/cpp/.traces/loop
index 3516306a..b3a25323 100644
--- a/cpp/.traces/loop
+++ b/cpp/.traces/loop
@@ -1,14 +1,14 @@
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 parse/0:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
 parse/0: label: {
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 parse/0:   product: {name: "3", value: 0, type: 1, properties: ["3": "integer"]}
-parse/0: instruction: 35
+parse/0: instruction: loop
 parse/0: label: }
 brace/0: 1000: push (open, 2)
 brace/0: push (close, 5)
diff --git a/cpp/.traces/loop_label b/cpp/.traces/loop_label
index b0c4c2a8..3d3f36f3 100644
--- a/cpp/.traces/loop_label
+++ b/cpp/.traces/loop_label
@@ -1,8 +1,8 @@
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
 parse/0: label: +foo
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 parse/0:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
 after-brace/0: recipe main
diff --git a/cpp/.traces/loop_nested b/cpp/.traces/loop_nested
index b33794cb..ef21f26b 100644
--- a/cpp/.traces/loop_nested
+++ b/cpp/.traces/loop_nested
@@ -1,18 +1,18 @@
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
 parse/0: label: {
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 parse/0:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
 parse/0: label: {
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 parse/0:   product: {name: "3", value: 0, type: 1, properties: ["3": "integer"]}
 parse/0: label: }
-parse/0: instruction: 36
+parse/0: instruction: loop-if
 parse/0:   ingredient: {name: "4", value: 0, type: 3, properties: ["4": "boolean"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 parse/0:   product: {name: "5", value: 0, type: 1, properties: ["5": "integer"]}
 parse/0: label: }
diff --git a/cpp/.traces/loop_unless b/cpp/.traces/loop_unless
index 06003c98..d29f272f 100644
--- a/cpp/.traces/loop_unless
+++ b/cpp/.traces/loop_unless
@@ -1,13 +1,13 @@
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 parse/0:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
 parse/0: label: {
-parse/0: instruction: 37
+parse/0: instruction: loop-unless
 parse/0:   ingredient: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 parse/0:   product: {name: "3", value: 0, type: 1, properties: ["3": "integer"]}
 parse/0: label: }
diff --git a/cpp/.traces/maybe_convert b/cpp/.traces/maybe_convert
index 144051ce..3baed6d3 100644
--- a/cpp/.traces/maybe_convert
+++ b/cpp/.traces/maybe_convert
@@ -1,13 +1,13 @@
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "1", value: 0, type: 0, properties: ["1": "literal"]}
 parse/0:   product: {name: "12", value: 0, type: 1, properties: ["12": "integer"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "35", value: 0, type: 0, properties: ["35": "literal"]}
 parse/0:   product: {name: "13", value: 0, type: 1, properties: ["13": "integer"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "36", value: 0, type: 0, properties: ["36": "literal"]}
 parse/0:   product: {name: "14", value: 0, type: 1, properties: ["14": "integer"]}
-parse/0: instruction: 25
+parse/0: instruction: maybe-convert
 parse/0:   ingredient: {name: "12", value: 0, type: 8, properties: ["12": "integer-or-point"]}
 parse/0:   ingredient: {name: "1", value: 0, type: 0, properties: ["1": "variant"]}
 parse/0:   product: {name: "20", value: 0, type: 2-6, properties: ["20": "address":"point"]}
diff --git a/cpp/.traces/maybe_convert_fail b/cpp/.traces/maybe_convert_fail
index cdf30c9d..b2b3c83a 100644
--- a/cpp/.traces/maybe_convert_fail
+++ b/cpp/.traces/maybe_convert_fail
@@ -1,13 +1,13 @@
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "1", value: 0, type: 0, properties: ["1": "literal"]}
 parse/0:   product: {name: "12", value: 0, type: 1, properties: ["12": "integer"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "35", value: 0, type: 0, properties: ["35": "literal"]}
 parse/0:   product: {name: "13", value: 0, type: 1, properties: ["13": "integer"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "36", value: 0, type: 0, properties: ["36": "literal"]}
 parse/0:   product: {name: "14", value: 0, type: 1, properties: ["14": "integer"]}
-parse/0: instruction: 25
+parse/0: instruction: maybe-convert
 parse/0:   ingredient: {name: "12", value: 0, type: 8, properties: ["12": "integer-or-point"]}
 parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: ["0": "variant"]}
 parse/0:   product: {name: "20", value: 0, type: 2-6, properties: ["20": "address":"point"]}
diff --git a/cpp/.traces/maybe_convert_named b/cpp/.traces/maybe_convert_named
index a26fcaab..f0576fe3 100644
--- a/cpp/.traces/maybe_convert_named
+++ b/cpp/.traces/maybe_convert_named
@@ -1,13 +1,13 @@
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "1", value: 0, type: 0, properties: ["1": "literal"]}
 parse/0:   product: {name: "12", value: 0, type: 1, properties: ["12": "integer"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "35", value: 0, type: 0, properties: ["35": "literal"]}
 parse/0:   product: {name: "13", value: 0, type: 1, properties: ["13": "integer"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "36", value: 0, type: 0, properties: ["36": "literal"]}
 parse/0:   product: {name: "14", value: 0, type: 1, properties: ["14": "integer"]}
-parse/0: instruction: 25
+parse/0: instruction: maybe-convert
 parse/0:   ingredient: {name: "12", value: 0, type: 8, properties: ["12": "integer-or-point"]}
 parse/0:   ingredient: {name: "p", value: 0, type: 0, properties: ["p": "variant"]}
 parse/0:   product: {name: "20", value: 0, type: 2-6, properties: ["20": "address":"point"]}
diff --git a/cpp/.traces/multiply b/cpp/.traces/multiply
index 201445a8..74c0c818 100644
--- a/cpp/.traces/multiply
+++ b/cpp/.traces/multiply
@@ -1,10 +1,10 @@
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "4", value: 0, type: 0, properties: ["4": "literal"]}
 parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "6", value: 0, type: 0, properties: ["6": "literal"]}
 parse/0:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
-parse/0: instruction: 4
+parse/0: instruction: multiply
 parse/0:   ingredient: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
 parse/0:   ingredient: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
 parse/0:   product: {name: "3", value: 0, type: 1, properties: ["3": "integer"]}
diff --git a/cpp/.traces/multiply_literal b/cpp/.traces/multiply_literal
index 119f88f4..20701f9b 100644
--- a/cpp/.traces/multiply_literal
+++ b/cpp/.traces/multiply_literal
@@ -1,4 +1,4 @@
-parse/0: instruction: 4
+parse/0: instruction: multiply
 parse/0:   ingredient: {name: "2", value: 0, type: 0, properties: ["2": "literal"]}
 parse/0:   ingredient: {name: "3", value: 0, type: 0, properties: ["3": "literal"]}
 parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
diff --git a/cpp/.traces/new b/cpp/.traces/new
index ed9a4017..fdb33f1d 100644
--- a/cpp/.traces/new
+++ b/cpp/.traces/new
@@ -1,10 +1,10 @@
-parse/0: instruction: 38
+parse/0: instruction: new
 parse/0:   ingredient: {name: "integer", value: 0, type: 0, properties: ["integer": "type"]}
 parse/0:   product: {name: "1", value: 0, type: 2-1, properties: ["1": "address":"integer", "raw": ]}
-parse/0: instruction: 38
+parse/0: instruction: new
 parse/0:   ingredient: {name: "integer", value: 0, type: 0, properties: ["integer": "type"]}
 parse/0:   product: {name: "2", value: 0, type: 2-1, properties: ["2": "address":"integer", "raw": ]}
-parse/0: instruction: 13
+parse/0: instruction: equal
 parse/0:   ingredient: {name: "1", value: 0, type: 2-1, properties: ["1": "address":"integer", "raw": ]}
 parse/0:   ingredient: {name: "2", value: 0, type: 2-1, properties: ["2": "address":"integer", "raw": ]}
 parse/0:   product: {name: "3", value: 0, type: 3, properties: ["3": "boolean", "raw": ]}
diff --git a/cpp/.traces/new_array b/cpp/.traces/new_array
index 204e39bf..e692fc38 100644
--- a/cpp/.traces/new_array
+++ b/cpp/.traces/new_array
@@ -1,11 +1,11 @@
-parse/0: instruction: 38
+parse/0: instruction: new
 parse/0:   ingredient: {name: "integer", value: 0, type: 0, properties: ["integer": "type"]}
 parse/0:   ingredient: {name: "5", value: 0, type: 0, properties: ["5": "literal"]}
 parse/0:   product: {name: "1", value: 0, type: 2-5-1, properties: ["1": "address":"array":"integer", "raw": ]}
-parse/0: instruction: 38
+parse/0: instruction: new
 parse/0:   ingredient: {name: "integer", value: 0, type: 0, properties: ["integer": "type"]}
 parse/0:   product: {name: "2", value: 0, type: 2-1, properties: ["2": "address":"integer", "raw": ]}
-parse/0: instruction: 3
+parse/0: instruction: subtract
 parse/0:   ingredient: {name: "2", value: 0, type: 2-1, properties: ["2": "address":"integer", "raw": ]}
 parse/0:   ingredient: {name: "1", value: 0, type: 2-5-1, properties: ["1": "address":"array":"integer", "raw": ]}
 parse/0:   product: {name: "3", value: 0, type: 1, properties: ["3": "integer", "raw": ]}
diff --git a/cpp/.traces/new_concurrent b/cpp/.traces/new_concurrent
index 13729f50..4f9f5327 100644
--- a/cpp/.traces/new_concurrent
+++ b/cpp/.traces/new_concurrent
@@ -1,12 +1,12 @@
-parse/0: instruction: 30
+parse/0: instruction: run
 parse/0:   ingredient: {name: "f2", value: 0, type: 0, properties: ["f2": "recipe"]}
-parse/0: instruction: 38
+parse/0: instruction: new
 parse/0:   ingredient: {name: "integer", value: 0, type: 0, properties: ["integer": "type"]}
 parse/0:   product: {name: "1", value: 0, type: 2-1, properties: ["1": "address":"integer", "raw": ]}
-parse/0: instruction: 38
+parse/0: instruction: new
 parse/0:   ingredient: {name: "integer", value: 0, type: 0, properties: ["integer": "type"]}
 parse/0:   product: {name: "2", value: 0, type: 2-1, properties: ["2": "address":"integer", "raw": ]}
-parse/0: instruction: 13
+parse/0: instruction: equal
 parse/0:   ingredient: {name: "1", value: 0, type: 2-1, properties: ["1": "address":"integer", "raw": ]}
 parse/0:   ingredient: {name: "2", value: 0, type: 2-1, properties: ["2": "address":"integer", "raw": ]}
 parse/0:   product: {name: "3", value: 0, type: 3, properties: ["3": "boolean", "raw": ]}
diff --git a/cpp/.traces/new_overflow b/cpp/.traces/new_overflow
index cc8405da..35cdb690 100644
--- a/cpp/.traces/new_overflow
+++ b/cpp/.traces/new_overflow
@@ -1,7 +1,7 @@
-parse/0: instruction: 38
+parse/0: instruction: new
 parse/0:   ingredient: {name: "integer", value: 0, type: 0, properties: ["integer": "type"]}
 parse/0:   product: {name: "1", value: 0, type: 2-1, properties: ["1": "address":"integer", "raw": ]}
-parse/0: instruction: 38
+parse/0: instruction: new
 parse/0:   ingredient: {name: "point", value: 0, type: 0, properties: ["point": "type"]}
 parse/0:   product: {name: "2", value: 0, type: 2-6, properties: ["2": "address":"point", "raw": ]}
 new/0: integer -> 1
diff --git a/cpp/.traces/new_string b/cpp/.traces/new_string
index a7d8efd3..3cfa1d7c 100644
--- a/cpp/.traces/new_string
+++ b/cpp/.traces/new_string
@@ -1,7 +1,7 @@
-parse/0: instruction: 38
+parse/0: instruction: new
 parse/0:   ingredient: {name: "abc def", value: 0, type: 0, properties: ["abc def": "literal-string"]}
 parse/0:   product: {name: "1", value: 0, type: 2-5-4, properties: ["1": "address":"array":"character"]}
-parse/0: instruction: 22
+parse/0: instruction: index
 parse/0:   ingredient: {name: "1", value: 0, type: 2-5-4, properties: ["1": "address":"array":"character", "deref": ]}
 parse/0:   ingredient: {name: "5", value: 0, type: 0, properties: ["5": "literal"]}
 parse/0:   product: {name: "2", value: 0, type: 4, properties: ["2": "character"]}
diff --git a/cpp/.traces/next_ingredient b/cpp/.traces/next_ingredient
index 19146137..bcc3bfed 100644
--- a/cpp/.traces/next_ingredient
+++ b/cpp/.traces/next_ingredient
@@ -1,8 +1,8 @@
-parse/0: instruction: 1001
+parse/0: instruction: f
 parse/0:   ingredient: {name: "2", value: 0, type: 0, properties: ["2": "literal"]}
-parse/0: instruction: 26
+parse/0: instruction: next-ingredient
 parse/0:   product: {name: "12", value: 0, type: 1, properties: ["12": "integer"]}
-parse/0: instruction: 2
+parse/0: instruction: add
 parse/0:   ingredient: {name: "1", value: 0, type: 0, properties: ["1": "literal"]}
 parse/0:   ingredient: {name: "12", value: 0, type: 1, properties: ["12": "integer"]}
 parse/0:   product: {name: "13", value: 0, type: 1, properties: ["13": "integer"]}
diff --git a/cpp/.traces/next_ingredient_missing b/cpp/.traces/next_ingredient_missing
index 8180399f..cc1c6d42 100644
--- a/cpp/.traces/next_ingredient_missing
+++ b/cpp/.traces/next_ingredient_missing
@@ -1,5 +1,5 @@
-parse/0: instruction: 1001
-parse/0: instruction: 26
+parse/0: instruction: f
+parse/0: instruction: next-ingredient
 parse/0:   product: {name: "_", value: 0, type: 0, properties: ["_": "dummy"]}
 parse/0:   product: {name: "12", value: 0, type: 1, properties: ["12": "integer"]}
 after-brace/0: recipe main
diff --git a/cpp/.traces/not b/cpp/.traces/not
index bc0f45fc..81962f94 100644
--- a/cpp/.traces/not
+++ b/cpp/.traces/not
@@ -1,7 +1,7 @@
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "1", value: 0, type: 0, properties: ["1": "literal"]}
 parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
-parse/0: instruction: 9
+parse/0: instruction: not
 parse/0:   ingredient: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
 parse/0:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
 after-brace/0: recipe main
diff --git a/cpp/.traces/or b/cpp/.traces/or
index 75f0ff13..422558bc 100644
--- a/cpp/.traces/or
+++ b/cpp/.traces/or
@@ -1,10 +1,10 @@
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "1", value: 0, type: 0, properties: ["1": "literal"]}
 parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 parse/0:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
-parse/0: instruction: 8
+parse/0: instruction: or
 parse/0:   ingredient: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
 parse/0:   ingredient: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
 parse/0:   product: {name: "3", value: 0, type: 1, properties: ["3": "integer"]}
diff --git a/cpp/.traces/parse_comment_after_instruction b/cpp/.traces/parse_comment_after_instruction
index 5fc3dbfd..5cfc15c8 100644
--- a/cpp/.traces/parse_comment_after_instruction
+++ b/cpp/.traces/parse_comment_after_instruction
@@ -1,3 +1,3 @@
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "23", value: 0, type: 0, properties: ["23": "literal"]}
 parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
diff --git a/cpp/.traces/parse_comment_amongst_instruction b/cpp/.traces/parse_comment_amongst_instruction
index 5fc3dbfd..5cfc15c8 100644
--- a/cpp/.traces/parse_comment_amongst_instruction
+++ b/cpp/.traces/parse_comment_amongst_instruction
@@ -1,3 +1,3 @@
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "23", value: 0, type: 0, properties: ["23": "literal"]}
 parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
diff --git a/cpp/.traces/parse_comment_amongst_instruction2 b/cpp/.traces/parse_comment_amongst_instruction2
index 5fc3dbfd..5cfc15c8 100644
--- a/cpp/.traces/parse_comment_amongst_instruction2
+++ b/cpp/.traces/parse_comment_amongst_instruction2
@@ -1,3 +1,3 @@
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "23", value: 0, type: 0, properties: ["23": "literal"]}
 parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
diff --git a/cpp/.traces/parse_comment_amongst_instruction3 b/cpp/.traces/parse_comment_amongst_instruction3
index bcd82cfb..a00c722c 100644
--- a/cpp/.traces/parse_comment_amongst_instruction3
+++ b/cpp/.traces/parse_comment_amongst_instruction3
@@ -1,6 +1,6 @@
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "23", value: 0, type: 0, properties: ["23": "literal"]}
 parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "23", value: 0, type: 0, properties: ["23": "literal"]}
 parse/0:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
diff --git a/cpp/.traces/parse_comment_outside_recipe b/cpp/.traces/parse_comment_outside_recipe
index 5fc3dbfd..5cfc15c8 100644
--- a/cpp/.traces/parse_comment_outside_recipe
+++ b/cpp/.traces/parse_comment_outside_recipe
@@ -1,3 +1,3 @@
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "23", value: 0, type: 0, properties: ["23": "literal"]}
 parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
diff --git a/cpp/.traces/parse_multiple_ingredients b/cpp/.traces/parse_multiple_ingredients
index c94b33e7..5a71e510 100644
--- a/cpp/.traces/parse_multiple_ingredients
+++ b/cpp/.traces/parse_multiple_ingredients
@@ -1,4 +1,4 @@
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "23", value: 0, type: 0, properties: ["23": "literal"]}
 parse/0:   ingredient: {name: "4", value: 0, type: 1, properties: ["4": "integer"]}
 parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
diff --git a/cpp/.traces/parse_multiple_products b/cpp/.traces/parse_multiple_products
index fed63a5d..24bbdb66 100644
--- a/cpp/.traces/parse_multiple_products
+++ b/cpp/.traces/parse_multiple_products
@@ -1,4 +1,4 @@
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "23", value: 0, type: 0, properties: ["23": "literal"]}
 parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
 parse/0:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
diff --git a/cpp/.traces/parse_multiple_properties b/cpp/.traces/parse_multiple_properties
index 77a2916d..e3b452e0 100644
--- a/cpp/.traces/parse_multiple_properties
+++ b/cpp/.traces/parse_multiple_properties
@@ -1,3 +1,3 @@
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "23", value: 0, type: 0, properties: ["23": "literal", "foo": "bar":"baz"]}
 parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
diff --git a/cpp/.traces/parse_multiple_types b/cpp/.traces/parse_multiple_types
index a0c075d6..39df838e 100644
--- a/cpp/.traces/parse_multiple_types
+++ b/cpp/.traces/parse_multiple_types
@@ -1,4 +1,4 @@
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "23", value: 0, type: 0, properties: ["23": "literal"]}
 parse/0:   ingredient: {name: "4", value: 0, type: 1, properties: ["4": "integer"]}
 parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
diff --git a/cpp/.traces/parse_properties b/cpp/.traces/parse_properties
index 242ee0e4..65d7890e 100644
--- a/cpp/.traces/parse_properties
+++ b/cpp/.traces/parse_properties
@@ -1,3 +1,3 @@
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "23", value: 0, type: 0, properties: ["23": "literal"]}
 parse/0:   product: {name: "1", value: 0, type: 1-2, properties: ["1": "integer":"address", "deref": ]}
diff --git a/cpp/.traces/reply b/cpp/.traces/reply
index abed04d6..4793d27c 100644
--- a/cpp/.traces/reply
+++ b/cpp/.traces/reply
@@ -1,14 +1,14 @@
-parse/0: instruction: 1001
+parse/0: instruction: f
 parse/0:   ingredient: {name: "2", value: 0, type: 0, properties: ["2": "literal"]}
 parse/0:   product: {name: "3", value: 0, type: 1, properties: ["3": "integer"]}
 parse/0:   product: {name: "4", value: 0, type: 1, properties: ["4": "integer"]}
-parse/0: instruction: 26
+parse/0: instruction: next-ingredient
 parse/0:   product: {name: "12", value: 0, type: 1, properties: ["12": "integer"]}
-parse/0: instruction: 2
+parse/0: instruction: add
 parse/0:   ingredient: {name: "1", value: 0, type: 0, properties: ["1": "literal"]}
 parse/0:   ingredient: {name: "12", value: 0, type: 1, properties: ["12": "integer"]}
 parse/0:   product: {name: "13", value: 0, type: 1, properties: ["13": "integer"]}
-parse/0: instruction: 29
+parse/0: instruction: reply
 parse/0:   ingredient: {name: "12", value: 0, type: 1, properties: ["12": "integer"]}
 parse/0:   ingredient: {name: "13", value: 0, type: 1, properties: ["13": "integer"]}
 after-brace/0: recipe main
diff --git a/cpp/.traces/reply_container b/cpp/.traces/reply_container
index e550c295..c3518d49 100644
--- a/cpp/.traces/reply_container
+++ b/cpp/.traces/reply_container
@@ -1,12 +1,12 @@
-parse/0: instruction: 1001
+parse/0: instruction: f
 parse/0:   ingredient: {name: "2", value: 0, type: 0, properties: ["2": "literal"]}
 parse/0:   product: {name: "3", value: 0, type: 6, properties: ["3": "point"]}
-parse/0: instruction: 26
+parse/0: instruction: next-ingredient
 parse/0:   product: {name: "12", value: 0, type: 1, properties: ["12": "integer"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "35", value: 0, type: 0, properties: ["35": "literal"]}
 parse/0:   product: {name: "13", value: 0, type: 1, properties: ["13": "integer"]}
-parse/0: instruction: 29
+parse/0: instruction: reply
 parse/0:   ingredient: {name: "12", value: 0, type: 6, properties: ["12": "point"]}
 after-brace/0: recipe main
 after-brace/0: f ...
diff --git a/cpp/.traces/reply_same_as_ingredient b/cpp/.traces/reply_same_as_ingredient
index 5448d9eb..ee430bd7 100644
--- a/cpp/.traces/reply_same_as_ingredient
+++ b/cpp/.traces/reply_same_as_ingredient
@@ -1,12 +1,12 @@
-parse/0: instruction: 38
+parse/0: instruction: new
 parse/0:   ingredient: {name: "integer", value: 0, type: 0, properties: ["integer": "type"]}
 parse/0:   product: {name: "1", value: 0, type: 2-1, properties: ["1": "address":"integer"]}
-parse/0: instruction: 1001
+parse/0: instruction: test1
 parse/0:   ingredient: {name: "1", value: 0, type: 2-1, properties: ["1": "address":"integer"]}
 parse/0:   product: {name: "2", value: 0, type: 2-1, properties: ["2": "address":"integer"]}
-parse/0: instruction: 26
+parse/0: instruction: next-ingredient
 parse/0:   product: {name: "10", value: 0, type: 2-1, properties: ["10": "address":"integer"]}
-parse/0: instruction: 29
+parse/0: instruction: reply
 parse/0:   ingredient: {name: "10", value: 0, type: 2-1, properties: ["10": "address":"integer", "same-as-ingredient": "0"]}
 new/0: integer -> 1
 after-brace/0: recipe main
diff --git a/cpp/.traces/return_on_fallthrough b/cpp/.traces/return_on_fallthrough
index 3a5dd1e9..f6df99fb 100644
--- a/cpp/.traces/return_on_fallthrough
+++ b/cpp/.traces/return_on_fallthrough
@@ -1,17 +1,17 @@
-parse/0: instruction: 1001
-parse/0: instruction: 1
+parse/0: instruction: f
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "34", value: 0, type: 0, properties: ["34": "literal"]}
 parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "34", value: 0, type: 0, properties: ["34": "literal"]}
 parse/0:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "34", value: 0, type: 0, properties: ["34": "literal"]}
 parse/0:   product: {name: "3", value: 0, type: 1, properties: ["3": "integer"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "34", value: 0, type: 0, properties: ["34": "literal"]}
 parse/0:   product: {name: "4", value: 0, type: 1, properties: ["4": "integer"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "34", value: 0, type: 0, properties: ["34": "literal"]}
 parse/0:   product: {name: "5", value: 0, type: 1, properties: ["5": "integer"]}
 after-brace/0: recipe main
diff --git a/cpp/.traces/rewind_ingredients b/cpp/.traces/rewind_ingredients
index 496ad7a1..c1231232 100644
--- a/cpp/.traces/rewind_ingredients
+++ b/cpp/.traces/rewind_ingredients
@@ -1,12 +1,12 @@
-parse/0: instruction: 1001
+parse/0: instruction: f
 parse/0:   ingredient: {name: "2", value: 0, type: 0, properties: ["2": "literal"]}
-parse/0: instruction: 26
+parse/0: instruction: next-ingredient
 parse/0:   product: {name: "12", value: 0, type: 1, properties: ["12": "integer"]}
-parse/0: instruction: 26
+parse/0: instruction: next-ingredient
 parse/0:   product: {name: "_", value: 0, type: 0, properties: ["_": "dummy"]}
 parse/0:   product: {name: "1", value: 0, type: 3, properties: ["1": "boolean"]}
-parse/0: instruction: 27
-parse/0: instruction: 26
+parse/0: instruction: rewind-ingredients
+parse/0: instruction: next-ingredient
 parse/0:   product: {name: "13", value: 0, type: 1, properties: ["13": "integer"]}
 parse/0:   product: {name: "2", value: 0, type: 3, properties: ["2": "boolean"]}
 after-brace/0: recipe main
diff --git a/cpp/.traces/run_dummy b/cpp/.traces/run_dummy
index 49099964..6cc72980 100644
--- a/cpp/.traces/run_dummy
+++ b/cpp/.traces/run_dummy
@@ -1,4 +1,4 @@
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 parse/0:   product: {name: "_", value: 0, type: 0, properties: ["_": "dummy"]}
 after-brace/0: recipe main
diff --git a/cpp/.traces/run_label b/cpp/.traces/run_label
index 70b6d3af..60cf4bbb 100644
--- a/cpp/.traces/run_label
+++ b/cpp/.traces/run_label
@@ -1,8 +1,8 @@
 parse/0: label: +foo
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "23", value: 0, type: 0, properties: ["23": "literal"]}
 parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
 parse/0:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
 after-brace/0: recipe main
diff --git a/cpp/.traces/scheduler b/cpp/.traces/scheduler
index 37530a6a..0a02e949 100644
--- a/cpp/.traces/scheduler
+++ b/cpp/.traces/scheduler
@@ -1,9 +1,9 @@
-parse/0: instruction: 30
+parse/0: instruction: run
 parse/0:   ingredient: {name: "f2", value: 0, type: 0, properties: ["f2": "recipe"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "3", value: 0, type: 0, properties: ["3": "literal"]}
 parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "4", value: 0, type: 0, properties: ["4": "literal"]}
 parse/0:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
 after-brace/0: recipe f1
diff --git a/cpp/.traces/scheduler_interleaves_routines b/cpp/.traces/scheduler_interleaves_routines
index f7bbb4ab..99fc8eb5 100644
--- a/cpp/.traces/scheduler_interleaves_routines
+++ b/cpp/.traces/scheduler_interleaves_routines
@@ -1,15 +1,15 @@
-parse/0: instruction: 30
+parse/0: instruction: run
 parse/0:   ingredient: {name: "f2", value: 0, type: 0, properties: ["f2": "recipe"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 parse/0:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "4", value: 0, type: 0, properties: ["4": "literal"]}
 parse/0:   product: {name: "3", value: 0, type: 1, properties: ["3": "integer"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "4", value: 0, type: 0, properties: ["4": "literal"]}
 parse/0:   product: {name: "4", value: 0, type: 1, properties: ["4": "integer"]}
 after-brace/0: recipe f1
diff --git a/cpp/.traces/set_default_space b/cpp/.traces/set_default_space
index 20340307..b1d99e84 100644
--- a/cpp/.traces/set_default_space
+++ b/cpp/.traces/set_default_space
@@ -1,10 +1,10 @@
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "5", value: 0, type: 0, properties: ["5": "literal"]}
 parse/0:   product: {name: "10", value: 0, type: 1, properties: ["10": "integer"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "10", value: 0, type: 0, properties: ["10": "literal"]}
 parse/0:   product: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "23", value: 0, type: 0, properties: ["23": "literal"]}
 parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
 after-brace/0: recipe main
diff --git a/cpp/.traces/store_indirect b/cpp/.traces/store_indirect
index a0926e80..fc979e97 100644
--- a/cpp/.traces/store_indirect
+++ b/cpp/.traces/store_indirect
@@ -1,7 +1,7 @@
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "2", value: 0, type: 0, properties: ["2": "literal"]}
 parse/0:   product: {name: "1", value: 0, type: 2-1, properties: ["1": "address":"integer"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "34", value: 0, type: 0, properties: ["34": "literal"]}
 parse/0:   product: {name: "1", value: 0, type: 2-1, properties: ["1": "address":"integer", "deref": ]}
 after-brace/0: recipe main
diff --git a/cpp/.traces/string-append-1 b/cpp/.traces/string-append-1
index dc76318d..afdc8dcb 100644
--- a/cpp/.traces/string-append-1
+++ b/cpp/.traces/string-append-1
@@ -1,14 +1,14 @@
-parse/0: instruction: 38
+parse/0: instruction: new
 parse/0:   ingredient: {name: "hello,", value: 0, type: 0, properties: ["hello,": "literal-string"]}
 parse/0:   product: {name: "1", value: 0, type: 2-5-4, properties: ["1": "address":"array":"character", "raw": ]}
-parse/0: instruction: 38
+parse/0: instruction: new
 parse/0:   ingredient: {name: " world!", value: 0, type: 0, properties: [" world!": "literal-string"]}
 parse/0:   product: {name: "2", value: 0, type: 2-5-4, properties: ["2": "address":"array":"character", "raw": ]}
-parse/0: instruction: 106
+parse/0: instruction: string-append
 parse/0:   ingredient: {name: "1", value: 0, type: 2-5-4, properties: ["1": "address":"array":"character", "raw": ]}
 parse/0:   ingredient: {name: "2", value: 0, type: 2-5-4, properties: ["2": "address":"array":"character", "raw": ]}
 parse/0:   product: {name: "3", value: 0, type: 2-5-4, properties: ["3": "address":"array":"character", "raw": ]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "3", value: 0, type: 2-5-4, properties: ["3": "address":"array":"character", "raw": , "deref": ]}
 parse/0:   product: {name: "4", value: 0, type: 5-4, properties: ["4": "array":"character", "raw": ]}
 new/0: hello, -> 0
diff --git a/cpp/.traces/string-equal-common-lengths-but-distinct b/cpp/.traces/string-equal-common-lengths-but-distinct
index eb00443a..3decd91b 100644
--- a/cpp/.traces/string-equal-common-lengths-but-distinct
+++ b/cpp/.traces/string-equal-common-lengths-but-distinct
@@ -1,14 +1,14 @@
-parse/0: instruction: 38
+parse/0: instruction: new
 parse/0:   ingredient: {name: "location", value: 0, type: 0, properties: ["location": "type"]}
 parse/0:   ingredient: {name: "30", value: 0, type: 0, properties: ["30": "literal"]}
 parse/0:   product: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]}
-parse/0: instruction: 38
+parse/0: instruction: new
 parse/0:   ingredient: {name: "abc", value: 0, type: 0, properties: ["abc": "literal-string"]}
 parse/0:   product: {name: "x", value: 0, type: 2-5-4, properties: ["x": "address":"array":"character"]}
-parse/0: instruction: 38
+parse/0: instruction: new
 parse/0:   ingredient: {name: "abd", value: 0, type: 0, properties: ["abd": "literal-string"]}
 parse/0:   product: {name: "y", value: 0, type: 2-5-4, properties: ["y": "address":"array":"character"]}
-parse/0: instruction: 100
+parse/0: instruction: string-equal
 parse/0:   ingredient: {name: "x", value: 0, type: 2-5-4, properties: ["x": "address":"array":"character"]}
 parse/0:   ingredient: {name: "y", value: 0, type: 2-5-4, properties: ["y": "address":"array":"character"]}
 parse/0:   product: {name: "3", value: 0, type: 3, properties: ["3": "boolean", "raw": ]}
diff --git a/cpp/.traces/string-equal-distinct-lengths b/cpp/.traces/string-equal-distinct-lengths
index 8d2c674d..dd9eeed0 100644
--- a/cpp/.traces/string-equal-distinct-lengths
+++ b/cpp/.traces/string-equal-distinct-lengths
@@ -1,14 +1,14 @@
-parse/0: instruction: 38
+parse/0: instruction: new
 parse/0:   ingredient: {name: "location", value: 0, type: 0, properties: ["location": "type"]}
 parse/0:   ingredient: {name: "30", value: 0, type: 0, properties: ["30": "literal"]}
 parse/0:   product: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]}
-parse/0: instruction: 38
+parse/0: instruction: new
 parse/0:   ingredient: {name: "abc", value: 0, type: 0, properties: ["abc": "literal-string"]}
 parse/0:   product: {name: "x", value: 0, type: 2-5-4, properties: ["x": "address":"array":"character"]}
-parse/0: instruction: 38
+parse/0: instruction: new
 parse/0:   ingredient: {name: "abcd", value: 0, type: 0, properties: ["abcd": "literal-string"]}
 parse/0:   product: {name: "y", value: 0, type: 2-5-4, properties: ["y": "address":"array":"character"]}
-parse/0: instruction: 100
+parse/0: instruction: string-equal
 parse/0:   ingredient: {name: "x", value: 0, type: 2-5-4, properties: ["x": "address":"array":"character"]}
 parse/0:   ingredient: {name: "y", value: 0, type: 2-5-4, properties: ["y": "address":"array":"character"]}
 parse/0:   product: {name: "3", value: 0, type: 3, properties: ["3": "boolean", "raw": ]}
diff --git a/cpp/.traces/string-equal-identical b/cpp/.traces/string-equal-identical
index 99087c1a..5c23287d 100644
--- a/cpp/.traces/string-equal-identical
+++ b/cpp/.traces/string-equal-identical
@@ -1,14 +1,14 @@
-parse/0: instruction: 38
+parse/0: instruction: new
 parse/0:   ingredient: {name: "location", value: 0, type: 0, properties: ["location": "type"]}
 parse/0:   ingredient: {name: "30", value: 0, type: 0, properties: ["30": "literal"]}
 parse/0:   product: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]}
-parse/0: instruction: 38
+parse/0: instruction: new
 parse/0:   ingredient: {name: "abc", value: 0, type: 0, properties: ["abc": "literal-string"]}
 parse/0:   product: {name: "x", value: 0, type: 2-5-4, properties: ["x": "address":"array":"character"]}
-parse/0: instruction: 38
+parse/0: instruction: new
 parse/0:   ingredient: {name: "abc", value: 0, type: 0, properties: ["abc": "literal-string"]}
 parse/0:   product: {name: "y", value: 0, type: 2-5-4, properties: ["y": "address":"array":"character"]}
-parse/0: instruction: 100
+parse/0: instruction: string-equal
 parse/0:   ingredient: {name: "x", value: 0, type: 2-5-4, properties: ["x": "address":"array":"character"]}
 parse/0:   ingredient: {name: "y", value: 0, type: 2-5-4, properties: ["y": "address":"array":"character"]}
 parse/0:   product: {name: "3", value: 0, type: 3, properties: ["3": "boolean", "raw": ]}
diff --git a/cpp/.traces/string-equal-reflexive b/cpp/.traces/string-equal-reflexive
index d759d505..8aad4bd5 100644
--- a/cpp/.traces/string-equal-reflexive
+++ b/cpp/.traces/string-equal-reflexive
@@ -1,11 +1,11 @@
-parse/0: instruction: 38
+parse/0: instruction: new
 parse/0:   ingredient: {name: "location", value: 0, type: 0, properties: ["location": "type"]}
 parse/0:   ingredient: {name: "30", value: 0, type: 0, properties: ["30": "literal"]}
 parse/0:   product: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]}
-parse/0: instruction: 38
+parse/0: instruction: new
 parse/0:   ingredient: {name: "abc", value: 0, type: 0, properties: ["abc": "literal-string"]}
 parse/0:   product: {name: "x", value: 0, type: 2-5-4, properties: ["x": "address":"array":"character"]}
-parse/0: instruction: 100
+parse/0: instruction: string-equal
 parse/0:   ingredient: {name: "x", value: 0, type: 2-5-4, properties: ["x": "address":"array":"character"]}
 parse/0:   ingredient: {name: "x", value: 0, type: 2-5-4, properties: ["x": "address":"array":"character"]}
 parse/0:   product: {name: "3", value: 0, type: 3, properties: ["3": "boolean", "raw": ]}
diff --git a/cpp/.traces/string-equal-with-empty b/cpp/.traces/string-equal-with-empty
index 7462567e..fa59bc57 100644
--- a/cpp/.traces/string-equal-with-empty
+++ b/cpp/.traces/string-equal-with-empty
@@ -1,14 +1,14 @@
-parse/0: instruction: 38
+parse/0: instruction: new
 parse/0:   ingredient: {name: "location", value: 0, type: 0, properties: ["location": "type"]}
 parse/0:   ingredient: {name: "30", value: 0, type: 0, properties: ["30": "literal"]}
 parse/0:   product: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]}
-parse/0: instruction: 38
+parse/0: instruction: new
 parse/0:   ingredient: {name: "", value: 0, type: 0, properties: ["": "literal-string"]}
 parse/0:   product: {name: "x", value: 0, type: 2-5-4, properties: ["x": "address":"array":"character"]}
-parse/0: instruction: 38
+parse/0: instruction: new
 parse/0:   ingredient: {name: "abcd", value: 0, type: 0, properties: ["abcd": "literal-string"]}
 parse/0:   product: {name: "y", value: 0, type: 2-5-4, properties: ["y": "address":"array":"character"]}
-parse/0: instruction: 100
+parse/0: instruction: string-equal
 parse/0:   ingredient: {name: "x", value: 0, type: 2-5-4, properties: ["x": "address":"array":"character"]}
 parse/0:   ingredient: {name: "y", value: 0, type: 2-5-4, properties: ["y": "address":"array":"character"]}
 parse/0:   product: {name: "3", value: 0, type: 3, properties: ["3": "boolean", "raw": ]}
diff --git a/cpp/.traces/string_literal b/cpp/.traces/string_literal
index 9b5d14b4..991095f5 100644
--- a/cpp/.traces/string_literal
+++ b/cpp/.traces/string_literal
@@ -1,3 +1,3 @@
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "abc def", value: 0, type: 0, properties: ["abc def": "literal-string"]}
 parse/0:   product: {name: "1", value: 0, type: 2-5-4, properties: ["1": "address":"array":"character"]}
diff --git a/cpp/.traces/string_literal_and_comment b/cpp/.traces/string_literal_and_comment
index 9ad1bff7..6df4c4d6 100644
--- a/cpp/.traces/string_literal_and_comment
+++ b/cpp/.traces/string_literal_and_comment
@@ -1,3 +1,3 @@
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "abc", value: 0, type: 0, properties: ["abc": "literal-string"]}
 parse/0:   product: {name: "1", value: 0, type: 2-5-4, properties: ["1": "address":"array":"character"]}
diff --git a/cpp/.traces/string_literal_nested b/cpp/.traces/string_literal_nested
index 937d78f7..96a6e7b5 100644
--- a/cpp/.traces/string_literal_nested
+++ b/cpp/.traces/string_literal_nested
@@ -1,3 +1,3 @@
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "abc [def]", value: 0, type: 0, properties: ["abc [def]": "literal-string"]}
 parse/0:   product: {name: "1", value: 0, type: 2-5-4, properties: ["1": "address":"array":"character"]}
diff --git a/cpp/.traces/string_literal_with_colons b/cpp/.traces/string_literal_with_colons
index 698f0358..98e7d604 100644
--- a/cpp/.traces/string_literal_with_colons
+++ b/cpp/.traces/string_literal_with_colons
@@ -1,3 +1,3 @@
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "abc:def/ghi", value: 0, type: 0, properties: ["abc:def/ghi": "literal-string"]}
 parse/0:   product: {name: "1", value: 0, type: 2-5-4, properties: ["1": "address":"array":"character"]}
diff --git a/cpp/.traces/subtract b/cpp/.traces/subtract
index feb671e9..14a46ec2 100644
--- a/cpp/.traces/subtract
+++ b/cpp/.traces/subtract
@@ -1,10 +1,10 @@
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "23", value: 0, type: 0, properties: ["23": "literal"]}
 parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "34", value: 0, type: 0, properties: ["34": "literal"]}
 parse/0:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
-parse/0: instruction: 3
+parse/0: instruction: subtract
 parse/0:   ingredient: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
 parse/0:   ingredient: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
 parse/0:   product: {name: "3", value: 0, type: 1, properties: ["3": "integer"]}
diff --git a/cpp/.traces/subtract_literal b/cpp/.traces/subtract_literal
index 7e7decc0..b9b587b6 100644
--- a/cpp/.traces/subtract_literal
+++ b/cpp/.traces/subtract_literal
@@ -1,4 +1,4 @@
-parse/0: instruction: 3
+parse/0: instruction: subtract
 parse/0:   ingredient: {name: "5", value: 0, type: 0, properties: ["5": "literal"]}
 parse/0:   ingredient: {name: "2", value: 0, type: 0, properties: ["2": "literal"]}
 parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
diff --git a/cpp/.traces/surrounding_space b/cpp/.traces/surrounding_space
index 19cbc449..8787231f 100644
--- a/cpp/.traces/surrounding_space
+++ b/cpp/.traces/surrounding_space
@@ -1,19 +1,19 @@
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "5", value: 0, type: 0, properties: ["5": "literal"]}
 parse/0:   product: {name: "10", value: 0, type: 1, properties: ["10": "integer"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "5", value: 0, type: 0, properties: ["5": "literal"]}
 parse/0:   product: {name: "20", value: 0, type: 1, properties: ["20": "integer"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "10", value: 0, type: 0, properties: ["10": "literal"]}
 parse/0:   product: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "20", value: 0, type: 0, properties: ["20": "literal"]}
 parse/0:   product: {name: "0", value: 0, type: 2-5-1, properties: ["0": "address":"array":"location", "names": "dummy"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "32", value: 0, type: 0, properties: ["32": "literal"]}
 parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "33", value: 0, type: 0, properties: ["33": "literal"]}
 parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer", "space": "1"]}
 name/0: recipe main is surrounded by dummy
diff --git a/cpp/.traces/trace b/cpp/.traces/trace
index fa3bb91c..888c600a 100644
--- a/cpp/.traces/trace
+++ b/cpp/.traces/trace
@@ -1,4 +1,4 @@
-parse/0: instruction: 18
+parse/0: instruction: trace
 parse/0:   ingredient: {name: "foo", value: 0, type: 0, properties: ["foo": "literal-string"]}
 parse/0:   ingredient: {name: "this is a trace in mu", value: 0, type: 0, properties: ["this is a trace in mu": "literal-string"]}
 after-brace/0: recipe main
diff --git a/cpp/.traces/trace_in_mu b/cpp/.traces/trace_in_mu
index ff29523a..8fb1484a 100644
--- a/cpp/.traces/trace_in_mu
+++ b/cpp/.traces/trace_in_mu
@@ -1,4 +1,4 @@
-parse/0: instruction: 18
+parse/0: instruction: trace
 parse/0:   ingredient: {name: "foo", value: 0, type: 0, properties: ["foo": "literal-string"]}
 parse/0:   ingredient: {name: "aaa", value: 0, type: 0, properties: ["aaa": "literal-string"]}
 after-brace/0: recipe test-trace_in_mu
diff --git a/cpp/.traces/wait_for_location b/cpp/.traces/wait_for_location
index 27642c88..ab2205d4 100644
--- a/cpp/.traces/wait_for_location
+++ b/cpp/.traces/wait_for_location
@@ -1,14 +1,14 @@
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
-parse/0: instruction: 30
+parse/0: instruction: run
 parse/0:   ingredient: {name: "f2", value: 0, type: 0, properties: ["f2": "recipe"]}
-parse/0: instruction: 31
+parse/0: instruction: wait-for-location
 parse/0:   ingredient: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
 parse/0:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
-parse/0: instruction: 1
+parse/0: instruction: copy
 parse/0:   ingredient: {name: "34", value: 0, type: 0, properties: ["34": "literal"]}
 parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
 after-brace/0: recipe f1
diff --git a/cpp/011load.cc b/cpp/011load.cc
index c643a92e..9afe370e 100644
--- a/cpp/011load.cc
+++ b/cpp/011load.cc
@@ -5,7 +5,7 @@
 recipe main [
   1:integer <- copy 23:literal
 ]
-+parse: instruction: 1
++parse: instruction: copy
 +parse:   ingredient: {name: "23", value: 0, type: 0, properties: ["23": "literal"]}
 +parse:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
 
@@ -122,7 +122,7 @@ bool next_instruction(istream& in, instruction* curr) {
     curr->ingredients.push_back(reagent(*p));
   }
 
-  trace("parse") << "instruction: " << curr->operation;
+  trace("parse") << "instruction: " << curr->name;
   for (vector<reagent>::iterator p = curr->ingredients.begin(); p != curr->ingredients.end(); ++p) {
     trace("parse") << "  ingredient: " << p->to_string();
   }
@@ -206,7 +206,7 @@ recently_added_recipes.clear();
 recipe main [
   1:integer <- copy 23:literal
 ]
-+parse: instruction: 1
++parse: instruction: copy
 +parse:   ingredient: {name: "23", value: 0, type: 0, properties: ["23": "literal"]}
 +parse:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
 
@@ -215,7 +215,7 @@ recipe main [
   # comment
   1:integer <- copy 23:literal
 ]
-+parse: instruction: 1
++parse: instruction: copy
 +parse:   ingredient: {name: "23", value: 0, type: 0, properties: ["23": "literal"]}
 +parse:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
 
@@ -225,7 +225,7 @@ recipe main [
   1:integer <- copy 23:literal
   # comment
 ]
-+parse: instruction: 1
++parse: instruction: copy
 +parse:   ingredient: {name: "23", value: 0, type: 0, properties: ["23": "literal"]}
 +parse:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
 
@@ -235,10 +235,10 @@ recipe main [
   # comment
   2:integer <- copy 23:literal
 ]
-+parse: instruction: 1
++parse: instruction: copy
 +parse:   ingredient: {name: "23", value: 0, type: 0, properties: ["23": "literal"]}
 +parse:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
-+parse: instruction: 1
++parse: instruction: copy
 +parse:   ingredient: {name: "23", value: 0, type: 0, properties: ["23": "literal"]}
 +parse:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
 
@@ -246,7 +246,7 @@ recipe main [
 recipe main [
   1:integer <- copy 23:literal  # comment
 ]
-+parse: instruction: 1
++parse: instruction: copy
 +parse:   ingredient: {name: "23", value: 0, type: 0, properties: ["23": "literal"]}
 +parse:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
 
@@ -255,13 +255,12 @@ recipe main [
   +foo
 ]
 +parse: label: +foo
--parse: instruction: 1
 
 :(scenario parse_multiple_properties)
 recipe main [
   1:integer <- copy 23:literal/foo:bar:baz
 ]
-+parse: instruction: 1
++parse: instruction: copy
 +parse:   ingredient: {name: "23", value: 0, type: 0, properties: ["23": "literal", "foo": "bar":"baz"]}
 +parse:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
 
@@ -269,7 +268,7 @@ recipe main [
 recipe main [
   1:integer, 2:integer <- copy 23:literal
 ]
-+parse: instruction: 1
++parse: instruction: copy
 +parse:   ingredient: {name: "23", value: 0, type: 0, properties: ["23": "literal"]}
 +parse:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
 +parse:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
@@ -278,7 +277,7 @@ recipe main [
 recipe main [
   1:integer, 2:integer <- copy 23:literal, 4:integer
 ]
-+parse: instruction: 1
++parse: instruction: copy
 +parse:   ingredient: {name: "23", value: 0, type: 0, properties: ["23": "literal"]}
 +parse:   ingredient: {name: "4", value: 0, type: 1, properties: ["4": "integer"]}
 +parse:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
@@ -288,7 +287,7 @@ recipe main [
 recipe main [
   1:integer, 2:address:integer <- copy 23:literal, 4:integer
 ]
-+parse: instruction: 1
++parse: instruction: copy
 +parse:   ingredient: {name: "23", value: 0, type: 0, properties: ["23": "literal"]}
 +parse:   ingredient: {name: "4", value: 0, type: 1, properties: ["4": "integer"]}
 +parse:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
diff --git a/cpp/013literal_string.cc b/cpp/013literal_string.cc
index c709f58f..57ac8c3a 100644
--- a/cpp/013literal_string.cc
+++ b/cpp/013literal_string.cc
@@ -71,7 +71,7 @@ recipe main [
 recipe main [
   1:address:array:character <- copy [abc]  # comment
 ]
-+parse: instruction: 1
++parse: instruction: copy
 +parse:   ingredient: {name: "abc", value: 0, type: 0, properties: ["abc": "literal-string"]}
 +parse:   product: {name: "1", value: 0, type: 2-5-4, properties: ["1": "address":"array":"character"]}
 # no other ingredients