8cc の移植 : C から Go へ
● 分割したコミットを C → Go に移植
● 労力的には
○ 「 Cで自力で再実装 / 写経 」が 90%
○ Go への移植は 10%
● これを5ヶ月半継続
● 基本文法はほとんどカバー
Slide 17
Slide 17 text
8cc の移植 : CとGoを同時に学ぶ
● 比較しながら学べる
static char *REGS[] = {"rdi", "rsi", "rdx", "rcx", "r8", "r9"};
var REGS = []string{"rdi", "rsi", "rdx","rcx", "r8", "r9"}
C
Go
Slide 18
Slide 18 text
8cc の移植 : CとGoを同時に学ぶ
for (;;) {
int c = get();
if (c == EOF) return;
if (c == ' ' || c == '\t')
continue;
for {
c, err := get()
if err != nil {
return
}
if c == ' ' || c == '\t' {
continue
}
C
Go
● 比較しながら学べる
case TMAP: // implemented as pointer
w = int64(Widthptr)
「 map のサイズは pointer のサイズと同じ 」
わかる〜〜 そうだよね〜〜
(自分のと同じ)
本家Go: mapのサイズ
Slide 42
Slide 42 text
本家Go: stringの実体
「 ポインタと文字列長の組 」
そうだったのか〜〜 (自分のとちょっと違う)
// note this is the runtime representation
// of the compilers strings.
//
// typedef struct
// {
// uchar array[8]; // pointer to data
// uchar nel[4]; // number of elements
// } String;
var sizeof_String int // runtime sizeof(String)
Slide 43
Slide 43 text
本家Go: sliceの大きさ
「sliceの大きさはsizeof_Array」
えっ?
case TSLICE:
if t.Elem() == nil {
break
}
w = int64(sizeof_Array)
Slide 44
Slide 44 text
本家Go: sliceの実体
// note this is the runtime representation
// of the compilers arrays.
//
// typedef struct
// {
// uchar array[8]; // pointer to data
// uchar nel[4]; // number of elements
// uchar cap[4]; // allocated number of elements
// } Array;
var array_array int // runtime offsetof(Array,array) - same for String
var array_nel int // runtime offsetof(Array,nel) - same for String
var array_cap int // runtime offsetof(Array,cap)
var sizeof_Array int // runtime sizeof(Array)
slice のことを array と呼んでいる?
命名が紛らわしいのでは? (歴史的事情?)