-
Java开发工具包(版本>=1.8就足够了) -
Apache Ant(版本>=1.9.2就足够了) -
LLVM编译器基础结构(版本>=4.0就足够了)
#确保起点清洁: 蚂蚁清洁剂 #构建多功能平台: 蚂蚁
百万美元 用法:milc[inputs | options] inputs:filename.milc从指定文件加载选项 filename.mil从指定文件加载mil源(.lmil表示文字) filename.lc从指定文件加载lc源(.llc表示文字) 选项:-v verbose on -d显示调试消息 -ipathlist将项目附加到输入搜索路径 ... $
#使用mil工具将fib.lc编译为LLVM: milc-ilib--独立演示/fib.lc-ltmp/fib.ll #从生成的LLVM代码生成可执行文件: clang-o tmp/fib tmp/fib.ll演示/运行时。 c(c)
-
-免疫球蛋白 设置输入文件的路径以包含 自由 目录,这是默认的 前奏曲.lc 和其他 存储库文件。 -
--独立的 配置 密尔克 生成一个名为 主要的 . -
演示/fib.lc 指定LC源程序的名称。 -
-ltmp/光纤.ll 表示 密尔克 应生成LLVM 并在文件中写入代码副本 tmp/fib.ll型 .
-
-o tmp/fib 设置名称( 小谎 )和文件夹位置( 临时管理计划 ) 可执行程序的 叮当作响 生产。 -
tmp/fib.ll型 指定输入LLVM代码的名称; 属于 当然,这是由 前进 密尔克 命令。 -
演示/运行时。 c(c) 是一个小型C源文件的名称 提供了 打印Word 功能,即 在原文中使用 fib.抄送 程序。 其他一些示例 在单个程序中结合LC和C代码的 在本文档中。
#编译生成的LLVM代码: llc-O2-filetype=asm-march=x86 tmp/fib.ll #生成包含生成代码的可执行文件: gcc-m32-o tmp/fib-Wl,-no_pie demo/runtime.c tmp/fib。 秒
#运行生成的可执行文件: tmp/fib
91 144 144 17
milc-ilib--独立-x演示/fib.lc
-
prioset.lc公司 是优先级集的LC实现(最大值 堆)数据结构,基于Habit报告中的代码。 (进行了一些更改,以包括 此程序中basic所需的外部原语 算术和从内存中读/写等操作。 如果 我们从一个习惯源程序开始,这些 详细信息将由Habit编译器自动生成。) -
普里奥德莫。 c(c) 是一个简单的C演示程序,它使用 函数来自 prioset.lc公司 作为一个简单的库。
#编译prioset.lc实现: milc-ilib demo/prioset.lc--llvm-main=initPrioset-ltmp/prioset.ll--目标=x86_64-apple-macosx10.13.0--64 #编译priodemo.c文件并与prioset.lc中的代码链接: clang-DWORD64-o tmp/priodemo演示/priodemo.c tmp/prioset.ll #运行生成的可执行文件: tmp/priodemo
-
--llvm-main=initPrioset 指定的名称 必须用于初始化 使用其他函数之前的优先级设置数据结构 定义于 prioset.lc公司 .名称 initPrioset(初始优先级) 用于 普里奥德莫。 c(c) ,因此必须指定相同的名称 在这里。 (关于 --llvm-main=。。。 命令行 选项将在本文档后面介绍。) -
--目标=x86_64-apple-macosx10.13.0 指定“目标 生成的LLVM代码中包含的triple”字符串 指定目标平台的详细信息; 很明显,会的 如果使用 不同的平台。 注意,您可以找到目标三元组 用于通过运行命令配置LLVM的 llvm-config—主机目标 ,但单个LLVM安装可以 通常可以容纳多种目标类型。 -
--64 指定生成的LLVM代码将生成代码 假设 单词 LC中的类型为64位宽。 这个 -DWORD64码 中的选项 叮当作响 命令行用于确保 代码在 普里奥德莫。 c(c) 以相应的方式配置 (尤其是通过使用C 长的 类型作为的表示形式 单词 值)。 或者,也可以 通过使用生成程序的32位版本: --32 的选项 密尔克 ; 一 -DWORD32型 的选项 叮当作响 ; 和一个修改过的 的版本 --目标=。。。 选项,例如更换 x86_64码 具有 i386型 . 重要提示:相同的单词大小至关重要 一致地用于所有使用的LC和C代码片段 在一个单独的程序中。 未能满足此要求 需求可能会导致分割、保护或 尝试生成和运行 普里奥德莫 例子。
$tmp/priodemo 优先级设置演示 插入一些数字: 插入12 插入5 插入7 插入128 插入67 删除三个数字: 删除128 拆卸67 拆卸12 添加更多数字: 插入3 插入32 插入10 排空队列: 拆卸32 拆卸10 拆卸7 拆卸5 拆卸3 完成! $
要求“序言.lc” data Dup a=重复a a 入口点swap7::重复(Bit 7)->重复(Bit7) 入口点swap8::重复(Bit 8)->重复(Bit8) swap7=交换 swap8=交换 掉期d=重复x y的情况d->重复y x 入口点d1 d1=Dup B001 B110
$milc-ilib-m演示/ex.lc-po 数据->(a::*)(b::* =函数([a]->>[b]) 数据重复(a::*) =重复 ----------------------------------------- --非递归 入口点d1::重复(位3) 第1天<- Dup(B001、B110) ----------------------------------------- --非递归 b84::针对所有(a::*)。 [Dup a]>>=[Dup a] b84【t0】= 断言t0重复 t1<-重复0 t0 t2<-重复1 t0 重复(t2,t1) ----------------------------------------- --非递归 b0::对于所有(a::元组)。 []>>=a b0[]= 暂停(()) ----------------------------------------- --非递归 b81::针对所有(a::*)。 [Dup a]>>=[Dup a] b81【t0】= 第t0个案例,共个案例 重复->b84[t0] _->b0[] ----------------------------------------- --非递归 k54::对于所有(a::*)。 {}[重复a]->>[重复a] k54{}t0=b81[t0] ----------------------------------------- --非递归 s2::对于所有(a::*)。 [重复a]->>[重复a] 第2页<- k54{} ----------------------------------------- --非递归 交换::对于所有(a::*)。 重复->重复 互换<- 函数(s2) ----------------------------------------- --非递归 入口点swap8::重复(Bit 8)->重复(Bit8) 拭子8<- 回报互换 ----------------------------------------- --非递归 入口点swap7::重复(Bit 7)->重复(Bit7) 拭子7<- 回报互换 ----------------------------------------- --入口点:d1 swap8 swap7 $
$milc-ilib-m演示/ex.lc-pco 数据重复(a::*) =重复 ----------------------------------------- --非递归 入口点d1::重复(位3) 第1天<- Dup(B001、B110) ----------------------------------------- --非递归 b80::用于所有(a::*)。 [重复a]>>=[重复a] b80【t0】= t1<-重复0 t0 t2<-重复1 t0 重复(t2,t1) ----------------------------------------- --非递归 k54::对于所有(a::*)。 {}[重复a]->>[重复a] k54{}t0=b80[t0] ----------------------------------------- --非递归 交换::对于所有(a::*)。 [Dup a]->> 互换<- k54{} ----------------------------------------- --非递归 入口点swap8::[重复(Bit 8)]->>[重复(Bit 8)] 拭子8<- 回报互换 ----------------------------------------- --非递归 入口点swap7::[重复(Bit 7)]->>[重复(Bit 7)] 拭子7<- 回报互换 ----------------------------------------- --入口点:d1 swap8 swap7 $
$milc-ilib-m演示/例如lc-pcoso 数据Dup0 =Dup0(第7位)(第7位元) 数据Dup1 =Dup1(第8位)(第8位元) 数据Dup2 =重复2(第3位)(第3位元) ----------------------------------------- --非递归 b80::[Dup0]>>=[Dup0] b80【t0】= t1<-Dup0 0 t0 t2<-Dup0 1 t0 Dup0(t2,t1) ----------------------------------------- --非递归 k54::{}[Dup0]->[Dup0] k54{}t0=b80[t0] ----------------------------------------- --非递归 交换::[Dup0]->[Dup0] 互换<- k54{} ----------------------------------------- --非递归 入口点swap7::[Dup0]->[Dup0] 拭子7<- 回报互换 ----------------------------------------- --非递归 b801::[重复1]>>=[重复1] b801【t0】= t1<-重复1 0 t0 t2<-重复1 1 t0 Dup1(t2,t1) ----------------------------------------- --非递归 k541::{}[Dup1]->[Dup1] k541{}t0=b801[t0] ----------------------------------------- --非递归 s1::[重复1]->>[重复1] 第1页<- k541{} ----------------------------------------- --非递归 入口点交换8::[Dup1]->[Dup1] 拭子8<- 返回s1 ----------------------------------------- --非递归 入口点d1::Dup2 第1天<- Dup2(B001、B110) ----------------------------------------- --入口点:swap7 swap8 d1 $
$milc-ilib-m演示/ex.lc-pcosoro 数据Dup0 =Dup0单词 ----------------------------------------- --非递归 入口点交换7::[Dup0]>>=[Dup0] 交换7[t0]= t1<-Dup0 0 t0 t2<-Dup0 1 t0 Dup0(t2,t1) ----------------------------------------- --非递归 入口点swap8::[Dup0]>>=[Dup0] 拭子8[t0]= t1<-重复0 t0 t2<-Dup0 1 t0 Dup0(t2,t1) ----------------------------------------- --非递归 入口点d1::Dup0 第1天<- Dup0(1,6) ----------------------------------------- --入口点:swap7 swap8 d1 $
$milc-ilib-m演示/ex.lc-pcosbo 位数据Dup0/14 =Dup0[Dup00::位7 | Dup01::位7] --predDup0(x::位14)=真 --位模式: -- ______________ 位数据重复1/16 =Dup1[Dup10::位8 | Dup11::位8] --predDup1(x::位16)=真 --位模式: -- ________________ 位数据Dup2/6 =Dup2[Dup20::位3 | Dup21::位3] --predDup2(x::Bit 6)=真 --位模式: -- ______ ----------------------------------------- --非递归 b80::[Dup0]>>=[Dup0] b80【t0】= t1<-Dup0 0 t0 t2<-重复0.重复0 t1 t3<-Dup0.Dup0 1 t1 t4<-Dup0.Dup0(t3,t2) Dup0(t4) ----------------------------------------- --非递归 k54::{}[Dup0]->[Dup0] k54{}t0=b80[t0] ----------------------------------------- --非递归 交换::[Dup0]->[Dup0] 互换<- k54{} ----------------------------------------- --非递归 入口点swap7::[Dup0]->[Dup0] 拭子7<- 回报互换 ----------------------------------------- --非递归 b801::[重复1]>>=[重复1] b801【t0】= t1<-重复1 0 t0 t2<-Dup1.Dup1 0 t1 t3<-重复1。重复1 1 t1 t4<-重复1。重复1(t3,t2) Dup1(t4) ----------------------------------------- --非递归 k541::{}[Dup1]->[Dup1] k541{}t0=b801[t0] ----------------------------------------- --非递归 s1::[重复1]->>[重复1] 第1页<- k541{} ----------------------------------------- --非递归 入口点交换8::[Dup1]->[Dup1] 拭子8<- 返回s1 ----------------------------------------- --非递归 s2::Dup2.Dup2 s2秒<- Dup2、Dup2(B001、B110) ----------------------------------------- --非递归 入口点d1::Dup2 第1天<- Dup2(s2) ----------------------------------------- --入口点:swap7 swap8 d1 $
$milc-ilib-m演示/ex.lc-pcosboro ----------------------------------------- --非递归 入口点swap7::[Word]>>=[Word] 拭子7[t0]= t1<-lshr((t0,7)) t2<-shl((t0,7)) t3<-和(t216256) 或((t1,t3)) ----------------------------------------- --非递归 入口点swap8::[Word]>=[Word] 拭子8[t0]= t1<-lshr((t0,8)) t2<-shl((t0,8)) t3<-和(t265280) 或((t1,t3)) ----------------------------------------- --非递归 入口点d1::Word 第1天<- 返回14 ----------------------------------------- --入口点:swap7 swap8 d1 $
$milc-ilib-l演示/ex.lc-pcosboro @d1=全局i32 14 定义i32@swap7(i32%r0){ 条目: br标签%swap7 拭子7: %r2=lshr i32%r0,7 %r4=shl i32%r0,7 %r3=和i32%r416256 %r1=或i32%r2,%r3 第32列第1列 } 定义i32@swap8(i32%r0){ 条目: br标签%swap8 拭子8: %r2=lshr i32%r0,8 %r4=shl i32%r0,8 %r3=和i32%r4,65280 %r1=或i32%r2,%r3 第32列第1列 } $
$cat演示/funlib.lc 要求“序言.lc” --Fibonnaci函数的标准递归版本: 入口点fib::Word->Word fib n=如果方程n为0,则为0 否则,如果等式n为1,则为1 else相加(fib(子n 1))(fib(子n 2)) --Fibonnaci函数的迭代版本: 入口点itfib::Word->Word itfib=让循环a b n=如果方程n为0,则另一个循环b(添加a b)(子n 1) 循环0 1中 --阶乘函数的传统递归实现: 入口点recfac::Word->Word recfac n=如果eq n为0,则为1,否则为mul n(recfac(sub n 1)) --阶乘函数的迭代版本: 入口点itfac::Word->Word itfac=让循环a n=如果方程n为0,则为else循环(mula n)(子n 1) 回路1中 $
$milc-ilib演示/funlib.lc-ltmp/funlib.ll $clang-c-o tmp/funlib.o tmp/funnib.ll 警告:使用…覆盖模块目标三元组。。。 生成1个警告。 $
$cat演示/funlibtest.c #包括<stdio.h> 外部int fib(int); 外部int itfib(int); 外部内部recfac(int); 外部内部itfac(int); int main(int argc,char**argv){ 对于(int i=0;i<10;i++){ printf(“%d\t%d\t%t\t%d\t%d\t%d”, i、 fib(i)、itfib(i)、recfac(i)和itfac(i)); } } $clang-o tmp/funlibtest演示/funlibtest.c tmp/funnib.ll $
$tmp/funlibtest 0 0 0 1 1 1 1 1 1 1 2 1 1 2 2 3 2 2 6 6 4 3 3 24 24 5 5 5 120 120 6 8 8 720 720 7 13 13 5040 5040 8 21 21 40320 40320 9 34 34 362880 362880 $
$cat演示/needinit.lc 要求“prelude.lc” 入口点fib::Word->Word fib n=如果方程n为0,则为0 否则,如果等式n为1,则为1 else相加(fib(子n 1))(fib(子n 2)) 入口点fib12,fib15 fib12=fib 12 fib15=fib 15 $
$milc-ilib演示/needinit.lc-ltmp/neediti.ll 错误:LLVM程序需要初始化函数(使用--LLVM-main=NAME设置) $
$milc-ilib demo/needinit.lc-ltmp/needinit.ll--llvm-main=初始化 $
$cat演示/printfibs.c #包括<stdio.h> 外部void initialize(); 外部int fib12,fib15; int main(int argc,char**argv){ initialize(); printf(“fib(12)=%d,fib(15)=%d\n”,fib12,fib15); } $clang-o tmp/printfibs演示/printfibs.c tmp/needinit.ll $tmp/printfibs fib(12)=144,fib(15)=610 $
$cat演示/程序.lc 要求“序言.lc” 需要“io.mil” itfib::单词->单词 itfib=让循环a b n=如果方程n为0,则另一个循环b(添加a b)(子n 1) 循环0 1中 --打印第12个Fibonnaci数字的程序: 出口总管 main=打印Word(itfib 12) $
$milc-ilib--独立演示/program.lc-ltmp/program.ll $clang-o tmp/program tmp/progrem.ll演示/运行时.c 警告:使用…覆盖模块目标三元组。。。 生成1个警告。 $tmp/程序 144 $
--llvm-main=main--mil-main=main