V8 javascript eingineのdslであるtorqueの話
V8 torque
View Slide
Name@brn (ꫬꅿ⨳ⵃ)Occupationؿٗٝزؒٝسؒٝآص،٥ط؎ذ؍ـؒٝآص،CompanyCyberagent ،سذؙأةآؔ AI MessengerOSSContributor of V8Abouthttp://info.b6n.ch
What is torque?V8ⰻ鿇דⵃ欽ׅח⡲DSLTypeScript괏ז俑岀ד葿ղ邌植ׅ
How does it works?torqueכ؝ٝػ؎ׁٕהCSA(CodeStubAssembler)ח㢌䳔ׁկCSAכفٓحزؿؓ٦يꬊ⣛㶷זIRד剑穄涸ח،إٝـٓח؝ٝػ؎ׁٕկ
Why V8 need torque?CSAכ剅ְגהַָ穠圓הְֲַַז׃וְ- ✲佦װְׅ- 僓כ㘗ָⰋגNode㘗חꟼ׆ⰻ鿇涸חכSmiהַIntPtrהַ㘗ָאְגְגծ♶侭さؒٓ٦ָ⳿װַׅկ- ⵖ䖴圓俑ָ铣חְֻ
function add100() {!let value = 0;!for (let i = 0; i < 100; i++) {!value += 1;!}!return value;!}!
TNode Add100(TNode context) {!TVARIABLE(var_value, MachineType::PointerRepresentation(),IntPtrConstant(0));!TVARIABLE(var_index, MachineType::PointerRepresentation(),IntPtrConstant(0));!!Label loop(this), after_loop(this);!!Branch(IntPtrGreaterThan(IntPtrConstant(100), var_index), &loop,&after_loop);!BIND(&loop);!{!var_a.Bind(IntPtrAdd(var_a, IntPtrConstant(1)));!Increment(&var_index, 1);!Branch(IntPtrGreaterThan(IntPtrConstant(100), var_index),!&loop, &after_loop);!}!BIND(&after_loop);!return var_value.value;!}!
macro Add100(): Smi {!let value: Smi = 0;!let len: Smi = 100;!!for (let i: Smi = 0; k < len; i = i + 1) {!value = value + 1;!}!return value;!}!
torque grammars㛇劤涸חכ♧菙涸ז䩛竲ֹ㘗鎉铂הずׄ״ֲז俑岀TypeScriptך㘗،ظذ٦ءّٝ罋ח׃גְָծDSLזךד׳ה暴婊ז俑岀㢳ְ
Type DefinitionTypeScriptך䕎ؒ؎ٔ،أה⡂גְָծֿכC++ך㘗הtorqueⰻ鿇ך䕎ׇ֮湡涸
type Object generates 'TNode';!type int32 generates 'TNode';!
External functionsV8ⰻ鿇חכׅדח㣐ꆀךِ٦ذ؍ٔذ؍ꟼ侧ָ㹀纏ׁגֶծⵃ欽ׅחextern䭷㹀㶨ָ㹀纏ׁגְ- macro CSAⰻ鿇ד㹀纏ׁגְِ٦ذ؍ٔذ؍وؙٗ- builtin V8ךbuiltins⟃♴ח֮ꟼ侧纇- runtime C++ד鎸鶢ׁًاحس
extern macro Print(Object);!!extern builtin ToObject(Context, Number): Object;!!extern runtime CreateDataProperty(!Context, Object, String, Object);!
Operatorstorqueכoperatorꟼ侧ה׃ג㹀纏ֿׅהָדֹ
extern operator "+" macro SmiAdd(Smi, Smi): Smi;!extern operator "-" macro SmiSub(Smi, Smi): Smi;!
CastCastכCSAךCastⵃ欽ָׅծ㣟侁׃㜥さחכGotoדٓكٕפ굲ע
cast(a) otherwise CastError!
LabelsCSAכההַז⡚ٖكٕז邌植זךדծif俑װfor俑瘝ךⵖ䖴圓俑גְזְկֿ邌植ׅךכׅץגLabelהGotoד֮կ
Branch(var_a, label1, label2)!!BIND(&label1);!Print("A");!!BIND(&label2);!Print("B");!
macro Foo(context: Context): Smi labelsBailout, CastError {!Goto Bailout;!}!
compiler::TNode FooFromDSLAssembler::Foo(!TNode p_context,!Label* label_Bailout_1,!Label* label_CastError_1) {!Goto(label_Bailout_1);!}!
WriteBarrierV8כ؝ٖٝؕٝز٥؎ًؙٝٔٝةٕGC琎דְךדծؔـآؙؑزפך،ؙإأךꥷחכWriteBarrierָ䗳갭ָֿCSAך㜥さחכ荈ⴓדWriteBarrier⢪ֲַNoBarrierד遤ַֻ鼅䫛׃זֽלזזְկtorqueדכ㼛勻涸חֿֿ荈⹛⻉ׅ✮㹀׃ְ
Compilation植㖈ךהֿػ٦؟٦כAntlrד剅ַגְ俑岀涸חכLL(1)דػ٦أ〳腉㼛勻涸חכ䩛剅ֹךػ٦؟ח׃ְ׃ְ
CompilationV8ךؽٕسفٗإأ⚥ח.tqؿ؋؎ٕךؽٕسָ饥ծך穠卓--from-dsl-gen.h/ccהְֲC++ؿ؋؎ָٕ欰䧭ׁׁחךؿ؋؎ָٕؽٕسׁغ؎شٔך♧鿇חז
.tq ~-from-dsl-gen.h/cc V8
SourceMaps植㖈ךהֿفٗزة؎فָծ--gdbjit-fullؔفءّٝדا٦أ⡘縧ךوحؾؚٝ׃גְ׃ְ
Summary؝ٝػ؎ٓך⚥חDSLאֻךכ״ֻ֮鑧ָծֿֿתדֹ׃鎉铂כ穠圓棆׃ְ
Reference- https://docs.google.com/presentation/d/1PlQEjS5xyJA-0GY8mjB4wr-pLyzFtdMRfhXczJJ2wic/edit#slide=id.g388aa7220e_2_348- https://github.com/v8/v8/blob/master/src/builtins/typed-array.tq