xbintsc 0.5.22 → 0.5.31

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (391) hide show
  1. package/AGENTS.md +12 -3
  2. package/README.md +46 -11
  3. package/README.zh-CN.md +32 -6
  4. package/dist/scripts/support-matrix.d.ts +18 -0
  5. package/dist/scripts/support-matrix.js +141 -0
  6. package/dist/scripts/support-matrix.js.map +1 -0
  7. package/dist/src/ast/common.d.ts +2 -2
  8. package/dist/src/ast/declarations.d.ts +7 -1
  9. package/dist/src/ast/expressions.d.ts +5 -0
  10. package/dist/src/ast/kinds.d.ts +2 -0
  11. package/dist/src/ast/kinds.js +2 -0
  12. package/dist/src/ast/kinds.js.map +1 -1
  13. package/dist/src/binder/binder.d.ts +2 -1
  14. package/dist/src/binder/binder.js +2 -0
  15. package/dist/src/binder/binder.js.map +1 -1
  16. package/dist/src/binder/declarations.d.ts +9 -0
  17. package/dist/src/binder/declarations.js +64 -0
  18. package/dist/src/binder/declarations.js.map +1 -1
  19. package/dist/src/binder/references.js +85 -3
  20. package/dist/src/binder/references.js.map +1 -1
  21. package/dist/src/binder/types.d.ts +32 -0
  22. package/dist/src/binder/types.js.map +1 -1
  23. package/dist/src/canonical.d.ts +29 -0
  24. package/dist/src/canonical.js +35 -0
  25. package/dist/src/canonical.js.map +1 -0
  26. package/dist/src/checker/assignability.d.ts +13 -0
  27. package/dist/src/checker/assignability.js +146 -0
  28. package/dist/src/checker/assignability.js.map +1 -0
  29. package/dist/src/checker/calls.d.ts +13 -0
  30. package/dist/src/checker/calls.js +127 -0
  31. package/dist/src/checker/calls.js.map +1 -0
  32. package/dist/src/checker/checker.d.ts +26 -0
  33. package/dist/src/checker/checker.js +31 -0
  34. package/dist/src/checker/checker.js.map +1 -0
  35. package/dist/src/checker/declarations.d.ts +9 -0
  36. package/dist/src/checker/declarations.js +15 -0
  37. package/dist/src/checker/declarations.js.map +1 -0
  38. package/dist/src/checker/flow.d.ts +21 -0
  39. package/dist/src/checker/flow.js +241 -0
  40. package/dist/src/checker/flow.js.map +1 -0
  41. package/dist/src/checker/globals.d.ts +9 -0
  42. package/dist/src/checker/globals.js +29 -0
  43. package/dist/src/checker/globals.js.map +1 -0
  44. package/dist/src/checker/source.d.ts +38 -0
  45. package/dist/src/checker/source.js +48 -0
  46. package/dist/src/checker/source.js.map +1 -0
  47. package/dist/src/checker/type-infer.d.ts +18 -0
  48. package/dist/src/checker/type-infer.js +173 -0
  49. package/dist/src/checker/type-infer.js.map +1 -0
  50. package/dist/src/checker/type-model.d.ts +73 -0
  51. package/dist/src/checker/type-model.js +151 -0
  52. package/dist/src/checker/type-model.js.map +1 -0
  53. package/dist/src/checker/type-system.d.ts +58 -0
  54. package/dist/src/checker/type-system.js +569 -0
  55. package/dist/src/checker/type-system.js.map +1 -0
  56. package/dist/src/checker/typecheck-types.d.ts +22 -0
  57. package/dist/src/checker/typecheck-types.js +109 -0
  58. package/dist/src/checker/typecheck-types.js.map +1 -0
  59. package/dist/src/checker/typecheck.d.ts +62 -0
  60. package/dist/src/checker/typecheck.js +574 -0
  61. package/dist/src/checker/typecheck.js.map +1 -0
  62. package/dist/src/checker/undefined.d.ts +14 -0
  63. package/dist/src/checker/undefined.js +32 -0
  64. package/dist/src/checker/undefined.js.map +1 -0
  65. package/dist/src/checker/walk.d.ts +10 -0
  66. package/dist/src/checker/walk.js +15 -0
  67. package/dist/src/checker/walk.js.map +1 -0
  68. package/dist/src/cli/help.d.ts +7 -0
  69. package/dist/src/cli/help.js +64 -0
  70. package/dist/src/cli/help.js.map +1 -0
  71. package/dist/src/cli/hints.js +13 -1
  72. package/dist/src/cli/hints.js.map +1 -1
  73. package/dist/src/cli/main.js +12 -48
  74. package/dist/src/cli/main.js.map +1 -1
  75. package/dist/src/codegen/generator/calls/access.js +8 -8
  76. package/dist/src/codegen/generator/calls/access.js.map +1 -1
  77. package/dist/src/codegen/generator/calls/invocation.js +9 -4
  78. package/dist/src/codegen/generator/calls/invocation.js.map +1 -1
  79. package/dist/src/codegen/generator/calls/super.d.ts +9 -1
  80. package/dist/src/codegen/generator/calls/super.js +56 -5
  81. package/dist/src/codegen/generator/calls/super.js.map +1 -1
  82. package/dist/src/codegen/generator/context.d.ts +13 -2
  83. package/dist/src/codegen/generator/context.js +25 -19
  84. package/dist/src/codegen/generator/context.js.map +1 -1
  85. package/dist/src/codegen/generator/debug.js +2 -1
  86. package/dist/src/codegen/generator/debug.js.map +1 -1
  87. package/dist/src/codegen/generator/expressions/primary.d.ts +4 -1
  88. package/dist/src/codegen/generator/expressions/primary.js +68 -8
  89. package/dist/src/codegen/generator/expressions/primary.js.map +1 -1
  90. package/dist/src/codegen/generator/generator.js +11 -1
  91. package/dist/src/codegen/generator/generator.js.map +1 -1
  92. package/dist/src/codegen/generator/module.d.ts +2 -0
  93. package/dist/src/codegen/generator/module.js +62 -26
  94. package/dist/src/codegen/generator/module.js.map +1 -1
  95. package/dist/src/codegen/generator/state.d.ts +11 -1
  96. package/dist/src/codegen/generator/state.js.map +1 -1
  97. package/dist/src/codegen/generator/statements/variables.js +20 -3
  98. package/dist/src/codegen/generator/statements/variables.js.map +1 -1
  99. package/dist/src/codegen/generator/tables.d.ts +2 -0
  100. package/dist/src/codegen/generator/tables.js +4 -0
  101. package/dist/src/codegen/generator/tables.js.map +1 -1
  102. package/dist/src/driver/build-key.d.ts +2 -0
  103. package/dist/src/driver/build-key.js +1 -0
  104. package/dist/src/driver/build-key.js.map +1 -1
  105. package/dist/src/driver/bundler/graph.js +5 -1
  106. package/dist/src/driver/bundler/graph.js.map +1 -1
  107. package/dist/src/driver/bundler/merge.js +16 -1
  108. package/dist/src/driver/bundler/merge.js.map +1 -1
  109. package/dist/src/driver/bundler/types.d.ts +12 -0
  110. package/dist/src/driver/compiler.d.ts +1 -1
  111. package/dist/src/driver/compiler.js +4 -0
  112. package/dist/src/driver/compiler.js.map +1 -1
  113. package/dist/src/driver/fingerprint.js +2 -1
  114. package/dist/src/driver/fingerprint.js.map +1 -1
  115. package/dist/src/driver/frontend.d.ts +8 -6
  116. package/dist/src/driver/frontend.js +4 -0
  117. package/dist/src/driver/frontend.js.map +1 -1
  118. package/dist/src/driver/options.d.ts +6 -0
  119. package/dist/src/driver/version.d.ts +1 -1
  120. package/dist/src/driver/version.js +1 -1
  121. package/dist/src/extensions/catalog.js +2 -1
  122. package/dist/src/extensions/catalog.js.map +1 -1
  123. package/dist/src/extensions/gui/html.js +20 -6
  124. package/dist/src/extensions/gui/html.js.map +1 -1
  125. package/dist/src/extensions/gui/index.js +63 -0
  126. package/dist/src/extensions/gui/index.js.map +1 -1
  127. package/dist/src/extensions/media/index.d.ts +27 -0
  128. package/dist/src/extensions/media/index.js +60 -0
  129. package/dist/src/extensions/media/index.js.map +1 -0
  130. package/dist/src/extensions/registry.d.ts +50 -0
  131. package/dist/src/extensions/registry.js +26 -0
  132. package/dist/src/extensions/registry.js.map +1 -1
  133. package/dist/src/index.d.ts +2 -0
  134. package/dist/src/index.js +2 -0
  135. package/dist/src/index.js.map +1 -1
  136. package/dist/src/parser/declarations/classes.js +7 -0
  137. package/dist/src/parser/declarations/classes.js.map +1 -1
  138. package/dist/src/parser/expressions.js +14 -1
  139. package/dist/src/parser/expressions.js.map +1 -1
  140. package/dist/src/parser/literals.js +6 -2
  141. package/dist/src/parser/literals.js.map +1 -1
  142. package/dist/tests/binder/binder.test.js +29 -0
  143. package/dist/tests/binder/binder.test.js.map +1 -1
  144. package/dist/tests/canonical.test.d.ts +1 -0
  145. package/dist/tests/canonical.test.js +19 -0
  146. package/dist/tests/canonical.test.js.map +1 -0
  147. package/dist/tests/checker/checker.test.d.ts +1 -0
  148. package/dist/tests/checker/checker.test.js +245 -0
  149. package/dist/tests/checker/checker.test.js.map +1 -0
  150. package/dist/tests/cli/check.test.js +20 -0
  151. package/dist/tests/cli/check.test.js.map +1 -1
  152. package/dist/tests/cli/hints.test.js +15 -0
  153. package/dist/tests/cli/hints.test.js.map +1 -1
  154. package/dist/tests/cli/process.test.js +12 -0
  155. package/dist/tests/cli/process.test.js.map +1 -1
  156. package/dist/tests/conformance/matrix.test.d.ts +6 -0
  157. package/dist/tests/conformance/matrix.test.js +23 -0
  158. package/dist/tests/conformance/matrix.test.js.map +1 -0
  159. package/dist/tests/conformance/test262/manifest.d.ts +115 -0
  160. package/dist/tests/conformance/test262/manifest.js +257 -0
  161. package/dist/tests/conformance/test262/manifest.js.map +1 -0
  162. package/dist/tests/conformance/test262.test.d.ts +11 -0
  163. package/dist/tests/conformance/test262.test.js +74 -0
  164. package/dist/tests/conformance/test262.test.js.map +1 -0
  165. package/dist/tests/docs/structure.test.js +9 -11
  166. package/dist/tests/docs/structure.test.js.map +1 -1
  167. package/dist/tests/e2e/child-process.test.js +3 -2
  168. package/dist/tests/e2e/child-process.test.js.map +1 -1
  169. package/dist/tests/e2e/compile-builtins.test.js +21 -0
  170. package/dist/tests/e2e/compile-builtins.test.js.map +1 -1
  171. package/dist/tests/e2e/compile-objects-classes.test.js +54 -0
  172. package/dist/tests/e2e/compile-objects-classes.test.js.map +1 -1
  173. package/dist/tests/e2e/differential-syntax.test.d.ts +5 -0
  174. package/dist/tests/e2e/differential-syntax.test.js +95 -0
  175. package/dist/tests/e2e/differential-syntax.test.js.map +1 -0
  176. package/dist/tests/e2e/differential-values.test.js +15 -0
  177. package/dist/tests/e2e/differential-values.test.js.map +1 -1
  178. package/dist/tests/e2e/gui-browser.test.d.ts +13 -0
  179. package/dist/tests/e2e/gui-browser.test.js +163 -0
  180. package/dist/tests/e2e/gui-browser.test.js.map +1 -0
  181. package/dist/tests/e2e/gui-example-browser.test.js +2 -2
  182. package/dist/tests/e2e/gui-example-browser.test.js.map +1 -1
  183. package/dist/tests/e2e/gui-example-canvas.test.js +8 -5
  184. package/dist/tests/e2e/gui-example-canvas.test.js.map +1 -1
  185. package/dist/tests/e2e/gui-example-svg.test.js +4 -3
  186. package/dist/tests/e2e/gui-example-svg.test.js.map +1 -1
  187. package/dist/tests/e2e/gui-example.test.js +4 -3
  188. package/dist/tests/e2e/gui-example.test.js.map +1 -1
  189. package/dist/tests/e2e/gui-helpers.d.ts +3 -0
  190. package/dist/tests/e2e/gui-helpers.js +6 -3
  191. package/dist/tests/e2e/gui-helpers.js.map +1 -1
  192. package/dist/tests/e2e/gui-media-disabled.test.d.ts +9 -0
  193. package/dist/tests/e2e/gui-media-disabled.test.js +42 -0
  194. package/dist/tests/e2e/gui-media-disabled.test.js.map +1 -0
  195. package/dist/tests/e2e/gui-media.test.d.ts +6 -4
  196. package/dist/tests/e2e/gui-media.test.js +20 -16
  197. package/dist/tests/e2e/gui-media.test.js.map +1 -1
  198. package/dist/tests/e2e/harness.d.ts +9 -0
  199. package/dist/tests/e2e/harness.js +14 -2
  200. package/dist/tests/e2e/harness.js.map +1 -1
  201. package/dist/tests/e2e/native-extensions.test.js +2 -1
  202. package/dist/tests/e2e/native-extensions.test.js.map +1 -1
  203. package/dist/tests/e2e/property-descriptors.test.js +20 -0
  204. package/dist/tests/e2e/property-descriptors.test.js.map +1 -1
  205. package/dist/tests/e2e/unicode-output.test.d.ts +16 -0
  206. package/dist/tests/e2e/unicode-output.test.js +67 -0
  207. package/dist/tests/e2e/unicode-output.test.js.map +1 -0
  208. package/dist/tests/e2e/weak-collections.test.js +16 -2
  209. package/dist/tests/e2e/weak-collections.test.js.map +1 -1
  210. package/dist/tests/extensions/media.test.d.ts +1 -0
  211. package/dist/tests/extensions/media.test.js +58 -0
  212. package/dist/tests/extensions/media.test.js.map +1 -0
  213. package/dist/tests/extensions/registry.test.js +8 -0
  214. package/dist/tests/extensions/registry.test.js.map +1 -1
  215. package/dist/tests/helpers.d.ts +1 -0
  216. package/dist/tests/helpers.js +1 -0
  217. package/dist/tests/helpers.js.map +1 -1
  218. package/dist/tests/lexer/identifiers.test.js +12 -0
  219. package/dist/tests/lexer/identifiers.test.js.map +1 -1
  220. package/dist/tests/lexer/scanner.test.js +8 -0
  221. package/dist/tests/lexer/scanner.test.js.map +1 -1
  222. package/dist/tests/lexer/strings.test.js +30 -0
  223. package/dist/tests/lexer/strings.test.js.map +1 -1
  224. package/dist/tests/parser/declarations.test.js +20 -0
  225. package/dist/tests/parser/declarations.test.js.map +1 -1
  226. package/dist/tests/parser/expressions.test.js +36 -0
  227. package/dist/tests/parser/expressions.test.js.map +1 -1
  228. package/dist/tests/platform.d.ts +32 -0
  229. package/dist/tests/platform.js +40 -0
  230. package/dist/tests/platform.js.map +1 -0
  231. package/dist/tests/platform.test.d.ts +12 -0
  232. package/dist/tests/platform.test.js +51 -0
  233. package/dist/tests/platform.test.js.map +1 -0
  234. package/dist/tests/version.test.js +4 -4
  235. package/dist/tests/version.test.js.map +1 -1
  236. package/doc/ai/README.md +10 -4
  237. package/doc/ai/build-recipe.md +1 -0
  238. package/doc/ai/cli.md +18 -6
  239. package/doc/ai/contributing.md +59 -2
  240. package/doc/ai/extensions.md +46 -23
  241. package/doc/ai/language-support.md +25 -16
  242. package/doc/ai/troubleshooting.md +9 -0
  243. package/doc/ai/zh-CN/README.md +9 -4
  244. package/doc/ai/zh-CN/build-recipe.md +1 -0
  245. package/doc/ai/zh-CN/cli.md +14 -4
  246. package/doc/ai/zh-CN/contributing.md +49 -3
  247. package/doc/ai/zh-CN/extensions.md +29 -8
  248. package/doc/ai/zh-CN/language-support.md +23 -14
  249. package/doc/ai/zh-CN/troubleshooting.md +8 -0
  250. package/doc/gui/api.md +45 -0
  251. package/doc/gui/build.md +37 -21
  252. package/doc/gui/known-issues.md +17 -6
  253. package/doc/gui/media.md +26 -11
  254. package/doc/gui/runtime.md +18 -0
  255. package/doc/gui-scripts.md +7 -0
  256. package/doc/gui.md +43 -33
  257. package/doc/implemented/binder.md +2 -0
  258. package/doc/implemented/checker.md +117 -0
  259. package/doc/implemented/cli.md +13 -1
  260. package/doc/implemented/codegen.md +3 -2
  261. package/doc/implemented/driver.md +2 -2
  262. package/doc/implemented/operators.md +2 -1
  263. package/doc/implemented/parser.md +3 -2
  264. package/doc/implemented/pipeline.md +8 -1
  265. package/doc/implemented/stdlib.md +2 -1
  266. package/doc/implemented/tests.md +3 -1
  267. package/doc/implemented.md +2 -0
  268. package/doc/npm-package.md +417 -0
  269. package/doc/requirements.md +4 -1
  270. package/doc/support-matrix.md +83 -0
  271. package/doc/unimplemented/classes.md +3 -0
  272. package/doc/unimplemented/deviations.md +3 -2
  273. package/doc/unimplemented/toolchain.md +1 -1
  274. package/doc/unimplemented/types.md +24 -8
  275. package/doc/unimplemented.md +1 -1
  276. package/doc/zh-CN/gui/api.md +41 -0
  277. package/doc/zh-CN/gui/build.md +28 -16
  278. package/doc/zh-CN/gui/known-issues.md +13 -5
  279. package/doc/zh-CN/gui/media.md +21 -10
  280. package/doc/zh-CN/gui/runtime.md +16 -0
  281. package/doc/zh-CN/gui-scripts.md +5 -0
  282. package/doc/zh-CN/gui.md +37 -32
  283. package/doc/zh-CN/implemented/binder.md +2 -0
  284. package/doc/zh-CN/implemented/checker.md +99 -0
  285. package/doc/zh-CN/implemented/cli.md +12 -1
  286. package/doc/zh-CN/implemented/codegen.md +3 -2
  287. package/doc/zh-CN/implemented/driver.md +2 -2
  288. package/doc/zh-CN/implemented/operators.md +1 -1
  289. package/doc/zh-CN/implemented/parser.md +3 -2
  290. package/doc/zh-CN/implemented/pipeline.md +3 -1
  291. package/doc/zh-CN/implemented/stdlib.md +2 -1
  292. package/doc/zh-CN/implemented/tests.md +3 -1
  293. package/doc/zh-CN/implemented.md +2 -0
  294. package/doc/zh-CN/npm-package.md +391 -0
  295. package/doc/zh-CN/post/announce.md +47 -47
  296. package/doc/zh-CN/requirements.md +4 -1
  297. package/doc/zh-CN/support-matrix.md +82 -0
  298. package/doc/zh-CN/unimplemented/classes.md +3 -0
  299. package/doc/zh-CN/unimplemented/deviations.md +3 -2
  300. package/doc/zh-CN/unimplemented/toolchain.md +1 -1
  301. package/doc/zh-CN/unimplemented/types.md +16 -6
  302. package/doc/zh-CN/unimplemented.md +1 -1
  303. package/llms.txt +4 -1
  304. package/package.json +3 -1
  305. package/runtime/ext_gui/audio.cpp +316 -0
  306. package/runtime/ext_gui/browser.cpp +547 -0
  307. package/runtime/ext_gui/browser_escape.cpp +85 -0
  308. package/runtime/ext_gui/browser_loop.cpp +83 -0
  309. package/runtime/ext_gui/canvas.cpp +9 -3
  310. package/runtime/ext_gui/canvas_raster.cpp +19 -1
  311. package/runtime/ext_gui/dom_api.cpp +36 -0
  312. package/runtime/ext_gui/dom_api_document.cpp +96 -5
  313. package/runtime/ext_gui/dom_api_events.cpp +20 -0
  314. package/runtime/ext_gui/dom_api_internal.h +19 -0
  315. package/runtime/ext_gui/dom_api_proto.cpp +6 -0
  316. package/runtime/ext_gui/gui.cpp +90 -23
  317. package/runtime/ext_gui/gui_engine.h +44 -0
  318. package/runtime/ext_gui/gui_media.cpp +69 -2
  319. package/runtime/ext_gui/media.cpp +34 -488
  320. package/runtime/ext_gui/media.h +54 -19
  321. package/runtime/ext_gui/media_api.h +65 -0
  322. package/runtime/ext_gui/window.cpp +9 -0
  323. package/runtime/ext_media/media.cpp +507 -0
  324. package/runtime/ext_media/media_bridge.c +35 -0
  325. package/runtime/ext_node/path/path.c +7 -7
  326. package/runtime/ext_node/url/url.c +4 -2
  327. package/runtime/rt.h +15 -0
  328. package/runtime/xt_constructors.c +2 -1
  329. package/runtime/xt_containers/objects.inc +22 -2
  330. package/runtime/xt_io/exception.inc +4 -2
  331. package/runtime/xt_stdlib/math.inc +62 -0
  332. package/runtime/xt_stdlib2/date.inc +7 -1
  333. package/runtime/xt_stdlib2/objects.inc +14 -0
  334. package/scripts/build-gui.ts +6 -72
  335. package/scripts/build-media.ts +245 -0
  336. package/scripts/support-matrix.ts +167 -0
  337. package/src/ast/common.ts +2 -0
  338. package/src/ast/declarations.ts +12 -1
  339. package/src/ast/expressions.ts +6 -0
  340. package/src/ast/kinds.ts +2 -0
  341. package/src/binder/binder.ts +3 -0
  342. package/src/binder/declarations.ts +70 -0
  343. package/src/binder/references.ts +84 -3
  344. package/src/binder/types.ts +30 -0
  345. package/src/canonical.ts +37 -0
  346. package/src/checker/assignability.ts +134 -0
  347. package/src/checker/calls.ts +135 -0
  348. package/src/checker/checker.ts +47 -0
  349. package/src/checker/declarations.ts +26 -0
  350. package/src/checker/flow.ts +236 -0
  351. package/src/checker/globals.ts +40 -0
  352. package/src/checker/source.ts +53 -0
  353. package/src/checker/type-infer.ts +185 -0
  354. package/src/checker/type-model.ts +212 -0
  355. package/src/checker/type-system.ts +578 -0
  356. package/src/checker/typecheck-types.ts +112 -0
  357. package/src/checker/typecheck.ts +586 -0
  358. package/src/checker/undefined.ts +43 -0
  359. package/src/checker/walk.ts +16 -0
  360. package/src/cli/help.ts +65 -0
  361. package/src/cli/hints.ts +13 -1
  362. package/src/cli/main.ts +12 -49
  363. package/src/codegen/generator/calls/access.ts +8 -8
  364. package/src/codegen/generator/calls/invocation.ts +8 -5
  365. package/src/codegen/generator/calls/super.ts +67 -5
  366. package/src/codegen/generator/context.ts +31 -19
  367. package/src/codegen/generator/debug.ts +2 -1
  368. package/src/codegen/generator/expressions/primary.ts +84 -13
  369. package/src/codegen/generator/generator.ts +11 -1
  370. package/src/codegen/generator/module.ts +65 -24
  371. package/src/codegen/generator/state.ts +11 -1
  372. package/src/codegen/generator/statements/variables.ts +20 -3
  373. package/src/codegen/generator/tables.ts +5 -0
  374. package/src/driver/build-key.ts +3 -0
  375. package/src/driver/bundler/graph.ts +6 -2
  376. package/src/driver/bundler/merge.ts +14 -1
  377. package/src/driver/bundler/types.ts +13 -0
  378. package/src/driver/compiler.ts +5 -1
  379. package/src/driver/fingerprint.ts +2 -1
  380. package/src/driver/frontend.ts +13 -2
  381. package/src/driver/options.ts +6 -0
  382. package/src/driver/version.ts +1 -1
  383. package/src/extensions/catalog.ts +2 -1
  384. package/src/extensions/gui/html.ts +23 -10
  385. package/src/extensions/gui/index.ts +65 -0
  386. package/src/extensions/media/index.ts +67 -0
  387. package/src/extensions/registry.ts +72 -0
  388. package/src/index.ts +2 -0
  389. package/src/parser/declarations/classes.ts +7 -0
  390. package/src/parser/expressions.ts +13 -1
  391. package/src/parser/literals.ts +6 -2
@@ -30,7 +30,7 @@
30
30
 
31
31
  ## 其他表达式运算符
32
32
 
33
- - 逗号表达式 `,`
33
+ - 逗号表达式 `,`(降级为 `SequenceExpression`:从左到右求值每个操作数,结果为最后一个)
34
34
  - `in` 运算符(`key in obj`,映射 `xt_in`)
35
35
  - `delete obj.key` / `delete obj[key]`(映射 `xt_delete`)
36
36
  - `instanceof`(映射 `xt_instance_of`,沿原型链判断)
@@ -10,7 +10,7 @@
10
10
 
11
11
  - 变量声明:`var` / `let` / `const`,支持多声明符 `const a = 1, b = 2;`
12
12
  - 函数声明、函数表达式和方法,含 `async` 修饰、生成器(`function*`、`yield`、`yield*`、`.next`/`.throw`/`.return`)与异步生成器(`async function*`、`for await...of`)
13
- - `class` 声明 / 类表达式(构造函数、字段、方法、`static`、`extends`)
13
+ - `class` 声明 / 类表达式(构造函数、字段、方法、`static`、`static { ... }` 静态块、`extends`)
14
14
  - `if` / `else`
15
15
  - `while`、`do...while`
16
16
  - `for`(初始化、条件、增量均可省略)
