如何实现编程语言的标准库?

时间:2016-04-02 20:16:52

标签: compiler-construction linker language-agnostic object-files

我有理解如何编写除C之外的编程语言的标准库。

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

其他编程语言如何通过标准库实现此功能(使用i / o,文件,需要系统调用的所有其他内容)?他们都允许像C那样内联汇编程序还是有其他方法?

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

edit1。尝试更具体。
(实现标准库的语言称为 new_lang 。)

如果有人能够详细说明在目标代码级别和实现级别上如何完成第二种方法(使用C运行时),因为我无法理解的事情是:

  1. 是使用C语法还是new_lang语法调用C运行时?我们如何从new_lang库中的某个地方调用ssize_t write(int fd,const void * buf,size_t count)?
  2. 如果new_lang没有指针作为数据类型会发生什么,如何从new_lang传递写入的第二个参数 const void * buf ?如果new_lang没有C数据类型,那么new_lang如何跟随 C运行时api
  3. 如果new_lang库中的某些函数调用C运行时,是否意味着它必须服从 abi ?对于给定平台,整数类型char的数据大小必须在new_lang和C中匹配(以及由abi指定的其他内容,是由堆栈或寄存器传递的参数等)?
    这个有点过度限制,例如,如果new_lang需要为char保留更多的字节呢?
  4. 我尽量做到尽可能一般,但我不知道如何解释这个问题而不需要详细说明。

1 个答案:

答案 0 :(得分:0)

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

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

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

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

回答 edit1

  1. Afaik是您正在使用的确切目标的内部。从系统编译器可以调用write(),但这可能是一个包含系统调用的运行时(3)函数,而不是直接包装(2)系统调用。 Afaik保证(3)功能真的是功能而不是宏,但我并不完全确定。
  2. 在BSD上,系统调用与函数调用相当,在Linux / i386上没有。语法并不重要,生成的代码必须是等价的(不相同,但接近)。语法本身并不重要,它是C编译器解释语法的方式。并且通常唯一能保证工作的东西(就经典POSIX哲学而言)是系统 C编译器,它是唯一一个能够保证能够解释系统头文件的编译器,因为它们通常包含非标准扩展或修饰符。其他任何东西都必须确保它匹配,可能是基于每个目标。因此,大多数语言都建立在C运行时之上,并且通常具有自己运行时的C部分。

    1. 你必须以某种方式使它们在每个目标的基础上与每个目标的C编译器匹配,或者通过自动适应(你的整个系统基于C和C编译器并且类型等效地在某种程度上自动传播),通过痛苦的目标-by-target制作一些等价,或用C或汇编代码包装每个函数。有时每个目标多次(例如MS VC和mingw,尽管最近这些更兼容,然后说10-15年前,当gcc不是,例如COM兼容)
    2. E.g。免费Pascal有一个cdecl;用于标记C可调用函数的修饰符,然后编译器生成与该目标上的系统C编译器等效的调用代码。

      这听起来不错,但通常只有一些变种。但这仍然不容易,例如x86_64 API在Linux / FreeBSD一面(sysv),Windows(win64自己的约定)和OS X(aix约定)之间略有不同。可以通过在C中尽可能多地实现整个系统来避免它,但是你会永远坚持它(和混合语言系统)。此外,Cisms和Unixism会逐渐渗透到您的新语言中,因为它更容易。

      * nix上的许多语言都是这样的,因为更容易将快速初始端口转换为新的东西。但反过来你可以维持一个混合语言系统。通常还会继承许多与构建相关的C特征,如外部预处理器,标头包含在文本中并反复重新解释,以及基于make的构建系统。

      有关可能出现问题的列表,请参阅How to design a C / C++ library to be usable in many client languages?

      1. 是的,但只是它的二进制部分,因为C编译器当然不能进行严格的类型检查。但是大小,字段偏移(打包),调用顺序,寄存器使用以及诸如小型结构是否在寄存器中传递之类的东西必须匹配。