C#到底属于编译型语言还是解释型语言?

        C#是一种编译型语言,也称为静态类型语言,这意味着C#代码在运行之前需要经过编译器的编译处理,并生成一个可执行的本地代码文件(通常是.exe或.dll文件)。相反,解释型语言将代码转换为低级代码后直接执行,不需要编译成可执行文件(如Python)。

下面是C#编译器的工作流程:

  1. 预处理: 编译器使用预处理器将C#代码转换为扩展的C#代码。预处理器解析源代码文件中的所有预处理器指令,比如#including和#define语句,并把原始C#代码转换成扩展的C#代码。
  2. 分析: 编译器则对扩展的C#代码进行词语分析和语法分析。将扩展的C#代码分解为更小的部分,然后构造与代码语法相关的结构,如语法树或中间表示。
  3. 语义分析: 编译器使用语义分析器检查代码,如变量类型、函数声明是否正确,函数调用是否匹配,变量是否声明并初始化等。
  4. 代码生成: 编译器将分析和优化后的C#代码转换为本地汇编代码。
  5. 链接: 在编译之后,链接器将不同的代码模块和库汇集在一起,生成可执行文件。

        编译型语言的优点在于代码运行速度较快,因为编译器可以对代码进行优化和检查,可以在编译阶段检测出错误,而不是在运行时发现。此外,也易于代码调试。当开发者编写代码时,编译器会在编辑器中提示代码中的错误。

        总之,C#是一种编译语言,它通过与编译器交互来生成本地代码。这种编译方式使代码运行更快,也可以减少开发者在开发和调试过程中的错误。
 

随着编译技术和虚拟机技术的发展,单纯以“编译型”还是“解释型”来描述一种语言已经不足以给语言分类进了。

一般意义上,编译型和解释型的区别是这种感觉:

最典型的编译型语言,可以将代码最终翻译成汇编/机器语言,直接被CPU识别。

最典型的解释型语言,程序的执行完全由虚拟机接管,甚至可以一边输入代码一边执行。

但是在实践中有两个趋势,“解释型语言”越来越“编译”,“编译型语言”越来越“解释”。

1、即便是纯编译型语言,程序的执行还是离不开操作系统。调用任何系统功能都离不开操作系统提供的基础设施。比如现代C语言离不开 C Runtime (CRT)这种东西。到了就被系统接管。

操作系统不仅要对系统调用负责,而且还要对权限、对内存越界等各种问题负责,并不是你怎么写就怎么执行。

随着语言提供的功能越来越多,运行时(Runtime)越来越厚重,权力也越来越大。编译型可能没有最初那么单纯。

2、解释型语言越来越偏向“编译”。比如原版Python就很“解释”,但也有各种各样的手段能让它显得更“编译”。比如PyPy就是使用了JIT技术,让Python具备了很多编译型语言的特征,性能也实现了翻倍。

静态类型解释型语言,比如C#和Java,由于有充足的类型信息,还支持AOT等更像“编译”的技术。还有C#支持IL2CPP这种直接转化成C++代码的技术,多半截身子都跨到“编译型”的坑里了。

这个问题可以类比“强类型“和“弱类型”。

        曾经我们还敢斩钉截铁的说“某某语言是强类型的,某某语言是弱类型的”。但到了今天,仔细来说,所谓的“强弱”并不是非黑即白的。

把变量类型的“强弱”,与变量类型的“静态和动态”画成坐标系,我们会得到一个经典的二维图谱


​​

可以看到,没有哪种语言是绝对位于某哥端点。只是在比较时“类型更强”或者“类型更动态”而已。

“编译型“和“解释型”的区别也像这样,它们互相借鉴,已经到了你中有我,我中有你的程度。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/636675.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

11.事件处理

事件处理 我们可以使用 v-on 指令 (简写为 ) 来监听 DOM 事件,并在事件触发时执行对应的 JavaScript。用法:v-on:click"methodName" 或 click"handler" 事件处理器的值可以是 内联事件处理器:事件被触发时执行的内联 J…

适合各大资源网投稿html源码