@@ -27,8 +27,9 @@
27
27
  - 全部常见运算符及优先级 / 结合性(见[运算符](./operators.md))
28
28
  - 赋值表达式与全部复合赋值(见[运算符](./operators.md))
29
29
  - 条件(三元)表达式 `a ? b : c`
30
+ - 逗号(序列)表达式 `a, b, c`(可用于 `for` 头、括号组与表达式语句)
30
31
  - 箭头函数 `() => expr` / `() => { ... }`(含类型参数、返回类型注解)
31
- - 函数表达式 `function () {}` 与命名函数表达式 `function g() {}`
32
+ - 函数表达式 `function () {}` 与命名函数表达式 `function g() {}`(也支持 `async function` 表达式)
32
33
  - 调用表达式 `f(...)`、成员访问 `a.b`、元素访问 `a[i]`
33
34
  - 数组字面量 `[1, 2]`、稀疏数组 elision、展开 `[...a]`(也支持字符串、`Map`、`Set`)
34
35
  - 对象字面量 `{ a: 1 }`、简写属性 `{ a }`、方法简写 `{ m() {} }`、getter/setter 简写 `{ get x() {} }` / `{ set x(v) {} }`、计算属性名 `{ [expr]: 1 }`、对象展开 `{ ...obj }`
@@ -21,5 +21,7 @@ source.ts
21
21
  ```
22
22
 
23
23
  - 前端与后端、运行时、扩展完全解耦。
24
- - 流程由 `src/driver/compiler.ts` 串起:`读取 → 解析 → 绑定 → IR → 目标文件 → 链接`。前端位于 `src/driver/frontend.ts`,缓存键位于 `src/driver/build-key.ts`,运行时编译位于 `src/driver/runtime-objects.ts`,平台产物位于 `src/driver/app-artifacts.ts`。
24
+ - 流程由 `src/driver/compiler.ts` 串起:`读取 → 解析 → 绑定 → 检查 → IR → 目标文件 → 链接`。前端位于 `src/driver/frontend.ts`,缓存键位于 `src/driver/build-key.ts`,运行时编译位于 `src/driver/runtime-objects.ts`,平台产物位于 `src/driver/app-artifacts.ts`。
25
+ - [语义检查](./checker.md)(`src/checker/`)在绑定与代码生成之间运行,`--no-check` 可跳过。它把无需推断的检查(未定义名、重复声明、实参个数)与一个小型结构化类型模型结合起来(确定的可赋值性、属性形状、简单泛型与流收窄);类型语法随后仍然被擦除。
25
26
  - **自举**:`xbintsc` 可编译自身前端。用编译器构建 `src/cli/main.ts` 可得到可用的 `xbintsc` 二进制,且该二进制再自编译时产出的 LLVM IR 逐字节一致(源码 ≡ 第 1 代 ≡ 第 2 代 ≡ 第 3 代)。运行时仍为手写 C。
27
+ - **规范产物**:所有逐字节比较的产物在所有宿主上使用同一种编码。`src/canonical.ts` 定义 IR/调试信息/指纹的路径分隔符(`/`)与换行(LF),原生路径进入产物时用 `artifactPath()` 转换;运行时在渲染 `path` 结果与 `file://` URL 时使用 `XT_ARTIFACT_PATH_SEPARATOR`(`runtime/rt.h`)。面向用户的原生路径——诊断、`import.meta.filename`、`process.cwd()`——保留宿主分隔符,与 Node 一致。
@@ -13,7 +13,7 @@
13
13
  ## 对象
