Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 什么';马克';一种语言是否存在于我们需要语言绑定的库中?_C_Linux_Opengl_Binding - Fatal编程技术网

C 什么';马克';一种语言是否存在于我们需要语言绑定的库中?

C 什么';马克';一种语言是否存在于我们需要语言绑定的库中?,c,linux,opengl,binding,C,Linux,Opengl,Binding,一种语言在编译库上留下了什么标记,如果我们从另一种语言调用它的函数,我们需要语言绑定 目标代码在我看来是“无语言的” 在Linux环境中学习c语言中的OpenGL时,我使用了跨语言绑定 绑定为应用程序提供了一种简单而一致的方式来呈现数据并与数据交互 来源:你问题下面的标签 绑定为应用程序提供了一种简单而一致的方式来呈现数据并与数据交互 来源:在你的问题下面的标签 嗯,你所要做的就是考虑C和C++中无数的调用约定。为了防止严重的错误,编译器会根据调用约定对函数名进行修改,这样您就不会意外地使用fa

一种语言在编译库上留下了什么标记,如果我们从另一种语言调用它的函数,我们需要语言绑定

目标代码在我看来是“无语言的”

在Linux环境中学习c语言中的OpenGL时,我使用了跨语言绑定

绑定为应用程序提供了一种简单而一致的方式来呈现数据并与数据交互

来源:你问题下面的标签

绑定为应用程序提供了一种简单而一致的方式来呈现数据并与数据交互


来源:在你的问题下面的标签

嗯,你所要做的就是考虑C和C++中无数的调用约定。为了防止严重的错误,编译器会根据调用约定对函数名进行修改,这样您就不会意外地使用
fastcall
约定调用
stdcall
函数。每种语言都有自己的一组多余的细节,像这样,独立于语言的API永远不应该为自己带来负担。语言绑定充当适配器/桥接器,将特定于语言的内容与标准化API分开,在必要时填补空白


OpenGL API通常用一种语言(C)实现,用其他语言编写的程序通过语言绑定与系统实现接口。OpenGL为GLSL使用以null结尾的ASCII字符串,并且有许多使用指针的函数,这些函数对于设计为用C实现的API来说非常有意义。在Java中,字符串不是以null结尾的,而是UTF-16编码的;你可以看到为什么需要一座桥。java gl绑定负责字符串转换,并更改<代码> GLVTEXTROPE(…)>代码> -类似于java的“指向”连续块内存的条件。

< P>,您只需要考虑C++和C++中无数的调用约定。为了防止严重的错误,编译器会根据调用约定对函数名进行修改,这样您就不会意外地使用
fastcall
约定调用
stdcall
函数。每种语言都有自己的一组多余的细节,像这样,独立于语言的API永远不应该为自己带来负担。语言绑定充当适配器/桥接器,将特定于语言的内容与标准化API分开,在必要时填补空白


OpenGL API通常用一种语言(C)实现,用其他语言编写的程序通过语言绑定与系统实现接口。OpenGL为GLSL使用以null结尾的ASCII字符串,并且有许多使用指针的函数,这些函数对于设计为用C实现的API来说非常有意义。在Java中,字符串不是以null结尾的,而是UTF-16编码的;你可以看到为什么需要一座桥。Java GL绑定负责字符串转换和更改类函数,以适应Java“指向”连续内存块的条件。

我猜您可能还年轻,或者已经十多年没有编程了

目标代码看起来应该是无语言的,但这不是因为历史。早在20世纪70年代和80年代,在Intel 80x86和Motorola 680x0 CPU上,函数调用参数在堆栈上传递。在“Pascal”约定中,参数的数量是固定的,被调用的函数代码在返回之前将其从堆栈中删除。在“C”约定中,参数的数量是可变的(例如printf),因此调用代码必须在函数返回时删除它们。每个函数调用需要额外2个字节,这在今天算不上什么,但在当时的PC只有128K左右的RAM时意义重大。因此,Microsoft选择对Windows API使用Pascal调用约定,即使它是用C编写的。如果您的目标代码错误地使用C约定调用了Windows函数,则kaboom。这就是为什么头文件仍然充斥着WINAPI、stdcall和fastcall等等

从20世纪90年代开始,操作系统的作者们意识到这是愚蠢的,并开始对每个人强加标准的调用约定。C公约可以处理这两种情况,因此它被广泛使用。移动到MacOS X、64位Windows和ARM;我们终于得到了无语言的目标代码

现在,OpenGL被设计成使用C和Fortran。(在20世纪90年代,它仍然是科学计算和可视化的重要语言。)这两种语言都有整数、浮点数和各种大小的整数/浮点数组。C有结构,但Fortran没有,我怀疑这是OpenGL API从不使用任何结构的主要原因。C和Fortran在2D或更高维数组的内存布局上也存在差异,请再次注意,OpenGL API从未指定2D数组,仅指定1D

C API适用于大多数语言。这在一定程度上是因为C是“可移植的汇编程序”,几乎可以在任何CPU和操作系统上运行。这也是因为大多数其他常用的编程语言要么是C(C++,Objective-C)的超集,要么是用C本身实现的(Python,Perl,Ruby),因此可以很容易地调用OpenGL C API

Java和C#有更多的问题,因为可以说,它们定义了自己的目标代码,并且内存访问受到更严格的控制。C/OpenGL的“这里是一个指向内存块的指针,可以随意使用它”的概念打破了JVM/CLR的安全模型。因此,您最终不得不使用JavaNiobyteBuffer,而不仅仅是传递数组

这在很大程度上还取决于语言绑定设计师的技能。例如,Mike Fletcher的Python OpenGL是一个非常好的绑定。所有的函数和常量都有完全相同的名称,所以很多