l0n0lc 0.4.0__py3-none-any.whl → 0.5.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/jit.py ADDED
@@ -0,0 +1,570 @@
1
+ import os
2
+ import ast
3
+ import hashlib
4
+ import inspect
5
+ from typing import Callable, Any, List, Dict
6
+ from .c基础处理 import *
7
+ from .StdList import StdList
8
+ from .StdMap import StdUnorderedMap
9
+ from .通用 import 通用信息, 有非英文变量字符, 尝试创建文件夹
10
+ from .编译 import cpp编译器
11
+
12
+
13
+ class 代码异常抛出器:
14
+ def __init__(self, 代码: str) -> None:
15
+ self.代码行 = 代码.split('\n')
16
+
17
+ def __call__(self, 错误信息: str, node: ast.stmt | ast.expr | ast.arg) -> Any:
18
+ raise Exception(
19
+ f'{错误信息} {self.代码行[node.lineno][node.col_offset:node.end_col_offset]}')
20
+
21
+
22
+ class 花括号:
23
+ def __init__(self, 编译器) -> None:
24
+ self.编译器: py2cpp编译器 = 编译器
25
+
26
+ def __enter__(self, *args, **kwargs):
27
+ self.编译器.添加c代码('{')
28
+ self.编译器.进入新作用域()
29
+
30
+ def __exit__(self, *args, **kwargs):
31
+ self.编译器.退出作用域()
32
+ self.编译器.添加c代码('}\n')
33
+
34
+
35
+ class c代码:
36
+ def __init__(self, 代码: str, 层级: int) -> None:
37
+ self.代码 = 代码
38
+ self.层级 = 层级
39
+
40
+ def __str__(self) -> str:
41
+ return ' ' * self.层级 + self.代码
42
+
43
+
44
+ class c获取索引项目:
45
+ def __init__(self, 变量, 索引) -> None:
46
+ self.变量 = 变量
47
+ self.索引 = 索引
48
+
49
+ def __str__(self) -> str:
50
+ return f'{self.变量}[{toCString(self.索引)}]'
51
+
52
+
53
+ class py2cpp编译器(ast.NodeVisitor):
54
+ def __init__(self, 被编译的函数: Callable) -> None:
55
+ self.被编译的函数 = 被编译的函数
56
+ self.源代码 = inspect.getsource(被编译的函数)
57
+ self.代码哈希值 = hashlib.blake2s(
58
+ self.源代码.encode(), digest_size=8).hexdigest()
59
+ self.代码异常抛出器 = 代码异常抛出器(self.源代码)
60
+ self.全局变量 = 被编译的函数.__globals__
61
+ self.局部变量 = {}
62
+ self.参数变量 = {}
63
+ self.ctypes类型 = []
64
+ self.ctypes返回类型 = ctypes.c_voidp
65
+ self.参数不同c类型前置处理函数 = {}
66
+ self.ascendc变量对应表: List[Dict[str, Any]] = [{}]
67
+ self.当前上下文层级 = 0
68
+ self.依赖函数 = []
69
+ self.函数映射表 = {}
70
+ self.代码序列 = []
71
+ self.花括号 = 花括号(self)
72
+ self.正在调用直接函数 = False
73
+ self.正在构建参数 = False
74
+ self.include目录 = set(['<cstdint>', '<string>'])
75
+ self.链接库列表 = set()
76
+ self.库目录 = set()
77
+
78
+ # 保存函数名
79
+ self.函数名 = 被编译的函数.__name__
80
+ if 有非英文变量字符(self.函数名):
81
+ self.c函数名 = f'function_{self.函数名.encode().hex()}'
82
+ else:
83
+ self.c函数名 = self.函数名
84
+ self.文件前缀 = f'{self.函数名}_@'
85
+
86
+ def 编译(self):
87
+ 语法树 = ast.parse(self.源代码)
88
+ self.visit(语法树)
89
+
90
+ def 添加c代码(self, 代码: str):
91
+ self.代码序列.append(c代码(代码, self.当前上下文层级))
92
+
93
+ def 抛出代码异常(self, 错误提示: str, node: ast.stmt | ast.expr | ast.arg):
94
+ self.代码异常抛出器(错误提示, node)
95
+
96
+ def 进入新作用域(self):
97
+ self.ascendc变量对应表.append({})
98
+ self.当前上下文层级 += 1
99
+
100
+ def 退出作用域(self):
101
+ self.ascendc变量对应表.pop()
102
+ self.当前上下文层级 -= 1
103
+
104
+ def 获取c变量(self, 变量名: str):
105
+ for i in range(self.当前上下文层级, -1, -1):
106
+ v = self.ascendc变量对应表[i].get(变量名)
107
+ if v is not None:
108
+ return v
109
+
110
+ def 添加c变量(self, 变量: c变量):
111
+ self.ascendc变量对应表[self.当前上下文层级][变量.名字] = 变量
112
+
113
+ def 根据值添加c参数变量(self, 值, 名字: str):
114
+ 变量 = self.获取c变量(名字)
115
+ if 变量 is not None:
116
+ return 变量
117
+ if isinstance(值, int):
118
+ 变量类型 = 'int64_t'
119
+ elif isinstance(值, float):
120
+ 变量类型 = 'float'
121
+ 变量 = c变量(变量类型, 名字, True)
122
+ self.添加c变量(变量)
123
+ return 变量
124
+
125
+ def 获取值(self, value):
126
+ if isinstance(value, ast.Constant):
127
+ return value.value
128
+
129
+ if isinstance(value, ast.Name):
130
+ v = 通用信息.python内置映射.get(value.id)
131
+ if v is not None:
132
+ return v
133
+ v = self.局部变量.get(value.id)
134
+ if v is not None:
135
+ return v
136
+ v = self.获取c变量(value.id)
137
+ if v is not None:
138
+ return v
139
+ v = self.参数变量.get(value.id)
140
+ if v is not None:
141
+ return v
142
+ return self.全局变量.get(value.id)
143
+
144
+ if isinstance(value, ast.Attribute):
145
+ 对象 = self.获取值(value.value)
146
+ if isinstance(对象, c变量):
147
+ return f'{对象}.{value.attr}'
148
+ if 对象 is None:
149
+ self.抛出代码异常(f'没找到{value.value}', value)
150
+ return getattr(对象, value.attr)
151
+
152
+ if isinstance(value, ast.UnaryOp):
153
+ operand = self.获取值(value.operand)
154
+ if isinstance(value.op, ast.UAdd):
155
+ return f'+{operand}'
156
+ if isinstance(value.op, ast.USub):
157
+ return f'-{operand}'
158
+ if isinstance(value.op, ast.Not):
159
+ return f'!{operand}'
160
+ if isinstance(value.op, ast.Invert):
161
+ return f'~{operand}'
162
+
163
+ if isinstance(value, ast.BoolOp):
164
+ if isinstance(value.op, ast.And):
165
+ return '&&'.join([self.获取值(v) for v in value.values])
166
+ if isinstance(value.op, ast.Or):
167
+ return '||'.join([self.获取值(v) for v in value.values])
168
+
169
+ if isinstance(value, ast.IfExp):
170
+ test = self.获取值(value.test)
171
+ body = self.获取值(value.body)
172
+ orelse = self.获取值(value.orelse)
173
+ return f'({test} ? ({body}) : ({orelse}))'
174
+
175
+ if isinstance(value, ast.Compare):
176
+ return self.计算Compare(value)
177
+
178
+ if isinstance(value, ast.BinOp):
179
+ return self.计算二元运算(value)
180
+
181
+ if isinstance(value, ast.List):
182
+ l = [self.获取值(e) for e in value.elts]
183
+ return 从list构建初始化列表(l)
184
+ if isinstance(value, ast.Tuple):
185
+ l = [self.获取值(e) for e in value.elts]
186
+ if not self.正在构建参数:
187
+ return 从list构建初始化列表(l)
188
+ return tuple(l)
189
+ if isinstance(value, ast.Dict):
190
+ d = {self.获取值(k): self.获取值(v)
191
+ for k, v in zip(value.keys, value.values)}
192
+ return 从dict构建初始化列表(d)
193
+
194
+ if isinstance(value, ast.Call):
195
+ return self.调用Call(value)
196
+
197
+ if isinstance(value, ast.Subscript):
198
+ return self.获取Subscript(value)
199
+
200
+ def 计算Compare(self, node: ast.Compare) -> Any:
201
+ left = self.获取值(node.left)
202
+ ret = '('
203
+ 输出left = True
204
+ for op, comp in zip(node.ops, node.comparators):
205
+ left = left if 输出left else ''
206
+ right = self.获取值(comp)
207
+ if isinstance(op, ast.Eq):
208
+ ret += f'{left} == {right}'
209
+ if isinstance(op, ast.NotEq):
210
+ ret += f'{left} != {right}'
211
+ if isinstance(op, ast.Lt):
212
+ ret += f'{left} < {right})'
213
+ if isinstance(op, ast.LtE):
214
+ ret += f'{left} <= {right}'
215
+ if isinstance(op, ast.Gt):
216
+ ret += f'{left} > {right}'
217
+ if isinstance(op, ast.GtE):
218
+ ret += f'{left} >= {right}'
219
+ left = right
220
+ 输出left = False
221
+ return ret + ')'
222
+
223
+ def 计算二元运算(self, node: ast.BinOp | ast.AugAssign):
224
+ if isinstance(node, ast.BinOp):
225
+ left = self.获取值(node.left)
226
+ right = self.获取值(node.right)
227
+ elif isinstance(node, ast.AugAssign):
228
+ left = self.获取值(node.target)
229
+ right = self.获取值(node.value)
230
+ op = node.op
231
+ if isinstance(op, ast.Add):
232
+ return f'{left} + {right}'
233
+ if isinstance(op, ast.Sub):
234
+ return f'{left} - {right}'
235
+ if isinstance(op, ast.Mult):
236
+ return f'{left} * {right}'
237
+ if isinstance(op, (ast.Div, ast.FloorDiv)):
238
+ return f'{left} / {right}'
239
+ if isinstance(op, ast.Mod):
240
+ return f'{left} % {right}'
241
+ if isinstance(op, ast.Pow):
242
+ return f'{left} ** {right}'
243
+ if isinstance(op, ast.BitAnd):
244
+ return f'{left} & {right}'
245
+ if isinstance(op, ast.BitOr):
246
+ return f'{left} | {right}'
247
+ if isinstance(op, ast.BitXor):
248
+ return f'{left} ^ {right}'
249
+ if isinstance(op, ast.LShift):
250
+ return f'{left} << {right}'
251
+ if isinstance(op, ast.RShift):
252
+ return f'{left} >> {right}'
253
+
254
+ self.抛出代码异常(f"暂不支持的运算符: {type(op).__name__}", node)
255
+
256
+ def 调用Call(self, node: ast.Call):
257
+ # 构建函数
258
+ fn = self.获取值(node.func)
259
+ if fn in 通用信息.直接调用函数:
260
+ 参数列表 = [self.获取值(arg) for arg in node.args]
261
+ self.正在调用直接函数 = True
262
+ return fn(*参数列表)
263
+
264
+ 映射函数 = 通用信息.函数映射表.get(fn)
265
+ if 映射函数 is not None:
266
+ 参数列表 = [self.获取值(arg) for arg in node.args]
267
+ for include目录 in 映射函数.include目录:
268
+ self.include目录.add(include目录)
269
+ for 链接库 in 映射函数.库列表:
270
+ self.链接库列表.add(链接库)
271
+ for 库目录 in 映射函数.库目录:
272
+ self.库目录.add(库目录)
273
+
274
+ return 映射函数.目标函数(*参数列表)
275
+
276
+ if not isinstance(fn, Callable):
277
+ self.抛出代码异常(f'{ast.dump(node.func)} 没找到', node)
278
+
279
+ 依赖函数编译器 = self.__class__(fn)
280
+ 依赖函数编译器.编译()
281
+
282
+ # 添加依赖
283
+ self.依赖函数.append(依赖函数编译器)
284
+
285
+ # 构建调用代码
286
+ if len(node.keywords) > 0:
287
+ self.代码异常抛出器('暂不支持 keywords 函数调用', node)
288
+
289
+ 参数列表 = [str(self.获取值(arg)) for arg in node.args]
290
+ 参数字符串 = ','.join(参数列表)
291
+ return f'{fn.__name__}({参数字符串});'
292
+
293
+ def 获取numpy属性(self, 对象, 属性):
294
+ if 属性 == 'size':
295
+ pass
296
+
297
+ def 获取Subscript(self, node: ast.Subscript):
298
+ 对象 = self.获取值(node.value)
299
+ 切片 = node.slice
300
+ if isinstance(切片, ast.Slice):
301
+ self.抛出代码异常('不支持列表切片,请以std::vector为准', node)
302
+ 切片 = self.获取值(切片)
303
+ if 对象 is Union:
304
+ return Union[切片]
305
+ if 对象 is List:
306
+ return List[切片]
307
+ if 对象 is Dict:
308
+ return Dict[切片[0], 切片[1]]
309
+ return c获取索引项目(对象, 切片)
310
+
311
+ def visit_FunctionDef(self, node: ast.FunctionDef) -> Any:
312
+ self.visit_核函数所有参数(node.args)
313
+
314
+ with self.花括号:
315
+ self.visit_核函数体(node.body)
316
+
317
+ # 读取返回类型
318
+ if isinstance(node.returns, ast.Name):
319
+ 返回py类型 = self.获取值(node.returns)
320
+ self.返回类型 = py类型转c类型(返回py类型)
321
+ self.ctypes返回类型 = py类型转ctypes类型(返回py类型)
322
+ if self.ctypes返回类型 is None:
323
+ self.抛出代码异常(f'不支持的返回值类型{返回py类型}', node)
324
+ elif isinstance(node.returns, (tuple)):
325
+ self.抛出代码异常('函数只能有一个返回值', node)
326
+ else:
327
+ self.返回类型 = 'auto'
328
+
329
+ def visit_核函数所有参数(self, node: ast.arguments) -> Any:
330
+ self.正在构建参数 = True
331
+ # 支持 *args / **kwargs
332
+ 位置参数 = list(node.args)
333
+ if node.vararg:
334
+ 位置参数.append(node.vararg)
335
+ for idx, arg_node in enumerate(位置参数):
336
+ 默认值 = None
337
+ if idx >= len(node.args) - len(node.defaults):
338
+ 默认值 = node.defaults[idx -
339
+ (len(node.args) - len(node.defaults))]
340
+ self.visit_核函数参数(idx, arg_node, 默认值)
341
+ self.正在构建参数 = False
342
+
343
+ def visit_核函数参数(self, idx: int, node: ast.arg, 默认值=None) -> Any:
344
+ 参数名 = node.arg
345
+ 参数值 = self.获取值(默认值) if 默认值 is not None else None
346
+ if node.annotation is None:
347
+ self.抛出代码异常('变量必须表明类型', node)
348
+ 类型 = self.获取值(node.annotation)
349
+ c类型 = py类型转c类型(类型)
350
+ if c类型 is None:
351
+ self.抛出代码异常(f'不支持的类型{类型}', node)
352
+ 参数变量 = c变量(str(c类型), 参数名, True, 参数值)
353
+ self.参数变量[参数名] = 参数变量
354
+ ctypes类型 = py类型转ctypes类型(类型)
355
+ if ctypes类型 is None:
356
+ self.抛出代码异常(f'不支持的参数类型{类型}', node)
357
+ self.ctypes类型.append(ctypes类型)
358
+ 前置处理函数 = self.参数不同c类型前置处理函数.get(类型)
359
+ if 前置处理函数 is not None:
360
+ 前置处理函数(self, 参数变量, node)
361
+
362
+ def visit_核函数体(self, node: List[ast.stmt]):
363
+ for stmt in node:
364
+ self.visit(stmt)
365
+
366
+ def visit_Return(self, node: ast.Return) -> Any:
367
+ 返回值 = self.获取值(node.value) if node.value is not None else ''
368
+ self.添加c代码(f'return {返回值};')
369
+
370
+ def visit_If(self, node: ast.If) -> Any:
371
+ 判定 = self.获取值(node.test)
372
+ self.添加c代码(f'if ({判定})')
373
+ if len(node.body) > 0:
374
+ with self.花括号:
375
+ for stmt in node.body:
376
+ self.visit(stmt)
377
+ else:
378
+ self.添加c代码(';')
379
+ if len(node.orelse) > 0:
380
+ with self.花括号:
381
+ for stmt in node.orelse:
382
+ self.visit(stmt)
383
+
384
+ def 检查for是否支持(self, node: ast.For):
385
+ if not isinstance(node.target, (ast.Name, ast.Tuple, ast.List)):
386
+ self.抛出代码异常("暂不支持复杂for目标", node)
387
+
388
+ def visit_For(self, node: ast.For) -> Any:
389
+ self.检查for是否支持(node)
390
+ # 构建for循环
391
+ 目标 = self.获取值(node.target)
392
+ if 目标 is None:
393
+ if isinstance(node.target, ast.Name):
394
+ 目标 = c变量('auto', node.target.id, False)
395
+ self.添加c变量(目标)
396
+ else:
397
+ self.抛出代码异常('for中target必须是ast.Name', node)
398
+
399
+ if isinstance(node.iter, ast.Call):
400
+ fn = self.获取值(node.iter.func)
401
+ if fn is range:
402
+ 参数 = [self.获取值(arg) for arg in node.iter.args]
403
+ if len(参数) == 1:
404
+ 代码 = f'for (int64_t {目标} = 0; i < {参数[0]}; ++i)'
405
+ elif len(参数) == 2:
406
+ 代码 = f'for (int64_t {目标} = {参数[0]}; i < {参数[1]}; ++i)'
407
+ elif len(参数) == 3:
408
+ 代码 = f'for (int64_t {目标} = {参数[0]}; i < {参数[1]}; i += {参数[2]})'
409
+ else:
410
+ 调用代码 = self.调用Call(node.iter)
411
+ 代码 = f'for (auto {目标} : {调用代码})'
412
+ elif isinstance(node.iter, (ast.List, ast.Tuple)):
413
+ 列表内容 = [self.获取值(v) for v in node.iter.elts]
414
+ 初始化列表 = 从list构建初始化列表(列表内容)
415
+ 代码 = f'for (auto {目标} : {初始化列表.代码})'
416
+ else:
417
+ 循环目标 = self.获取值(node.iter)
418
+ 代码 = f'for (auto {目标} : {循环目标})'
419
+
420
+ # 添加for代码
421
+ self.添加c代码(代码)
422
+
423
+ # 访问for循环体
424
+ with self.花括号:
425
+ for stmt in node.body:
426
+ self.visit(stmt)
427
+
428
+ def visit_Break(self, node: ast.Break):
429
+ self.添加c代码('break;')
430
+
431
+ def visit_Continue(self, node: ast.Continue):
432
+ self.添加c代码('continue;')
433
+
434
+ def visit_While(self, node: ast.While) -> Any:
435
+ test = self.获取值(node.test)
436
+ self.添加c代码(f'while ({test})')
437
+ with self.花括号:
438
+ for stmt in node.body:
439
+ self.visit(stmt)
440
+
441
+ def visit_Try(self, node: ast.Try) -> Any:
442
+ self.抛出代码异常('不支持try except', node)
443
+
444
+ def visit_With(self, node: ast.With) -> Any:
445
+ self.抛出代码异常('不支持with', node)
446
+
447
+ def visit_Call(self, node: ast.Call) -> Any:
448
+ 代码 = self.调用Call(node)
449
+ self.添加c代码(代码)
450
+
451
+ def _赋值(self, target, 值, node):
452
+ 目标 = self.获取值(target)
453
+ if self.正在调用直接函数:
454
+ if isinstance(target, ast.Name):
455
+ self.局部变量[target.id] = 值
456
+ else:
457
+ self.抛出代码异常('对非ast.Name赋值', node)
458
+ self.正在调用直接函数 = False
459
+ return
460
+
461
+ if 目标 is None:
462
+ if isinstance(target, ast.Name):
463
+ if isinstance(值, dict初始化列表):
464
+ 目标 = StdUnorderedMap(值, target.id, False)
465
+ self.include目录.add('<unordered_map>')
466
+ elif isinstance(值, list初始化列表):
467
+ 目标 = StdList(值, target.id, False)
468
+ if 值.类型 == cpp类型.ANY:
469
+ self.include目录.add('<any>')
470
+ else:
471
+ 目标 = c变量('auto', target.id, False)
472
+ self.添加c代码(目标.初始化(值))
473
+ self.添加c变量(目标)
474
+ else:
475
+ self.抛出代码异常('for中target必须是ast.Name', node)
476
+ else:
477
+ self.添加c代码(f'{目标} = {值};')
478
+
479
+ def visit_Assign(self, node: ast.Assign) -> Any:
480
+ 值 = self.获取值(node.value)
481
+ for target in node.targets:
482
+ self._赋值(target, 值, node)
483
+
484
+ def visit_AugAssign(self, node: ast.AugAssign) -> Any:
485
+ 值 = self.计算二元运算(node)
486
+ self._赋值(node.target, 值, node)
487
+
488
+ def 获取定义(self):
489
+ 参数定义 = []
490
+ for arg in self.参数变量.values():
491
+ if isinstance(arg, c变量):
492
+ 参数定义.append(f'{arg.类型} {arg.c名字}')
493
+ 参数定义文本 = ', '.join(参数定义)
494
+ if self.c函数名 == self.函数名:
495
+ return f'extern "C" {self.返回类型} {self.c函数名} ({参数定义文本})'
496
+ return f'extern "C" {self.返回类型} /*{self.函数名}*/ {self.c函数名} ({参数定义文本})'
497
+
498
+ def 获取includes(self):
499
+ include代码列表 = [f'#include {目录}' for 目录 in sorted(self.include目录)]
500
+ return '\n'.join(include代码列表)
501
+
502
+ def 获取h代码(self):
503
+ return self.获取includes() + '\n' + self.获取定义() + ';'
504
+
505
+ def 获取无后缀文件名(self):
506
+ return f'{self.文件前缀}{self.代码哈希值}'
507
+
508
+ def 获取h文件名(self):
509
+ return f'{self.获取无后缀文件名()}.h'
510
+
511
+ def 获取cpp文件名(self):
512
+ return f'{self.获取无后缀文件名()}.cpp'
513
+
514
+ def 获取库文件名(self):
515
+ return f'{self.获取无后缀文件名()}.so'
516
+
517
+ def 获取cpp代码(self):
518
+ 定义代码 = self.获取定义()
519
+ 代码 = [str(code) for code in self.代码序列]
520
+ return f'#include "{self.获取h文件名()}"\n' + 定义代码 + '\n' + '\n'.join(代码)
521
+
522
+ def 根据缀删除文件(self):
523
+ if not os.path.exists(通用信息.工作文件夹地址):
524
+ return
525
+ for 文件名 in os.listdir(通用信息.工作文件夹地址):
526
+ if 文件名.startswith(self.文件前缀):
527
+ 文件路径 = os.path.join(通用信息.工作文件夹地址, 文件名)
528
+ os.remove(文件路径)
529
+
530
+ def 将代码保存到文件(self):
531
+ self.根据缀删除文件()
532
+ 尝试创建文件夹(通用信息.工作文件夹地址)
533
+ with open(f'{通用信息.工作文件夹地址}/{self.获取h文件名()}', 'w') as fp:
534
+ fp.write(self.获取h代码())
535
+ with open(f'{通用信息.工作文件夹地址}/{self.获取cpp文件名()}', 'w') as fp:
536
+ cpp代码 = self.获取cpp代码()
537
+ fp.write(cpp代码)
538
+
539
+ def 加载库(self):
540
+ self.目标库 = ctypes.CDLL(f'{通用信息.工作文件夹地址}/{self.获取库文件名()}')
541
+ self.cpp函数 = self.目标库[self.c函数名]
542
+ self.cpp函数.argtypes = self.ctypes类型
543
+ self.cpp函数.restype = self.ctypes返回类型
544
+
545
+ def __call__(self, *args: Any, **kwds: Any) -> Any:
546
+ return self.cpp函数(*args)
547
+
548
+
549
+ def jit(jit编译器=py2cpp编译器, cpp编译器=cpp编译器, 每次运行都重新编译: bool = False):
550
+ def 编译函数(fn: Callable):
551
+
552
+ # print(ast.dump(语法树, indent=' '))
553
+ c语言函数编译器 = jit编译器(fn)
554
+ 库文件名 = c语言函数编译器.获取库文件名()
555
+ # 检测是否已存在
556
+ if 每次运行都重新编译 or not os.path.exists(f'{通用信息.工作文件夹地址}/{库文件名}'):
557
+ c语言函数编译器.编译()
558
+ c语言函数编译器.将代码保存到文件()
559
+ 编译器 = cpp编译器()
560
+ 编译器.include目录列表 = list(c语言函数编译器.include目录)
561
+ 编译器.库目录列表 = list(c语言函数编译器.库目录)
562
+ 编译器.链接库 = list(c语言函数编译器.链接库列表)
563
+ 编译器.编译为动态库(f'{通用信息.工作文件夹地址}/{c语言函数编译器.获取cpp文件名()}',
564
+ f'{通用信息.工作文件夹地址}/{c语言函数编译器.获取库文件名()}')
565
+ c语言函数编译器.加载库()
566
+
567
+ def call(*args):
568
+ return c语言函数编译器(*args)
569
+ return call
570
+ return 编译函数
@@ -2,7 +2,7 @@ from typing import Union, List
2
2
  import subprocess
3
3
 
4
4
 
5
- class 编译:
5
+ class cpp编译器:
6
6
  def __init__(self) -> None:
7
7
  self.编译器 = '/bin/c++'
8
8
  self.include目录列表 = []
@@ -51,4 +51,5 @@ class 编译:
51
51
  def 编译为动态库(self, 文件路径: str, 输出路径: str):
52
52
  self.添加编译选项('-fPIC')
53
53
  self.添加编译选项('--shared')
54
+ self.添加编译选项('-O2')
54
55
  self.编译文件(文件路径, 输出路径)