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.mzph.cn/news/825140.shtml

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

相关文章

stack queue Leetcode 栈和队列算法题

232.用栈实现队列 Queue 是 Collection 接口下的,她的一个实现类是ArrayDeque. 不推荐使用 Vector 实现的 Stack,因为为了保证线程安全使得 Stack 的效率很低,而且由于继承的 Vector 导致没有屏蔽一些栈不应该有的操作 stack 下使用入栈出…

计算机视觉——手机目标检测数据集

这是一个手机目标检测的数据集,数据集的标注工具是labelimg,数据格式是voc格式,要训练yolo模型的话,可以使用脚本改成txt格式,数据集标注了手机,标签名:telephone,数据集总共有1960张,有一部分是…

软件无线电安全之GNU Radio基础 -上

GNU Radio介绍 GNU Radio是一款开源的软件工具集,专注于软件定义无线电(SDR)系统的设计和实现。该工具集支持多种SDR硬件平台,包括USRP、HackRF One和RTL-SDR等。用户可以通过GNU Radio Companion构建流程图,使用不同…

BackTrader 中文文档(二十七)

原文:www.backtrader.com/ 数据 - 多个时间框架 原文:www.backtrader.com/blog/posts/2015-08-24-data-multitimeframe/data-multitimeframe/ 有时,使用不同的时间框架进行投资决策: 周线用于评估趋势 每日执行进入 或者 5 分钟…

软考132-上午题-【软件工程】-沟通路径

一、定义 1-1、沟通路径1 沟通路径 1-2、沟通路径2 沟通路径 n-1 二、真题 真题1: 真题2: 真题3:

2024年150道高频Java面试题(三十一)

61. sleep() 和 wait() 有什么区别? sleep() 和 wait() 方法在Java中被广泛用于线程控制,它们都可以让线程暂停执行一段时间,但它们之间存在一些重要的区别: 所属类: sleep() 是 Thread 类的静态方法。wait() 是 Obj…

发布 Chrome/Edge浏览器extension扩展到应用商店

Chrom Extension发布流程 创建和发布自定义 Chrome 应用和扩展程序:https://support.google.com/chrome/a/answer/2714278?hlzh-Hans 在 Chrome 应用商店中发布:https://developer.chrome.com/docs/webstore/publish?hlzh-cn 注册开发者帐号&#…

图解CPU的实模式与保护模式

哈喽,大家好,我是呼噜噜,好久没有更新old linux了,在上一篇文章Linux0.12内核源码解读(7)-陷阱门初始化中,我们简要地提及了中断,但是中断机制在计算机世界里非常重要,处处都离不开中断&#xf…

Element——组件

element官网 https://element.eleme.cn/#/zh-CN/component/layout vscode格式化快捷键&#xff1a;shiftaltf table表格 <template><el-table:data"tableData"style"width: 100%"><el-table-columnprop"date"label"日期…

富格林:可信方式识破受害暗箱

富格林认为&#xff0c;现货黄金正是得宠的投资产品&#xff0c;目前不断有投资新手加入现货黄金投资市场。俗话说万事开头难&#xff0c;对于新手来说&#xff0c;掌握入市相关的可信知识识破受害暗箱是决定投资能获利的关键因素。那么&#xff0c;有哪些可信知识可以帮助我们…

博客摘录「 perf工具使用统计函数调用」2024年4月18日

性能调优时&#xff0c;我们通常需要分析查找到程序百分比高的热点代码片段&#xff0c;这便需要使用 perf record 记录单个函数级别的统计信息&#xff0c;并使用 perf report 来显示统计结果。 只要两条指令&#xff1a; sudo perf record -e cpu-clock -g -p 123456 sudo …

Git使用总结(不断更新中)

branch 本地分支操作 删除本地分支 git branch -d <local-branch-name>远端分支操作 从远端分支创建本地分支 git checkout -b <local-branch-name> origin/<remote-branch-name>git ignore 如果工程的代码文件中有不希望上传到远端的文件&#xff0c;…

排列特征重要性(Permutation Feature Importance)

5个条件判断一件事情是否发生&#xff0c;每个条件可能性只有2种&#xff08;发生或者不发生&#xff09;&#xff0c;计算每个条件对这件事情发生的影响力。排列特征重要性模型的程序。 例一 在机器学习领域&#xff0c;排列特征重要性&#xff08;Permutation Feature Impor…

php简单路由实现伪静态

#伪静态作用# 增强搜索引擎的友好性&#xff1a;通过改变动态网页的URL&#xff0c;使之看起来像静态网页&#xff0c;伪静态技术有助于提高网站在搜索引擎中的表现&#xff0c;使网站内容更易被搜索引擎抓取和索引。提升用户信任度和体验&#xff1a;伪静态的URL后缀方式与静…

【honggfuzz学习笔记】honggfuzz的基本特性

本文架构 1.动机2.honggfuzz的基本概念官网描述解读 3. honggfuzz的反馈驱动(Feedback-Driven)软件驱动反馈&#xff08;software-based coverage-guided fuzzing&#xff09;代码覆盖率代码覆盖率的计量单位 代码覆盖率的统计方式 硬件驱动反馈&#xff08; hardware-based co…

CTFHUB RCE作业

题目地址&#xff1a;CTFHub 完成情况如图&#xff1a; 知识点&#xff1a; preg_match_all 函数 正则匹配函数 int preg_match_all ( string $pattern , string $subject [, array &$matches [, int $flags PREG_PATTERN_ORDER [, int $offset 0 ]]] )搜索 subject 中…

【Python小游戏】植物大战僵尸的实现与源码分享

文章目录 Python版植物大战僵尸环境要求方法源码分享初始化页面&#xff08;部分&#xff09;地图搭建&#xff08;部分&#xff09;定义植物类 &#xff08;部分&#xff09;定义僵尸类&#xff08;部分&#xff09;游戏运行入口 游戏源码获取 Python版植物大战僵尸 已有的植…

resume

通过添加 --resume 参数&#xff0c;用户可以在命令行中指定一个检查点文件的路径&#xff0c;用于恢复之前训练的模型状态。如果用户不指定 --resume 参数&#xff0c;则默认值为空字符串。 python train.py train multi_resnet18_kd --resume ./save_checkpoints/multi_resn…

Git:远程仓库名称变更本地无法提交解决

报错信息 blog % git push To github.com:hannah-lin-sama/web-docs.git! [rejected] main -> main (non-fast-forward) 错误&#xff1a;无法推送一些引用到 github.com:hannah-lin-sama/web-docs.git 提示&#xff1a;更新被拒绝&#xff0c;因为您当前分支的最新…

JavaScript中处理回调与状态更新

JavaScript中处理高速回调与状态更新的问题分析与解决方案 在JavaScript编程中&#xff0c;处理高速执行的回调函数时常会遇到状态管理的问题&#xff0c;尤其是在处理数组或其他共享数据结构时。这些问题通常因为JavaScript的异步执行特性以及共享状态的可变性引起。下面将分…