了解运行时:从 C 语言到现代语言
来源:dev.to
时间:2024-10-06 19:51:58 498浏览 收藏
哈喽!今天心血来潮给大家带来了《了解运行时:从 C 语言到现代语言》,想必大家应该对文章都不陌生吧,那么阅读本文就都不会很困难,以下内容主要涉及到,若是你正在学习文章,千万别错过这篇文章~希望能帮助到你!
在现代软件开发和编程时代,术语“运行时”可能有不同的含义,具体取决于上下文和所讨论的语言。我在这里澄清这些差异,重点关注与 java 或 python 等更现代的语言相比,c 语言的运行时如何工作。我打算让这篇文章主要针对初学者程序员,因此我将避免深入研究复杂的概念。
什么是运行时?
运行时的核心是一个程序本身,它读取并执行开发人员编写的代码。但当一些开发人员使用 c 语言运行时时,就会感到困惑。
现代语言运行时
在java或python等语言中,运行时本身就是一个读取myfile.js文件的程序,这就是为什么你运行nodejs程序,例如:node myfile.js和v8引擎(是javascript引擎,它解析并执行javascript代码。)管理它的一切,无论你创建一个新文件,启动一个子进程等等,最重要的是你不能做任何 v8 不允许你做的事情。
但是当你运行一个c程序时,你不需要执行c myfile.c,你只需要编译一次,现在你不再需要gcc了,直接运行它即可。
c“运行时”
在 c 中,没有像 java 或 python 那样与代码一起运行的单独程序。相反,通常所说的c“运行时”实际上是一组在编译期间添加的静态插入的代码和指令。它是最终二进制文件中包含的最小指令集,用于处理 cpu/操作系统级别的某些必要任务。它处理函数调用的堆栈帧创建和拆卸(在汇编中使用 push、pop、call、ret 等指令)。即使这一点也可以通过使用内联汇编提供您自己的 __start 函数来覆盖,从而使开发人员能够完全控制程序的入口点和初始化。
void __start() { // custom entry point, no standard library initialization // you have no access to argc and argv here unless you access them manually from registers // you can create you own custom stack setup, initialization and etc here. // exit directly using a syscall asm("mov $60, %rax; mov $0, %rdi; syscall"); // exit(0) syscall }
这看起来根本不像运行时,它只是编译器添加的一些汇编语言代码,因此开发人员不必这样做。
c的权力与责任
在 c 语言中,您可以使用内联汇编直接调用系统调用,以操作系统通常不允许的方式与内核交互,这就是恶意软件的创建方式。内联汇编允许开发人员在 c 代码中编写汇编语言指令。这通常用于性能关键的代码或访问特定的硬件功能。
c 中的内联汇编
- 内联汇编允许开发人员在 c 代码中编写汇编语言指令。这通常用于性能关键的代码或访问特定的硬件功能。
- 它提供了一种直接执行cpu指令的方式。
与内核直接交互
- 使用内联汇编,程序员可以直接调用系统调用,而无需通过更高级别的库。
- 例如,我们可以使用内联汇编为系统调用设置适当的参数寄存器,然后触发它。
- 由于内联汇编允许对系统资源进行低级控制,因此它可以用来绕过安全机制或直接操纵内核。这就是恶意软件执行未经授权的操作的方式,例如访问受保护的内存、拦截系统调用或操纵进程及其内存。
- 恶意软件可以利用操作系统中的漏洞或使用这些低级交互来执行键盘记录、权限升级或秘密操作等任务。
在linux c中有一个flag,允许您直接将文件数据写入存储设备,绕过一些内核的缓存机制,称为o_direct标志,它与open和write系统调用结合使用。该标志确保数据不会在 ram 中缓冲或由内核在内核空间中管理,这会直接将数据写入硬盘,jvm 不允许您这样做,这只是一个简单的示例。
这是一个简单的例子:
asm volatile ( "syscall" : "=a" (written) : "0" (1), "D" (fd), "S" (buffer), "d" (BLOCK_SIZE) : "rcx", "r11", "memory" );
*注意:* (writing) 是在 main() 内部创建的变量,(1) 是 write 的系统调用号,(fd) 是文件将被写入的位置,即 int fs = open("path .log",o_wronly; (block_size) 是另一个变量名。它比那更复杂。
运行时的演变
重要的是要了解运行时的概念多年来一直在发展。 70 年代的 c“运行时”与我们在 2000 年代的语言中看到的健壮的运行时环境有很大不同。在讨论运行时时,这种演变可能会导致混乱,尤其是在熟悉不同编程时代的开发人员之间。
结论
我认为人们现在正在将 1970 年代的运行时与 2000 年代的运行时进行比较,这让新开发人员与老开发人员感到困惑。
解决特定问题是任何编程语言的主要任务,你不想用 c 编写一个完整的框架来创建 api,我们有 nodejs,它很擅长,你不需要用 javascript 编写裸机代码,因为我们已经有了 c 并且它在这方面非常棒。为什么要重新发明轮子,让我们用轮子创造一辆神奇的汽车,除非你不想在火星上驾驶它。
本篇关于《了解运行时:从 C 语言到现代语言》的介绍就到此结束啦,但是学无止境,想要了解学习更多关于文章的相关知识,请关注golang学习网公众号!
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
329 收藏
-
367 收藏
-
107 收藏
-
261 收藏
-
467 收藏
-
250 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 542次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 507次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 497次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 484次学习