我只是不知道,这有什么技术原因吗?为弱类型语言实现编译器是否更困难?它是什么?
最佳答案
问题背后的前提有点狡猾 .解释型语言大多是ducktyped 是不正确的。编译语言大多具有强类型,这是不正确的。 类型系统是语言的属性 . 编译与解释是实现的一个属性。
例子:
尽管如此 您的问题背后有一些道理 ,所以你应该得到一个更周到的答案。事实是动态类型语言似乎确实与解释实现相关 .为什么会这样?
顺便说一下,请警惕术语“强”和“弱”打字 ,因为它们没有普遍认可的技术含义。相比之下,静态类型 表示程序是 执行前检查 ,并且程序可能在启动之前就被拒绝。 动态打字 表示 的类型在执行期间检查值 ,错误类型的操作可能会导致程序停止或以其他方式停止 在运行时发出错误信号 .静态类型的一个主要原因是排除可能具有此类“动态类型错误”的程序。 (这是编写解释器的人通常对静态类型不太感兴趣的另一个原因;在类型检查后立即执行,因此保证的区别和性质并不那么明显。)
强类型 一般表示有无漏洞在类型系统中,而 弱类型意味着可以破坏类型系统(使任何保证无效)。这些术语经常被错误地用于表示静态和动态类型。
要查看差异,请考虑 C:该语言在编译时进行类型检查(静态类型),但存在大量漏洞;您几乎可以将任何类型的值转换为相同大小的另一种类型——特别是,您可以自由地转换指针类型。 Pascal 是一种旨在强类型化的语言,但众所周知有一个无法预见的漏洞:没有标签的变体记录。
随着时间的推移,强类型语言的实现经常会出现漏洞,通常这样一部分运行时系统可以用高级语言实现。例如,Objective Caml 有一个名为
Obj.magic
的函数。它具有简单地返回其参数的运行时效果,但在编译时它将任何类型的值转换为任何其他类型之一。我最喜欢的例子是 Modula-3,它的设计者称他们的类型转换结构 LOOPHOLE
.总之:
关于compiler-construction - 为什么解释的 langs 大多是ducktyped,而编译有强类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/376611/