![]() |
1
1
这取决于语言,甚至可以是多选。请注意,用C实现的标准库/运行时通常使用编译器特定的扩展和属性,因此不是用标准的未扩展C编写的。 对于像Pascal这样的语言,多种方法是可能的,而且确实存在。Pascal是与C(和/或C++,因为大多数现存的语言也是面向对象的)相同级别的语言。 FreePascal 在Pascal和汇编程序中有其运行时库,并且可以在Linux上运行而无需链接到任何C编译代码。 选择C的原因通常是更多的管理(工具和程序员的可用性),而不是技术 同时 Gnu Pascal 基本上是一个gcc mod,构建在libgcc、glibc等之上。 答复 编辑1 :
在BSD上,系统调用相当于函数调用,而在Linux/i386上则不然。语法不重要,生成的代码必须是等价的(不相同,但相近)。语法本身并不重要,而是C编译器如何解释语法。通常情况下(就经典POSIX哲学而言)唯一能保证工作的是 系统 C编译器,这是唯一保证能够解释系统头的编译器,因为它们通常包含非标准扩展或修饰符。任何其他事情都必须确保匹配,可能是基于每个目标。因此,大多数语言都是在C运行时之上构建的,并且通常有自己运行时的C部分。
E、 g.自由Pascal具有cdecl;修饰符标记C可调用函数,然后编译器在该目标上生成与系统C编译器等效的调用代码。 这听起来很糟糕,但通常只有几个变体。但这仍然不容易,例如,x86_64 API在Linux/FreeBSD单面(sysv)、Windows(win64-own约定)和OSX(aix约定)之间略有不同。你可以通过用C语言尽可能多地实现整个系统来避免这种情况,但这样你就永远无法摆脱它(以及一个混合语言系统)。此外,通过这种方式,Cisms和Unixisms会渗透到你的新语言中,因为它更容易。 *nix上的许多语言都是这样的,因为快速创建新的初始端口更容易。但反过来,你需要维护一个混合语言系统。通常也会继承许多与构建相关的C特性,比如外部预处理器、标题作为文本包含并反复解释,以及基于make的构建系统。 有关可能问题的列表,请参阅 How to design a C / C++ library to be usable in many client languages?
|
![]() |
John V · 是否存在单元测试无法发现的逻辑/流错误类型? 7 年前 |
![]() |
Beefster · 为什么ANSI颜色转义以“m”而不是“]”结尾? 7 年前 |
![]() |
Guillermo Gutiérrez · STR转换是如何工作的? 7 年前 |
![]() |
RudziankoÅ · 合并排序数组算法 7 年前 |
|
user8852560 · 构造函数中的验证和构造函数冲突 7 年前 |
![]() |
jav974 · 订购产品时寻找最佳价格组合的算法 7 年前 |
![]() |
hippietrail · 确定浮点数中前导零的数量 7 年前 |