Compare commits
564 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 5b3d807bbc | |||
| 44b2ebb64a | |||
| eb7e2e7e93 | |||
| 77eddb83f4 | |||
| 4181ff8ae2 | |||
| 49b5e61e8e | |||
| e75a60026d | |||
| 83eb29fa3c | |||
| bc512fd02d | |||
| 0bbd82e9ce | |||
| 2fc2a93414 | |||
| 9bdc6245bf | |||
| 16ba11c391 | |||
| 19e473e93c | |||
| 5537a448e8 | |||
| caa62b0bfb | |||
| 3595631e2c | |||
| b033d53d28 | |||
| 8eda4fcbce | |||
| b02af0728a | |||
| b058ee4526 | |||
| 71cbb3a737 | |||
| ac0d3b9785 | |||
| f69dd85365 | |||
| c412d1194b | |||
| f39aece9cf | |||
| 439304c86a | |||
| 6e31185519 | |||
| 1c86c1dce7 | |||
| 1f8176d15e | |||
| f8a331809f | |||
| 0d6c6cef5a | |||
| 06bb647c83 | |||
| cc66eee75f | |||
| 1e2b0e4e0d | |||
| 1a0c3a38cb | |||
| fcdc3a49f8 | |||
| 139c42a90e | |||
| 2dfcc4c95e | |||
| 91aef32a42 | |||
| 18c9cbad7b | |||
| 310e909359 | |||
| d10b7336c1 | |||
| 3b39e9059b | |||
| c44f8a4630 | |||
| c4e9e541fb | |||
| da7d7bbcaa | |||
| d0c34ce1c2 | |||
| 1872221666 | |||
| 0a35289ad0 | |||
| 5f42beaf2a | |||
| b454d65962 | |||
| d536bd17ce | |||
| 3b3478ee30 | |||
| 926e87888c | |||
| f7db4fcce8 | |||
| 9afc1caac7 | |||
| 2a9d2b7f5f | |||
| f11303f0e8 | |||
| 7dd273759a | |||
| e626553a9c | |||
| b2c0b986c4 | |||
| a16f0ac059 | |||
| d3646c86ec | |||
| 39dff9efc5 | |||
| 80efd7c357 | |||
| 99345ddd19 | |||
| df07531edc | |||
| 5511978ed8 | |||
| 3406e1a2dd | |||
| 00f73ecb47 | |||
| e51ba01962 | |||
|
|
a9b4a6682a | ||
|
|
6c5bafb3e9 | ||
|
|
8d04397f32 | ||
|
|
7898505717 | ||
| 5fdb86cd1b | |||
|
|
60adecf808 | ||
|
|
4ae77434dc | ||
|
|
582ba2ce27 | ||
|
|
359c65228d | ||
|
|
3e7e5f2dad | ||
|
|
9a61798d81 | ||
|
|
9f3b3ad860 | ||
|
|
62f58cd83a | ||
|
|
a8cf93671e | ||
|
|
d11822f4ba | ||
|
|
87560db20d | ||
|
|
3a2a1363e6 | ||
| d54a2c59b6 | |||
| 4eb1aff553 | |||
| 80ee450b41 | |||
| f876f66414 | |||
| 2188171b63 | |||
| 7fab3cc662 | |||
| 62f2baab03 | |||
| 60388f6846 | |||
| 7c242d998f | |||
| d3a85a24bf | |||
| 477591303a | |||
| f4a269540a | |||
| cedc77cbc6 | |||
| f61cfa5638 | |||
| f6c877a7a1 | |||
| 6083c0b024 | |||
| b093f8db72 | |||
| 4a84f37b20 | |||
| 2a6fa8034c | |||
| 102e84bc01 | |||
| e5f23b77bd | |||
| 028561fc4f | |||
| 82f4ba1a6e | |||
| f1069d6e5d | |||
| ad11efe974 | |||
| 736e088a91 | |||
| d77368bb13 | |||
| e1a7f3310c | |||
| b7e9c8121e | |||
| 466b6ca2be | |||
| 1cb5951e68 | |||
| 1d73fc298e | |||
| 156f2b76c4 | |||
| 8e26b57cde | |||
| be8e57ef60 | |||
| 2c3c4089f8 | |||
| cadace165a | |||
| 15cd43a7d5 | |||
| f3409f32ce | |||
| 1293ac1f83 | |||
| 9a2b5d5e4e | |||
| fdeaa36366 | |||
| 3dfc8b63c8 | |||
| 30fa84604b | |||
| 025ea75f08 | |||
| c49b9f3df9 | |||
| d932ba10f0 | |||
| f1699bfbbe | |||
| 63835a1cce | |||
| 7c0a5e2524 | |||
| 1eaaacdf8c | |||
| 2f16dd2749 | |||
| 7395256b5a | |||
| 187ec7e0e9 | |||
| c334dd3e28 | |||
| 5b15b2d170 | |||
| 21e4668b16 | |||
| 5b8d7b98f3 | |||
| 63e8b0163a | |||
| 856d113b53 | |||
| 0cb2132e80 | |||
| 83b2122bd7 | |||
| 9132c79c54 | |||
| 12fc14e6e7 | |||
| 52d811b6aa | |||
| e0ad945202 | |||
| 2e4b76dfe2 | |||
| 9fb2dfae51 | |||
| 21ca6e6cab | |||
| 421eb0a0d9 | |||
| f5a6443c8a | |||
| 8d992001f9 | |||
| 4081d7d928 | |||
| 16a5d8d6ac | |||
| 9a4ebaadce | |||
| a86fb4826d | |||
| 589b0a96b9 | |||
| f81dba0210 | |||
| 688d6d7393 | |||
| 34e5de0454 | |||
| 210fdb62f0 | |||
| ebc322668e | |||
| 4860aba07f | |||
| b826fc43aa | |||
| f777841937 | |||
| 4ccff72a5b | |||
| e788e9c437 | |||
| 1486a1e3a5 | |||
| 80deaa9c4f | |||
| ebb9524db0 | |||
| 6f81feab3f | |||
| da7fc0b046 | |||
| 0dbe39eff3 | |||
| 1605390f08 | |||
| 70feb1fe5e | |||
| 07b7d5c40e | |||
| 6d79e28c51 | |||
| e84aedc100 | |||
| 074f0b6809 | |||
| a454eed26f | |||
| b30b6aeaaa | |||
| 33d89e9908 | |||
| 5ef36d5700 | |||
| a7117717bd | |||
| 6098a290b1 | |||
| e7c7451004 | |||
| b4c933e3d4 | |||
| 8eeed6f6b9 | |||
| 6a339149f1 | |||
| 3aef7cd906 | |||
| 970976ecc5 | |||
| 7a52c7dd78 | |||
| fec9fe3527 | |||
| 2cb428ed9b | |||
| c6067a8758 | |||
| 3aa38027c8 | |||
| b8c57b6c49 | |||
| b332c76ef8 | |||
| 983a287c42 | |||
| 72982c1127 | |||
| 64cefebee5 | |||
| 4e3de185b8 | |||
| 8ec5120e54 | |||
| dad69eabfb | |||
| 6f21cec444 | |||
| c388edd0cf | |||
|
|
6fb24f3f2f | ||
|
|
3dd06261e2 | ||
|
|
901d2f842a | ||
|
|
e2d4f97d75 | ||
|
|
f44fc18c52 | ||
| 08cfc1ffb9 | |||
| 59aef0c661 | |||
| 23c6de3601 | |||
| bf9190dec6 | |||
| 3758e3da40 | |||
| bfcfcbb107 | |||
| e6ad4ff282 | |||
| 5f0931155d | |||
| e4c6faf923 | |||
| 593930ccfc | |||
| 7f09b0e501 | |||
| 9acb52a7e1 | |||
| 5c6f61f25a | |||
| f185b12620 | |||
| d0e8cee6bd | |||
| ac5b73e320 | |||
| 69b4a418ba | |||
| 2093201173 | |||
| 268f1aa09a | |||
| cc106f57e1 | |||
| 93a553ea93 | |||
| f23e15339c | |||
| 2be4848735 | |||
| c4d9be8403 | |||
| 4a26bd50ca | |||
| e931d9ec06 | |||
| f540d7fad5 | |||
| 3d35e81a97 | |||
| f6382c4ccd | |||
| cd64137148 | |||
| eae66eac8c | |||
| 85d3b129ae | |||
|
|
3b168a134a | ||
|
|
59fdc6b39e | ||
| 2a31d57a53 | |||
| 8f96716ac4 | |||
| d8e3fb6e9c | |||
| 536ee64f6d | |||
| 054ab5d63d | |||
| d2732857f1 | |||
| fb1c54998b | |||
| 2c4850cc8f | |||
| b135a4b37b | |||
| d92e3d0e17 | |||
| bc309dfa97 | |||
| 1141abf231 | |||
| e2896eb37d | |||
| e18d7426bc | |||
| c1d0e03b6c | |||
| d2a6bde8cd | |||
| f820b9e9c0 | |||
| 3e59529666 | |||
| bc679d9b90 | |||
| 7310884047 | |||
|
|
da997a54c7 | ||
| d8c329ac94 | |||
| cf3e645845 | |||
| 30573a4e45 | |||
| 93f65585e0 | |||
| 68c1e3a412 | |||
| aa96fc89ab | |||
| 58a2c88b2b | |||
| e7d7e7f96f | |||
| 099f4f934c | |||
| 81ca858cc1 | |||
| 82069629dd | |||
| 5177d00dce | |||
| bba560a468 | |||
| bf1ab316fc | |||
| adc8b6a3a7 | |||
|
|
e881bffe85 | ||
|
|
69d6617855 | ||
|
|
1230e63923 | ||
|
|
e33ad15475 | ||
|
|
a69cbb868a | ||
|
|
9d21eeace9 | ||
| e82bac7046 | |||
|
|
61a2fda6fa | ||
|
|
e66a5a3078 | ||
|
|
609e380664 | ||
|
|
e0fda2e104 | ||
| 55c7bae77c | |||
| 304d3e1c0e | |||
| 3e8b3f7629 | |||
|
|
9cfd3ba29a | ||
|
|
f6780194a5 | ||
|
|
c5810bce7b | ||
|
|
cd61fdf295 | ||
|
|
efc88b33e3 | ||
|
|
9026b2deb3 | ||
|
|
bbb908428e | ||
| 565cc79329 | |||
|
|
9f6a1edccb | ||
| d9b3593e9b | |||
| 34247fb70d | |||
| 7f074cb798 | |||
| e1f36d9689 | |||
| 230d0d21a5 | |||
| 43aa055d7d | |||
|
|
4f63f88b40 | ||
|
|
f382b2bc54 | ||
|
|
872865268b | ||
|
|
9c69c1f37b | ||
|
|
85fae69c97 | ||
|
|
4595583ca4 | ||
|
|
9e2eb6731f | ||
|
|
2289cf3ee4 | ||
| c83a584795 | |||
|
|
2a25abcf03 | ||
| 45eed2aefc | |||
|
|
65b12ddd4c | ||
| aefa9e2dff | |||
| ae0baf3e50 | |||
| 439b2fbc1e | |||
| f4d96cfa53 | |||
|
|
fabde0026f | ||
| 50c778b9b1 | |||
| 47b3e994d1 | |||
| 840ac25e8a | |||
| 84a6b2701c | |||
| 46e913a37b | |||
| 53fafabb1a | |||
| 506bf193d5 | |||
| 0ea8cb352d | |||
| cb208bb8af | |||
| e11d519627 | |||
| e33f6b0ce2 | |||
| 00afda56bb | |||
|
|
699bc2721e | ||
|
|
a1b92f0cc8 | ||
|
|
3c43e31afb | ||
| 169523bc33 | |||
| b626208771 | |||
| f1086a1ef9 | |||
| b730b53f7b | |||
|
|
a6c251c8da | ||
|
|
55ab421d88 | ||
| bb4c4f6ce4 | |||
| 367ae8653e | |||
| dbc3ea0a33 | |||
| 51f5ba9884 | |||
| e83244df61 | |||
| b43245b1f5 | |||
| ded31578d7 | |||
| 114958d992 | |||
| 3bff750fc9 | |||
| 0a218f995e | |||
| 7b9bd37900 | |||
| 4507e3589f | |||
| 6ae6d6e893 | |||
| c88404fada | |||
| 30b89c0f3d | |||
| 2a085f6906 | |||
| f4568f82a4 | |||
| e9939e73c1 | |||
| f9a65531c1 | |||
| ce4106743a | |||
| 67d2b58231 | |||
| dc32f00ead | |||
| 3eacdf6d39 | |||
| 6a247f456c | |||
| cb4faf0632 | |||
| 5e0d31f3ad | |||
| 0d8e26d2cc | |||
|
|
eee77ea451 | ||
|
|
3466c27c9e | ||
|
|
fe9a8e7505 | ||
|
|
ec94191153 | ||
|
|
ccc9e3e50f | ||
|
|
9d7d03e91c | ||
|
|
8340e2bacc | ||
|
|
f3f8a8de70 | ||
| d020a7d5bf | |||
| cf333d95d9 | |||
| ed99460850 | |||
| dcb09c955b | |||
| a52a941799 | |||
| 26a533adaf | |||
| 5ea546e04e | |||
| 4f98e4d6a3 | |||
| b2d7d493d5 | |||
| 7a2b65c013 | |||
|
|
5bd7dd3c9c | ||
| 8ca3185bc7 | |||
|
|
5d621e06b5 | ||
|
|
22c7ec46f8 | ||
| fa91550ad7 | |||
| de6df61960 | |||
| 2205ef46bb | |||
| 39bc4b81ae | |||
| aef7e3b12a | |||
| 4f0ad45eca | |||
| 11a90cb920 | |||
| a674235e39 | |||
| c5169b7654 | |||
| ba37db19f4 | |||
|
|
50654fac6d | ||
| 35b29d71a1 | |||
| 6a940011a1 | |||
| c73c72d77f | |||
|
|
237c35f0a0 | ||
|
|
43fd1d175d | ||
|
|
8b421d3c92 | ||
| ec2068615e | |||
| ccd9923102 | |||
|
|
c03761ed61 | ||
|
|
c17ccc7540 | ||
| 2218128663 | |||
| 40fc6383b1 | |||
| 4aa1804d44 | |||
| 64e5d4c401 | |||
| 3f5dd92af9 | |||
| e53ebeba33 | |||
| 63fab9f028 | |||
| 26a77da955 | |||
| d3af0e3973 | |||
| a0fad7f642 | |||
| b882050f24 | |||
| 4883cd91e7 | |||
| 70189d1b80 | |||
| e1612de365 | |||
| 0bbd542e71 | |||
| 28e2a38c14 | |||
| d892437deb | |||
| a64209c211 | |||
| dff64e7dbb | |||
| dbf510f4ed | |||
| 8894fa3300 | |||
| 3faa561f1c | |||
|
|
6292cdc006 | ||
|
|
bb5ba2218f | ||
| 7df0cd8027 | |||
| e9c1160993 | |||
| 3a2f2125a8 | |||
| db80395159 | |||
| c7a953995a | |||
| ac779f8767 | |||
| df7736a82a | |||
| 0a236d914d | |||
| 707967e62c | |||
| 8dda5c3bed | |||
| a75e76e05a | |||
| 2c4374554e | |||
| 493b970d9a | |||
| e0b4e2432f | |||
| 9c5ae39ead | |||
| bd9691b7eb | |||
| 8a78073e90 | |||
| 1d52cc1229 | |||
| 004bc076b1 | |||
| 7aa4d7dcd0 | |||
| 0778193ae4 | |||
|
|
0e730b952c | ||
| a5fcfcf96c | |||
| ef974ffd35 | |||
| a66442b0bc | |||
| 72d187ab76 | |||
| 673b66c5c6 | |||
| 4c0522c067 | |||
| 002b51b71c | |||
| 73956afc2a | |||
| 753e217424 | |||
| fb5e3f3960 | |||
| b2ca15f98b | |||
| aa13594e06 | |||
| 0f4659c8b4 | |||
| 63b9293727 | |||
|
|
0af2c371ca | ||
|
|
9b9d0526f8 | ||
|
|
807f1afb9d | ||
|
|
2f8e181b13 | ||
|
|
7a9cfc1861 | ||
|
|
ee9e56c479 | ||
|
|
e78cb09c0f | ||
|
|
7bd795b796 | ||
| 5d8f69209f | |||
| 7a96d68927 | |||
| dd2d14743e | |||
| 34fd7c6d8b | |||
| 0797723b88 | |||
| 44ffed3571 | |||
| 8ca75787b7 | |||
| ee09f14bfa | |||
| 2f473d1e13 | |||
| 9bb624f024 | |||
| a8d9bbe81d | |||
| 49f91e3b4e | |||
| a51502c622 | |||
| baea2ca96f | |||
| 24fc3ef12e | |||
| c5cc1454ca | |||
| 5cd4c41e01 | |||
| bfc04f53ee | |||
| db28cdff20 | |||
| e134a7a7ec | |||
| 5eca94abe0 | |||
| 010f649213 | |||
|
|
cdc7dea410 | ||
|
|
34d45c7878 | ||
| c9787acf13 | |||
| 11c2dd7ad7 | |||
| 6843bb4af2 | |||
| 616d361c9d | |||
| 91bc1f15cc | |||
| 78ceca9a36 | |||
| 97c8542eb6 | |||
| bea8a65c8e | |||
| ddea7e887f | |||
| cd21a1169c | |||
| 84940af2bd | |||
|
|
5ab850f354 | ||
| f4e2cf52f5 | |||
| 7679da2657 | |||
| bca073cb28 | |||
| 7bd85d4082 | |||
| 852c6c0924 | |||
| a9819b769a | |||
| ac8afa8d0c | |||
| 7708a88771 | |||
| c188eb478b | |||
| c15f54e611 | |||
| 7bc2ec6ebe | |||
| c80958b34d | |||
| 6fa027783c | |||
| 2c4871b821 | |||
| cc29e40cb1 | |||
| 4f15b259c4 | |||
| 4332c1ed7f | |||
| 9e882236d0 | |||
| 1c403d4839 | |||
| 5c7007c966 | |||
| 55a136c14b | |||
| 638eb245d8 | |||
| 2047e97655 | |||
| 20183be93d | |||
| 9c5ae6762b | |||
| 161243737a | |||
| 68c0d9c483 | |||
| 2d2338e89e | |||
| 44ccd892a4 | |||
| fe1adb0a21 | |||
| c09c8845fb | |||
| 3d7bd378aa | |||
| f08b824034 |
2
.env
Normal file
@ -0,0 +1,2 @@
|
||||
# Auto-generated by build\tools\generate-dotenv.ps1
|
||||
SNOW_VERSION=0.8.0
|
||||
95
.gitee/ISSUE_TEMPLATE/bug.yml
Normal file
@ -0,0 +1,95 @@
|
||||
name: "Bug 报告"
|
||||
description: "提交代码中发现的缺陷"
|
||||
title: "[Bug] "
|
||||
labels:
|
||||
- bug
|
||||
assignees: []
|
||||
|
||||
body:
|
||||
- type: textarea
|
||||
id: summary
|
||||
attributes:
|
||||
label: 问题概述
|
||||
description: 简要说明发生了什么
|
||||
placeholder: "在此填写问题概述…"
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
id: steps
|
||||
attributes:
|
||||
label: 重现步骤
|
||||
description: 按顺序列出重现流程
|
||||
placeholder: |
|
||||
1. …
|
||||
2. …
|
||||
3. …
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
id: expected
|
||||
attributes:
|
||||
label: 期望结果
|
||||
placeholder: "在此填写期望结果…"
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
id: actual
|
||||
attributes:
|
||||
label: 实际结果
|
||||
placeholder: "在此填写实际结果…"
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: dropdown
|
||||
id: os_type
|
||||
attributes:
|
||||
label: 操作系统
|
||||
options:
|
||||
- Windows
|
||||
- macOS
|
||||
- Linux
|
||||
- 其他
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: input
|
||||
id: os_version
|
||||
attributes:
|
||||
label: 系统版本
|
||||
description: 如 Windows 10 / macOS 14.0 / Ubuntu 22.04
|
||||
placeholder: "请输入操作系统版本"
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: dropdown
|
||||
id: app_version
|
||||
attributes:
|
||||
label: 软件版本/分支
|
||||
options:
|
||||
- v0.8.0
|
||||
- main
|
||||
- dev
|
||||
- 其他
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: input
|
||||
id: app_version_other
|
||||
attributes:
|
||||
label: 其他版本/分支
|
||||
description: 如果上方选“其他”,请填写
|
||||
placeholder: "请输入版本号或分支"
|
||||
validations:
|
||||
required: false
|
||||
|
||||
- type: textarea
|
||||
id: attachments
|
||||
attributes:
|
||||
label: 附加信息(可选)
|
||||
description: 日志、截图或其他相关信息
|
||||
placeholder: "如有日志或截图,可粘贴或附链接…"
|
||||
validations:
|
||||
required: false
|
||||
25
.gitee/ISSUE_TEMPLATE/chore.yml
Normal file
@ -0,0 +1,25 @@
|
||||
name: "维护任务"
|
||||
description: "依赖升级、格式化、脚本运行等项目维护工作"
|
||||
title: "[Chore] "
|
||||
labels:
|
||||
- chore
|
||||
assignees: []
|
||||
|
||||
body:
|
||||
- type: input
|
||||
id: chore_title
|
||||
attributes:
|
||||
label: 任务标题
|
||||
description: 简要描述维护内容
|
||||
placeholder: "如: 升级 JDK 版本"
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
id: chore_description
|
||||
attributes:
|
||||
label: 任务详情
|
||||
description: 描述执行步骤或相关脚本命令
|
||||
placeholder: "如: 修改 pom.xml…"
|
||||
validations:
|
||||
required: false
|
||||
5
.gitee/ISSUE_TEMPLATE/config.yml
Normal file
@ -0,0 +1,5 @@
|
||||
blank_issues_enabled: false # 禁用空白 Issue,强制选择模板
|
||||
contact_links: # 外部文档或反馈链接
|
||||
- name: Snow 项目 Git 管理规范
|
||||
url: https://gitee.com/jcnc-org/snow/blob/main/doc/Git-Management/Git-Management.md
|
||||
about: 分支管理与提交规范
|
||||
25
.gitee/ISSUE_TEMPLATE/docs.yml
Normal file
@ -0,0 +1,25 @@
|
||||
name: "文档改进"
|
||||
description: "报告文档错误、更新需求或新增文档请求"
|
||||
title: "[Docs] "
|
||||
labels:
|
||||
- docs
|
||||
assignees: []
|
||||
|
||||
body:
|
||||
- type: textarea
|
||||
id: docs_summary
|
||||
attributes:
|
||||
label: 文档概述
|
||||
description: 简要说明需要更新或新增的文档部分
|
||||
placeholder: "在此填写文档改进或更新需求…"
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
id: docs_details
|
||||
attributes:
|
||||
label: 详细说明
|
||||
description: 说明当前文档存在的问题或改进建议
|
||||
placeholder: "如有示例、截图或链接,请在此补充…"
|
||||
validations:
|
||||
required: false
|
||||
34
.gitee/ISSUE_TEMPLATE/enhancement.yml
Normal file
@ -0,0 +1,34 @@
|
||||
name: "功能优化"
|
||||
description: "对现有功能的改进或性能优化建议"
|
||||
title: "[Enhancement] "
|
||||
labels:
|
||||
- enhancement
|
||||
assignees: []
|
||||
|
||||
body:
|
||||
- type: textarea
|
||||
id: enhancement_summary
|
||||
attributes:
|
||||
label: 优化概述
|
||||
description: 简要说明希望改进的功能模块
|
||||
placeholder: "在此填写优化目标…"
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
id: enhancement_details
|
||||
attributes:
|
||||
label: 优化方案
|
||||
description: 详细描述改进思路与实现方式
|
||||
placeholder: "如: 缓存机制、算法优化…"
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
id: enhancement_benefit
|
||||
attributes:
|
||||
label: 预期收益
|
||||
description: 描述优化后带来的效益或体验提升
|
||||
placeholder: "如: 响应时间缩短 30%…"
|
||||
validations:
|
||||
required: false
|
||||
52
.gitee/ISSUE_TEMPLATE/feature.yml
Normal file
@ -0,0 +1,52 @@
|
||||
name: "新功能请求"
|
||||
description: "提出新的功能或改进建议"
|
||||
title: "[Feature] "
|
||||
labels:
|
||||
- feature
|
||||
assignees: []
|
||||
|
||||
body:
|
||||
- type: textarea
|
||||
id: feature_summary
|
||||
attributes:
|
||||
label: 功能概述
|
||||
description: 简要描述希望实现的功能及其场景
|
||||
placeholder: "在此填写功能概述…"
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
id: design_solution
|
||||
attributes:
|
||||
label: 设计方案
|
||||
description: 描述功能的具体实现方案与技术细节
|
||||
placeholder: "在此填写设计方案…"
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
id: alternatives
|
||||
attributes:
|
||||
label: 可选方案(可选)
|
||||
description: 列出已考虑的其他方案及其优缺点
|
||||
placeholder: "在此填写可选方案…"
|
||||
validations:
|
||||
required: false
|
||||
|
||||
- type: textarea
|
||||
id: impact_scope
|
||||
attributes:
|
||||
label: 影响范围(可选)
|
||||
description: 描述该功能对现有系统或用户的影响
|
||||
placeholder: "在此填写影响范围…"
|
||||
validations:
|
||||
required: false
|
||||
|
||||
- type: textarea
|
||||
id: additional_info
|
||||
attributes:
|
||||
label: 附加信息(可选)
|
||||
description: 如原型图、参考链接、截图等
|
||||
placeholder: "在此补充额外信息…"
|
||||
validations:
|
||||
required: false
|
||||
37
.gitee/ISSUE_TEMPLATE/hotfix.yml
Normal file
@ -0,0 +1,37 @@
|
||||
name: "紧急修复"
|
||||
description: "生产环境紧急问题的快速修复"
|
||||
title: "[Hotfix] "
|
||||
labels:
|
||||
- hotfix
|
||||
assignees: []
|
||||
|
||||
body:
|
||||
- type: textarea
|
||||
id: issue_summary
|
||||
attributes:
|
||||
label: 问题概述
|
||||
description: 简要描述需紧急修复的问题
|
||||
placeholder: "在此填写紧急问题描述…"
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: dropdown
|
||||
id: priority
|
||||
attributes:
|
||||
label: 优先级
|
||||
description: 选择修复优先级
|
||||
options:
|
||||
- P0
|
||||
- P1
|
||||
- P2
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: input
|
||||
id: deadline
|
||||
attributes:
|
||||
label: 修复截止日期
|
||||
description: 填写计划完成的日期 (YYYY-MM-DD)
|
||||
placeholder: "例如: 2025-06-20"
|
||||
validations:
|
||||
required: false
|
||||
34
.gitee/ISSUE_TEMPLATE/question.yml
Normal file
@ -0,0 +1,34 @@
|
||||
name: "疑问与讨论"
|
||||
description: "提交使用疑问或设计讨论话题"
|
||||
title: "[Question] "
|
||||
labels:
|
||||
- question
|
||||
assignees: []
|
||||
|
||||
body:
|
||||
- type: textarea
|
||||
id: question_details
|
||||
attributes:
|
||||
label: 问题描述
|
||||
description: 清晰说明遇到的问题或讨论主题
|
||||
placeholder: "在此填写问题或讨论点…"
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
id: question_attempts
|
||||
attributes:
|
||||
label: 已尝试方法
|
||||
description: 列出已尝试过的解决方案或思路
|
||||
placeholder: "如: 查阅文档、尝试示例代码…"
|
||||
validations:
|
||||
required: false
|
||||
|
||||
- type: textarea
|
||||
id: question_expectation
|
||||
attributes:
|
||||
label: 期望答案
|
||||
description: 描述希望获得的解答或帮助方向
|
||||
placeholder: "如: 最佳实践、配置示例…"
|
||||
validations:
|
||||
required: false
|
||||
34
.gitee/ISSUE_TEMPLATE/refactor.yml
Normal file
@ -0,0 +1,34 @@
|
||||
name: "代码重构"
|
||||
description: "优化现有代码结构、命名或逻辑的重构任务"
|
||||
title: "[Refactor] "
|
||||
labels:
|
||||
- refactor
|
||||
assignees: []
|
||||
|
||||
body:
|
||||
- type: textarea
|
||||
id: refactor_scope
|
||||
attributes:
|
||||
label: 重构范围
|
||||
description: 描述需要重构的模块或文件
|
||||
placeholder: "在此填写重构目标…"
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
id: refactor_reason
|
||||
attributes:
|
||||
label: 重构原因
|
||||
description: 说明当前存在的痛点或待改进之处
|
||||
placeholder: "如: 变量命名不规范、函数职责过多…"
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
id: refactor_expectation
|
||||
attributes:
|
||||
label: 预期效果
|
||||
description: 说明重构后带来的好处或验证方式
|
||||
placeholder: "如: 提高性能、增强可读性…"
|
||||
validations:
|
||||
required: false
|
||||
36
.gitee/PULL_REQUEST_TEMPLATE.zh-CN.md
Normal file
@ -0,0 +1,36 @@
|
||||
<!--
|
||||
感谢您提交 PR!在提交前,请确保已阅读并遵守项目的 Snow 项目 Git 管理规范。
|
||||
https://gitee.com/jcnc-org/snow/blob/main/doc/Git-Management/Git-Management.md
|
||||
提交 PR 后,请根据实际情况删除不适用的项。
|
||||
|
||||
1. 请在右侧面板中:
|
||||
- 关联 Issue
|
||||
- 选择 PR 类型(bug 修复 / 新功能 / 文档 / 优化 等)
|
||||
- 添加必要的标签和审查人
|
||||
- 请添加里程碑
|
||||
- 如必要请设置优先级
|
||||
|
||||
2. 在下面的“检查清单”里,用 `- [x]` 标记已完成,用 `- [ ]` 标记未完成。例如:
|
||||
- [x] 已阅读并遵守项目规范
|
||||
- [ ] 本地通过所有测试
|
||||
- [ ] 文档已更新(如有必要)
|
||||
|
||||
3. 确认所有勾选项都已完成后,再创建 Pull Request。
|
||||
|
||||
感谢你的配合!🙏
|
||||
-->
|
||||
|
||||
## 描述 (Description)
|
||||
|
||||
请简要描述本次变更的目的和内容。
|
||||
|
||||
## 主要改动 (Changes)
|
||||
|
||||
- 改动点 1
|
||||
- 改动点 2
|
||||
|
||||
## 检查清单 (Checklist)
|
||||
|
||||
- [ ] 已阅读并遵守项目规范
|
||||
- [ ] 本地通过所有测试
|
||||
- [ ] 文档已更新(如有必要)
|
||||
4
.gitignore
vendored
@ -37,3 +37,7 @@ target/
|
||||
/.idea/
|
||||
/Snow.tar
|
||||
/src/main/java/org/jcnc/snow/compiler/ir.tar
|
||||
|
||||
### Snow 虚拟机指令 ###
|
||||
*.water
|
||||
/.lingma/
|
||||
|
||||
11
.run/Bug1.run.xml
Normal file
@ -0,0 +1,11 @@
|
||||
<component name="ProjectRunConfigurationManager">
|
||||
<configuration default="false" name="Bug1" type="Application" factoryName="Application" folderName="BugFarm">
|
||||
<option name="ALTERNATIVE_JRE_PATH" value="graalvm-ce-23" />
|
||||
<option name="MAIN_CLASS_NAME" value="org.jcnc.snow.cli.SnowCLI" />
|
||||
<module name="Snow" />
|
||||
<option name="PROGRAM_PARAMETERS" value="compile run -d playground/BugFarm/Bug1 -o target/Bug1" />
|
||||
<method v="2">
|
||||
<option name="Make" enabled="true" />
|
||||
</method>
|
||||
</configuration>
|
||||
</component>
|
||||
11
.run/Bug2.run.xml
Normal file
@ -0,0 +1,11 @@
|
||||
<component name="ProjectRunConfigurationManager">
|
||||
<configuration default="false" name="Bug2" type="Application" factoryName="Application" folderName="BugFarm">
|
||||
<option name="ALTERNATIVE_JRE_PATH" value="graalvm-ce-23" />
|
||||
<option name="MAIN_CLASS_NAME" value="org.jcnc.snow.cli.SnowCLI" />
|
||||
<module name="Snow" />
|
||||
<option name="PROGRAM_PARAMETERS" value="compile run -d playground/BugFarm/Bug2 -o target/Bug2" />
|
||||
<method v="2">
|
||||
<option name="Make" enabled="true" />
|
||||
</method>
|
||||
</configuration>
|
||||
</component>
|
||||
11
.run/Bug3.run.xml
Normal file
@ -0,0 +1,11 @@
|
||||
<component name="ProjectRunConfigurationManager">
|
||||
<configuration default="false" name="Bug3" type="Application" factoryName="Application" folderName="BugFarm">
|
||||
<option name="ALTERNATIVE_JRE_PATH" value="graalvm-ce-23" />
|
||||
<option name="MAIN_CLASS_NAME" value="org.jcnc.snow.cli.SnowCLI" />
|
||||
<module name="Snow" />
|
||||
<option name="PROGRAM_PARAMETERS" value="compile run -d playground/BugFarm/Bug3 -o target/Bug3 --debug" />
|
||||
<method v="2">
|
||||
<option name="Make" enabled="true" />
|
||||
</method>
|
||||
</configuration>
|
||||
</component>
|
||||
11
.run/Bug4.run.xml
Normal file
@ -0,0 +1,11 @@
|
||||
<component name="ProjectRunConfigurationManager">
|
||||
<configuration default="false" name="Bug4" type="Application" factoryName="Application" folderName="BugFarm">
|
||||
<option name="ALTERNATIVE_JRE_PATH" value="graalvm-ce-23" />
|
||||
<option name="MAIN_CLASS_NAME" value="org.jcnc.snow.cli.SnowCLI" />
|
||||
<module name="Snow" />
|
||||
<option name="PROGRAM_PARAMETERS" value="compile run -d playground/BugFarm/Bug4 -o target/Bug4 --debug" />
|
||||
<method v="2">
|
||||
<option name="Make" enabled="true" />
|
||||
</method>
|
||||
</configuration>
|
||||
</component>
|
||||
11
.run/Bug5.run.xml
Normal file
@ -0,0 +1,11 @@
|
||||
<component name="ProjectRunConfigurationManager">
|
||||
<configuration default="false" name="Bug5" type="Application" factoryName="Application" folderName="BugFarm">
|
||||
<option name="ALTERNATIVE_JRE_PATH" value="graalvm-ce-23" />
|
||||
<option name="MAIN_CLASS_NAME" value="org.jcnc.snow.cli.SnowCLI" />
|
||||
<module name="Snow" />
|
||||
<option name="PROGRAM_PARAMETERS" value="compile run -d playground/BugFarm/Bug5 -o target/Bug5 " />
|
||||
<method v="2">
|
||||
<option name="Make" enabled="true" />
|
||||
</method>
|
||||
</configuration>
|
||||
</component>
|
||||
10
.run/Bug6.run.xml
Normal file
@ -0,0 +1,10 @@
|
||||
<component name="ProjectRunConfigurationManager">
|
||||
<configuration default="false" name="Bug6" type="Application" factoryName="Application" folderName="BugFarm">
|
||||
<option name="MAIN_CLASS_NAME" value="org.jcnc.snow.cli.SnowCLI" />
|
||||
<module name="Snow" />
|
||||
<option name="PROGRAM_PARAMETERS" value="compile run -d playground/BugFarm/Bug6 -o target/Bug6 --debug" />
|
||||
<method v="2">
|
||||
<option name="Make" enabled="true" />
|
||||
</method>
|
||||
</configuration>
|
||||
</component>
|
||||
11
.run/Demo1.run.xml
Normal file
@ -0,0 +1,11 @@
|
||||
<component name="ProjectRunConfigurationManager">
|
||||
<configuration default="false" name="Demo1" type="Application" factoryName="Application" folderName="Demo">
|
||||
<option name="ALTERNATIVE_JRE_PATH" value="graalvm-ce-23" />
|
||||
<option name="MAIN_CLASS_NAME" value="org.jcnc.snow.cli.SnowCLI" />
|
||||
<module name="Snow" />
|
||||
<option name="PROGRAM_PARAMETERS" value="compile run -d playground/Demo/Demo1 -o target/Demo1 --debug" />
|
||||
<method v="2">
|
||||
<option name="Make" enabled="true" />
|
||||
</method>
|
||||
</configuration>
|
||||
</component>
|
||||
11
.run/Demo10.run.xml
Normal file
@ -0,0 +1,11 @@
|
||||
<component name="ProjectRunConfigurationManager">
|
||||
<configuration default="false" name="Demo10" type="Application" factoryName="Application" folderName="Demo">
|
||||
<option name="ALTERNATIVE_JRE_PATH" value="graalvm-ce-23" />
|
||||
<option name="MAIN_CLASS_NAME" value="org.jcnc.snow.cli.SnowCLI" />
|
||||
<module name="Snow" />
|
||||
<option name="PROGRAM_PARAMETERS" value="compile run -d playground/Demo/Demo10 -o target/Demo10 --debug" />
|
||||
<method v="2">
|
||||
<option name="Make" enabled="true" />
|
||||
</method>
|
||||
</configuration>
|
||||
</component>
|
||||
11
.run/Demo11.run.xml
Normal file
@ -0,0 +1,11 @@
|
||||
<component name="ProjectRunConfigurationManager">
|
||||
<configuration default="false" name="Demo11" type="Application" factoryName="Application" folderName="Demo">
|
||||
<option name="ALTERNATIVE_JRE_PATH" value="graalvm-ce-23" />
|
||||
<option name="MAIN_CLASS_NAME" value="org.jcnc.snow.cli.SnowCLI" />
|
||||
<module name="Snow" />
|
||||
<option name="PROGRAM_PARAMETERS" value="compile run -d playground/Demo/Demo11 -o target/Demo11 --debug" />
|
||||
<method v="2">
|
||||
<option name="Make" enabled="true" />
|
||||
</method>
|
||||
</configuration>
|
||||
</component>
|
||||
11
.run/Demo12.run.xml
Normal file
@ -0,0 +1,11 @@
|
||||
<component name="ProjectRunConfigurationManager">
|
||||
<configuration default="false" name="Demo12" type="Application" factoryName="Application" folderName="Demo">
|
||||
<option name="ALTERNATIVE_JRE_PATH" value="graalvm-ce-23" />
|
||||
<option name="MAIN_CLASS_NAME" value="org.jcnc.snow.cli.SnowCLI" />
|
||||
<module name="Snow" />
|
||||
<option name="PROGRAM_PARAMETERS" value="compile run -d playground/Demo/Demo12 -o target/Demo12 --debug" />
|
||||
<method v="2">
|
||||
<option name="Make" enabled="true" />
|
||||
</method>
|
||||
</configuration>
|
||||
</component>
|
||||
10
.run/Demo13.run.xml
Normal file
@ -0,0 +1,10 @@
|
||||
<component name="ProjectRunConfigurationManager">
|
||||
<configuration default="false" name="Demo13" type="Application" factoryName="Application" folderName="Demo">
|
||||
<option name="MAIN_CLASS_NAME" value="org.jcnc.snow.cli.SnowCLI" />
|
||||
<module name="Snow" />
|
||||
<option name="PROGRAM_PARAMETERS" value="compile run -d playground/Demo/Demo13 -o target/Demo13 --debug" />
|
||||
<method v="2">
|
||||
<option name="Make" enabled="true" />
|
||||
</method>
|
||||
</configuration>
|
||||
</component>
|
||||
18
.run/Demo14.run.xml
Normal file
@ -0,0 +1,18 @@
|
||||
<component name="ProjectRunConfigurationManager">
|
||||
<configuration default="false" name="Demo14" type="Application" factoryName="Application" folderName="Demo">
|
||||
<option name="MAIN_CLASS_NAME" value="org.jcnc.snow.cli.SnowCLI" />
|
||||
<module name="Snow" />
|
||||
<option name="PROGRAM_PARAMETERS" value="compile run -d playground/Demo/Demo14 -o target/Demo14 --debug" />
|
||||
<method v="2">
|
||||
<option name="Make" enabled="true" />
|
||||
</method>
|
||||
</configuration>
|
||||
<configuration default="false" name="Demo14" type="Application" factoryName="Application" folderName="Demo">
|
||||
<option name="MAIN_CLASS_NAME" value="org.jcnc.snow.cli.SnowCLI" />
|
||||
<module name="Snow" />
|
||||
<option name="PROGRAM_PARAMETERS" value="compile run -d playground/Demo/Demo14 -o target/Demo14" />
|
||||
<method v="2">
|
||||
<option name="Make" enabled="true" />
|
||||
</method>
|
||||
</configuration>
|
||||
</component>
|
||||
10
.run/Demo15.run.xml
Normal file
@ -0,0 +1,10 @@
|
||||
<component name="ProjectRunConfigurationManager">
|
||||
<configuration default="false" name="Demo15" type="Application" factoryName="Application" folderName="Demo">
|
||||
<option name="MAIN_CLASS_NAME" value="org.jcnc.snow.cli.SnowCLI" />
|
||||
<module name="Snow" />
|
||||
<option name="PROGRAM_PARAMETERS" value="compile run -d playground/Demo/Demo15 -o target/Demo15 --debug" />
|
||||
<method v="2">
|
||||
<option name="Make" enabled="true" />
|
||||
</method>
|
||||
</configuration>
|
||||
</component>
|
||||
10
.run/Demo16.run.xml
Normal file
@ -0,0 +1,10 @@
|
||||
<component name="ProjectRunConfigurationManager">
|
||||
<configuration default="false" name="Demo16" type="Application" factoryName="Application" folderName="Demo">
|
||||
<option name="MAIN_CLASS_NAME" value="org.jcnc.snow.cli.SnowCLI" />
|
||||
<module name="Snow" />
|
||||
<option name="PROGRAM_PARAMETERS" value="compile run -d playground/Demo/Demo16 -o target/Demo16 --debug" />
|
||||
<method v="2">
|
||||
<option name="Make" enabled="true" />
|
||||
</method>
|
||||
</configuration>
|
||||
</component>
|
||||
10
.run/Demo17.run.xml
Normal file
@ -0,0 +1,10 @@
|
||||
<component name="ProjectRunConfigurationManager">
|
||||
<configuration default="false" name="Demo17" type="Application" factoryName="Application" folderName="Demo">
|
||||
<option name="MAIN_CLASS_NAME" value="org.jcnc.snow.cli.SnowCLI" />
|
||||
<module name="Snow" />
|
||||
<option name="PROGRAM_PARAMETERS" value="compile run -d playground/Demo/Demo17 -o target/Demo17 --debug" />
|
||||
<method v="2">
|
||||
<option name="Make" enabled="true" />
|
||||
</method>
|
||||
</configuration>
|
||||
</component>
|
||||
10
.run/Demo18.run.xml
Normal file
@ -0,0 +1,10 @@
|
||||
<component name="ProjectRunConfigurationManager">
|
||||
<configuration default="false" name="Demo18" type="Application" factoryName="Application" folderName="Demo">
|
||||
<option name="MAIN_CLASS_NAME" value="org.jcnc.snow.cli.SnowCLI" />
|
||||
<module name="Snow" />
|
||||
<option name="PROGRAM_PARAMETERS" value="compile run -d playground/Demo/Demo18 -o target/Demo18 --debug" />
|
||||
<method v="2">
|
||||
<option name="Make" enabled="true" />
|
||||
</method>
|
||||
</configuration>
|
||||
</component>
|
||||
10
.run/Demo19.run.xml
Normal file
@ -0,0 +1,10 @@
|
||||
<component name="ProjectRunConfigurationManager">
|
||||
<configuration default="false" name="Demo19" type="Application" factoryName="Application" folderName="Demo">
|
||||
<option name="MAIN_CLASS_NAME" value="org.jcnc.snow.cli.SnowCLI" />
|
||||
<module name="Snow" />
|
||||
<option name="PROGRAM_PARAMETERS" value="compile run -d playground/Demo/Demo19 -o target/Demo19 --debug" />
|
||||
<method v="2">
|
||||
<option name="Make" enabled="true" />
|
||||
</method>
|
||||
</configuration>
|
||||
</component>
|
||||
11
.run/Demo2.run.xml
Normal file
@ -0,0 +1,11 @@
|
||||
<component name="ProjectRunConfigurationManager">
|
||||
<configuration default="false" name="Demo2" type="Application" factoryName="Application" folderName="Demo">
|
||||
<option name="ALTERNATIVE_JRE_PATH" value="graalvm-ce-23" />
|
||||
<option name="MAIN_CLASS_NAME" value="org.jcnc.snow.cli.SnowCLI" />
|
||||
<module name="Snow" />
|
||||
<option name="PROGRAM_PARAMETERS" value="compile run -d playground/Demo/Demo2 -o target/Demo2 --debug" />
|
||||
<method v="2">
|
||||
<option name="Make" enabled="true" />
|
||||
</method>
|
||||
</configuration>
|
||||
</component>
|
||||
10
.run/Demo20.run.xml
Normal file
@ -0,0 +1,10 @@
|
||||
<component name="ProjectRunConfigurationManager">
|
||||
<configuration default="false" name="Demo20" type="Application" factoryName="Application" folderName="Demo">
|
||||
<option name="MAIN_CLASS_NAME" value="org.jcnc.snow.cli.SnowCLI" />
|
||||
<module name="Snow" />
|
||||
<option name="PROGRAM_PARAMETERS" value="compile run -d playground/Demo/Demo20 -o target/Demo20 --debug" />
|
||||
<method v="2">
|
||||
<option name="Make" enabled="true" />
|
||||
</method>
|
||||
</configuration>
|
||||
</component>
|
||||
10
.run/Demo21.run.xml
Normal file
@ -0,0 +1,10 @@
|
||||
<component name="ProjectRunConfigurationManager">
|
||||
<configuration default="false" name="Demo21" type="Application" factoryName="Application" folderName="Demo">
|
||||
<option name="MAIN_CLASS_NAME" value="org.jcnc.snow.cli.SnowCLI" />
|
||||
<module name="Snow" />
|
||||
<option name="PROGRAM_PARAMETERS" value="compile run -d playground/Demo/Demo21 -o target/Demo21 --debug" />
|
||||
<method v="2">
|
||||
<option name="Make" enabled="true" />
|
||||
</method>
|
||||
</configuration>
|
||||
</component>
|
||||
10
.run/Demo22.run.xml
Normal file
@ -0,0 +1,10 @@
|
||||
<component name="ProjectRunConfigurationManager">
|
||||
<configuration default="false" name="Demo22" type="Application" factoryName="Application" folderName="Demo">
|
||||
<option name="MAIN_CLASS_NAME" value="org.jcnc.snow.cli.SnowCLI" />
|
||||
<module name="Snow" />
|
||||
<option name="PROGRAM_PARAMETERS" value="compile run -d playground/Demo/Demo22 -o target/Demo22" />
|
||||
<method v="2">
|
||||
<option name="Make" enabled="true" />
|
||||
</method>
|
||||
</configuration>
|
||||
</component>
|
||||
10
.run/Demo23.run.xml
Normal file
@ -0,0 +1,10 @@
|
||||
<component name="ProjectRunConfigurationManager">
|
||||
<configuration default="false" name="Demo23" type="Application" factoryName="Application" folderName="Demo">
|
||||
<option name="MAIN_CLASS_NAME" value="org.jcnc.snow.cli.SnowCLI" />
|
||||
<module name="Snow" />
|
||||
<option name="PROGRAM_PARAMETERS" value="compile run -d playground/Demo/Demo23 -o target/Demo23 --debug" />
|
||||
<method v="2">
|
||||
<option name="Make" enabled="true" />
|
||||
</method>
|
||||
</configuration>
|
||||
</component>
|
||||
10
.run/Demo24.run.xml
Normal file
@ -0,0 +1,10 @@
|
||||
<component name="ProjectRunConfigurationManager">
|
||||
<configuration default="false" name="Demo24" type="Application" factoryName="Application" folderName="Demo">
|
||||
<option name="MAIN_CLASS_NAME" value="org.jcnc.snow.cli.SnowCLI" />
|
||||
<module name="Snow" />
|
||||
<option name="PROGRAM_PARAMETERS" value="compile run -d playground/Demo/Demo24 -o target/Demo24" />
|
||||
<method v="2">
|
||||
<option name="Make" enabled="true" />
|
||||
</method>
|
||||
</configuration>
|
||||
</component>
|
||||
10
.run/Demo25.run.xml
Normal file
@ -0,0 +1,10 @@
|
||||
<component name="ProjectRunConfigurationManager">
|
||||
<configuration default="false" name="Demo25" type="Application" factoryName="Application" folderName="Demo">
|
||||
<option name="MAIN_CLASS_NAME" value="org.jcnc.snow.cli.SnowCLI" />
|
||||
<module name="Snow" />
|
||||
<option name="PROGRAM_PARAMETERS" value="compile run -d playground/Demo/Demo25 -o target/Demo25" />
|
||||
<method v="2">
|
||||
<option name="Make" enabled="true" />
|
||||
</method>
|
||||
</configuration>
|
||||
</component>
|
||||
11
.run/Demo3.run.xml
Normal file
@ -0,0 +1,11 @@
|
||||
<component name="ProjectRunConfigurationManager">
|
||||
<configuration default="false" name="Demo3" type="Application" factoryName="Application" folderName="Demo">
|
||||
<option name="ALTERNATIVE_JRE_PATH" value="graalvm-ce-23" />
|
||||
<option name="MAIN_CLASS_NAME" value="org.jcnc.snow.cli.SnowCLI" />
|
||||
<module name="Snow" />
|
||||
<option name="PROGRAM_PARAMETERS" value="compile run -d playground/Demo/Demo3 -o target/Demo3 --debug" />
|
||||
<method v="2">
|
||||
<option name="Make" enabled="true" />
|
||||
</method>
|
||||
</configuration>
|
||||
</component>
|
||||
11
.run/Demo4.run.xml
Normal file
@ -0,0 +1,11 @@
|
||||
<component name="ProjectRunConfigurationManager">
|
||||
<configuration default="false" name="Demo4" type="Application" factoryName="Application" folderName="Demo">
|
||||
<option name="ALTERNATIVE_JRE_PATH" value="graalvm-ce-23" />
|
||||
<option name="MAIN_CLASS_NAME" value="org.jcnc.snow.cli.SnowCLI" />
|
||||
<module name="Snow" />
|
||||
<option name="PROGRAM_PARAMETERS" value="compile run -d playground/Demo/Demo4 -o target/Demo4 --debug" />
|
||||
<method v="2">
|
||||
<option name="Make" enabled="true" />
|
||||
</method>
|
||||
</configuration>
|
||||
</component>
|
||||
11
.run/Demo5.run.xml
Normal file
@ -0,0 +1,11 @@
|
||||
<component name="ProjectRunConfigurationManager">
|
||||
<configuration default="false" name="Demo5" type="Application" factoryName="Application" folderName="Demo">
|
||||
<option name="ALTERNATIVE_JRE_PATH" value="graalvm-ce-23" />
|
||||
<option name="MAIN_CLASS_NAME" value="org.jcnc.snow.cli.SnowCLI" />
|
||||
<module name="Snow" />
|
||||
<option name="PROGRAM_PARAMETERS" value="compile run -d playground/Demo/Demo5 -o target/Demo5 --debug" />
|
||||
<method v="2">
|
||||
<option name="Make" enabled="true" />
|
||||
</method>
|
||||
</configuration>
|
||||
</component>
|
||||
11
.run/Demo6.run.xml
Normal file
@ -0,0 +1,11 @@
|
||||
<component name="ProjectRunConfigurationManager">
|
||||
<configuration default="false" name="Demo6" type="Application" factoryName="Application" folderName="Demo">
|
||||
<option name="ALTERNATIVE_JRE_PATH" value="graalvm-ce-23" />
|
||||
<option name="MAIN_CLASS_NAME" value="org.jcnc.snow.cli.SnowCLI" />
|
||||
<module name="Snow" />
|
||||
<option name="PROGRAM_PARAMETERS" value="compile run -d playground/Demo/Demo6 -o target/Demo6 --debug" />
|
||||
<method v="2">
|
||||
<option name="Make" enabled="true" />
|
||||
</method>
|
||||
</configuration>
|
||||
</component>
|
||||
11
.run/Demo7.run.xml
Normal file
@ -0,0 +1,11 @@
|
||||
<component name="ProjectRunConfigurationManager">
|
||||
<configuration default="false" name="Demo7" type="Application" factoryName="Application" folderName="Demo">
|
||||
<option name="ALTERNATIVE_JRE_PATH" value="graalvm-ce-23" />
|
||||
<option name="MAIN_CLASS_NAME" value="org.jcnc.snow.cli.SnowCLI" />
|
||||
<module name="Snow" />
|
||||
<option name="PROGRAM_PARAMETERS" value="compile run -d playground/Demo/Demo7 -o target/Demo7 --debug" />
|
||||
<method v="2">
|
||||
<option name="Make" enabled="true" />
|
||||
</method>
|
||||
</configuration>
|
||||
</component>
|
||||
11
.run/Demo8.run.xml
Normal file
@ -0,0 +1,11 @@
|
||||
<component name="ProjectRunConfigurationManager">
|
||||
<configuration default="false" name="Demo8" type="Application" factoryName="Application" folderName="Demo">
|
||||
<option name="ALTERNATIVE_JRE_PATH" value="graalvm-ce-23" />
|
||||
<option name="MAIN_CLASS_NAME" value="org.jcnc.snow.cli.SnowCLI" />
|
||||
<module name="Snow" />
|
||||
<option name="PROGRAM_PARAMETERS" value="compile run -d playground/Demo/Demo8 -o target/Demo8 --debug" />
|
||||
<method v="2">
|
||||
<option name="Make" enabled="true" />
|
||||
</method>
|
||||
</configuration>
|
||||
</component>
|
||||
11
.run/Demo9.run.xml
Normal file
@ -0,0 +1,11 @@
|
||||
<component name="ProjectRunConfigurationManager">
|
||||
<configuration default="false" name="Demo9" type="Application" factoryName="Application" folderName="Demo">
|
||||
<option name="ALTERNATIVE_JRE_PATH" value="graalvm-ce-23" />
|
||||
<option name="MAIN_CLASS_NAME" value="org.jcnc.snow.cli.SnowCLI" />
|
||||
<module name="Snow" />
|
||||
<option name="PROGRAM_PARAMETERS" value="compile run -d playground/Demo/Demo9 -o target/Demo9 --debug" />
|
||||
<method v="2">
|
||||
<option name="Make" enabled="true" />
|
||||
</method>
|
||||
</configuration>
|
||||
</component>
|
||||
10
.run/Help.run.xml
Normal file
@ -0,0 +1,10 @@
|
||||
<component name="ProjectRunConfigurationManager">
|
||||
<configuration default="false" name="Help" type="Application" factoryName="Application">
|
||||
<option name="MAIN_CLASS_NAME" value="org.jcnc.snow.cli.SnowCLI" />
|
||||
<module name="Snow" />
|
||||
<option name="PROGRAM_PARAMETERS" value="--help" />
|
||||
<method v="2">
|
||||
<option name="Make" enabled="true" />
|
||||
</method>
|
||||
</configuration>
|
||||
</component>
|
||||
@ -1,7 +0,0 @@
|
||||
<component name="ProjectRunConfigurationManager">
|
||||
<configuration default="false" name="Run" type="CompoundRunConfigurationType">
|
||||
<toRun name="build_project2tar.ps1" type="PowerShellRunType" />
|
||||
<toRun name="SnowCompiler" type="Application" />
|
||||
<method v="2" />
|
||||
</configuration>
|
||||
</component>
|
||||
15
.run/Snow.run.xml
Normal file
@ -0,0 +1,15 @@
|
||||
<component name="ProjectRunConfigurationManager">
|
||||
<configuration default="false" name="Snow" type="Application" factoryName="Application">
|
||||
<option name="MAIN_CLASS_NAME" value="org.jcnc.snow.cli.SnowCLI" />
|
||||
<module name="Snow" />
|
||||
<extension name="coverage">
|
||||
<pattern>
|
||||
<option name="PATTERN" value="org.jcnc.snow.cli.SnowCLI" />
|
||||
<option name="ENABLED" value="true" />
|
||||
</pattern>
|
||||
</extension>
|
||||
<method v="2">
|
||||
<option name="Make" enabled="true" />
|
||||
</method>
|
||||
</configuration>
|
||||
</component>
|
||||
@ -1,32 +0,0 @@
|
||||
<component name="ProjectRunConfigurationManager">
|
||||
<configuration default="false" name="SnowCompiler" type="Application" factoryName="Application" activateToolWindowBeforeRun="false" nameIsGenerated="true">
|
||||
<option name="ALTERNATIVE_JRE_PATH" value="23" />
|
||||
<option name="MAIN_CLASS_NAME" value="org.jcnc.snow.compiler.cli.SnowCompiler" />
|
||||
<module name="SCompiler" />
|
||||
<option name="PROGRAM_PARAMETERS" value="test" />
|
||||
<extension name="coverage">
|
||||
<pattern>
|
||||
<option name="PATTERN" value="org.jcnc.snow.compiler.parser.preprocessor.lexer.impl.api.*" />
|
||||
<option name="ENABLED" value="true" />
|
||||
</pattern>
|
||||
</extension>
|
||||
<method v="2">
|
||||
<option name="Make" enabled="true" />
|
||||
</method>
|
||||
</configuration>
|
||||
<configuration default="false" name="SnowCompiler" type="Application" factoryName="Application" activateToolWindowBeforeRun="false" nameIsGenerated="true">
|
||||
<option name="ALTERNATIVE_JRE_PATH" value="graalvm-ce-23" />
|
||||
<option name="MAIN_CLASS_NAME" value="org.jcnc.snow.compiler.cli.SnowCompiler" />
|
||||
<module name="Snow" />
|
||||
<option name="PROGRAM_PARAMETERS" value="-d playground" />
|
||||
<extension name="coverage">
|
||||
<pattern>
|
||||
<option name="PATTERN" value="org.jcnc.snow.compiler.parser.preprocessor.lexer.impl.api.*" />
|
||||
<option name="ENABLED" value="true" />
|
||||
</pattern>
|
||||
</extension>
|
||||
<method v="2">
|
||||
<option name="Make" enabled="true" />
|
||||
</method>
|
||||
</configuration>
|
||||
</component>
|
||||
10
.run/Version.run.xml
Normal file
@ -0,0 +1,10 @@
|
||||
<component name="ProjectRunConfigurationManager">
|
||||
<configuration default="false" name="Version" type="Application" factoryName="Application">
|
||||
<option name="MAIN_CLASS_NAME" value="org.jcnc.snow.cli.SnowCLI" />
|
||||
<module name="Snow" />
|
||||
<option name="PROGRAM_PARAMETERS" value="--version" />
|
||||
<method v="2">
|
||||
<option name="Make" enabled="true" />
|
||||
</method>
|
||||
</configuration>
|
||||
</component>
|
||||
6
.run/build-project2tar.ps1.run.xml
Normal file
@ -0,0 +1,6 @@
|
||||
<component name="ProjectRunConfigurationManager">
|
||||
<configuration default="false" name="build-project2tar.ps1" type="PowerShellRunType" factoryName="PowerShell" scriptUrl="$PROJECT_DIR$/build/build-project2tar.ps1" executablePath="C:/WINDOWS/System32/WindowsPowerShell/v1.0/powershell.exe">
|
||||
<envs />
|
||||
<method v="2" />
|
||||
</configuration>
|
||||
</component>
|
||||
@ -1,9 +1,9 @@
|
||||
<component name="ProjectRunConfigurationManager">
|
||||
<configuration default="false" name="build_project2tar.ps1" type="PowerShellRunType" factoryName="PowerShell" scriptUrl="$PROJECT_DIR$/build/build_project2tar.ps1" executablePath="C:/WINDOWS/System32/WindowsPowerShell/v1.0/powershell.exe">
|
||||
<configuration default="false" name="build-release-all.ps1" type="PowerShellRunType" factoryName="PowerShell" scriptUrl="$PROJECT_DIR$/build/build-release-all.ps1" executablePath="C:/WINDOWS/System32/WindowsPowerShell/v1.0/powershell.exe">
|
||||
<envs />
|
||||
<method v="2" />
|
||||
</configuration>
|
||||
<configuration default="false" name="build_project2tar.ps1" type="PowerShellRunType" factoryName="PowerShell" scriptUrl="$PROJECT_DIR$/build/build_project2tar.ps1" executablePath="C:/WINDOWS/System32/WindowsPowerShell/v1.0/powershell.exe">
|
||||
<configuration default="false" name="build-release-all.ps1" type="PowerShellRunType" factoryName="PowerShell" scriptUrl="$PROJECT_DIR$/build/build-release-all.ps1" executablePath="C:/WINDOWS/System32/WindowsPowerShell/v1.0/powershell.exe">
|
||||
<envs />
|
||||
<method v="2" />
|
||||
</configuration>
|
||||
6
.run/release-linux.ps1.run.xml
Normal file
@ -0,0 +1,6 @@
|
||||
<component name="ProjectRunConfigurationManager">
|
||||
<configuration default="false" name="release-linux.ps1" type="PowerShellRunType" factoryName="PowerShell" scriptUrl="$PROJECT_DIR$/build/release-linux.ps1" executablePath="C:/WINDOWS/System32/WindowsPowerShell/v1.0/powershell.exe">
|
||||
<envs />
|
||||
<method v="2" />
|
||||
</configuration>
|
||||
</component>
|
||||
6
.run/release-windows.ps1.run.xml
Normal file
@ -0,0 +1,6 @@
|
||||
<component name="ProjectRunConfigurationManager">
|
||||
<configuration default="false" name="release-windows.ps1" type="PowerShellRunType" factoryName="PowerShell" scriptUrl="$PROJECT_DIR$/build/release-windows.ps1" executablePath="C:/WINDOWS/System32/WindowsPowerShell/v1.0/powershell.exe">
|
||||
<envs />
|
||||
<method v="2" />
|
||||
</configuration>
|
||||
</component>
|
||||
29
.run/测试.run.xml
Normal file
@ -0,0 +1,29 @@
|
||||
<component name="ProjectRunConfigurationManager">
|
||||
<configuration default="false" name="测试" type="CompoundRunConfigurationType">
|
||||
<toRun name="Demo1" type="Application" />
|
||||
<toRun name="Demo10" type="Application" />
|
||||
<toRun name="Demo11" type="Application" />
|
||||
<toRun name="Demo12" type="Application" />
|
||||
<toRun name="Demo13" type="Application" />
|
||||
<toRun name="Demo14" type="Application" />
|
||||
<toRun name="Demo15" type="Application" />
|
||||
<toRun name="Demo16" type="Application" />
|
||||
<toRun name="Demo17" type="Application" />
|
||||
<toRun name="Demo18" type="Application" />
|
||||
<toRun name="Demo19" type="Application" />
|
||||
<toRun name="Demo2" type="Application" />
|
||||
<toRun name="Demo20" type="Application" />
|
||||
<toRun name="Demo21" type="Application" />
|
||||
<toRun name="Demo22" type="Application" />
|
||||
<toRun name="Demo23" type="Application" />
|
||||
<toRun name="Demo24" type="Application" />
|
||||
<toRun name="Demo25" type="Application" />
|
||||
<toRun name="Demo3" type="Application" />
|
||||
<toRun name="Demo4" type="Application" />
|
||||
<toRun name="Demo6" type="Application" />
|
||||
<toRun name="Demo7" type="Application" />
|
||||
<toRun name="Demo8" type="Application" />
|
||||
<toRun name="Demo9" type="Application" />
|
||||
<method v="2" />
|
||||
</configuration>
|
||||
</component>
|
||||
57
Dockerfile
Normal file
@ -0,0 +1,57 @@
|
||||
# Stage 1: 官方 GraalVM 社区版(已含 native-image)
|
||||
FROM ghcr.io/graalvm/native-image-community:24.0.2 AS builder
|
||||
|
||||
RUN microdnf install -y \
|
||||
gcc gcc-c++ make git wget tar gzip which findutils maven \
|
||||
&& microdnf clean all
|
||||
|
||||
# ---------- 构建 musl ----------
|
||||
ARG MUSL_VER=1.2.5
|
||||
WORKDIR /tmp
|
||||
RUN wget -q https://musl.libc.org/releases/musl-${MUSL_VER}.tar.gz \
|
||||
&& tar -xzf musl-${MUSL_VER}.tar.gz \
|
||||
&& cd musl-${MUSL_VER} \
|
||||
&& ./configure --prefix=/opt/musl-${MUSL_VER} --disable-shared \
|
||||
&& make -j"$(nproc)" \
|
||||
&& make install \
|
||||
&& ln -s /opt/musl-${MUSL_VER} /opt/musl \
|
||||
&& cd / && rm -rf /tmp/musl-${MUSL_VER}*
|
||||
|
||||
RUN ln -s /opt/musl/bin/musl-gcc /usr/local/bin/x86_64-linux-musl-gcc \
|
||||
&& ln -s /opt/musl/bin/musl-gcc /usr/local/bin/x86_64-linux-musl-cc
|
||||
|
||||
ENV PATH="/opt/musl/bin:${PATH}"
|
||||
ENV CC="musl-gcc"
|
||||
ENV C_INCLUDE_PATH="/opt/musl/include"
|
||||
ENV LIBRARY_PATH="/opt/musl/lib"
|
||||
|
||||
# ---------- 静态 zlib ----------
|
||||
ARG ZLIB_VERSION=1.3.1
|
||||
WORKDIR /tmp
|
||||
RUN wget -q https://zlib.net/zlib-${ZLIB_VERSION}.tar.gz \
|
||||
&& tar -xzf zlib-${ZLIB_VERSION}.tar.gz \
|
||||
&& cd zlib-${ZLIB_VERSION} \
|
||||
&& CC=musl-gcc ./configure --static --prefix=/opt/musl \
|
||||
&& make -j"$(nproc)" \
|
||||
&& make install \
|
||||
&& cd / && rm -rf /tmp/zlib-${ZLIB_VERSION}*
|
||||
|
||||
# ---------- Maven 缓存优化 ----------
|
||||
WORKDIR /app
|
||||
COPY pom.xml ./
|
||||
|
||||
# 先拉依赖并缓存
|
||||
RUN mvn -B -P native-linux dependency:go-offline
|
||||
|
||||
# ---------- 复制源码 ----------
|
||||
COPY . /app
|
||||
|
||||
# ---------- 编译 native image ----------
|
||||
RUN mvn -P native-linux -DskipTests clean package
|
||||
|
||||
# ------------------------------------------------------------
|
||||
# Stage 2: 输出产物镜像(可以直接 cp 出二进制)
|
||||
# ------------------------------------------------------------
|
||||
FROM busybox AS export
|
||||
WORKDIR /export
|
||||
COPY --from=builder /app/org.jcnc.snow.cli.SnowCLI /export/Snow
|
||||
3
LICENSE
@ -186,7 +186,8 @@
|
||||
same "printed page" as the copyright notice for easier
|
||||
identification within third-party archives.
|
||||
|
||||
Copyright [yyyy] [name of copyright owner]
|
||||
Copyright © 2025 Ke Xu (Luke), on behalf of the SnowLang Project
|
||||
Repository: https://gitee.com/jcnc-org/snow
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
|
||||
15
NOTICE
Normal file
@ -0,0 +1,15 @@
|
||||
==========================================
|
||||
SnowLang Project – NOTICE
|
||||
==========================================
|
||||
|
||||
Copyright © 2025 Ke Xu (Luke), on behalf of the SnowLang Project
|
||||
Repository: https://gitee.com/jcnc-org/snow
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License")
|
||||
You may obtain a copy of the License at:
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
===============================================================================
|
||||
This product includes software developed by the SnowLang Project and
|
||||
its contributors.
|
||||
===============================================================================
|
||||
697
README.md
@ -1,5 +1,5 @@
|
||||
<p align="center">
|
||||
<img src="doc/README/IMG/IMG_Snow_icon_128.svg" alt="Snow Icon">
|
||||
<img src="docs/README/IMG/icon/IMG_Snow_icon_128.svg" alt="Snow Icon">
|
||||
<h1 align="center" style="margin: 30px 0 30px; font-weight: bold;">Snow编程语言</h1>
|
||||
|
||||
<p align="center">
|
||||
@ -11,8 +11,8 @@
|
||||
<a href="https://gitee.com/jcnc-org/snow/blob/main/LICENSE">
|
||||
<img src="https://img.shields.io/badge/%20license-Apache--2.0%20-blue" alt="">
|
||||
</a>
|
||||
<a href="https://gitee.com/jcnc-org/snow/tree/v0.1/">
|
||||
<img src="https://img.shields.io/badge/version-v0.1.1-blue" alt="">
|
||||
<a href="https://gitee.com/jcnc-org/snow/tree/v0.8.0/">
|
||||
<img src="https://img.shields.io/badge/version-v0.8.0-blue" alt="">
|
||||
</a>
|
||||
</p>
|
||||
|
||||
@ -30,37 +30,67 @@
|
||||
|
||||
## 项目简介
|
||||
|
||||
Snow 语言是一个正在发展的编程语言,采用类模块(module)语法风格,支持函数定义和类型注解。它设计目标是让大型语言模型(LLM)更容易生成和理解编程代码。该项目实现了 Snow 语言的完整编译流程,包括词法分析,语法分析,语义分析,中间表示(IR)生成以及最终的虚拟机(VM)指令生成和执行器。通过 Snow 编译器,可以将 `.snow` 源文件编译为中间表示和自定义的虚拟机指令,并在内置的虚拟机上直接运行。
|
||||
Snow 是一门受 LLM 时代启发的、面向 AI 友好的编程语言。它设计目标是让 LLM 更容易生成和理解编程代码。
|
||||
|
||||
该项目实现了 Snow
|
||||
语言的完整编译流程,包括词法分析,语法分析,语义分析,中间表示(IR)生成以及最终的虚拟机(VM)指令生成和执行器,提供从源码到字节码再到自研编程语言虚拟机 (
|
||||
SnowVM) 的完整编译-执行链路。
|
||||
|
||||
通过 Snow 编译器,可以将 `.snow` 源文件编译为 `.water`虚拟机指令,并在 SnowVM 上直接运行。
|
||||
|
||||
从源码编译、构建管理、依赖管理、项目标准化、可视化调试面板到原生镜像发布,全部由 Snow 官方工具完成,降低学习与集成成本。
|
||||
|
||||
## 背景理念
|
||||
|
||||
Snow 语言受到 LLM 驱动代码生成趋势的启发,强调简单而清晰的语法和严格的类型系统,以帮助人工智能模型更好地理解程序结构。语言使用显式的 `module` 声明来组织代码,用 `function`,`parameter`,`return_type`,`body` 等关键字分隔不同代码块,语法结构固定且易读。此外,Snow 实现了语义分析来检查变量作用域和类型一致性,在编译阶段捕获错误并确保生成的中间代码正确无误。这种自上而下的编译流程,使得代码设计和生成更加模块化,可解释,也有利于调试和优化。
|
||||
Snow 语言受到 LLM 驱动代码生成趋势的启发,强调简单而清晰的语法和严格的类型系统,以帮助 LLM 更好地理解程序。
|
||||
|
||||
相关背景: [心路历程](doc/Snow's-Journey/Snow's-Journey.md)
|
||||
语言使用显式的 `module` 声明来组织代码,用 `function`,`params`,`returns`,`body` 等关键字分隔不同代码块,语法结构固定且易读。此外,Snow
|
||||
实现了语义分析来检查变量作用域和类型一致性,在编译阶段捕获错误并确保生成的中间代码正确无误。这种自上而下的编译流程,使得代码设计和生成更加模块化,可解释,也有利于调试和优化。
|
||||
|
||||
## 下载Snow发行版
|
||||
|
||||
访问: https://gitee.com/jcnc-org/snow/releases
|
||||
相关背景: [心路历程](docs/Snow-Lang-Journey/Snow-Lang-Journey.md)
|
||||
|
||||
## 功能特性
|
||||
|
||||
* **模块化语法**:支持顶层的 `module:` 声明和 `import:` 导入语句,用于组织代码和依赖管理。
|
||||
* **函数与类型**:支持函数定义,函数参数和返回值。在函数体中可以声明变量并进行类型检查。
|
||||
* **丰富语句**:支持变量声明(`declare name:Type`,可选初始化),条件语句(`if ... end if`),循环语句(`loop ... end loop`),返回语句等。
|
||||
* **表达式解析**:实现了 Pratt 算法的表达式解析器,支持算术,比较和逻辑运算,以及函数调用,成员访问等操作。
|
||||
* **完整编译器前端**:包含词法分析器(Lexer),语法分析器(Parser)和语义分析器,对源代码生成抽象语法树(AST)并检查类型/作用域。
|
||||
* **中间表示(IR)**:将高层 AST 转换为自定义的三地址式 IR(Intermediate Representation),结构清晰便于后端优化。
|
||||
* **后端指令生成**:IR 模块通过线性扫描寄存器分配器映射寄存器,使用指令生成器将 IR 翻译为定制的 VM 指令集。
|
||||
* **虚拟机执行**:自带虚拟机引擎(VirtualMachineEngine),能够加载并执行生成的指令序列,支持调试模式输出虚拟机状态。
|
||||
* **调试与输出**:编译过程会输出源码,AST(JSON 格式),IR 和最终生成的 VM 代码,方便用户查看编译中间结果和调试。
|
||||
| 类别 | 关键特性 |
|
||||
|----------|---------------------------------------------------------------------------------------------------|
|
||||
| 语言层 | module / import / function / loop / if–else / Pratt 表达式解析<br>静态类型检查 & 作用域分析 |
|
||||
| 编译器前端 | Lexer / Parser / Semantic Analyzer 全栈自研,生成 JSON-AST |
|
||||
| IR & 后端 | 三地址式 IR ➜ 线性扫描寄存器分配 ➜ SnowVM 指令 |
|
||||
| 虚拟机 | 栈 + 寄存器混合架构、GUI 局部变量监视 |
|
||||
| snow pkg | - `.cloud` DSL 描述项目、依赖与构建<br>- 预设 `clean / compile / run / package / publish` 任务<br>- 离线缓存与远程仓库解析 |
|
||||
| CLI | init, compile, run, clean, build, generate,debug |
|
||||
|
||||
## Snow-Lang 官网
|
||||
|
||||
[https://snow-lang.com](https://snow-lang.com)
|
||||
|
||||
## 下载 Snow 发行版
|
||||
|
||||
[https://gitee.com/jcnc-org/snow/releases](https://gitee.com/jcnc-org/snow/releases)
|
||||
|
||||
## 相关文档
|
||||
[Snow-Lang 指南](docs/Snow-Lang-Syntax/Snow-Lang-Syntax.md)
|
||||
|
||||
[Snow-Lang 语法规范](docs/Snow-Lang-Syntax/Snow-Lang-Grammar-Specification.md)
|
||||
|
||||
|
||||
[Git 管理规范](docs/Snow-Lang-Git-Management/Snow-Lang-Git-Management.md)
|
||||
|
||||
[SnowVM OpCode 指令表](docs/SnowVM-OpCode/SnowVM-OpCode.md)
|
||||
|
||||
[Snow-Lang GraalVM AOT 打包指南](docs/Snow-Lang-GraalVM-AOT-Native-Image-Package/Snow-Lang-GraalVM-AOT-Native-Image-Package.md)
|
||||
|
||||
## 开发计划
|
||||
|
||||
~~[Snow 语言现状和下一阶段开发路线图-2025-06-11-已废弃](docs/Snow-Lang-Roadmap/Snow-Lang-Roadmap-2025-06-11.md)~~
|
||||
|
||||
## 开发环境安装
|
||||
|
||||
1. **开发环境准备**:
|
||||
1. **开发环境准备**:
|
||||
1. 安装集成开发环境 [IntelliJ IDEA](https://www.jetbrains.com/idea/download)
|
||||
2. 安装 Java 开发工具 [Graalvm-jdk-24](https://www.graalvm.org/downloads/)
|
||||
|
||||
2. **获取源码**:
|
||||
2. **获取源码**:
|
||||
将项目源码下载或克隆到本地目录。
|
||||
```bash
|
||||
git clone https://gitee.com/jcnc-org/snow.git
|
||||
@ -68,209 +98,403 @@ Snow 语言受到 LLM 驱动代码生成趋势的启发,强调简单而清晰的
|
||||
|
||||
3. **运行项目**
|
||||
|
||||
使用IDEA配置好的运行配置SnowCompiler
|
||||
使用IDEA配置好的运行配置 `Demo1`
|
||||
|
||||

|
||||

|
||||
|
||||
4. **运行成功**
|
||||
|
||||
``` snow
|
||||
## 源代码 (main.snow)
|
||||
module: Main
|
||||
import:Math
|
||||
function: main
|
||||
parameter:
|
||||
return_type: int
|
||||
body:
|
||||
Math.factorial(6L,1L)
|
||||
return 0
|
||||
end body
|
||||
end function
|
||||
end module
|
||||
|
||||
## 源代码 (test.snow)
|
||||
module: Math
|
||||
function: factorial
|
||||
parameter:
|
||||
declare n1: long
|
||||
declare n2: long
|
||||
return_type: long
|
||||
body:
|
||||
return n1+n2
|
||||
end body
|
||||
end function
|
||||
end module
|
||||
|
||||
## 编译器输出
|
||||
### AST
|
||||
[
|
||||
{
|
||||
"type": "Module",
|
||||
"name": "Main",
|
||||
"imports": [
|
||||
|
||||
`````snow
|
||||
## 编译器输出
|
||||
### Snow 源代码
|
||||
#### Main.snow
|
||||
module: Main
|
||||
import:Math
|
||||
function: main
|
||||
returns: int
|
||||
body:
|
||||
Math.add(6,1)
|
||||
return 0
|
||||
end body
|
||||
end function
|
||||
end module
|
||||
line col type lexeme
|
||||
----------------------------------------------------
|
||||
1 1 KEYWORD module
|
||||
1 7 COLON :
|
||||
1 9 IDENTIFIER Main
|
||||
1 13 NEWLINE \n
|
||||
|
||||
2 5 KEYWORD import
|
||||
2 11 COLON :
|
||||
2 12 IDENTIFIER Math
|
||||
2 16 NEWLINE \n
|
||||
|
||||
3 5 KEYWORD function
|
||||
3 13 COLON :
|
||||
3 15 IDENTIFIER main
|
||||
3 19 NEWLINE \n
|
||||
|
||||
4 9 KEYWORD returns
|
||||
4 20 COLON :
|
||||
4 22 TYPE int
|
||||
4 25 NEWLINE \n
|
||||
|
||||
5 9 KEYWORD body
|
||||
5 13 COLON :
|
||||
5 14 NEWLINE \n
|
||||
|
||||
6 13 IDENTIFIER Math
|
||||
6 17 DOT .
|
||||
6 18 IDENTIFIER add
|
||||
6 21 LPAREN (
|
||||
6 22 NUMBER_LITERAL 6
|
||||
6 23 COMMA ,
|
||||
6 24 NUMBER_LITERAL 1
|
||||
6 25 RPAREN )
|
||||
6 26 NEWLINE \n
|
||||
|
||||
7 13 KEYWORD return
|
||||
7 20 NUMBER_LITERAL 0
|
||||
7 21 NEWLINE \n
|
||||
|
||||
8 9 KEYWORD end
|
||||
8 13 KEYWORD body
|
||||
8 17 NEWLINE \n
|
||||
|
||||
9 5 KEYWORD end
|
||||
9 9 KEYWORD function
|
||||
9 17 NEWLINE \n
|
||||
|
||||
10 1 KEYWORD end
|
||||
10 5 KEYWORD module
|
||||
10 1 EOF
|
||||
## 词法分析通过,没有发现错误
|
||||
|
||||
#### Math.snow
|
||||
module: Math
|
||||
function: add
|
||||
params:
|
||||
declare n1: int
|
||||
declare n2: int
|
||||
returns: int
|
||||
body:
|
||||
return n1 + n2
|
||||
end body
|
||||
end function
|
||||
end module
|
||||
line col type lexeme
|
||||
----------------------------------------------------
|
||||
1 1 KEYWORD module
|
||||
1 7 COLON :
|
||||
1 9 IDENTIFIER Math
|
||||
1 13 NEWLINE \n
|
||||
|
||||
2 5 KEYWORD function
|
||||
2 13 COLON :
|
||||
2 15 IDENTIFIER add
|
||||
2 18 NEWLINE \n
|
||||
|
||||
3 9 KEYWORD params
|
||||
3 18 COLON :
|
||||
3 19 NEWLINE \n
|
||||
|
||||
4 13 KEYWORD declare
|
||||
4 21 IDENTIFIER n1
|
||||
4 23 COLON :
|
||||
4 25 TYPE int
|
||||
4 28 NEWLINE \n
|
||||
|
||||
5 13 KEYWORD declare
|
||||
5 21 IDENTIFIER n2
|
||||
5 23 COLON :
|
||||
5 25 TYPE int
|
||||
5 28 NEWLINE \n
|
||||
|
||||
6 9 KEYWORD returns
|
||||
6 20 COLON :
|
||||
6 22 TYPE int
|
||||
6 25 NEWLINE \n
|
||||
|
||||
7 9 KEYWORD body
|
||||
7 13 COLON :
|
||||
7 14 NEWLINE \n
|
||||
|
||||
8 12 KEYWORD return
|
||||
8 19 IDENTIFIER n1
|
||||
8 22 PLUS +
|
||||
8 24 IDENTIFIER n2
|
||||
8 26 NEWLINE \n
|
||||
|
||||
9 9 KEYWORD end
|
||||
9 13 KEYWORD body
|
||||
9 17 NEWLINE \n
|
||||
|
||||
10 5 KEYWORD end
|
||||
10 9 KEYWORD function
|
||||
10 17 NEWLINE \n
|
||||
|
||||
11 1 KEYWORD end
|
||||
11 5 KEYWORD module
|
||||
11 1 EOF
|
||||
|
||||
## 词法分析通过,没有发现错误
|
||||
|
||||
## 语义分析通过,没有发现错误
|
||||
|
||||
### AST
|
||||
[
|
||||
{
|
||||
"module": "Math",
|
||||
"type": "Import"
|
||||
}
|
||||
],
|
||||
"functions": [
|
||||
"type": "Module",
|
||||
"name": "Main",
|
||||
"imports": [
|
||||
{
|
||||
"type": "Import",
|
||||
"module": "Math"
|
||||
}
|
||||
],
|
||||
"functions": [
|
||||
{
|
||||
"type": "Function",
|
||||
"name": "main",
|
||||
"parameters": [
|
||||
|
||||
],
|
||||
"returnType": "int",
|
||||
"body": [
|
||||
{
|
||||
"type": "ExpressionStatement",
|
||||
"expression": {
|
||||
"type": "CallExpression",
|
||||
"callee": {
|
||||
"type": "MemberExpression",
|
||||
"object": {
|
||||
"type": "Identifier",
|
||||
"name": "Math"
|
||||
},
|
||||
"member": "add"
|
||||
},
|
||||
"arguments": [
|
||||
{
|
||||
"type": "NumberLiteral",
|
||||
"value": "6"
|
||||
},
|
||||
{
|
||||
"type": "NumberLiteral",
|
||||
"value": "1"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "Return",
|
||||
"value": {
|
||||
"type": "NumberLiteral",
|
||||
"value": "0"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "Function",
|
||||
"name": "main",
|
||||
"parameters": [
|
||||
"type": "Module",
|
||||
"name": "Math",
|
||||
"imports": [
|
||||
|
||||
],
|
||||
"returnType": "int",
|
||||
"body": [
|
||||
"functions": [
|
||||
{
|
||||
"type": "ExpressionStatement",
|
||||
"expression": {
|
||||
"type": "CallExpression",
|
||||
"callee": {
|
||||
"type": "MemberExpression",
|
||||
"object": {
|
||||
"type": "Identifier",
|
||||
"name": "Math"
|
||||
},
|
||||
"member": "factorial"
|
||||
"type": "Function",
|
||||
"name": "add",
|
||||
"parameters": [
|
||||
{
|
||||
"name": "n1",
|
||||
"type": "int"
|
||||
},
|
||||
"arguments": [
|
||||
{
|
||||
"type": "NumberLiteral",
|
||||
"value": "6L"
|
||||
},
|
||||
{
|
||||
"type": "NumberLiteral",
|
||||
"value": "1L"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "Return",
|
||||
"value": {
|
||||
"type": "NumberLiteral",
|
||||
"value": "0"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "Module",
|
||||
"name": "Math",
|
||||
"imports": [
|
||||
|
||||
],
|
||||
"functions": [
|
||||
{
|
||||
"type": "Function",
|
||||
"name": "factorial",
|
||||
"parameters": [
|
||||
{
|
||||
"name": "n1",
|
||||
"type": "long"
|
||||
},
|
||||
{
|
||||
"name": "n2",
|
||||
"type": "long"
|
||||
}
|
||||
],
|
||||
"returnType": "long",
|
||||
"body": [
|
||||
{
|
||||
"type": "Return",
|
||||
"value": {
|
||||
"type": "BinaryExpression",
|
||||
"left": {
|
||||
"type": "Identifier",
|
||||
"name": "n1"
|
||||
},
|
||||
"operator": "+",
|
||||
"right": {
|
||||
"type": "Identifier",
|
||||
"name": "n2"
|
||||
{
|
||||
"name": "n2",
|
||||
"type": "int"
|
||||
}
|
||||
}
|
||||
],
|
||||
"returnType": "int",
|
||||
"body": [
|
||||
{
|
||||
"type": "Return",
|
||||
"value": {
|
||||
"type": "BinaryExpression",
|
||||
"left": {
|
||||
"type": "Identifier",
|
||||
"name": "n1"
|
||||
},
|
||||
"operator": "+",
|
||||
"right": {
|
||||
"type": "Identifier",
|
||||
"name": "n2"
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
### IR
|
||||
func main() {
|
||||
%0 = CONST 6
|
||||
%1 = CONST 1
|
||||
%2 = CALL Math.factorial, %0, %1
|
||||
%3 = CONST 0
|
||||
RET %3
|
||||
}
|
||||
func factorial(%0, %1) {
|
||||
%2 = ADD_L64 %0, %1
|
||||
RET %2
|
||||
}
|
||||
### IR
|
||||
func main() {
|
||||
%0 = CONST 6
|
||||
%1 = CONST 1
|
||||
%2 = CALL Math.add, %0, %1
|
||||
%3 = CONST 0
|
||||
RET %3
|
||||
}
|
||||
func add(%0, %1) {
|
||||
%2 = ADD_I32 %0, %1
|
||||
RET %2
|
||||
}
|
||||
|
||||
### VM code
|
||||
0000: I_PUSH 6
|
||||
0001: I_STORE 0
|
||||
0002: I_PUSH 1
|
||||
0003: I_STORE 1
|
||||
0004: I_LOAD 0
|
||||
0005: I_LOAD 1
|
||||
0006: CALL 13 2
|
||||
0007: I_STORE 2
|
||||
0008: I_PUSH 0
|
||||
0009: I_STORE 3
|
||||
0010: I_LOAD 3
|
||||
0011: HALT
|
||||
0012: HALT
|
||||
0013: I_LOAD 0
|
||||
0014: I_LOAD 1
|
||||
0015: I_ADD
|
||||
0016: I_STORE 2
|
||||
0017: I_LOAD 2
|
||||
0018: RET
|
||||
0019: RET
|
||||
Written to D:\Devs\IdeaProjects\Snow\target\Demo1.water
|
||||
|
||||
=== Launching VM ===
|
||||
|
||||
Calling function at address: 13
|
||||
|
||||
Return 7
|
||||
|
||||
Process has ended
|
||||
|
||||
### VM code
|
||||
112 6
|
||||
152 0
|
||||
112 1
|
||||
152 1
|
||||
162 0
|
||||
162 1
|
||||
201 12 2
|
||||
152 2
|
||||
111 0
|
||||
151 3
|
||||
161 3
|
||||
255
|
||||
162 0
|
||||
162 1
|
||||
11
|
||||
152 2
|
||||
162 2
|
||||
202
|
||||
Calling function at address: 12
|
||||
Return 7
|
||||
Process has ended
|
||||
Operand Stack state:[0]
|
||||
|
||||
--- Call Stack State ---
|
||||
|
||||
### VM Local Variable Table:
|
||||
0: 6
|
||||
1: 1
|
||||
2: 7
|
||||
3: 0
|
||||
|
||||
=== VM exited ===
|
||||
`````
|
||||
|
||||
## 编译 Snow 源代码
|
||||
|
||||
### 1. 独立编译 (Standalone Compilation)
|
||||
|
||||
### VM Local Variable Table:
|
||||
0: 6
|
||||
1: 1
|
||||
2: 7
|
||||
3: 0
|
||||
独立编译不依赖 `.cloud` 文件,而是直接使用 `Snow` 编译器进行 `.snow` 文件的编译和执行。
|
||||
|
||||
```
|
||||
#### 独立编译步骤:
|
||||
|
||||
1. **运行编译器:**
|
||||
你可以通过以下命令来编译单个或多个 `.snow` 文件,或者递归编译一个目录中的所有 `.snow` 源文件为`.water`虚拟机指令。
|
||||
|
||||
## 编译Snow源代码
|
||||
* **单个文件编译:**
|
||||
|
||||
1. **运行编译器**:
|
||||
运行 Snow 来编译 `.snow` 源文件 (Windows环境) 并且在Snow虚拟机运行,默认以 DEBUG 模式显示执行过程和状态。例如:
|
||||
```bash
|
||||
Snow complete [SnowCode].snow
|
||||
```
|
||||
|
||||
* **多个文件编译:**
|
||||
|
||||
```bash
|
||||
Snow complete [SnowCode1].snow [SnowCode2].snow [SnowCode3].snow -o [Name]
|
||||
```
|
||||
|
||||
* **目录递归编译:**
|
||||
|
||||
```bash
|
||||
Snow -d path/to/source_dir
|
||||
```
|
||||
|
||||
2. **查看编译输出:**
|
||||
编译过程会输出源代码、抽象语法树(AST)、中间表示(IR)以及虚拟机指令等内容。你可以看到如下几个分段输出:
|
||||
|
||||
* **AST**(抽象语法树)部分以 JSON 格式输出。
|
||||
* **IR**(中间表示)部分会列出逐行的中间代码。
|
||||
* **VM code**(虚拟机指令)会展示虚拟机的字节码指令。
|
||||
|
||||
3. **默认执行模式:**
|
||||
编译器会在 **RUN 模式** 下运行,**DEBUG 模式**显示详细的执行过程和状态,并且在虚拟机中执行编译后的代码,最后会打印出所有局部变量的值。
|
||||
|
||||
---
|
||||
|
||||
### 2. **集成编译 (Integrated Compilation)**
|
||||
|
||||
集成编译需要使用 `.cloud` 文件来指定项目的配置和结构,适用于项目标准化、依赖管理、构建管理和项目分发等场景。
|
||||
|
||||
#### 集成编译命令:
|
||||
|
||||
1. **基本用法:**
|
||||
|
||||
```bash
|
||||
# 单个文件编译
|
||||
Snow.exe [SnowCode].snow
|
||||
# 多个文件编译
|
||||
Snow.exe [SnowCode1].snow [SnowCode2].snow [SnowCode3].snow
|
||||
# 目录递归编译(-d 参数)
|
||||
Snow.exe -d path/to/source_dir
|
||||
snow [OPTIONS] <command>
|
||||
```
|
||||
|
||||
2. **命令选项:**
|
||||
|
||||
编译器会输出源代码,AST,IR 和 VM 指令等内容,并自动执行虚拟机引擎,最后打印所有局部变量的值
|
||||
2. **查看 AST/IR/VM 输出**:在编译器输出中,可看到 `### AST`,`### IR` 和 `### VM code` 等分段内容。AST 部分为 JSON 格式,IR 和 VM 部分为逐行指令文本。
|
||||
* `-h, --help`: 显示帮助信息并退出。
|
||||
* `-v, --version`: 打印 Snow 编程语言的版本并退出。
|
||||
|
||||
3. **可用命令:**
|
||||
|
||||
* `compile`: 将 `.snow` 源文件编译成虚拟机字节码文件(`.water`)。此命令会使用 `.cloud` 文件来指导编译过程。
|
||||
* `clean`: 清理构建输出和本地缓存,移除中间产物,释放磁盘空间。
|
||||
* `version`: 打印 Snow 的版本。
|
||||
* `run`: 运行已编译的虚拟机字节码文件(`.water`)。
|
||||
* `init`: 初始化一个新项目,生成 `project.cloud` 文件。
|
||||
* `generate`: 根据 `project.cloud` 生成项目目录结构。
|
||||
* `build`: 构建当前项目,按顺序解析依赖、编译和打包。
|
||||
|
||||
4. **例如,执行集成编译命令:**
|
||||
|
||||
```bash
|
||||
snow compile [SnowCode].snow
|
||||
```
|
||||
|
||||
* 此命令会使用 `.cloud` 文件中的配置信息来指导编译过程,并生成 `.water`。
|
||||
|
||||
5. **使用帮助:**
|
||||
如果你需要了解某个命令的详细选项,可以使用:
|
||||
|
||||
```bash
|
||||
snow <command> --help
|
||||
```
|
||||
|
||||
例如,查看 `compile` 命令的具体选项:
|
||||
|
||||
```bash
|
||||
snow compile --help
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 示例代码片段
|
||||
|
||||
以下是一个简单的 Snow 代码示例,演示模块定义,导入和函数声明的基本语法:
|
||||
以下是一个简单的 Snow 代码示例,演示模块定义,导入和函数声明的基本语法:
|
||||
|
||||
```snow
|
||||
module: Math
|
||||
function: main
|
||||
parameter:
|
||||
return_type: int
|
||||
returns: int
|
||||
body:
|
||||
Math.factorial(6)
|
||||
return 0
|
||||
@ -278,17 +502,17 @@ module: Math
|
||||
end function
|
||||
|
||||
function: factorial
|
||||
parameter:
|
||||
params:
|
||||
declare n:int
|
||||
return_type: int
|
||||
returns: int
|
||||
body:
|
||||
declare num1:int = 1
|
||||
loop:
|
||||
initializer:
|
||||
init:
|
||||
declare counter:int = 1
|
||||
condition:
|
||||
cond:
|
||||
counter <= n
|
||||
update:
|
||||
step:
|
||||
counter = counter + 1
|
||||
body:
|
||||
num1 = num1 * counter
|
||||
@ -298,45 +522,72 @@ module: Math
|
||||
end body
|
||||
end function
|
||||
end module
|
||||
|
||||
```
|
||||
|
||||
上述代码定义了一个名为 `Math` 的模块,其中包含两个函数:
|
||||
上述代码定义了一个名为 `Math` 的模块,其中包含两个函数:
|
||||
|
||||
* `main`:不接收任何参数,返回类型为 `int`。在函数体内调用了 `Math.factorial(6)`,然后返回 `0`。
|
||||
* `factorial`:接收一个 `int` 类型的参数 `n`,返回类型为 `int`。函数体内先声明并初始化局部变量 `num1` 为 `1`,然后通过一个 `loop` 循环(从 `counter = 1` 到 `counter <= n`)依次将 `num1` 乘以 `counter`,循环结束后返回 `num1`,即 `n` 的阶乘值。
|
||||
* `main`: 不接收任何参数,返回类型为 `int`。在函数体内调用了 `Math.factorial(6)`,然后返回 `0`。
|
||||
* `factorial`: 接收一个 `int` 类型的参数 `n`,返回类型为 `int`。函数体内先声明并初始化局部变量 `num1` 为 `1`,然后通过一个
|
||||
`loop` 循环(从 `counter = 1` 到 `counter <= n`)依次将 `num1` 乘以 `counter`,循环结束后返回 `num1`,即 `n` 的阶乘值。
|
||||
|
||||
|
||||
> 更多示例代码见 [playground 目录](https://gitee.com/jcnc-org/snow/tree/main/playground)
|
||||
|
||||
## 项目结构说明
|
||||
|
||||
* `compiler/`:Snow 编译器源代码目录
|
||||
* `compiler/`: Snow 编译器源代码目录
|
||||
|
||||
* `cli/`:命令行接口,包括 `SnowCompiler` 主程序
|
||||
* `lexer/`:词法分析模块,负责将源码切分为 Token
|
||||
* `parser/`:语法分析模块,将 Token 流解析为 AST;包括模块解析,函数解析,语句解析等子模块
|
||||
* `semantic/`:语义分析模块,负责符号表管理,类型检查等
|
||||
* `ir/`:中间表示(IR)模块,生成和管理三地址码形式的中间代码
|
||||
* `backend/`:编译器后端模块,将 IR 翻译为虚拟机指令,包含寄存器分配和指令生成器
|
||||
* `vm/`:虚拟机相关源代码目录
|
||||
* `lexer/`: 词法分析模块,负责将源码切分为 Token
|
||||
* `parser/`: 语法分析模块,将 Token 流解析为 AST(含模块/函数/语句解析)
|
||||
* `semantic/`: 语义分析模块,负责符号表管理、类型检查等
|
||||
* `ir/`: 中间表示(IR)模块,生成并管理三地址码形式的中间代码
|
||||
* `backend/`: 编译器后端模块,将 IR 翻译为虚拟机指令,包含寄存器分配和指令生成器
|
||||
|
||||
* `commands/`:定义 VM 指令集的具体实现
|
||||
* `engine/`:核心执行引擎,提供指令执行和寄存器栈管理
|
||||
* `execution/`:执行流程控制(按指令顺序执行,分支跳转等)
|
||||
* `io/`:输入输出辅助类(加载指令,文件解析等)
|
||||
* 其他如 `factories/`,`utils/` 等目录包含指令创建和调试工具类
|
||||
* `vm/`: 虚拟机相关源代码目录
|
||||
|
||||
## 相关文档
|
||||
* `commands/`: 定义 SnowVM 指令集的具体实现
|
||||
* `engine/`: 核心执行引擎,提供指令执行和寄存器/栈管理
|
||||
* `execution/`: 执行流程控制(按指令顺序执行、分支跳转等)
|
||||
* `io/`: 输入输出辅助类(加载指令、文件解析等)
|
||||
* `gui/`: Swing 可视化调试面板,实时展示局部变量表
|
||||
* `factories/`、`utils/`: 指令创建、日志调试等公共工具
|
||||
|
||||
[Git 管理规范](doc/Git-Management/Git-Management.md)
|
||||
* `pkg/`: 内置构建与包管理器 **snow pkg**
|
||||
|
||||
## 开发计划 / TODO
|
||||
* `dsl/`: `.cloud` 描述文件解析器
|
||||
* `tasks/`: 预设任务实现(`clean · compile · run · package · publish` 等)
|
||||
* `resolver/`: 本地/远程仓库解析与缓存
|
||||
* `lifecycle/`: 任务生命周期钩子(pre/post 脚本等)
|
||||
* `model/`: 项目、依赖、版本等模型
|
||||
* `utils/`: 文件、日志、校验和等通用工具
|
||||
* `doc/`: 开发者文档与示例 `.cloud` 配置
|
||||
|
||||
* `cli/`: 独立的命令行前端
|
||||
|
||||
* `commands/`: `compile` / `run` / `pkg` 等子命令实现
|
||||
* `api/`: 公共选项解析、终端交互抽象
|
||||
* `utils/`: 终端颜色、进度条、异常格式化等
|
||||
* `SnowCLI.java`: CLI 主入口
|
||||
|
||||
|
||||
## 版权声明
|
||||
|
||||
版权所有 © 2025 许轲(Luke),代表 SnowLang 项目。
|
||||
仓库地址: <https://gitee.com/jcnc-org/snow>
|
||||
本项目依据 [Apache 2.0 许可证](LICENSE) 进行许可和发布。
|
||||
|
||||
“SnowLang 项目”为由许轲(Luke)发起的独立开源项目。
|
||||
未来,项目可能会成立正式的组织或实体,以进一步负责本项目的开发和管理。
|
||||
|
||||
## 支持我们
|
||||
|
||||
如果你喜欢我们的项目,欢迎给我们一个 Star!
|
||||
你们的关注和支持,是我们团队持续进步的动力源泉!谢谢大家!
|
||||
|
||||
* 扩展标准库支持和更多内置模块,如字符串,文件操作等常用功能。
|
||||
* 增强类型系统和错误检查,完善编译时诊断信息。
|
||||
* 优化 IR 和虚拟机性能,实现更多优化策略(如常量折叠等)。
|
||||
* 增加更多示例程序试,丰富项目文档和用例。
|
||||
|
||||
## 加入我们
|
||||
* 微信: `xuxiaolankaka`
|
||||
* QQ: `1399528359`
|
||||
* E-Mail: `luke.k.xu@hotmail.com`
|
||||
|
||||
- 微信: `xuxiaolankaka`
|
||||
- QQ: `1399528359`
|
||||
- 邮箱: `luke.k.xu [at] hotmail.com`
|
||||
|
||||
|
||||
@ -2,27 +2,27 @@
|
||||
|
||||
在执行 `build-project2tar.ps1` 脚本之前,您需要确保 PowerShell 的执行策略允许运行脚本。默认情况下,PowerShell 可能阻止未签名的脚本执行。因此,您需要设置适当的执行策略。
|
||||
|
||||
#### 步骤 1:以管理员身份打开 PowerShell
|
||||
#### 步骤 1: 以管理员身份打开 PowerShell
|
||||
|
||||
* 在 Windows 系统中,搜索 **PowerShell**,右键点击 **Windows PowerShell**,并选择 **以管理员身份运行**。
|
||||
|
||||
#### 步骤 2:设置 PowerShell 执行策略
|
||||
#### 步骤 2: 设置 PowerShell 执行策略
|
||||
|
||||
为了允许执行 PowerShell 脚本,您需要调整当前用户的执行策略。输入以下命令并按 Enter:
|
||||
为了允许执行 PowerShell 脚本,您需要调整当前用户的执行策略。输入以下命令并按 Enter:
|
||||
|
||||
```powershell
|
||||
Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy RemoteSigned
|
||||
```
|
||||
|
||||
#### 解释:
|
||||
#### 解释:
|
||||
|
||||
* `-Scope CurrentUser`:此参数指定该执行策略仅对当前用户有效,而不会影响系统范围内的其他用户。
|
||||
* `-ExecutionPolicy RemoteSigned`:此策略表示:
|
||||
* `-Scope CurrentUser`: 此参数指定该执行策略仅对当前用户有效,而不会影响系统范围内的其他用户。
|
||||
* `-ExecutionPolicy RemoteSigned`: 此策略表示:
|
||||
|
||||
* 本地创建的脚本可以直接运行。
|
||||
* 从互联网下载的脚本必须具备有效的数字签名才能运行。没有签名的脚本将无法执行,除非您先解除阻止该脚本。
|
||||
|
||||
#### 步骤 3:运行 `build-project2tar.ps1` 脚本
|
||||
#### 步骤 3: 运行 `build-project2tar.ps1` 脚本
|
||||
|
||||
设置完成后,您可以在 PowerShell 中运行 `build-project2tar.ps1` 脚本。确保您已经切换到包含该脚本的目录,或提供完整的文件路径来执行它。
|
||||
|
||||
|
||||
48
build/build-project2tar.ps1
Normal file
@ -0,0 +1,48 @@
|
||||
# Set the tar package name
|
||||
$tarName = "Snow.tar"
|
||||
|
||||
# Get the script's current directory (build folder)
|
||||
$scriptDir = Split-Path -Parent $MyInvocation.MyCommand.Definition
|
||||
|
||||
# Get the parent directory (the project root)
|
||||
$parentDir = Split-Path -Parent $scriptDir
|
||||
|
||||
# Set the full path to the tar package
|
||||
$tarPath = Join-Path $parentDir $tarName
|
||||
|
||||
# Output message: starting to create tar package
|
||||
Write-Output "Starting to create tar package: $tarName in $parentDir ..."
|
||||
|
||||
# Remove old tar package if it exists
|
||||
if (Test-Path $tarPath) {
|
||||
Write-Output "Found an old $tarName, removing it..."
|
||||
Remove-Item $tarPath -Force
|
||||
}
|
||||
|
||||
# Make sure the tar command is available
|
||||
$tarCommand = "tar"
|
||||
if (-not (Get-Command $tarCommand -ErrorAction SilentlyContinue)) {
|
||||
Write-Error "❌ 'tar' command is not available. Please make sure 'tar' is installed and can be run from PowerShell."
|
||||
exit 1
|
||||
}
|
||||
|
||||
# Execute tar: change to org\jcnc directory and compress the snow folder
|
||||
try {
|
||||
# Build the command and run it
|
||||
$tarCommandArgs = "-cf", $tarPath, "-C", "$scriptDir\..\src\main\java\org\jcnc", "snow"
|
||||
Write-Output "Running tar command: tar $tarCommandArgs"
|
||||
|
||||
& $tarCommand @tarCommandArgs
|
||||
} catch {
|
||||
Write-Error "❌ Failed to create tar package. Error: $_"
|
||||
exit 1
|
||||
}
|
||||
|
||||
# Check if tar package was created successfully
|
||||
if (Test-Path $tarPath) {
|
||||
Write-Output "✅ Successfully created $tarName"
|
||||
exit 0
|
||||
} else {
|
||||
Write-Error "❌ Creation failed. Please check the tar command and paths."
|
||||
exit 1
|
||||
}
|
||||
129
build/build-release-all.ps1
Normal file
@ -0,0 +1,129 @@
|
||||
param(
|
||||
[string]$LogDir = (Join-Path $PSScriptRoot 'target\parallel-logs')
|
||||
)
|
||||
|
||||
Set-StrictMode -Version Latest
|
||||
$ErrorActionPreference = 'Stop'
|
||||
|
||||
$winScript = Join-Path $PSScriptRoot 'release-windows.ps1'
|
||||
$linScript = Join-Path $PSScriptRoot 'release-linux.ps1'
|
||||
|
||||
if (-not (Test-Path $winScript)) { throw "File not found: $winScript" }
|
||||
if (-not (Test-Path $linScript)) { throw "File not found: $linScript" }
|
||||
|
||||
$winLogOut = [System.IO.Path]::GetTempFileName()
|
||||
$winLogErr = [System.IO.Path]::GetTempFileName()
|
||||
$linLogOut = [System.IO.Path]::GetTempFileName()
|
||||
$linLogErr = [System.IO.Path]::GetTempFileName()
|
||||
|
||||
$winProc = Start-Process powershell.exe -ArgumentList @('-NoProfile','-ExecutionPolicy','Bypass','-File',"`"$winScript`"") `
|
||||
-RedirectStandardOutput $winLogOut -RedirectStandardError $winLogErr -NoNewWindow -PassThru
|
||||
$linProc = Start-Process powershell.exe -ArgumentList @('-NoProfile','-ExecutionPolicy','Bypass','-File',"`"$linScript`"") `
|
||||
-RedirectStandardOutput $linLogOut -RedirectStandardError $linLogErr -NoNewWindow -PassThru
|
||||
|
||||
$winPosOut = 0
|
||||
$winPosErr = 0
|
||||
$linPosOut = 0
|
||||
$linPosErr = 0
|
||||
|
||||
Write-Host "===== Build Started ====="
|
||||
while (-not $winProc.HasExited -or -not $linProc.HasExited) {
|
||||
# windows-release stdout
|
||||
if (Test-Path $winLogOut) {
|
||||
$size = (Get-Item $winLogOut).Length
|
||||
if ($size -gt $winPosOut) {
|
||||
$fs = [System.IO.File]::Open($winLogOut, [System.IO.FileMode]::Open, [System.IO.FileAccess]::Read, [System.IO.FileShare]::ReadWrite)
|
||||
$fs.Position = $winPosOut
|
||||
$sr = New-Object System.IO.StreamReader($fs)
|
||||
while (!$sr.EndOfStream) {
|
||||
$line = $sr.ReadLine()
|
||||
if ($line) { Write-Host "[windows-release][OUT] $line" }
|
||||
}
|
||||
$winPosOut = $fs.Position
|
||||
$sr.Close()
|
||||
$fs.Close()
|
||||
}
|
||||
}
|
||||
# windows-release stderr
|
||||
if (Test-Path $winLogErr) {
|
||||
$size = (Get-Item $winLogErr).Length
|
||||
if ($size -gt $winPosErr) {
|
||||
$fs = [System.IO.File]::Open($winLogErr, [System.IO.FileMode]::Open, [System.IO.FileAccess]::Read, [System.IO.FileShare]::ReadWrite)
|
||||
$fs.Position = $winPosErr
|
||||
$sr = New-Object System.IO.StreamReader($fs)
|
||||
while (!$sr.EndOfStream) {
|
||||
$line = $sr.ReadLine()
|
||||
if ($line) { Write-Host "[windows-release][ERR] $line" -ForegroundColor Red }
|
||||
}
|
||||
$winPosErr = $fs.Position
|
||||
$sr.Close()
|
||||
$fs.Close()
|
||||
}
|
||||
}
|
||||
# linux-release stdout
|
||||
if (Test-Path $linLogOut) {
|
||||
$size = (Get-Item $linLogOut).Length
|
||||
if ($size -gt $linPosOut) {
|
||||
$fs = [System.IO.File]::Open($linLogOut, [System.IO.FileMode]::Open, [System.IO.FileAccess]::Read, [System.IO.FileShare]::ReadWrite)
|
||||
$fs.Position = $linPosOut
|
||||
$sr = New-Object System.IO.StreamReader($fs)
|
||||
while (!$sr.EndOfStream) {
|
||||
$line = $sr.ReadLine()
|
||||
if ($line) { Write-Host "[linux-release][OUT] $line" }
|
||||
}
|
||||
$linPosOut = $fs.Position
|
||||
$sr.Close()
|
||||
$fs.Close()
|
||||
}
|
||||
}
|
||||
# linux-release stderr
|
||||
if (Test-Path $linLogErr) {
|
||||
$size = (Get-Item $linLogErr).Length
|
||||
if ($size -gt $linPosErr) {
|
||||
$fs = [System.IO.File]::Open($linLogErr, [System.IO.FileMode]::Open, [System.IO.FileAccess]::Read, [System.IO.FileShare]::ReadWrite)
|
||||
$fs.Position = $linPosErr
|
||||
$sr = New-Object System.IO.StreamReader($fs)
|
||||
while (!$sr.EndOfStream) {
|
||||
$line = $sr.ReadLine()
|
||||
if ($line) { Write-Host "[linux-release][ERR] $line" -ForegroundColor Red }
|
||||
}
|
||||
$linPosErr = $fs.Position
|
||||
$sr.Close()
|
||||
$fs.Close()
|
||||
}
|
||||
}
|
||||
Start-Sleep -Milliseconds 200
|
||||
}
|
||||
|
||||
# After processes exit, print any remaining output
|
||||
$tasks = @(
|
||||
@{proc=$winProc; log=$winLogOut; tag='windows-release'; type='OUT'; skip=$winPosOut},
|
||||
@{proc=$winProc; log=$winLogErr; tag='windows-release'; type='ERR'; skip=$winPosErr},
|
||||
@{proc=$linProc; log=$linLogOut; tag='linux-release'; type='OUT'; skip=$linPosOut},
|
||||
@{proc=$linProc; log=$linLogErr; tag='linux-release'; type='ERR'; skip=$linPosErr}
|
||||
)
|
||||
foreach ($item in $tasks) {
|
||||
if (Test-Path $item.log) {
|
||||
$fs = [System.IO.File]::Open($item.log, [System.IO.FileMode]::Open, [System.IO.FileAccess]::Read, [System.IO.FileShare]::ReadWrite)
|
||||
$fs.Position = $item.skip
|
||||
$sr = New-Object System.IO.StreamReader($fs)
|
||||
while (!$sr.EndOfStream) {
|
||||
$line = $sr.ReadLine()
|
||||
if ($line) {
|
||||
if ($item.type -eq 'ERR') {
|
||||
Write-Host "[$($item.tag)][ERR] $line" -ForegroundColor Red
|
||||
} else {
|
||||
Write-Host "[$($item.tag)][OUT] $line"
|
||||
}
|
||||
}
|
||||
}
|
||||
$sr.Close()
|
||||
$fs.Close()
|
||||
}
|
||||
}
|
||||
|
||||
Write-Host ""
|
||||
Write-Host "All tasks completed successfully." -ForegroundColor Green
|
||||
|
||||
Remove-Item $winLogOut, $winLogErr, $linLogOut, $linLogErr -Force
|
||||
exit 0
|
||||
@ -1,47 +0,0 @@
|
||||
# 设定 tar 包的名称
|
||||
$tarName = "Snow.tar"
|
||||
|
||||
# 获取脚本当前目录(build文件夹)
|
||||
$scriptDir = Split-Path -Parent $MyInvocation.MyCommand.Definition
|
||||
|
||||
# 获取上一级目录(snow 根目录)
|
||||
$parentDir = Split-Path -Parent $scriptDir
|
||||
|
||||
# 设置 tar 包的完整路径
|
||||
$tarPath = Join-Path $parentDir $tarName
|
||||
|
||||
# 输出开始创建 tar 包的消息
|
||||
Write-Output "开始创建 tar 包:$tarName 到 $parentDir ..."
|
||||
|
||||
# 如果存在旧 tar 包,先删除它
|
||||
if (Test-Path $tarPath) {
|
||||
Write-Output "发现旧的 $tarName,正在删除..."
|
||||
Remove-Item $tarPath -Force
|
||||
}
|
||||
|
||||
# 确保 tar 命令可用
|
||||
$tarCommand = "tar"
|
||||
if (-not (Get-Command $tarCommand -ErrorAction SilentlyContinue)) {
|
||||
Write-Error "❌ tar 命令不可用。请确保 tar 已安装并可在 PowerShell 中执行。"
|
||||
exit 1
|
||||
}
|
||||
|
||||
# 执行打包操作:切换到 org\jcnc 目录下再压缩 snow 文件夹
|
||||
try {
|
||||
# 构建命令并执行
|
||||
$tarCommandArgs = "-cf", $tarPath, "-C", "$scriptDir\..\src\main\java\org\jcnc", "snow"
|
||||
Write-Output "执行 tar 命令: tar $tarCommandArgs"
|
||||
|
||||
& $tarCommand @tarCommandArgs
|
||||
} catch {
|
||||
Write-Error "❌ 创建 tar 包失败。错误信息:$_"
|
||||
exit 1
|
||||
}
|
||||
|
||||
# 检查 tar 包是否创建成功
|
||||
if (Test-Path $tarPath) {
|
||||
Write-Output "✅ 成功创建 $tarName"
|
||||
} else {
|
||||
Write-Error "❌ 创建失败,请检查 tar 命令和路径是否正确。"
|
||||
exit 1
|
||||
}
|
||||
136
build/release-linux.ps1
Normal file
@ -0,0 +1,136 @@
|
||||
# run-linux-snow-export.ps1
|
||||
# Build and package linux-snow-export, version read from SNOW_VERSION in .env
|
||||
|
||||
Set-StrictMode -Version Latest
|
||||
$ErrorActionPreference = "Stop"
|
||||
|
||||
# Import shared dotenv parser function
|
||||
. "$PSScriptRoot\tools\dotenv.ps1"
|
||||
|
||||
Write-Host "Step 0: Generate .env..."
|
||||
try {
|
||||
& "$PSScriptRoot\tools\generate-dotenv.ps1" -ErrorAction Stop
|
||||
} catch {
|
||||
Write-Error "Failed to generate .env: $( $_.Exception.Message )"
|
||||
exit 1
|
||||
}
|
||||
|
||||
Write-Host "Step 1: Build and run linux-snow-export..."
|
||||
docker compose run --build --rm linux-snow-export
|
||||
if ($LASTEXITCODE -ne 0) {
|
||||
Write-Error "Build & Run failed, exiting script."
|
||||
exit $LASTEXITCODE
|
||||
}
|
||||
|
||||
Write-Host "Step 2: Run linux-snow-export without rebuild..."
|
||||
docker compose run --rm linux-snow-export
|
||||
if ($LASTEXITCODE -ne 0) {
|
||||
Write-Error "Run without rebuild failed, exiting script."
|
||||
exit $LASTEXITCODE
|
||||
}
|
||||
|
||||
# ===== Step 3: Read version from .env =====
|
||||
$projectRoot = Resolve-Path (Join-Path $PSScriptRoot "..")
|
||||
$dotenvPath = Join-Path $projectRoot ".env"
|
||||
|
||||
if (-not (Test-Path -LiteralPath $dotenvPath)) {
|
||||
Write-Error ".env not found at: $dotenvPath"
|
||||
exit 1
|
||||
}
|
||||
|
||||
$version = Read-DotEnvValue -FilePath $dotenvPath -Key 'SNOW_VERSION'
|
||||
if (-not $version) {
|
||||
Write-Error "SNOW_VERSION not found in .env"
|
||||
exit 1
|
||||
}
|
||||
|
||||
# ===== Step 4: Define output paths =====
|
||||
$targetDir = Join-Path $projectRoot "target\release"
|
||||
$outDir = Join-Path $targetDir "Snow-v$version-linux-x64"
|
||||
$tgzPath = Join-Path $targetDir "Snow-v$version-linux-x64.tgz"
|
||||
|
||||
# ===== Step 5: Package to .tgz (no extra top-level dir, max compression) =====
|
||||
Write-Host "Step 5: Package to .tgz..."
|
||||
|
||||
if (-not (Test-Path -LiteralPath $outDir)) {
|
||||
Write-Error "Output directory not found: $outDir"
|
||||
exit 1
|
||||
}
|
||||
|
||||
# Ensure target directory exists
|
||||
if (-not (Test-Path -LiteralPath $targetDir)) {
|
||||
New-Item -ItemType Directory -Force -Path $targetDir | Out-Null
|
||||
}
|
||||
|
||||
# Remove old package if exists
|
||||
if (Test-Path -LiteralPath $tgzPath) {
|
||||
Write-Host "→ Removing existing tgz: $tgzPath"
|
||||
Remove-Item -LiteralPath $tgzPath -Force
|
||||
}
|
||||
|
||||
function Invoke-TarGz {
|
||||
param(
|
||||
[Parameter(Mandatory = $true)][string]$SourceDir,
|
||||
[Parameter(Mandatory = $true)][string]$DestTgz
|
||||
)
|
||||
$tarExe = "tar"
|
||||
|
||||
$isWindows = $env:OS -eq 'Windows_NT'
|
||||
|
||||
if ($isWindows) {
|
||||
$psi = @{
|
||||
FilePath = $tarExe
|
||||
ArgumentList= @("-C", $SourceDir, "-czf", $DestTgz, ".")
|
||||
NoNewWindow = $true
|
||||
Wait = $true
|
||||
}
|
||||
try {
|
||||
$p = Start-Process @psi -PassThru -ErrorAction Stop
|
||||
$p.WaitForExit()
|
||||
if ($p.ExitCode -ne 0) {
|
||||
throw "tar exited with code $($p.ExitCode)"
|
||||
}
|
||||
} catch {
|
||||
throw "Packaging failed (Windows tar): $($_.Exception.Message)"
|
||||
}
|
||||
} else {
|
||||
try {
|
||||
$psi = @{
|
||||
FilePath = $tarExe
|
||||
ArgumentList= @("-C", $SourceDir, "-c", "-f", $DestTgz, "-I", "gzip -9", ".")
|
||||
NoNewWindow = $true
|
||||
Wait = $true
|
||||
}
|
||||
$p = Start-Process @psi -PassThru -ErrorAction Stop
|
||||
$p.WaitForExit()
|
||||
if ($p.ExitCode -eq 0) { return }
|
||||
} catch { }
|
||||
|
||||
try {
|
||||
$psi = @{
|
||||
FilePath = $tarExe
|
||||
ArgumentList= @("-C", $SourceDir, "-c", "-z", "-f", $DestTgz, ".")
|
||||
NoNewWindow = $true
|
||||
Wait = $true
|
||||
}
|
||||
$p = Start-Process @psi -PassThru -ErrorAction Stop
|
||||
$p.WaitForExit()
|
||||
if ($p.ExitCode -ne 0) {
|
||||
throw "tar exited with code $($p.ExitCode)"
|
||||
}
|
||||
} catch {
|
||||
throw "Packaging failed (Linux tar): $($_.Exception.Message)"
|
||||
}
|
||||
}
|
||||
}
|
||||
try {
|
||||
Invoke-TarGz -SourceDir $outDir -DestTgz $tgzPath
|
||||
} catch {
|
||||
Write-Error $_.Exception.Message
|
||||
exit 1
|
||||
}
|
||||
|
||||
Write-Host ">>> Package ready!" -ForegroundColor Green
|
||||
Write-Host "Version : $version"
|
||||
Write-Host "Output Dir : $outDir"
|
||||
Write-Host "Tgz File : $tgzPath"
|
||||
117
build/release-windows.ps1
Normal file
@ -0,0 +1,117 @@
|
||||
# release-windows.ps1
|
||||
|
||||
$ErrorActionPreference = 'Stop'
|
||||
$ProgressPreference = 'SilentlyContinue'
|
||||
Set-StrictMode -Version Latest
|
||||
|
||||
# Import shared dotenv parser function
|
||||
. "$PSScriptRoot\tools\dotenv.ps1"
|
||||
|
||||
# ===== Utility Functions =====
|
||||
function Find-PomUpwards([string]$startDir) {
|
||||
$dir = Resolve-Path $startDir
|
||||
while ($true) {
|
||||
$pom = Join-Path $dir "pom.xml"
|
||||
if (Test-Path $pom) { return $pom }
|
||||
$parent = Split-Path $dir -Parent
|
||||
if ($parent -eq $dir -or [string]::IsNullOrEmpty($parent)) { return $null }
|
||||
$dir = $parent
|
||||
}
|
||||
}
|
||||
|
||||
# ===== Step 0: Generate .env =====
|
||||
Write-Host "Step 0: Generate .env..."
|
||||
try {
|
||||
& "$PSScriptRoot\tools\generate-dotenv.ps1" -ErrorAction Stop
|
||||
} catch {
|
||||
Write-Error "Failed to generate .env: $($_.Exception.Message)"
|
||||
exit 1
|
||||
}
|
||||
|
||||
# ===== Step 1: Locate project root & build =====
|
||||
Write-Host "Step 1: Locate project root and build..."
|
||||
$pom = Find-PomUpwards -startDir $PSScriptRoot
|
||||
if (-not $pom) {
|
||||
Write-Error "pom.xml not found. Please run this script within the project."
|
||||
exit 1
|
||||
}
|
||||
|
||||
$projectRoot = Split-Path $pom -Parent
|
||||
Push-Location $projectRoot
|
||||
try {
|
||||
Write-Host "→ Running: mvn clean package"
|
||||
mvn clean package
|
||||
if ($LASTEXITCODE -ne 0) {
|
||||
Write-Error "Maven build failed, exiting script."
|
||||
exit $LASTEXITCODE
|
||||
}
|
||||
|
||||
# ===== Step 2: Read SNOW_VERSION =====
|
||||
Write-Host "Step 2: Read SNOW_VERSION from .env..."
|
||||
$dotenvPath = Join-Path $projectRoot ".env"
|
||||
$snowVersion = Read-DotEnvValue -FilePath $dotenvPath -Key "SNOW_VERSION"
|
||||
if (-not $snowVersion) {
|
||||
Write-Host "SNOW_VERSION not found in .env, using placeholder 0.0.0." -ForegroundColor Yellow
|
||||
$snowVersion = "0.0.0"
|
||||
}
|
||||
Write-Host "SNOW_VERSION = $snowVersion"
|
||||
|
||||
# ===== Step 3: Prepare release directory structure =====
|
||||
Write-Host "Step 3: Prepare release directory structure..."
|
||||
$targetDir = Join-Path $projectRoot "target"
|
||||
$exePath = Join-Path $targetDir "Snow.exe"
|
||||
if (-not (Test-Path $exePath)) {
|
||||
Write-Error "Expected build artifact not found: $exePath"
|
||||
exit 1
|
||||
}
|
||||
|
||||
$verName = "Snow-v${snowVersion}-windows-x64"
|
||||
$releaseRoot = Join-Path $targetDir "release"
|
||||
$outDir = Join-Path $releaseRoot $verName
|
||||
$binDir = Join-Path $outDir "bin"
|
||||
$libDir = Join-Path $outDir "lib"
|
||||
|
||||
# Clean old directory
|
||||
if (Test-Path $outDir) {
|
||||
Write-Host "→ Cleaning previous output directory..."
|
||||
Remove-Item $outDir -Recurse -Force
|
||||
}
|
||||
|
||||
New-Item -ItemType Directory -Force -Path $binDir | Out-Null
|
||||
Copy-Item -Path $exePath -Destination (Join-Path $binDir "Snow.exe") -Force
|
||||
Write-Host ">>> Collected Snow.exe"
|
||||
|
||||
# Optional lib
|
||||
$projectLib = Join-Path $projectRoot "lib"
|
||||
if (Test-Path $projectLib) {
|
||||
New-Item -ItemType Directory -Force -Path $libDir | Out-Null
|
||||
Copy-Item -Path (Join-Path $projectLib "*") -Destination $libDir -Recurse -Force
|
||||
Write-Host ">>> Copied lib directory"
|
||||
} else {
|
||||
Write-Host ">>> lib directory not found, skipping." -ForegroundColor Yellow
|
||||
}
|
||||
|
||||
# ===== Step 4: Create release zip =====
|
||||
Write-Host "Step 4: Create release zip..."
|
||||
New-Item -ItemType Directory -Force -Path $releaseRoot | Out-Null
|
||||
$zipPath = Join-Path $releaseRoot ("{0}.zip" -f $verName)
|
||||
if (Test-Path $zipPath) {
|
||||
Write-Host "→ Removing existing zip: $zipPath"
|
||||
Remove-Item $zipPath -Force
|
||||
}
|
||||
|
||||
try {
|
||||
Compress-Archive -Path (Join-Path $outDir '*') -DestinationPath $zipPath -CompressionLevel Optimal -Force
|
||||
} catch {
|
||||
Write-Error "Failed to create zip: $($_.Exception.Message)"
|
||||
exit 1
|
||||
}
|
||||
|
||||
Write-Host ">>> Package ready!" -ForegroundColor Green
|
||||
Write-Host "Version : $snowVersion"
|
||||
Write-Host "Output Dir : $outDir"
|
||||
Write-Host "Zip File : $zipPath"
|
||||
}
|
||||
finally {
|
||||
Pop-Location
|
||||
}
|
||||
53
build/tools/dotenv.ps1
Normal file
@ -0,0 +1,53 @@
|
||||
# tools/dotenv.ps1
|
||||
# Unified .env reader function:
|
||||
# - Supports `KEY=VAL` and `export KEY=VAL`
|
||||
# - Skips blank lines and comments
|
||||
# - Handles quoted values (single or double quotes)
|
||||
# - Allows inline comments at the end of a line (space + #)
|
||||
# - If the same KEY is defined multiple times, the last one takes precedence
|
||||
|
||||
Set-StrictMode -Version Latest
|
||||
|
||||
function Read-DotEnvValue {
|
||||
[CmdletBinding()]
|
||||
param(
|
||||
[Parameter(Mandatory=$true)][string]$FilePath,
|
||||
[Parameter(Mandatory=$true)][string]$Key
|
||||
)
|
||||
|
||||
if (-not (Test-Path -LiteralPath $FilePath)) { return $null }
|
||||
|
||||
# Match the target key (escaped), allowing optional "export" prefix
|
||||
$pattern = '^(?:\s*export\s+)?(?<k>' + [regex]::Escape($Key) + ')\s*=\s*(?<v>.*)$'
|
||||
$value = $null
|
||||
|
||||
# Read line by line for large file compatibility
|
||||
Get-Content -LiteralPath $FilePath | ForEach-Object {
|
||||
$line = $_
|
||||
|
||||
# Skip blank lines and full-line comments
|
||||
if ($line -match '^\s*$') { return }
|
||||
if ($line -match '^\s*#') { return }
|
||||
|
||||
if ($line -match $pattern) {
|
||||
$v = $matches['v']
|
||||
|
||||
# Remove surrounding quotes if present
|
||||
$trimmed = $v.Trim()
|
||||
if ($trimmed -match '^\s*"(.*)"\s*$') {
|
||||
$v = $matches[1]
|
||||
} elseif ($trimmed -match "^\s*'(.*)'\s*$") {
|
||||
$v = $matches[1]
|
||||
} else {
|
||||
# Strip inline comments (space + # …), ignoring escaped \#
|
||||
if ($v -match '^(.*?)(?<!\\)\s+#.*$') {
|
||||
$v = $matches[1]
|
||||
}
|
||||
}
|
||||
|
||||
$value = $v.Trim()
|
||||
}
|
||||
}
|
||||
|
||||
return $value
|
||||
}
|
||||
23
build/tools/generate-dotenv.ps1
Normal file
@ -0,0 +1,23 @@
|
||||
# build\tools\generate-dotenv.ps1
|
||||
|
||||
# Repository root: go up two levels from build\tools\
|
||||
$repoRoot = (Get-Item $PSScriptRoot).Parent.Parent.FullName
|
||||
$envPath = Join-Path $repoRoot ".env"
|
||||
$pomPath = Join-Path $repoRoot "pom.xml"
|
||||
|
||||
if (-not (Test-Path $pomPath -PathType Leaf)) {
|
||||
throw "pom.xml not found: $pomPath"
|
||||
}
|
||||
|
||||
[xml]$pom = Get-Content $pomPath -Encoding UTF8
|
||||
$version = $pom.project.version
|
||||
|
||||
$lines = @(
|
||||
"# Auto-generated by build\tools\generate-dotenv.ps1"
|
||||
"SNOW_VERSION=$version"
|
||||
)
|
||||
|
||||
$utf8NoBom = New-Object System.Text.UTF8Encoding($false)
|
||||
[System.IO.File]::WriteAllLines($envPath, $lines, $utf8NoBom)
|
||||
Write-Host "Generated/overwritten $envPath (version: $version)"
|
||||
return
|
||||
|
Before Width: | Height: | Size: 7.3 KiB |
24
docker-compose.yml
Normal file
@ -0,0 +1,24 @@
|
||||
services:
|
||||
# Run with: docker compose run --rm linux-snow-export
|
||||
linux-snow-export:
|
||||
build:
|
||||
context: .
|
||||
target: export
|
||||
command:
|
||||
- /bin/sh
|
||||
- -c
|
||||
- |
|
||||
set -e
|
||||
ver="Snow-v${SNOW_VERSION}-linux-x64"
|
||||
mkdir -p "/output/release/$$ver/bin"
|
||||
cp /export/Snow "/output/release/$$ver/bin/"
|
||||
if [ -d /export/lib ]; then
|
||||
mkdir -p "/output/release/$$ver/lib"
|
||||
cp -a /export/lib/. "/output/release/$$ver/lib/"
|
||||
fi
|
||||
tar -C /output/release -czf "/output/release/$$ver.tgz" "$$ver"
|
||||
volumes:
|
||||
- ./target:/output
|
||||
- ./lib:/export/lib:ro
|
||||
env_file:
|
||||
- .env
|
||||
BIN
docs/README/IMG/IMG_Run-Profile_1.png
Normal file
|
After Width: | Height: | Size: 10 KiB |
|
Before Width: | Height: | Size: 5.1 KiB After Width: | Height: | Size: 5.1 KiB |
|
Before Width: | Height: | Size: 2.6 KiB After Width: | Height: | Size: 2.6 KiB |
|
Before Width: | Height: | Size: 455 B After Width: | Height: | Size: 455 B |
|
Before Width: | Height: | Size: 2.6 KiB After Width: | Height: | Size: 2.6 KiB |
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 2.6 KiB After Width: | Height: | Size: 2.6 KiB |
|
Before Width: | Height: | Size: 976 B After Width: | Height: | Size: 976 B |
|
Before Width: | Height: | Size: 2.6 KiB After Width: | Height: | Size: 2.6 KiB |
|
Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 2.6 KiB After Width: | Height: | Size: 2.6 KiB |
|
Before Width: | Height: | Size: 2.3 KiB After Width: | Height: | Size: 2.3 KiB |
|
Before Width: | Height: | Size: 2.6 KiB After Width: | Height: | Size: 2.6 KiB |
@ -2,7 +2,7 @@
|
||||
|
||||
## 1. 版本控制基础
|
||||
|
||||
本项目使用 Git 进行版本控制,并遵循以下基本原则:
|
||||
本项目使用 Git 进行版本控制,并遵循以下基本原则:
|
||||
|
||||
* 所有代码更改必须通过 Git 提交,并推送至远程仓库。
|
||||
* 每次提交必须包括清晰、简洁且具描述性的提交信息,确保团队成员能够轻松理解变更的目的和内容。
|
||||
@ -10,23 +10,23 @@
|
||||
|
||||
## 2. 分支管理
|
||||
|
||||
本项目采用以下分支策略进行代码管理:
|
||||
本项目采用以下分支策略进行代码管理:
|
||||
|
||||
### 2.1 主分支 (`main`)
|
||||
|
||||
* **用途**:`main` 分支始终保持项目的稳定版本,且此分支的代码随时可以部署到生产环境。
|
||||
* **更新规则**:仅允许经过充分测试并审查的代码合并到 `main` 分支。每次从 `dev` 或 `release` 分支合并到 `main` 时,必须打上版本标签。
|
||||
* **用途**: `main` 分支始终保持项目的稳定版本,且此分支的代码随时可以部署到生产环境。
|
||||
* **更新规则**: 仅允许经过充分测试并审查的代码合并到 `main` 分支。每次从 `dev` 或 `release` 分支合并到 `main` 时,必须打上版本标签。
|
||||
|
||||
### 2.2 开发分支 (`dev`)
|
||||
|
||||
* **用途**:`dev` 分支是所有开发工作的集成分支。所有的新功能开发应首先合并至 `dev` 分支,并经过集成测试后再合并到 `main`。
|
||||
* **更新规则**:所有功能开发完成后,应合并至 `dev` 分支进行集成测试,确认没有问题后再合并到 `main`。
|
||||
* **用途**: `dev` 分支是所有开发工作的集成分支。所有的新功能开发应首先合并至 `dev` 分支,并经过集成测试后再合并到 `main`。
|
||||
* **更新规则**: 所有功能开发完成后,应合并至 `dev` 分支进行集成测试,确认没有问题后再合并到 `main`。
|
||||
|
||||
### 2.3 功能分支 (`feature/*`)
|
||||
|
||||
* **用途**:每个新功能的开发都应从 `dev` 分支创建一个独立的功能分支。
|
||||
* **命名规范**:`feature/功能描述`,例如:`feature/ast-folding`、`feature/user-cli`。所有分支名称应使用小写字母,并且使用破折号(`-`)分隔单词。
|
||||
* **开发流程**:
|
||||
* **用途**: 每个新功能的开发都应从 `dev` 分支创建一个独立的功能分支。
|
||||
* **命名规范**: `feature/功能描述`,例如: `feature/ast-folding`、`feature/user-cli`。所有分支名称应使用小写字母,并且使用破折号(`-`)分隔单词。
|
||||
* **开发流程**:
|
||||
|
||||
1. 从 `dev` 分支拉取最新代码。
|
||||
2. 完成功能开发后,在本地提交代码并推送至远程仓库。
|
||||
@ -34,9 +34,9 @@
|
||||
|
||||
### 2.4 修复分支 (`bugfix/*`)
|
||||
|
||||
* **用途**:用于修复 Bug,修复分支可以从 `dev` 或 `main` 分支创建。
|
||||
* **命名规范**:`bugfix/bug描述`,例如:`bugfix/fix-ast-error`。
|
||||
* **开发流程**:
|
||||
* **用途**: 用于修复 Bug,修复分支可以从 `dev` 或 `main` 分支创建。
|
||||
* **命名规范**: `bugfix/bug描述`,例如: `bugfix/fix-ast-error`。
|
||||
* **开发流程**:
|
||||
|
||||
1. 从 `dev` 或 `main` 分支拉取最新代码。
|
||||
2. 完成修复后,提交修改并推送至远程仓库。
|
||||
@ -44,9 +44,9 @@
|
||||
|
||||
### 2.5 发布分支 (`release/*`)
|
||||
|
||||
* **用途**:当 `dev` 分支的功能开发完成且准备发布时,应创建一个 `release` 分支进行发布准备。
|
||||
* **命名规范**:`release/vX.X.X`,例如:`release/v1.0.0`。
|
||||
* **开发流程**:
|
||||
* **用途**: 当 `dev` 分支的功能开发完成且准备发布时,应创建一个 `release` 分支进行发布准备。
|
||||
* **命名规范**: `release/vX.X.X`,例如: `release/v1.0.0`。
|
||||
* **开发流程**:
|
||||
|
||||
1. 从 `dev` 分支创建 `release` 分支。
|
||||
2. 在 `release` 分支上进行版本发布的最终准备工作,如文档更新、版本号调整等。
|
||||
@ -54,24 +54,24 @@
|
||||
|
||||
### 2.6 热修复分支 (`hotfix/*`)
|
||||
|
||||
* **用途**:当生产环境中发现紧急问题(如 Bug 或系统崩溃等),需在 `main` 分支上进行快速修复时,应创建一个 `hotfix` 分支进行修复。
|
||||
* **命名规范**:`hotfix/bug描述`,例如:`hotfix/fix-production-crash`。
|
||||
* **开发流程**:
|
||||
* **用途**: 当生产环境中发现紧急问题(如 Bug 或系统崩溃等),需在 `main` 分支上进行快速修复时,应创建一个 `hotfix` 分支进行修复。
|
||||
* **命名规范**: `hotfix/bug描述`,例如: `hotfix/fix-production-crash`。
|
||||
* **开发流程**:
|
||||
|
||||
1. 从 `main` 分支创建 `hotfix` 分支,确保该分支包含生产环境中最新的稳定版本。
|
||||
2. 在 `hotfix` 分支上进行问题修复和相关调整。
|
||||
3. 完成修复后,提交修改并推送至远程仓库。
|
||||
4. 创建拉取请求(PR),将 `hotfix` 分支合并至 `main` 分支并打上版本标签,确保生产环境修复生效。
|
||||
5. 将修复后的变更合并回 `dev` 分支,确保所有的修复和调整同步到开发分支,防止后续开发中出现同样的问题。
|
||||
6. **回滚策略**:如果热修复未能解决问题,立即回滚合并,删除 `hotfix` 分支并通知团队,确保不影响生产环境。
|
||||
6. **回滚策略**: 如果热修复未能解决问题,立即回滚合并,删除 `hotfix` 分支并通知团队,确保不影响生产环境。
|
||||
|
||||
## 3. 提交规范
|
||||
|
||||
为确保提交信息清晰且易于理解,遵循以下提交规范:
|
||||
为确保提交信息清晰且易于理解,遵循以下提交规范:
|
||||
|
||||
### 3.1 提交信息格式
|
||||
|
||||
提交信息应简洁且具有描述性,格式如下:
|
||||
提交信息应简洁且具有描述性,格式如下:
|
||||
|
||||
```
|
||||
[类型] 描述
|
||||
@ -81,20 +81,20 @@
|
||||
|
||||
#### 提交类型
|
||||
|
||||
* `feat`:新增功能
|
||||
* `fix`:修复 Bug
|
||||
* `docs`:文档更新
|
||||
* `style`:代码格式调整(不影响功能)
|
||||
* `refactor`:代码重构
|
||||
* `test`:增加/修改测试
|
||||
* `chore`:工具配置等其他杂项任务
|
||||
* `ci`:持续集成相关改动
|
||||
* `perf`:性能优化
|
||||
* `feat`: 新增功能
|
||||
* `fix`: 修复 Bug
|
||||
* `docs`: 文档更新
|
||||
* `style`: 代码格式调整(不影响功能)
|
||||
* `refactor`: 代码重构
|
||||
* `test`: 增加/修改测试
|
||||
* `chore`: 工具配置等其他杂项任务
|
||||
* `ci`: 持续集成相关改动
|
||||
* `perf`: 性能优化
|
||||
|
||||
#### 示例
|
||||
|
||||
* `feat: 添加 IR 折叠功能`
|
||||
* `fix: 修复问题 Y(原因:X bug,解决方案:Z)`
|
||||
* `fix: 修复问题 Y(原因: X bug,解决方案: Z)`
|
||||
* `docs: 更新 API 文档`
|
||||
* `refactor: 优化 AST 逻辑`
|
||||
|
||||
@ -114,7 +114,7 @@
|
||||
### 4.2 代码审查
|
||||
|
||||
* 所有 PR 必须经过至少一名开发者的代码审查。
|
||||
* 审查时应关注以下方面:
|
||||
* 审查时应关注以下方面:
|
||||
|
||||
* 代码是否符合项目的编码规范。
|
||||
* 是否提供了足够的单元测试覆盖。
|
||||
@ -124,14 +124,14 @@
|
||||
|
||||
## 5. 版本发布
|
||||
|
||||
版本发布基于 Git 标签,发布流程如下:
|
||||
版本发布基于 Git 标签,发布流程如下:
|
||||
|
||||
### 5.1 打标签
|
||||
|
||||
每当版本准备发布时,应在 `main` 分支上打上版本标签:
|
||||
每当版本准备发布时,应在 `main` 分支上打上版本标签:
|
||||
|
||||
* **版本号规则**:采用语义化版本控制(SemVer)格式,版本号由三部分组成:`主版本号.次版本号.修订号`(例如:`v1.0.0`)。
|
||||
* **标签命令**:
|
||||
* **版本号规则**: 采用语义化版本控制(SemVer)格式,版本号由三部分组成: `主版本号.次版本号.修订号`(例如: `v1.0.0`)。
|
||||
* **标签命令**:
|
||||
|
||||
```bash
|
||||
git tag v1.0.0
|
||||
@ -0,0 +1,174 @@
|
||||
# Snow-Lang GraalVM AOT 打包指南
|
||||
|
||||
## 1. 概述
|
||||
|
||||
本文档介绍如何使用 GraalVM 的 AOT(Ahead-of-Time)编译功能将一个 Snow-Lang 项目打包成原生可执行文件(Native Image)。
|
||||
|
||||
## 2. 前置条件
|
||||
|
||||
1. 操作系统: Linux/macOS/Windows
|
||||
2. Java 项目(Maven)
|
||||
3. GraalVM(建议 24+ 版本)
|
||||
|
||||
## 3. 环境准备
|
||||
|
||||
### 3.1 安装 GraalVM
|
||||
|
||||
1. 下载对应平台的 GraalVM Community 版本: [https://www.graalvm.org/downloads/](https://www.graalvm.org/downloads/)
|
||||
2. 解压并配置环境变量:
|
||||
|
||||
3. 验证安装:
|
||||
|
||||
```bash
|
||||
java -version
|
||||
# 应显示 GraalVM 版本信息
|
||||
java version "24.0.1" 2025-04-15
|
||||
Java(TM) SE Runtime Environment Oracle GraalVM 24.0.1+9.1 (build 24.0.1+9-jvmci-b01)
|
||||
Java HotSpot(TM) 64-Bit Server VM Oracle GraalVM 24.0.1+9.1 (build 24.0.1+9-jvmci-b01, mixed mode, sharing)
|
||||
```
|
||||
### 3.2 Windows 上 Native Image 的先决条件
|
||||
|
||||
在 Windows 上,Native Image 需要 Visual Studio 和 Microsoft Visual C++(MSVC)。
|
||||
|
||||
1. 从 [visualstudio.microsoft.com](https://visualstudio.microsoft.com/zh-hans/vs/) 下载 Visual Studio Build Tools 2022 或更高版本(C 开发环境)。
|
||||
|
||||
2. 通过打开下载的文件来启动安装,然后单击 **继续**
|
||||
|
||||

|
||||
|
||||
3. 在主窗口中选择 **使用 C++ 进行桌面开发** 复选框。在右侧的“安装详细信息”下,确保选择了两个要求,**Windows 11 SDK** 和 **MSVC (…) C++ x64/x86 构建工具**。单击 **安装** 继续。
|
||||
|
||||

|
||||
|
||||
您现在能够使用 GraalVM Native Image 进行构建。
|
||||
|
||||
## 4. Maven 项目配置文件
|
||||
|
||||
通过将以下配置文件添加到 `pom.xml` 中,为 Native Image 启用 Maven 插件:
|
||||
|
||||
```xml
|
||||
<profiles>
|
||||
<!--
|
||||
原生镜像构建: Linux 平台
|
||||
- 使用 GraalVM 的 native-image 工具,生成静态链接的可执行文件
|
||||
- 依赖 musl libc,需提前安装并配置 musl-gcc 工具链
|
||||
-->
|
||||
<profile>
|
||||
<id>native-linux</id>
|
||||
<activation>
|
||||
<os>
|
||||
<family>unix</family>
|
||||
</os>
|
||||
</activation>
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.graalvm.buildtools</groupId>
|
||||
<artifactId>native-maven-plugin</artifactId>
|
||||
<version>${native.maven.plugin.version}</version>
|
||||
<!-- 启用插件扩展,允许在 build 生命周期中无须额外配置 -->
|
||||
<extensions>true</extensions>
|
||||
<executions>
|
||||
<!-- 打包阶段生成原生可执行文件 -->
|
||||
<execution>
|
||||
<id>build-native</id>
|
||||
<goals>
|
||||
<!-- compile-no-fork 在当前 JVM 进程中执行 native-image -->
|
||||
<goal>compile-no-fork</goal>
|
||||
</goals>
|
||||
<phase>package</phase>
|
||||
</execution>
|
||||
<!-- 测试阶段运行原生镜像的测试 -->
|
||||
<execution>
|
||||
<id>test-native</id>
|
||||
<goals>
|
||||
<goal>test</goal>
|
||||
</goals>
|
||||
<phase>test</phase>
|
||||
</execution>
|
||||
</executions>
|
||||
<configuration>
|
||||
<buildArgs>
|
||||
<!-- 静态链接 -->
|
||||
<buildArg>--static</buildArg>
|
||||
<!-- 指定 musl libc -->
|
||||
<buildArg>--libc=musl</buildArg>
|
||||
<!-- 输出构建报告 -->
|
||||
<buildArg>--emit build-report</buildArg>
|
||||
<!-- 优化级别 O2 -->
|
||||
<buildArg>-O2</buildArg>
|
||||
</buildArgs>
|
||||
<environment>
|
||||
<!-- 指定使用 musl 工具链 -->
|
||||
<PATH>/opt/musl-1.2.5/bin:${env.PATH}</PATH>
|
||||
<C_INCLUDE_PATH>/opt/musl-1.2.5/include</C_INCLUDE_PATH>
|
||||
<LIBRARY_PATH>/opt/musl-1.2.5/lib</LIBRARY_PATH>
|
||||
</environment>
|
||||
</configuration>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
</profile>
|
||||
|
||||
<!--
|
||||
原生镜像构建: Windows 平台
|
||||
- 使用 GraalVM 的 native-image 工具,生成 Windows 可执行文件
|
||||
- Windows 上不使用 musl,因此不配置静态链接
|
||||
-->
|
||||
<profile>
|
||||
<id>native-windows</id>
|
||||
<activation>
|
||||
<os>
|
||||
<family>Windows</family>
|
||||
</os>
|
||||
</activation>
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.graalvm.buildtools</groupId>
|
||||
<artifactId>native-maven-plugin</artifactId>
|
||||
<version>${native.maven.plugin.version}</version>
|
||||
<extensions>true</extensions>
|
||||
<executions>
|
||||
<!-- 打包阶段生成 Windows 可执行文件 -->
|
||||
<execution>
|
||||
<id>build-native</id>
|
||||
<goals>
|
||||
<goal>compile-no-fork</goal>
|
||||
</goals>
|
||||
<phase>package</phase>
|
||||
</execution>
|
||||
<!-- 测试阶段运行原生镜像测试 -->
|
||||
<execution>
|
||||
<id>test-native</id>
|
||||
<goals>
|
||||
<goal>test</goal>
|
||||
</goals>
|
||||
<phase>test</phase>
|
||||
</execution>
|
||||
</executions>
|
||||
<configuration>
|
||||
<buildArgs>
|
||||
<!-- 输出构建报告 -->
|
||||
<buildArg>--emit build-report</buildArg>
|
||||
<!-- 优化级别 O2 -->
|
||||
<buildArg>-O2</buildArg>
|
||||
</buildArgs>
|
||||
</configuration>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
</profile>
|
||||
</profiles>
|
||||
```
|
||||
|
||||
## 5. 构建 Native Image
|
||||
|
||||
1. 确保项目已在 JVM 下通过测试。
|
||||
2. 点击 `Maven` `生命周期` `package`
|
||||
|
||||

|
||||
|
||||
3. 等待 Native Image 构建完成: 这个过程可能较慢(数分钟)。
|
||||
4. 可执行文件即可直接运行,无需 JVM。
|
||||
> 生成的可执行文件位于 target/ 目录。
|
||||
|
After Width: | Height: | Size: 10 KiB |
BIN
docs/Snow-Lang-GraalVM-AOT-Native-Image-Package/img/IMG_VS_1.png
Normal file
|
After Width: | Height: | Size: 13 KiB |
BIN
docs/Snow-Lang-GraalVM-AOT-Native-Image-Package/img/IMG_VS_2.png
Normal file
|
After Width: | Height: | Size: 185 KiB |
@ -7,22 +7,22 @@
|
||||
|
||||
## 1.2 背景与目标读者
|
||||
|
||||
自 ChatGPT 3.5 诞生以来,越来越多的个人和企业将 LLM 生成的代码融入日常开发与自动化。然而,实践证明:LLM 生成的代码虽然“看起来没问题”,却常因对底层语言细节把握不准导致微妙 Bug——比如运算符优先级混淆、作用域处理错误、甚至基础库调用都无法编译通过。
|
||||
自 ChatGPT 3.5 诞生以来,越来越多的个人和企业将 LLM 生成的代码融入日常开发与自动化。然而,实践证明: LLM 生成的代码虽然“看起来没问题”,却常因对底层语言细节把握不准导致微妙 Bug——比如运算符优先级混淆、作用域处理错误、甚至基础库调用都无法编译通过。
|
||||
|
||||
于是,我萌生了这样一个想法:**能否设计一门编程语言,让 LLM 在“语法层面”能够更精准、高效地理解和生成代码?**
|
||||
于是,我萌生了这样一个想法: **能否设计一门编程语言,让 LLM 在“语法层面”能够更精准、高效地理解和生成代码?**
|
||||
|
||||
传统编程语言的设计多偏重“计算机”的执行效率,程序员往往在抽象表达和底层性能之间不断权衡。Ruby 之父松本行弘提出“为人而不是为机器编程”的理念。而在 LLM 日益普及的今天,我们应当承认:大型模型正成为“超级程序员”,它们不仅是助手,更是“代码生产的中介”。如果一门语言的语法和设计能最大化发挥 LLM 的推理与生成能力,人机协作的效率将被极大提升。
|
||||
传统编程语言的设计多偏重“计算机”的执行效率,程序员往往在抽象表达和底层性能之间不断权衡。Ruby 之父松本行弘提出“为人而不是为机器编程”的理念。而在 LLM 日益普及的今天,我们应当承认: 大型模型正成为“超级程序员”,它们不仅是助手,更是“代码生产的中介”。如果一门语言的语法和设计能最大化发挥 LLM 的推理与生成能力,人机协作的效率将被极大提升。
|
||||
|
||||
因此,**Snow** 的使命是:让编程语言不再“让人头疼”,而是“让 LLM 更加从容地书写”。目标受众涵盖 LLM 爱好者、开发者、对编译原理感兴趣的学生,以及对性能有追求的工程师甚至是初学者——每个人都能在 Snow 中找到乐趣与成长。
|
||||
因此,**Snow** 的使命是: 让编程语言不再“让人头疼”,而是“让 LLM 更加从容地书写”。目标受众涵盖 LLM 爱好者、开发者、对编译原理感兴趣的学生,以及对性能有追求的工程师甚至是初学者——每个人都能在 Snow 中找到乐趣与成长。
|
||||
|
||||
## 1.3 文章目的
|
||||
|
||||
本文将带你完整体验 Snow 从零到 v0.1 的诞生历程,围绕四个核心目标:
|
||||
本文将带你完整体验 Snow 从零到 v0.1 的诞生历程,围绕四个核心目标:
|
||||
|
||||
* **兴趣驱动的坚持**:用真实经历激励更多人相信“兴趣是最好的动力”,哪怕工作再忙,也能靠热爱坚持探索。
|
||||
* **从规划到实践的拆解**:详解在有限资源下,如何一步步拆解出词法分析、语法解析、AST 构建、解释执行等关键模块,以“先可用后完备”为原则,稳步推进。
|
||||
* **经验与反思**:不仅有“成功输出 1+1=2”的成就感,也有调试死循环、运算符冲突等踩坑经历,全方位展示编程语言设计的挑战与思考。
|
||||
* **激励与号召**:希望 Snow 成为开源社区的新起点,邀请更多伙伴参与,见证从 v0.2、v1.0 甚至到未来并发、标准库、包管理等更大梦想的实现。
|
||||
* **兴趣驱动的坚持**: 用真实经历激励更多人相信“兴趣是最好的动力”,哪怕工作再忙,也能靠热爱坚持探索。
|
||||
* **从规划到实践的拆解**: 详解在有限资源下,如何一步步拆解出词法分析、语法解析、AST 构建、解释执行等关键模块,以“先可用后完备”为原则,稳步推进。
|
||||
* **经验与反思**: 不仅有“成功输出 1+1=2”的成就感,也有调试死循环、运算符冲突等踩坑经历,全方位展示编程语言设计的挑战与思考。
|
||||
* **激励与号召**: 希望 Snow 成为开源社区的新起点,邀请更多伙伴参与,见证从 v0.2、v1.0 甚至到未来并发、标准库、包管理等更大梦想的实现。
|
||||
|
||||
---
|
||||
|
||||
@ -31,18 +31,18 @@
|
||||
## 2.1 现有工具的痛点
|
||||
|
||||
* **编程语言过于灵活,缺乏规范**
|
||||
常见的编程语言如 Python、PHP、Ruby,虽然语法简洁、上手快,但“灵活性”本身也带来了不少隐患:变量类型可以随意变化,作用域和命名规则宽松,团队协作时代码风格极易失控,隐蔽 Bug 难以及时发现。自动化运维和日常数据处理脚本往往随手一写,维护与交接时却漏洞百出、沟通成本高。许多开发者都在思考:如果有一门语法严谨、行为可预测,并天然适合团队协作与 LLM 生成的编程语言,是不是能让代码质量和工程效率都上一个台阶?
|
||||
常见的编程语言如 Python、PHP、Ruby,虽然语法简洁、上手快,但“灵活性”本身也带来了不少隐患: 变量类型可以随意变化,作用域和命名规则宽松,团队协作时代码风格极易失控,隐蔽 Bug 难以及时发现。自动化运维和日常数据处理脚本往往随手一写,维护与交接时却漏洞百出、沟通成本高。许多开发者都在思考: 如果有一门语法严谨、行为可预测,并天然适合团队协作与 LLM 生成的编程语言,是不是能让代码质量和工程效率都上一个台阶?
|
||||
|
||||
* **缺乏专为 LLM 设计的编程语言**
|
||||
当下主流编程语言,基本都是“为人类程序员”而设计,很少考虑 LLM 的生成和推理习惯。比如:部分语法容易混淆,作用域和可见性规则不直观,LLM 在生成时不仅需要大量提示,结果还常常不理想。缺少一门语法清晰、特征单一、对 LLM 友好的编程语言,导致自动化和智能生成代码场景下,仍然存在很多不可控和效率瓶颈。
|
||||
当下主流编程语言,基本都是“为人类程序员”而设计,很少考虑 LLM 的生成和推理习惯。比如: 部分语法容易混淆,作用域和可见性规则不直观,LLM 在生成时不仅需要大量提示,结果还常常不理想。缺少一门语法清晰、特征单一、对 LLM 友好的编程语言,导致自动化和智能生成代码场景下,仍然存在很多不可控和效率瓶颈。
|
||||
|
||||
## 2.2 触发想法的场景
|
||||
|
||||
* **对高效与规范的需求日益突出**
|
||||
在实际开发和运维工作中,我们经常要写各种自动化脚本。由于编程语言过于灵活,代码风格极易失控,维护起来痛苦不堪。团队中常常讨论:能否有一门语法严谨、易于规范化、适合团队协作的编程语言?大家都希望提升代码质量,减少后期返工。
|
||||
在实际开发和运维工作中,我们经常要写各种自动化脚本。由于编程语言过于灵活,代码风格极易失控,维护起来痛苦不堪。团队中常常讨论: 能否有一门语法严谨、易于规范化、适合团队协作的编程语言?大家都希望提升代码质量,减少后期返工。
|
||||
|
||||
* **自研编程语言的大胆设想**
|
||||
随着 LLM 在自动化、辅助编程中的应用普及,越来越多场景下希望直接“让 LLM 写代码”。但事实是,不管是让 LLM 生成 Python 还是 PHP,总要写很多提示,还要人工修正各种细节。由此引发思考:如果有一门对 LLM 友好的编程语言,语法特征清晰、行为可预测,能不能大幅提升代码自动生成与落地的效率?
|
||||
随着 LLM 在自动化、辅助编程中的应用普及,越来越多场景下希望直接“让 LLM 写代码”。但事实是,不管是让 LLM 生成 Python 还是 PHP,总要写很多提示,还要人工修正各种细节。由此引发思考: 如果有一门对 LLM 友好的编程语言,语法特征清晰、行为可预测,能不能大幅提升代码自动生成与落地的效率?
|
||||
|
||||
|
||||
## 2.3 项目愿景
|
||||
@ -62,12 +62,12 @@
|
||||
|
||||
## 3.1 为什么开源
|
||||
|
||||
* **获得社区反馈,检验设计思路**:闭门造车易“自嗨”,开源能快速获得用户和专家的多视角建议。
|
||||
* **边开源边完善,更吸引贡献者**:功能精简但可用时就发布,容易吸引早期用户参与共建。
|
||||
* **获得社区反馈,检验设计思路**: 闭门造车易“自嗨”,开源能快速获得用户和专家的多视角建议。
|
||||
* **边开源边完善,更吸引贡献者**: 功能精简但可用时就发布,容易吸引早期用户参与共建。
|
||||
|
||||
## 3.2 开源准备工作
|
||||
|
||||
* **许可证选择**:
|
||||
* **许可证选择**:
|
||||
采用 [Apache-2.0](https://gitee.com/jcnc-org/snow/blob/main/LICENSE),最大程度降低贡献门槛。
|
||||
|
||||
## 3.3 项目运行输出
|
||||
@ -76,8 +76,8 @@
|
||||
module: Main
|
||||
import:Math
|
||||
function: main
|
||||
parameter:
|
||||
return_type: int
|
||||
params:
|
||||
returns: int
|
||||
body:
|
||||
Math.factorial(6L,1L)
|
||||
|
||||
@ -90,10 +90,10 @@ end module
|
||||
## 源代码 (test.snow)
|
||||
module: Math
|
||||
function: factorial
|
||||
parameter:
|
||||
params:
|
||||
declare n1: long
|
||||
declare n2: long
|
||||
return_type: long
|
||||
returns: long
|
||||
body:
|
||||
return n1+n2
|
||||
end body
|
||||
@ -248,11 +248,11 @@ Process has ended
|
||||
|
||||
## 4.1 v0.2 初步目标
|
||||
|
||||
1. **完善变量作用域与高级函数调用**:
|
||||
1. **完善变量作用域与高级函数调用**:
|
||||
支持函数参数、返回值、本地与全局变量隔离,以及闭包基础,为并发/异步打基础。
|
||||
2. **完善错误提示与调试信息**:
|
||||
2. **完善错误提示与调试信息**:
|
||||
报错更精准,方便新手调试。
|
||||
3. **预计发布日期:2025 年 7 月 30 日**
|
||||
3. **预计发布日期: 2025 年 7 月 30 日**
|
||||
|
||||
## 4.2 v0.3 目标
|
||||
1. **IDE的支持**
|
||||
@ -262,11 +262,11 @@ Process has ended
|
||||
|
||||
## 4.3 v1.0 长期规划
|
||||
|
||||
1. **初步标准库**:
|
||||
1. **初步标准库**:
|
||||
I/O、字符串、JSON、文件系统,满足日常脚本需求。
|
||||
2. **包管理与模块加载**:
|
||||
2. **包管理与模块加载**:
|
||||
设计 `snowpkg`,支持一键安装依赖、自动模块导入。
|
||||
3. **社区协作与贡献**:
|
||||
3. **社区协作与贡献**:
|
||||
开设设计讨论区、每月线上分享,鼓励贡献代码与案例,让更多人参与 Snow 的成长。
|
||||
|
||||
---
|
||||
@ -275,15 +275,15 @@ Process has ended
|
||||
|
||||
## 5.1 学习收获与成就感
|
||||
|
||||
回望从零到 v0.1 的历程,我最开始设计了虚拟机,然后设计的编译器,最震撼的是:让一个想法变成可运行的代码,哪怕只输出一句“Hello, Snow!”也足以令人热血沸腾。每一次 Snow 在屏幕上输出,都让我更深刻理解了编译原理的乐趣。
|
||||
回望从零到 v0.1 的历程,我最开始设计了虚拟机,然后设计的编译器,最震撼的是: 让一个想法变成可运行的代码,哪怕只输出一句“Hello, Snow!”也足以令人热血沸腾。每一次 Snow 在屏幕上输出,都让我更深刻理解了编译原理的乐趣。
|
||||
|
||||
## 5.2 技术敬畏与情感共鸣
|
||||
|
||||
也许有人会说“输出一句话算什么”,但其实,每一个简单的表达式背后,都凝结了无数技术细节:多字符运算符的处理、优先级解析、AST 与符号表、作用域管理、底层 GC 可行性……每一环都让人敬畏计算机科学之美。
|
||||
也许有人会说“输出一句话算什么”,但其实,每一个简单的表达式背后,都凝结了无数技术细节: 多字符运算符的处理、优先级解析、AST 与符号表、作用域管理、底层 GC 可行性……每一环都让人敬畏计算机科学之美。
|
||||
|
||||
## 5.3 欢迎你的加入
|
||||
|
||||
真诚邀请所有对编程语言、编译原理、LLM 应用感兴趣的小伙伴:
|
||||
真诚邀请所有对编程语言、编译原理、LLM 应用感兴趣的小伙伴:
|
||||
|
||||
1. 在 Gitee 提交 Issue,反馈使用体验和建议;
|
||||
2. Fork 仓库、贡献 PR,参与语法和功能共建;
|
||||
@ -294,7 +294,7 @@ Process has ended
|
||||
> 微信: xuxiaolankaka
|
||||
> QQ: 1399528359
|
||||
|
||||
对于从未写过语言的初学者,我想说:**不要害怕,从 Hello World 开始,你会发现编译原理其实很有趣。** 让我们一起,把 Snow 打造为兼顾 LLM 友好和人类易用的创新编程语言。也许,下一个改变编程世界的创举,就在我们手中诞生。
|
||||
对于从未写过语言的初学者,我想说: **不要害怕,从 Hello World 开始,你会发现编译原理其实很有趣。** 让我们一起,把 Snow 打造为兼顾 LLM 友好和人类易用的创新编程语言。也许,下一个改变编程世界的创举,就在我们手中诞生。
|
||||
|
||||
---
|
||||
|
||||
|
Before Width: | Height: | Size: 190 KiB After Width: | Height: | Size: 190 KiB |
|
Before Width: | Height: | Size: 192 KiB After Width: | Height: | Size: 192 KiB |
75
docs/Snow-Lang-Roadmap/Snow-Lang-Roadmap-2025-06-11.md
Normal file
@ -0,0 +1,75 @@
|
||||
# Snow 语言现状和下一阶段开发路线图
|
||||
|
||||
> 日期: 2025-06-11
|
||||
|
||||
## 1. 代码结构与职责
|
||||
| 层次 | 主要包/目录 | 说明 |
|
||||
|--------|--------------------------|--------------------------------------------------------|
|
||||
| 词法分析 | `snow/compiler/lexer` | 扫描器(Scanner)+ `TokenFactory`,可识别关键字、运算符、数字/字符串字面量等 |
|
||||
| 语法分析 | `snow/compiler/parser` | Pratt 表达式解析器 + 各类语句解析器(声明、`if`、`loop`、`return`…)生成 AST |
|
||||
| 语义分析 | `snow/compiler/semantic` | 符号表、类型系统(`BuiltinType`/`FunctionType`)与各节点分析器 |
|
||||
| IR 构建 | `snow/compiler/ir` | SSA-风格中间表示、指令集、构建器 |
|
||||
| 后端生成 | `snow/compiler/backend` | IR ➜ VM 指令的 `*Generator` 体系、寄存器分配 |
|
||||
| 运行时 VM | `snow/vm` | 指令集实现(栈/寄存器/内存/控制流/函数)+ 启动器 |
|
||||
|
||||
### 2 编译流程
|
||||
|
||||
1. **Lexer** 将源码映射为 `TokenStream`
|
||||
2. **Parser** 生成 AST(19 种节点)
|
||||
3. **Semantic**
|
||||
|
||||
* 类型推断 / 兼容性校验
|
||||
* 符号绑定与引用解析
|
||||
4. **IR**
|
||||
|
||||
* 虚拟寄存器 + 基本块 + 统一指令(算术、比较、跳转、调用、返回…)
|
||||
5. **Backend**
|
||||
|
||||
* 线性扫描寄存器分配
|
||||
* 指令生成器把 IR 转为 VM 指令
|
||||
6. **VM**
|
||||
|
||||
* 栈-基 / 寄存器混合架构
|
||||
* 96 条已实现指令(按数据宽度泛化: B/S/I/L/F/D)
|
||||
* 运行时启动器 `VMLauncher`
|
||||
|
||||
|
||||
## 3. 测试中存在的问题记录
|
||||
|
||||
| 模块 | 现状 |
|
||||
|----------------|---------------------------------------------------------------|
|
||||
| **布尔类型** | 词法已识别 `bool`,但 `BuiltinType` 中缺失;比较运算目前回落为 `int` 0/1 |
|
||||
| **一元/前缀运算** | VM 与 IR 有 `UnaryOperationInstruction`,Parser 未注册 `-x`, `!x` 等 |
|
||||
| **数组/切片/Map** | 无 AST/Type/IR 支持 |
|
||||
| **结构体 / 面向对象** | 无 结构体、对象 节点 |
|
||||
| **异常处理** | 无 try/catch 指令或语义 |
|
||||
| **优化 Pass** | 未见常量折叠 / 死代码删除等 |
|
||||
| **标准库 & I/O** | 仅语言核心,无文件/网络/控制台 API |
|
||||
| **测试矩阵** | 单元测试缺失,e2e 样例有限 |
|
||||
| **CLI/包管理** | 缺少 `snowc` 命令与包版本语义 |
|
||||
|
||||
## 4. 下一阶段开发路线图
|
||||
|
||||
> 优先级: P0 = 当前版本必须,P1 = 下一个小版本,P2 = 中长期
|
||||
|
||||
| 优先级 | 功能 | 关键任务 |
|
||||
|--------|------------------|----------------------------------------------------------------------------------------------------------------------|
|
||||
| **P0** | **布尔类型落地** | \* 在 `BuiltinType` 中补充 `BOOL`<br>\* 更新 `TokenFactory.TYPES` 映射<br>\* 比较/逻辑运算返回 `bool` 类型<br>\* VM 增加布尔专用指令或重用 `byte` |
|
||||
| **P0** | **一元表达式解析** | \* 实现 `UnaryOperatorParselet`(`-`, `+`, `!`)<br>\* 对应 `UnaryOpGenerator` 注册 |
|
||||
| **P1** | **数组与切片** | \* 设计 `ArrayType`(元素类型 + 维度)<br>\* 新增 `IndexExpressionNode`、`NewArrayNode`<br>\* VM 扩充 `ALOAD/ASTORE` 指令 |
|
||||
| **P1** | **基础标准库** | \* `print/println`, 文件读写<br>\* 编译期内置绑定到 VM calls |
|
||||
| **P1** | **测试与 CI** | \* JUnit5 单测: Lexer / Parser / Semantic / VM<br>\* CI/CD 自动构建、示例编译运行 |
|
||||
| **P2** | **结构体 / 简单面向对象** | \* 结构体 语法、记录类型布局<br>\* 方法调度: 静态 or 虚表 |
|
||||
| **P2** | **优化管线** | \* 常量折叠、公共子表达式消除<br>\* 简易死代码清除 |
|
||||
| **P2** | **错误与异常系统** | \* 语法: `try … catch … end`<br>\* VM: 展开-收缩栈,异常表 |
|
||||
| **P2** | **包管理 & CLI** | \* `snowc` 命令: `build`, `run`, `test`<br>\* 本地缓存 `.snowpkg`与包版本语义 |
|
||||
|
||||
|
||||
## 5.1 里程碑排期
|
||||
|
||||
| 时间 | 目标 |
|
||||
|---------|----------------------------------------|
|
||||
| 2025-07 | 发布 **v0.2.0**: 布尔类型 + 一元运算、20+ 单元测试 |
|
||||
| 2025-08 | 发布 **v0.3.0**: 数组/切片 & 基础标准库;引入 CLI |
|
||||
| 2025-10 | 发布 **v0.4.0**: 结构体支持、首批优化 Pass、>80% 覆盖率 |
|
||||
| 2026-11 | 发布 **v1.0.0**: 异常系统、稳定包管理、文档完善 |
|
||||
581
docs/Snow-Lang-Syntax/Snow-Lang-Grammar-Specification.md
Normal file
@ -0,0 +1,581 @@
|
||||
# Snow‑Lang 语法规范
|
||||
|
||||
---
|
||||
|
||||
## 0 · 符号约定
|
||||
|
||||
* ⟦ … ⟧: 可选项(0 或 1 次)
|
||||
* { … }\*: 可重复项(0 次或多次)
|
||||
|
||||
---
|
||||
|
||||
## 1 · 词汇结构
|
||||
|
||||
### 1.1 编码与字符集
|
||||
|
||||
源文件采用 UTF‑8 编码。除注释外,标识符只允许英文大小写字母 (A‑Z a‑z)、数字 (0‑9) 与下划线 _;首字符不能为数字。
|
||||
|
||||
```ebnf
|
||||
identifier ::= [A-Za-z_][A-Za-z0-9_]* ;
|
||||
```
|
||||
|
||||
* **区分大小写**: Foo 与 foo 为不同标识符。
|
||||
* 保留字 (见 §1.3) **禁止** 用作标识符。
|
||||
|
||||
### 1.2 分隔符与强制空白
|
||||
|
||||
相邻两个标记之间 **推荐** 至少以 1 个空白字符分隔,除非记号本身带有定界符 (( ) , : = < > 等)。示例:
|
||||
|
||||
```snow
|
||||
module: Foo // 推荐
|
||||
module:Foo // 不推荐
|
||||
```
|
||||
|
||||
### 1.3 保留关键字
|
||||
|
||||
```
|
||||
module import end module globals struct end struct
|
||||
function end function params returns body end body
|
||||
declare if then else end if loop init cond step
|
||||
end loop break continue self
|
||||
```
|
||||
|
||||
以上列表 **均为关键词**,大小写固定,不能作为标识符。
|
||||
|
||||
### 1.4 文字量 (Literal)
|
||||
|
||||
* **整型**: 123 0 -42
|
||||
* **浮点**: 3.14 0.0
|
||||
* **布尔**: true false
|
||||
* **字符串**: 未来版本保留;当前规范未定义。
|
||||
|
||||
### 1.5 注释
|
||||
|
||||
* **单行注释**: 以 // 起,至当行行尾。
|
||||
* **多行注释**: /* … */ 可跨行。**不可嵌套**;嵌套会在最内层 */ 处终止外层,导致编译错误。
|
||||
|
||||
---
|
||||
|
||||
### 1.6 换行与缩进
|
||||
|
||||
* **只有换行有语义**: 以行末冒号(:)打开一个块时(如 module:、function:、if、loop: 等),块体**必须另起新行**。
|
||||
* **缩进没有语义**: 缩进仅用于提高代码可读性,对语法无影响。缩进不一致不会报错。
|
||||
* 块体通过显式关闭关键字(如 end module、end function 等)结束。
|
||||
* 若关闭关键字与开始关键字之间的缩进不一致,不会报错,仍以关闭关键字为准。
|
||||
|
||||
> 块体结构完全由行分隔和显式关闭关键字决定,缩进仅为美观,不影响代码执行。
|
||||
|
||||
---
|
||||
|
||||
## 2 · 模块与导入
|
||||
|
||||
### 2.1 模块声明
|
||||
|
||||
```snow
|
||||
module: <ModuleName>
|
||||
…
|
||||
end module
|
||||
```
|
||||
|
||||
* 一个源文件只能出现 **一次** module: 声明,且文件名与模块名无必然关系。
|
||||
* 模块名可使用点号(.)分隔表示包层级,例如 util.math。
|
||||
* **允许** 不同文件夹下声明同名模块,但模块全名(含包路径,用点分隔)在全项目中必须唯一。
|
||||
* 若项目中出现重复的模块全名,编译阶段将报重定义错误。
|
||||
|
||||
例如:
|
||||
> src/util/math.snow // module: util.math
|
||||
> src/core/math.snow // module: core.math
|
||||
>
|
||||
> 两者都声明了 module: math,但由于包路径不同(util.math 与 core.math),互不冲突。
|
||||
|
||||
### 2.2 导入
|
||||
|
||||
```snow
|
||||
import: <ModuleA>⟦ as <AliasA>⟧, <ModuleB>⟦ as <AliasB>⟧, …
|
||||
```
|
||||
|
||||
* **别名 (Alias)** 可为任何合法标识符,放在 as 关键字之后。
|
||||
* **重复导入**: 对同一模块多次导入(无论是否带 alias)只解析一次,其余忽略告警。
|
||||
* **循环依赖**: 当前规范未定义,若出现编译器可拒绝或延迟解析。
|
||||
* **子模块**(诸如 A.B)暂不支持。
|
||||
|
||||
### 2.3 全路径引用
|
||||
|
||||
* 跨模块引用必须使用 _Prefix_._Name_,其中 *Prefix* 是模块名或导入时的别名。
|
||||
例如: Math.Point 或 M.sin。
|
||||
* **解析顺序**: 未加前缀的标识符只在本模块查找;找不到则视为编译错误,不会隐式搜索导入模块。
|
||||
|
||||
---
|
||||
|
||||
## 3 · 命名与作用域
|
||||
|
||||
### 3.1 作用域层级
|
||||
|
||||
1. **模块顶层**: 全局变量、结构体、模块级函数。
|
||||
2. **结构体内部**: 字段、方法、构造函数。
|
||||
3. **函数/方法**: 形参与局部变量。
|
||||
4. **局部嵌套块** (if / loop 等) 的局部变量。
|
||||
|
||||
### 3.2 唯一性规则
|
||||
|
||||
* **模块顶层唯一**: 同一模块的 *结构体名*、*模块级函数名*、*全局变量名* **不得重名**。
|
||||
* **结构体内部**: 字段名与方法名不得相同;**允许有多个与结构体名同名的函数(即构造函数重载),但其参数签名必须互不相同。**
|
||||
* **构造函数重载**: 结构体内部可以声明多个与结构体名同名的函数作为构造函数,参数类型与数量必须不同,否则属于 DuplicateName 错误。
|
||||
* **跨层级遮蔽**: 内层可定义与外层同名标识符(除关键字限制外),遵循最近作用域原则。
|
||||
|
||||
### 3.3 访问控制约定
|
||||
|
||||
* **私有成员与方法**: 以单个下划线 `_` 开头的变量名、字段名或方法名,**仅在其所属结构体或模块内部可见**。外部不可访问,编译器应报错 `AccessDenied`。
|
||||
- 例如 `_foo`, `_barMethod`。
|
||||
* **公有成员与方法**: 非下划线开头的变量、字段、方法,默认为公有。可在模块外部通过模块名/别名前缀访问。
|
||||
|
||||
#### 影响范围
|
||||
- **模块级变量与函数**: `globals` 和 `function` 语句声明的以 `_` 开头者,仅限本模块访问。
|
||||
- **结构体字段与方法**: 声明为 `_name`、`_doSomething` 的,仅结构体本身或其方法体可访问。
|
||||
---
|
||||
|
||||
#### 访问示例
|
||||
|
||||
```snow
|
||||
// module: foo
|
||||
globals:
|
||||
declare _secret: int = 42 // 仅 foo 模块内部可见
|
||||
declare visible: int = 1 // 公有
|
||||
|
||||
function: _hidden // 仅 foo 模块内部可见
|
||||
returns: int
|
||||
body:
|
||||
return 100
|
||||
end body
|
||||
end function
|
||||
|
||||
function: publicFunc
|
||||
returns: int
|
||||
body:
|
||||
return _secret + 1 // 合法
|
||||
end body
|
||||
end function
|
||||
|
||||
// module: bar
|
||||
import: foo
|
||||
|
||||
declare x: int = foo.visible // 合法
|
||||
declare y: int = foo._secret // 编译错误 AccessDenied
|
||||
declare z: int = foo._hidden() // 编译错误 AccessDenied
|
||||
```
|
||||
|
||||
## 4 · 声明语法
|
||||
|
||||
### 4.1 全局变量
|
||||
|
||||
```snow
|
||||
globals:
|
||||
declare VarName: Type ⟦= Expr⟧
|
||||
```
|
||||
|
||||
* 后续对该变量赋值时 **不得** 使用 declare。
|
||||
|
||||
### 4.2 结构体
|
||||
|
||||
```snow
|
||||
struct: StructName
|
||||
declare field1: Type1
|
||||
declare field2: Type2
|
||||
…
|
||||
|
||||
// ──────────── 构造函数(可以不存在, 可重载) ──────────────
|
||||
function: StructName
|
||||
params:
|
||||
declare p1: Type1
|
||||
…
|
||||
body:
|
||||
self.field1 = p1
|
||||
…
|
||||
end body
|
||||
end function
|
||||
|
||||
function: StructName
|
||||
params:
|
||||
declare q1: TypeQ
|
||||
declare q2: TypeQ
|
||||
body:
|
||||
// ...
|
||||
end body
|
||||
end function
|
||||
// ...可继续声明更多参数签名各异的构造函数...
|
||||
// ─────────────────────────────────────────────
|
||||
|
||||
// ────────── 结构体内函数 (可以不存在) ──────────
|
||||
function: method1
|
||||
⟦params:
|
||||
declare x: TypeX
|
||||
…⟧
|
||||
returns: ReturnType
|
||||
body:
|
||||
…
|
||||
end body
|
||||
end function
|
||||
// ─────────────────────────────────────────────
|
||||
|
||||
end struct
|
||||
```
|
||||
|
||||
**实例化**:
|
||||
|
||||
* declare p: Point = Point(1, 2)
|
||||
* declare p2: Point = Point(3)
|
||||
|
||||
- 实参顺序 = 构造函数 params: 声明顺序;与字段声明顺序无关。
|
||||
- **构造函数重载时**,调用 Point(...) 时根据参数数量和类型匹配唯一的构造函数。若无匹配或多重匹配,则为编译错误。
|
||||
- 不支持命名实参、缺省实参或字段名字面量初始化。
|
||||
|
||||
### 4.3 函数
|
||||
|
||||
```snow
|
||||
function: FuncName
|
||||
returns: Type // 无返回值的时候写 void
|
||||
⟦params:
|
||||
declare x: TypeX // 无参数的时候不写 params
|
||||
…⟧
|
||||
body:
|
||||
…
|
||||
end body
|
||||
end function
|
||||
```
|
||||
|
||||
* **返回检查**: 若 returns: 指定类型非 void,所有控制流路径必须显式 return 该类型值。
|
||||
* 在 loop 内或经 break 跳出后能到达的路径亦计入检查;若缺失,编译错误。
|
||||
|
||||
---
|
||||
|
||||
## 5 · 语句
|
||||
|
||||
### 5.1 变量声明与赋值
|
||||
|
||||
```snow
|
||||
declare x: int = 0
|
||||
x = 1
|
||||
```
|
||||
|
||||
* 同一作用域中 declare 仅能出现一次。
|
||||
|
||||
### 5.2 条件语句
|
||||
|
||||
```snow
|
||||
if Condition then
|
||||
…
|
||||
else
|
||||
…
|
||||
end if
|
||||
```
|
||||
|
||||
* Condition 类型必须为 bool。
|
||||
|
||||
### 5.3 循环语句
|
||||
|
||||
```snow
|
||||
loop:
|
||||
init:
|
||||
declare i: int = 0
|
||||
cond:
|
||||
i < 10
|
||||
step:
|
||||
i = i + 1
|
||||
body:
|
||||
…
|
||||
end body
|
||||
end loop
|
||||
```
|
||||
|
||||
* **作用域**: init 块声明的变量仅在本 loop 的 init/cond/step/body 有效。
|
||||
* break 立即终止当前循环;continue 跳过剩余 body,执行 step → cond。
|
||||
|
||||
---
|
||||
|
||||
## 6 · 类型系统
|
||||
|
||||
### 6.1 数值类型
|
||||
|
||||
Snow-Lang 支持下列**数值类型**,用于声明变量、参数、结构体字段、函数返回等:
|
||||
|
||||
| 类型名 | 关键字 | 位数 | 描述 |
|
||||
|----------|--------|----|---------------------------|
|
||||
| byte8 | byte | 8 | 8 位有符号整数 |
|
||||
| short16 | short | 16 | 16 位有符号整数 |
|
||||
| int32 | int | 32 | 32 位有符号整数(默认整数类型) |
|
||||
| long64 | long | 64 | 64 位有符号整数 |
|
||||
| float32 | float | 32 | 32 位 IEEE-754 浮点数 |
|
||||
| double64 | double | 64 | 64 位 IEEE-754 浮点数(默认浮点类型) |
|
||||
|
||||
**说明**
|
||||
* 没有无符号整型,所有整型均为有符号。
|
||||
* `int` 为整数常量与变量的默认类型。
|
||||
* `double` 为浮点常量与变量的默认类型。
|
||||
* `bool` 类型只表示真/假,不允许与数值类型直接互转。
|
||||
|
||||
#### 数值字面量后缀
|
||||
|
||||
为指定具体类型,可在数值字面量后加后缀字母(大小写均可):
|
||||
|
||||
| 后缀 | 类型 | 例子 |
|
||||
|----|--------|----------|
|
||||
| b | byte | 7b, -2B |
|
||||
| s | short | 123s |
|
||||
| l | long | 5l, 123L |
|
||||
| f | float | 3.14f |
|
||||
|
||||
- 没有后缀的整数字面量自动为 `int`。
|
||||
- 没有后缀的浮点字面量自动为 `double`。
|
||||
|
||||
**示例: **
|
||||
```snow
|
||||
declare a: int = 7 // int (默认)
|
||||
declare b: long = 9l // long
|
||||
declare c: float = 2.5f // float
|
||||
declare d: double = 2.5 // double (默认)
|
||||
declare e: byte = 127b // byte
|
||||
declare f: short = 100s // short
|
||||
````
|
||||
|
||||
---
|
||||
|
||||
### 6.2 布尔类型
|
||||
|
||||
* 关键字为 `bool`
|
||||
* 字面量为 `true` 或 `false`
|
||||
* 仅用于逻辑判断、条件分支,不与整型互转
|
||||
|
||||
---
|
||||
|
||||
### 6.3 数组类型
|
||||
|
||||
支持一维和多维数组。数组类型以 `T[]` 表示元素类型为 T 的一维数组,多维数组以 `T[][]`、`T[][][]` 依次类推。
|
||||
|
||||
#### 声明与初始化
|
||||
|
||||
````snow
|
||||
declare arr: int[] = [1, 2, 3]
|
||||
declare matrix: double[][] = [
|
||||
[1.1, 2.2],
|
||||
[3.3, 4.4]
|
||||
]
|
||||
declare cube: bool[][][] = [
|
||||
[[true, false], [false, true]],
|
||||
[[false, false], [true, true]]
|
||||
]
|
||||
````
|
||||
|
||||
#### 访问与赋值
|
||||
|
||||
````snow
|
||||
arr[0] = 10
|
||||
matrix[1][1] = 5.6
|
||||
declare x: int = arr[2]
|
||||
declare y: double = matrix[0][1]
|
||||
````
|
||||
|
||||
---
|
||||
|
||||
### 6.4 结构体类型
|
||||
|
||||
* 使用 `struct` 关键字声明
|
||||
* 结构体类型为用户自定义类型,**值类型**(赋值、传参时会拷贝整个结构体)
|
||||
* 字段类型可以为任何合法类型(包括数组、其它结构体)
|
||||
|
||||
````snow
|
||||
struct: Point
|
||||
declare x: int
|
||||
declare y: int
|
||||
end struct
|
||||
|
||||
declare a: Point = Point(1, 2)
|
||||
````
|
||||
|
||||
---
|
||||
|
||||
### 6.5 传值说明
|
||||
|
||||
* **所有变量、参数、返回值**均为**值传递**(按值拷贝)
|
||||
* 结构体、数组在赋值与传参时,均会复制整个值;后续修改不会影响原对象
|
||||
|
||||
|
||||
---
|
||||
|
||||
## 7 · 名字解析算法(概览)
|
||||
|
||||
1. **输入**: 未限定前缀的标识符 N,当前作用域 S。
|
||||
2. 自内向外遍历作用域链查找 N;首次匹配即确定绑定。
|
||||
3. 若遍历至模块顶层仍未匹配,编译错误 *UnresolvedIdentifier*。
|
||||
4. 限定名 Prefix.N: 直接在模块表中查 Prefix(包括别名),成功后在该模块顶层查找 N;找不到即 *UnresolvedQualifiedIdentifier*。
|
||||
|
||||
---
|
||||
|
||||
## 8 · 编译单位与入口
|
||||
|
||||
* **单一入口**: 编译器需指定某模块某函数作为启动入口。
|
||||
* **模块初始化**: globals 块中的带初值变量在程序启动时自顶向下按出现顺序初始化;不同模块按依赖拓扑顺序初始化(循环依赖未定义)。
|
||||
|
||||
---
|
||||
|
||||
## 9 · 错误分类
|
||||
|
||||
| 编译期错误代码 | 产生条件 |
|
||||
|----------------------|----------------------------|
|
||||
| DuplicateName | 违反唯一性规则;结构体内有参数签名完全相同的构造函数 |
|
||||
| UnresolvedIdentifier | 名字无法解析 |
|
||||
| ReturnMissing | 非 void 函数缺少 return |
|
||||
| TypeMismatch | 赋值或返回类型不兼容 |
|
||||
| ImportCycle | (可选)检测到循环依赖 |
|
||||
| CtorAmbiguous | 构造函数重载时参数匹配不唯一 |
|
||||
| CtorNotFound | 构造函数重载时无匹配参数签名 |
|
||||
| AccessDenied | 访问了以 `_` 开头的私有变量或方法但不在允许范围 |
|
||||
|
||||
---
|
||||
|
||||
|
||||
## 10 · 完整示例
|
||||
|
||||
````snow
|
||||
module: RectExample
|
||||
import: Geometry
|
||||
|
||||
struct: Point
|
||||
declare x: int
|
||||
declare y: int
|
||||
|
||||
// 构造函数1: 两个参数
|
||||
function: Point
|
||||
params:
|
||||
declare x: int
|
||||
declare y: int
|
||||
body:
|
||||
self.x = x
|
||||
self.y = y
|
||||
end body
|
||||
end function
|
||||
|
||||
// 构造函数2: 一个参数
|
||||
function: Point
|
||||
params:
|
||||
declare xy: int
|
||||
body:
|
||||
self.x = xy
|
||||
self.y = xy
|
||||
end body
|
||||
end function
|
||||
end struct
|
||||
|
||||
struct: Rectangle
|
||||
declare left_top: Point
|
||||
declare right_bottom: Point
|
||||
|
||||
function: Rectangle
|
||||
params:
|
||||
declare x1: int
|
||||
declare y1: int
|
||||
declare x2: int
|
||||
declare y2: int
|
||||
body:
|
||||
self.left_top = Point(x1, y1)
|
||||
self.right_bottom = Point(x2, y2)
|
||||
end body
|
||||
end function
|
||||
|
||||
function: Rectangle
|
||||
params:
|
||||
declare width: int
|
||||
declare height: int
|
||||
body:
|
||||
self.left_top = Point(0, 0)
|
||||
self.right_bottom = Point(width, height)
|
||||
end body
|
||||
end function
|
||||
|
||||
function: width
|
||||
returns: int
|
||||
body:
|
||||
return self.right_bottom.x - self.left_top.x
|
||||
end body
|
||||
end function
|
||||
|
||||
function: height
|
||||
returns: int
|
||||
body:
|
||||
return self.right_bottom.y - self.left_top.y
|
||||
end body
|
||||
end function
|
||||
|
||||
function: area
|
||||
returns: int
|
||||
body:
|
||||
return self.width() * self.height()
|
||||
end body
|
||||
end function
|
||||
end struct
|
||||
|
||||
function: main
|
||||
returns: int
|
||||
body:
|
||||
declare rect1: Rectangle = Rectangle(0, 0, 10, 10)
|
||||
declare rect2: Rectangle = Rectangle(5, 6)
|
||||
declare result: int = 0
|
||||
if rect1.area() > 50 then
|
||||
loop:
|
||||
init:
|
||||
declare i: int = 1
|
||||
cond:
|
||||
i <= rect1.width()
|
||||
step:
|
||||
i = i + 1
|
||||
body:
|
||||
if i == 3 then
|
||||
continue
|
||||
end if
|
||||
if i == 8 then
|
||||
break
|
||||
end if
|
||||
result = result + i
|
||||
end body
|
||||
end loop
|
||||
else
|
||||
result = rect1.area()
|
||||
end if
|
||||
return result
|
||||
end body
|
||||
end function
|
||||
|
||||
end module
|
||||
````
|
||||
|
||||
---
|
||||
|
||||
## 11 · 构造函数重载示例
|
||||
|
||||
````snow
|
||||
struct: Point
|
||||
declare x: int
|
||||
declare y: int
|
||||
|
||||
function: Point
|
||||
params:
|
||||
declare x: int
|
||||
declare y: int
|
||||
body:
|
||||
self.x = x
|
||||
self.y = y
|
||||
end body
|
||||
end function
|
||||
|
||||
function: Point
|
||||
params:
|
||||
declare xy: int
|
||||
body:
|
||||
self.x = xy
|
||||
self.y = xy
|
||||
end body
|
||||
end function
|
||||
end struct
|
||||
|
||||
declare a: Point = Point(1, 2) // 匹配第一个构造函数
|
||||
declare b: Point = Point(5) // 匹配第二个构造函数
|
||||
````
|
||||
258
docs/Snow-Lang-Syntax/Snow-Lang-Syntax.md
Normal file
@ -0,0 +1,258 @@
|
||||
# Snow-Lang 语法
|
||||
|
||||
## 快速入门
|
||||
|
||||
一个简单的 snow 程序
|
||||
|
||||
```snow
|
||||
module: Main
|
||||
function: main
|
||||
returns: int
|
||||
body:
|
||||
|
||||
return 1 + 1
|
||||
end body
|
||||
end function
|
||||
end module
|
||||
```
|
||||
|
||||
## 基础
|
||||
|
||||
### 注释
|
||||
```snow
|
||||
// 单行注释
|
||||
|
||||
/*
|
||||
多行注释
|
||||
多行注释
|
||||
多行注释
|
||||
*/
|
||||
```
|
||||
|
||||
### 数据类型
|
||||
|
||||
bool 类型:
|
||||
|
||||
两种值: `true` 和 `false`
|
||||
|
||||
|
||||
|
||||
|
||||
数值类型:
|
||||
|
||||
| Number | keyword |
|
||||
|----------|---------|
|
||||
| byte8 | byte |
|
||||
| short16 | short |
|
||||
| int32 | int |
|
||||
| long64 | long |
|
||||
| float32 | float |
|
||||
| double64 | double |
|
||||
|
||||
默认整数的类型为 int,浮点数的类型为 double。
|
||||
|
||||
数值字面量后缀:
|
||||
|
||||
| 数值字面量后缀 | 例子 |
|
||||
|---------|----|
|
||||
| b、B | 7b |
|
||||
| s、S | 7s |
|
||||
| l、L | 7l |
|
||||
| f、F | 7f |
|
||||
|
||||
|
||||
### 变量
|
||||
定义变量的形式如下,中括号表示可选:
|
||||
|
||||
```snow
|
||||
declare name: type [= initial_value]
|
||||
```
|
||||
|
||||
其中 `name` 是变量名,`type` 是变量类型,`initial_value` 是初始值
|
||||
|
||||
例:
|
||||
|
||||
```snow
|
||||
declare x: int
|
||||
declare y: long = 123456789
|
||||
```
|
||||
|
||||
读取变量值的方法,直接写变量的名字即可:
|
||||
```snow
|
||||
x
|
||||
```
|
||||
|
||||
设置变量值的方法,先写变量名,后面接 `=`,最后写一个表达式即可:
|
||||
```snow
|
||||
x = 10
|
||||
```
|
||||
|
||||
于是可以通过这种方式让变量参与计算并保存结果:
|
||||
```snow
|
||||
x = y + 1
|
||||
```
|
||||
读取 `y` 的值加 1 并保存到变量 `x`。
|
||||
|
||||
变量只能定义在函数体中、函数参数列表、loop 初始化器中。
|
||||
|
||||
## 流程控制
|
||||
### if
|
||||
if 语句的形式如下,else 是可选的:
|
||||
|
||||
```snow
|
||||
if cond then
|
||||
// 条件成立执行的代码
|
||||
else
|
||||
// 以上条件不成立执行的代码
|
||||
end if
|
||||
```
|
||||
|
||||
cond 可以是表达式(结果为 bool 类型)或者 bool 字面量
|
||||
|
||||
例:
|
||||
|
||||
```snow
|
||||
module: Main
|
||||
function: main
|
||||
returns: int
|
||||
body:
|
||||
if 5 > 7 then
|
||||
return 5
|
||||
else
|
||||
return 7
|
||||
end if
|
||||
|
||||
return 0
|
||||
end body
|
||||
end function
|
||||
end module
|
||||
```
|
||||
|
||||
### loop
|
||||
loop 语句的形式如下:
|
||||
```snow
|
||||
loop:
|
||||
init:
|
||||
// 循环开始前可声明循环变量,有且只能声明一个
|
||||
declare i: int = 1
|
||||
cond:
|
||||
// 循环条件,成立则执行 body 的代码,
|
||||
// 不成立则退出循环,有且只能写一条
|
||||
i <= 100
|
||||
step:
|
||||
// 循环体执行完后执行的代码,有且只能写一条
|
||||
i = i + 1
|
||||
body:
|
||||
// 每次执行的代码写这里
|
||||
end body
|
||||
end loop
|
||||
```
|
||||
|
||||
例子(求 1 ~ 100 的和):
|
||||
```snow
|
||||
module: Main
|
||||
function: main
|
||||
returns: int
|
||||
body:
|
||||
declare sum: int = 0
|
||||
loop:
|
||||
init:
|
||||
declare i: int = 1
|
||||
cond:
|
||||
i <= 100
|
||||
step:
|
||||
i = i + 1
|
||||
body:
|
||||
sum = sum + i
|
||||
end body
|
||||
end loop
|
||||
|
||||
return sum
|
||||
end body
|
||||
end function
|
||||
end module
|
||||
```
|
||||
|
||||
## 函数
|
||||
函数的形式如下:
|
||||
```snow
|
||||
function: add
|
||||
params:
|
||||
declare a: int
|
||||
declare b: int
|
||||
returns: int
|
||||
body:
|
||||
return a + b
|
||||
end body
|
||||
end function
|
||||
```
|
||||
其中 add 是函数名,params 下面是参数列表(可省略),与变量的定义类似,但是不允许赋初值,
|
||||
接着 returns 设置返回值类型,最后的 body 为函数体。
|
||||
|
||||
## 模块
|
||||
|
||||
一个模块可以包含多个函数,
|
||||
通过 import 语句导入模块,
|
||||
snow 会自动将同名模块的函数合并。
|
||||
|
||||
在我们最初的例子中,就用了 module 这个关键字。让我们回忆一下:
|
||||
|
||||
```snow
|
||||
module: Main
|
||||
function: main
|
||||
returns: int
|
||||
body:
|
||||
|
||||
return 1 + 1
|
||||
end body
|
||||
end function
|
||||
end module
|
||||
```
|
||||
|
||||
可以看到模块名是 Main,里面有函数 main。
|
||||
|
||||
假如现在有一个模块 Math,代码如下:
|
||||
```snow
|
||||
// Math.snow
|
||||
module: Math
|
||||
function: add
|
||||
params:
|
||||
declare a: int
|
||||
declare b: int
|
||||
returns: int
|
||||
body:
|
||||
return a + b
|
||||
end body
|
||||
end function
|
||||
end module
|
||||
```
|
||||
|
||||
可以使用 import 来导入 Math 模块:
|
||||
```snow
|
||||
// main.snow
|
||||
module: Main
|
||||
import: Math
|
||||
function: main
|
||||
returns: int
|
||||
body:
|
||||
|
||||
return Math.add(5, 7)
|
||||
end body
|
||||
end function
|
||||
end module
|
||||
```
|
||||
|
||||
可以同时导入多个模块,用逗号(半角)分隔模块名即可:
|
||||
```snow
|
||||
// main.snow
|
||||
module: Main
|
||||
import: Math, Time
|
||||
function: main
|
||||
returns: int
|
||||
body:
|
||||
|
||||
return Math.add(5, 7)
|
||||
end body
|
||||
end function
|
||||
end module
|
||||
```
|
||||
233
docs/SnowVM-OpCode/SnowVM-OpCode.md
Normal file
@ -0,0 +1,233 @@
|
||||
# SnowVM-OpCode
|
||||
|
||||
## Type Control (0x0000-0x00BF)
|
||||
|
||||
### Byte8 (0x0000-0x001F)
|
||||
| 指令名 | 十六进制 | 说明 |
|
||||
|----------|--------|----------------|
|
||||
| B\_ADD | 0x0000 | byte8 加法 |
|
||||
| B\_SUB | 0x0001 | byte8 减法 |
|
||||
| B\_MUL | 0x0002 | byte8 乘法 |
|
||||
| B\_DIV | 0x0003 | byte8 除法 |
|
||||
| B\_MOD | 0x0004 | byte8 取余 |
|
||||
| B\_NEG | 0x0005 | byte8 取负 |
|
||||
| B\_INC | 0x0006 | byte8 自增 |
|
||||
| B\_AND | 0x0007 | byte8 按位与 |
|
||||
| B\_OR | 0x0008 | byte8 按位或 |
|
||||
| B\_XOR | 0x0009 | byte8 按位异或 |
|
||||
| B\_PUSH | 0x000A | byte8 入栈 |
|
||||
| B\_LOAD | 0x000B | byte8 本地变量加载 |
|
||||
| B\_STORE | 0x000C | byte8 本地变量存储 |
|
||||
| B\_CE | 0x000D | byte8 等于条件判断 |
|
||||
| B\_CNE | 0x000E | byte8 不等于条件判断 |
|
||||
| B\_CG | 0x000F | byte8 大于条件判断 |
|
||||
| B\_CGE | 0x0010 | byte8 大于等于条件判断 |
|
||||
| B\_CL | 0x0011 | byte8 小于条件判断 |
|
||||
| B\_CLE | 0x0012 | byte8 小于等于条件判断 |
|
||||
|
||||
---
|
||||
|
||||
### Short16 (0x0020-0x003F)
|
||||
|
||||
| 指令名 | 十六进制 | 说明 |
|
||||
|----------|--------|------------------|
|
||||
| S\_ADD | 0x0020 | short16 加法 |
|
||||
| S\_SUB | 0x0021 | short16 减法 |
|
||||
| S\_MUL | 0x0022 | short16 乘法 |
|
||||
| S\_DIV | 0x0023 | short16 除法 |
|
||||
| S\_MOD | 0x0024 | short16 取余 |
|
||||
| S\_NEG | 0x0025 | short16 取负 |
|
||||
| S\_INC | 0x0026 | short16 自增 |
|
||||
| S\_AND | 0x0027 | short16 按位与 |
|
||||
| S\_OR | 0x0028 | short16 按位或 |
|
||||
| S\_XOR | 0x0029 | short16 按位异或 |
|
||||
| S\_PUSH | 0x002A | short16 入栈 |
|
||||
| S\_LOAD | 0x002B | short16 本地变量加载 |
|
||||
| S\_STORE | 0x002C | short16 本地变量存储 |
|
||||
| S\_CE | 0x002D | short16 等于条件判断 |
|
||||
| S\_CNE | 0x002E | short16 不等于条件判断 |
|
||||
| S\_CG | 0x002F | short16 大于条件判断 |
|
||||
| S\_CGE | 0x0030 | short16 大于等于条件判断 |
|
||||
| S\_CL | 0x0031 | short16 小于条件判断 |
|
||||
| S\_CLE | 0x0032 | short16 小于等于条件判断 |
|
||||
|
||||
---
|
||||
|
||||
### Int32 (0x0040-0x005F)
|
||||
|
||||
| 指令名 | 十六进制 | 说明 |
|
||||
|----------|--------|----------------|
|
||||
| I\_ADD | 0x0040 | int32 加法 |
|
||||
| I\_SUB | 0x0041 | int32 减法 |
|
||||
| I\_MUL | 0x0042 | int32 乘法 |
|
||||
| I\_DIV | 0x0043 | int32 除法 |
|
||||
| I\_MOD | 0x0044 | int32 取余 |
|
||||
| I\_NEG | 0x0045 | int32 取负 |
|
||||
| I\_INC | 0x0046 | int32 自增 |
|
||||
| I\_AND | 0x0047 | int32 按位与 |
|
||||
| I\_OR | 0x0048 | int32 按位或 |
|
||||
| I\_XOR | 0x0049 | int32 按位异或 |
|
||||
| I\_PUSH | 0x004A | int32 入栈 |
|
||||
| I\_LOAD | 0x004B | int32 本地变量加载 |
|
||||
| I\_STORE | 0x004C | int32 本地变量存储 |
|
||||
| I\_CE | 0x004D | int32 等于条件判断 |
|
||||
| I\_CNE | 0x004E | int32 不等于条件判断 |
|
||||
| I\_CG | 0x004F | int32 大于条件判断 |
|
||||
| I\_CGE | 0x0050 | int32 大于等于条件判断 |
|
||||
| I\_CL | 0x0051 | int32 小于条件判断 |
|
||||
| I\_CLE | 0x0052 | int32 小于等于条件判断 |
|
||||
|
||||
---
|
||||
|
||||
### Long64 区域(0x0060-0x007F)
|
||||
|
||||
| 指令名 | 十六进制 | 说明 |
|
||||
|----------|--------|-----------------|
|
||||
| L\_ADD | 0x0060 | long64 加法 |
|
||||
| L\_SUB | 0x0061 | long64 减法 |
|
||||
| L\_MUL | 0x0062 | long64 乘法 |
|
||||
| L\_DIV | 0x0063 | long64 除法 |
|
||||
| L\_MOD | 0x0064 | long64 取余 |
|
||||
| L\_NEG | 0x0065 | long64 取负 |
|
||||
| L\_INC | 0x0066 | long64 自增 |
|
||||
| L\_AND | 0x0067 | long64 按位与 |
|
||||
| L\_OR | 0x0068 | long64 按位或 |
|
||||
| L\_XOR | 0x0069 | long64 按位异或 |
|
||||
| L\_PUSH | 0x006A | long64 入栈 |
|
||||
| L\_LOAD | 0x006B | long64 本地变量加载 |
|
||||
| L\_STORE | 0x006C | long64 本地变量存储 |
|
||||
| L\_CE | 0x006D | long64 等于条件判断 |
|
||||
| L\_CNE | 0x006E | long64 不等于条件判断 |
|
||||
| L\_CG | 0x006F | long64 大于条件判断 |
|
||||
| L\_CGE | 0x0070 | long64 大于等于条件判断 |
|
||||
| L\_CL | 0x0071 | long64 小于条件判断 |
|
||||
| L\_CLE | 0x0072 | long64 小于等于条件判断 |
|
||||
|
||||
---
|
||||
|
||||
### Float32 区域(0x0080-0x009F)
|
||||
|
||||
| 指令名 | 十六进制 | 说明 |
|
||||
|----------|--------|------------------|
|
||||
| F\_ADD | 0x0080 | float32 加法 |
|
||||
| F\_SUB | 0x0081 | float32 减法 |
|
||||
| F\_MUL | 0x0082 | float32 乘法 |
|
||||
| F\_DIV | 0x0083 | float32 除法 |
|
||||
| F\_MOD | 0x0084 | float32 取余 |
|
||||
| F\_NEG | 0x0085 | float32 取负 |
|
||||
| F\_INC | 0x0086 | float32 自增 |
|
||||
| F\_PUSH | 0x0087 | float32 入栈 |
|
||||
| F\_LOAD | 0x0088 | float32 本地变量加载 |
|
||||
| F\_STORE | 0x0089 | float32 本地变量存储 |
|
||||
| F\_CE | 0x008A | float32 等于条件判断 |
|
||||
| F\_CNE | 0x008B | float32 不等于条件判断 |
|
||||
| F\_CG | 0x008C | float32 大于条件判断 |
|
||||
| F\_CGE | 0x008D | float32 大于等于条件判断 |
|
||||
| F\_CL | 0x008E | float32 小于条件判断 |
|
||||
| F\_CLE | 0x008F | float32 小于等于条件判断 |
|
||||
|
||||
---
|
||||
|
||||
### Double64 区域(0x00A0-0x00BF)
|
||||
|
||||
| 指令名 | 十六进制 | 说明 |
|
||||
|----------|--------|-------------------|
|
||||
| D\_ADD | 0x00A0 | double64 加法 |
|
||||
| D\_SUB | 0x00A1 | double64 减法 |
|
||||
| D\_MUL | 0x00A2 | double64 乘法 |
|
||||
| D\_DIV | 0x00A3 | double64 除法 |
|
||||
| D\_MOD | 0x00A4 | double64 取余 |
|
||||
| D\_NEG | 0x00A5 | double64 取负 |
|
||||
| D\_INC | 0x00A6 | double64 自增 |
|
||||
| D\_PUSH | 0x00A7 | double64 入栈 |
|
||||
| D\_LOAD | 0x00A8 | double64 本地变量加载 |
|
||||
| D\_STORE | 0x00A9 | double64 本地变量存储 |
|
||||
| D\_CE | 0x00AA | double64 等于条件判断 |
|
||||
| D\_CNE | 0x00AB | double64 不等于条件判断 |
|
||||
| D\_CG | 0x00AC | double64 大于条件判断 |
|
||||
| D\_CGE | 0x00AD | double64 大于等于条件判断 |
|
||||
| D\_CL | 0x00AE | double64 小于条件判断 |
|
||||
| D\_CLE | 0x00AF | double64 小于等于条件判断 |
|
||||
|
||||
---
|
||||
|
||||
## Type Conversion (0x00C0-0x00DF)
|
||||
|
||||
| 指令名 | 十六进制 | 说明 |
|
||||
|-----|--------|--------------------|
|
||||
| B2S | 0x00C0 | byte8 转 short16 |
|
||||
| B2I | 0x00C1 | byte8 转 int32 |
|
||||
| B2L | 0x00C2 | byte8 转 long64 |
|
||||
| B2F | 0x00C3 | byte8 转 float32 |
|
||||
| B2D | 0x00C4 | byte8 转 double64 |
|
||||
| S2B | 0x00C5 | short16 转 byte8 |
|
||||
| S2I | 0x00C6 | short16 转 int32 |
|
||||
| S2L | 0x00C7 | short16 转 long64 |
|
||||
| S2F | 0x00C8 | short16 转 float32 |
|
||||
| S2D | 0x00C9 | short16 转 double64 |
|
||||
| I2B | 0x00CA | int32 转 byte8 |
|
||||
| I2S | 0x00CB | int32 转 short16 |
|
||||
| I2L | 0x00CC | int32 转 long64 |
|
||||
| I2F | 0x00CD | int32 转 float32 |
|
||||
| I2D | 0x00CE | int32 转 double64 |
|
||||
| L2B | 0x00CF | long64 转 byte8 |
|
||||
| L2S | 0x00D0 | long64 转 short16 |
|
||||
| L2I | 0x00D1 | long64 转 int32 |
|
||||
| L2F | 0x00D2 | long64 转 float32 |
|
||||
| L2D | 0x00D3 | long64 转 double64 |
|
||||
| F2B | 0x00D4 | float32 转 byte8 |
|
||||
| F2S | 0x00D5 | float32 转 short16 |
|
||||
| F2I | 0x00D6 | float32 转 int32 |
|
||||
| F2L | 0x00D7 | float32 转 long64 |
|
||||
| F2D | 0x00D8 | float32 转 double64 |
|
||||
| D2B | 0x00D9 | double64 转 byte8 |
|
||||
| D2S | 0x00DA | double64 转 short16 |
|
||||
| D2I | 0x00DB | double64 转 int32 |
|
||||
| D2L | 0x00DC | double64 转 long64 |
|
||||
| D2F | 0x00DD | double64 转 float32 |
|
||||
|
||||
---
|
||||
## Reference Control (0x00E0-0x00EF)
|
||||
| 指令名 | 十六进制 | 说明 |
|
||||
|----------|--------|---------------------------|
|
||||
| R\_PUSH | 0x00E0 | 将对象引用压入操作数栈 |
|
||||
| R\_LOAD | 0x00E1 | 从本地变量表加载对象引用并压入操作数栈 |
|
||||
| R\_STORE | 0x00E2 | 将操作数栈顶的对象引用弹出并存入本地变量表指定槽位 |
|
||||
|
||||
|
||||
|
||||
## Stack Control (0x0100-0x01FF)
|
||||
|
||||
| 指令名 | 十六进制 | 说明 |
|
||||
|------|--------|----------|
|
||||
| POP | 0x0100 | 弹出栈顶元素 |
|
||||
| DUP | 0x0101 | 复制栈顶元素 |
|
||||
| SWAP | 0x0102 | 交换栈顶前两元素 |
|
||||
|
||||
---
|
||||
|
||||
## Flow Control (0x0200-0x02FF)
|
||||
|
||||
| 指令名 | 十六进制/十进制 | 说明 |
|
||||
|------|----------|-------|
|
||||
| JUMP | 0x0200 | 无条件跳转 |
|
||||
| CALL | 0x0201 | 子程序调用 |
|
||||
| RET | 0x0202 | 子程序返回 |
|
||||
|
||||
---
|
||||
|
||||
## Register Control (0x0300-0x03FF)
|
||||
|
||||
| 指令名 | 十六进制 | 说明 |
|
||||
|-----|--------|---------|
|
||||
| MOV | 0x0300 | 局部变量间赋值 |
|
||||
|
||||
---
|
||||
|
||||
## System Control (0x0400-0x04FF)
|
||||
|
||||
| 指令名 | 十六进制 | 说明 |
|
||||
|-------------|--------|------|
|
||||
| HALT | 0x0400 | 程序终止 |
|
||||
| SYSCALL | 0x0401 | 系统调用 |
|
||||
| DEBUG\_TRAP | 0x0402 | 调试断点 |
|
||||
@ -1,7 +1,7 @@
|
||||
module: Math
|
||||
function: main
|
||||
parameter:
|
||||
return_type: int
|
||||
params:
|
||||
returns: int
|
||||
body:
|
||||
Math.factorial(6)
|
||||
return 0
|
||||
@ -9,17 +9,17 @@ module: Math
|
||||
end function
|
||||
|
||||
function: factorial
|
||||
parameter:
|
||||
params:
|
||||
declare n:int
|
||||
return_type: int
|
||||
returns: int
|
||||
body:
|
||||
declare num1:int = 1
|
||||
loop:
|
||||
initializer:
|
||||
init:
|
||||
declare counter:int = 1
|
||||
condition:
|
||||
cond:
|
||||
counter <= n
|
||||
update:
|
||||
step:
|
||||
counter = counter + 1
|
||||
body:
|
||||
num1 = num1 * counter
|
||||
|
||||
11
lib/os/OS.snow
Normal file
@ -0,0 +1,11 @@
|
||||
module: os
|
||||
import: os
|
||||
function: print
|
||||
params:
|
||||
declare i1: int
|
||||
returns: void
|
||||
body:
|
||||
syscall("PRINT",i1)
|
||||
end body
|
||||
end function
|
||||
end module
|
||||
@ -1,13 +1,13 @@
|
||||
function: main
|
||||
parameter:
|
||||
return_type: int
|
||||
params:
|
||||
returns: int
|
||||
body:
|
||||
loop:
|
||||
initializer:
|
||||
init:
|
||||
declare i:int = 0
|
||||
condition:
|
||||
cond:
|
||||
1 == 1
|
||||
update:
|
||||
step:
|
||||
i = i + 1
|
||||
body:
|
||||
|
||||
|
||||
8
playground/BugFarm/Bug1/Main.snow
Normal file
@ -0,0 +1,8 @@
|
||||
module: Main
|
||||
function: main
|
||||
returns: void
|
||||
body:
|
||||
declare abc:int =1
|
||||
end body
|
||||
end function
|
||||
end module
|
||||
33
playground/BugFarm/Bug2/Main.snow
Normal file
@ -0,0 +1,33 @@
|
||||
module: Main
|
||||
import: os
|
||||
function: main
|
||||
returns: void
|
||||
body:
|
||||
loop:
|
||||
init:
|
||||
declare outer_i: int = 1
|
||||
cond:
|
||||
outer_i <= 10
|
||||
step:
|
||||
outer_i = outer_i + 1
|
||||
body:
|
||||
print(outer_i)
|
||||
|
||||
loop:
|
||||
init:
|
||||
// 注意这一行使用了外层循环的变量 outer_i
|
||||
declare inter_j: int = outer_i
|
||||
cond:
|
||||
inter_j <= 10
|
||||
step:
|
||||
inter_j = inter_j + 1
|
||||
body:
|
||||
|
||||
end body
|
||||
end loop
|
||||
|
||||
end body
|
||||
end loop
|
||||
end body
|
||||
end function
|
||||
end module
|
||||
11
playground/BugFarm/Bug2/OS.snow
Normal file
@ -0,0 +1,11 @@
|
||||
module: os
|
||||
import: os
|
||||
function: print
|
||||
params:
|
||||
declare i1: int
|
||||
returns: void
|
||||
body:
|
||||
syscall("PRINT",i1)
|
||||
end body
|
||||
end function
|
||||
end module
|
||||
14
playground/BugFarm/Bug3/Main.snow
Normal file
@ -0,0 +1,14 @@
|
||||
module: Main
|
||||
import: os
|
||||
function: main
|
||||
returns: void
|
||||
body:
|
||||
// 合法
|
||||
declare b1: byte = 127b
|
||||
declare s1: short = 32767s
|
||||
declare i1: int = 2147483647
|
||||
declare l1: long = 9223372036854775807L
|
||||
|
||||
end body
|
||||
end function
|
||||
end module
|
||||
11
playground/BugFarm/Bug3/OS.snow
Normal file
@ -0,0 +1,11 @@
|
||||
module: os
|
||||
import: os
|
||||
function: print
|
||||
params:
|
||||
declare i1: int
|
||||
returns: void
|
||||
body:
|
||||
syscall("PRINT",i1)
|
||||
end body
|
||||
end function
|
||||
end module
|
||||