返回顶部
首页 > 资讯 > 后端开发 > Python >怎样理解IronPython 编译器
  • 204
分享到

怎样理解IronPython 编译器

2023-06-17 17:06:38 204人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

这篇文章将为大家详细讲解有关怎样理解Ironpython 编译器,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。自 IronPython 正式发布以来,由于对 Python 语言的喜爱所驱使,

这篇文章将为大家详细讲解有关怎样理解Ironpython 编译器,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

自 IronPython 正式发布以来,由于对 Python 语言的喜爱所驱使,同时我想藉此去了解一下编程语言的IronPython 编译器,分析器等程序是什么原理,如何运作的,于是就开始进行IronPython 编译器的学习了。

但代码也看了有一段时间了,之前是看一些实现细节,结果越看越糊涂。现在我发现需要改变一下策略了,因为我们了解一个系统总是从对它的使用方法去开始了解,如果直接去了解底层的运作原理,则可能会迷失在代码海洋里面。所以我也准备采取自顶而下的分析方法,捡软柿子捏,从简单的,宏观的入手。至于具体的实现细节,可以慢慢再深入研究。

直奔主题,我们看到 Compile() 方法,这是负责编译的主控制方法。这个方法不难理解,我读了一遍,注释如下:

/// <summary> /// 编译  /// </summary> public void Compile() {      string fullPath = Path.GetFullPath(outputAssembly);      string outDir = Path.GetDirectoryName(fullPath);      string fileName = Path.GetFileName(outputAssembly);       // Python 编译器的接受池      PythonCompilerSink sink = new PythonCompilerSink(compilerSink);       // 程序集产生器      assemblyGen = new AssemblyGen(          Path.GetFileNameWithoutExtension(outputAssembly),          outDir, fileName, includeDebugInfORMation, staticTypes, executable, Machine          );       // 是否以设定入口点(entry point)      bool entryPointSet = false;       // 设定默认的主文件(对非 DLL 的输出文件类型而言)      if (mainFile == null && sourceFiles.Count == 1 && targetKind != PEFileKinds.Dll) {          mainFile = sourceFiles[0];      }       // 对每个源文件依次编译      foreach (string sourceFile in sourceFiles) {          // 是否产生 Main 方法          bool createMainMethod = sourceFile == mainFile;          // 每个源代码文件编译为一个模块          CompilePythonModule(sourceFile, sink, createMainMethod);           if (sink.Errors > 0) return;           if (createMainMethod) {              entryPointSet = true;          }      }

这段代码中,调用到了 IronPython 编译器自身的私有方法 CompilePythonModule() 来完成编译模块的功能。下面我们来看一下这个方法在做什么:

    // 依次将所有资源文件添加到程序集中      if (resourceFiles != null) {          foreach (ResourceFile rf in resourceFiles) {              assemblyGen.AddResourceFile(rf.Name, rf.File, rf.PublicResource ? ResourceAttributes.Public : ResourceAttributes.Private);          }      }       // 对非 DLL 的目标文件,必须要求有一个入口点      if (targetKind != PEFileKinds.Dll && !entryPointSet) {          sink.AddError("", string.Format("Need an entry point for target kind {0}", targetKind), String.Empty, CodeSpan.Empty, -1, Severity.Error);      }       // 最终产生输出的程序集      assemblyGen.Dump();  }   本文来自CSDN博客,转载请标明出处:Http://blog.csdn.net/inelm/arcHive/2006/10/09/4612996.aspx

在上述两个方法中,我们看到,出现了几个重要的类,它们将是我们下面接着分析的重点线索:

// 编译模块  private void CompilePythonModule(string fileName, PythonCompilerSink sink, bool createMain) {      // 设定当前要编译的源文件      assemblyGen.SetPythonSourceFile(fileName);      // 创建编译器环境对象      CompilerContext context = new CompilerContext(fileName, sink);      // 创建分析器      Parser p = Parser.FromFile(state, context);      // 调用分析器的分析方法,得到一个语句对象(语句应该是利用了组合模式的一个嵌套的概念,这个语句代表整个文件里的一个大语句)      Statement body = p.ParseFileInput();       if (sink.Errors > 0) return;       // 创建一个全局套件??有可能是指 globals() 这个字典对象。有待分析。。。      // 这里面的 Binder 是干什么的也有待研究。      GlobalSuite gs = Compiler.Ast.Binder.Bind(body, context);      string moduleName = GetModuleFromFilename(fileName);      // 这里看到了 TypeGen,该类代表一个类型产生器      // tg 指向了一个模块类型(IronPython 中,每一个模块产生为一个对应的类。)      TypeGen tg = OutputGenerator.GenerateModuleType(moduleName, assemblyGen);      // 编译模块的 __init__ 方法??(猜测)      CodeGen init = CompileModuleInit(context, gs, tg, moduleName);

到这里为止,我们大致上看到了 IronPython 编译器的工作流程,从一系列源代码文件,资源文件,以及其他一些配置属性出发,经过 Parser, 各种 Generator 的运作,最终到达 AssemblyGenerator 的 Dump() 方法,输出编译结果程序集。

关于怎样理解IronPython 编译器就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

--结束END--

本文标题: 怎样理解IronPython 编译器

