教你使用swift写编译器玩具(0)

前言

在上学期学完编译原理之后总想搞个大事情,于是就萌生了写编译器的想法。在多方查找之下我发现了LLVM的官方教程。这个教程实现了一门玩具语言叫做Kaleidoscope。在官方教程中提供了即时编译执行以及生成目标文件被C++调用的两种执行方法,我在工程中也有一一对应实现。

官方教程是用C++写的,我就想能不能用swift来写呢?结果还真给我找到了办法,网上有一个现成的swift开源库LLVMSwift,封装了LLVM。当然我觉得不用这个库直接使用LLVM也是ok的,其实这样反而更贴近官方教程,使用那个开源库还得理解它的逻辑。

于是我把他们教程的前8章都写完了,仓库在这

教程如下:

教你使用swift写编译器玩具(0)

教你使用swift写编译器玩具(1)

教你使用swift写编译器玩具(2)

教你使用swift写编译器玩具(3)

教你使用swift写编译器玩具(4)

教你使用swift写编译器玩具(5)

教你使用swift写编译器玩具(6)

教你使用swift写编译器玩具(7)

教你使用swift写编译器玩具(8)

仓库在这

开始

作为第0章我们首先要完成的是安装LLVM。网上关于这方面的文档非常少,这个自己摸索的过程真是十分痛苦,下面说一下如何去安装LLVM并在xcode中使用。

下载LLVM

首先我们通过homebrew下载LLVM

1
brew install llvm

下载完LLVM我们继续下载pkg-config

1
brew install pkg-config

不使用LLVMSwift

你需要在xcode直接引入LLVM可以通过添加环境到.bash_profile文件中实现

1
2
# 在.bash_profile下配置llvm命令行,具体情况根据你所安装的llvm版本不同
export PATH=/usr/local/Cellar/llvm/8.0.0_1/bin:$PATH;

然后在Xcode->Build Settings->Search Paths->Header Search Paths中添加

1
2
/usr/local/opt/llvm/include
/usr/local/opt/llvm/lib

使用LLVMSwift

下载来之LLVMSwift的脚本

在Package中添加

1
.package(url: "https://github.com/llvm-swift/LLVMSwift.git", from: "0.5.0")

并在target中依赖LLVM

1
dependencies: ["LLVM"]

配置环境

1
swift utils/make-pkgconfig.swift

编译工程

1
swift build

build完成之后就可以在工程中引入LLVM并使用LLVMSwift了。