键入vs无类型语言

Kaw*_*iKx 10 compiler-construction types programming-languages declaration

我正在一起学习C语言和汇编语言.我注意到,与C相比,程序集是一种无类型语言,它需要在处理数据之前声明数据类型.但我也了解到,即使用C语言编写的代码也会首先编译成用汇编编写的代码,然后组装成目标代码.因此,这意味着我们在C或任何高级语言中使用的数据类型声明仅用于C编译器的简易性.它们对目标代码没有任何特殊影响.那是对的吗?

我收集的是类型声明告诉编译器可以对数据执行的操作,数据大小(在数据段中存储数据所需),可存储的最大和最小十进制数的大小.我这样说是对的吗?

类型声明还有其他好处吗?

小智 9

在C中,我们有一个简单的类型系统,但它不是特别复杂,可以(并且经常在实践中)被完全未经检查的演员等绕过(由于这些原因,C通常被称为"弱类型",这是生病-defined和通常用于扑一种语言,但至少告诉类型不是该重要的.)的大小,布局和类型的对齐是不固定的,虽然它通常是与相同的编译器(版本)上一致同一个平台.一个int可能是14位大,等等,这些东西不能得到保证(除了C标准要求基本积分类型之间有一些排序,例如short不得大于int).

程序员不知道细节,但编译器确实需要.例如,产生了用于确切的代码foo.y,其中struct Foo { int x; short y; };和struct Foo foo;取决于例如上的确切大小int和short和上的填充struct Foo,因为它编译成"取的ADRESS foo,添加偏移y中struct Foo,并使用该".即使struct Foo foo;需要确切知道struct Foo(并且,递归地,它由它组成的类型) - 生成的代码必须知道精确sizeof(struct Foo)到在堆栈上保留正确的字节数?类似地,需要类型声明来知道哪些操作码用于数学(iadd或者fadd添加?必须扩展其中一个操作数,以及扩展到什么尺寸?),比较,执行指针算法时的步长(p + n实际添加n * sizeof(*p))等.这也可以防止访问不存在的成员(并且,通过扩展,将值传递给那些会遇到这个问题的函数 - 即类型不匹配),但这更像是一个方便的副作用 - 编译器认为这是一个错误因为不知道要发出什么代码,不是因为它认为程序员就像孩子一样必须被监视并保持秩序.

在汇编语言中(通常 - 就在昨天我读到微软研究院的一个项目,该项目为操作系统开发了一种类型化的,可验证的汇编语言,可以安全地抵御某些建筑错误),你真的没有类型.你有字节.你从某个位置获取N个字节,为它们做一些东西,然后将它们存储到某个位置.是的,寄存器固定为某些字大小,有些可能用于特殊类型的值(例如,具有80位或更多位的专用浮点寄存器),但基本上,您可以在任何地方存储您喜欢的任何内容.没有人阻止你在某处存储8个字节,稍后只读取后4个字节并将它们与循环计数器相加以形成地址以存储返回值.

在其他语言中,类型系统要强大得多,同时允许大量扩展,允许更高级别的编程,例如抽象出确切的类型(因此,它们的布局和打字),并且只采用满足某个合同的任何类型.它允许类型签名,例如[a] -> a,它是一个包含任何类型值的列表的函数(只要它是同源的,例如整数列表,字符串列表,字符列表列表等)并返回一个它的元素,没有"擦除"(例如,铸造void *)类型.(根据实现,它可能实际上生成多个实现,每个实现用于具有已知布局的单个类型,以提高性能 - 但这不会泄露给程序员.)