本文链接: https://lsjlt.com/news/290886.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 怎样理解IronPython 编译器
    这篇文章将为大家详细讲解有关怎样理解IronPython 编译器,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。自 IronPython 正式发布以来,由于对 Python 语言的喜爱所驱使,...
    99+
    2023-06-17
  • 如何理解C++编译器编译功能
    如何理解C++编译器编译功能,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。下面深度讲解C++中的大规模C++编译器,C++编译器具有很强的复杂性,并且源程序的行数也是非常多...
    99+
    2023-06-17
  • C++编译器是怎样实现异常处理
    本篇文章为大家展示了C++编译器是怎样实现异常处理,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。由于C++编译器装程序太多,此处无法上传,所以大家有communitysever的可以从里面获得然后反...
    99+
    2023-06-17
  • CSS的预编译器PostCSS是怎样的
    这篇文章给大家介绍CSS的预编译器PostCSS是怎样的,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。提到css预编译器(css preprocessor),你可能想到Sass、Les...
    99+
    2024-04-02
  • Linux系统是怎样编译boost
    本篇文章为大家展示了Linux系统是怎样编译boost,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。boost库是一个可移植、提供源代码的c++库,作为标准库的后备,是c++标准化进程的开发引擎之一...
    99+
    2023-06-28
  • CentOS Mysql用户建立设置编译器的编译参数是怎样的
    CentOS Mysql用户建立设置编译器的编译参数是怎样的,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。建立CentOS Mysql用户组是CentOS用户必须学习使用的,由...
    99+
    2023-06-16
  • GD编译出错解决方法是怎样的
    这期内容当中小编将会给大家带来有关GD编译出错解决方法是怎样的,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。编译最新的2.0.35版本,用默认的 ./configure编译 当make的时候,出现以下错误...
    99+
    2023-06-13
  • Go语言编译器实现原理与编译过程详解
    标题:Go语言编译器实现原理与编译过程详解 在计算机编程领域中,编译器是一种非常重要的工具,它负责将我们编写的高级语言代码转换为目标机器能够执行的机器码。Go语言作为一种快速、高效的编...
    99+
    2024-03-11
    编译器 go语言 实现
  • CentOS 5编译编译基本类系统软件是怎样的
    这篇文章将为大家详细讲解有关CentOS 5编译编译基本类系统软件是怎样的,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。CentOS社区不断与其他的同类社区合并,使CentOS Linux逐...
    99+
    2023-06-16
  • Golang编译原理解析
    Golang编译原理解析与具体代码示例 在现代编程语言中,编译原理是一个至关重要的领域,它涉及到将高级语言代码转换为机器能够理解和执行的低级指令的过程。作为一门流行的编程语言,Gola...
    99+
    2024-03-06
    原理 编译 golang go语言
  • 怎样用C++数据类型定义编译器
    本篇文章给大家分享的是有关怎样用C++数据类型定义编译器,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。许多编程人员学习C++总结经验为,有的觉得C++语言是一门独立的语言,并不...
    99+
    2023-06-17
  • Linux系统怎样编译ko文件
    这篇文章的内容主要围绕Linux系统怎样编译ko文件进行讲述,文章内容清晰易懂,条理清晰,非常适合新手学习,值得大家去阅读。感兴趣的朋友可以跟随小编一起阅读吧。希望大家通过这篇文章有所收获!ko文件是内核模块文件,是内核加载的某个模块,一般...
    99+
    2023-06-28
  • 怎样去解析VB.NET条件编译的应用方法
    这期内容当中小编将会给大家带来有关怎样去解析VB.NET条件编译的应用方法,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。VB.NET编程语言是一款由微软推出的新的编程语言,其具有面向对象特性,而且运行机制...
    99+
    2023-06-17
  • J2ME中KVM编译过程是怎样的
    今天就跟大家聊聊有关J2ME中KVM编译过程是怎样的,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。这里向大家简单介绍一下Windows下编译KVM的...
    99+
    2024-04-02
  • 怎样进行Python源代码的编译
    怎样进行Python源代码的编译,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。在计算机语言中Python源代码一般的情况下是不进行编译的,只是通过几个文件就能运用的。我们一般使...
    99+
    2023-06-17
  • CentOS Apache编译和安装是怎样的
    CentOS Apache编译和安装是怎样的,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。下载:CentOS Apache[root@localhost src]# chmod...
    99+
    2023-06-16
  • Golang编译器全解析:一文了解主流编译器特点
    随着Go语言的不断发展和普及,越来越多的开发者开始尝试使用Go语言进行开发。而作为一门静态类型的编程语言,Go语言的编译器的性能和稳定性直接关系到开发者的使用体验。 在目前的市场上,主流的Go语言编译器有Go...
    99+
    2024-01-19
    编译器 Golang 特点
  • 如何理解Linux内核编译
    这篇文章给大家介绍如何理解Linux内核编译,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。一、前言(仅供参考)linux内核该如何学习安装vmware虚拟机或者virtualbox,再安装发行版本linuxwww.ke...
    99+
    2023-06-15
  • 如何理解linux链接编译
    本篇内容主要讲解“如何理解linux链接编译”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何理解linux链接编译”吧!为什么要包含头文件而不是.c文件测试代码:代码如下:m.c文件:#inc...
    99+
    2023-06-09
  • tensorflow编译器卡住了怎么解决
    当TensorFlow编译器卡住时,可以尝试以下方法来解决问题: 检查计算机资源:确保计算机有足够的内存和处理器资源来编译Ten...
    99+
    2024-03-14
    tensorflow
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作