# Translator **Repository Path**: ym333mmm/translator ## Basic Information - **Project Name**: Translator - **Description**: python翻译成llvm和可执行文件的项目 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-05-20 - **Last Updated**: 2026-01-15 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Translator ## 0.介绍 这是一个基于LLVMlite的python翻译器,它可以将python代码翻译为LLVM IR,然后通过LLVMlite库将IR编译为机器码并运行。这个工程主要分为2大部分, 1. 用户侧代码编译:这个被定义成普通python代码的编译, 功能上会贴近python社区提供的PEP标准能力, 功能上有选择的实现不同特性的实际行为, 例如:支持python的类、函数、模块等, 高级特性也支持实现例如: 装饰器,上下文管理器等等. 2. 运行时代码编译: 这个被定义成支持整个系统运行的代码,这些代码的编译过程与用户侧代码不同,有着自己的定义, 上层会封装出大概4大类功能: 1) 内层运行的公共函数例如: int()\print()等, builtins内置的函数. 2) 内置对象例如: 浮点对象\字符对象\list对象, 等builtins的内置类型. 3) C语言编写的外层运行函数例如: 打印\读取文件系统\调用系统API等. 运行时代码编写同样使用python语言,但是编译时的解释会和标准的python功能有些差异,类似pypy的RPython编写, 但是又与RPython有所不同,这些差异具体下面会定义在哪. ## 1.软件架构 调用LLVMlite库间接实现python的动态编译,将源代码编译成机器码,并运行。 运行时代码编译使用一个类统一实现, 客户侧代码编译使用另外一个类实现两者不同, 但是对AST语法的解释功能和分析功能都由社区提供的标准CPython完成.PEP标准链接参见:https://peps.python.org/ , 这里无论是运行时代码还是客户侧代码, 都需要遵守PEP标准, 着重使用社区已经Finished PEPs. ## 2.设计原则 1. 代码运行时如果遇到语法定义以外的情况时,直接报错主动退出, 绝不继续执行, 并给出当前调用栈的信息以及执行情况(调用栈\线程号\线程上下文\局部变量和全局变量的实际信息). 2. 不提供垃圾回收能力,保留在内存中的对象使用对象计数手段完成释放和申请,全程托管给运行时, 如果内存泄漏即为运行时bug, 申请的内存必须和释放的内存全部对等. 用户侧代码不能单独申请内存,不提供语法支持. ## 3.运行时代码的功能和限制说明 1. 禁止使用匿名函数\lamada表达式\正则表达式 2. 禁止使用CPython定义的Core以外的包和类, 例如: 不能使用CPython定义的sys, os, time等包, 也不能使用诸如smtplib\email\tkinter等 3. 禁用Try语句块, 例如: try, except, finally, else等. 4. 禁用Assert语句块, 例如: assert等. ## 4.内置数据类型规范 ### 内置函数 printf函数 1. 每行打印长度最大受限2048, 函数处理栈上空间申请大小为2048字节, 超过的截断. 2. 支持打印彩色文字, 异步输入调用,使用Quill ,参数可配置. ### 字符串对象 1. 格式化字符串解析: 1) 默认限制输入字符串单笔总处理长度 低于1024, 用户可追加指定扩容长度. 2) 禁止格式化字符串出入访问内置变量如${abc}或者${class.__new__} 攻击, 内置解析处理 效仿string.Template类(PEP292) ,直接将"${obj.__class__}"视为普通字符串而非可求值的表达式. ## 5.安装教程 1. xxxx 2. xxxx 3. xxxx ## 6.使用说明 1. xxxx 2. xxxx 3. xxxx ## 7.编码风格 1. 全局所有文件编码都使用utf-8编码方式记录文件, 包括C语言代码 2. 无论是运行时代码还是客户侧代码都使用UTF-8编码存储,不要使用其他编码 3. 运行时代码和用户侧代码无论那边都是社区CPython的子集,都可以使用社区的CPython解释器时来运行, 结果可能会和社区的有所区别. ### 运行时代码编码风格: 1. 4空格缩进,不要使用tab, 默认情况下,IDE会自动将tab转换成4空格 (使用PyCharm的设置) 2. 所有代码文件统一使用UTF-8编码,不要使用其他编码 3. 类名、函数名、变量名必须见名知意,不得使用未定义的特殊名称 4. 运行时全局常量: RtXXX, 例如: RtInt, RtFloat, RtString等, 要求使用大驼峰命名,其他内置类有要求大驼峰命名, 例如: RtObject, RtType, RtNone等. 5. 类名称\独立函数名称\全局公共变量名称: 要求使用大驼峰命名, 形如RtXxxXxx 6. 类内对象名\函数名要求小写加下划线. 形如: xx_xx 7. 当调用llvm的属性是默认使用LL_Xxx的命名方式,例如:LL_Module, LL_Function, LL_Value等 8. 参与IR生成的函数命名 IR_xxx, 例如:IR_Malloc, IR_Free等 9. 不加ll和ir前缀的默认是当前工程自己的对象或者函数,例如:module, function, value等 10. 默认使用的C语言类型和C语言中需要导出给Python调用的函数, 都需要在RtCStub.py中定义, 例如: RtCInt32, RtCString, RtCPtr等. ### 客户侧代码编码风格: 1. 4空格缩进,不要使用tab, 默认情况下,IDE会自动将tab转换成4空格 (使用PyCharm的设置) 2. 所有代码文件统一使用UTF-8编码,不要使用其他编码 3. 其他先继承PEP8编码风格, 例如: 类名、函数名、变量名必须见名知意,不得使用未定义的特殊名称