对于带有动态类型的编译语言(编译为 本机代码 ),我有点困惑。 动态类型表示程序中的类型仅在运行时推断。
现在如果编译了一种语言,那么在运行时就没有运行的解释器;它只是你的CPU读取内存并执行它们的指令。在这种情况下,如果任何违反语言类型语义的指令碰巧在运行时执行,则没有解释器拦截程序的执行并抛出任何错误。那么系统如何工作呢?
当在运行时执行违反动态类型编译语言的类型语义的指令时会发生什么?
PS:我所知道的一些动态类型编译语言包括Scheme,Lua和Common Lisp。
答案 0 :(得分:3)
动态类型语言的编译器只会生成在必要时检查类型的指令。事实上,即使对于某些静态类型语言,这有时是必要的,例如,在面向对象语言的情况下使用经过检查的强制转换(如C ++中的dynamic_cast
)。在动态类型语言中,它更经常是必需的。
为了使这些检查成为可能,每个值都需要以跟踪其类型的方式表示。在动态类型语言中表示值的常用方法是将它们表示为包含类型和值的结构的指针(作为优化,通常通过将整数直接存储为(足够小)整数来避免这种情况)一个无效的指针(通过将整数移到左边并设置其最低有效位))。