因为操作系统对外的接口都是 c 语言的, 所以开发一门编程语言,内部必然要调用 c 库是吗?

2020-12-22 16:31:10 +08:00
 find456789

我研究这些知识的目的是想开发一个自己的编程语言


经过我的了解,几乎热门的操作系统,大部分都是 c 开发的, 都提供了 c 库,如 glibc

各个操作系统也都遵守了 [标准 c 库] ,都实现了对应接口的代码, 所以,标准 c 库上的函数, 比如 printf ,在不同操作系统上,都是打印功能, 跨平台兼容性很棒

比如 我想让操作系统打印文字到终端, 最好的方案,就是让我的编程语言 bb lang 直接复用标准 c 库里的函数

比如,在 llvm ir 里, 调用 c 里的 printf 来实现打印功能


假如 我的编程语言 bb lang, 底层 不调用 操作系统标准的 c 库, 就成了无米之炊,空中楼阁了, 对吗

不过我发现似乎也可以通过汇编 /llvm ir 直接进行 system calls,但似乎这实现起来很困难

大家有啥指点的吗

谢谢

1574 次点击
所在节点    问与答
20 条回复
fiveelementgid
2020-12-22 16:33:23 +08:00
底层都是 C(bushi)
建议看看一个技术叫 自举
nnnToTnnn
2020-12-22 16:33:42 +08:00
那么开发 c 语言的时候是必须要用 c 语言吗?
nnnToTnnn
2020-12-22 16:34:21 +08:00
@fiveelementgid 准确来说底层并不是 C 而是二进制的机器码
wutiantong
2020-12-22 16:56:30 +08:00
你又来了,都多少个帖子啦,感觉你一直所在意的点根本不匹配你的目标(创造编程语言)
CismonX
2020-12-22 17:04:53 +08:00
系统调用其实和 C 没啥必然关系的

拿 Linux 为例,那些可以直接在 C 中调用的系统调用,比如 read(),实际上是 libc 给你封装了一层。实际上系统调用的过程,是先保存现场,然后把系统调用的各个参数放到各个寄存器中,然后执行系统调用指令(不同 ISA 指令不一样,比如 x86 里是 syscall,arm64 是 svc #0 )

如果你在你自己的语言中实现系统调用,建议不要依赖 libc,而是直接从底层实现
QBugHunter
2020-12-22 17:10:08 +08:00
为什么我记得 windows 的接口大多都是 C++的?
find456789
2020-12-22 17:14:10 +08:00
@wutiantong

谢谢 我猜测可能是我基础差,所以会走很多弯路
TypeError
2020-12-22 17:16:29 +08:00
我记得 go 有部分 systemcall 就是直接调用汇编实现的
wellsc
2020-12-22 17:17:44 +08:00
买本现代操作系统看一下吧老哥
yzbythesea
2020-12-22 17:29:28 +08:00
汇编

建议你先照着教程做一个 C 的轮子。
cmostuor
2020-12-22 17:30:06 +08:00
@CismonX
@TypeError
@wellsc
没错 正好不用我写了
misaka19000
2020-12-22 17:33:47 +08:00
不用,操作系统都是通过 system call 来实现交互的

只要你的语言封装了系统调用的逻辑就可以了
ysc3839
2020-12-22 17:37:11 +08:00
@QBugHunter Windows 有 C API,也有 COM API 。一般来说用 C++ 调用 COM 比较多,不过用 C 也是可以的。
ysc3839
2020-12-22 17:39:41 +08:00
@QBugHunter macOS 的接口大部分是 Objective-C 。不像 Windows COM API 那样用 C 语言也可以直接通过函数指针调用,macOS 下要调用这些接口绕不开 objc 的消息传递模型。
wutiantong
2020-12-22 17:41:31 +08:00
@find456789 首先你要区分语言和标准库
sadfQED2
2020-12-22 19:00:06 +08:00
我支持你自己造一门编程语言,但是,你造之前不应该研究研究编译原理,操作系统,计算机组成原理这些基础吗
systemcall
2020-12-22 21:08:05 +08:00
不是
现代的操作系统一般是系统调用( syscall ),也有写寄存器的(嵌入式这类),还有用中断的( DOS )
felixcode
2020-12-22 21:10:17 +08:00
带着问题去看书吧,一言两语能说清楚的话,还要书干嘛
felixcode
2020-12-22 21:11:01 +08:00
一言两语->三言两语
msg7086
2020-12-22 21:34:56 +08:00
有 calling convention,不需要用 C 。
所有的东西到 CPU 上执行的时候都是机器代码。只要这机器代码是对的,随便你用什么语言写。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/737927

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX