Exploring the TypeScript Compiler Part 5: JavaScript Madnessð«
æ¬èšäºã¯ tskaigi 2026 Day2ã®å¶çŽãšæä»£ããèªã¿è§£ãTypeScriptã³ã³ãã€ã©èšèšå²ã®å¢è£æ¹èšçã® Part 5ã§ãã
- Part 0: Overview
- Part 1: Why Go?
- Part 2: Inside the TypeScript Compiler
- Part 3: Why TypeScript?
- Part 4: Roslyn and the Red-Green Tree
- Part 5: JavaScript Madnessð«
- Part 6: What Changes with GoïŒComing soonïŒ
ååã¯åã Microsoft ãéçºããŠãã C#ã®ã³ã³ãã€ã© Roslyn ã«èšåãããšãã£ã¿çµ±åãããããã«å¿ èŠãªæ§è³ªããããå®çŸããããŒã¿æ§é ã§ããèµ€ç·æšã«ã€ããŠè§ŠããŸããã
immutable 㪠Green Tree ãšé å»¶çæã§ãã Red Tree ã«ãã£ãŠã次ã®ããšãå¯èœã«ãªããŸããã
- å®å šã«è€æ°ã®è§£æãåãã
- éå»ããŒãžã§ã³ã«ãæ»ãã
- ããŒããã§ããéãå ±æããã¡ã¢ãªã®æ¶è²»ãæãããã
- å¿ èŠãªæã«ã¯æèæ å ±ã«ã¢ã¯ã»ã¹ã§ãã
ã§ã¯ TypeScript ã³ã³ãã€ã©ãåãããã«ãããæ¡çšããã®ã§ããããããã¡ããçã㯠No ã§æçµçã«ã¯é¡äŒŒã®ãã®ãããŸããªãç¬ç¹ãªåœ¢ã«èœã¡çããŸããããã®å€ã㯠JavaScript ã®å¶çŽã«ãããã®ã§ãã
䞊åå®è¡æ©æ§ã®äžåš
TypeScript ãéçºãããŠãã2010幎é ã® JS ãšããã°ä»ãšã¯å
šãç°ãªããã®ã§ããES5ãåºãã°ããã®ææã§const ãlet, () =>ãPromiseãªã©ããããŸããã倧ããªè»¢æ©ãšãªã ES6ã¯ãã®5幎åŸã«ãªããŸãã
Node.js ã®ããŒãžã§ã³ã¯åœæ0.1 ~ 0.2ãããã§ Worker Thread API ããã¡ãããããŸãã1ã
åãæšãè€æ°ã®ã¹ã¬ããã§å ±æããŠäžŠåå®è¡ããããã®æ©æ§ããªãã£ãã®ã§ãåœæã® JS ã§ã¯ãã®ããã« immutable ãå³å®ããå¿ èŠæ§ãå°ããã£ããšããäºæ ããããŸããã
ã¡ã¢ãªæ¶è²»
JS ã¯éçåä»ãèšèªã«æ¯ã¹ãŠããŒã¿ã«ã®ã¡ã¢ãªæ¶è²»ã倧ãããªããã¡ãšããç¹ã§ãã
èµ€ç·æšèªäœã¯éåžžã«ã¡ã¢ãªå¹çãèããããŠäœãããŠããŸããGreen Node ã¯å°ããä¿ãããStructural Sharing ã§å ±æã§ãããããRed Tree ã¯é å»¶çæãããããã§ãã ããããå®è£ ãšãªããšèšèªéã§å®éã®ãµã€ãºã¯å·®ãåºãŠããŸãã
è¶ ç°¡ç¥åãã GreenTree ã® Node ãèããŠã¿ãŸããã2ãC#ã Rust ã§ã¯æ¬¡ã®ã³ãŒãã¯8bytes ã«ãããŸããŸãã
internal struct GreenNode {
public ushort Kind; // 2 bytes
public int Fullwidth; // 4 bytes
} // total 8 bytes (padding蟌ã¿)
pub struct GreenNode {
kind: u16, // 2 bytes
width: u32, // 4 bytes
} // total 8 bytes (padding蟌ã¿)
äžæ¹ã§åãããšã JS ã§ããããšãããšæ¬¡ã®ããã«ãªããŸãã
function GreenNode(kind, width) {
this.kind = kind; // number
this.width = width; // number
}
new GreenNode(kind, width);
çè ã®æå ã®ç°å¢(Node.js v26)ã ãšããã¯ã40bytes ãšãªããŸãã3ã
JS ã«ãããŠã¯ããªããã£ã以å€ã¯å šãŠãªããžã§ã¯ãã§ãããªããžã§ã¯ãã«ã¯ããããã£ã®å€ã«å ã㊠JS ãšã³ãžã³ã管çããããã®æ å ±(header)ãä»äžãããããããŒã¿ã«ã®ãµã€ãºã倧ãããªã£ãŠããŸããŸãã
ãã®äŸã®ããã«ãåãããšãããããšããæã« JavaScript ã ãšæ°åå€ãã¡ã¢ãªã䜿ãããšããããŸãã
ã¡ã¢ãªã¬ã€ã¢ãŠãå¶åŸ¡
éåžžãJS ã®ãªããžã§ã¯ãã§ã¯å€ã®é£ç¶é 眮ãéçºè ã现ããä¿èšŒã»å¶åŸ¡ã§ããŸãããäŸãã°ã次ã®ããã«é åãžæ ŒçŽãããšããŸãã
const nodes = [
{ kind: 1, pos: 0, text: "foo" },
{ kind: 1, pos: 4, text: "bar" },
];
ãšããŠããªããžã§ã¯ãæ¬äœããã®ãŸãŸäžŠã¶ã®ã§ã¯ãªãå®éã«ã¯ãªããžã§ã¯ããžã®åç §ã䞊ã¶ããšã«ãªããŸããå€ãžã®ã¢ã¯ã»ã¹ã®ãã³ã«ãã€ã³ã¿ã蟿ãå¿ èŠããã£ãããGC ã倿°ã®ç¬ç«ãªããžã§ã¯ãã远跡ãããªã©ã³ã¹ãã嵩ãã§ãããŸãã
ããã«é¢ããŠè©³ãã㯠Part 6 ã§è§ŠããŸãã
è£è¶³
ããŸããŸãªçç±ãæžããŠããŸããããçè 㯠MS ã®äººéã§ã¯ãªãéçºã«ãé¢ãã£ãŠããªãããããããŸã§ã®å 容ã¯ç§èŠã§ããäžæ¹ã2026幎ã«ãªã£ãŠå¥ã®èšäºã®ã³ã¡ã³ãæ¬ã«éèŠãªèšŒèšãæçš¿ããããã玹ä»ããŸãã(ãã£ããèšã£ãŠããæ¹åæ§ã¯åãã§ããã£ãããã)
C#ã®èšèª Designer ã§ TypeScript ã®åæã³ã³ãã€ã©ã®å®è£ ã«ãé¢ãã£ãŠãã人ç©ã ããã§ãã
Tree-sitter vs. Language Servers
èµ€ç·æšã䜿ããªãã£ãçç±ã«é¢ããŠã次ã®ããã«è¿°ã¹ãŠããŸãã
TypeScriptã®åæã³ã³ãã€ã©ãããã€ãæžããŸãããããã€ãã®çç±ãããèµ€ç·æšã䜿çšããŸããã§ããã
åœæã®ãšã³ãžã³ã«ãšã£ãŠãã®èšèšã§ã¯å¹ççã§ã¯ãããŸããã§ãããããã¯äž»ã«v8ãšChakra(IE/Edgeã®ä»¥åã®ãšã³ãžã³)ã®ãã¹ãã§ããã
red/greenã¯.netãæäŸããå€ãã®ãã®ã掻çšããŠéåžžã«å¹ççã§ããããšãã°ãæ§é äœããããã¯jsã«æ¬ ããŠãããããã³ã¹ããã¯ããã«é«ããªããŸãã詳ããã¯ããã¡ãã§æžããèµ€ç·æšã«é¢ããææžãã芧ãã ããã
åé¡é åã¯å°ãç°ãªããŸããRoslynã§ã¯ããã®èšèšã¯äžå€ã®ããŒã¿å ±æãç®çãšããéåžžã«åæäžŠè¡ã®ãã«ãã¹ã¬ããæ©èœã»ããã§ããã¹ã¬ããã1ã€ã§ããTS/JSã«ã¯ãåãæžå¿µã¯ãããŸããããã®ãããäžå€ã®ããŒã¿æ§é ãå¹ççã«äœæããå¿ èŠãæžããŸããã ãããããŒã¿æ§é ãmutableã«ããŠããããšã§ãåœæã®JavaScriptãšã³ãžã³ãšã®çžæ§ãè¯ããã€ã€ã倧ããªç ç²ãæããã«æžãã ãšããããšã§ãã
TSããŒãµãŒã¯ã€ã³ã¯ãªã¡ã³ã¿ã«ã§ãç§ãRoslynã®Incremental Parserã§èª¬æããŠããå 容ãšéåžžã«äŒŒãŠããŸãããã ããRedããªãŒã«çžåœããäœçœ®ã§åäœãããããäœçœ®ã芪ã®ãã€ã³ã¿ãæŽæ°ããããã«è¿œå ã®äœæ¥ãè¡ãå¿ èŠããããŸãã
èŠã¯ãšã³ãžã³æ§èœãæ¶è²»ãã¿ãŒã³ã®éãããç§ãã¡ãå¥ã®ã¢ãã«ãžãšå°ããã®ã§ãã
åœæã®çµè«
ãã®ããã«ãåœæã® JavaScript ã§ã¯èµ€ç·æšã®å©ç¹ãåŸã«ããä»èšèªããã¡ã¢ãªæ¶è²»ãå€ããã工倫ãå¿ èŠã§ãããããã§ TypeScript ã³ã³ãã€ã©ã¯ãPart2ã§è©³ãã解説ããæ¬¡ã®æ¹éãæ¡çšããŠããŸãã
- å³å¯ãª immutable ã¯å¿ èŠãªãã®ã§è«Šãã
- é å»¶ã§ã¯ãªã Bind æã«å šãŠã®ããŒãã«ãã®èŠªãã€ã³ã¿ããããããèšå®
- ã¡ã¢ãªæ¶è²»ã®æå¶ãšã¢ã¯ã»ã¹ã®é«éåã®ãããBinder 㯠Symbol ã SymbolTable ãäœããAST ããŒãã®
symbolãlocalsããåç §ã§ããããã«ãã - å·®åè§£æã§ã¯æ¢åã®ããŒããåå©çšãäœçœ®ã芪ãã€ã³ã¿ãçŽæ¥æŽæ°ããããã®ãããæŽæ°åã®æšããã®ãŸãŸä¿æããããšã¯ã§ããªã
ãããã®å·¥å€«ã«ãã£ãŠãããã³ã³ãã€ã©ãšããŠãåããããŒã«é£æºãã§ããŠãçŸå®çãªã¡ã¢ãªæ¶è²»å ã§ããçšåºŠã®å¿çé床ãåºããç¶æ ãå®çŸããŸããã
次å
ãã®ããã«ãJavaScript èªäœã®å¶çŽã«å¯Ÿå¿ããããã®å·¥å€«ãéããŠããŸãããTypeScript ã³ã³ãã€ã©ã«ã¯ä»å玹ä»ãããã®ä»¥å€ã«ã極éãŸã§ JS ç°å¢ã«æé©åããããã®ããããªãã¯ããã¯ãããããå«ãŸããŠããŸãã
ããããã¿ãªããç¥ã£ãŠã®éãæ°å¹Žåããå€§èŠæš¡ TS ãããžã§ã¯ãã§ã¯å¿çã®é ãã typecheck ã«ãããæéã®é·ããæ¿ããã¡ã¢ãªæ¶è²»ãåé¡èŠãããŠããŸãããããã现ããæé©åããŠããæ±ããã®ã®èŠæš¡ã倧ãããªã£ãŠéçã«éãããããGo port ãžãšè³ããŸãã
次åã¯"Go ã ããéããªã£ã"ããããçè§£ãæ·±ããããã«å ·äœçã«äœãæ¹åãããã®ãã远ããŸãã
Part 6: What Changes with GoïŒComing soonïŒãžç¶ããŸãã