codecin 5.7.4__tar.gz → 5.8.0__tar.gz

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 (219) hide show
  1. {codecin-5.7.4 → codecin-5.8.0}/CHANGELOG.md +193 -2
  2. {codecin-5.7.4/codecin.egg-info → codecin-5.8.0}/PKG-INFO +10 -10
  3. {codecin-5.7.4 → codecin-5.8.0}/README.md +9 -9
  4. {codecin-5.7.4 → codecin-5.8.0}/codecin/__init__.py +1 -1
  5. {codecin-5.7.4 → codecin-5.8.0}/codecin/aot.py +3 -2
  6. {codecin-5.7.4 → codecin-5.8.0}/codecin/cin.py +22 -3
  7. {codecin-5.7.4 → codecin-5.8.0}/codecin/cli.py +20 -2
  8. {codecin-5.7.4 → codecin-5.8.0}/codecin/config.py +4 -2
  9. {codecin-5.7.4 → codecin-5.8.0}/codecin/cpu.py +4 -1
  10. {codecin-5.7.4 → codecin-5.8.0}/codecin/disasm.py +2 -2
  11. codecin-5.8.0/codecin/environment.py +176 -0
  12. {codecin-5.7.4 → codecin-5.8.0}/codecin/isa.py +24 -0
  13. codecin-5.8.0/codecin/lib/cppstd.cin +418 -0
  14. codecin-5.8.0/codecin/lib/cstd.cin +424 -0
  15. codecin-5.8.0/codecin/lib/gostd.cin +406 -0
  16. codecin-5.8.0/codecin/lib/gui.cin +206 -0
  17. {codecin-5.7.4 → codecin-5.8.0}/codecin/lib/key.cin +26 -2
  18. {codecin-5.7.4 → codecin-5.8.0}/codecin/native/aot/aot.go +4 -0
  19. {codecin-5.7.4 → codecin-5.8.0}/codecin/native/compiler/codegen.go +26 -0
  20. {codecin-5.7.4 → codecin-5.8.0}/codecin/native/compiler/syscalls.go +18 -0
  21. codecin-5.8.0/codecin/native/engine/args.go +37 -0
  22. codecin-5.8.0/codecin/native/engine/audio.go +402 -0
  23. codecin-5.8.0/codecin/native/engine/audio_other.go +105 -0
  24. codecin-5.8.0/codecin/native/engine/audio_test.go +279 -0
  25. codecin-5.8.0/codecin/native/engine/audio_windows.go +190 -0
  26. codecin-5.8.0/codecin/native/engine/console_other.go +9 -0
  27. codecin-5.8.0/codecin/native/engine/console_windows.go +43 -0
  28. codecin-5.8.0/codecin/native/engine/gui.go +178 -0
  29. codecin-5.8.0/codecin/native/engine/gui_stub.go +11 -0
  30. codecin-5.8.0/codecin/native/engine/gui_test.go +148 -0
  31. codecin-5.8.0/codecin/native/engine/gui_windows.go +426 -0
  32. codecin-5.8.0/codecin/native/engine/gui_x11.go +721 -0
  33. {codecin-5.7.4 → codecin-5.8.0}/codecin/native/engine/isa_gen.go +18 -0
  34. {codecin-5.7.4 → codecin-5.8.0}/codecin/native/engine/keyboard.go +165 -11
  35. {codecin-5.7.4 → codecin-5.8.0}/codecin/native/engine/keyboard_other.go +3 -0
  36. {codecin-5.7.4 → codecin-5.8.0}/codecin/native/engine/keyboard_stub.go +3 -0
  37. {codecin-5.7.4 → codecin-5.8.0}/codecin/native/engine/keyboard_test.go +53 -26
  38. codecin-5.8.0/codecin/native/engine/keyboard_windows.go +196 -0
  39. codecin-5.8.0/codecin/native/engine/keyboard_windows_test.go +97 -0
  40. {codecin-5.7.4 → codecin-5.8.0}/codecin/native/engine/mem_other.go +0 -2
  41. {codecin-5.7.4 → codecin-5.8.0}/codecin/native/engine/mem_windows.go +0 -2
  42. codecin-5.8.0/codecin/native/engine/stdin.go +66 -0
  43. codecin-5.8.0/codecin/native/engine/stdin_other.go +9 -0
  44. codecin-5.8.0/codecin/native/engine/stdin_windows.go +60 -0
  45. {codecin-5.7.4 → codecin-5.8.0}/codecin/native/engine/system.go +0 -3
  46. {codecin-5.7.4 → codecin-5.8.0}/codecin/native/engine/version_gen.go +1 -1
  47. {codecin-5.7.4 → codecin-5.8.0}/codecin/native/engine/vm.go +92 -35
  48. {codecin-5.7.4 → codecin-5.8.0}/codecin/native/main.go +21 -0
  49. {codecin-5.7.4 → codecin-5.8.0}/codecin/native.py +17 -1
  50. codecin-5.8.0/codecin/stdlib.py +123 -0
  51. {codecin-5.7.4 → codecin-5.8.0}/codecin/version.py +1 -1
  52. {codecin-5.7.4 → codecin-5.8.0/codecin.egg-info}/PKG-INFO +10 -10
  53. {codecin-5.7.4 → codecin-5.8.0}/codecin.egg-info/SOURCES.txt +24 -0
  54. codecin-5.8.0/examples/args_demo.cin +22 -0
  55. {codecin-5.7.4 → codecin-5.8.0}/examples/asm_constants.asm +1 -1
  56. {codecin-5.7.4 → codecin-5.8.0}/examples/bitwise_builtins.cin +1 -1
  57. {codecin-5.7.4 → codecin-5.8.0}/examples/control_flow.cin +1 -1
  58. {codecin-5.7.4 → codecin-5.8.0}/examples/enum_range_for.cin +1 -1
  59. codecin-5.8.0/examples/gui_demo.cin +49 -0
  60. {codecin-5.7.4 → codecin-5.8.0}/examples/literals_types.cin +1 -1
  61. codecin-5.8.0/examples/local_audio.cin +58 -0
  62. {codecin-5.7.4 → codecin-5.8.0}/examples/modules_demo.cin +1 -1
  63. {codecin-5.7.4 → codecin-5.8.0}/examples/stdlib_demo.cin +1 -1
  64. {codecin-5.7.4 → codecin-5.8.0}/examples/system_interaction.cin +1 -1
  65. {codecin-5.7.4 → codecin-5.8.0}/setup.py +11 -1
  66. {codecin-5.7.4 → codecin-5.8.0}/tests/test_all_libs_together.py +3 -0
  67. codecin-5.8.0/tests/test_cin_host.py +133 -0
  68. {codecin-5.7.4 → codecin-5.8.0}/tests/test_cli.py +14 -0
  69. codecin-5.8.0/tests/test_environment.py +57 -0
  70. codecin-5.8.0/tests/test_gui.py +177 -0
  71. codecin-5.8.0/tests/test_lib_compat.py +532 -0
  72. codecin-5.7.4/codecin/lib/gui.cin +0 -94
  73. codecin-5.7.4/codecin/native/engine/audio.go +0 -152
  74. codecin-5.7.4/codecin/native/engine/audio_other.go +0 -46
  75. codecin-5.7.4/codecin/native/engine/audio_windows.go +0 -43
  76. codecin-5.7.4/codecin/native/engine/keyboard_windows.go +0 -70
  77. codecin-5.7.4/tests/test_cin_host.py +0 -59
  78. {codecin-5.7.4 → codecin-5.8.0}/LICENSE +0 -0
  79. {codecin-5.7.4 → codecin-5.8.0}/MANIFEST.in +0 -0
  80. {codecin-5.7.4 → codecin-5.8.0}/codecin/assembler.py +0 -0
  81. {codecin-5.7.4 → codecin-5.8.0}/codecin/cache.py +0 -0
  82. {codecin-5.7.4 → codecin-5.8.0}/codecin/console.py +0 -0
  83. {codecin-5.7.4 → codecin-5.8.0}/codecin/crom.py +0 -0
  84. {codecin-5.7.4 → codecin-5.8.0}/codecin/debugger.py +0 -0
  85. {codecin-5.7.4 → codecin-5.8.0}/codecin/errors.py +0 -0
  86. {codecin-5.7.4 → codecin-5.8.0}/codecin/jit.py +0 -0
  87. {codecin-5.7.4 → codecin-5.8.0}/codecin/lib/array.cin +0 -0
  88. {codecin-5.7.4 → codecin-5.8.0}/codecin/lib/bigint.cin +0 -0
  89. {codecin-5.7.4 → codecin-5.8.0}/codecin/lib/bits.cin +0 -0
  90. {codecin-5.7.4 → codecin-5.8.0}/codecin/lib/bitset.cin +0 -0
  91. {codecin-5.7.4 → codecin-5.8.0}/codecin/lib/codec.cin +0 -0
  92. {codecin-5.7.4 → codecin-5.8.0}/codecin/lib/combin.cin +0 -0
  93. {codecin-5.7.4 → codecin-5.8.0}/codecin/lib/conv.cin +0 -0
  94. {codecin-5.7.4 → codecin-5.8.0}/codecin/lib/csv.cin +0 -0
  95. {codecin-5.7.4 → codecin-5.8.0}/codecin/lib/dp.cin +0 -0
  96. {codecin-5.7.4 → codecin-5.8.0}/codecin/lib/fmt.cin +0 -0
  97. {codecin-5.7.4 → codecin-5.8.0}/codecin/lib/frac.cin +0 -0
  98. {codecin-5.7.4 → codecin-5.8.0}/codecin/lib/graph.cin +0 -0
  99. {codecin-5.7.4 → codecin-5.8.0}/codecin/lib/hash.cin +0 -0
  100. {codecin-5.7.4 → codecin-5.8.0}/codecin/lib/heap.cin +0 -0
  101. {codecin-5.7.4 → codecin-5.8.0}/codecin/lib/io.cin +0 -0
  102. {codecin-5.7.4 → codecin-5.8.0}/codecin/lib/json.cin +0 -0
  103. {codecin-5.7.4 → codecin-5.8.0}/codecin/lib/math.cin +0 -0
  104. {codecin-5.7.4 → codecin-5.8.0}/codecin/lib/matrix.cin +0 -0
  105. {codecin-5.7.4 → codecin-5.8.0}/codecin/lib/path.cin +0 -0
  106. {codecin-5.7.4 → codecin-5.8.0}/codecin/lib/queue.cin +0 -0
  107. {codecin-5.7.4 → codecin-5.8.0}/codecin/lib/rand.cin +0 -0
  108. {codecin-5.7.4 → codecin-5.8.0}/codecin/lib/set.cin +0 -0
  109. {codecin-5.7.4 → codecin-5.8.0}/codecin/lib/sort.cin +0 -0
  110. {codecin-5.7.4 → codecin-5.8.0}/codecin/lib/stat.cin +0 -0
  111. {codecin-5.7.4 → codecin-5.8.0}/codecin/lib/str.cin +0 -0
  112. {codecin-5.7.4 → codecin-5.8.0}/codecin/lib/termux.cin +0 -0
  113. {codecin-5.7.4 → codecin-5.8.0}/codecin/lib/test.cin +0 -0
  114. {codecin-5.7.4 → codecin-5.8.0}/codecin/lib/text.cin +0 -0
  115. {codecin-5.7.4 → codecin-5.8.0}/codecin/lib/time.cin +0 -0
  116. {codecin-5.7.4 → codecin-5.8.0}/codecin/lib/token.cin +0 -0
  117. {codecin-5.7.4 → codecin-5.8.0}/codecin/lib/tree.cin +0 -0
  118. {codecin-5.7.4 → codecin-5.8.0}/codecin/lib/unionfind.cin +0 -0
  119. {codecin-5.7.4 → codecin-5.8.0}/codecin/lib/validate.cin +0 -0
  120. {codecin-5.7.4 → codecin-5.8.0}/codecin/lib/vec.cin +0 -0
  121. {codecin-5.7.4 → codecin-5.8.0}/codecin/logger.py +0 -0
  122. {codecin-5.7.4 → codecin-5.8.0}/codecin/memory.py +0 -0
  123. {codecin-5.7.4 → codecin-5.8.0}/codecin/native/aot/stub_main.go.txt +0 -0
  124. {codecin-5.7.4 → codecin-5.8.0}/codecin/native/build.ps1 +0 -0
  125. {codecin-5.7.4 → codecin-5.8.0}/codecin/native/build.sh +0 -0
  126. {codecin-5.7.4 → codecin-5.8.0}/codecin/native/compiler/compile_test.go +0 -0
  127. {codecin-5.7.4 → codecin-5.8.0}/codecin/native/compiler/parser.go +0 -0
  128. {codecin-5.7.4 → codecin-5.8.0}/codecin/native/compiler/tokenizer.go +0 -0
  129. {codecin-5.7.4 → codecin-5.8.0}/codecin/native/compiler/types.go +0 -0
  130. {codecin-5.7.4 → codecin-5.8.0}/codecin/native/engine/canvas.go +0 -0
  131. {codecin-5.7.4 → codecin-5.8.0}/codecin/native/engine/crom.go +0 -0
  132. {codecin-5.7.4 → codecin-5.8.0}/codecin/native/engine/encode.go +0 -0
  133. {codecin-5.7.4 → codecin-5.8.0}/codecin/native/engine/engine_test.go +0 -0
  134. {codecin-5.7.4 → codecin-5.8.0}/codecin/native/engine/host_test.go +0 -0
  135. {codecin-5.7.4 → codecin-5.8.0}/codecin/native/engine/hostcrypto.go +0 -0
  136. {codecin-5.7.4 → codecin-5.8.0}/codecin/native/engine/hostdesktop.go +0 -0
  137. {codecin-5.7.4 → codecin-5.8.0}/codecin/native/engine/hostnet.go +0 -0
  138. {codecin-5.7.4 → codecin-5.8.0}/codecin/native/engine/keyboard_termios_darwin.go +0 -0
  139. {codecin-5.7.4 → codecin-5.8.0}/codecin/native/engine/keyboard_termios_linux.go +0 -0
  140. {codecin-5.7.4 → codecin-5.8.0}/codecin/native/engine/termux.go +0 -0
  141. {codecin-5.7.4 → codecin-5.8.0}/codecin/native/go.mod +0 -0
  142. {codecin-5.7.4 → codecin-5.8.0}/codecin/native/ir/ir.go +0 -0
  143. {codecin-5.7.4 → codecin-5.8.0}/codecin/registers.py +0 -0
  144. {codecin-5.7.4 → codecin-5.8.0}/codecin/stats.py +0 -0
  145. {codecin-5.7.4 → codecin-5.8.0}/codecin.egg-info/dependency_links.txt +0 -0
  146. {codecin-5.7.4 → codecin-5.8.0}/codecin.egg-info/entry_points.txt +0 -0
  147. {codecin-5.7.4 → codecin-5.8.0}/codecin.egg-info/requires.txt +0 -0
  148. {codecin-5.7.4 → codecin-5.8.0}/codecin.egg-info/top_level.txt +0 -0
  149. {codecin-5.7.4 → codecin-5.8.0}/misc/vim/ftdetect/codecin.vim +0 -0
  150. {codecin-5.7.4 → codecin-5.8.0}/misc/vim/syntax/cin.vim +0 -0
  151. {codecin-5.7.4 → codecin-5.8.0}/misc/vim/syntax/codecinasm.vim +0 -0
  152. {codecin-5.7.4 → codecin-5.8.0}/misc/vscode-cin/.vscodeignore +0 -0
  153. {codecin-5.7.4 → codecin-5.8.0}/misc/vscode-cin/README.md +0 -0
  154. {codecin-5.7.4 → codecin-5.8.0}/misc/vscode-cin/build.bat +0 -0
  155. {codecin-5.7.4 → codecin-5.8.0}/misc/vscode-cin/language-configuration.json +0 -0
  156. {codecin-5.7.4 → codecin-5.8.0}/misc/vscode-cin/package.json +0 -0
  157. {codecin-5.7.4 → codecin-5.8.0}/misc/vscode-cin/snippets/cin.json +0 -0
  158. {codecin-5.7.4 → codecin-5.8.0}/misc/vscode-cin/syntaxes/cin.tmLanguage.json +0 -0
  159. {codecin-5.7.4 → codecin-5.8.0}/pyproject.toml +0 -0
  160. {codecin-5.7.4 → codecin-5.8.0}/script/bump_version.py +0 -0
  161. {codecin-5.7.4 → codecin-5.8.0}/script/check_paths.py +0 -0
  162. {codecin-5.7.4 → codecin-5.8.0}/script/gen_isa_docs.py +0 -0
  163. {codecin-5.7.4 → codecin-5.8.0}/script/gen_native_isa.py +0 -0
  164. {codecin-5.7.4 → codecin-5.8.0}/setup.cfg +0 -0
  165. {codecin-5.7.4 → codecin-5.8.0}/tests/test_aggregate_and_const.py +0 -0
  166. {codecin-5.7.4 → codecin-5.8.0}/tests/test_aot.py +0 -0
  167. {codecin-5.7.4 → codecin-5.8.0}/tests/test_assembler_ext.py +0 -0
  168. {codecin-5.7.4 → codecin-5.8.0}/tests/test_cache.py +0 -0
  169. {codecin-5.7.4 → codecin-5.8.0}/tests/test_cin_host_ext.py +0 -0
  170. {codecin-5.7.4 → codecin-5.8.0}/tests/test_cin_new_features.py +0 -0
  171. {codecin-5.7.4 → codecin-5.8.0}/tests/test_cin_syntax.py +0 -0
  172. {codecin-5.7.4 → codecin-5.8.0}/tests/test_cin_syntax_ext.py +0 -0
  173. {codecin-5.7.4 → codecin-5.8.0}/tests/test_cin_system.py +0 -0
  174. {codecin-5.7.4 → codecin-5.8.0}/tests/test_compiler_errors.py +0 -0
  175. {codecin-5.7.4 → codecin-5.8.0}/tests/test_cpu_interpreted.py +0 -0
  176. {codecin-5.7.4 → codecin-5.8.0}/tests/test_debugger.py +0 -0
  177. {codecin-5.7.4 → codecin-5.8.0}/tests/test_examples.py +0 -0
  178. {codecin-5.7.4 → codecin-5.8.0}/tests/test_features_ab.py +0 -0
  179. {codecin-5.7.4 → codecin-5.8.0}/tests/test_features_crom_mmu.py +0 -0
  180. {codecin-5.7.4 → codecin-5.8.0}/tests/test_features_import.py +0 -0
  181. {codecin-5.7.4 → codecin-5.8.0}/tests/test_features_importloc.py +0 -0
  182. {codecin-5.7.4 → codecin-5.8.0}/tests/test_features_mmu.py +0 -0
  183. {codecin-5.7.4 → codecin-5.8.0}/tests/test_features_remote.py +0 -0
  184. {codecin-5.7.4 → codecin-5.8.0}/tests/test_index_subscript_type.py +0 -0
  185. {codecin-5.7.4 → codecin-5.8.0}/tests/test_isa_dispatch.py +0 -0
  186. {codecin-5.7.4 → codecin-5.8.0}/tests/test_isa_single_source.py +0 -0
  187. {codecin-5.7.4 → codecin-5.8.0}/tests/test_keyboard.py +0 -0
  188. {codecin-5.7.4 → codecin-5.8.0}/tests/test_lib_bigint.py +0 -0
  189. {codecin-5.7.4 → codecin-5.8.0}/tests/test_lib_bitset.py +0 -0
  190. {codecin-5.7.4 → codecin-5.8.0}/tests/test_lib_codec.py +0 -0
  191. {codecin-5.7.4 → codecin-5.8.0}/tests/test_lib_combin.py +0 -0
  192. {codecin-5.7.4 → codecin-5.8.0}/tests/test_lib_csv.py +0 -0
  193. {codecin-5.7.4 → codecin-5.8.0}/tests/test_lib_dp.py +0 -0
  194. {codecin-5.7.4 → codecin-5.8.0}/tests/test_lib_fmt.py +0 -0
  195. {codecin-5.7.4 → codecin-5.8.0}/tests/test_lib_frac.py +0 -0
  196. {codecin-5.7.4 → codecin-5.8.0}/tests/test_lib_graph.py +0 -0
  197. {codecin-5.7.4 → codecin-5.8.0}/tests/test_lib_heap.py +0 -0
  198. {codecin-5.7.4 → codecin-5.8.0}/tests/test_lib_path.py +0 -0
  199. {codecin-5.7.4 → codecin-5.8.0}/tests/test_lib_set.py +0 -0
  200. {codecin-5.7.4 → codecin-5.8.0}/tests/test_lib_text.py +0 -0
  201. {codecin-5.7.4 → codecin-5.8.0}/tests/test_lib_token.py +0 -0
  202. {codecin-5.7.4 → codecin-5.8.0}/tests/test_lib_tree.py +0 -0
  203. {codecin-5.7.4 → codecin-5.8.0}/tests/test_lib_unionfind.py +0 -0
  204. {codecin-5.7.4 → codecin-5.8.0}/tests/test_libs.py +0 -0
  205. {codecin-5.7.4 → codecin-5.8.0}/tests/test_libs_ext.py +0 -0
  206. {codecin-5.7.4 → codecin-5.8.0}/tests/test_literals_and_bom.py +0 -0
  207. {codecin-5.7.4 → codecin-5.8.0}/tests/test_memory_protection.py +0 -0
  208. {codecin-5.7.4 → codecin-5.8.0}/tests/test_native_hardening.py +0 -0
  209. {codecin-5.7.4 → codecin-5.8.0}/tests/test_native_lib_lookup.py +0 -0
  210. {codecin-5.7.4 → codecin-5.8.0}/tests/test_nested_subscript_codegen.py +0 -0
  211. {codecin-5.7.4 → codecin-5.8.0}/tests/test_no_go_cli.py +0 -0
  212. {codecin-5.7.4 → codecin-5.8.0}/tests/test_p0_fixes.py +0 -0
  213. {codecin-5.7.4 → codecin-5.8.0}/tests/test_packaging.py +0 -0
  214. {codecin-5.7.4 → codecin-5.8.0}/tests/test_paths_consistency.py +0 -0
  215. {codecin-5.7.4 → codecin-5.8.0}/tests/test_struct_value_semantics.py +0 -0
  216. {codecin-5.7.4 → codecin-5.8.0}/tests/test_switch_semantics.py +0 -0
  217. {codecin-5.7.4 → codecin-5.8.0}/tests/test_three_paths.py +0 -0
  218. {codecin-5.7.4 → codecin-5.8.0}/tests/test_version.py +0 -0
  219. {codecin-5.7.4 → codecin-5.8.0}/tests/test_workflows.py +0 -0
@@ -5,6 +5,197 @@
5
5
 
6
6
  ---
7
7
 
8
+ ## [5.8.0] - 2026-10-04
9
+
10
+ 一次「图形、媒体与跨平台兼容」发布:新增 **GUI 窗口**(Windows Win32 /
11
+ Linux X11)、**本地音频扩展**(真实音量 / 播放进度 / 合成蜂鸣)、**键盘输入
12
+ 多平台优化**(Unicode 码点、F11/F12、修饰键组合),并补齐 **命令行参数与
13
+ 行输入**(SYS 129..131)、**终端输出缓存的跨平台冲刷**(Windows VT/UTF-8
14
+ 初始化)与 **C/C++/Go 三语言标准库兼容层**(36 → 39 个)。随后在同一版本内
15
+ 继续增强:**音频控制全家桶**(查询 / 暂停恢复 / 音量读取,SYS 132..136)、
16
+ **三兼容层 API 扩容**(40+ 新函数)、**工具链缺失检测与平台化安装提示**
17
+ (environment)与 **`--libs` 内置库清单**(标注执行路径要求)。核心实现全部
18
+ 在 Go 原生引擎(纯标准库,零第三方依赖),三条执行路径语义与 5.7.x 保持一致。
19
+
20
+ ### 新增 (Added)
21
+
22
+ #### GUI 窗口(SYS 119..125、128,全部 Go 原生实现)
23
+
24
+ - **`gui_new(w, h, title)` / `gui_update()` / `gui_close()` / `gui_closed()` /
25
+ `gui_active()` / `mouse_x()` / `mouse_y()` / `mouse_button()`**:
26
+ - `gui_new` 成功返回 0 并把画布内建(`set_color` / `fill_rect` / `fill_circle` /
27
+ `draw_line` / `draw_text`)直接绑定为**窗口后备缓冲直画**,`gui_update`
28
+ 处理事件并呈现一帧(主循环每帧调用);`gui_close` 销毁窗口(画布保留,
29
+ 仍可 `save_png`);点 X / Alt+F4 / WM 删除协议由 `gui_closed` 报告。
30
+ - 平台后端:Windows 用 Win32(专用窗口线程 + 消息泵,`StretchDIBits`
31
+ 呈现,`AdjustWindowRect` 精确客户区);Linux 用**纯 Go X11 客户端**
32
+ (Unix socket / TCP 连接、MIT-MAGIC-COOKIE-1 认证、`PutImage` 分块呈现、
33
+ WM_DELETE_WINDOW 协议);其他平台与无显示服务环境一律优雅失败
34
+ (`gui_new` 返回 -1,不报错不崩溃)。
35
+ - 鼠标:客户区坐标 + 键位掩码(bit0 左 / bit1 右 / bit2 中);键盘事件注入
36
+ 与终端共用的同一键码队列(`get_key` 可直接读)。
37
+ - 并发安全:快照复制防撕裂(呈现线程读 / VM 线程写)。
38
+ - **`codecin/lib/gui.cin` 重构**:窗口封装 `g_new` / `g_update` / `g_close` /
39
+ `g_closed` / `g_active` / `g_clear` / `g_mouse_*`(含键位判定),并**保留**
40
+ 5.7.x 的离屏绘图助手(`g_rgb` / `g_bar_chart` / `g_line_chart` / `g_grid` /
41
+ `g_rect_outline` / `g_save` / `g_show`)。
42
+
43
+ #### 本地音频扩展(SYS 126、127)
44
+
45
+ - **`audio_pos()`**:当前播放已进行毫秒;无播放 / 已播完 / 时长未知返回 -1。
46
+ - **`beep(freq, ms)`**:合成 16-bit 单声道 22050Hz 正弦蜂鸣(10% / 5ms 淡入
47
+ 淡出防爆音);频率 20..20000 Hz、单次上限 10 秒,参数校验在三平台一致地
48
+ 于触碰设备之前完成。
49
+ - Windows 后端从 PlaySoundW 升级为 **waveOut 流式**:`audio_volume` 经
50
+ `waveOutSetVolume` 实时生效、`audio_stop` 即时中止(`waveOutReset`);
51
+ Unix 后端向 `paplay` / `ffplay` / `afplay` 透传音量参数。
52
+
53
+ #### 音频控制增强(SYS 132..136)
54
+
55
+ - **`audio_duration()`**:当前播放总时长毫秒;无播放 / 自然播完 / 时长未知返回 -1
56
+ (播放与暂停期间返回同一总时长)。
57
+ - **`audio_playing()`**:1 = 正在发声(已开始、未暂停、未播完),否则 0。
58
+ - **`audio_pause()`**:暂停当前播放(Windows `waveOutPause`;Unix 向播放器
59
+ 进程投递 SIGSTOP),成功 0;无播放 / 已暂停 / 平台失败为 -1。
60
+ - **`audio_resume()`**:恢复暂停的播放,时间基线整体后移暂停时长——
61
+ `audio_pos` 无缝续走、自然结束时刻保持正确;成功 0 / 无暂停可恢复 -1。
62
+ - **`audio_level()`**:读取当前音量 0..100(`audio_volume` 的读端)。
63
+ - **`audio_pos` 暂停冻结**:暂停期间进度停在暂停时刻,不随真实时间前进;
64
+ `audio_stop` / 重新播放即解除暂停态。
65
+ - 五个内建在两侧编译器同步登记,ISA 真源(`isa.py`)→ Go 生成物一致。
66
+
67
+ #### 键盘输入多平台优化(键码表扩展)
68
+
69
+ - 新增键码:**F11 / F12**(1031 / 1032)、**Ctrl+方向**(1101..1104)、
70
+ **Shift+方向**(1105..1108)、**Shift+Tab**(1109)。
71
+ - **XTerm 修饰参数解析**:`CSI 1;5C`(Ctrl+Right)等修饰变体三端一致。
72
+ - **Unicode 码点解码**(Linux / macOS / Termux):终端 UTF-8 多字节序列解码为
73
+ 码点(>255,如 "中" → 0x4E2D),非法序列回退按字节处理;Windows 端
74
+ UTF-16 代理对组合为同一码点。
75
+ - **Windows 输入重写**:msvcrt `_getch` → `ReadConsoleInputW` 事件流
76
+ (UTF-16 字符 + VK 虚拟键,键抬起过滤、重复计数、扩展键),启用时关闭
77
+ QuickEdit 防误选卡死。
78
+ - `codecin/lib/key.cin`:`K_F11` / `K_F12` / `K_CTRL_*` / `K_SHIFT_*` /
79
+ `K_SHIFT_TAB` 常量与 `k_is_function` / `k_is_modified_arrow` 判定;
80
+ `k_is_special` 范围同步扩展。
81
+
82
+ #### 命令行参数与行输入(SYS 129..131,跨平台一致语义)
83
+
84
+ - **`arg_count()` / `arg(i)`**:读取传给 CIN 程序的命令行参数(不含程序文件名;
85
+ 越界 / 负下标返回空串)。传参约定三端统一:
86
+ - CLI:`codecin prog.cin -- a b c`(`--` 之后的参数全部交给 CIN 程序);
87
+ - AOT 产物:直接取进程 `os.Args[1:]`;
88
+ - c-shared 库:新导出 `codecin_set_args`,Python 桥接层每次运行前注入
89
+ (空列表即清空,同进程多次运行不残留)。
90
+ - **`input_str()`**:读入一行 UTF-8 文本(不含行尾;EOF 为空串)。优先消费
91
+ 预读输入缓冲(与解释器 `input()` 的管道语义一致),耗尽后阻塞读标准输入;
92
+ Windows 控制台用 `ReadConsoleW`(UTF-16 → UTF-8,中文输入不乱码),其余平台
93
+ 用 `bufio` 按行读;行尾 `\n` / `\r\n` 三平台统一剥离,与键盘 raw 模式
94
+ (监听激活时临时恢复行模式)互不干扰。
95
+ - 新内建在两侧编译器同步登记(`arg_count` / `arg` / `input_str`)。
96
+
97
+ #### 终端输出缓存与 Windows 控制台兼容
98
+
99
+ - **阻塞读前冲刷输出缓冲**:原生引擎把输出缓冲到程序结束一次性回传;
100
+ 当 `input_str()` / 数字输入将要阻塞读真实终端时先冲刷已缓冲输出,
101
+ `"你的名字: "` 这类交互提示立即可见。冲刷**仅在 stdout 为终端时生效**——
102
+ 管道 / 重定向 / 测试捕获下输出字节序列与旧版本完全一致。
103
+ - **Windows 控制台一次性初始化**(进程级、幂等、失败安全):
104
+ `ENABLE_VIRTUAL_TERMINAL_PROCESSING`(ANSI/VT 转义序列在传统 conhost 上
105
+ 与 Linux/macOS 行为一致)+ `SetConsoleOutputCP(65001)`(输出代码页切
106
+ UTF-8,中文 Windows 默认 GBK 下中文/Emoji 不再乱码)。
107
+ - AOT 产物在打印输出前执行同一初始化;非 Windows 平台为空操作
108
+ (终端原生支持 VT 与 UTF-8)。
109
+
110
+ #### C / C++ / Go 标准库兼容层(36 → 39 个,全部纯 CIN)
111
+
112
+ - **`codecin/lib/cstd.cin`(`libc_*`)**:`<ctype.h>`(isdigit / toupper …,
113
+ 字符码可用字符字面量 `'A'` 直接传入)、`<string.h>`(strlen / strcmp /
114
+ strstr / strchr / strrev / memcpy …)、`<stdlib.h>`(abs / atoi / qsort_asc)、
115
+ `<math.h>`(fabs / sqrt / pow / floor / ceil / fmod 商向零截断)与
116
+ `<stdio.h>`(puts / print)。
117
+ - **`codecin/lib/cppstd.cin`(`stl_*`)**:`std::string`(find / rfind /
118
+ substr / append / to_string,npos 以 -1 表示)、`vector<int>` / `stack<int>` /
119
+ `queue<int>`(**数组 + 长度游标**表达,push/pop 返回新长度)、
120
+ `<utility>`(max / min / abs / swap / sort 固定升序)。
121
+ - **`codecin/lib/gostd.cin`(`go_*`)**:`strings`(Contains / Index /
122
+ HasPrefix / Repeat / Count / ReplaceAll / EqualFold …)、`strconv`(Itoa /
123
+ Atoi / FormatFloat)、`math`、`slices`(Index / Contains / Max / Reverse …)
124
+ 与 `os.Args`(经 `go_os_args_len` / `go_os_args_get`,依赖原生路径)。
125
+ - 类型映射约定:C `char*` → `string`、C `char` → 字符码 `int`、C 数组参数 →
126
+ CIN 数组引用 + 显式长度;与 C/C++ 指针返回值不可表达的 API(如返回
127
+ `char*` 的 strchr)以**下标**语义对齐,头注释均注明差异。
128
+
129
+ #### 兼容层 API 扩容(三库 40+ 新函数,纯 CIN、三路径一致)
130
+
131
+ - **cstd**:`<ctype.h>` 补 iscntrl / isgraph / isblank / ispunct / toascii;
132
+ `<string.h>` 补 memmove / strspn / strcspn / strpbrk / strlwr / strupr;
133
+ `<stdlib.h>` 补 labs / rand / srand;`<math.h>` 补 sin / cos / tan /
134
+ round(C 语义半值远离零)/ trunc;`<stdio.h>` 补 putchar(配套内部
135
+ 字符码 → 字符串转换)。
136
+ - **cppstd**:`std::string` 补 starts_with / ends_with(C++20)/
137
+ find_first_of / find_last_of / at / front / back / insert / erase /
138
+ replace;`vector<int>` 补 find / count / insert / erase;`<algorithm>`
139
+ 补 sort 降序版与 clamp。
140
+ - **gostd**:`strings` 补 LastIndex / IndexAny / TrimLeft / TrimRight /
141
+ TrimPrefix / TrimSuffix;`strconv` 补 FormatInt(base 2..36)/
142
+ ParseInt(任意进制解析);`math` 补 Round / Trunc;`slices` 补
143
+ LastIndex / Equal / Clone / Sort。
144
+
145
+ #### 工具链缺失检测与平台化安装提示(environment)
146
+
147
+ - **`codecin/environment.py`**:`find_tool` / `tool_available`(只读
148
+ `shutil.which` 探测,绝不自动安装)、`install_hint`(按当前平台给出可复制
149
+ 执行的安装命令:Windows winget/MSYS2、macOS brew/xcode-select、Linux
150
+ apt/dnf/pacman、Termux pkg)、`missing_tool_message`(缺工具 + 用途 +
151
+ 怎么装合一)、`native_runtime_hint`(原生库缺失时的三条出路指引)。
152
+ - 接入点(所有缺失入口提示一致):
153
+ - AOT 构建缺 Go:报错附 `install_hint('go')`(原先只有干巴巴的
154
+ "go 命令未找到");
155
+ - 解释路径(含 `--no-native`)调用宿主能力内建:报错附原生库安装指引;
156
+ - pip 安装(`setup.py`)缺 Go:打印安装命令并说明重装后获得原生加速。
157
+
158
+ #### `--libs`:内置标准库清单与执行路径标注
159
+
160
+ - 新 CLI 选项 **`--libs`**:列出 `codecin/lib/` 全部官方库并按**执行路径
161
+ 要求**标注三类——纯 CIN(三路径一致)/ 兼容层(C/C++/Go 三语言标准库
162
+ 兼容层)/ 需原生运行时(调用宿主能力内建,`--no-native` 与沙箱下不可用)。
163
+ - 分类由**源码扫描**得出(是否引用 `HOST_BUILTINS` 内建名),与库头注释
164
+ 保持单一事实来源;`gostd.cin` 的 `go_os_args_*` 原生依赖自动标注。
165
+
166
+ #### 其他
167
+
168
+ - 新内建在两侧编译器同步登记:Python `HOST_BUILTINS` 与 Go
169
+ `compiler.hostBuiltins`(并补上 5.6.0 遗漏的 `key_hit` / `get_key` /
170
+ `key_flush`)。
171
+ - 新示例:`examples/gui_demo.cin`(无显示服务自动降级为提示后退出)、
172
+ `examples/local_audio.cin`、`examples/args_demo.cin`(`--` 传参与
173
+ `input_str`)。
174
+ - 新测试:`tests/test_lib_compat.py`(三兼容层函数语义、参数注入管道、
175
+ 预读缓冲行输入、无原生库可编译,解释 / 原生双路径参数化)。
176
+ - 本轮新增:Go 侧 `engine/audio_test.go`(audio_duration / playing /
177
+ pause / resume 状态机、暂停冻结、自然播完回落)、`tests/test_environment.py`
178
+ (安装提示契约)、`tests/test_cli.py::test_list_libs_reports_categories`
179
+ (--libs 分类标注);`examples/local_audio.cin` 增补音量读取与暂停 /
180
+ 恢复演示。
181
+
182
+ ### 变更 (Changed)
183
+
184
+ - **`lib/gui.cin` 签名变更**(窗口化重构):`g_new(w, h)` → `g_new(w, h, title)`
185
+ (旧的无窗口画布用法请直接使用 `canvas(w, h)`);`g_clear(w, h, rgb)` →
186
+ `g_clear(rgb)`(沿用最近一次窗口尺寸,从未开窗时返回 -1)。
187
+ 图表助手内部已同步适配,`g_bar_chart` / `g_line_chart` / `g_save` /
188
+ `g_show` 调用方式不变。
189
+
190
+ ### 修复 (Fixed)
191
+
192
+ - 音频自然播完后 `audio_pos` 不再恒返回总时长(正确恢复 -1)。
193
+ - GUI:Windows 窗口线程改为常驻,`gui_close` 之后可以再次 `gui_new`;
194
+ 窗口销毁(无论来自 `gui_close` 还是用户点 X)后清理失效句柄。
195
+ - `guiSnapshot` 增加窗口打开校验(关闭后不再产出快照)。
196
+
197
+ ---
198
+
8
199
  ## [5.7.4] - 2026-09-28
