gpt4 book ai didi

compiler-construction - 编程语言的标准库是如何实现的?

转载 作者:行者123 更新时间:2023-12-03 15:00:11 24 4
gpt4 key购买 nike

我在理解 C 以外的编程语言的标准库是如何编写的有问题。

据我所知,C 标准库可以在 C 和汇编程序的混合中实现,其中需要汇编程序以便可以调用系统调用,从而
fopen, fscanf ... 可以使用。

其他编程语言如何使用它们的标准库来完成这个功能(使用 i/o、文件、所有其他需要系统调用的东西)?它们是否都允许像 C 这样的汇编器内联,还是有其他方法?

我已经读过可以使用 C 及其标准库来实现其他语言库,但我不确定这是如何完成的。

编辑1. 试图更具体。
(实现标准库的语言被称为 new_lang 。)

如果有人可以详细说明如何在对象代码级别和实现级别完成第二种方法(使用 C 运行时),因为我无法理解的是:

  • C 运行时是使用 C 语法还是 new_lang 语法调用的?我们如何从 new_lang 库中的某个地方调用 ssize_t write(int fd, const void *buf, size_t count) ?
  • 如果 new_lang 没有指针作为数据类型会发生什么,第二个参数如何, const void *buf 写从new_lang 传递? new_lang怎么跟的 C 运行时 API 如果它没有 C 数据类型?
  • 如果 new_lang 库中的某个函数调用 C 运行时,是否意味着它必须遵守其 阿比 ?对于给定的平台,整数、char 类型的数据大小必须在 new_lang 和 C 中匹配(以及由 abi 指定的其他内容,参数是通过堆栈还是寄存器等传递)?这不是有点过度限制,例如,如果 new_lang 需要为 char 保留更多字节怎么办?

  • 我试图尽可能笼统,但我不知道如何在不详细说明的情况下解释这个问题。

    最佳答案

    这取决于语言,甚至可以是多项选择。请注意,用 C 实现的标准库/运行时通常使用编译器特定的扩展和属性,因此不是用标准的非扩展 C 编写的。

    对于像 Pascal 这样的语言,有多种方法是可能的并且确实存在。 Pascal 是一种与 C(和/或 C++,因为大多数幸存下来的语言也是面向对象的)处于同一级别的语言,例如FreePascal它在 Pascal 和汇编程序中有其运行时库,并且可以在 Linux 上运行,而无需链接到任何 C 编译代码。

    使用 C 的原因通常是更多的管理(工具和程序员的可用性)而不是技术

    同时Gnu Pascal基本上是一个 gcc mod,并建立在 libgcc、glibc 等之上。

    回复 编辑1 :

  • Afaik 对您正在使用的确切目标非常内部。有一些 write() 可以从系统编译器调用,但这可能是一个包装系统调用的运行时 (3) 函数,而不是直接 (2) 系统调用。 Afaik 可以保证 (3) 函数是真正的函数而不是宏,但我对此并不完全确定。

  • 在 BSD 上,系统调用与函数调用相当,在 Linux/i386 上则不然。语法无关紧要,生成的代码必须是等价的(不一样,但接近)。语法本身并不重要,重要的是 C 编译器如何解释语法。通常唯一能保证工作的东西(就经典的 POSIX 哲学而言)是系统 C 编译器,它是唯一保证能够解释系统头文件的编译器,因为它们通常包含非标准扩展或修饰符。其他任何东西都必须确保它匹配,可能是基于每个目标。因此,大多数语言都建立在 C 运行时之上,并且通常在它们自己的运行时中拥有 C 部分。
  • 您必须以某种方式使它们在每个目标的基础上与每个目标的 C 编译器匹配,或者通过自动适应(您的整个系统基于 C 和 C 编译器并且类型等效性在某种程度上自动传播),或者通过痛苦的目标 -目标是制作一些等价物,或将每个函数包装在 C 或汇编代码中。有时每个目标多次(例如 MS VC 和 mingw,尽管最近这些比 10-15 年前更兼容,当时 gcc 不兼容,例如 COM 兼容)

  • 例如。 Free Pascal 有一个 cdecl;修饰符标记 C 可调用函数,然后编译器生成与该目标上的系统 C 编译器等效的调用代码。

    这听起来很糟糕,但通常只有几个变体。但这仍然不容易,例如x86_64 API 在 Linux/FreeBSD 一侧(sysv)、Windows(win64 自己的约定)和 OS X(aix 约定)之间略有不同。可以通过尽可能多地用 C 实现整个系统来避免它,但是你会永远被它(和一个混合语言系统)困住。此外,Cisms 和 Unixisms 以这种方式渗透到您的新语言中,因为它更容易。

    *nix 上的许多语言都采用这种方式,因为可以更轻松地将快速初始移植到新事物上。但反过来,您可以维护一个混合语言系统。通常还继承了许多与构建相关的 C 特性,如外部预处理器、标题被包含为文本并一遍又一遍地重新解释,以及基于 make 的构建系统。

    有关可能问题的列表,请参阅 How to design a C / C++ library to be usable in many client languages?
  • 是的,但只有它的二进制部分,因为 C 编译器当然不能进行严格的类型检查。但是大小、字段偏移(打包)、调用顺序、寄存器使用以及诸如是否在寄存器中传递小结构之类的东西必须匹配。
  • 关于compiler-construction - 编程语言的标准库是如何实现的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36378244/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com