源码介绍 适合各大资源网投稿html源码,源码由HTMLCSSJS组成,记事本打开源码文件可以进行内容文字之类的修改,双击html文件可以本地运行效果,也可以上传到服务器里面,重定向这个界面 效果预览 源码下载 适合各大资源…

(2022级)成都工业学院数据库原理及应用实验五: SQL复杂查询

写在前面 1、基于2022级软件工程/计算机科学与技术实验指导书 2、成品仅提供参考 3、如果成品不满足你的要求,请寻求其他的途径 运行环境 window11家庭版 Navicat Premium 16 Mysql 8.0.36 实验要求 在实验三的基础上完成下列查询: 1、查询医生…

c++的学习之路:26、AVL树

摘要 本章主要是说一下AVL树的实现,这里说的是插入的底层原理 目录 摘要 一、原理 二、四种旋转 1、左单旋 2、右单旋 3、左右双旋 4、右左双旋 三、代码实现 1、节点创建 2、插入 3、旋转 4、判断是否平衡 5、测试 四、代码 一、原理 前面说了搜索…

开源博客项目Blog .NET Core源码学习(16:App.Hosting项目结构分析-4)

本文学习并分析App.Hosting项目中前台页面的文章专栏页面和文章详情页面。< 文章专栏页面 文章专栏页面总体上为左右布局&#xff0c;左侧显示文章列表&#xff0c;右侧从上向下为关键词搜索、分类导航、热门文章等内容。整个页面使用了layui中的面包屑导航、表单、模版、流…

【Linux开发 第七篇】权限

权限 Linux组权限修改权限 Linux组 在linux中的每个用户必须属于一个组&#xff0c;不能独立于组外 文件/目录 所有者 一般为文件的创建者&#xff0c;谁创建了该文件&#xff0c;就自然的成为了该文件的所有者 这一列即为文件的所有者 修改文件的所有者&#xff1a; chown…

selenium_使用XPATH定位

selenium_使用XPATH定位 """需求&#xff1a;1. 使用绝对路径定位 用户名 输入 admin2. 暂停2秒钟3. 使用相对路径定位 密码框 输入 123方法&#xff1a;driver.find_element_by_xpath() """# 导包 from selenium import webdriver from time im…

一、MinIO基本知识

MinIO基本知识 一、简介1.许可 二、部署1.Docker部署1.1 部署容器 1.2 MinIO页面访问1.3 创建Bucket![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/6c8aa92975f146b691f1f36ce1033e7c.png) 三、Python-API1.安装包2.Bucket、Object概念3.Bucket-API4.MinIOClient-…

亚信安慧AntDB:数据库性能新高度

亚信安慧AntDB秉持着为客户提供最佳数据库解决方案的理念&#xff0c;不断探索并创新&#xff0c;最近取得了重大的突破。他们成功地研发出一种先进的数据库割接方案&#xff0c;实现了不停服、零故障的数据库割接操作&#xff0c;有效地将替换所带来的业务影响降至最低。 这一…

[阅读笔记25][WebArena]A Realistic Web Environment for Building Autonomous Agents

这篇论文提出了WebArena这个环境与测试基准&#xff0c;在24年1月发表。 之前的agent都是在一些简化过的合成环境中测试的&#xff0c;这会导致与现实场景脱节。这篇论文构建了一个高度逼真、可复现的环境。该环境涉及四个领域&#xff1a;电子商务、论坛讨论、软件开发和内容管…

制作一个RISC-V的操作系统十三-抢占式多任务和兼容协作式多任务

文章目录 强占式多任务流程代码具体流程兼容协作式多任务&#xff08;软中断&#xff09;寄存器 msip流程代码结果 强占式多任务 流程 抢占式多任务由计时器中断触发&#xff0c;最后在处理程序中切换到下一个进程 代码具体流程 上下文中增加pc寄存器 寄存器保留上下文和切…

目标检测网络YOLO进化之旅

yolo系列网络在目标检测领域取得了巨大的成功&#xff0c; 尤其是在工程实践中&#xff0c; 以其出色的性能优势获得了广泛的应用落地。 YOLO的前3个版本是由同一个作者团队出品&#xff0c; 算是官方版本。 之后的版本都是各个研究团队自己改进的版本&#xff0c; 之间并无明…