VOSでHELLO WORLD

PL/Iで提供される表示機能にput命令がありますが、これらの機能はいろいろなルーチンを経由し、最終的にVOSネイティブなs$write_codeというルーチンに置き換えられます。結局ネイティブなルーチンになるのなら直接記述したほうがメモリ節約、スピードアップに繋がりますので、PL/I機能を使わない方が有効と思われます。最終的な仕様・ルールは現場に従うしかないのですが。

s$write_codeはシンプルなルーチンで、第一引数の文字列を出力するだけです。第二引数は出力時のエラーコードです。出力先は、標準出力にあたる端末画面です。start_processされた常駐プロセスでは、起動時に指定される.outファイルというシーケンシャルファイルへ出力されます。厳密にいうと、端末ではTERMINALという名前のポート(通常、ポート番号5番)、.outファイルはs$attach_portされたファイルのポートへ出力となります。まあ、出力はとどのつまりポートへの出力なのです。
出力される文字列は、asciiコードのテキストで、バイナリの数値は文字列変換しないとバイナリコードのまま出力されます。バイナリデータの出力は、別途用意されているs$dump、s$dump_portを使うと16進ダンプをテキスト出力することができます。(dump_recordコマンドで出力される形式と同じ。dump_record自体がs$dump_portを使ってると思われます。ちなみに、dump_recordsというコマンドは自分が考案したコマンドで、マルチファイル、ロッキングモードを自動で合わせるコマンド。会社の業務とは別に個人の時間で作ったものなので所有権・著作権を主張できるけど、十分報酬をもらったと思うから置いてきた。)

call s$write_code(‘Hello, world’, error_code);

このように記述すれば、端末画面にHello, worldと表示されると思います。
ちなみに、s$writeというエラーコードがないAPIもあります。こちらの方が手軽なのですが、エラーが発生したときにコアダンプしますので、あまりお勧めしません。エラーコードの戻り先がないので、エラー情報を出して停止シグナル処理されてしまうのです。エラーが出る典型例としては、X.25やダイヤルアップして接続された端末で出力がポーズなどで停止している時にバッファオーバーフローなどで出力できない場合に発生します。telnet上ではエラーを見たことがないですが、通信上何らかのエラーが発生した場合に起こりえます。まあ、個人的なツールなどでは考慮しなくてもいいと思いますけどね。それに、画面出力でエラーが出たからと言ってそのあとの処理をどうするかとか判断が難しいと思います。大抵は通信エラーで、通常では発生しませんし、メイン業務でのエラーの方が問題になると思いますので。なので、通常、エラーが戻されたら無視するのがいいかも。ある意味、s$writeを使って、エラー時はコアダンプする方がもしかしたら安全なのかもしれません。