繁体   English   中英

编程语言如何调用用另一种语言编写的代码?

[英]How do programming languages call code written in another language?

对不起,如果这太模糊了。 我最近阅读了有关python的list.sort()方法的内容,并且因为性能原因读到它是用C语言编写的。

我假设python代码只是将列表传递给C代码并且C代码传回一个列表,但是python代码如何知道传递它的位置或者C给它正确的数据类型,以及如何C代码知道它给出的数据类型是什么?

Python可以用C / C ++扩展(更多信息在这里

它基本上意味着你可以像这样包装一个C模块

#include "Python.h"

// Static function returning a PyObject pointer
static PyObject *
keywdarg_parrot(PyObject *self, PyObject *args, PyObject *keywds) 
// takes self, args and kwargs.
{ 
    int voltage;
    // No such thing as strings here. Its a tough life.
    char *state = "a stiff";
    char *action = "voom";
    char *type = "Norwegian Blue";
    // Possible keywords
    static char *kwlist[] = {"voltage", "state", "action", "type", NULL};

    // unpack arguments
    if (!PyArg_ParseTupleAndKeywords(args, keywds, "i|sss", kwlist,
                                     &voltage, &state, &action, &type))
        return NULL;
    // print to stdout
    printf("-- This parrot wouldn't %s if you put %i Volts through it.\n",
           action, voltage);
    printf("-- Lovely plumage, the %s -- It's %s!\n", type, state);

    // Reference count some None.
    Py_INCREF(Py_None);
    // return some none.
    return Py_None;
}
// Static PyMethodDef
static PyMethodDef keywdarg_methods[] = {
    /* The cast of the function is necessary since PyCFunction values
     * only take two PyObject* parameters, and keywdarg_parrot() takes
     * three.
     */
    // Declare the parrot function, say what it takes and give it a doc string.
    {"parrot", (PyCFunction)keywdarg_parrot, METH_VARARGS | METH_KEYWORDS,
     "Print a lovely skit to standard output."},
    {NULL, NULL, 0, NULL}   /* sentinel */
};

使用Python头文件,它将定义和理解C / C ++代码中的入口点和返回位置。

每个计算平台都具有(或应该具有)应用程序二进制接口(ABI)。 这是如何在例程之间传递参数,返回值的方式,机器应处于什么状态等的规范。

ABI将指定诸如(例如)之类的内容:

  • 第一个整数参数(最多一些位,比如32)将在某个寄存器(例如%EAX或R3)中传递。 第二个将在另一个特定的寄存器中传递,依此类推。
  • 在使用寄存器列表之后,将在堆栈上传递其他整数参数,从调用时的堆栈指针值的某个偏移量开始。
  • 指针参数将被视为与整数参数相同。
  • 浮点参数将在浮点寄存器F1,F2等中传递,直到这些寄存器用完为止,然后再堆栈。
  • 复合参数(例如结构)将作为整数参数传递,如果它们非常小(例如,一个结构中有四个char对象),或者如果它们很大则在堆栈上传递。

每个编译器或其他语言实现都将生成符合ABI的代码,至少在其例程调用或从其他可能在语言之外的例程调用的情况下。

我不能直接谈论Python / C交互,但我可以给出一些背景知识,这些事情一般是如何工作的。

在特定平台或实现上,有一个调用约定 ,它指定如何将参数传递给子例程以及如何将值返回给调用者。 针对该平台或实现的编译器和解释器生成符合该约定的代码,以便子例程/模块/以不同语言编写的任何内容可以相互通信。

在我的汇编类中,我们有一个任务,我们必须使用VAX汇编程序,C和Pascal编写程序(这是在80年代中期的 白垩纪 )。 驱动程序位于C或Pascal之一(不记得哪一个),它调用了程序集例程,它调用了另一个例程(用驱动程序没有的任何语言编写)。 我们的汇编代码必须根据VMS调用约定从堆栈中弹出和推送参数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM