diff --git a/src/Bytecode.hh b/src/Bytecode.hh
index 3688e9d2b968fc32767c0b1f480301403f36fc19..922bf21dc1bb1e2c8c6897d93e8251b13de062a8 100644
--- a/src/Bytecode.hh
+++ b/src/Bytecode.hh
@@ -115,6 +115,17 @@ class BytecodeWriter;
 struct BytecodeInstruction
 {
   const Tags op_code;
+  explicit BytecodeInstruction(Tags op_code_arg) :
+    op_code {op_code_arg}
+  {
+  }
+protected:
+  /* This is a base class, so the destructor should be either public+virtual or
+     protected+non-virtual. We opt for the latter, because otherwise this class
+     would no longer be POD; its memory representation would also include
+     runtime type information, and our crude serialization technique (copying the
+     whole object from memory) would thus not work. */
+  ~BytecodeInstruction() = default;
 };
 
 template<typename T1>
@@ -127,6 +138,9 @@ public:
                                                       arg1{arg_arg1}
   {
   };
+protected:
+  // See BytecodeInstruction destructor for the rationale
+  ~TagWithOneArgument() = default;
 };
 
 template<typename T1, typename T2>
@@ -140,6 +154,9 @@ public:
     BytecodeInstruction{op_code_arg}, arg1{arg_arg1}, arg2{arg_arg2}
   {
   };
+protected:
+  // See BytecodeInstruction destructor for the rationale
+  ~TagWithTwoArguments() = default;
 };
 
 template<typename T1, typename T2, typename T3>
@@ -154,6 +171,9 @@ public:
     BytecodeInstruction{op_code_arg}, arg1{arg_arg1}, arg2{arg_arg2}, arg3{arg_arg3}
   {
   };
+protected:
+  // See BytecodeInstruction destructor for the rationale
+  ~TagWithThreeArguments() = default;
 };
 
 template<typename T1, typename T2, typename T3, typename T4>
@@ -170,9 +190,12 @@ public:
     arg3{move(arg_arg3)}, arg4{arg_arg4}
   {
   };
+protected:
+  // See BytecodeInstruction destructor for the rationale
+  ~TagWithFourArguments() = default;
 };
 
-class FLDZ_ : public BytecodeInstruction
+class FLDZ_ final : public BytecodeInstruction
 {
 public:
   FLDZ_() : BytecodeInstruction{Tags::FLDZ}
@@ -180,7 +203,7 @@ public:
   };
 };
 
-class FEND_ : public BytecodeInstruction
+class FEND_ final : public BytecodeInstruction
 {
 public:
   FEND_() : BytecodeInstruction{Tags::FEND}
@@ -188,7 +211,7 @@ public:
   };
 };
 
-class FENDBLOCK_ : public BytecodeInstruction
+class FENDBLOCK_ final : public BytecodeInstruction
 {
 public:
   FENDBLOCK_() : BytecodeInstruction{Tags::FENDBLOCK}
@@ -196,7 +219,7 @@ public:
   };
 };
 
-class FENDEQU_ : public BytecodeInstruction
+class FENDEQU_ final : public BytecodeInstruction
 {
 public:
   FENDEQU_() : BytecodeInstruction{Tags::FENDEQU}
@@ -204,7 +227,7 @@ public:
   };
 };
 
-class FDIMT_ : public TagWithOneArgument<int>
+class FDIMT_ final : public TagWithOneArgument<int>
 {
 public:
   explicit FDIMT_(int size_arg) : TagWithOneArgument::TagWithOneArgument{Tags::FDIMT, size_arg}
@@ -217,7 +240,7 @@ public:
   };
 };
 
-class FDIMST_ : public TagWithOneArgument<int>
+class FDIMST_ final : public TagWithOneArgument<int>
 {
 public:
   explicit FDIMST_(int size_arg) : TagWithOneArgument::TagWithOneArgument{Tags::FDIMST, size_arg}
@@ -230,7 +253,7 @@ public:
   };
 };
 
