源码运行方式
Lab 6
解释执行
Interpreting
源代码逐行被解释器 (interpreter) 转化为机器代码,并立即执行。每次运行程序时,都需要进行解释。常见的解释型语言有 Python 和 Ruby。
编译执行
Compiling
源代码在编译器 (compiler) 中进行一次性的编译,并将其转化为机器代码的形式,之后可以多次执行该可执行文件。常见的编译型语言有 C、C++。
即时编译
Just-in-time Compilation
源代码在运行时被即时编译器 (JIT Compiler) 分成若干个代码块,每次运行时只编译当前需要执行的代码块,将其转化为机器代码并执行。常见的即时编译语言有 JavaScript 和 C#。
虚拟机
Virtual Machines
一种软件实体,它模拟了一个完整的计算机系统,并提供了一个独立于底层硬件的运行环境。将源代码转化为一种中间代码,然后通过不同运行方式将中间代码转化为机器代码执行。在这种环境中运行的代码称为托管代码 (Managed Code)。
常见的虚拟机包括 Java 虚拟机 (JVM) 和 .NET 运行时环境 (Common Language Runtime)。
- .NET 是一个由微软开发,用于构建和运行在 Windows 操作系统上的应用程序。 它提供了一个统一的编程模型,使开发人员能够在不同的编程语言中创建各种类型的应用程序,包括桌面应用程序、Web应用程序、服务器应用程序和移动应用程序。
- CIL(Common Intermediate Language)是一种中间语言,它是在 .NET 中使用的一种虚拟机指令集,也被称为 MSIL(Microsoft Intermediate Language)或 IL。
Java 是一种混合了编译执行和即时编译的语言。
Java 源代码首先通过Java编译器(javac)将其编译为字节码(.class 文件)。
字节码是一种中间形式,它不是直接可执行的机器码,而是在Java虚拟机(JVM)上执行的指令集。在 Java 的执行过程中,字节码可以通过两种方式来执行:
- 解释执行:初始阶段,字节码会被解释器逐行解释并执行。解释器会将字节码转换为机器码,并逐条执行指令。
- 即时编译:在解释执行过程中,如果某部分代码被频繁执行(热点代码),JVM会将这部分字节码进行即时编译。即时编译器将热点代码编译为本地机器码,生成优化后的本地代码,然后直接执行本地代码。这样可以提高热点代码的执行效率。
位操作
Lab 8
Some trick 🎃
OR
- 执行 OR 操作后,如果结果为 0,则表示所有位都为 0 ,即这个数是 0。
- OR 可以将一个二进制数的第 n 位设置为 1,而不影响其他位
number |= (1 << n)
例如:将一个 16 位数全部设为 1,则
x |= 255
AND
- AND 可以将某些特定位设置为 0,而不影响其他位
number &= ~(1 << n)
- 常见用途是提取一个二进制数的特定位或一组位。
例如,要提取一个二进制数的第 n 位,可以使用
bit = (number >> n) & 1
XOR
- XOR 可以用来交换两个变量的值,而无需引入额外的变量
例如,要交换变量 a 和 b 的值
a ^= b; b ^= a; a ^= b
- 用来判断两个二进制数的奇偶性。
如果一个二进制数中 1 的个数为奇数,则 XOR 结果为 1;
如果 1 的个数为偶数,则 XOR 结果为 0。
例题 💩
检测一个整数是否是2的幂
浮点数
一个数如果是 2 的幂,则它的二进制可以表示为一个 1 后面跟若干个 0。
- 计算机科学中,Popcount (Population Count) 指二进制数中 1 的个数。 它也被称为 “Hamming Weight”、“Bit Count” 或 “Population Size”。