littlebot
Published on 2025-04-12 / 4 Visits
0

【源码】基于LLVM和Porkchop的PorkchopLite编译器

项目简介

PorkchopLite是一个基于LLVM和Porkchop的编译器,它能够将Porkchop语言源代码编译为LLVM IR,并最终生成可执行文件或进行解释执行。该编译器支持多种输出格式,包含LLVM IR、Mermaid图和可执行文件。

项目的主要特性和功能

  1. 多格式输出:支持生成LLVM IR、Mermaid图和可执行文件。
  2. 调试信息:支持生成调试信息,方便进行代码调试。
  3. 多文件支持:支持多文件编译,可通过exportimport关键字实现模块化编程。
  4. 类型检查:具备严格的类型检查机制,保障代码的类型安全。
  5. 流程控制:支持ifwhile等流程控制结构。
  6. 函数和变量声明:支持全局函数和变量的声明与定义。
  7. 指针支持:支持指针操作,可进行更复杂的内存管理。
  8. Unicode支持:源文件采用UTF - 8编码,标识符支持Unicode字符。

安装使用步骤

1. 安装依赖

使用PorkchopLite前,需安装Clang和LLVM,且确保使用LLVM 14版本,可通过以下命令安装: bash sudo apt install clang sudo apt install llvm

2. 复制项目

将PorkchopLite项目复制到本地: bash cd PorkchopLite

3. 初始化项目

运行初始化脚本: bash bash init.sh

4. 编译项目

进入build目录并运行编译脚本: bash cd build bash pcmake.sh <args...>

5. 使用PorkchopLite

编译Porkchop源代码: bash PorkchopLite <input> <options...> - <input>:输入的Porkchop源代码文件。 - 选项: - -o <output>:指定输出文件名。 - -g:生成调试信息。 - -l:输出LLVM IR。 - -m:输出Mermaid图。

6. 示例代码

项目/test目录中包含示例代码,如选择排序示例代码: porkchop fn main() = { let a = alloc(10 * sizeof(int)) as *int a[0] = 1 a[1] = 2 let i = 2 while i < 10 { a[i] = a[i - 1] + a[i - 2] ++i } print_int_array(a, 10) sort(a, a + 10, greater) print_int_array(a, 10) sort(a, a + 10, less) print_int_array(a, 10) dealloc(a as *none) } 编译并运行该代码,会输出排序后的整数数组。

7. 多文件编译

PorkchopLite支持多文件编译,例如: porkchop export fn hello() = 42 ```porkchop import "hello.pc"

fn main() = hello() ``` 以此实现模块化编程。

8. 类型和变量

PorkchopLite支持intfloatbool等基本类型,可用let关键字声明并初始化变量: porkchop fn main() = { let a: int = 0 let b = 0.0 }

9. 运算符

支持算术运算符、位运算符、逻辑运算符和比较运算符,例如: porkchop fn main() = { let a = 10 let b = 10.0 let c: int = a + b as int let d: float = a as float + b }

10. 流程控制

支持ifwhile等流程控制结构,例如: porkchop fn main() = { let i = 1 let s = 0 while i < 10 { s += i i += 1 } }

11. 全局函数和变量

支持全局函数和变量的声明与定义,例如: ```porkchop fn square(x: int) = { x * x }

let a = 1 let b = 1 + 1 ```

12. 指针

支持指针操作,可进行复杂的内存管理,例如: porkchop fn main() = { let a = alloc(10 * sizeof(int)) as *int a[0] = 1 dealloc(a as *none) }

13. 语法糖

支持中缀函数调用等语法糖,例如: ```porkchop fn max(a: int, b: int) = if a > b {a} else {b}

fn main() = { 3 max 4 # 输出 4 } ```

下载地址

点击下载 【提取码: 4003】【解压密码: www.makuang.net】