ときどきの雑記帖 RE* (新南口)
TINY BASICの本命記事は準備中(ということにしておこう)
来週(というかこの週末から)、いちおー「夏休み」ということなんだけど さてどうしたものやら。
その訳は
前にもたしかJava関連の記事で疑問に感じる訳をしていたと思うのだけど この記事 Java 注目の機能: テキストブロック 、 やっぱり引っかかるところがいくつかあった。今回はいちいち挙げていくのも面倒なので目についたところから二つほど。
Javaの文字列リテラルは、他のいくつかの言語がそうであるように、式の補間をサポートしていません。テキストブロックもそうではありません。 (今後のある時点でこの機能を検討する可能性がある範囲では、テキストブロックに特化した機能ではないでしょう。ですが、文字列リテラルにも同じように適用されます。)。
Java’s string literals do not support interpolation of expressions, as some other languages do; text blocks do not either. (To the extent that we may consider this feature at some point in the future, it would not be specific to text blocks, but applied equally to string literals.)
これ、as ~ do は 英語の文法:疑似関係代名詞(as,but,than) | ネイティブ英語のススメ:ビジネス英語・語学の総合学習サイト で、
Javaの文字列リテラルは一部の言語がサポートしている interpolation of expressionsをサポートしておらず、 テキストブロックも同様に(interpolation of expressionsを)サポートしていません。
くらいの訳になるんじゃないかなあ。
ただここでは interpolation をどう訳するのかは悩ましくて、 ここ最近では string interpolation を「文字列補間」とすることが大半だと思われるのだけど
String interpolation - Wikipedia
In computer programming, string interpolation (or variable interpolation, variable substitution, or variable expansion) is the process of evaluating a string literal containing one or more placeholders, yielding a result in which the placeholders are replaced with their corresponding values. It is a form of simple template processing[1] or, in formal terms, a form of quasi-quotation (or logic substitution interpretation). String interpolation allows easier and more intuitive string formatting and content-specification compared with string concatenation.[2]
というのと、
interpolationの意味・使い方|英辞郎 on the WEB:アルク
- 〔他のものに〕挿入すること、差し挟むこと
- 〔原文の〕改ざん、不正な改変
- 〔付け加えられた〕語句、挿入句
- 《数学》補間、内挿
この訳語の例や数学的な「補間」の例を考えると、「文字列補間」という訳語に対しては違和感の方が強い。
そして interpolation of expressions に戻ると、やっぱりこっちも「補間」はないよねえ。
(ここでの重要な技術革新は、エスケープ区切り文字が文字列の区切り文字に合わせて差があれば変化することです。それは「調理された」と「生」モードの間で 選択する必要性を回避します。文字列リテラルのすべての形式でエスケープ言語を共有しています。 「後になってみれば明らか」と高く評価されるようなアプローチであることがわかります)。 それは「調理された」と「生」モードの間で選択する必要性を回避します。文字列リテラルのすべての形式でエスケープ言語を共有しています。
(The key innovation here is the escape delimiter varies in lockstep with the string delimiter, avoiding the need to choose between “cooked” and “raw” modes, while still sharing the escape language across all forms of string literal – an approach which warrants the high praise of “obvious in hindsight”.)
これ、cooked や raw をうかつに日本語(「調理された」と「生」)にしてしまうとかえってわかりづらくなるんじゃないだろうか。
- POSIX terminal interface - Wikipedia
- Unix/端末 - Global Wiki
- [翻訳] 端末の神秘を解き明かす - Qiita
- TTY/PTYに関するクイズ - Qiita
それと、“cooked” and “raw” modes と mode が複数形なんだからこの「モード」は coocked と raw 両方を受けているということを無視してるのと、 between とみたらなんでもかんでも「~の間」としちゃうのはちょっと… choose betweenの意味・使い方・読み方 | Weblio英和辞書
gawk
Item Limit Characters in a character class 2^(number of bits per byte) Length of input record MAX_INT Length of output record Unlimited Length of source line Unlimited Number of fields in a record MAX_LONG Number of file redirections Unlimited Number of input records in one file MAX_LONG Number of input records total MAX_LONG Number of pipe redirections min(number of processes per user, number of open files) Numeric values Double-precision floating point (if not using MPFR) Size of a field MAX_INT Size of a literal string MAX_INT Size of a printf string MAX_INT
前回
NF はというと、Number of fields in a record なので MAX_LONG というのが答え。
とここまで書いたことろで上記の表に引っかかるものを見つけたのだけど時間がないので今回は書かない。
と書いたことの「解答編」(謎)
さて、一レコード中に含まれるフィールドの最大値はMAX_LONGということなのだけど、 Length of input record つまりレコードの長さの最大値を見るとこれは MAX_INT になっている。 一レコードの中に含まれるフィールドは全フィールドが一バイト(もしくは一文字)のとき 最大になるわけで、とすると Length of input record より Number of fields in a record が大きいことはありえない(同じではありうる)から、 ちょっと変じゃね? と。
ただまあプログラム中でのそれらの値に関する変数の型に関係しているんだろうとは思う (大昔のjgawkでなにかをint(当時は16bit)からlong(32bit)に変えたことがあったはず)。
PATB (Palo Alto Tiny BASIC)
RST
前回、PATBではコード量を節約するために8080のRST命令を活用していると書いたけど、
$grep " RST [0-7]" tinybasic-1.0.asm | wc -l
72
$grep " RST [0-7]" tinybasic-2.0.asm | wc -l
67
一回当たり2バイト節約できるので、130~140バイトくらいはケチれた。 つーとこですか。
パッチ用領域
PATBの1.0のソースを見ると、コードの最後の方は
;
074F 594F5520 DB 'YOU MAY NEED THIS SPACE TO'
0753 4D415920
0757 4E454544
075B 20544849
075F 53205350
0763 41434520
0767 544F
0769 50415443 DB 'PATCH UP THE I/O ROUTINES,'
076D 48205550
0771 20544845
0775 20492F4F
0779 20524F55
077D 54494E45
0781 532C
0783 544F2046 DB 'TO FIX UP BUGS, OR TO ADD'
0787 49582055
078B 50204255
078F 47532C20
0793 4F522054
0797 4F204144
079B 44
079C 4D4F5245 DB 'MORE COMMANDS AND FUNCTIONS.'
07A0 20434F4D
07A4 4D414E44
07A8 5320414E
07AC 44204655
07B0 4E435449
07B4 4F4E532E
07B8 534B5920 DB 'SKY (SPACE) IS THE LIMIT.'
07BC 28535041
07C0 43452920
07C4 49532054
07C8 4845204C
07CC 494D4954
07D0 2E
07D1 474F4F44 DB 'GOOD LUCK AND GOOD BYE.'
07D5 204C5543
07D9 4B20414E
07DD 4420474F
07E1 4F442042
07E5 59452E
07E8 4C494348 DB 'LICHEN WANG, 10 JUNE 76'
07EC 454E2057
07F0 414E472C
07F4 20313020
07F8 4A554E45
07FC 203736
;
07FF LSTROM EQU $ ;ALL ABOVE CAN BE ROM
0800 ORG 0800H ;HERE DOWN MUST BE RAM
0800 FF OCSW: DB 0FFH ;SWITCH FOR OUTPUT
0801 0000 CURRNT: DW 0 ;POINTS TO CURRENT LINE
0803 0000 STKGOS: DW 0 ;SAVES SP IN 'GOSUB'
0805 VARNXT EQU $ ;TEMP STORAGE
0805 0000 STKINP: DW 0 ;SAVES SP IN 'INPUT'
0807 0000 LOPVAR: DW 0 ;'FOR' LOOP SAVE AREA
0809 0000 LOPINC: DW 0 ;INCREMENT
080B 0000 LOPLMT: DW 0 ;LIMIT
080D 0000 LOPLN: DW 0 ;LINE NUMBER
080F 0000 LOPPT: DW 0 ;TEXT POINTER
0811 0000 RANPNT: DW START ;RANDOM NUMBER POINTER
0813 1508 TXTUNF: DW TXTBGN ;->UNFILLED TEXT AREA
0815 TXTBGN: DS 1 ;TEXT SAVE AREA BEGINS
1F00 ORG 1F00H
1F00 TXTEND EQU $ ;TEXT SAVE AREA ENDS
1F00 VARBGN: DS 2*27 ;VARIABLE @(0)
1F36 DS 1 ;EXTRA BYTE FOR BUFFER
1F37 BUFFER: DS 72 ;INPUT BUFFER
1F7F BUFEND EQU $ ;BUFFER ENDS
1F7F DS 40 ;EXTRA BYTES FOR STACK
1FA7 STKLMT EQU $ ;TOP LIMIT FOR STACK
2000 ORG 2000H
2000 STACK EQU $ ;STACK STARTS HERE
のように将来のパッチ用の領域込みで2K バイトにコードが収まっている。 が、バイナリの実行コードに「直接パッチを当てる」なんてどのくらいの人に通じるんですかねえw
一方2.0はというと
076C LSTROM: ;ALL ABOVE CAN BE ROM
; ORG 1000H ;HERE DOWN MUST BE RAM
0800 ORG 0800H
0800 OCSW: DS 1 ;SWITCH FOR OUTPUT
0801 CURRNT: DS 2 ;POINTS TO CURRENT LINE
0803 STKGOS: DS 2 ;SAVES SP IN 'GOSUB'
0805 VARNXT: DS 2 ;TEMP STORAGE
0807 STKINP: DS 2 ;SAVES SP IN 'INPUT'
0809 LOPVAR: DS 2 ;'FOR' LOOP SAVE AREA
080B LOPINC: DS 2 ;INCREMENT
080D LOPLMT: DS 2 ;LIMIT
080F LOPLN: DS 2 ;LINE NUMBER
0811 LOPPT: DS 2 ;TEXT POINTER
0813 RANPNT: DS 2 ;RANDOM NUMBER POINTER
0815 TXTUNF: DS 2 ;->UNFILLED TEXT AREA
0817 TXTBGN: DS 2 ;TEXT SAVE AREA BEGINS
; ORG 1366H
1F00 ORG 1F00H
1F00 TXTEND: DS 0 ;TEXT SAVE AREA ENDS
1F00 VARBGN: DS 55 ;VARIABLE @(0)
1F37 BUFFER: DS 64 ;INPUT BUFFER
1F77 BUFEND: DS 1 ;BUFFER ENDS
1F78 STKLMT: DS 1 ;TOP LIMIT FOR STACK
; ORG 1400H
2000 ORG 2000H
2000 STACK: DS 0 ;STACK STARTS HERE
;
000D CR EQU 0DH
000A LF EQU 0AH
2Kバイトには収まっているけどその代償として? メッセージはなくなってしまっている。