源码编译英文-关于编译代码您应该了解的内容

使用这个方便的捕鼠器类比来理解编译的代码。

必须编译源代码才能运行程序,并且使用开源软件,源代码可供所有人使用。 无论您是自己编写代码并想要编译并运行它,还是下载某人的项目来尝试一下,了解编译器如何处理源代码以及编译器如何处理此代码都是有用的。

制作一个更好的捕鼠器

我们通常不会将捕鼠器称为笔记本电脑,但不管您相信与否,它确实与您正在使用的设备(手机或笔记本电脑)的 CPU 相似。 经典的捕鼠器(我不是说的)有两种状态:打开或释放。 您可以将打开视为设置陷阱以捕获老鼠,并将释放视为由老鼠触发陷阱。 从某种意义上说,捕鼠器就像一台带有键盘的笔记本电脑。 您可以想象这段代码用虚构的语言描述该过程:

if mousetrap == 0 then
  There's a mouse!
else
  There's no mouse yet.
end

也就是说,你可以根据捕鼠器的状态来检测是否有老鼠(数据)。 当然,捕鼠器也不是万无一失的,捕鼠器对面可能有一只老鼠,并且由于鼠标没有触发捕鼠器,所以它的状态仍然是打开的。 所以程序可以改进源码编译英文,这是非常典型的。

转变

一般来说,捕鼠器就是一个开关。 您可以使用家里的开关来打开灯。 从交换机中可以获得很多信息。 例如,人们会根据你的灯光状态知道你是否在家。

您可以根据邻居的灯光状态来改变行为。 如果邻居家的灯都灭了源码编译英文,那么请关掉安静的音乐,因为人们可能已经上床睡觉了。

CPU也使用这个逻辑,但是划分了几个数量级,缩小到微观层面。 当CPU在特定寄存器上接收到联通号码时,它可以触发其他一些寄存器,然后触发另一个寄存器,依此类推。 如果该寄存器具有特定含义,则可以进行通信。 也许会激活同一显卡上某处的芯片,或者使 LED 亮起,或者更改屏幕上像素的颜色。

种瓜得瓜,种豆得豆。 如果您确实想在多个位置而不是一个位置发现老鼠,但您只有一个捕鼠器,那么您应该开发一款应用程序。 使用网络摄像头和一些基本的图像识别软件,您可以构建一个空卧室的模型,然后扫描是否有变化。 当老鼠走进卧室时,没有老鼠的原始图像会发生像素变化。 记录下这些数据,如果有无人机可以追踪老鼠并捕获它们,那就更好了,这样就可以将它们赶出卧室。 此时,您可以通过打开和关闭信号的魔力来创建更好的捕鼠器。

翻译员

源码编译英文-关于编译代码您应该了解的内容

代码编译器将人类可读的代码转换为 CPU 可以理解的机器语言。 这是一个非常复杂的过程,因为CPU非常复杂(甚至比捕鼠器还要复杂),而且因为这个过程比严格“需要”的更加灵活。 并非所有编译器都是灵活的。 有些编译器只有一个目标,它们只会处理某种格式的代码文件,并且为此目的进行的处理简单明了。

幸运的是,现代通用编译器并不那么简单。 它们允许您用不同的语言编译代码,还允许您以不同的形式链接库文件,并生成在不同体系结构上运行的文件。 GNU编译器集合(GCC)的gcc编译器--help会输出50多行选项,LLVM clang编译器的--help会输出1000多行。 GCC 指南长度超过 100,000 字。

编译代码时有很多选项。

当然,大多数人不需要了解所有选项。 我没有读过 GCC 手册页,因为它们是针对 Objective-C、Fortran 和我没听说过的芯片架构的。 但我更关注其将代码编译为不同架构(64 位或 32 位)的能力,以及在其他行业落后的计算机上运行开源软件的能力。

编译生命周期

了解编译代码的不同阶段也很重要。 这是一个简单 C 程序的生命周期:

将带有宏定义的C源代码.c文件用cpp预处理为.i文件。 用宏定义扩展的C源代码.i文件将被gcc翻译成.s文件。 用汇编语言编写的文本文件 .s 文件被汇编成对象 .o 文件。 具有 CPU 指令的二进制目标代码以及其他目标文件和库 *.o 文件,位于与视频内存区域无关的偏移量,使用 ld 链接以生成可执行文件。 最终的二进制文件要么包含所有必需的对象,要么配置为加载动态链接库 *.so 文件。

您可以尝试这个简单的示例(可能需要对库路径进行一些调整):

$ cat > hello.c
 #include
 int main(void)
 { printf("hello worldn");
   return 0; }
   EOF
$ cpp hello.c > hello.i
$ gcc -S hello.i
$ as -o hello.o hello.s
$ ld -static -o hello 
  -L/usr/lib64/gcc/x86_64-slackware-linux/5.5.0/ 
  /usr/lib64/crt1.o /usr/lib64/crti.o hello.o 
  /usr/lib64/crtn.o  --start-group -lc -lgcc 
  -lgcc_eh --end-group
$ ./hello
hello world

可用知识

计算机长期以来一直功能强大且用户友好。 请不要走向这两个可能的极端:计算机不像捕鼠器和电灯开关那么简单,但它们也不是不可理解的。 您可以了解编译代码、如何针对不同架构进行链接和编译。 一旦了解了这一点,您就可以更好地调试代码。 您可以理解您下载的代码,甚至可以修复其中的一两个错误。 另外,理论上,您可以构建一个更好的捕鼠器,或者使用捕鼠器来构建 CPU。 由你决定。

