我有理解如何编写除C之外的编程语言的标准库。
据我所知,C标准库可以在C和汇编程序的混合中实现,其中需要汇编程序,因此可以调用系统调用,从而 fopen,fscanf ...可以使用。
其他编程语言如何通过标准库实现此功能(使用i / o,文件,需要系统调用的所有其他内容)?他们都允许像C那样内联汇编程序还是有其他方法?
我已经读过可以使用C及其标准库来实现其他语言库,但我不确定如何完成。
edit1。尝试更具体。
(实现标准库的语言称为 new_lang 。)
如果有人能够详细说明在目标代码级别和实现级别上如何完成第二种方法(使用C运行时),因为我无法理解的事情是:
我尽量做到尽可能一般,但我不知道如何解释这个问题而不需要详细说明。
答案 0 :(得分:0)
这取决于语言,它甚至可以是多种选择。请注意,在C中实现的标准库/运行时通常使用编译器特定的扩展和属性,因此不是标准的未扩展的C.
对于Pascal语言,可能存在多种方法。 Pascal是与C(和/或C ++)处于同一级别的语言,因为大多数幸存的语言也是面向对象的,例如, FreePascal在Pascal和汇编程序中有运行时库,可以在Linux上运行而无需链接到任何C编译代码。
采用C的原因通常是管理(工具和程序员的可用性)而不是技术
虽然同时Gnu Pascal基本上是一个gcc mod,并且建立在libgcc,glibc等上。
回答 edit1 :
在BSD上,系统调用与函数调用相当,在Linux / i386上没有。语法并不重要,生成的代码必须是等价的(不相同,但接近)。语法本身并不重要,它是C编译器解释语法的方式。并且通常唯一能保证工作的东西(就经典POSIX哲学而言)是系统 C编译器,它是唯一一个能够保证能够解释系统头文件的编译器,因为它们通常包含非标准扩展或修饰符。其他任何东西都必须确保它匹配,可能是基于每个目标。因此,大多数语言都建立在C运行时之上,并且通常具有自己运行时的C部分。
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?