l0n0lc 0.8.4__py3-none-any.whl → 1.0.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- l0n0lc/Py/350/275/254Cpp/350/275/254/350/257/221/345/231/250.py +579 -0
- l0n0lc/__init__.py +75 -6
- l0n0lc/aot/347/274/226/350/257/221.py +679 -0
- l0n0lc/ast/350/256/277/351/227/256/350/200/205.py +599 -0
- l0n0lc/cpp/347/261/273/345/236/213.py +330 -0
- l0n0lc/cpp/347/274/226/350/257/221/345/231/250.py +317 -0
- l0n0lc/simd/344/274/230/345/214/226.py +260 -0
- l0n0lc/std_map.py +153 -0
- l0n0lc/std_set.py +185 -0
- l0n0lc/std_vector.py +96 -0
- l0n0lc//344/273/243/347/240/201/344/274/230/345/214/226.py +302 -0
- l0n0lc//344/273/243/347/240/201/347/224/237/346/210/220.py +546 -0
- l0n0lc//344/276/235/350/265/226/346/263/250/345/205/245.py +155 -0
- l0n0lc//345/215/263/346/227/266/347/274/226/350/257/221.py +192 -0
- l0n0lc//345/217/230/351/207/217/347/256/241/347/220/206/345/231/250.py +123 -0
- l0n0lc//345/237/272/347/241/200/346/230/240/345/260/204.py +103 -0
- l0n0lc//345/237/272/347/241/200/346/267/267/345/205/245.py +147 -0
- l0n0lc//345/256/271/345/231/250/346/236/204/345/273/272/345/231/250.py +214 -0
- l0n0lc//345/267/245/345/205/267.py +285 -0
- l0n0lc//345/271/266/350/241/214/347/274/226/350/257/221/345/231/250.py +412 -0
- l0n0lc//345/274/202/345/270/270.py +474 -0
- l0n0lc//346/225/260/347/273/204/345/257/271/350/261/241/346/261/240.py +248 -0
- l0n0lc//346/226/207/344/273/266/347/256/241/347/220/206/345/231/250.py +286 -0
- l0n0lc//346/227/245/345/277/227/345/267/245/345/205/267.py +152 -0
- l0n0lc//347/261/273/345/236/213/346/216/250/346/226/255/345/267/245/345/205/267.py +352 -0
- l0n0lc//347/261/273/345/236/213/350/275/254/346/215/242.py +210 -0
- l0n0lc//347/261/273/346/224/257/346/214/201.py +372 -0
- l0n0lc//347/274/226/350/257/221/344/270/212/344/270/213/346/226/207.py +132 -0
- l0n0lc//347/274/226/350/257/221/347/256/241/347/220/206/345/231/250.py +171 -0
- l0n0lc//350/241/250/350/276/276/345/274/217/345/244/204/347/220/206.py +462 -0
- l0n0lc//350/275/254/350/257/221/345/231/250/345/267/245/345/205/267.py +49 -0
- l0n0lc//350/277/220/350/241/214/346/227/266/345/212/240/350/275/275.py +217 -0
- l0n0lc//351/200/232/347/224/250/345/267/245/345/205/267.py +149 -0
- l0n0lc-1.0.0.dist-info/METADATA +363 -0
- l0n0lc-1.0.0.dist-info/RECORD +39 -0
- {l0n0lc-0.8.4.dist-info → l0n0lc-1.0.0.dist-info}/WHEEL +1 -1
- l0n0lc-1.0.0.dist-info/entry_points.txt +2 -0
- {l0n0lc-0.8.4.dist-info → l0n0lc-1.0.0.dist-info}/licenses/LICENSE +0 -0
- l0n0lc/StdList.py +0 -24
- l0n0lc/StdMap.py +0 -21
- l0n0lc/c/345/237/272/347/241/200/345/244/204/347/220/206.py +0 -207
- l0n0lc/jit.py +0 -604
- l0n0lc//347/274/226/350/257/221.py +0 -58
- l0n0lc//351/200/232/347/224/250.py +0 -134
- l0n0lc-0.8.4.dist-info/METADATA +0 -241
- l0n0lc-0.8.4.dist-info/RECORD +0 -12
- {l0n0lc-0.8.4.dist-info → l0n0lc-1.0.0.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
"""
|
|
2
|
+
依赖注入模块 - 实现依赖注入模式,降低模块间的耦合度
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
from typing import Dict, Any, Type, TypeVar, Callable, Optional, Union, cast
|
|
6
|
+
from abc import ABC, abstractmethod
|
|
7
|
+
|
|
8
|
+
T = TypeVar('T')
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class 服务容器:
|
|
12
|
+
"""简单的依赖注入容器"""
|
|
13
|
+
|
|
14
|
+
def __init__(self):
|
|
15
|
+
self._服务: Dict[str, Any] = {}
|
|
16
|
+
self._工厂: Dict[str, Union[Callable[[], Any], Type[Any], Any]] = {}
|
|
17
|
+
self._单例: Dict[str, bool] = {}
|
|
18
|
+
|
|
19
|
+
def 注册单例(self, 接口: Type[T], 实现: Type[T]) -> None:
|
|
20
|
+
"""注册单例服务"""
|
|
21
|
+
接口名 = 接口.__name__
|
|
22
|
+
self._工厂[接口名] = 实现
|
|
23
|
+
self._单例[接口名] = True
|
|
24
|
+
|
|
25
|
+
def 注册工厂(self, 接口: Type[T], 工厂: Callable[[], T]) -> None:
|
|
26
|
+
"""注册工厂方法"""
|
|
27
|
+
接口名 = 接口.__name__
|
|
28
|
+
self._工厂[接口名] = 工厂
|
|
29
|
+
self._单例[接口名] = False
|
|
30
|
+
|
|
31
|
+
def 注册实例(self, 接口: Type[T], 实例: T) -> None:
|
|
32
|
+
"""注册实例"""
|
|
33
|
+
接口名 = 接口.__name__
|
|
34
|
+
self._服务[接口名] = 实例
|
|
35
|
+
self._单例[接口名] = True
|
|
36
|
+
|
|
37
|
+
def 解析(self, 接口: Type[T]) -> T:
|
|
38
|
+
"""解析服务"""
|
|
39
|
+
接口名 = 接口.__name__
|
|
40
|
+
|
|
41
|
+
# 如果已有实例且为单例,直接返回
|
|
42
|
+
if 接口名 in self._服务 and self._单例.get(接口名, False):
|
|
43
|
+
return cast(T, self._服务[接口名])
|
|
44
|
+
|
|
45
|
+
# 创建新实例
|
|
46
|
+
if 接口名 in self._工厂:
|
|
47
|
+
if callable(self._工厂[接口名]):
|
|
48
|
+
实例 = self._工厂[接口名]()
|
|
49
|
+
else:
|
|
50
|
+
实例 = self._工厂[接口名]
|
|
51
|
+
|
|
52
|
+
if self._单例.get(接口名, False):
|
|
53
|
+
self._服务[接口名] = 实例
|
|
54
|
+
|
|
55
|
+
return cast(T, 实例)
|
|
56
|
+
|
|
57
|
+
raise ValueError(f"未注册的服务: {接口名}")
|
|
58
|
+
|
|
59
|
+
def 清理(self) -> None:
|
|
60
|
+
"""清理容器"""
|
|
61
|
+
self._服务.clear()
|
|
62
|
+
self._工厂.clear()
|
|
63
|
+
self._单例.clear()
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
# 全局服务容器
|
|
67
|
+
全局容器 = 服务容器()
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
class 转译器组件接口(ABC):
|
|
71
|
+
"""转译器组件的抽象基类"""
|
|
72
|
+
|
|
73
|
+
@abstractmethod
|
|
74
|
+
def 初始化(self, 转译器) -> None:
|
|
75
|
+
"""初始化组件"""
|
|
76
|
+
pass
|
|
77
|
+
|
|
78
|
+
@abstractmethod
|
|
79
|
+
def 清理(self) -> None:
|
|
80
|
+
"""清理组件资源"""
|
|
81
|
+
pass
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
class 代码生成接口(ABC):
|
|
85
|
+
"""代码生成接口"""
|
|
86
|
+
|
|
87
|
+
@abstractmethod
|
|
88
|
+
def 生成代码(self) -> str:
|
|
89
|
+
"""生成代码"""
|
|
90
|
+
pass
|
|
91
|
+
|
|
92
|
+
@abstractmethod
|
|
93
|
+
def 保存代码(self, 文件路径: str) -> None:
|
|
94
|
+
"""保存代码到文件"""
|
|
95
|
+
pass
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
class 类型推断接口(ABC):
|
|
99
|
+
"""类型推断接口"""
|
|
100
|
+
|
|
101
|
+
@abstractmethod
|
|
102
|
+
def 推断类型(self, 节点) -> str:
|
|
103
|
+
"""推断类型"""
|
|
104
|
+
pass
|
|
105
|
+
|
|
106
|
+
@abstractmethod
|
|
107
|
+
def 验证类型(self, 类型1: str, 类型2: str) -> bool:
|
|
108
|
+
"""验证类型兼容性"""
|
|
109
|
+
pass
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
class 编译管理接口(ABC):
|
|
113
|
+
"""编译管理接口"""
|
|
114
|
+
|
|
115
|
+
@abstractmethod
|
|
116
|
+
def 编译(self, 源文件: str, 输出文件: str) -> bool:
|
|
117
|
+
"""编译文件"""
|
|
118
|
+
pass
|
|
119
|
+
|
|
120
|
+
@abstractmethod
|
|
121
|
+
def 清理临时文件(self) -> None:
|
|
122
|
+
"""清理临时文件"""
|
|
123
|
+
pass
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
class 依赖解析接口(ABC):
|
|
127
|
+
"""依赖解析接口"""
|
|
128
|
+
|
|
129
|
+
@abstractmethod
|
|
130
|
+
def 解析依赖(self, 函数) -> list:
|
|
131
|
+
"""解析函数依赖"""
|
|
132
|
+
pass
|
|
133
|
+
|
|
134
|
+
@abstractmethod
|
|
135
|
+
def 排序依赖(self, 依赖列表: list) -> list:
|
|
136
|
+
"""对依赖进行拓扑排序"""
|
|
137
|
+
pass
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
def 注册服务(接口: Type[T], 实现: Type[T], 单例: bool = True) -> None:
|
|
141
|
+
"""便捷的服务注册函数"""
|
|
142
|
+
if 单例:
|
|
143
|
+
全局容器.注册单例(接口, 实现)
|
|
144
|
+
else:
|
|
145
|
+
全局容器.注册工厂(接口, 实现)
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
def 解析服务(接口: Type[T]) -> T:
|
|
149
|
+
"""便捷的服务解析函数"""
|
|
150
|
+
return 全局容器.解析(接口)
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
def 清理容器() -> None:
|
|
154
|
+
"""清理全局容器"""
|
|
155
|
+
全局容器.清理()
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
|
|
2
|
+
import os
|
|
3
|
+
import inspect
|
|
4
|
+
from typing import Callable, Optional
|
|
5
|
+
from .Py转Cpp转译器 import Py转Cpp转译器
|
|
6
|
+
from .cpp编译器 import Cpp编译器
|
|
7
|
+
from .工具 import 全局上下文
|
|
8
|
+
from .日志工具 import 日志
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def _从环境变量获取LTO设置() -> bool:
|
|
12
|
+
"""
|
|
13
|
+
从环境变量获取 LTO 设置
|
|
14
|
+
|
|
15
|
+
环境变量 L0N0LC_ENABLE_LTO:
|
|
16
|
+
- "1", "true", "True", "TRUE" -> 启用 LTO
|
|
17
|
+
- "0", "false", "False", "FALSE" 或未设置 -> 禁用 LTO
|
|
18
|
+
|
|
19
|
+
Returns:
|
|
20
|
+
是否启用 LTO
|
|
21
|
+
"""
|
|
22
|
+
环境变量值 = os.environ.get('L0N0LC_ENABLE_LTO', '').strip()
|
|
23
|
+
if 环境变量值:
|
|
24
|
+
return 环境变量值.lower() in ('1', 'true')
|
|
25
|
+
return False
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def _从环境变量获取向量化设置() -> bool:
|
|
29
|
+
"""
|
|
30
|
+
从环境变量获取向量化设置
|
|
31
|
+
|
|
32
|
+
环境变量 L0N0LC_ENABLE_VECTORIZE:
|
|
33
|
+
- "1", "true", "True", "TRUE" -> 启用向量化
|
|
34
|
+
- "0", "false", "False", "FALSE" 或未设置 -> 禁用向量化
|
|
35
|
+
|
|
36
|
+
Returns:
|
|
37
|
+
是否启用向量化
|
|
38
|
+
"""
|
|
39
|
+
环境变量值 = os.environ.get('L0N0LC_ENABLE_VECTORIZE', '').strip()
|
|
40
|
+
if 环境变量值:
|
|
41
|
+
return 环境变量值.lower() in ('1', 'true')
|
|
42
|
+
return False
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
def 即时编译(
|
|
46
|
+
转译器类=None,
|
|
47
|
+
编译器类=None,
|
|
48
|
+
总是重编: bool = False,
|
|
49
|
+
可执行文件名: Optional[str] = None,
|
|
50
|
+
优化级别: str = 'O2',
|
|
51
|
+
启用并行编译: bool = True,
|
|
52
|
+
最大进程数: Optional[int] = None,
|
|
53
|
+
启用LTO: Optional[bool] = None,
|
|
54
|
+
启用向量化: Optional[bool] = None,
|
|
55
|
+
SIMD指令集: Optional[str] = None,
|
|
56
|
+
启用代码优化: bool = True
|
|
57
|
+
):
|
|
58
|
+
"""
|
|
59
|
+
JIT (即时编译) 装饰器。
|
|
60
|
+
|
|
61
|
+
能够将受支持的 Python 函数转换为 C++ 代码,编译为动态库并加载执行。
|
|
62
|
+
大大提高计算密集型任务的性能。
|
|
63
|
+
|
|
64
|
+
注意:编译延迟到函数首次调用时才执行(可执行文件除外)。
|
|
65
|
+
|
|
66
|
+
Args:
|
|
67
|
+
转译器类: 自定义转译器类 (可选)
|
|
68
|
+
编译器类: 自定义编译器类 (可选)
|
|
69
|
+
总是重编: 是否每次运行都强制重新编译 (默认为 False,利用缓存)
|
|
70
|
+
可执行文件名: 如果指定,将编译为独立的可执行文件而不是动态库
|
|
71
|
+
优化级别: 编译优化级别,默认为 'O2'
|
|
72
|
+
- O0: 无优化,编译最快,运行最慢
|
|
73
|
+
- O1: 基础优化
|
|
74
|
+
- O2: 标准优化(默认)
|
|
75
|
+
- O3: 最大优化,编译较慢,运行最快
|
|
76
|
+
- Os: 优化代码大小
|
|
77
|
+
- Ofast: 激进优化(可能破坏标准合规)
|
|
78
|
+
- Og: 调试优化
|
|
79
|
+
- Oz: 最小代码大小
|
|
80
|
+
启用并行编译: 是否启用并行编译依赖函数(默认为 True)
|
|
81
|
+
最大进程数: 并行编译的最大进程数(None 表示自动检测 CPU 核心数)
|
|
82
|
+
启用LTO: 是否启用链接时优化(LTO),默认为 None(自动检测环境变量)
|
|
83
|
+
- None: 检查环境变量 L0N0LC_ENABLE_LTO
|
|
84
|
+
- True: 强制启用 LTO
|
|
85
|
+
- False: 强制禁用 LTO
|
|
86
|
+
LTO 可以提升运行时性能 10-30%,但会增加编译时间
|
|
87
|
+
启用向量化: 是否启用 SIMD 向量化优化,默认为 None(自动检测环境变量)
|
|
88
|
+
- None: 检查环境变量 L0N0LC_ENABLE_VECTORIZE
|
|
89
|
+
- True: 强制启用向量化
|
|
90
|
+
- False: 强制禁用向量化
|
|
91
|
+
向量化可以提升数组操作性能 2-8x,适用于计算密集型循环
|
|
92
|
+
SIMD指令集: 指定 SIMD 指令集,None 表示自动检测
|
|
93
|
+
可选值: SSE2, SSE4_2, AVX, AVX2, AVX512F, NEON
|
|
94
|
+
启用代码优化: 是否启用代码优化(默认为 True)
|
|
95
|
+
- 常量折叠:编译时计算常量表达式
|
|
96
|
+
- 死代码消除:移除永远不会执行的代码
|
|
97
|
+
- 循环优化:使用范围循环替代索引循环
|
|
98
|
+
可以提升运行时性能 20-50%,代码体积减少 10-30%
|
|
99
|
+
|
|
100
|
+
Examples:
|
|
101
|
+
>>> @jit()
|
|
102
|
+
>>> def func(x: int) -> int:
|
|
103
|
+
>>> return x * 2
|
|
104
|
+
|
|
105
|
+
>>> @jit(优化级别='O3')
|
|
106
|
+
>>> def performance_critical(x: int) -> int:
|
|
107
|
+
>>> return x ** 2
|
|
108
|
+
|
|
109
|
+
>>> @jit(优化级别='O0')
|
|
110
|
+
>>> def fast_compile(x: int) -> int:
|
|
111
|
+
>>> return x + 1
|
|
112
|
+
|
|
113
|
+
>>> @jit(启用并行编译=False) # 禁用并行编译
|
|
114
|
+
>>> def serial_compile(x: int) -> int:
|
|
115
|
+
>>> return x + 1
|
|
116
|
+
|
|
117
|
+
>>> @jit(最大进程数=2) # 限制最多使用 2 个进程
|
|
118
|
+
>>> def limited_parallel(x: int) -> int:
|
|
119
|
+
>>> return x * 2
|
|
120
|
+
|
|
121
|
+
>>> @jit(启用LTO=True) # 启用链接时优化
|
|
122
|
+
>>> def lto_func(x: int) -> int:
|
|
123
|
+
>>> return x * x
|
|
124
|
+
|
|
125
|
+
>>> @jit(启用向量化=True) # 启用 SIMD 向量化
|
|
126
|
+
>>> def vectorized_func(arr: List[int]) -> int:
|
|
127
|
+
>>> total = 0
|
|
128
|
+
>>> for x in arr:
|
|
129
|
+
>>> total += x
|
|
130
|
+
>>> return total
|
|
131
|
+
"""
|
|
132
|
+
def 装饰器(fn: Callable):
|
|
133
|
+
# 输入验证
|
|
134
|
+
if not callable(fn):
|
|
135
|
+
raise TypeError(
|
|
136
|
+
f"@jit 装饰器只能用于函数或类,得到: {type(fn).__name__}\n"
|
|
137
|
+
f"请确保 @jit 装饰器应用在函数定义上,例如:\n"
|
|
138
|
+
f" @jit()\n"
|
|
139
|
+
f" def my_function():\n"
|
|
140
|
+
f" pass"
|
|
141
|
+
)
|
|
142
|
+
|
|
143
|
+
# 检查是否为异步函数
|
|
144
|
+
if inspect.iscoroutinefunction(fn):
|
|
145
|
+
raise NotImplementedError("暂不支持异步函数 (async/await),请使用同步函数")
|
|
146
|
+
|
|
147
|
+
_编译器类 = 编译器类 or Cpp编译器
|
|
148
|
+
_转译器类 = 转译器类 or Py转Cpp转译器
|
|
149
|
+
|
|
150
|
+
# 确定 LTO 设置(优先使用参数,其次使用环境变量)
|
|
151
|
+
实际LTO设置: bool
|
|
152
|
+
if 启用LTO is None:
|
|
153
|
+
实际LTO设置 = _从环境变量获取LTO设置()
|
|
154
|
+
else:
|
|
155
|
+
实际LTO设置 = 启用LTO
|
|
156
|
+
|
|
157
|
+
# 确定向量化设置(优先使用参数,其次使用环境变量)
|
|
158
|
+
实际向量化设置: bool
|
|
159
|
+
if 启用向量化 is None:
|
|
160
|
+
实际向量化设置 = _从环境变量获取向量化设置()
|
|
161
|
+
else:
|
|
162
|
+
实际向量化设置 = 启用向量化
|
|
163
|
+
|
|
164
|
+
# 创建编译器实例,传入所有优化参数
|
|
165
|
+
编译器实例 = _编译器类(
|
|
166
|
+
优化级别=优化级别,
|
|
167
|
+
启用LTO=实际LTO设置,
|
|
168
|
+
启用向量化=实际向量化设置,
|
|
169
|
+
SIMD指令集=SIMD指令集
|
|
170
|
+
)
|
|
171
|
+
|
|
172
|
+
# 创建转译器实例,传递参数(包括并行编译参数和代码优化参数)
|
|
173
|
+
转译器实例 = _转译器类(fn, 编译器实例, 可执行文件名, 总是重编, 启用并行编译, 最大进程数, 启用代码优化)
|
|
174
|
+
|
|
175
|
+
# 可执行文件需要立即编译
|
|
176
|
+
if 可执行文件名 is not None:
|
|
177
|
+
库文件名 = 转译器实例.获取库文件名()
|
|
178
|
+
库路径 = f'{全局上下文.工作目录}/{库文件名}'
|
|
179
|
+
|
|
180
|
+
if 总是重编 or not os.path.exists(库路径):
|
|
181
|
+
日志.缓存信息("编译", fn.__name__ if hasattr(fn, '__name__') else "unknown")
|
|
182
|
+
转译器实例.编译()
|
|
183
|
+
|
|
184
|
+
# 将转译器对象添加到目标函数的全局变量中,以便其他JIT函数可以调用它
|
|
185
|
+
if hasattr(fn, '__name__'):
|
|
186
|
+
转译器实例.全局变量[fn.__name__] = 转译器实例
|
|
187
|
+
|
|
188
|
+
return 转译器实例
|
|
189
|
+
return 装饰器
|
|
190
|
+
|
|
191
|
+
|
|
192
|
+
jit = 即时编译
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
"""
|
|
2
|
+
变量管理器模块
|
|
3
|
+
|
|
4
|
+
负责管理变量作用域、变量查找和变量注册。
|
|
5
|
+
从 Py转Cpp转译器 中分离出来,实现单一职责原则。
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from typing import Optional, Any, Dict, List
|
|
9
|
+
from .cpp类型 import C变量
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class 变量管理器:
|
|
13
|
+
"""
|
|
14
|
+
变量管理器
|
|
15
|
+
|
|
16
|
+
负责:
|
|
17
|
+
- 管理变量作用域栈
|
|
18
|
+
- 查找变量
|
|
19
|
+
- 注册变量
|
|
20
|
+
"""
|
|
21
|
+
|
|
22
|
+
def __init__(self):
|
|
23
|
+
"""初始化变量管理器"""
|
|
24
|
+
# 变量作用域栈,每个元素是一个字典 {变量名: C变量}
|
|
25
|
+
self.作用域变量: List[Dict[str, C变量]] = [{}]
|
|
26
|
+
self.当前作用域层级 = 0
|
|
27
|
+
|
|
28
|
+
def 进入作用域(self):
|
|
29
|
+
"""
|
|
30
|
+
进入新的作用域(如 if/for 块内部)
|
|
31
|
+
|
|
32
|
+
创建一个新的空字典用于存储当前作用域的变量。
|
|
33
|
+
"""
|
|
34
|
+
self.作用域变量.append({})
|
|
35
|
+
self.当前作用域层级 += 1
|
|
36
|
+
|
|
37
|
+
def 退出作用域(self):
|
|
38
|
+
"""
|
|
39
|
+
退出当前作用域
|
|
40
|
+
|
|
41
|
+
弹出当前作用域的变量字典,返回到上一层作用域。
|
|
42
|
+
"""
|
|
43
|
+
if self.当前作用域层级 > 0:
|
|
44
|
+
self.作用域变量.pop()
|
|
45
|
+
self.当前作用域层级 -= 1
|
|
46
|
+
|
|
47
|
+
def 获取C变量(self, name: str) -> Optional[C变量]:
|
|
48
|
+
"""
|
|
49
|
+
从当前及上层作用域查找 C 变量
|
|
50
|
+
|
|
51
|
+
Args:
|
|
52
|
+
name: 变量名
|
|
53
|
+
|
|
54
|
+
Returns:
|
|
55
|
+
找到的 C 变量,如果未找到返回 None
|
|
56
|
+
"""
|
|
57
|
+
# 从当前作用域向上查找
|
|
58
|
+
for i in range(self.当前作用域层级, -1, -1):
|
|
59
|
+
v = self.作用域变量[i].get(name)
|
|
60
|
+
if v is not None:
|
|
61
|
+
return v
|
|
62
|
+
return None
|
|
63
|
+
|
|
64
|
+
def 添加C变量(self, variable: C变量):
|
|
65
|
+
"""
|
|
66
|
+
在当前作用域注册 C 变量
|
|
67
|
+
|
|
68
|
+
Args:
|
|
69
|
+
variable: 要注册的 C 变量
|
|
70
|
+
"""
|
|
71
|
+
self.作用域变量[self.当前作用域层级][variable.名称] = variable
|
|
72
|
+
|
|
73
|
+
def 变量是否存在(self, name: str) -> bool:
|
|
74
|
+
"""
|
|
75
|
+
检查变量是否存在于任何作用域
|
|
76
|
+
|
|
77
|
+
Args:
|
|
78
|
+
name: 变量名
|
|
79
|
+
|
|
80
|
+
Returns:
|
|
81
|
+
变量是否存在
|
|
82
|
+
"""
|
|
83
|
+
return self.获取C变量(name) is not None
|
|
84
|
+
|
|
85
|
+
def 获取当前作用域变量数(self) -> int:
|
|
86
|
+
"""
|
|
87
|
+
获取当前作用域的变量数量
|
|
88
|
+
|
|
89
|
+
Returns:
|
|
90
|
+
当前作用域的变量数量
|
|
91
|
+
"""
|
|
92
|
+
return len(self.作用域变量[self.当前作用域层级])
|
|
93
|
+
|
|
94
|
+
def 获取所有作用域变量数(self) -> int:
|
|
95
|
+
"""
|
|
96
|
+
获取所有作用域的变量总数
|
|
97
|
+
|
|
98
|
+
Returns:
|
|
99
|
+
所有作用域的变量总数
|
|
100
|
+
"""
|
|
101
|
+
total = 0
|
|
102
|
+
for scope in self.作用域变量:
|
|
103
|
+
total += len(scope)
|
|
104
|
+
return total
|
|
105
|
+
|
|
106
|
+
def 清空所有作用域(self):
|
|
107
|
+
"""清空所有作用域,重置为初始状态"""
|
|
108
|
+
self.作用域变量 = [{}]
|
|
109
|
+
self.当前作用域层级 = 0
|
|
110
|
+
|
|
111
|
+
def 获取状态摘要(self) -> Dict[str, Any]:
|
|
112
|
+
"""
|
|
113
|
+
获取变量管理器的状态摘要
|
|
114
|
+
|
|
115
|
+
Returns:
|
|
116
|
+
包含当前状态的字典
|
|
117
|
+
"""
|
|
118
|
+
return {
|
|
119
|
+
"当前作用域层级": self.当前作用域层级,
|
|
120
|
+
"作用域总数": len(self.作用域变量),
|
|
121
|
+
"当前作用域变量数": self.获取当前作用域变量数(),
|
|
122
|
+
"总变量数": self.获取所有作用域变量数(),
|
|
123
|
+
}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
from .工具 import 映射类型
|
|
2
|
+
import ctypes
|
|
3
|
+
from typing import SupportsIndex
|
|
4
|
+
from .cpp类型 import *
|
|
5
|
+
|
|
6
|
+
class _数值类型基类(SupportsIndex):
|
|
7
|
+
"""数值类型基类,提供通用的运算符支持"""
|
|
8
|
+
|
|
9
|
+
def __init__(self, value):
|
|
10
|
+
pass
|
|
11
|
+
|
|
12
|
+
def __index__(self) -> int:
|
|
13
|
+
return 0
|
|
14
|
+
|
|
15
|
+
# 基本运算
|
|
16
|
+
def __add__(self, other): return self
|
|
17
|
+
def __sub__(self, other): return self
|
|
18
|
+
def __mul__(self, other): return self
|
|
19
|
+
def __truediv__(self, other): return self
|
|
20
|
+
def __floordiv__(self, other): return self
|
|
21
|
+
def __mod__(self, other): return self
|
|
22
|
+
def __pow__(self, other): return self
|
|
23
|
+
def __neg__(self): return self
|
|
24
|
+
def __abs__(self): return self
|
|
25
|
+
|
|
26
|
+
# 比较运算
|
|
27
|
+
def __eq__(self, other): return self
|
|
28
|
+
def __ne__(self, other): return self
|
|
29
|
+
def __lt__(self, other): return self
|
|
30
|
+
def __le__(self, other): return self
|
|
31
|
+
def __gt__(self, other): return self
|
|
32
|
+
def __ge__(self, other): return self
|
|
33
|
+
|
|
34
|
+
# 反向运算符(支持左操作数为普通数值的情况)
|
|
35
|
+
def __radd__(self, other): return self
|
|
36
|
+
def __rsub__(self, other): return self
|
|
37
|
+
def __rmul__(self, other): return self
|
|
38
|
+
def __rtruediv__(self, other): return self
|
|
39
|
+
def __rfloordiv__(self, other): return self
|
|
40
|
+
def __rmod__(self, other): return self
|
|
41
|
+
def __rpow__(self, other): return self
|
|
42
|
+
|
|
43
|
+
# 类型转换
|
|
44
|
+
def __int__(self): return int(0)
|
|
45
|
+
def __float__(self): return float(0)
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
# 设置全局变量
|
|
49
|
+
int映射目标 = Cpp类型.INT64_T
|
|
50
|
+
float映射目标 = Cpp类型.FLOAT64
|
|
51
|
+
|
|
52
|
+
# 基础类型映射
|
|
53
|
+
映射类型(Cpp类型.StdString, ['<string>'])(str)
|
|
54
|
+
映射类型(Cpp类型.StdString, ['<string>'])(CString常量)
|
|
55
|
+
映射类型(Cpp类型.字符串, ctypes类型=ctypes.c_char_p)(bytes)
|
|
56
|
+
映射类型(Cpp类型.字符串, ctypes类型=ctypes.c_char_p)(CBytes常量)
|
|
57
|
+
映射类型(Cpp类型.INT64_T, ctypes类型=ctypes.c_int64)(int)
|
|
58
|
+
映射类型(Cpp类型.INT64_T, ctypes类型=ctypes.c_int64)(CInt常量)
|
|
59
|
+
映射类型(Cpp类型.FLOAT64, ctypes类型=ctypes.c_double)(float)
|
|
60
|
+
映射类型(Cpp类型.FLOAT64, ctypes类型=ctypes.c_double)(CFloat常量)
|
|
61
|
+
映射类型(Cpp类型.布尔, ctypes类型=ctypes.c_bool)(bool)
|
|
62
|
+
映射类型(Cpp类型.布尔, ctypes类型=ctypes.c_bool)(C布尔)
|
|
63
|
+
|
|
64
|
+
# 数值类型映射
|
|
65
|
+
@映射类型(Cpp类型.INT8_T, ctypes类型=ctypes.c_int8)
|
|
66
|
+
class int8(_数值类型基类):
|
|
67
|
+
pass
|
|
68
|
+
|
|
69
|
+
@映射类型(Cpp类型.INT16_T, ctypes类型=ctypes.c_int16)
|
|
70
|
+
class int16(_数值类型基类):
|
|
71
|
+
pass
|
|
72
|
+
|
|
73
|
+
@映射类型(Cpp类型.INT32_T, ctypes类型=ctypes.c_int32)
|
|
74
|
+
class int32(_数值类型基类):
|
|
75
|
+
pass
|
|
76
|
+
|
|
77
|
+
@映射类型(Cpp类型.INT64_T, ctypes类型=ctypes.c_int64)
|
|
78
|
+
class int64(_数值类型基类):
|
|
79
|
+
pass
|
|
80
|
+
|
|
81
|
+
@映射类型(Cpp类型.UINT8_T, ctypes类型=ctypes.c_uint8)
|
|
82
|
+
class uint8(_数值类型基类):
|
|
83
|
+
pass
|
|
84
|
+
|
|
85
|
+
@映射类型(Cpp类型.UINT16_T, ctypes类型=ctypes.c_uint16)
|
|
86
|
+
class uint16(_数值类型基类):
|
|
87
|
+
pass
|
|
88
|
+
|
|
89
|
+
@映射类型(Cpp类型.UINT32_T, ctypes类型=ctypes.c_uint32)
|
|
90
|
+
class uint32(_数值类型基类):
|
|
91
|
+
pass
|
|
92
|
+
|
|
93
|
+
@映射类型(Cpp类型.UINT64_T, ctypes类型=ctypes.c_uint64)
|
|
94
|
+
class uint64(_数值类型基类):
|
|
95
|
+
pass
|
|
96
|
+
|
|
97
|
+
@映射类型(Cpp类型.FLOAT32, ctypes类型=ctypes.c_float)
|
|
98
|
+
class float32(_数值类型基类):
|
|
99
|
+
pass
|
|
100
|
+
|
|
101
|
+
@映射类型(Cpp类型.FLOAT64, ctypes类型=ctypes.c_double)
|
|
102
|
+
class float64(_数值类型基类):
|
|
103
|
+
pass
|