通过:

作者:Alan Smithee 主题:lkxed 译者:Donkey-Hao 校对:wxy

本文由 LCTT 原创编译,Linux China Honor 首发

编译型和解释型语言

1. 编译语言

一种需要编译器将源代码编译为机器代码才能执行的语言。 一般需要经过两个步骤:编译和链接。 编译是将源代码编译为机器代码,链接是将机器代码和各个模块的依赖库串联起来生成可执行文件。

优点:编译器通常有一个预编译过程来优化代码。 由于编译只进行一次,运行时无需编译,因此编译型语言的程序执行效率较高。 它可以独立于语言环境运行。

缺点:编译后,如果需要更改,则需要重新编译整个模块。 编译时根据相应的运行环境生成机器码。 不同操作系统之间移植会出现问题,需要根据运行的操作系统环境编译不同的可执行文件。

代表语言:C、C++、Pascal、Object-C、以及最近流行的Apple语言swift

2. 口译语言

解释型语言的程序不需要编译,相对于编译型语言节省了一个过程。 解释型语言是在程序运行时逐行翻译的。

优点:平台兼容性好,可以在任何环境下运行,只要安装了类库(虚拟机)。 灵活,修改代码时可以直接更改代码,无需停机维护即可快速部署。

缺点:每次运行都要解释,性能不如编译型语言。

代表语言:JavaScript、Python、Erlang、PHP、Perl、Ruby

3. 混合语言

由于编译型和解释型都有各自的缺点,所以有人会想到将两种类型进行整合,取其精华,去其糟粕。 半编译语言出现了。 例如,C#和C#在编译时并不是直接编译成机器代码而是中间代码。 .NET平台提供了中间语言运行时来运行中间代码。 中间语言运行时类似于Java虚拟机。 .net编译成IL代码后,存放在dll中。 第一次运行时,JIT将其编译成机器码并缓存在显存中,下次直接执行(博友回复中强调了)。 就我个人而言,抛开所有偏见,我认为 C# 是地球上最好的编程语言。 可惜Google新政限制了C#的推广。

Java首先生成字节码,然后在Java虚拟机中解释执行。 严格来说,混合语言是解释性语言。 C# 更接近于编译语言。

动态和静态语言

1.动态语言

它是一种结构可以在运行时更改的语言:例如,可以引入新函数、对象甚至代码,可以删除现有函数或进行其他结构更改。 通俗地说,代码可以在运行时根据个别情况改变其结构。

主要动态语言:Object-C、C#、JavaScript、PHP、Python、Erlang。

2.静态语言

与动态语言相对应,运行时结构不可变的语言是静态语言。 如Java、C、C++。

3. 注意:

源码编译英文-关于编译代码您应该了解的内容

很多人认为解释型语言是动态语言。 这种观点是错误的! Java 是一种解释性语言,而不是一种动态语言。 Java 无法在运行时改变其结构。 反过来创建呢? 动态语言是解释性语言。 这也是错误的! Object-C 是一种编译语言,但它是一种动态语言。 得益于独特的运行时机制(准确地说,运行时不是句型而是运行时环境,这里不展开)OC代码可以在运行时插入和替换。

C#也是一种动态语言。 通过C#的反射机制,可以动态插入一段代码来执行。 这就是为什么我说 C# 是地球上最好的编程语言。

动态类型语言和静态类型语言

1. 动态类型语言

许多网上资料将动态类型语言与动态语言混淆,这根本就是误导。 动态类型语言和动态语言是两个完全不同的概念。 动态类型语言是指仅在运行时执行数据类型检测的语言。 它指的是数据类型源码编译英文,动态语言指的是在运行过程中改变结构,指的是代码结构。

动态类型语言的数据类型不是在编译阶段确定的,而是将类型绑定推迟到运行时阶段。

主要语言:Python、Ruby、Erlang、JavaScript、swift、PHP、Perl。

2. 静态类型语言

静态语言的数据类型是在编译时或执行前确定的,在编写代码时必须明确变量的数据类型。

主要语言:C、C++、C#、Java、Object-C。

3. 注意:

相当多的程序员,包括我之前,都认为解释型语言都是动态类型语言,编译型语言都是静态类型语言。 这也是错误的。 Swift 是一种编译语言,也是一种动态类型语言。 C# 和 Java 都是解释型静态类型语言。

强类型语言和弱类型语言

源码编译英文-关于编译代码您应该了解的内容

1.强类型语言:

在强类型语言中源码编译英文,一旦为变量分配了某种数据类型,如果不进行强制转换,它将始终是该数据​​类型。 您不能将整型变量视为字符串。

主要语言:Java、C#、Python、Object-C、Ruby

2.弱类型语言:

可以忽略数据类型,并且可以为变量分配不同数据类型的值。 一旦将字符串值赋给整型变量a,那么a就变成了字符类型。

主要语言:JavaScript、PHP、C、C++(C和C++存在争议,但确实可以将整数值赋给字符变量,这可能是为了成为强类型,在中接近于弱类型形式)

3. 注意:

一种语言是否是强类型语言与它是否是动态类型语言没有必然的关系。 Python 是一种动态类型语言,也是一种强类型语言。 JavaScript 是一种动态类型语言,也是一种弱类型语言。 Java是一种静态类型语言,一种强类型语言。

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

悟空资源网 源码编译 源码编译英文-关于编译代码您应该了解的内容 https://www.wkzy.net/game/137636.html

常见问题

相关文章

官方客服团队

为您解决烦忧 - 24小时在线 专业服务