仓库地址:Github Repo
LLVM框架语言:LLVM 12.0.0
工具库依赖:libBoost、LLVM、glib
界面依赖:gtkmm3
编译环境:cmake 3.13 + Deepin 20.1 Beta
编译时若出错请注意LLVM版本号
SysyPlus编译器偏向于生成网络方面的执行代码,让小白开发者也可以做一个简单、易用、高性能、安全的http服务器。后期根据开发进度开发其他功能。
众所周知:c的http晦涩难学,导包过于繁琐。但性能最好,python的http简单,但是是解释型语言,源码直接暴露,java的http也有学习成本, 且针对简单的http服务使用java这种复杂通用性语言有剩余空间,杀鸡焉用牛刀。
SysyPlus编译器致力于打造一个简单语法的http服务器,上手即用语法简单,不用导任何包,不用管依赖问题, 生成的产物为编译好的可执行文件,文件小,安全,且能利用python不能使用的多核cpu线程优势。
以用程序自带访问一次HTTP为例
- IDE GUI可直接进行代码静态分析(变量不存在,函数重复定义等)
- IDE GUI拥有丰富的代码提示功能
- 编译或执行SysyPlus代码
- 当然你也可以当一个文本编辑器
- CGUI
- 开启图形界面编译,生成带GUI的编译器
- DEBUG_FLAG
- 开启词法、语法的调试模式
- 函数定义
- 参数
- 二元表达式
- &&、||
- +、-、*、/、%、!=
- 函数调用
- 传参
- 基础类型、数组、多维数组、函数指针(fun_c<ret,...>)传参
- 传参
- 条件分支关键字
- if
- 循环关键字(c++ -> sysyplus)
- for -> lp
- While -> whl
- break -> out
- continue -> cont
- 函数返回 return -> ret
- 保持单入单出特性
- 全局、局部变量
- 数组
- 全局、局部数组/多维数组
- 数组定义时初始化
- 字符串
- 局部、全局声明、传值
- 语言特色
- sleep(s) 休眠
- echo(str) 输出
- now(null) 获取当前秒数
- web功能
- 创建socket
- 连接url
- 发送GET请求
- 发送POST请求(正在开发中)
- 支持TLSv1.3加密HTTPS(需要openssl支持,现默认使用TLSv1.2,兼容性好)
- 代码插桩/优化功能
- 函数执行时间分析
- 递归函数转非递归(正在开发中)
- 生成AST语法树
- 生成对应系统架构的目标代码
- ...(比较懒,不想写)
- 无需导包
int main(){
sleep(1);
echo('init web framework', '123', '345');
int socketId = getSocket();
echo('socket id is',socketId);
str url = 'file.kingtous.cn';
str port = '443';
echo('url is:',url,' port is:',port);
int state = connectSocket(socketId,url,port);
state = isSocketConnected(socketId);
if (state == 0){
echo('socket connected');
echo('sending get request');
str response = getRequest(socketId,url,'/');
echo('response is:');
echo(response);
}
closeSocket(socketId);
ret 0;
}
- 编译输出
- 可直接运行
➜ Desktop g++ 2.sy.o libtime.a libweb.a -o test
➜ Desktop ./test
init web framework 123 345
socket id is 0
url is: file.kingtous.cn port is: 443
socket connected
sending get request
response is:
<html>
<head><title>302 Found</title></head>
<body>
<center><h1>302 Found</h1></center>
<hr><center>nginx</center>
</body>
</html>
➜ Desktop
- 可选择生成LLVM IR语法
ModuleID = 'cn.kingtous.sysycompiler'
source_filename = "cn.kingtous.sysycompiler"
target datalayout = "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-apple-darwin19.6.0"
@_str_49 = private unnamed_addr constant [19 x i8] c"init web framework\00", align 1
@_str_50 = private unnamed_addr constant [4 x i8] c"123\00", align 1
@_str_51 = private unnamed_addr constant [4 x i8] c"345\00", align 1
@_str_52 = private unnamed_addr constant [13 x i8] c"socket id is\00", align 1
@_str_53 = private unnamed_addr constant [17 x i8] c"file.kingtous.cn\00", align 1
@_str_54 = private unnamed_addr constant [4 x i8] c"443\00", align 1
@_str_55 = private unnamed_addr constant [8 x i8] c"url is:\00", align 1
@_str_56 = private unnamed_addr constant [10 x i8] c" port is:\00", align 1
@_str_57 = private unnamed_addr constant [17 x i8] c"socket connected\00", align 1
@_str_58 = private unnamed_addr constant [20 x i8] c"sending get request\00", align 1
@_str_59 = private unnamed_addr constant [2 x i8] c"/\00", align 1
@_str_60 = private unnamed_addr constant [13 x i8] c"response is:\00", align 1
define i32 @main() {
jintao_entry:
%0 = alloca i32, align 4
store i32 0, i32* %0, align 4
%1 = tail call i32 @sleep(i32 1)
%2 = alloca [11 x i8], align 1
store [11 x i8] c"%s %s %s \0A\00", [11 x i8]* %2, align 1
%3 = bitcast [11 x i8]* %2 to i8*
%echo = call i32 (i8*, ...) @printf(i8* %3, i8* getelementptr inbounds ([19 x i8], [19 x i8]* @_str_49, i32 0, i32 0), i8* getelementptr inbounds ([4 x i8], [4 x i8]* @_str_50, i32 0, i32 0), i8* getelementptr inbounds ([4 x i8], [4 x i8]* @_str_51, i32 0, i32 0))
%4 = alloca i32, align 4
%5 = call i32 @_web_getSocket()
store i32 %5, i32* %4, align 4
%6 = alloca [8 x i8], align 1
store [8 x i8] c"%s %d \0A\00", [8 x i8]* %6, align 1
%7 = bitcast [8 x i8]* %6 to i8*
%echo1 = call i32 (i8*, ...) @printf(i8* %7, i8* getelementptr inbounds ([13 x i8], [13 x i8]* @_str_52, i32 0, i32 0), i32 %5)
%8 = alloca i8*, align 8
store i8* getelementptr inbounds ([17 x i8], [17 x i8]* @_str_53, i32 0, i32 0), i8** %8, align 8
%9 = alloca i8*, align 8
store i8* getelementptr inbounds ([4 x i8], [4 x i8]* @_str_54, i32 0, i32 0), i8** %9, align 8
%10 = alloca [14 x i8], align 1
store [14 x i8] c"%s %s %s %s \0A\00", [14 x i8]* %10, align 1
%11 = bitcast [14 x i8]* %10 to i8*
%echo2 = call i32 (i8*, ...) @printf(i8* %11, i8* getelementptr inbounds ([8 x i8], [8 x i8]* @_str_55, i32 0, i32 0), i8* getelementptr inbounds ([17 x i8], [17 x i8]* @_str_53, i32 0, i32 0), i8* getelementptr inbounds ([10 x i8], [10 x i8]* @_str_56, i32 0, i32 0), i8* getelementptr inbounds ([4 x i8], [4 x i8]* @_str_54, i32 0, i32 0))
%12 = alloca i32, align 4
%13 = call i32 @_web_connectSocket(i32 %5, i8* getelementptr inbounds ([17 x i8], [17 x i8]* @_str_53, i32 0, i32 0), i8* getelementptr inbounds ([4 x i8], [4 x i8]* @_str_54, i32 0, i32 0))
store i32 %13, i32* %12, align 4
%14 = call i32 @_web_isSocketConnected(i32 %5)
store i32 %14, i32* %12, align 4
%equ = icmp eq i32 %14, 0
br i1 %equ, label %neuq_jintao_if_true, label %neuq_jintao_if_end
neuq_jintao_if_true: ; preds = %jintao_entry
%15 = alloca [5 x i8], align 1
store [5 x i8] c"%s \0A\00", [5 x i8]* %15, align 1
%16 = bitcast [5 x i8]* %15 to i8*
%echo4 = call i32 (i8*, ...) @printf(i8* %16, i8* getelementptr inbounds ([17 x i8], [17 x i8]* @_str_57, i32 0, i32 0))
%17 = alloca [5 x i8], align 1
store [5 x i8] c"%s \0A\00", [5 x i8]* %17, align 1
%18 = bitcast [5 x i8]* %17 to i8*
%echo5 = call i32 (i8*, ...) @printf(i8* %18, i8* getelementptr inbounds ([20 x i8], [20 x i8]* @_str_58, i32 0, i32 0))
%19 = alloca i8*, align 8
%20 = call i8* @_web_callGetRequest(i32 %5, i8* getelementptr inbounds ([17 x i8], [17 x i8]* @_str_53, i32 0, i32 0), i8* getelementptr inbounds ([2 x i8], [2 x i8]* @_str_59, i32 0, i32 0))
store i8* %20, i8** %19, align 8
%21 = alloca [5 x i8], align 1
store [5 x i8] c"%s \0A\00", [5 x i8]* %21, align 1
%22 = bitcast [5 x i8]* %21 to i8*
%echo6 = call i32 (i8*, ...) @printf(i8* %22, i8* getelementptr inbounds ([13 x i8], [13 x i8]* @_str_60, i32 0, i32 0))
%23 = alloca [5 x i8], align 1
store [5 x i8] c"%s \0A\00", [5 x i8]* %23, align 1
%24 = bitcast [5 x i8]* %23 to i8*
%echo7 = call i32 (i8*, ...) @printf(i8* %24, i8* %20)
br label %neuq_jintao_if_end
neuq_jintao_if_end: ; preds = %neuq_jintao_if_true, %jintao_entry
%25 = call i32 @_web_closeSocket(i32 %5)
store i32 0, i32* %0, align 4
ret i32 0
}
declare i32 @sleep(i32)
declare i32 @printf(i8*, ...)
declare i32 @_web_getSocket()
declare i32 @_web_connectSocket(i32, i8*, i8*)
declare i32 @_web_isSocketConnected(i32)
declare i8* @_web_callGetRequest(i32, i8*, i8*)
declare i32 @_web_closeSocket(i32)
; Function Attrs: nounwind
declare void @llvm.stackprotector(i8*, i8**) #0
attributes #0 = { nounwind }
- 可选择生成可读汇编代码
.section __TEXT,__text,regular,pure_instructions
.build_version macos, 10, 15
.globl _main
.p2align 4, 0x90
_main:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset %rbp, -16
movq %rsp, %rbp
.cfi_def_cfa_register %rbp
pushq %r15
pushq %r14
pushq %r12
pushq %rbx
subq $80, %rsp
.cfi_offset %rbx, -48
.cfi_offset %r12, -40
.cfi_offset %r14, -32
.cfi_offset %r15, -24
movl $0, -48(%rbp)
movl $169898789, -37(%rbp)
movb $0, -33(%rbp)
leaq L__str_39(%rip), %rsi
leaq -37(%rbp), %rdi
xorl %eax, %eax
callq _printf
movl $1, %edi
callq _sleep
movabsq $8297073567416218405, %r12
movq %r12, -59(%rbp)
movw $2592, -51(%rbp)
movb $0, -49(%rbp)
leaq L__str_40(%rip), %rsi
leaq L__str_41(%rip), %rdx
leaq L__str_42(%rip), %rcx
leaq -59(%rbp), %rdi
xorl %eax, %eax
callq _printf
callq __web_getSocket
movl %eax, %r14d
movl %eax, -80(%rbp)
movabsq $2850364258808613, %rax
movq %rax, -88(%rbp)
leaq L__str_43(%rip), %rsi
leaq -88(%rbp), %rdi
movl %r14d, %edx
xorl %eax, %eax
callq _printf
leaq L__str_44(%rip), %r15
movq %r15, -104(%rbp)
leaq L__str_45(%rip), %rbx
movq %rbx, -96(%rbp)
movq %r12, -73(%rbp)
movl $544417056, -65(%rbp)
movw $10, -61(%rbp)
leaq L__str_46(%rip), %rsi
leaq L__str_47(%rip), %rcx
leaq -73(%rbp), %rdi
movq %r15, %rdx
movq %rbx, %r8
xorl %eax, %eax
callq _printf
movl %r14d, %edi
movq %r15, %rsi
movq %rbx, %rdx
callq __web_connectSocket
movl %eax, -44(%rbp)
movl %r14d, %edi
callq __web_isSocketConnected
movl %eax, -44(%rbp)
testl %eax, %eax
jne LBB0_2
movq %rsp, %rax
leaq -16(%rax), %rdi
movq %rdi, %rsp
movb $0, -12(%rax)
movl $169898789, -16(%rax)
leaq L__str_48(%rip), %rsi
xorl %eax, %eax
callq _printf
movq %rsp, %rax
leaq -16(%rax), %rdi
movq %rdi, %rsp
movb $0, -12(%rax)
movl $169898789, -16(%rax)
leaq L__str_49(%rip), %rsi
xorl %eax, %eax
callq _printf
movq %rsp, %rbx
leaq -16(%rbx), %rsp
leaq L__str_44(%rip), %rsi
leaq L__str_50(%rip), %rdx
movl %r14d, %edi
callq __web_callGetRequest
movq %rax, %r15
movq %rax, -16(%rbx)
movq %rsp, %rax
leaq -16(%rax), %rdi
movq %rdi, %rsp
movb $0, -12(%rax)
movl $169898789, -16(%rax)
leaq L__str_51(%rip), %rsi
xorl %eax, %eax
callq _printf
movq %rsp, %rax
leaq -16(%rax), %rdi
movq %rdi, %rsp
movb $0, -12(%rax)
movl $169898789, -16(%rax)
movq %r15, %rsi
xorl %eax, %eax
callq _printf
LBB0_2:
movl %r14d, %edi
callq __web_closeSocket
movl $0, -48(%rbp)
xorl %eax, %eax
leaq -32(%rbp), %rsp
popq %rbx
popq %r12
popq %r14
popq %r15
popq %rbp
retq
.cfi_endproc
.section __TEXT,__cstring,cstring_literals
L__str_39:
.asciz "\347\235\241\347\234\2401s..."
L__str_40:
.asciz "init web framework"
L__str_41:
.asciz "123"
L__str_42:
.asciz "345"
L__str_43:
.asciz "socket id is"
L__str_44:
.asciz "file.kingtous.cn"
L__str_45:
.asciz "443"
L__str_46:
.asciz "url is:"
L__str_47:
.asciz " port is:"
L__str_48:
.asciz "socket connected"
L__str_49:
.asciz "sending get request"
L__str_50:
.asciz "/"
L__str_51:
.asciz "response is:"
.subsections_via_symbols
支持编译器内的函数指针支持HTTPS TLS v1.2加密,基于openssl- json数据的创建、修改
- 支持连接mysql,执行sql语句返回json