The Transaction Application Language (TAL) 是hp NSK上一种编程语言,如果分类,应该算过程式。
,而且也需要编译为可执行文件。
Tal不区分大小写,但是在C语言里调用Tal过程时过程名(函数名)一定要全用大写。
注释有两种,一个是两个横线–,直到行末有效,另一个是感叹号!,直到行末有效,或者到下一个感叹号,比如
CALL PROC1(p1,!p2!,p3) –p2 is not provided
这个调用和 PROC1(p1,,p3)是等价的,但是如果在第二个参数出写个那样的注释,非常好理解。
下面来写个Hello World
其实无论是c,java,ruby,都很简单,但是Tal可就复杂了。
首先,需要定义一个主过程,着类似c的main函数。
PROC myproc MAIN;
这个myproc是名字,PROC标识他是一个过程,MAIN表示是程序开始执行的入口点。
然后就可以打印了。Printf,没找到个函数。当然,人家凭什么给你。
最后找了一下,发现是这样的。
首先,执行编译好的程序是从TACL启动的,注意是TACL,不是Tal,完全不同的东西。
如果要打印,则需要往TACL进程里写东西,TACL才能打印到标准输出。也可以把我们要执行的程序看作TACL的子程序。
TACL用RUN启动一个程序的时候,会有一个500多个字节(word?)的message送给被启动的进程,包括id,卷标,输入输出,参数等,我们就可以从这个message里取得输出的。
这是进程启动消息的结构,
- Structure of the Startup message:
- STRUCT CI^STARTUP;
- BEGIN
- INT MSGCODE; !word 0 – value -1
- STRUCT DEFAULT;
- BEGIN
- INT VOLUME[0:3]; !word 1 – default volume
- name
- INT SUBVOL[0:3]; !default subvolume name
- END;
- STRUCT INFILE;
- BEGIN
- INT VOLUME[0:3]; !word 9 – IN parameter file
- INT SUBVOL[0:3]; !name of RUN command
- INT FNAME[0:3];
- END;
- STRUCT OUTFILE;
- BEGIN
- INT VOLUME[0:3]; !word 21 – OUT parameter file
- INT SUBVOL[0:3]; !name of RUN command
- INT FNAME[0:3];
- END;
- STRING PARAM[0:n-1]; !word 33 – parameter string (if
- !any) of RUN command
- END;
Word21开始的12个word是输出信息,所以程序如下:
- ?NOMAP, INSPECT,SYMBOLS,NOLIST, SOURCE $SYSTEM.SYSTEM.EXTDECS (CLOSE,
- ? INITIALIZER, OPEN, WRITEX) !Include system procedures,
- ! but suppress their listings
- !Global data declarations:
- INT .out_file_name[0:11];
- PROC startup_proc (rucb, passthru, message, msglen, match)
- VARIABLE; !Declare STARTUP_PROC
- INT .rucb, .passthru, .message, msglen, match;
- BEGIN
- out_file_name ':=' message[21] FOR 12 WORDS;
- !Move statement
- END; !End STARTUP_PROC
- PROC myproc MAIN; !Declare MYPROC
- BEGIN
- INT out_file_number;
- STRING .EXT buffer[0:79]; !Array for output message
- INT length; !Length of output message
- CALL INITIALIZER ( ! rucb !, ! passthru !, startup_proc,
- ! paramsproc !, ! assignproc !, ! flags ! );
- !Get OUT file name
- CALL OPEN (out_file_name , out_file_number);
- !Open OUT file; get number
- buffer ':=' "Hello, World"; !Move statement
- length := 12; !Assignment statement
- CALL WRITEX (out_file_number, buffer, length);
- !Write message to OUT file
- CALL CLOSE (out_file_number); !Close OUT file
- END; !End MYPROC
INITIALIZER使系统API,用来取得进程启动消息,具体方法就是类似上面那样使用。
其它部分简单说明:
?后面的是编译指令,即pragma类似
可以跨行的,比如SOURCE $SYSTEM.SYSTEM.EXTDECS (CLOSE,
? INITIALIZER, OPEN, WRITEX)
这个意思是从系统库EXTDECS里使用函数CLOSE,INITIALIZER,OPEN,WRITEX等。
变量声明和C类似,具体有些区别,
INT .out_file_name[0:11];是全局变量,别看是int型的数组,也可以标识字符串。
0:11表示数组下标从0到11,所以有12个元素。
CALL标识调用别的过程
buffer ‘:=’ “Hello, World”; !Move statement
length := 12; !Assignment statement
都是”赋值”语句,却不相同。整数那个类似pascal,可是buffer的赋值’:=’叫做移动(move)语句,比较寒,后面看到了再说吧。
然后编译
TAL /IN mysrc/ myprog
然后执行
run myprog
这个估计是目前最难,代码最多的Hello World了吧。
固定链接: http://liubin.nanshapo.com/2007/07/19/hello_world_in_tal/ | 其实我是一个程序员
最新评论