9
200
 
10
201
  一次「静默错误清零 + 标准库扩容」的发布:修掉一族会**静默破坏内存/静默给错结果**的
@@ -316,7 +507,7 @@ struct 缺陷与两处**同一程序两条路径结论不同**的分歧,并把
316
507
 
317
508
  ### 修复 (Fixed)
318
509
 
319
- - `python cpu.py --help` 的首行版本号长期停留在 `Code CIN v5.3`,现直接取
510
+ - `codecin --help` 的首行版本号长期停留在 `Code CIN v5.3`,现直接取
320
511
  `codecin.__version__`(此前是全仓唯一残留的版本串)。
321
512
  - `--build-exe` 在程序文件不存在时抛裸 `FileNotFoundError` traceback,现在与普通路径
322
513
  一样给出 `Build Error` 面板。
@@ -367,7 +558,7 @@ struct 缺陷与两处**同一程序两条路径结论不同**的分歧,并把
367
558
  ### 新增 (Added)
368
559
 
369
560
  - **AOT 静态编译: 编译成独立可执行文件 (Windows / Linux / macOS)**:
370
- `python cpu.py program.cin --build-exe app` 或 `codecin build program.cin -o app`,
561
+ `codecin program.cin --build-exe app` 或 `codecin build program.cin -o app`,
371
562
  支持 `--target OS/ARCH` 交叉编译(windows/amd64|arm64、linux/amd64|arm64、darwin/amd64|arm64)。
372
563
  产物内嵌 UCBC 字节码与初始内存镜像,由内置 Go VM 执行,**不依赖 Python、Go 工具链、
373
564
  libc 或任何动态库**(`CGO_ENABLED=0`,Linux 产物无 `PT_INTERP`);入口 shell 模板由
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: codecin
3
- Version: 5.7.4
3
+ Version: 5.8.0
4
4
  Summary: Code CIN - 高级语言与运行时 (CIN/PL/ASM 工具链 + Go 原生 VM + ARM64/RISC-V/FP/Vector 指令集)
5
5
  Author: ByUsi Studio, 北啊呢
6
6
  License-Expression: MIT
@@ -443,9 +443,9 @@ codecin --version
443
443
 
444
444
  3. 运行:
445
445
  ```
446
- python cpu.py basic.cin # 唯一 CLI 入口 (自动用 Go 原生库)
446
+ codecin basic.cin # 唯一 CLI 入口 (自动用 Go 原生库)
447
447
  codecin basic.cin # 安装后等价的 console script
448
- python cpu.py --help
448
+ codecin --help
449
449
  ```
450
450
 
451
451
  > **Python 只是 CLI 外壳**: 语言实现 (`codecin/native/` 下的 Go 编译器与字节码 VM) 全部在 Go 侧,
@@ -485,11 +485,11 @@ ruff check codecin cpu.py script tests
485
485
 
486
486
  ```bash
487
487
  # 本机平台
488
- python cpu.py program.cin --build-exe program # Windows 自动补 .exe
488
+ codecin program.cin --build-exe program # Windows 自动补 .exe
489
489
 
490
490
  # 交叉编译 (只需要安装 Go 工具链)
491
- python cpu.py program.cin --build-exe app-linux --build-target linux/amd64
492
- python cpu.py program.cin --build-exe app-mac --build-target darwin/arm64
491
+ codecin program.cin --build-exe app-linux --build-target linux/amd64
492
+ codecin program.cin --build-exe app-mac --build-target darwin/arm64
493
493
  ```
494
494
 
495
495
  | 目标 | 说明 |
@@ -506,10 +506,10 @@ python cpu.py program.cin --build-exe app-mac --build-target darwin/arm64
506
506
  ### 命令行选项
507
507
 
508
508
  **基础执行**
509
- - `python cpu.py program.cin` - 运行CIN程序
510
- - `python cpu.py program.pl` - 运行PL程序
511
- - `python cpu.py program.asm` - 运行ASM程序
512
- - `python cpu.py program.bin` - 运行字节码
509
+ - `codecin program.cin` - 运行CIN程序
510
+ - `codecin program.pl` - 运行PL程序
511
+ - `codecin program.asm` - 运行ASM程序
512
+ - `codecin program.bin` - 运行字节码
513
513
 
514
514
  **执行路径**
515
515
  - `--no-native` - 禁用 Go 原生库, 强制纯 Python
@@ -425,9 +425,9 @@ codecin --version
425
425
 
426
426
  3. 运行:
427
427
  ```
428
- python cpu.py basic.cin # 唯一 CLI 入口 (自动用 Go 原生库)
428
+ codecin basic.cin # 唯一 CLI 入口 (自动用 Go 原生库)
429
429
  codecin basic.cin # 安装后等价的 console script
430
- python cpu.py --help
430
+ codecin --help
431
431
  ```
432
432
 
433
433
  > **Python 只是 CLI 外壳**: 语言实现 (`codecin/native/` 下的 Go 编译器与字节码 VM) 全部在 Go 侧,
@@ -467,11 +467,11 @@ ruff check codecin cpu.py script tests
467
467
 
468
468
  ```bash
469
469
  # 本机平台
470
- python cpu.py program.cin --build-exe program # Windows 自动补 .exe
470
+ codecin program.cin --build-exe program # Windows 自动补 .exe
471
471
 
472
472
  # 交叉编译 (只需要安装 Go 工具链)
473
- python cpu.py program.cin --build-exe app-linux --build-target linux/amd64
474
- python cpu.py program.cin --build-exe app-mac --build-target darwin/arm64
473
+ codecin program.cin --build-exe app-linux --build-target linux/amd64
474
+ codecin program.cin --build-exe app-mac --build-target darwin/arm64
475
475
  ```
