我有一个遗留程序,我假设是用BASIC编写的(一个以.bas结尾的文件)。不过,它似乎已经编译好了!当在十六进制编辑器中打开时,String和注释都是可读的,而计算的部分则不是。AFAIK,BASIC是一种解释语言。
问题:
发布于 2021-01-10 18:50:44
对于老式的基础程序来说,编译和标记化是有区别的.编译将基本代码转换为机器代码,通常以文件扩展名存储,表明代码应该直接运行,而不是解释;这个扩展名通常是“.BIN”的某种变体。至少在个人计算机上,编译通常需要第三方软件将基本语句转换为机器代码。
虽然基本程序通常可以直接保存为ASCII,基本语句完全由它们的文本表示,但大多数基本程序默认是标记化保存的程序。标记化的文件通常通过.BAS文件扩展名的一些变化来保存。
令牌化通常是将基本语句/函数一对一地转换为该语句或函数的一个或两个字节代码。这节省了系统上的空间;旧的个人计算机上的磁盘空间和RAM都是有限的。但它也使系统能够更容易地动态运行代码--解释代码--并使解释速度更快。
例如,如果没有标记化,在Radio计算机的Extended中,RESET和RESTORE之间的区别直到比较第四个字符时才会显示出来。通过标记化,第一个字符-9D与8F之间的比较就会显示出差异。
例如,这个archiveteam.org页面列出了GW-BASIC的标记编号。。
去标记化,或从标记转换到语句的文本表示形式,只是逆转了这个过程。每次用户列出程序时,都会执行此反转操作。在现代计算机上,去标记化程序应该能够很容易地用任何现代脚本语言编写。只要您知道格式,去标记化只是一个逐字节遍历标记化文件并将令牌转换回其等效的基本语句或函数的问题。
例如,巴斯猫声称对GW进行了去标记。
这里有一个标记化的例子;我使用TRS-80彩色计算机的扩展颜色BASIC,因为我有这些工具很容易获得来标记它,但是对于大多数老学校的基础知识来说,基本思想是相同的。
(有点荒谬的)基本程序:
10 RESET(14,15)
20 RESTORE标记化文件的十六进制转储:
00000000 26 0b 00 0a 9d 28 31 34 2c 31 35 29 00 26 11 00
00000010 14 8f 00 00 00
00000015前两个字符是下一行的地址;当从文件中去标记时,如果特定语言使用这些地址,您可能会忽略这些地址。(它们主要用于运行代码:例如,如果一行中有一个GOTO 60,则解释器可以找到第60行,而不必解释标记才能到达。)
第二个字符是行号: 000A是10。下一个字符9D是RESET的标记化。然后,28是开括号的ASCII值,31是“1”,34是“4”(即14作为RESET的第一个参数;2C是逗号,31和35是RESET第二个参数的1和5,29是闭括号,00是行的末尾。
下面两个字符是下一行的地址,0014是第二行的行号: 14是20的十六进制。最后,8F是RESTORE的标记,a 00结束行,最后两个零结束程序。
https://stackoverflow.com/questions/65610648
复制相似问题