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,363 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: l0n0lc
|
|
3
|
+
Version: 1.0.0
|
|
4
|
+
Summary: 一个将python函数翻译为c++函数并运行的jit编译器
|
|
5
|
+
Classifier: Programming Language :: Python :: 3
|
|
6
|
+
Requires-Python: >=3.10
|
|
7
|
+
Description-Content-Type: text/markdown
|
|
8
|
+
License-File: LICENSE
|
|
9
|
+
Dynamic: license-file
|
|
10
|
+
|
|
11
|
+
# l0n0lc
|
|
12
|
+
|
|
13
|
+
<div align="center">
|
|
14
|
+
|
|
15
|
+
**将 Python 函数翻译为 C++ 并运行的 JIT 编译器**
|
|
16
|
+
|
|
17
|
+
[](https://python.org)
|
|
18
|
+
[](LICENSE)
|
|
19
|
+
[](pyproject.toml)
|
|
20
|
+
[](pyproject.toml)
|
|
21
|
+
|
|
22
|
+
</div>
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
## 简介
|
|
27
|
+
|
|
28
|
+
l0n0lc 是一个零外部依赖的 Python JIT 编译器,通过简单的装饰器将 Python 函数转换为原生 C++ 代码并编译执行。它专注于计算密集型任务的性能优化,同时保持 API 的简洁性和易用性。
|
|
29
|
+
|
|
30
|
+
### 核心特点
|
|
31
|
+
|
|
32
|
+
- **零依赖** - 仅依赖 Python 3.10+ 标准库
|
|
33
|
+
- **简单易用** - 一个 `@jit` 装饰器即可启用
|
|
34
|
+
- **智能缓存** - 基于源码哈希,自动避免重复编译
|
|
35
|
+
- **跨平台** - 支持 Linux、macOS、Windows
|
|
36
|
+
- **类型推断** - 自动推断变量类型,生成高效 C++ 代码
|
|
37
|
+
|
|
38
|
+
---
|
|
39
|
+
|
|
40
|
+
## 安装
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
pip install l0n0lc
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
### 系统要求
|
|
47
|
+
|
|
48
|
+
- Python 3.10 或更高版本
|
|
49
|
+
- C++ 编译器(g++、clang++ 或 c++)
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
# Ubuntu/Debian
|
|
53
|
+
sudo apt install g++
|
|
54
|
+
|
|
55
|
+
# macOS
|
|
56
|
+
xcode-select --install
|
|
57
|
+
|
|
58
|
+
# Windows (MSYS2)
|
|
59
|
+
pacman -S mingw-w64-x86_64-gcc
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
---
|
|
63
|
+
|
|
64
|
+
## 快速开始
|
|
65
|
+
|
|
66
|
+
### 基础用法
|
|
67
|
+
|
|
68
|
+
```python
|
|
69
|
+
from l0n0lc import jit
|
|
70
|
+
|
|
71
|
+
@jit()
|
|
72
|
+
def fibonacci(n: int) -> int:
|
|
73
|
+
if n <= 1:
|
|
74
|
+
return n
|
|
75
|
+
a, b = 0, 1
|
|
76
|
+
for _ in range(2, n + 1):
|
|
77
|
+
a, b = b, a + b
|
|
78
|
+
return b
|
|
79
|
+
|
|
80
|
+
print(fibonacci(40)) # 输出: 102334155
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
### 容器类型支持
|
|
84
|
+
|
|
85
|
+
```python
|
|
86
|
+
from typing import List
|
|
87
|
+
|
|
88
|
+
@jit()
|
|
89
|
+
def sum_list(nums: List[int]) -> int:
|
|
90
|
+
total = 0
|
|
91
|
+
for num in nums:
|
|
92
|
+
total += num
|
|
93
|
+
return total
|
|
94
|
+
|
|
95
|
+
print(sum_list([1, 2, 3, 4, 5])) # 输出: 15
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
### 类支持
|
|
99
|
+
|
|
100
|
+
```python
|
|
101
|
+
# 定义类(类本身不需要 jit 装饰器)
|
|
102
|
+
class Point:
|
|
103
|
+
x: float
|
|
104
|
+
y: float
|
|
105
|
+
|
|
106
|
+
def __init__(self, x: float, y: float):
|
|
107
|
+
self.x = x
|
|
108
|
+
self.y = y
|
|
109
|
+
|
|
110
|
+
@jit()
|
|
111
|
+
def compute_distance() -> float:
|
|
112
|
+
# 在 JIT 函数内部创建和使用类实例
|
|
113
|
+
p1 = Point(0.0, 0.0)
|
|
114
|
+
p2 = Point(3.0, 4.0)
|
|
115
|
+
dx = p1.x - p2.x
|
|
116
|
+
dy = p1.y - p2.y
|
|
117
|
+
return (dx * dx + dy * dy) ** 0.5
|
|
118
|
+
|
|
119
|
+
print(compute_distance()) # 输出: 25.0 (平方距离)
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
---
|
|
123
|
+
|
|
124
|
+
## API 参考
|
|
125
|
+
|
|
126
|
+
### @jit 装饰器
|
|
127
|
+
|
|
128
|
+
```python
|
|
129
|
+
@jit(
|
|
130
|
+
总是重编=False, # 强制重新编译
|
|
131
|
+
可执行文件名=None, # 编译为独立可执行文件
|
|
132
|
+
优化级别="-O3", # C++ 优化级别
|
|
133
|
+
启用_lto=False, # 启用链接时优化
|
|
134
|
+
启用_simd=False, # 启用 SIMD 优化
|
|
135
|
+
)
|
|
136
|
+
def function_name() -> ReturnType:
|
|
137
|
+
...
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
### 中文别名
|
|
141
|
+
|
|
142
|
+
```python
|
|
143
|
+
from l0n0lc import jit, 即时编译
|
|
144
|
+
|
|
145
|
+
# 两者等价
|
|
146
|
+
@jit()
|
|
147
|
+
def func1(): pass
|
|
148
|
+
|
|
149
|
+
@即时编译()
|
|
150
|
+
def func2(): pass
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
---
|
|
154
|
+
|
|
155
|
+
## 高级功能
|
|
156
|
+
|
|
157
|
+
### AOT 编译
|
|
158
|
+
|
|
159
|
+
```bash
|
|
160
|
+
# 将 Python 文件编译为独立可执行文件
|
|
161
|
+
l0n0lc-aot-compile input.py -o output_executable
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
### 自定义 C++ 映射
|
|
165
|
+
|
|
166
|
+
```python
|
|
167
|
+
import l0n0lc as lc
|
|
168
|
+
|
|
169
|
+
# 映射到 C++ 标准库函数
|
|
170
|
+
@lc.映射函数到('sqrt({x})', ['<cmath>'])
|
|
171
|
+
def my_sqrt(x: float) -> float:
|
|
172
|
+
return 0 # 实际使用 C++ 实现
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
### 性能优化选项
|
|
176
|
+
|
|
177
|
+
```python
|
|
178
|
+
# 启用 LTO 优化
|
|
179
|
+
@jit(启用_lto=True)
|
|
180
|
+
def optimized_function():
|
|
181
|
+
pass
|
|
182
|
+
|
|
183
|
+
# 启用 SIMD
|
|
184
|
+
@jit(启用_simd=True)
|
|
185
|
+
def vectorized_compute(data: List[float]) -> List[float]:
|
|
186
|
+
pass
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
---
|
|
190
|
+
|
|
191
|
+
## 工作原理
|
|
192
|
+
|
|
193
|
+
```
|
|
194
|
+
Python 函数
|
|
195
|
+
↓
|
|
196
|
+
AST 解析与类型推断
|
|
197
|
+
↓
|
|
198
|
+
C++ 代码生成
|
|
199
|
+
↓
|
|
200
|
+
系统 C++ 编译器
|
|
201
|
+
↓
|
|
202
|
+
动态库 (.so/.dll/.dylib)
|
|
203
|
+
↓
|
|
204
|
+
ctypes 加载执行
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
---
|
|
208
|
+
|
|
209
|
+
## 性能对比
|
|
210
|
+
|
|
211
|
+
```python
|
|
212
|
+
import time
|
|
213
|
+
from l0n0lc import jit
|
|
214
|
+
|
|
215
|
+
def fib_py(n: int) -> int:
|
|
216
|
+
if n <= 1:
|
|
217
|
+
return n
|
|
218
|
+
return fib_py(n-1) + fib_py(n-2)
|
|
219
|
+
|
|
220
|
+
@jit()
|
|
221
|
+
def fib_jit(n: int) -> int:
|
|
222
|
+
if n <= 1:
|
|
223
|
+
return n
|
|
224
|
+
return fib_jit(n-1) + fib_jit(n-2)
|
|
225
|
+
|
|
226
|
+
# 测试
|
|
227
|
+
n = 35
|
|
228
|
+
|
|
229
|
+
t = time.time()
|
|
230
|
+
fib_py(n)
|
|
231
|
+
py_time = time.time() - t
|
|
232
|
+
|
|
233
|
+
t = time.time()
|
|
234
|
+
fib_jit(n)
|
|
235
|
+
jit_time = time.time() - t
|
|
236
|
+
|
|
237
|
+
print(f"Python: {py_time:.3f}s")
|
|
238
|
+
print(f"JIT: {jit_time:.3f}s")
|
|
239
|
+
print(f"加速比: {py_time/jit_time:.1f}x")
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
---
|
|
243
|
+
|
|
244
|
+
## 支持的语言特性
|
|
245
|
+
|
|
246
|
+
| 特性 | 支持情况 |
|
|
247
|
+
|------|----------|
|
|
248
|
+
| 基本类型 (int, float, bool, str) | ✅ |
|
|
249
|
+
| 容器类型 (List, Dict, Set) | ✅ |
|
|
250
|
+
| 类定义和实例方法 | ✅ |
|
|
251
|
+
| for/while 循环 | ✅ |
|
|
252
|
+
| if/else 条件 | ✅ |
|
|
253
|
+
| try/except 异常处理 | ✅ |
|
|
254
|
+
| 列表推导式 | ✅ |
|
|
255
|
+
| 可变参数 (*args, **kwargs) | ❌ |
|
|
256
|
+
| 生成器 | ❌ |
|
|
257
|
+
| 异步函数 | ❌ |
|
|
258
|
+
|
|
259
|
+
---
|
|
260
|
+
|
|
261
|
+
## 开发
|
|
262
|
+
|
|
263
|
+
### 从源码构建
|
|
264
|
+
|
|
265
|
+
```bash
|
|
266
|
+
git clone https://github.com/username/l0n0lc.git
|
|
267
|
+
cd l0n0lc
|
|
268
|
+
pip install -e .
|
|
269
|
+
```
|
|
270
|
+
|
|
271
|
+
### 运行测试
|
|
272
|
+
|
|
273
|
+
```bash
|
|
274
|
+
cd tests
|
|
275
|
+
for test in test_*.py; do
|
|
276
|
+
echo "Running $test"
|
|
277
|
+
python "$test"
|
|
278
|
+
done
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
### 构建发布包
|
|
282
|
+
|
|
283
|
+
```bash
|
|
284
|
+
# 使用 uv 构建
|
|
285
|
+
uv build
|
|
286
|
+
|
|
287
|
+
# 或使用构建脚本
|
|
288
|
+
./build.sh
|
|
289
|
+
```
|
|
290
|
+
|
|
291
|
+
---
|
|
292
|
+
|
|
293
|
+
## 缓存机制
|
|
294
|
+
|
|
295
|
+
编译产物存储在 `l0n0lcoutput/` 目录:
|
|
296
|
+
|
|
297
|
+
```
|
|
298
|
+
l0n0lcoutput/
|
|
299
|
+
├── {hash}_{filename}_{funcname}@_{hash}.cpp # C++ 源码
|
|
300
|
+
├── {hash}_{filename}_{funcname}@_{hash}.h # 头文件
|
|
301
|
+
└── {hash}_{filename}_{funcname}@_{hash}.so # 动态库
|
|
302
|
+
```
|
|
303
|
+
|
|
304
|
+
缓存基于函数源码的 BLAKE2s 哈希,代码修改后自动重新编译。
|
|
305
|
+
|
|
306
|
+
### 清理缓存
|
|
307
|
+
|
|
308
|
+
```bash
|
|
309
|
+
# 清理所有缓存
|
|
310
|
+
rm -rf l0n0lcoutput/
|
|
311
|
+
|
|
312
|
+
# 清理构建产物
|
|
313
|
+
./build.sh # 自动清理并重新构建
|
|
314
|
+
```
|
|
315
|
+
|
|
316
|
+
---
|
|
317
|
+
|
|
318
|
+
## 项目结构
|
|
319
|
+
|
|
320
|
+
```
|
|
321
|
+
l0n0lc/
|
|
322
|
+
├── 即时编译.py # @jit 装饰器
|
|
323
|
+
├── Py转Cpp转译器.py # AST 转 C++ 核心逻辑
|
|
324
|
+
├── cpp编译器.py # C++ 编译器管理
|
|
325
|
+
├── 运行时加载.py # ctypes 加载
|
|
326
|
+
├── cpp类型.py # C++ 类型定义
|
|
327
|
+
├── 类型转换.py # Python ↔ C++ 类型转换
|
|
328
|
+
├── std_vector.py # std::vector 支持
|
|
329
|
+
├── std_map.py # std::map 支持
|
|
330
|
+
├── std_set.py # std::set 支持
|
|
331
|
+
├── aot编译.py # AOT 编译
|
|
332
|
+
├── simd优化.py # SIMD 优化
|
|
333
|
+
├── 并行编译器.py # 并行编译
|
|
334
|
+
└── ...
|
|
335
|
+
```
|
|
336
|
+
|
|
337
|
+
---
|
|
338
|
+
|
|
339
|
+
## 限制与注意事项
|
|
340
|
+
|
|
341
|
+
1. **类型注解** - 建议提供完整的类型注解以提高代码质量
|
|
342
|
+
2. **首次编译** - 首次调用会有编译延迟,后续调用使用缓存
|
|
343
|
+
3. **适用场景** - 适合计算密集型任务,简单函数可能因编译开销反而变慢
|
|
344
|
+
4. **函数名编码** - 包含非 ASCII 字符的函数名会被编码
|
|
345
|
+
|
|
346
|
+
---
|
|
347
|
+
|
|
348
|
+
## 许可证
|
|
349
|
+
|
|
350
|
+
[MIT License](LICENSE)
|
|
351
|
+
|
|
352
|
+
---
|
|
353
|
+
|
|
354
|
+
## 作者
|
|
355
|
+
|
|
356
|
+
倾城铸剑师
|
|
357
|
+
|
|
358
|
+
---
|
|
359
|
+
|
|
360
|
+
## 文档
|
|
361
|
+
|
|
362
|
+
- [CLAUDE.md](CLAUDE.md) - 开发者文档
|
|
363
|
+
- [tests/](tests/) - 测试用例和示例
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
l0n0lc/Py转Cpp转译器.py,sha256=l60o45f-CM3oloTTLawAHh_It0BjmgKVwBcI5C6Qoek,25781
|
|
2
|
+
l0n0lc/__init__.py,sha256=ASRJnSQn5a3oFEksFBzdAh2u7s0LTjz5qDBGGHU7lvQ,1822
|
|
3
|
+
l0n0lc/aot编译.py,sha256=tU801fcisn5F0v_FshjjFV1jcBJK8vsZkMo3NFvr5Hg,22003
|
|
4
|
+
l0n0lc/ast访问者.py,sha256=QamOTOI6morgU6WPDQWSpFQCPbM8B_s4zHIJVuAmvoo,25661
|
|
5
|
+
l0n0lc/cpp类型.py,sha256=zL0imonIuP53Bt0dcWy8H-MaTEJ5B0OLlVu1nnFusO0,9614
|
|
6
|
+
l0n0lc/cpp编译器.py,sha256=BaqEqWNMQ9zjZ9Y7Kccx8HhZMubuTPiDj83vBEKLXsg,11180
|
|
7
|
+
l0n0lc/simd优化.py,sha256=PAu88gHVPYiyFHD9nL4mGT4kBKs7aOMFrnYRWn8MeZM,8576
|
|
8
|
+
l0n0lc/std_map.py,sha256=4KDcIczA03M758t1nrQzHLa-Y0aDYaFaGWNX4odUfVc,5235
|
|
9
|
+
l0n0lc/std_set.py,sha256=12kiT3cYSlTEXNn1M5Cv2QYOPN_XTOO2jkCfkFI-ATM,5594
|
|
10
|
+
l0n0lc/std_vector.py,sha256=MyjmQtWm1I0hUYgSGH5olmOUrlC-jdGIvjNi-rUxG_A,3449
|
|
11
|
+
l0n0lc/代码优化.py,sha256=ij2xKXaKnTraqCxyRg6z4Hp7cMvd1UWMxOEduXSeADA,10311
|
|
12
|
+
l0n0lc/代码生成.py,sha256=6CzOo_qBRPPnCH_865TEfQ-uKemJTAzd-624bUusa3g,23861
|
|
13
|
+
l0n0lc/依赖注入.py,sha256=NzuHJm-H3gEqo2wvj9iflB5NjtyYnsbF9_i-Fexgsuc,4075
|
|
14
|
+
l0n0lc/即时编译.py,sha256=6PBDtQbyC-8-ZKmWdw5UjyKmBvtkDrFRawbbteGp3RY,7420
|
|
15
|
+
l0n0lc/变量管理器.py,sha256=Gj3fCrBussjVIamAEoRwup5pzw73RVD5Cm6vfzHj5Ko,3402
|
|
16
|
+
l0n0lc/基础映射.py,sha256=2xiPNOpZrTg1H9S8n1fMnBBol4gHcVm43xXvlF3VXzo,3347
|
|
17
|
+
l0n0lc/基础混入.py,sha256=O49XZcyIQK7XgA1lrpC7MkRsmFyE8qnhKO9LWTy67VQ,4345
|
|
18
|
+
l0n0lc/容器构建器.py,sha256=3_JeYVCcxns6mv7FErVd-p8GszGDPmjKdgBsNF24S9M,7525
|
|
19
|
+
l0n0lc/工具.py,sha256=O2FKVsiP6f0aP2utyto9n-6omnP_XN4omnY_3__3Hh0,9478
|
|
20
|
+
l0n0lc/并行编译器.py,sha256=8B4jjor7idNdm9HUITAD3BWBWzb-R251VnVfnUfwApM,12982
|
|
21
|
+
l0n0lc/异常.py,sha256=eZZFdeY7nNiawmlF8aQ_FEEHQBB6bedRiE1Ah6nZ0hg,15766
|
|
22
|
+
l0n0lc/数组对象池.py,sha256=rt1SU8G2izXDRJfdmF5IeaDCLsbK_v0O-B_RbIcReGM,7119
|
|
23
|
+
l0n0lc/文件管理器.py,sha256=xBKI71X0ZGQVdDUqN3s_R-JNUqX3yQaiS092nInP8GA,8531
|
|
24
|
+
l0n0lc/日志工具.py,sha256=yEXoyxljokVSzag7A7jYdiHaFDrOpjV0worQHMwktmU,5081
|
|
25
|
+
l0n0lc/类型推断工具.py,sha256=rWpY60dp6dELDDNMlMC6gjrtdxXMQeFqvthuYdeTxrM,12597
|
|
26
|
+
l0n0lc/类型转换.py,sha256=LW8Adh689HpKpC53P_4M-9Ip41ujHGBSVeZY5hC83ro,7892
|
|
27
|
+
l0n0lc/类支持.py,sha256=sranCRrZDogZpMKLp5So-hjy1KGG5CddziBw9A1O9gA,15435
|
|
28
|
+
l0n0lc/编译上下文.py,sha256=aadn7UHesoy9TUHXGrKf5rJAUAEfGG_kUyMRrwfthkc,3585
|
|
29
|
+
l0n0lc/编译管理器.py,sha256=MoV_ABlW2tJ9MLyqbODaIss5jF2ySfWo0axF3hLoHBo,5493
|
|
30
|
+
l0n0lc/表达式处理.py,sha256=y7zqNSyYvTsIUgeOoGILKISLqsV6qz7wkN5rre7LG6A,20163
|
|
31
|
+
l0n0lc/转译器工具.py,sha256=okgsrhMEq3ucYuWVStv1kBVgH9QrwxQsYpwYBHt6XXk,1429
|
|
32
|
+
l0n0lc/运行时加载.py,sha256=t-P9jZj8ShRImOiGE-v64rfw6Mte2m4zqyx2VUzBwkM,8684
|
|
33
|
+
l0n0lc/通用工具.py,sha256=3FDv6aLVqxVmzZNSUACpubM9A7sjigfulqJJ1-YEaaA,4148
|
|
34
|
+
l0n0lc-1.0.0.dist-info/licenses/LICENSE,sha256=1L-MAjulZ3kpbYwsJtlXpDVITRxykna2Ecg_521YfkA,1093
|
|
35
|
+
l0n0lc-1.0.0.dist-info/METADATA,sha256=E50BmlQ71-CUV8HafPfv_MowYUzcKexyhqlAmHoeiWM,6846
|
|
36
|
+
l0n0lc-1.0.0.dist-info/WHEEL,sha256=qELbo2s1Yzl39ZmrAibXA2jjPLUYfnVhUNTlyF1rq0Y,92
|
|
37
|
+
l0n0lc-1.0.0.dist-info/entry_points.txt,sha256=u1ynz2q2r-oPTc8k0uthgRqbxuyQ_DN5pkEigeKJvHw,61
|
|
38
|
+
l0n0lc-1.0.0.dist-info/top_level.txt,sha256=Q21D_eEY_-xgRUPwATGp9YDKSBO4w_7MI2MYxQI1aT4,7
|
|
39
|
+
l0n0lc-1.0.0.dist-info/RECORD,,
|
|
File without changes
|
l0n0lc/StdList.py
DELETED
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
from .c基础处理 import c变量, cpp类型, list初始化列表
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
class StdList(c变量):
|
|
5
|
-
def __init__(
|
|
6
|
-
self,
|
|
7
|
-
初始化列表: list初始化列表,
|
|
8
|
-
名字: str, 是参数: bool) -> None:
|
|
9
|
-
self.初始化列表 = 初始化列表
|
|
10
|
-
if 初始化列表.类型 == cpp类型.ANY:
|
|
11
|
-
super().__init__(f'std::vector<{初始化列表.类型}>', 名字, 是参数)
|
|
12
|
-
else:
|
|
13
|
-
super().__init__(f'{初始化列表.类型}', 名字, 是参数)
|
|
14
|
-
|
|
15
|
-
def __getitem__(self, key):
|
|
16
|
-
return f'{self}[{key}]'
|
|
17
|
-
|
|
18
|
-
def __setitem__(self, key, value):
|
|
19
|
-
return f'{self}[{key}] = {value};'
|
|
20
|
-
|
|
21
|
-
def 初始化(self, 初始值):
|
|
22
|
-
if self.初始化列表.类型 == cpp类型.ANY:
|
|
23
|
-
return super().初始化(初始值)
|
|
24
|
-
return f'{self.类型} {self.名字}[] = {初始值};'
|
l0n0lc/StdMap.py
DELETED
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
from .c基础处理 import py类型转c类型, dict初始化列表, c变量, cpp类型
|
|
2
|
-
from typing import Tuple, Union, List
|
|
3
|
-
from .通用 import toCString
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
class StdUnorderedMap(c变量):
|
|
7
|
-
def __init__(
|
|
8
|
-
self,
|
|
9
|
-
初始化列表: dict初始化列表,
|
|
10
|
-
名字: str, 是参数: bool) -> None:
|
|
11
|
-
self.初始化列表 = 初始化列表
|
|
12
|
-
super().__init__(
|
|
13
|
-
f'std::unordered_map<{初始化列表.key类型}, {初始化列表.value类型}>', 名字, 是参数)
|
|
14
|
-
|
|
15
|
-
def __getitem__(self, key):
|
|
16
|
-
return f'{self}[{toCString(key)}]'
|
|
17
|
-
|
|
18
|
-
def __setitem__(self, key, value):
|
|
19
|
-
左 = f'{self}[{toCString(key)}]'
|
|
20
|
-
右 = toCString(value)
|
|
21
|
-
return f'{左} = {右};'
|
|
@@ -1,207 +0,0 @@
|
|
|
1
|
-
from typing import Union, List, get_origin, get_args
|
|
2
|
-
from .通用 import 生成变量Id, toCString
|
|
3
|
-
import ctypes
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
def cpp获取变量类型(v):
|
|
7
|
-
return f'decltype({v})'
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
class cpp类型:
|
|
11
|
-
INT8_T = 'int8_t'
|
|
12
|
-
INT16_T = 'int16_t'
|
|
13
|
-
INT32_T = 'int32_t'
|
|
14
|
-
INT64_T = 'int64_t'
|
|
15
|
-
UINT8_T = 'uint8_t'
|
|
16
|
-
UINT16_T = 'uint16_t'
|
|
17
|
-
UINT32_T = 'uint32_t'
|
|
18
|
-
UINT64_T = 'uint64_t'
|
|
19
|
-
HALF = 'half'
|
|
20
|
-
FLOAT = 'float'
|
|
21
|
-
STRING = 'std::string'
|
|
22
|
-
BOOL = 'bool'
|
|
23
|
-
ANY = 'std::any'
|
|
24
|
-
AUTO = 'auto'
|
|
25
|
-
VOID_P = 'void*'
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
class 指针:
|
|
29
|
-
def __init__(self, 类型) -> None:
|
|
30
|
-
self.基础类型 = 类型
|
|
31
|
-
|
|
32
|
-
def __str__(self) -> str:
|
|
33
|
-
return f'{self.基础类型}*'
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
def 执行额外函数(函数列表: List, *args):
|
|
37
|
-
for fn in 函数列表:
|
|
38
|
-
ret = fn(*args)
|
|
39
|
-
if ret is not None:
|
|
40
|
-
return ret
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
额外py转ctypes函数 = []
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
def py类型转ctypes类型(类型):
|
|
47
|
-
ret = 执行额外函数(额外py转ctypes函数, 类型)
|
|
48
|
-
if ret is not None:
|
|
49
|
-
return ret
|
|
50
|
-
|
|
51
|
-
# 基础类型
|
|
52
|
-
if 类型 is int:
|
|
53
|
-
return ctypes.c_int64
|
|
54
|
-
if 类型 is float:
|
|
55
|
-
return ctypes.c_float
|
|
56
|
-
if 类型 is str:
|
|
57
|
-
return ctypes.c_char_p
|
|
58
|
-
if 类型 is bool:
|
|
59
|
-
return ctypes.c_bool
|
|
60
|
-
if 类型 is 指针:
|
|
61
|
-
return ctypes.c_void_p
|
|
62
|
-
|
|
63
|
-
额外py转c函数 = []
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
def py类型转c类型(类型):
|
|
67
|
-
ret = 执行额外函数(额外py转c函数, 类型)
|
|
68
|
-
if ret is not None:
|
|
69
|
-
return ret
|
|
70
|
-
|
|
71
|
-
# 基础类型
|
|
72
|
-
if 类型 is int:
|
|
73
|
-
return cpp类型.INT64_T
|
|
74
|
-
if 类型 is float:
|
|
75
|
-
return cpp类型.FLOAT
|
|
76
|
-
if 类型 is str:
|
|
77
|
-
return cpp类型.STRING
|
|
78
|
-
if 类型 is bool:
|
|
79
|
-
return cpp类型.BOOL
|
|
80
|
-
if 类型 is 指针:
|
|
81
|
-
return cpp类型.VOID_P
|
|
82
|
-
|
|
83
|
-
origin = get_origin(类型)
|
|
84
|
-
args = get_args(类型)
|
|
85
|
-
|
|
86
|
-
if origin is Union:
|
|
87
|
-
return cpp类型.ANY
|
|
88
|
-
|
|
89
|
-
# List[...] → 指针(...)
|
|
90
|
-
if origin is list:
|
|
91
|
-
if args:
|
|
92
|
-
elem_type = args[0]
|
|
93
|
-
return 指针(py类型转c类型(elem_type))
|
|
94
|
-
|
|
95
|
-
# Dict[K, V] → std::unordered_map<K, V>
|
|
96
|
-
if origin is dict:
|
|
97
|
-
if len(args) == 2:
|
|
98
|
-
key_type = py类型转c类型(args[0])
|
|
99
|
-
val_type = py类型转c类型(args[1])
|
|
100
|
-
return f"std::unordered_map<{key_type}, {val_type}>&"
|
|
101
|
-
|
|
102
|
-
# 直接传字符串类型名
|
|
103
|
-
if isinstance(类型, str):
|
|
104
|
-
return 类型
|
|
105
|
-
|
|
106
|
-
return cpp类型.ANY
|
|
107
|
-
|
|
108
|
-
def cpp类型检查(类型, 支持提示: str):
|
|
109
|
-
if 类型 not in [int, float, str, bool]:
|
|
110
|
-
raise Exception(f'{支持提示} 仅支持 [int, float, str, bool]')
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
class list初始化列表:
|
|
114
|
-
def __init__(
|
|
115
|
-
self,
|
|
116
|
-
代码: str,
|
|
117
|
-
类型列表: Union[List[Union[int, float, bool, str]],
|
|
118
|
-
int, float, bool, str],
|
|
119
|
-
长度: int) -> None:
|
|
120
|
-
self.代码 = 代码
|
|
121
|
-
self.类型列表 = 类型列表
|
|
122
|
-
self.类型 = py类型转c类型(类型列表)
|
|
123
|
-
self.长度 = 长度
|
|
124
|
-
|
|
125
|
-
def __str__(self) -> str:
|
|
126
|
-
return self.代码
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
def 从list构建初始化列表(value: List):
|
|
130
|
-
数据类型列表 = []
|
|
131
|
-
初始化列表 = []
|
|
132
|
-
for v in value:
|
|
133
|
-
dtype = type(v)
|
|
134
|
-
cpp类型检查(dtype, 'List')
|
|
135
|
-
数据类型列表.append(dtype)
|
|
136
|
-
初始化列表.append(toCString(v))
|
|
137
|
-
# 构建初始化列表
|
|
138
|
-
初始化列表 = '{' + ','.join(初始化列表) + '}'
|
|
139
|
-
|
|
140
|
-
# 构建类型列表
|
|
141
|
-
if all(类型 == 数据类型列表[0] for 类型 in 数据类型列表):
|
|
142
|
-
数据类型列表 = 数据类型列表[0]
|
|
143
|
-
|
|
144
|
-
return list初始化列表(初始化列表, 数据类型列表, len(value))
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
class dict初始化列表:
|
|
148
|
-
def __init__(
|
|
149
|
-
self,
|
|
150
|
-
代码: str,
|
|
151
|
-
key类型列表: Union[List[Union[int, float, bool, str]],
|
|
152
|
-
int, float, bool, str],
|
|
153
|
-
value类型列表: Union[List[Union[int, float, bool, str]],
|
|
154
|
-
int, float, bool, str]) -> None:
|
|
155
|
-
self.代码 = 代码
|
|
156
|
-
self.key类型列表 = key类型列表
|
|
157
|
-
self.value类型列表 = value类型列表
|
|
158
|
-
self.key类型 = py类型转c类型(key类型列表)
|
|
159
|
-
self.value类型 = py类型转c类型(value类型列表)
|
|
160
|
-
|
|
161
|
-
def __str__(self) -> str:
|
|
162
|
-
return self.代码
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
def 从dict构建初始化列表(value: dict):
|
|
166
|
-
code = []
|
|
167
|
-
key类型列表 = []
|
|
168
|
-
value类型列表 = []
|
|
169
|
-
for k, v in value.items():
|
|
170
|
-
key类型 = type(k)
|
|
171
|
-
cpp类型检查(key类型, 'Map')
|
|
172
|
-
value类型 = type(v)
|
|
173
|
-
cpp类型检查(value类型, 'Map')
|
|
174
|
-
key类型列表.append(key类型)
|
|
175
|
-
value类型列表.append(value类型)
|
|
176
|
-
code.append(f'{{ {toCString(k)}, {v} }}')
|
|
177
|
-
|
|
178
|
-
# 构建类型列表
|
|
179
|
-
if all(类型 == key类型列表[0] for 类型 in key类型列表):
|
|
180
|
-
key类型列表 = key类型列表[0]
|
|
181
|
-
|
|
182
|
-
if all(类型 == value类型列表[0] for 类型 in value类型列表):
|
|
183
|
-
value类型列表 = value类型列表[0]
|
|
184
|
-
|
|
185
|
-
# 构建初始化列表
|
|
186
|
-
初始化列表 = '{' + ','.join(code) + '}'
|
|
187
|
-
|
|
188
|
-
return dict初始化列表(初始化列表, key类型列表, value类型列表)
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
class c变量:
|
|
192
|
-
def __init__(self, 类型: str, 名字: str, 是参数: bool, 默认值=None) -> None:
|
|
193
|
-
self.类型 = 类型
|
|
194
|
-
self.名字 = 名字
|
|
195
|
-
self.c名字 = 生成变量Id(名字)
|
|
196
|
-
self.是参数 = 是参数
|
|
197
|
-
self.默认值 = 默认值
|
|
198
|
-
|
|
199
|
-
def __str__(self):
|
|
200
|
-
return self.c名字
|
|
201
|
-
|
|
202
|
-
@property
|
|
203
|
-
def c类型(self):
|
|
204
|
-
return cpp获取变量类型(self)
|
|
205
|
-
|
|
206
|
-
def 初始化(self, 初始值):
|
|
207
|
-
return f'{self.类型} {self.c名字} = {初始值};'
|