static void EmitMain(string programName, Assembly[] assemblies, Tracer tracer, IReadOnlyList <ImmutableRootSyntaxNode> rootNodes)
        {
            var createdAssembly = AssemblyBuilder.DefineDynamicAssembly(new AssemblyName(programName), AssemblyBuilderAccess.RunAndSave);
            var createdModule   = createdAssembly.DefineDynamicModule(programName, programName + ".exe");

            var emitModuleBuilder = new EmitModuleBuilder(createdModule, assemblies);

            var codeGenerator = new NewCodeGenerator(emitModuleBuilder, tracer);

            var entryPoint = codeGenerator.GenerateAssembly(rootNodes);

            //            System.Console.Out.WriteLine("Hello World from Out!");


            if (entryPoint == null)
            {
                throw new InvalidOperationException("Entry point must be null");
            }

            createdAssembly.SetEntryPoint(((EmitMethodInfo)entryPoint).MethodInfo);

            createdAssembly.Save(programName + ".exe");

            tracer.AddEpoch("Code Generation");
        }
        static void IlAsmMain(string programName, Assembly[] assemblies, Tracer tracer, IReadOnlyList <ImmutableRootSyntaxNode> rootNode)
        {
            var emitModuleBuilder = new AsmModuleBuilder(programName, assemblies);

            var codeGenerator = new NewCodeGenerator(emitModuleBuilder, tracer);

            var entryPoint = codeGenerator.GenerateAssembly(rootNode);


            if (entryPoint == null)
            {
                throw new InvalidOperationException("Entry point must be null");
            }

            var asm = emitModuleBuilder.Emitter.Finalize();

            File.WriteAllLines($"{programName}.il", asm);

            tracer.AddEpoch("Code Generation");
        }