RPP - 国产开源编程语言
为什么需要它?
理由一:目前DIY操作系统一般使用gcc+nasm,RPP支持编译运行,抽象能力强过C,可直接内联汇编,不需要面对难看的AT&T汇编,绝对是您DIY操作系统的利器(支持GRUB从U盘或硬盘引导)。
理由二:RPP以静态类型为主,没有GC,所以理论运行速度和C++一样,最终的效率肯定比动态类型的lua要高,并且不会引起GC停顿。(目前运行速度与luaJIT接近,比tcc略快)
下面是RPP性能测试数据:(双重循环求和,具体测试代码请参考rpp.pdf)
理由三:RPP与C/C++互相调用比lua还简单,而且RPP和C++共享进程内存空间,RPP变量和C++变量生命周期相同,不会出现像lua一样的这里变量已经GC了那边还在使用。
理由四:RPP既可以编译运行又可以解释运行,既可以用静态类型又可以用动态类型。语法层支持C++、JS、Lisp、python、asm混合编程,一种语言,五种语法。(目前兼容50%的C++语法,70%的C语法,编译器本身使用C++编写,其90%的源码都可以自我编译)
RPP的整体设计:
RPP编码风格1:(这是标准C++语法,本段代码可用VC++、G++或RPP进行编译)
static rbool inherit_proc(tsh& sh, tclass& tci, int level = 0)
{
if (level++ > c_rpp_deep)
return false;
if (tci.vfather.empty())
return true;
rbuf<tword> v;
for(int i = 0; i < tci.vfather.count(); i++)
{
rstr cname = tci.vfather[i].vword.get(0).val;
tclass* ptci = zfind::class_search(sh, cname);
if (ptci == null)
{
ptci = zfind::classtl_search(sh, cname);
if (ptci == null)
return false;
}
if (!inherit_proc(sh, *ptci, level))
return false;
v += ptci->vword;
}
v += tci.vword;
tci.vword = v;
return true;
}
RPP编码风格2:(类似python的无花括号风格)
bool next_permutation<T>(rbuf<T>& v)
{
if v.count <= 1
return false
next = v.count - 1
for
temp = next
next--
if v[next] < v[temp]
mid = v.count - 1
for !(v[next] < v[mid])
mid--
swap<T>(v[next], v[mid])
reverse<T>(v, temp)
return true
if next == 0
reverse<T>(v, 0)
return false
}
RPP编码风格3:(类似《算法导论》的伪代码)
define ← =
void insertion_sort(rstr& a)
{
for j ← 1 to a.count - 1
key ← a[j]
i ← j - 1
while i >= 0 && a.get(i) > key
a[i + 1] ← a[i]
i ← i - 1
a[i + 1] ← key
}
RPP编码风格4:(Lisp风格,从v1.91开始S表达式用逗号分隔)
void main()
{
int a
int b
[int, =, [a, 1]]
[int, =, [b, 2]]
[rf, print, [[int, +, [a, b]]]]
}
理由五:RPP自由度极高,完全开源,您可以随意DIY运算符的优先级,增加新运算符,增加修改“内置类型”,甚至于int、double这些基础类型都是由用户自定义的,一切由您做主。
理由六:它是C++的山寨版,C++程序员几乎无需学习即可使用,而且RPP所有数据类型和C++二进制兼容,无论是静态链接还是动态链接,想怎样就怎样。
理由七:它以Lisp作为中间层,编译器在运行期可用,程序在运行时可以改变其结构,新的函数可以被引进,因此支持mixin、元编程以及各种动态特性,并且同时支持call_by_name、call_by_need和call_by_value。
理由八:RPP对C++的一些复杂语法进行了简化,单纯的编译速度比C++略快。但是RPP在解释运行的时候并不会一次编译整个程序,而是在函数需要运行的时候才进行即时编译(边运行边编译),所以综合编译速度比C++快一个数量级(仅与VC++和G++对比)。
理由九:RPP的设计目标是简洁、快速、稳定。它的源码结构比lua简单得多,但实现的功能不比lua少,因此RPP将是您实现编译器的绝佳参考。另外嵌入编译器只需要包含一个头文件即可(zmain.h),您再也不用担心各种奇怪的链接错误了。
RPP支持多种运行方式,方法如下:(各种运行方式支持的特性请参考rpp.pdf)
JIT:
- cd到bin目录
- 命令行敲入 rjit example\1.h
JIT打包发布(生成独立EXE):
- cd到bin目录
- 命令行敲入 rpack example\1.h
- 成功后会生成example\1.exe,可脱离RPP环境运行
解释运行:
- cd到bin目录
- 命令行敲入 rpp example\1.h
下面是RPP编写的控制台贪食蛇:
编译运行(生成EXE):
- cd到bin目录
- 命令行敲入 build_run example\1.h
编译不运行(生成EXE):
- cd到bin目录
- 命令行敲入 build example\1.h
执行语法检查(不生成任何文件):
- cd到bin目录
- 命令行敲入 rcheck example\1.h
裸奔(无操作系统运行):
- cd到bin\nasm\
- 敲入 bin cell.h (成功后会生成 cell.bin)
- 修改 menu.lst 将引导文件改为 cell.bin
- 使用 bootice(或其它工具)制作 grub4dos 引导扇区
- 将 cell.bin、menu.lst、grldr 三个文件拷贝至U盘或硬盘根目录
- 推荐先使用虚拟机进行测试
cocos2dx win32 绑定运行:
(仅v1.83及以下版本支持,新版本正在重构cocos2dx绑定)
- cd到bin目录
- 命令行输入 rcc cocos\flappy.h(需要VS2012运行库和最新的opengl驱动)
cocos2dx android 绑定运行:
(仅v1.83及以下版本支持,新版本正在重构cocos2dx绑定)
- 安装cocos\rcc.apk
解释运行方式可以关联.h文件:(这样就不用每次敲命令行)
- 右键点击bin\example下任意一个.h文件,选择“属性”
- 点击“更改”
- 点击“浏览”
- 找到bin\rpp.exe并点击“打开”
- 选中“始终使用选择的程序打开这种文件”
- 点击两次“确定”
- 之后可以直接双击后缀为.h的源文件运行RPP程序
第三方IDE编辑代码:
- 运行bin\ide\SciTE.exe
- 点击File->Open
- 选择bin\example\1.h,点击“打开”
- 按F5运行程序(F7打包发布)
Windows窗体模式:(WinMain)
- cd到bin目录
- 命令行敲入 rjit_win example\win.h
- 或者使用IDE打开win.h,按Ctrl+F5运行或者Ctrl+F7打包发布
使用scite可以自动补全代码,但不如Visual Assist的智能补全。
Visual Assist智能补全请看视频演示:
http://www.tudou.com/programs/view/40Ez3FuqE10/
编译RPP源码:
- 确保安装了 VS2012 update4 或者 VS2013
- 打开proj\rpp.sln
- 按F7,成功后会生成bin\rpp.exe
低版本VC++编译RPP源码:(VS2005、VS2008、VS2010)
- 修改RPP源码中使用了C++11 move语义的地方(或者回退到RPP v1.87及以下版本)
- 新建控制台解决方案
- 添加rpp\rpp.cpp
- 设置项目属性为多字节字符集
- 设置运行库为“多线程MT”(可选)
- 按F7,成功后会生成bin\rpp.exe
自动测试example下所有例子:
(如果您修改了编译器源码,请运行这个批处理)
- 双击bin\check_all.bat
RPP没有协议,任何人可以随意使用、复制、发布、修改、改名。
QQ交流群:34269848
E-mail:[email protected]