讲师中心 微信公众号
AI工具推荐 视频效率加速

了解运行时:从 C 语言到现代语言

浅墨同学_6101

浅墨同学_6101

发布时间:2024-10-06 15:01:53

|

505人浏览过

|

来源于dev.to

转载

了解运行时:从 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
}


这看起来根本不像运行时,它只是编译器添加的一些汇编语言代码,因此开发人员不必这样做。

Forge — Python Developer
Forge — Python Developer

Python开发助手 — 自动化脚本、API封装、命令行工具、数据管道、网页爬虫。经过测试的代码,包含错误处理和文档。当你需要...

下载

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 并且它在这方面非常棒。为什么要重新发明轮子,让我们用轮子创造一辆神奇的汽车,除非你不想在火星上驾驶它。

热门AI工具

更多
UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

6139

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

3005

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

3848

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

2685

2025.08.29

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

5607

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2428

2023.08.10

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

5607

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2428

2023.08.10

Linux 新手先学哪些命令
Linux 新手先学哪些命令

Linux新手命令专题汇集终端基础、文件目录操作、文本查看、软件安装和权限管理等入门文章,帮助按实际任务练习常用命令并建立命令行操作习惯。

0

2026.10.15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习

Buffalo框架快速入门指南
Buffalo框架快速入门指南

共0课时 | 0人学习

Valgrind支持平台说明
Valgrind支持平台说明

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn