V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
find456789
V2EX  ›  问与答

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

  •  1
     
  •   find456789 · 2020-12-22 16:31:10 +08:00 · 1575 次点击
    这是一个创建于 1432 天前的主题,其中的信息可能已经有所发展或是发生改变。

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


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

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

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

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


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

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

    大家有啥指点的吗

    谢谢

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

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

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

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

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

    只要你的语言封装了系统调用的逻辑就可以了
    ysc3839
        13
    ysc3839  
       2020-12-22 17:37:11 +08:00 via Android
    @QBugHunter Windows 有 C API,也有 COM API 。一般来说用 C++ 调用 COM 比较多,不过用 C 也是可以的。
    ysc3839
        14
    ysc3839  
       2020-12-22 17:39:41 +08:00 via Android
    @QBugHunter macOS 的接口大部分是 Objective-C 。不像 Windows COM API 那样用 C 语言也可以直接通过函数指针调用,macOS 下要调用这些接口绕不开 objc 的消息传递模型。
    wutiantong
        15
    wutiantong  
       2020-12-22 17:41:31 +08:00
    @find456789 首先你要区分语言和标准库
    sadfQED2
        16
    sadfQED2  
       2020-12-22 19:00:06 +08:00 via Android
    我支持你自己造一门编程语言,但是,你造之前不应该研究研究编译原理,操作系统,计算机组成原理这些基础吗
    systemcall
        17
    systemcall  
       2020-12-22 21:08:05 +08:00
    不是
    现代的操作系统一般是系统调用( syscall ),也有写寄存器的(嵌入式这类),还有用中断的( DOS )
    felixcode
        18
    felixcode  
       2020-12-22 21:10:17 +08:00
    带着问题去看书吧,一言两语能说清楚的话,还要书干嘛
    felixcode
        19
    felixcode  
       2020-12-22 21:11:01 +08:00
    一言两语->三言两语
    msg7086
        20
    msg7086  
       2020-12-22 21:34:56 +08:00
    有 calling convention,不需要用 C 。
    所有的东西到 CPU 上执行的时候都是机器代码。只要这机器代码是对的,随便你用什么语言写。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   950 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 20:55 · PVG 04:55 · LAX 12:55 · JFK 15:55
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.