Blog

为什么?

想象一下,如果你写了一个程序,输入到编译器或解释器中,然后你的程序被执行的同时,你的代码也被编译器或解释器改成了“更标准的形式”,并覆盖掉了源文件,没有备份原文件,你会不会抓狂呢?这就是我昨天晚上的这一推的来历。

那时我正在写数据库的第二次作业,倒也不难,就是让你写一个学生选课的数据库。我写了一部分后,觉得应该测试一下,就像单元测试一样,看看到目前位置写的对不对。因为我之前从来没有用过老师要求我们用的hsqldb-10R,所以就也不大肯定我写的SQL能不能被正确执行。

使用过程中,我还发现了一件奇怪的事:老师让我们把DDL和DML都写在一个叫 CreateStudents.script 的脚本文件里,然后让我们运行的BAT文件里竟然第一行就是 copy CreateStudents.script Students.script。把我写的文件复制到一个新文件中,再执行新文件,这是什么道理?于是我也没有多想,就直接把我的代码放在了 Students.script 里面,反正我的Mac上没有copy命令,那个脚本文件是为Windows写的,我只能手动运行。

运行结果挺正常,我获得了正确的输出。但当我打开 Students.script 文件时,我傻眼了──里面被改了很多地方。首先不是数据的字符都变成了大写,然后又加了一些hsqldb特有的指令,比如 CREATE TABLE 变成了 CREATE MEMORY TABLE 样子的指令。

代码被修改成标准的格式,或许是一件好事,但对我这种程序写了一半的人,就完全把我的视线和思路搞混乱掉了。而且我的代码是要交作业的,里面全是大写,也不利于批阅的人看。结果我只好用查找替换命令慢慢的改了回来。然后才知道 CreateStudents.script 的用意。

话说这种程序真的是令人相当火大的,而且会让人感觉到业余的。首先就是对程序的容错性,难道非要把程序转换成标准格式才能执行吗?如果脚本语言之流,如Perl,每次运行都回把源文件弄成这副德性,岂不是太痛苦了。相比而言,同样是处于让程序的格式更加清晰明确的目的,indent程序就会把源文件先备份了。

另外,我也不知道为什么老师要用hsqldb来让我们练习。同样类似但流传更广泛的sqlite不是更好吗,用户界面的实现也更利索一些。不过hsqldb的唯一优势,或许就在于是用Java写的,易于跨平台吧。不过好像官方的版本也没有供UNIX用户使用的接口脚本。

没有评论

Leave a Reply