476
476
 
477
477
  | 目标 | 说明 |
@@ -488,10 +488,10 @@ python cpu.py program.cin --build-exe app-mac --build-target darwin/arm64
488
488
  ### 命令行选项
489
489
 
490
490
  **基础执行**
491
- - `python cpu.py program.cin` - 运行CIN程序
492
- - `python cpu.py program.pl` - 运行PL程序
493
- - `python cpu.py program.asm` - 运行ASM程序
494
- - `python cpu.py program.bin` - 运行字节码
491
+ - `codecin program.cin` - 运行CIN程序
492
+ - `codecin program.pl` - 运行PL程序
493
+ - `codecin program.asm` - 运行ASM程序
494
+ - `codecin program.bin` - 运行字节码
495
495
 
496
496
  **执行路径**
497
497
  - `--no-native` - 禁用 Go 原生库, 强制纯 Python
@@ -1,4 +1,4 @@
1
- __version__ = "5.7.4"
1
+ __version__ = "5.8.0"
2
2
  __author__ = "ByUsi Studio"
3
3
 
4
4
  from .config import Config
@@ -362,8 +362,9 @@ def build(bytecode: bytes,
362
362
  try:
363
363
  proc, detail = _run_go_build(cmd, mod, env, logger)
364
364
  except FileNotFoundError as e:
365
- raise AotError('未找到 go 命令; AOT 构建需要 Go 工具链 '
366
- '(https://go.dev/dl/)') from e
365
+ from .environment import missing_tool_message
366
+ raise AotError(missing_tool_message(
367
+ 'go', 'AOT 构建独立可执行文件')) from e
367
368
  except subprocess.TimeoutExpired as e:
368
369
  raise AotError('go build 超时') from e
369
370
  if proc.returncode != 0:
@@ -242,11 +242,30 @@ HOST_BUILTINS = {
242
242
  'key_hit': (Syscall.KEYHIT, 0, 'int'),
243
243
  'get_key': (Syscall.KEYGET, 0, 'int'),
244
244
  'key_flush': (Syscall.KEYFLUSH, 0, 'int'),
245
+ # GUI 窗口 (Windows Win32 / Linux X11, 其他平台优雅失败)
246
+ 'gui_new': (Syscall.GUINEW, 3, 'int'),
247
+ 'gui_update': (Syscall.GUIUPDATE, 0, 'int'),
248
+ 'gui_close': (Syscall.GUICLOSE, 0, 'int'),
249
+ 'gui_closed': (Syscall.GUICLOSED, 0, 'int'),
250
+ 'gui_active': (Syscall.GUIACTIVE, 0, 'int'),
251
+ 'mouse_x': (Syscall.MOUSEX, 0, 'int'),
252
+ 'mouse_y': (Syscall.MOUSEY, 0, 'int'),
253
+ 'mouse_button': (Syscall.MOUSEBTN, 0, 'int'),
254
+ # 音频扩展 (播放进度与蜂鸣合成)
255
+ 'audio_pos': (Syscall.AUDIOPOS, 0, 'int'),
256
+ 'beep': (Syscall.AUDIOBEEP, 2, 'int'),
257
+ # 音频控制增强 (查询 / 暂停恢复 / 音量读取)
258
+ 'audio_duration': (Syscall.AUDIODUR, 0, 'int'),
259
+ 'audio_playing': (Syscall.AUDIOPLAYING, 0, 'int'),
260
+ 'audio_pause': (Syscall.AUDIOPAUSE, 0, 'int'),
261
+ 'audio_resume': (Syscall.AUDIORESUME, 0, 'int'),
262
+ 'audio_level': (Syscall.AUDIOLEVEL, 0, 'int'),
263
+ # 命令行参数与行输入 (跨平台一致)
264
+ 'arg_count': (Syscall.ARGC, 0, 'int'),
265
+ 'arg': (Syscall.ARGV, 1, 'string'),
266
+ 'input_str': (Syscall.READLINE, 0, 'string'),
245
267
  }
246
268
 
247
- # 内建函数最少参数个数 (按各分支实际索引的最大下标 + 1 得出)。
248
- # 缺失参数旧代码会直接 IndexError 崩溃 (如 sqrt()、substr("a",1)),
249
- # 现在统一报 CompilerError。必须与 Go 侧 compiler.builtinMinArgs 保持一致。
250
269
  BUILTIN_MIN_ARGS = {
251
270
  'println': 0, 'print': 0,
252
271
  'sqrt': 1, 'sin': 1, 'cos': 1, 'tan': 1,
@@ -17,7 +17,7 @@ from .console import Colors, Console, Panel
17
17
  HELP_INTRO = f"""{Colors.colorize(f'Code CIN v{__version__}', Colors.CYAN, True)}
18
18
 
19
19
  {Colors.colorize('Usage:', Colors.YELLOW)}
20
- python cpu.py <program.[cin|pl|asm|bin]> [options]
20
+ codecin <program.[cin|pl|asm|bin]> [options]
21
21
 
22
22
  {Colors.colorize('Supported formats:', Colors.YELLOW)}
23
23
  .cin CIN 高级语言 (函数/struct/数组/浮点/字符串)
@@ -48,6 +48,9 @@ def build_parser() -> argparse.ArgumentParser:
48
48
  '包路径) 后退出; 与 --json 合用输出机器可读 JSON')
49
49
  p.add_argument('--json', action='store_true', dest='json_output',
50
50
  help='配合 --build-info 输出 JSON (需与 --build-info 同时使用)')
51
+ p.add_argument('--libs', action='store_true', dest='list_libs',
52
+ help='列出内置标准库并标注执行路径要求 '
53
+ '(纯 CIN / C·C++·Go 兼容层 / 需原生运行时) 后退出')
51
54
 
52
55
  # 执行路径
53
56
  p.add_argument('--no-native', action='store_true',
@@ -219,6 +222,15 @@ def _run_aot_build(ns: argparse.Namespace, console, program_file: str,
219
222
  def main(argv: Optional[List[str]] = None) -> int:
220
223
  args = list(sys.argv[1:] if argv is None else argv)
221
224
 
225
+ # `--` 之后的参数原样传给 CIN 程序 (arg_count()/arg(i) 读取), 不参与
226
+ # CLI 自身解析; 与 Go `os.Args[1:]`、C `argv[1..]` 的习惯一致。
227
+ if '--' in args:
228
+ sep = args.index('--')
229
+ program_args = args[sep + 1:]
230
+ args = args[:sep]
231
+ else:
232
+ program_args = []
233
+
222
234
  # 中文 Windows 默认 stdout/stderr 是 GBK, 输出非 GBK 字符 (emoji 等) 会直接
223
235
  # UnicodeEncodeError; 且重定向产物字节与 Go 路径 (恒 UTF-8) 不一致。
224
236
  # 统一切成 UTF-8, 无法编码的字符以 ? 替换而不是崩溃。
@@ -253,6 +265,11 @@ def main(argv: Optional[List[str]] = None) -> int:
253
265
  sys.stdout.write(format_build_info() + "\n")
254
266
  return 0
255
267
 
268
+ if ns.list_libs:
269
+ from .stdlib import format_library_report
270
+ sys.stdout.write(format_library_report() + "\n")
271
+ return 0
272
+
256
273
  if ns.program is None:
257
274
  console.print(Panel("No program file specified.\n"
258
275
  "Use --help for usage information.",
@@ -261,6 +278,7 @@ def main(argv: Optional[List[str]] = None) -> int:
261
278
 
262
279
  config = Config()
263
280
  _apply_namespace(config, ns)
281
+ config.program_args = program_args
264
282
  config.validate()
265
283
 
266
284
  program_file = ns.program
@@ -300,7 +318,7 @@ def main(argv: Optional[List[str]] = None) -> int:
300
318
 
301
319
  try:
302
320
  # 管道/重定向输入预读到 input_buffer: 让 input() 在原生与解释器路径下
303
- # 都能读到 `"42" | python cpu.py t.cin` 这样的标准输入 (交互 TTY 不预读)。
321
+ # 都能读到 `"42" | codecin t.cin` 这样的标准输入 (交互 TTY 不预读)。
304
322
  try:
305
323
  if sys.stdin is not None and not sys.stdin.isatty():
306
324
  cpu.input_buffer = sys.stdin.read() or ""
@@ -1,7 +1,7 @@
1
1
  """运行配置与命令行参数解析。"""
2
2
 
3
- from dataclasses import dataclass
4
- from typing import Optional
3
+ from dataclasses import dataclass, field
4
+ from typing import List, Optional
5
5
 
6
6
 
7
7
  @dataclass
@@ -41,6 +41,8 @@ class Config:
41
41
  mmu: bool = False
42
42
  # A4: 远程调试服务端口 (None = 不启动)
43
43
  debug_server_port: Optional[int] = None
44
+ # 传给 CIN 程序的命令行参数 (cli 里 `--` 之后的参数; 供 arg_count()/arg(i))
45
+ program_args: List[str] = field(default_factory=list)
44
46
 
45
47
  # 命令行解析请使用 codecin/cli.py build_parser() (argparse, 单一来源)。
46
48
  # Config 仅承载运行配置, 由 cli._apply_namespace 填充。
@@ -1338,9 +1338,11 @@ class CPU:
1338
1338
  self._set_reg(0, self._heap_dup_string(
1339
1339
  self.memory.read_string(x0).rstrip().encode('utf-8') + b'\x00'))
1340
1340
  elif call_id >= Syscall.AUDIOPLAY:
1341
+ from .environment import native_runtime_hint
1341
1342
  raise ExecutionError(
1342
1343
  "host builtins (GUI/audio/system/Termux/keyboard) require the "
1343
- "native Go runtime (run without --no-native)")
1344
+ "native Go runtime (run without --no-native)\n"
1345
+ + native_runtime_hint())
1344
1346
  else:
1345
1347
  raise ExecutionError(f"Unknown SYS call id: {call_id}")
1346
1348
  return True
@@ -1406,6 +1408,7 @@ class CPU:
1406
1408
  heap_base=self.heap_ptr,
1407
1409
  input_data=self.input_buffer.encode('utf-8'),
1408
1410
  max_steps=self.config.max_instructions,
1411
+ args=list(self.config.program_args),
1409
1412
  )
1410
1413
  elapsed = _time.perf_counter() - t0
1411
1414
  if result is None:
@@ -4,7 +4,7 @@
4
4
  - CPUSA 容器 (.bin, `--compile-only` 产物): 头 + 内存镜像 + UCBC 段
5
5
  - 裸 UCBC 段 (magic 'UCBC')
6
6
 
7
- CLI: python cpu.py --disasm prog.bin
7
+ CLI: codecin --disasm prog.bin
8
8
  """
9
9
 
10
10
  import os
@@ -68,7 +68,7 @@ def disassemble_bytes(data: bytes) -> List[str]:
68
68
  if data[:4] != b'UCBC':
69
69
  raise CPUSimulatorError(
70
70
  "--disasm 需要 .bin (CPUSA 容器) 或 UCBC 字节码; "
71
- "先用 `python cpu.py src.cin --compile-only -o out.bin` 生成")
71
+ "先用 `codecin src.cin --compile-only -o out.bin` 生成")
72
72
  instructions, entry = _decode_ucbc_segment(data)
73
73
  out = [f"; UCBC disassembly: {len(instructions)} instructions, "
74
74
  f"entry=0x{entry:x}", ";"]