Ruby 语言 思想驱动生活

July 19, 2007

TAL的Hello World程序

Filed under: 技术 — liubin @ 22:47

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了吧。

No Comments

No comments yet.

RSS feed for comments on this post. TrackBack URL

Sorry, the comment form is closed at this time.

Powered by WordPress