In this talk, I will talk about how metaprogramming techniques can help build correct, flexible, and performant program analyzers. Metaprogramming techniques manipulate and transform programs as data objects. By considering static program analyzers as the objects to be manipulated or transformed, I will demonstrate how these techniques improve the construction and understanding of analyzers, as well as their flexibility and performance. First, I show that big-step abstract interpreters can be mechanically derived from small-step counterparts using program transformation techniques such as refunctionalization, establishing a functional correspondence between different styles of abstract interpreters. In the second part, I apply the first Futamura projection to build compilers for abstract interpretation and symbolic execution. I will introduce GenSym, a parallel symbolic-execution compiler derived from a high-level symbolic interpreter using multi-stage programming. GenSym generates continuation-passing style code for parallel symbolic execution of LLVM IR programs, significantly outperforming state-of-the-art tools.