14
14
 
15
15
  - `Object.keys` / `values` / `entries` / `assign` / `getOwnPropertyNames` / `groupBy`,对象展开 `{...obj}`。
16
- - `Object.defineProperty` / `getOwnPropertyDescriptor(s)` —— 数据属性与访问器属性;属性标志会被报告,但后续写入/枚举尚未强制执行。
16
+ - `Object.defineProperty` / `defineProperties` / `getOwnPropertyDescriptor(s)` —— 数据属性与访问器属性,可单个也可批量定义;属性标志会被报告,但后续写入/枚举尚未强制执行。
17
17
  - `Object.freeze` / `is_frozen` / `from_entries`、`Object.getPrototypeOf`。
18
18
  - `Object.prototype`:`hasOwnProperty` / `toString` / `valueOf` / `isPrototypeOf` / `propertyIsEnumerable` / `__proto__`;`Object.getPrototypeOf({}) === Object.prototype`。
19
19
  - 一等公民内建构造器(`const A = Array`、`new A(...)`、`A.isArray`、`x instanceof A`)见[代码生成](./codegen.md)。
@@ -30,6 +30,7 @@
30
30
  - 数字格式化与强制转换与 Node 一致:`toFixed` / `toPrecision` / `toExponential`、十六 / 八 / 二进制解析,以及完整的 `+` / 关系运算 `ToPrimitive` 规则。这些由差分测试覆盖。
31
31
  - `BigInt` 字面量与值:任意精度算术、位运算与移位、比较、`toString(radix)`、`BigInt()`、`BigInt.asIntN` / `BigInt.asUintN`。
32
32
  - `Math`:完整函数与常量。
33
+ - `Math` 同时是一等对象:`const cos = Math.cos`、`[1, 2].map(Math.max)`、`const { sqrt, PI } = Math` 都能按值读取成员(`xt_math_object()` 为每个函数缓存一个原生闭包,读取开销仍然很低)。
33
34
  - `Number` 静态与 `Number()` 转换;`parseInt` / `parseFloat` / `isNaN` / `isFinite`。
