ときどきの雑記帖 RE* (新南口)
いつも手の中に
情報処理
今年の5月号くらいから、Amazonでの扱いがプリントレプリカのKindle版だけになってる?
久しぶりに(紙の方を)買おうかと思ったんだけど プリントレプリカはなあ… (持っている(使っている)端末の問題)
関数の戻り値とか
でいろいろと不満(「びみょいところ」)が述べられていた。 概ね納得するものではあるんだけど、 BASICに限った話ではないものもあって たとえば
- 変数の宣言と同じ行で代入ができない
- 関数(プロシージャ)の宣言方法が3種類ある
- 関数の戻り値を返す方法が「関数名と変数に値を代入」
- 関数の引数のデフォルトが参照渡し
- 等号が「==」ではなく「=」
- True = -1
- Integerの最大値が32767
- 条件の「and」「or」がショートサーキットじゃない
- ループ内で「continue」にあたる文がない
- ソースに大文字・小文字の区別がない
- インクリメント・デクリメントがない
- 複合代入演算子がない
- 除算の余りを求める演算子が「%」でなく「Mod」
- 除算の商(整数部分)を求める演算子「¥」がある
この辺りはPascalなどと共通しているものもあるよね(QBASICで取り込んだ?)とか、
過去からのしがらみがある(あった)しなあとか。
たとえばRETURN
というキーワードは以前からあったものなので
違う動作をするようにはしにくかっただろうし。
そう言えばこの人とは逆に、初めてCでプログラム書いていたときに 「真」が1(正確には not 0だけど)なのにびっくりした遠い記憶があるな。
あとdim
で変数宣言ってのは気にならないんですかね。
まあこれは「単語の意味」に注意をひかれなければそう言うものなのかもしれない。
OpenBSD has two new C compilers
- OpenBSD has two new C compilers: chibicc and kefir | Hacker News
- OpenBSD has two new C compilers: chibicc and kefir : programming
- Brian Robert Callahan
で名前の挙げられたkefirが気になったので(chibiccは以前から知ってたというのもあった) GitHub - protopopov1122/kefir: C17 compiler implementation from scratch を見たらなかなかに興味深かった。
Motivation & goals
The main motivation of the project is deeper understanding of C programming language, as well as practical experience in the broader scope of compiler implementation aspects. Based on this, following goals were set for the project:
- Self-sufficiency - project shall use minimal number of external dependencies. Runtime dependencies should include only C standard library and operating system APIs.
- Compliance with C17 standard - resulting product should be reasonably compliant with language standard. All intentional deviations and exceptions shall be described and justified.
- Compatibility with platform ABI - produced code should adhere ABI of target platform. It should be possible to transparently link it with code produced by commonly used compilers of the target platform.
- Reduced scope of the project - full-fledged implementation of C17 compiler is demanding task. Project scope shall be reduced so that implementation as a pet-project is feasible. For instance, standard library implementation is currently out-of-scope.
- Portability - compiler code itself should be easily portable across different environments. Currently, the development is concentrated on a single target platform, however it might be extended in future.
これ(Motivation & goals)もそうなんだけど
NON-goals
を明確に書いているところとか。
Following things are NON-goals:
- Performance - trying to outcompete well-established compiler backends, such as GCC backend or LLVM, is not reasonable, thus performance was never considered a goal, even though some improvements can be occasionally made. In fact, performance is deliberately sacrificed to facilitate implementation of other goals.
- Compatibility with other compiler extensions - C compilers are known to include different extensions that are not described by language standard. Some of those are implemented, however it is not project goal per se, thus there are no guarantees of extension compatibility.
704
つづき。
ふとWilks自伝を読み返したくなったのだけどそれはさておき。
まずはアーキテクチャについて簡単にメモ書き。
IBM 704 の持つレジスタは次の通りである。 アキュムレータ×1、38ビット 積・商レジスタ×1、36ビット デクリメントレジスタ×3、15ビット
アキュムレーターの38ビットは細かく見ると 36+2あるいは35+1+1+1に分けられる(符号bitなど)。
積・商レジスタ(MQ register)は名前からして 乗算命令で積の上位ワードが入ったり 除算命令で商が入ったりするものなのだろう (アキュムレーターに剰余?)。
デクリメントレジスタはいわゆるインデックスレジスター
(英語版の記述だとindex registers
なんだが…なぜ?)。
ところでここでも日本語版での意味不明部分があって
1962年に導入されたIBM 7094では、インデックス・レジスタの数を7つに増やし、一度に1つだけ選択された。 またはIBM 7094の互換モードで利用可能なように残された[18]。 「contents of address register」と「contents of decrement register」の略とされることもあるが、 IBM 704 にはユーザーがアクセスできるアドレスレジスタは存在しない。
というのは英語版ではこう。
The IBM 7094, introduced in 1962, increased the number of index registers to seven and only selected one at a time; the “or” behavior remains available in a compatibility mode of the IBM 7094.[12]
“or"の訳が…
というのはこのくらいにしておいて、 fort1.asmを眺めていると いかにもなラベルが見つかった。
COMPIL SXD 1XB0X,1 F2400770
SXD 2XB0X,2 F2400780
SXD LINK1,4 SAVE LINKAGE F2400790
PSE 96 TURN ALL SENSE LIGHTS OFF F2400800
REM C3000/ CALLS=DIAG,C0190,C0160,TEST..,SUBX00,TET00,TESTFX. 4F12274
REM C3000 PROCESSES SUBROUTINE AND FUNCTION STATEMENTS. 4F12275
C3500 CAL TXHOP 4F12276
STP C3003 4F12277
C3000 LXD EIFNO,4 EXAMINE INTERNAL FORMULA NO., AND 4F12278
TXL *+2,4,1 IF NOT THE 1ST STATEMENT, THEN 4F12279
REM C3300/ CALLS=C0390,C0190X,C0190,TEST..,ARITH,SUBX00. 4F12381
REM C3300 PROCESSES CALL STATEMENTS. 4F12382
C3300 TSX C0190,4 * IF 1ST CHARACTER OF NAME IS 4F12383
文字数の制限(たぶん)でCOMPILEがCOMPILになってしまっているのは お約束として、これはコンパイル本体の入口だろうか? コメントの記述を見るとここから色々呼び出しているみたいだし。
あ、いや
PROCESSES SUBROUTINE AND FUNCTION STATEMENTS.
これか?
ほかにはこんなのも。
LX100 HTR 14545,2,OR000+13 CLA. THESE WORDS F2404490
HTR 11494,6,OR000+26 STO. CONSTITUTE THE F2404500
LX102 HTR 14545,2,OR000+1 CLA. CODING F2404510
HTR 11538,6,OR000+13 SUB. SKELETONS, F2404520
HTR 5396,2,OR000+26 ADD. AND ARE F2404530
HTR 11494,6,OR000+26 SO0. CALLED UPON F2404540
LX105 HTR 13608,4,OR000+1 LDQ. BY THE LXC F2404550
HTR 18936,4,OR000+9 MPY. ACCORDING F2404560
TNX 6386,2,17 ALS. TO THE F2404570
HTR 11538,6,OR000+13 SUB. DIFFERENT F2404580
HTR 5396,2,OR000+26 ADD. COMPUTATIONS F2404590
HTR 11494,6,OR000+26 STO. REQUIRED. F2404600
これはコンパイラーが生成するコードの テンプレートとかスニペットとかスケルトンの類?
ここで使われているHTR という命令はHalt and TRansfer
なので「ふつーのコード」ではない(たぶん。おそらくコメントにある役目を果たすもの)。
これはラベルじゃなくてコメントだけど
REM M2 COMPILER CIT200 F3B11980
CIT200 STO E1C2 SAVE AC F3B11990
STQ E2C2 SAVE MQ F3B12000
SXD E3C2,1 SAVE IR 1 F3B12010
SXD E4C2,2 SAVE IR 2 F3B12020
LXD BBOX,2 2 S COMP. OF NO. OF WDS. IN BLOCK F3B12030
TXH CIT204,2,-100 COMPARE TO 100. F3B12040
TXL CIT204,2,0 LAST ENTRY F3B12050
WRS 146 SELECT TAPE 2 F3B12060
CLA TFRC0 TIFGO FILE REC. COUNT F3B12070
ADD M2CON+7 ADD 1 TO DECREMENT F3B12080
STO TFRC0 TIFGO FILE REC. COUNT F3B12090
LXA M2CON,1 ZERO IN IR 1 F3B12100
CIT201 CPY CIB2,1 OUTPUT AREA F3B12110
TXI CIT202,1,-1 SET COUNT FOR NEXT WORD F3B12120
CIT202 TXI CIT203,2,1 SET UP COUNT OF BLOCK F3B12130
CIT203 TXH CIT201,2,1 BACK T0 CONTINUE WRITING F3B12140
CIT204 LXA M2CON+3,1 COUNT 0F 4 IN IR 1 F3B12150
CLA M2CON+1 1 IN ACC F3B12160
STA CIT205 TO GET NEXT ENTRY F3B12170
CIT205 CLA 0,4 ADDRESS OF NEXT ENTRY F3B12180
STA CIT206 F3B12190
CIT206 CLA NEXT ENTRY F3B12200
STO CIB2,2 OUTPUT AREA F3B12210
CLA CIT205 ADDRESS F3B12220
ADD M2CON+1 ONE F3B12230
STA CIT205 RESTORE ADDRESS F3B12240
TXI CIT207,2,-1 DECREASE BLOCK COUNT F3B12250
CIT207 TIX CIT205,1,1 GET NEXT ENTRY F3BI2260
SXD BBOX,2 SAVE COUNT F3B12270
CLA E1C2 RESTORE AC F3B12280
LDQ E2C2 RESTORE MQ F3B12290
LXD E3C2,1 RESTORE IR 1 F3B12300
LXD E4C2,2 RESTORE IR 2 F3B12310
TRA 5,4 BACK TO MAIN ROUTINE F3B12320
こっちの方がコンパイラー本体っぽい?
こういうのも。
FILE47 IOD
RTT
HTR FIL4E3 RTT ERROR - BST TWICE ON SOURCE
WEF OBJECT WRITE 4TH FILE EOF
REW SOURCE
REW OBJECT
RTT
TXH
HTR FINAL STOP.
IOD
がわからんけど、
RTT がRedundancy Tape Test
で、これをしてから
WEF (Write End of File)して
REW (REWind)×2して
FINAL STOP.
とはここが全体の終端部分ぽい。
そう言えばFORTRANの
Fortran 入門: 知識として必要な過去の Fortran
1 行あたり 72 カラムまでの制限がある。
この「72」カラムって36×2から来てんじゃないの? と思わせる記述があったんだけど見失った😓