-class FLDC_ : public TagWithOneArgument<double>
+class FLDC_ final : public TagWithOneArgument<double>
 {
 public:
   explicit FLDC_(double value_arg) : TagWithOneArgument::TagWithOneArgument{Tags::FLDC, value_arg}
@@ -243,7 +266,7 @@ public:
   };
 };
 
-class FLDU_ : public TagWithOneArgument<int>
+class FLDU_ final : public TagWithOneArgument<int>
 {
 public:
   explicit FLDU_(int pos_arg) : TagWithOneArgument::TagWithOneArgument{Tags::FLDU, pos_arg}
@@ -256,7 +279,7 @@ public:
   };
 };
 
-class FLDSU_ : public TagWithOneArgument<int>
+class FLDSU_ final : public TagWithOneArgument<int>
 {
 public:
   explicit FLDSU_(int pos_arg) : TagWithOneArgument::TagWithOneArgument{Tags::FLDSU, pos_arg}
@@ -269,7 +292,7 @@ public:
   };
 };
 
-class FLDR_ : public TagWithOneArgument<int>
+class FLDR_ final : public TagWithOneArgument<int>
 {
 public:
   explicit FLDR_(int pos_arg) : TagWithOneArgument::TagWithOneArgument{Tags::FLDR, pos_arg}
@@ -282,7 +305,7 @@ public:
   };
 };
 
-class FLDT_ : public TagWithOneArgument<int>
+class FLDT_ final : public TagWithOneArgument<int>
 {
 public:
   explicit FLDT_(int pos_arg) : TagWithOneArgument::TagWithOneArgument{Tags::FLDT, pos_arg}
@@ -295,7 +318,7 @@ public:
   };
 };
 
-class FLDST_ : public TagWithOneArgument<int>
+class FLDST_ final : public TagWithOneArgument<int>
 {
 public:
   explicit FLDST_(int pos_arg) : TagWithOneArgument::TagWithOneArgument{Tags::FLDST, pos_arg}
@@ -308,7 +331,7 @@ public:
   };
 };
 
-class FSTPT_ : public TagWithOneArgument<int>
+class FSTPT_ final : public TagWithOneArgument<int>
 {
 public:
   explicit FSTPT_(int pos_arg) : TagWithOneArgument::TagWithOneArgument{Tags::FSTPT, pos_arg}
@@ -321,7 +344,7 @@ public:
   };
 };
 
-class FSTPST_ : public TagWithOneArgument<int>
+class FSTPST_ final : public TagWithOneArgument<int>
 {
 public:
   explicit FSTPST_(int pos_arg) : TagWithOneArgument::TagWithOneArgument{Tags::FSTPST, pos_arg}
@@ -334,7 +357,7 @@ public:
   };
 };
 
-class FSTPR_ : public TagWithOneArgument<int>
+class FSTPR_ final : public TagWithOneArgument<int>
 {
 public:
   explicit FSTPR_(int pos_arg) : TagWithOneArgument::TagWithOneArgument{Tags::FSTPR, pos_arg}
@@ -347,7 +370,7 @@ public:
   };
 };
 
-class FSTPU_ : public TagWithOneArgument<int>
+class FSTPU_ final : public TagWithOneArgument<int>
 {
 public:
   explicit FSTPU_(int pos_arg) : TagWithOneArgument::TagWithOneArgument{Tags::FSTPU, pos_arg}
@@ -360,7 +383,7 @@ public:
   };
 };
 
-class FSTPSU_ : public TagWithOneArgument<int>
+class FSTPSU_ final : public TagWithOneArgument<int>
 {
 public:
   explicit FSTPSU_(int pos_arg) : TagWithOneArgument::TagWithOneArgument{Tags::FSTPSU, pos_arg}
@@ -373,7 +396,7 @@ public:
   };
 };
 
-class FSTPG_ : public TagWithOneArgument<int>
+class FSTPG_ final : public TagWithOneArgument<int>
 {
 public:
   explicit FSTPG_(int pos_arg) : TagWithOneArgument::TagWithOneArgument{Tags::FSTPG, pos_arg}
@@ -386,7 +409,7 @@ public:
   };
 };
 
