以Python为例讨论高级编程语言程序的wire format与校验
2010-09-22 11:26:23 来源:WEB开发网核心提示: C#代码goto label_in_loop;for (var i = 0; i < 3; i++) {label_in_loop: Console.WriteLine("hey");}因为C#规定循环结构只能有单一入口,而不能从循环外部直接跳入循环内的任意
C#代码
goto label_in_loop;
for (var i = 0; i < 3; i++) {
label_in_loop:
Console.WriteLine("hey");
}
因为C#规定循环结构只能有单一入口,而不能从循环外部直接跳入循环内的任意位置。这是为了保持代码良好的结构化而做的规定。
许多提供自动内存管理功能的高级编程语言都不再允许显式的指针算术运算,也使语言的实现得以简化。
以拥有上述特性的源码为wire format,保证程序受到诸多限制,相对安全一些。
以JavaScript为例。ECMAScript和JavaScript的语言规范都只规定了源代码的语法和语义,但并没有对程序的发布格式做要求。一般来说JavaScript程序通用的wire format就是其源码。各JavaScript解释器在拿到程序源码后采用何种方式去执行,规范并没有限制。对抽象语法树解释执行也可以,对线性的中间代码(一般是字节码)解释执行也可以,一口气编译为本地代码再执行也可以。
无论采用何种方式来执行,都必须保证JavaScript的语义;过程中肯定存在解析代码的步骤,这就包含了对wire format的校验。JavaScript对控制流有严格的规定,不能在程序中任意跳转,而必须采用遵循结构化设计的语言结构来实现控制流;同时,由于程序无法访问裸的内存,它就无法以任意数据为代码来执行(即便eval(),作为参数的字符串也必须是合法的JavaScript代码),也就不存在“代码发现”的问题。
有不少JavaScript解释器的实现在内部有采用字节码,但一般这些字节码不会被保存到磁盘上;不用JavaScript解释器的设计实现不同,即便采用了字节码也无法通用。因而对JavaScript而言字节码不是wire format。
更多精彩
赞助商链接