Language agnostic 编程中的原型是什么?

Language agnostic 编程中的原型是什么?,language-agnostic,function-prototypes,Language Agnostic,Function Prototypes,这不是一个关于语言的具体问题,而是关于一般编程的问题。这个问题是在我和一个朋友开始讨论“函数原型”之后,我最近从C++课程中学到的。我向他提到,原型是必须在代码开始时创建的函数头,因此编译器在运行时分配一些空间,然后再进入实际函数。然后我们开始漫谈,是否其他的编程语言(如java或Python),不使用函数原型——就我们所关心的——实际上有一个类似C++的系统,只是他们自己处理,而不是用户创建它们。 所以我们很好奇,到底什么是函数原型?它们是只对C/C++负责,还是其他编程语言使用它们?作为一名

这不是一个关于语言的具体问题,而是关于一般编程的问题。这个问题是在我和一个朋友开始讨论“函数原型”之后,我最近从C++课程中学到的。我向他提到,原型是必须在代码开始时创建的函数头,因此编译器在运行时分配一些空间,然后再进入实际函数。然后我们开始漫谈,是否其他的编程语言(如java或Python),不使用函数原型——就我们所关心的——实际上有一个类似C++的系统,只是他们自己处理,而不是用户创建它们。
所以我们很好奇,到底什么是函数原型?它们是只对C/C++负责,还是其他编程语言使用它们?作为一名未来的程序员,这是我需要进一步发展的吗?谢谢你的帮助

这大大简化了,但函数原型的原因是“一次编译”

如果编译器只对代码进行一次遍历,那么在调用函数实现之前,它需要知道哪些函数对它可用。这就是原型的用武之地

对代码进行多次传递的编译器构建跳转表,告诉它所有函数的位置,因此不需要函数原型


在C编译器中,原型用于检查函数参数的类型和数量(即函数签名)。该计划:

#include <stdio.h>

int main()
{
    printf("%d\n",add(3));
}

int add(int i, int j)
{
    return i+j;
}
#包括
int main()
{
printf(“%d\n”,添加(3));
}
整数相加(整数i,整数j)
{
返回i+j;
}
,即使结果毫无意义(即未定义的行为)

鉴于本程序包含一个功能原型:

#include <stdio.h>

int add (int, int); /* function prototype for add */

void main()
{
    printf("%d\n",add(3));
}

int add(int i, int j)
{
    return i+j;
}
#包括
整数加(整数,整数);/*add的函数原型*/
void main()
{
printf(“%d\n”,添加(3));
}
整数相加(整数i,整数j)
{
返回i+j;
}

.

这大大简化了,但函数原型的原因是“一次性编译器”

如果编译器只对代码进行一次遍历,那么在调用函数实现之前,它需要知道哪些函数对它可用。这就是原型的用武之地

对代码进行多次传递的编译器构建跳转表,告诉它所有函数的位置,因此不需要函数原型


在C编译器中,原型用于检查函数参数的类型和数量(即函数签名)。该计划:

#include <stdio.h>

int main()
{
    printf("%d\n",add(3));
}

int add(int i, int j)
{
    return i+j;
}
#包括
int main()
{
printf(“%d\n”,添加(3));
}
整数相加(整数i,整数j)
{
返回i+j;
}
,即使结果毫无意义(即未定义的行为)

鉴于本程序包含一个功能原型:

#include <stdio.h>

int add (int, int); /* function prototype for add */

void main()
{
    printf("%d\n",add(3));
}

int add(int i, int j)
{
    return i+j;
}
#包括
整数加(整数,整数);/*add的函数原型*/
void main()
{
printf(“%d\n”,添加(3));
}
整数相加(整数i,整数j)
{
返回i+j;
}

关于C和C++,“原型”一词指的是一种特定的声明语法。

在最早的C语言版本中,函数定义被写成

int func( arg1, arg2, arg3 ) // no types in argument list, just identifiers
  int arg1;
  double arg2;
  char *arg3;
{
  // function body
}
int func( ); // no argument list
声明的内容如下:

int func( arg1, arg2, arg3 ) // no types in argument list, just identifiers
  int arg1;
  double arg2;
  char *arg3;
{
  // function body
}
int func( ); // no argument list
函数参数列表只包含标识符,没有单独提供的类型信息。函数声明不包含参数,只包含返回类型

C++引入了原型语法的概念,C随后采用了原型语法的概念,其中类型信息包含在定义中的参数列表中:

int func( int arg1, double arg2, char *arg3 )
{
  // function body
}
和宣言

int func( int, double, char * );
这允许编译器检查函数调用中参数的数量和类型,如果参数不匹配,则发出诊断,而不是等到运行时才发现是否有问题

虽然旧式的函数声明和定义语法仍然受到支持,但它不应该用于新代码开发——我们几乎到了“原型”这个词有点多余的地步,因为原型语法是规范而不是例外


像Fortran、Pascal和Ada这样的静态类型语言都有单独的函数声明,但它们不将这些声明称为原型。同样,用“C”,“原型”指的是函数声明和定义的特定样式,而不仅仅是一个声明本身。

< P>关于C和C++,“原型”一词指的是一个特定的声明语法。 在最早的C语言版本中,函数定义被写成

int func( arg1, arg2, arg3 ) // no types in argument list, just identifiers
  int arg1;
  double arg2;
  char *arg3;
{
  // function body
}
int func( ); // no argument list
声明的内容如下:

int func( arg1, arg2, arg3 ) // no types in argument list, just identifiers
  int arg1;
  double arg2;
  char *arg3;
{
  // function body
}
int func( ); // no argument list
函数参数列表只包含标识符,没有单独提供的类型信息。函数声明不包含参数,只包含返回类型

C++引入了原型语法的概念,C随后采用了原型语法的概念,其中类型信息包含在定义中的参数列表中:

int func( int arg1, double arg2, char *arg3 )
{
  // function body
}
和宣言

int func( int, double, char * );
这允许编译器检查函数调用中参数的数量和类型,如果参数不匹配,则发出诊断,而不是等到运行时才发现是否有问题

虽然旧式的函数声明和定义语法仍然受到支持,但它不应该用于新代码开发——我们几乎到了“原型”这个词有点多余的地步,因为原型语法是规范而不是例外


像Fortran、Pascal和Ada这样的静态类型语言都有单独的函数声明,但它们不将这些声明称为原型。再次,用“C”,“原型”指的是函数声明和定义的特定样式,而不仅仅是一个声明本身。

< P> C和C++被编译成本机代码,并支持编译单元(文件)之间的调用。要从相邻的编译单元调用函数XYZ,编译器将插入一个引用“calling XYZ”