-class FSTPG2_ : public TagWithTwoArguments<int, int>
+class FSTPG2_ final : public TagWithTwoArguments<int, int>
 {
 public:
   FSTPG2_(int row_arg, int col_arg) : TagWithTwoArguments::TagWithTwoArguments{Tags::FSTPG2, row_arg, col_arg}
@@ -404,7 +427,7 @@ public:
   };
 };
 
-class FSTPG3_ : public TagWithFourArguments<int, int, int, int>
+class FSTPG3_ final : public TagWithFourArguments<int, int, int, int>
 {
 public:
   FSTPG3_(int row_arg, int col_arg, int lag_arg, int col_pos_arg) : TagWithFourArguments::TagWithFourArguments{Tags::FSTPG3, row_arg, col_arg, lag_arg, col_pos_arg}
@@ -432,7 +455,7 @@ public:
   };
 };
 
-class FUNARY_ : public TagWithOneArgument<UnaryOpcode>
+class FUNARY_ final : public TagWithOneArgument<UnaryOpcode>
 {
 public:
   explicit FUNARY_(UnaryOpcode op_type_arg) : TagWithOneArgument::TagWithOneArgument{Tags::FUNARY, op_type_arg}
@@ -445,7 +468,7 @@ public:
   };
 };
 
-class FBINARY_ : public TagWithOneArgument<BinaryOpcode>
+class FBINARY_ final : public TagWithOneArgument<BinaryOpcode>
 {
 public:
   explicit FBINARY_(BinaryOpcode op_type_arg) : TagWithOneArgument::TagWithOneArgument{Tags::FBINARY, op_type_arg}
@@ -458,7 +481,7 @@ public:
   };
 };
 
-class FTRINARY_ : public TagWithOneArgument<TrinaryOpcode>
+class FTRINARY_ final : public TagWithOneArgument<TrinaryOpcode>
 {
 public:
   explicit FTRINARY_(TrinaryOpcode op_type_arg) : TagWithOneArgument::TagWithOneArgument{Tags::FTRINARY, op_type_arg}
@@ -471,7 +494,7 @@ public:
   };
 };
 
-class FJMPIFEVAL_ : public TagWithOneArgument<int>
+class FJMPIFEVAL_ final : public TagWithOneArgument<int>
 {
 public:
   explicit FJMPIFEVAL_(int arg_pos) : TagWithOneArgument::TagWithOneArgument{Tags::FJMPIFEVAL, arg_pos}
@@ -484,7 +507,7 @@ public:
   }
 };
 
-class FJMP_ : public TagWithOneArgument<int>
+class FJMP_ final : public TagWithOneArgument<int>
 {
 public:
   explicit FJMP_(int arg_pos) : TagWithOneArgument::TagWithOneArgument{Tags::FJMP, arg_pos}
@@ -497,7 +520,7 @@ public:
   }
 };
 
-class FLDTEF_ : public TagWithOneArgument<int>
+class FLDTEF_ final : public TagWithOneArgument<int>
 {
 public:
   explicit FLDTEF_(int number) : TagWithOneArgument::TagWithOneArgument{Tags::FLDTEF, number}
@@ -510,7 +533,7 @@ public:
   }
 };
 
-class FSTPTEF_ : public TagWithOneArgument<int>
+class FSTPTEF_ final : public TagWithOneArgument<int>
 {
 public:
   explicit FSTPTEF_(int number) : TagWithOneArgument::TagWithOneArgument{Tags::FSTPTEF, number}
@@ -523,7 +546,7 @@ public:
   }
 };
 
-class FLDTEFD_ : public TagWithTwoArguments<int, int>
+class FLDTEFD_ final : public TagWithTwoArguments<int, int>
 {
 public:
   FLDTEFD_(int indx, int row) : TagWithTwoArguments::TagWithTwoArguments{Tags::FLDTEFD, indx, row}
@@ -541,7 +564,7 @@ public:
   };
 };
 
-class FSTPTEFD_ : public TagWithTwoArguments<int, int>
+class FSTPTEFD_ final : public TagWithTwoArguments<int, int>
 {
 public:
   FSTPTEFD_(int indx, int row) : TagWithTwoArguments::TagWithTwoArguments{Tags::FSTPTEFD, indx, row}
@@ -559,7 +582,7 @@ public:
   };
 };
 
-class FLDTEFDD_ : public TagWithThreeArguments<int, int, int>
+class FLDTEFDD_ final : public TagWithThreeArguments<int, int, int>
 {
 public:
   FLDTEFDD_(int indx, int row, int col) : TagWithThreeArguments::TagWithThreeArguments{Tags::FLDTEFDD, indx, row, col}
@@ -582,7 +605,7 @@ public:
   };
 };
 
-class FSTPTEFDD_ : public TagWithThreeArguments<int, int, int>
+class FSTPTEFDD_ final : public TagWithThreeArguments<int, int, int>
 {
 public:
   FSTPTEFDD_(int indx, int row, int col) : TagWithThreeArguments::TagWithThreeArguments{Tags::FSTPTEF, indx, row, col}
@@ -605,7 +628,7 @@ public:
   };
 };
 
-class FLDVS_ : public TagWithTwoArguments<SymbolType, int>
+class FLDVS_ final : public TagWithTwoArguments<SymbolType, int>
 {
 public:
   FLDVS_(SymbolType type_arg, int pos_arg) : TagWithTwoArguments::TagWithTwoArguments{Tags::FLDVS, type_arg, pos_arg}
@@ -623,7 +646,7 @@ public:
   };
 };
 
-class FLDSV_ : public TagWithTwoArguments<SymbolType, int>
+class FLDSV_ final : public TagWithTwoArguments<SymbolType, int>
 {
 public:
   FLDSV_(SymbolType type_arg, int pos_arg) : TagWithTwoArguments::TagWithTwoArguments{Tags::FLDSV, type_arg, pos_arg}
@@ -641,7 +664,7 @@ public:
   };
 };
 
-class FSTPSV_ : public TagWithTwoArguments<SymbolType, int>
+class FSTPSV_ final : public TagWithTwoArguments<SymbolType, int>
 {
 public:
   FSTPSV_(SymbolType type_arg, int pos_arg) : TagWithTwoArguments::TagWithTwoArguments{Tags::FSTPSV, type_arg, pos_arg}
@@ -659,7 +682,7 @@ public:
   };
 };
 
-class FLDV_ : public TagWithThreeArguments<SymbolType, int, int>
+class FLDV_ final : public TagWithThreeArguments<SymbolType, int, int>
 {
 public:
   FLDV_(SymbolType type_arg, int pos_arg, int lead_lag_arg) :
@@ -683,7 +706,7 @@ public:
   };
 };
 
-class FSTPV_ : public TagWithThreeArguments<SymbolType, int, int>
+class FSTPV_ final : public TagWithThreeArguments<SymbolType, int, int>
 {
 public:
   FSTPV_(SymbolType type_arg, int pos_arg, int lead_lag_arg) :
@@ -707,7 +730,7 @@ public:
   };
 };
 
-class FCALL_ : public BytecodeInstruction
+class FCALL_ final : public BytecodeInstruction
 {
   template<typename B>
   friend BytecodeWriter &operator<<(BytecodeWriter &code_file, const B &instr);
@@ -826,7 +849,7 @@ public:
   }
 };
 
-class FNUMEXPR_ : public BytecodeInstruction
+class FNUMEXPR_ final : public BytecodeInstruction
 {
 private:
   ExpressionType expression_type;
@@ -880,7 +903,7 @@ public:
   };
 };
 
-class FBEGINBLOCK_ : public BytecodeInstruction
+class FBEGINBLOCK_ final : public BytecodeInstruction
 {
   template<typename B>
   friend BytecodeWriter &operator<<(BytecodeWriter &code_file, const B &instr);