34
35
 
35
36
  ## JSON
@@ -2,9 +2,11 @@
2
2
 
3
3
  > 属于[已实现语法与功能](../implemented.md) · [English](../../implemented/tests.md)
4
4
 
5
- 实现位置:`tests/`(`lexer` / `parser` / `binder` / `codegen` / `driver` / `extensions` / `cli` / `e2e`)
5
+ 实现位置:`tests/`(`lexer` / `parser` / `binder` / `checker` / `codegen` / `driver` / `extensions` / `cli` / `conformance` / `e2e`)
6
6
 
7
7
  - 各模块单元测试与源码树一一对应。
8
8
  - `tests/e2e/` 会真正编译并运行二进制;缺少 `clang` 时自动跳过,而不是静默通过。
9
9
  - `tests/e2e/differential-*.test.ts` 让同一份源码同时经 `xbintsc` 与 Node 运行并逐字节比较输出。语义变化时应新增差分用例,而不是手写期望字符串。
10
+ - `tests/conformance/` 是“支持子集”的可执行定义:它运行一份固定版本、随仓库分发的 [test262](https://github.com/tc39/test262) 子集(`tests/conformance/test262/cases/` 下的原始文件),逐个编译并执行受支持用例。不支持用例是 xbintsc 目前仍会拒绝的合法 JavaScript,以实际诊断码固定。[`doc/support-matrix.md`](../support-matrix.md) 由同一份目录生成(`npm run docs:matrix`),提交的表格过期时测试会失败。固定版本与 harness 适配见 [`tests/conformance/test262/SOURCE.md`](../../../tests/conformance/test262/SOURCE.md)。
11
+ - `tests/checker/` 固化检查器:未定义名、同作用域重复声明、实参个数、结构化可赋值性、属性形状与必须保持合法的收窄场景。
10
12
  - 本目录的各功能页记录受支持的行为,测试是这份契约的可执行形式。提交前的门禁(`npm run typecheck && npm run lint && npm test`)见[参与贡献](../../ai/contributing.md)。
@@ -16,6 +16,7 @@
16
16
  - [词法分析](./implemented/lexer.md) —— token、字面量、关键字、词法诊断
17
17
  - [语法分析](./implemented/parser.md) —— 语句、表达式、类型语法、ASI
18
18
  - [名字绑定与作用域](./implemented/binder.md) —— 作用域、符号、闭包捕获
19
+ - [语义检查](./implemented/checker.md) —— 可关闭的未定义名、重复声明与实参个数检查
19
20
 
20
21
  ### 语义与代码生成
21
22
 
@@ -51,6 +52,7 @@
51
52
  | 分词器、字面量、关键字 | [词法分析](./implemented/lexer.md) |
52
53
  | 语句 / 表达式 / 类型语法 | [语法分析](./implemented/parser.md) |
53
54
  | 作用域、符号、捕获 | [名字绑定](./implemented/binder.md) |
55
+ | 检查器诊断(未定义名、重复声明、实参个数) | [语义检查](./implemented/checker.md) |
54
56
  | 运算符、赋值降级 | [运算符与赋值](./implemented/operators.md) |
55
57
  | 值表示、函数 ABI | [值模型](./implemented/value-model.md) |
56
58
  | 控制流、表达式降级、类、`main` | [代码生成](./implemented/codegen.md) |
@@ -0,0 +1,391 @@
1
+ # 通过 npm 包使用 xbintsc
2
+
3
+ > 语言 / Language:[English](../npm-package.md) | **简体中文**
4
+
5
+ `xbintsc` 已经发布到 npm。你可以在任意 Node 项目里安装它,把这个项目的
6
+ TypeScript 直接编译成独立的原生二进制——不需要源码检出,不需要下载发布压缩包,
7
+ 也不需要全局安装。
8
+
9
+ 本文是面向 npm 包使用者的指南。编译参数与配置字段见
10
+ [CLI 参考](../ai/zh-CN/cli.md);各平台的工具链要求见[使用前置要求](./requirements.md)。
11
+
12
+ ## 快速开始
13
+
14
+ ```bash
15
+ npm install --save-dev --save-exact xbintsc
16
+ npx xbintsc doctor # "status : ok" 表示 clang 可用
17
+ npx xbintsc build src/main.ts --out build
18
+ ./build/main # Windows 上是 .\build\main.exe
19
+ ```
20
+
21
+ 后文会解释环境要求、首次构建成本、CI 用法以及与普通 Node 构建的差异。
22
+
23
+ ## 给 AI 代理的说明
24
+
25
+ 如果你是被要求构建一个已经依赖 `xbintsc` 的项目的 AI 代理:
26
+
27
+ 1. 运行 `npx xbintsc doctor`。如果退出码非零,报告工具链问题;不要为了绕过
28
+ 缺失或过旧的 clang 去修改程序。
29
+ 2. 找入口文件:`xbintsc.config.json` 里的 `entry`、调用 `xbintsc` 的 package
30
+ 脚本,或项目的主 TypeScript 文件(通常是 `src/main.ts`)。有配置文件时,
31
+ `npx xbintsc build` 不需要位置参数。
32
+ 3. 用 `npx xbintsc build <entry> --out build` 构建。如果程序导入了 Node 内置
33
+ 模块,加 `--ext node`;诊断信息会指出缺失的扩展。
34
+ 4. 运行产物(`./build/<name>`,Windows 上是 `.exe`),并报告其路径。
35
+ 5. 如果构建报不支持的语法,阅读安装包里的子集指南
36
+ `node_modules/xbintsc/doc/ai/language-support.md`;不要假设 Node 能跑的
37
+ TypeScript 就一定能编译。首次构建还会编译 C 运行时,请预留比增量构建更多的
38
+ 时间。
39
+
40
+ 不要在 `node_modules/xbintsc` 里运行 `npm install`,也不要用 `tsc`/`esbuild`
41
+ 代替 xbintsc:原生产物必须由 `npx xbintsc` 生成。`xbintsc` 不读取
42
+ `tsconfig.json`;请使用相对导入或包导入。
43
+
44
+ ## npm 包里有什么
45
+
46
+ 这个包包含:
47
+
48
+ - 编译器 CLI(`bin/xbintsc.js` 以及 `dist/` 里编译后的 JavaScript);
49
+ - C 运行时**源码**(`runtime/`),其中包括 `node` 扩展的源码;
50
+ - 项目配置 schema 与文档。
51
+
52
+ 它通过 Node.js 运行编译器。产出的二进制仍然是独立的:不嵌入 Node、V8 或
53
+ TypeScript 编译器。
54
+
55
+ 这个包**不包含**:
56
+
57
+ - C 编译器——构建机器需要 clang 16+;
58
+ - 预编译的运行时归档(`runtime/lib/<os>-<arch>/core.a`)。驱动会在首次使用时
59
+ 从随包发布的源码编译 C 运行时并缓存目标文件,所以第一次构建会更慢
60
+ (见[首次构建与缓存](#首次构建与缓存));
61
+ - GUI/media 的原生归档(`gui.a`、`media.a`)。如果你需要 `--ext gui` 或
62
+ `--ext media`,请使用 Linux/macOS 的发布压缩包,或从源码检出中构建这些归档。
63
+
64
+ ## 环境要求
65
+
66
+ | 要求 | 原因 |
67
+ | --- | --- |
68
+ | Node.js **22+** | 用来运行编译器本身。产出的二进制不需要 Node。 |
69
+ | clang / LLVM **16+** | xbintsc 生成 LLVM IR,再交给 clang 编译和链接。 |
70
+ | 平台链接器 / SDK | macOS:Xcode Command Line Tools。Linux:clang + lld。Windows:LLVM + Visual Studio C++ 生成工具(MSVC ABI)。 |
71
+
72
+ 首次构建前先确认:
73
+
74
+ ```bash
75
+ node --version # v22.x 或更高
76
+ npx xbintsc doctor # "status : ok" 表示工具链可用
77
+ ```
78
+
79
+ `doctor` 还会报告解析到的编译器、运行时目录和运行时库目录。Windows 上,如果
80
+ 解析到的 clang 自己找不到 MSVC/SDK 头文件,请在 **x64 Native Tools Command
81
+ Prompt for VS 2022**(Windows on ARM 用 **ARM64 Native Tools**)中运行构建。
82
+ 如果发行版默认的 `clang` 低于 16(例如 Ubuntu 22.04 或 Debian 12),请从该
83
+ 发行版的 LLVM 软件源安装更新的 LLVM,并用 `xbintsc_CLANG` 指向那个二进制。
84
+ 完整的分平台说明见[使用前置要求](./requirements.md)。
85
+
86
+ ## 在项目里安装
87
+
88
+ 在将要执行构建的 Node 项目里,把它装成开发依赖:
89
+
90
+ ```bash
91
+ npm install --save-dev --save-exact xbintsc
92
+ ```
93
+
94
+ `--save-exact` 会把编译器版本固定到 `package.json`;lockfile 则会为其他人和 CI
95
+ 锁定同一版本。固定版本很重要:编译器版本是增量缓存 key 的一部分,而且新版本
96
+ 可能产出不同的二进制。
97
+
98
+ 其他包管理器的等价命令是 `pnpm add -D xbintsc` 和 `yarn add -D xbintsc`。
99
+ 本文其余部分使用 npm 与 `npx`。
100
+
101
+ 验证本地安装:
102
+
103
+ ```bash
104
+ npx xbintsc version
105
+ npx xbintsc doctor
106
+ ```
107
+
108
+ `npx` 会优先使用 `node_modules/.bin/xbintsc`。如果项目没有本地安装,`npx`
109
+ 可能会转而下载最新版本——偶尔用一次很方便,但不可复现。在 CI 中,要么先安装
110
+ 依赖,要么使用 `npx --no-install xbintsc …`,让缺失安装直接失败,而不是静默
111
+ 拉取另一个版本的编译器。
112
+
113
+ ### 不添加依赖的一次性运行
114
+
115
+ ```bash
116
+ npx --yes xbintsc@latest build src/main.ts --out build
117
+ ```
118
+
119
+ 如果产物必须可复现,请把 `latest` 换成确切版本。这个命令会把包下载到 npm 的
120
+ `_npx` 缓存,所以常规构建还是推荐使用项目依赖。
121
+
122
+ ### 全局安装(不推荐)
123
+
124
+ ```bash
125
+ npm install --global xbintsc
126
+ xbintsc build src/main.ts --out build
127
+ ```
128
+
129
+ 全局安装适合临时试验,但所有项目会共享当前全局的那一个版本。项目级开发依赖
130
+ 才能保证构建可复现。
131
+
132
+ ## 一个完整的最小项目
133
+
134
+ ```text
135
+ my-app/
136
+ ├── package.json
137
+ ├── xbintsc.config.json
138
+ └── src/
139
+ └── main.ts
140
+ ```
141
+
142
+ `src/main.ts`:
143
+
144
+ ```ts
145
+ const greeting: string = "Hello from xbintsc";
146
+ console.log(greeting);
147
+ ```
148
+
149
+ `xbintsc.config.json`:
150
+
151
+ ```json
152
+ {
153
+ "entry": "src/main.ts",
154
+ "outDir": "build"
155
+ }
156
+ ```
157
+
158
+ 在 `package.json` 里加一个构建脚本——npm 会把 `node_modules/.bin` 放进
159
+ `PATH`,所以脚本里可以直接调用 `xbintsc`:
160
+
161
+ ```json
162
+ {
163
+ "scripts": {
164
+ "build:native": "xbintsc build"
165
+ }
166
+ }
167
+ ```
168
+
169
+ 然后:
170
+
171
+ ```bash
172
+ npm install --save-dev --save-exact xbintsc
173
+ npm run build:native
174
+ ./build/main # Windows 上是 .\build\main.exe
175
+ ```
176
+
177
+ 预期输出(首次构建还会编译 C 运行时):
178
+
179
+ ```text
180
+ xbintsc: wrote /absolute/path/my-app/build/main
181
+ Hello from xbintsc
182
+ ```
183
+
184
+ `xbintsc build` 不带位置参数时会从 `xbintsc.config.json` 读取 `entry`,所以脚本
185
+ 可以写得很短。没有配置文件时,显式传入文件:`xbintsc build src/main.ts --out build`。
186
+
187
+ ## 首次构建与缓存
188
+
189
+ 运行时目标文件按源码/头文件内容哈希缓存。默认缓存目录是**执行命令时所在目录**下
190
+ 的 `.xbintsc/`(不一定是配置文件所在目录);可以用 `xbintsc_CACHE_DIR` 改到别处。
191
+
192
+ npm 包只带运行时的 C 源码,不带预编译的 `core.a`,所以第一次构建会逐个编译
193
+ 运行时的翻译单元。这次构建会明显比后续构建慢。`--time` 可以看到时间花在哪里:
194
+
195
+ ```bash
196
+ npx xbintsc build src/main.ts --out build --time
197
+ # xbintsc: timing (frontend 4ms, codegen 7ms, clang 1089ms, runtime 37770ms, link 1966ms)
198
+ ```
199
+
200
+ 之后的构建会复用目标文件和增量构建记录:
201
+
202
+ ```bash
203
+ npx xbintsc build src/main.ts --out build
204
+ # xbintsc: wrote /absolute/path/build/main (cached)
205
+ ```
206
+
207
+ 实际使用中的建议:
208
+
209
+ - 把 `.xbintsc/` 加进 `.gitignore`;
210
+ - 在 CI 里保留 `.xbintsc/`(或把 `xbintsc_CACHE_DIR` 指向持久目录),避免每次
211
+ 都重新编译运行时;
212
+ - 删除 `.xbintsc/` 是安全的——下一次构建会重新生成;
213
+ - `--force` 只忽略构建新鲜度记录,已缓存且内容哈希相同的运行时目标文件仍会复用。
214
+ 如果要强制完整重编 C 运行时,请删除 `.xbintsc/`。
215
+
216
+ ## 常用命令
217
+
218
+ 以下命令都假设已经安装了项目依赖,因此 `npx` 能找到本地包。
219
+
220
+ | 任务 | 命令 |
221
+ | --- | --- |
222
+ | 构建可执行文件 | `npx xbintsc build src/main.ts --out build` |
223
+ | 指定确切的输出路径 | `npx xbintsc build src/main.ts -o dist/app` |
224
+ | 编译后立即运行 | `npx xbintsc run src/main.ts -- --flag value` |
225
+ | 给程序传参数 | 放在 `--` 之后;它们不是编译器参数 |
226
+ | 只检查、不链接(不需要 clang) | `npx xbintsc check src/main.ts` |
227
+ | 打印 LLVM IR(不需要 clang) | `npx xbintsc emit src/main.ts > main.ll` |
228
+ | 只产出目标文件 | `npx xbintsc build src/main.ts --emit obj --out build` |
229
+ | 优化 | `npx xbintsc build src/main.ts -O3 --out build` |
230
+ | 使用 Node 内置模块 | `npx xbintsc build src/main.ts --ext node --out build` |
231
+ | 监听变化并重新构建 | `npx xbintsc watch src/main.ts` |
232
+ | 查看工具链 | `npx xbintsc doctor` |
233
+ | 查看完整帮助 | `npx xbintsc help` |
234
+
235
+ `--out <dir>` 是目录:输出文件名沿用入口文件的基本名。`-o <path>` 是确切的输出
236
+ 路径。优化级别默认是 `-O2`。
237
+
238
+ 完整参数、项目配置字段和环境变量见 [CLI 参考](../ai/zh-CN/cli.md)。
239
+
240
+ ## 编译产物里的 Node 内置模块与 npm 依赖
241
+
242
+ 从 npm 安装 `xbintsc` **并不**意味着编译产物运行在 Node 上。产物是独立的原生
243
+ 二进制,因此有两条规则:
244
+
245
+ 1. **Node 内置模块需要显式开启。** `node:fs` 或 `fs` 这样的导入需要 `node` 扩展:
246
+
247
+ ```bash
248
+ npx xbintsc build src/main.ts --ext node --out build
249
+ ```
250
+
251
+ 或者永久写进 `xbintsc.config.json`:
252
+
253
+ ```json
254
+ {
255
+ "entry": "src/main.ts",
256
+ "outDir": "build",
257
+ "extensions": ["node"]
258
+ }
259
+ ```
260
+
261
+ 2. **第三方 npm 包在构建期打包。** 裸导入会从项目的 `node_modules` 解析,并把
262
+ 源码合并进二进制。运行时没有包查找。ESM 和 CommonJS 包都支持;循环依赖、
263
+ 动态 `require(<表达式>)`,以及依赖 `__dirname` 等 Node 全局变量的包不支持。
264
+
265
+ ```bash
266
+ npm install ms
267
+ ```
268
+
269
+ ```ts
270
+ import ms from "ms";
271
+ console.log(ms(60000));
272
+ ```
273
+
274
+ 完整规则与限制见[扩展](../ai/zh-CN/extensions.md#第三方-npm-包)。
275
+
276
+ ## 在 Node 构建脚本里调用
277
+
278
+ npm 包只提供 ESM,并暴露了编程 API;当另一个 Node 构建脚本需要产出二进制时
279
+ 很方便:
280
+
281
+ ```js
282
+ // scripts/build-native.mjs
283
+ import { build } from "xbintsc";
284
+
285
+ const result = build("src/main.ts", { outDir: "build", optimize: "2" });
286
+ if (result.diagnostics.some((diagnostic) => diagnostic.category === "error")) {
287
+ process.exitCode = 1;
288
+ } else {
289
+ console.log(`wrote ${result.outputPath}${result.cached ? " (cached)" : ""}`);
290
+ }
291
+ ```
292
+
293
+ 用 `node scripts/build-native.mjs`(或 `package.json` 脚本)运行。注意:
294
+
295
+ - 使用 `.mjs` 或 `"type": "module"`,因为 `require("xbintsc")` 没有导出,会以
296
+ `ERR_PACKAGE_PATH_NOT_EXPORTED` 失败;
297
+ - `build` 返回 `{ outputPath, irPath?, cached, diagnostics, … }`,源码错误通过
298
+ `diagnostics` 报告;clang 自身失败时会**抛出** `ToolchainError`;
299
+ - `compileString(source)` 是纯 IR 生成调用,不需要 clang;
300
+ - 子路径 `xbintsc/driver` 暴露驱动内部能力(缓存、工具链、配置、图标、macOS
301
+ bundle 助手)。
302
+
303
+ 完整 API 见 [CLI 参考](../ai/zh-CN/cli.md#编程-api)。
304
+
305
+ ## 在 CI 中使用
306
+
307
+ 下面是一个发布 Linux 二进制的 GitHub Actions 示例:
308
+
309
+ ```yaml
310
+ name: native
311
+ on: [push]
312
+ jobs:
313
+ build:
314
+ runs-on: ubuntu-24.04
315
+ steps:
316
+ - uses: actions/checkout@v4
317
+ - uses: actions/setup-node@v4
318
+ with:
319
+ node-version: 22
320
+ cache: npm
321
+ - run: sudo apt-get update && sudo apt-get install -y clang lld
322
+ - run: npm ci
323
+ - run: npx xbintsc doctor
324
+ - uses: actions/cache@v4
325
+ with:
326
+ path: .xbintsc
327
+ key: xbintsc-${{ runner.os }}-${{ hashFiles('package-lock.json') }}
328
+ - run: npx xbintsc build src/main.ts --out build
329
+ - uses: actions/upload-artifact@v4
330
+ with:
331
+ name: my-app-linux-x64
332
+ path: build/main
333
+ ```
334
+
335
+ - `npm ci` 默认安装 devDependencies,所以 `xbintsc` 可用。如果流水线使用
336
+ `npm ci --omit=dev`,请在裁剪依赖前完成构建,或把 `xbintsc` 放进
337
+ `dependencies`。
338
+ - `.xbintsc` 的缓存 key 包含 lockfile,而 lockfile 固定了编译器版本;缓存里的
339
+ 目标文件名是内容哈希,因此旧缓存不会污染新构建。
340
+ - xbintsc 只为**宿主**平台构建,不是交叉编译器:要给多个平台产出产物,请使用
341
+ CI matrix(每个 OS/arch 一个 job)。
342
+ - macOS runner 已经带有 Xcode Command Line Tools;Windows runner 需要安装 LLVM
343
+ 与 MSVC 生成工具,产物是 `build\main.exe`。
344
+
345
+ ## npm 包还是发布压缩包?
346
+
347
+ | | npm 包(`xbintsc`) | 预编译发布压缩包 |
348
+ | --- | --- | --- |
349
+ | 需要 Node.js | 是,22+ | 否 |
350
+ | 首次构建 | 从源码编译 C 运行时 | 直接链接预编译运行时 |
351
+ | GUI / media 扩展 | 不包含 | Linux/macOS 压缩包包含 |
352
+ | 安装方式 | `npm install` + lockfile / provenance | 下载、校验 `.sha256`、解压 |
353
+ | 编程 API | 有 | 无(仅 CLI) |
354
+ | 交叉编译 | 否——只构建宿主平台 | 否——只构建宿主平台 |
355
+ | 适合 | Node 项目与 CI,沿用熟悉的 npm 流程 | 没有 Node 的机器、首次构建要快、GUI 应用 |
356
+
357
+ 如果只需要核心运行时和 `node` 扩展,npm 包最方便。如果需要最快的冷启动构建,
358
+ 或者需要 GUI/media 归档,请使用发布压缩包(开发时也可以从源码构建)。
359
+
360
+ ## 与普通 Node 构建的差异
361
+
362
+ - **不会读取 `tsconfig.json`。** xbintsc 使用自己的 `xbintsc.config.json` 指定
363
+ 入口、输出目录和构建参数。TypeScript 的 `paths` 别名以及其他 `tsconfig.json`
364
+ 设置不会生效;请使用相对导入或真实的包导入。
365
+ - **项目的 `package.json` `"type"` 不决定源码方言。** 写 ESM 的
366
+ `import`/`export`;自己源码里的 `require()` 会被拒绝。
367
+ - **类型会先检查、再擦除。** 默认检查器能发现确定的类型不匹配,但没有完整的
368
+ 类型推断与 strict-null 模式。只有确实需要跳过语义检查时才使用 `--no-check`。
369
+ - **只支持 TypeScript 的一个子集。** 不支持的语法会给出诊断并失败,而不是被
370
+ 近似实现。见[语言支持范围](../ai/zh-CN/language-support.md)。
371
+ - **产物与平台、架构绑定。** 请在最终运行它的平台上构建。
372
+
373
+ ## 排错
374
+
375
+ 诊断信息末尾的提示使用仓库相对路径,例如 `doc/ai/troubleshooting.md`。如果项目是
376
+ 通过 npm 安装的 xbintsc,请到 `node_modules/xbintsc/doc/ai/` 下读同一个文件。
377
+
378
+ | 现象 | 原因 / 处理 |
379
+ | --- | --- |
380
+ | `npx xbintsc` 用了意料之外的版本 | 运行 `npx --no-install xbintsc version` 和 `npm ls xbintsc`;在 `package.json` 中固定版本,CI 用 `npm ci`。 |
381
+ | `requires Node.js 22` / engine 错误 | 升级 Node;编译器使用了较新的 Node API。 |
382
+ | `No C compiler found` 或 `requires clang 16 or newer` | 安装 clang 16+,运行 `npx xbintsc doctor`;需要时用 `xbintsc_CLANG` 指定 clang。 |
383
+ | 第一次构建很慢 | 正常:正在编译并缓存运行时 C 源码。后续构建会复用 `.xbintsc/`;`--time` 可确认。如果冷启动必须快,请使用发布压缩包。 |
384
+ | 写 `.xbintsc/` 权限错误 | 用 `xbintsc_CACHE_DIR` 指向可写目录,或在可写目录中运行。 |
385
+ | `module 'fs' is provided by the 'node' extension` | 加 `--ext node`,或在配置里写 `"extensions": ["node"]`。 |
386
+ | `GUI native library not found` / `media native library not found` | npm 包不包含 `gui.a`/`media.a`;请使用 Linux/macOS 发布压缩包,或从源码检出构建。 |
387
+ | `require("xbintsc")` 失败 | 包只提供 ESM;使用 `import`(或动态 `import()`)。 |
388
+ | Windows 链接时报缺少 MSVC 库 | 在 Native Tools 命令提示符中运行,安装 VS C++ 生成工具,并检查 `npx xbintsc doctor`。 |
389
+ | `npm ci --omit=dev` 后构建找不到 `xbintsc` | 在构建阶段安装 devDependencies,或把 `xbintsc` 移到 `dependencies`。 |
390
+
391
+ 更多错误信息与修复方式见[排错](../ai/zh-CN/troubleshooting.md)。
@@ -1,47 +1,47 @@
1
- # 兄弟们 typescript可以编译成原生二进制了
2
-
3
- ## 缘由
4
- 2019年的时候研究过一段时间编译器,当时写了一个迷你的JS编译器,只支持function和number类型,但别小看就这两个类型,差不多花费了两周时间去实现,所以编译器是需要大量的时间和精力去做这个事情,当时就感叹可能我这辈子都不太可能能撸出一个相对完整的编译器了。
5
-
6
- 2026年9月的某个下午,群里有人聊到了前端/js/ts永远都只能在鄙视链的最底端,因为它不能像C++和rust一样生成二进制文件。
7
-
8
- ## 触发
9
- 这件事就像触发了我的底层代码一样,脑子里疯狂出现了一个念头,然后回过头去翻了翻当年写的编辑器文章,不!不对!如果用AI的话,现在可能真的有可能可以实现,然后我开始列出了我的思路,写了第一个文档 DESIGN.md,接下来打开pi,开撸!
10
-
11
- 很快不到一个小时,就出现第一个原型,我看完何其丑陋和简单,甚至不如我当年写的demo,于是我觉得自己重写把整个框架重新写一遍,若干天,总算是达到了我想要的水平,然后我开启了第二次尝试,这次我继续启动pi,这次发现虽然AI在架构上表现一般,但是架构完善后,它完成功能的速度不是一般的快,于是我开始了急速的迭代过程。
12
-
13
- ## 核心进展
14
-
15
- * 绝大部分的js/ts语法以及node.js的主流方法(可选包)
16
- * 支持了C++和rust扩展,用户可以自由扩展
17
- * 实现了自举,即自己编译了自己
18
- * 实现无GNU依赖运行
19
-
20
- 当然未实现的在这里:
21
- [unimplemented.md](https://github.com/zy445566/xbintsc/blob/main/doc/unimplemented.md)
22
- [node-unimplemented.md](https://github.com/zy445566/xbintsc/blob/main/doc/node-unimplemented.md)
23
-
24
- 当然对于实现二进制编译最大的优势主要是两点:
25
- * 包体积巨小,编译后的二进制文件低至200KB (--ext node 300KB),且可以直接运行,不再需要再捆绑几十MB的node.js运行时了
26
- * 冷启动速度巨快,本机实测比node.js原生大概快了120-200倍左右
27
-
28
- ## 使用方法
29
- 在 [releases页面](https://github.com/zy445566/xbintsc/releases) 下载zst压缩包解压后,运行即可,下面以windows作为案例
30
- ```
31
- # 编译
32
- .\xbintsc-win32-x64\bin\xbintsc.exe build .\hello.ts --out .\build
33
- # 运行
34
- .\build\hello.exe
35
- ```
36
-
37
- # 附录
38
- Github 地址: [https://github.com/zy445566/xbintsc](https://github.com/zy445566/xbintsc)
39
- 兄弟们 有兴趣可以一起研究 `;)`
40
-
41
-
42
-
43
-
44
-
45
-
46
-
47
-
1
+ # 兄弟们 typescript可以编译成原生二进制了
2
+
3
+ ## 缘由
4
+ 2019年的时候研究过一段时间编译器,当时写了一个迷你的JS编译器,只支持function和number类型,但别小看就这两个类型,差不多花费了两周时间去实现,所以编译器是需要大量的时间和精力去做这个事情,当时就感叹可能我这辈子都不太可能能撸出一个相对完整的编译器了。
5
+
6
+ 2026年9月的某个下午,群里有人聊到了前端/js/ts永远都只能在鄙视链的最底端,因为它不能像C++和rust一样生成二进制文件。
7
+
8
+ ## 触发
9
+ 这件事就像触发了我的底层代码一样,脑子里疯狂出现了一个念头,然后回过头去翻了翻当年写的编辑器文章,不!不对!如果用AI的话,现在可能真的有可能可以实现,然后我开始列出了我的思路,写了第一个文档 DESIGN.md,接下来打开pi,开撸!
10
+
11
+ 很快不到一个小时,就出现第一个原型,我看完何其丑陋和简单,甚至不如我当年写的demo,于是我觉得自己重写把整个框架重新写一遍,若干天,总算是达到了我想要的水平,然后我开启了第二次尝试,这次我继续启动pi,这次发现虽然AI在架构上表现一般,但是架构完善后,它完成功能的速度不是一般的快,于是我开始了急速的迭代过程。
12
+
13
+ ## 核心进展
14
+
15
+ * 绝大部分的js/ts语法以及node.js的主流方法(可选包)
16
+ * 支持了C++和rust扩展,用户可以自由扩展
17
+ * 实现了自举,即自己编译了自己
18
+ * 实现无GNU依赖运行
19
+
20
+ 当然未实现的在这里:
21
+ [unimplemented.md](https://github.com/zy445566/xbintsc/blob/main/doc/unimplemented.md)
22
+ [node-unimplemented.md](https://github.com/zy445566/xbintsc/blob/main/doc/node-unimplemented.md)
23
+
24
+ 当然对于实现二进制编译最大的优势主要是两点:
25
+ * 包体积巨小,编译后的二进制文件低至200KB (--ext node 300KB),且可以直接运行,不再需要再捆绑几十MB的node.js运行时了
26
+ * 冷启动速度巨快,本机实测比node.js原生大概快了120-200倍左右
27
+
28
+ ## 使用方法
29
+ 在 [releases页面](https://github.com/zy445566/xbintsc/releases) 下载zst压缩包解压后,运行即可,下面以windows作为案例
30
+ ```
31
+ # 编译
32
+ .\xbintsc-win32-x64\bin\xbintsc.exe build .\hello.ts --out .\build
33
+ # 运行
34
+ .\build\hello.exe
35
+ ```
36
+
37
+ # 附录
38
+ Github 地址: [https://github.com/zy445566/xbintsc](https://github.com/zy445566/xbintsc)
39
+ 兄弟们 有兴趣可以一起研究 `;)`
40
+
41
+
42
+
43
+
44
+
45
+
46
+
47
+
@@ -9,7 +9,10 @@ xbintsc 不再自带编译器,因此每个平台都需要安装一个兼容 cl
9
9
  | 要求 | 最低版本 | 说明 |
10
10
  | --- | --- | --- |
11
11
  | clang / LLVM | **16** | 生成的 IR 使用不透明指针,而 LLVM 16 起不透明指针是唯一的指针表示。 |
12
- | Node.js | **22** | 仅用于从源码运行或构建编译器;发布二进制是独立的,不需要 Node。 |
12
+ | Node.js | **22** | 用于从 npm 或源码运行编译器;发布二进制是独立的,不需要 Node。 |
13
+
14
+ 如果通过 npm 安装编译器而不是使用发布压缩包,Node.js 22+ 会直接运行编译器本身;
15
+ 见[通过 npm 包使用 xbintsc](./npm-package.md)。
13
16
 
14
17
  clang 15 及更旧版本会在任何程序的第一个字符串字面量处失败:
15
18