TAL的Hello World程序
发表于:2007年07月19日  分类:技术  添加评论  1,307 次浏览 

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里取得输出的。

这是进程启动消息的结构,

  1. Structure of the Startup message:
  2. STRUCT CI^STARTUP;
  3. BEGIN
  4. INT MSGCODE; !word 0 – value -1
  5. STRUCT DEFAULT;
  6. BEGIN
  7. INT VOLUME[0:3]; !word 1 – default volume
  8. name
  9. INT SUBVOL[0:3]; !default subvolume name
  10. END;
  11. STRUCT INFILE;
  12. BEGIN
  13. INT VOLUME[0:3]; !word 9 – IN parameter file
  14. INT SUBVOL[0:3]; !name of RUN command
  15. INT FNAME[0:3];
  16. END;
  17. STRUCT OUTFILE;
  18. BEGIN
  19. INT VOLUME[0:3]; !word 21 – OUT parameter file
  20. INT SUBVOL[0:3]; !name of RUN command
  21. INT FNAME[0:3];
  22. END;
  23. STRING PARAM[0:n-1]; !word 33 – parameter string (if
  24. !any) of RUN command
  25. END;

Word21开始的12个word是输出信息,所以程序如下:

  1. ?NOMAP, INSPECT,SYMBOLS,NOLIST, SOURCE $SYSTEM.SYSTEM.EXTDECS (CLOSE,
  2. ? INITIALIZER, OPEN, WRITEX)     !Include system procedures,
  3.                                  ! but suppress their listings
  4. !Global data declarations:
  5. INT .out_file_name[0:11];
  6.  
  7. PROC startup_proc (rucb, passthru, message, msglen, match)
  8.   VARIABLE;                      !Declare STARTUP_PROC
  9.   INT .rucb, .passthru, .message, msglen, match;
  10.   BEGIN
  11.     out_file_name ':=' message[21] FOR 12 WORDS;
  12.                                  !Move statement
  13.   END; !End STARTUP_PROC
  14.  
  15. PROC myproc MAIN; !Declare MYPROC
  16.  BEGIN
  17.    INT out_file_number;
  18.    STRING .EXT buffer[0:79]; !Array for output message
  19.    INT length; !Length of output message
  20.   
  21.    CALL INITIALIZER ( ! rucb !, ! passthru !, startup_proc,
  22.                                  ! paramsproc !, ! assignproc !, ! flags ! );
  23.                                  !Get OUT file name
  24.    CALL OPEN (out_file_name , out_file_number);
  25.                                  !Open OUT file; get number
  26.    buffer ':=' "Hello, World";   !Move statement
  27.    length := 12;                 !Assignment statement
  28.    CALL WRITEX (out_file_number, buffer, length);
  29.                                  !Write message to OUT file
  30.    CALL CLOSE (out_file_number); !Close OUT file
  31.  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/ | 其实我是一个程序员

报歉!评论已关闭.