00.一个JVM语言的诞生

由于方才才获悉博客园文章默认不放在首页的, 原创文章主要通过随笔显示, 所以将文章迁移到随笔;

这篇帖子将后续更新, 欢迎关注! 这段时间要忙着春招实习, 所以项目更新会慢一点,

语言组织也会比较随意, 毕竟时间有限, 没办法太过雕琢琢磨了.

源码github仓库, 如果这个系列对您有帮助, 请您给我一个小小的star!

本节提纲

  1. 写在前面

  2. 文章目录

  3. 先修技能/工具

  4. Cva文法-grammar推导式

  5. 说明

  6. Cva程序样例

写在前面

从屏幕前的你搜索到这篇博文开始, 我们就要开始一篇实现自己的JVM语言系列了, 目前国外有大佬做了

一个Enkel语言, 还有翻译教程, 不过恕我直言教程太跳了, 很多细节语焉不详, 也可能是翻译的原因,

所以我希望写一个国人的自制JVM语言系列教程, 在这之间我已经完成了github项目, 语言已经能实现很多

基本的Java的特性(方法, 循环, 简单的面向对象与继承), 你可以直接使用之, 在此基础上构建你的项目,

或者大家可以一起提交修改, 让Cva成为一个更棒的语言我们将其名字暂定为Cva, 开始也有想过比较霸气的alloy,

但是看到这好像已经是一个语言了, 当然, 目前我们的语言这么菜, 也不好意思叫Alloy(其实叫Cva都是我脸皮厚,

哈哈

为什么叫Cva, 其实我一开始的设想是这个语言的最终目的是兼容C(但愿吧, 毕竟C的类型系统和很多糟粕还是没必要学着),

目前是相当小相当菜的一个子集, 毕竟C的语法还是相当复杂, 现在毕业找工作的压力比较大, 所以这个项目

真正对C兼容还是有很长的路要走的

不过人嘛, 梦想总是要有的, 写一个编译器有一个自己的语言何不是很多程序员毕生的梦想? 为了写这个语言,

笔者从去年11月开始尝试了很多方法, 有github上其他同学的大作业, 有读龙书虎书鲸书, <两周自制脚本语言>,

有网易云Coding 迪斯尼的自底向上, 前前后后推翻了很多方案, 改了很多版本, (说实话自底向上真的太抽象了,

相当劝退), 最终完成这个项目却不过区区十来天, 主要是过年那段时间, 每天废寝忘食地写代码提交,

经常半夜构思想的睡觉都睡不着, 经过长时间的积累

最终算是勉强完成了一个差强人意的版本把, 在这里由于春招临近的缘故, 笔者不得不收心去准备春招实习面试,

所以把这个项目的教程写完后可能就暂时停止更新, 至于再见的时间? 我也不清楚, 可能是春招结束放荡的大四

(但是万一要提前去公司实习干活呢?), 所以有点遥遥无期的意味

不过这些文章会将一个编译器从0到1的实现过程, 尽可能简单易懂地展现给大家, 当你读完这个系列的文章,

理解了编译器(其实本文基本都是前端, 后端基本都被JVM做完了, 后面我可能会写一个自制JVM系列,

不过在这之前还是先推出自制操作系统和实现TCP/IP协议栈系列吧)加上我前期调教好的代码,相信即使你是小白,

也能快速定制自己的需求, 快速书写出一个自己的语言!

文章目录


01.从0实现一个JVM语言之架构总览

架构总览目前完成度较低, 因为可能要等我写完大部分文章后才会回头梳理一下架构.

02.从0实现一个JVM语言之词法分析器-Lexer

03.从0实现一个JVM语言系列之语法分析器-Parser

先修技能/工具

  1. 比较熟练的JavaSE基础即可

  2. JDK1.8及以上版本, 源码中有大量利用了Java8函数式特性的地方

  3. jasmin汇编器, 在github仓库的lib目录下

Cva文法

Grammar 推导式

Program
-> pkg com.company.proj; // 包名目前是可有可无的. 没啥用
-> call com.company.somepkg; // 导包目前也是摆设, 可有可无
-> EntryClass(入口类, 拥有main方法, 位置是任意的)
| EntryMethod
| ClassDeclList EntryClass
-> class Entry(默认为Application)
{
retType main()
{
StatementList
}
} ClassDeclList
-> ClassDecl
| ClassDecl ClassDeclList ClassDecl
-> class Identifier
{
VarDeclList MethodDeclList
}
| class Identifier : Identifier
{
VarDeclList MethodDeclList
} VarDeclList
-> VarDecl
| VarDecl VarDeclList
| VarDecl -> Type Identifier; MethodDeclList
-> MethodDecl
| MethodDecl MethodDeclList
| MethodDecl -> Type Identifier (FormalList)
{
VarDeclList StatementList return Expr;
} FormalList
-> Type Identifier
// formal就是形参, args;
| Type Identifier, FormalList
| Type -> int
-> boolean
... 其他的目前还不支持
-> Identifier StatementList
-> Statement
| Statement StatementList
| Statement
-> { StatementList }
// 多条语句构成Block, 要加上大括号限定域;
| if (Expr) Statement else Statement
| while (Expr) Statement
// write 也可以是writeln, writef, writef目前不支持;
| write(Expr);
| Identifier = Expr; Expr
-> Expr Op Expr
| Expr.Identifier(ExprList)
| IntegerLiteral
| Identifier
| this
| new Identifier()
| Const ...(包括const int, true, false)
| !Expr
| (Expr) Op -> +
| -
| *
| <
| && ExprList
-> Expr
| Expr, ExprList
| Identifier -> [A-Za-z_][A-Za-z0-9_]* IntegerLiteral -> [0-9]+ LineComment -> // the total line is comment

说明

  • 目前Cva支持 int boolean 两种基本类型, 进阶类型支持 string 支持自定义的类类型
  • 在类类型中支持字段和实例方法, 不支持静态方法, 不支持方法重载/重写,

    不支持访问权限控制(默认为 public ), 支持继承(若无显式父类声明,

    则默认继承自 Object 类型), 但不支持显式调用父类方法
  • 支持 if/if-else while for 的分支和循环控制, 支持方法调用)
  • 运算符支持 基本运算 + - * / % && = . ! <

    自增运算 ++ --

    以及位操作运算 & | ^ >> << >>> 等其他运算符

    域限定符 { } ( ) ;``, 比较运算支持 <, 逻辑运算支持 && !
  • 支持引导的C家族的 // 行注释以及 /* ... */ 块注释
  • 字段和变量仅支持声明后赋值或者声明时初始化
  • 编译器目前仅支持将所有代码写在同一个文件内部, 需要有一个入口main方法(可以没有main类,

    仅有main方法, 但编译器会自动生成Application类), main 方法支持空参, 也支持仅有一个

    string[]传入命令行参, 当然目前也没有去处理, 只是个摆设

由以上文法给出的Cva程序样例

class Entry
{
/**
* This is the entry point of the program;
*/
int main(string[] args)
{
echo "Hello, CvaWorld\n";
// 打印整形 statement
println(new FibCalcer().compute(10));
return 0;
}
} class FibCalcer
{
int compute(int num)
{
int total;
if ( num < 1)
{
// 花括号是可以不要的, 但是我们的代码要遵守阿里巴巴Cva规范(滑稽);
total = 1;
}
else
{
total = num * (this.compute(num - 1));
}
// 目前不支持提前 return, 挺遗憾的;
return total;
}
}

当然, main方法也有野的写法, 但目前Cva仅支持将main方法这么写

int main(string[] args)
{
echo "Hello, CvaWorld\n";
return 0;
}

即main类不需要定义, 只需要声明main方法即可, 当然, 这不过是语法糖一颗,

编译时会自动加上默认主类名Application(这样会出现的名称冲突问题暂时还没解决)

00.从0实现一个JVM语言系列的更多相关文章

  1. 04.从0实现一个JVM语言系列之语义分析器-Semantic

    从0实现JVM语言之语义分析-Semantic 源码github, 如果这个系列文章对您有帮助, 希望获得您的一个star 本节相关语义分析package地址 致亲爱的读者: 个人的文字组织和写文章的 ...

  2. 03.从0实现一个JVM语言系列之语法分析器-Parser-03月01日更新

    从0实现JVM语言之语法分析器-Parser 相较于之前有较大更新, 老朋友们可以复盘或者针对bug留言, 我会看到之后答复您! 源码github仓库, 如果这个系列文章对你有帮助, 希望获得你的一个 ...

  3. 01.从0实现一个JVM语言之架构总览

    00.一个JVM语言的诞生过程 文章集合以及项目展望 源码github地址 这一篇将是架构总览, 将自顶向下地叙述自制编译器的要素; 文章目录 01.从0实现一个JVM语言之架构总览 架构总览目前完成 ...

  4. 05.从0实现一个JVM语言之目标平台代码生成-CodeGenerator

    从0实现JVM语言之目标平台代码生成-CodeGenerator 源码github仓库, 如果这个系列文章对你有帮助, 希望获得你的一个star 本节相关代码生成package地址 阶段性的告别 非常 ...

  5. 02.从0实现一个JVM语言之词法分析器-Lexer-03月02日更新

    从0实现JVM语言之词法分析器-Lexer 本次有较大幅度更新, 老读者如果对前面的一些bug, 错误有疑问可以复盘或者留言. 源码github仓库, 如果这个系列文章对你有帮助, 希望获得你的一个s ...

  6. 00 你的第一个C语言程序

    C语言简介 C 语言是一种通用的.面向过程式的计算机程序设计语言,即编程语言. 为移植和开发 UNIX 操作系统,丹尼斯·里奇于1972年在贝尔电话实验室设计开发了 C 语言的第一个版本. C 语言同 ...

  7. JVM基础系列第1讲:Java 语言的前世今生

    Java 语言是一门存在了 20 多年的语言,其年纪比我自己还大.虽然存在了这么长时间,但 Java 至今都是最大的工业级语言,许多大型互联网公司均采用 Java 来实现其业务系统.大到国际电商巨头阿 ...

  8. 用SignalR 2.0开发客服系统[系列5:使用SignalR的中文简体语言包和其他技术点]

    前言 交流群:195866844 目录: 用SignalR 2.0开发客服系统[系列1:实现群发通讯] 用SignalR 2.0开发客服系统[系列2:实现聊天室] 用SignalR 2.0开发客服系统 ...

  9. JavaRebel 2.0 发布,一个JVM插件

    JavaRebel是一个JVM插件(-javaagent),能够即时重载java class更改,因此不需要重新部署一个应用或者重启容器,节约开发者时间. JavaRebel 2.0的新特征: 改变了 ...

随机推荐

  1. B - How Many Tables (多少桌)

    题目大致意思: 有n个人在一起吃饭,有些人互相认识.认识的人想坐在一起,不想跟陌生人坐.例如A认识B,B认识C,那么A.B.C会坐在一张桌子上. 给出认识的人,问需要多少张桌子 Today is Ig ...

  2. P4074 [WC2013]糖果公园 树上莫队带修改

    题目链接 Candyland 有一座糖果公园,公园里不仅有美丽的风景.好玩的游乐项目,还有许多免费糖果的发放点,这引来了许多贪吃的小朋友来糖果公园游玩. 糖果公园的结构十分奇特,它由 nn 个游览点构 ...

  3. poj 2318TOYS

    poj 2318(链接) //第一发:莽写(利用ToLefttest) #include<iostream> #include<algorithm> #include<c ...

  4. POJ 3189

    题意: 给你B个谷仓和n头牛,每个谷仓最多容纳m头牛.此时每头牛对每一个谷仓都有一个喜悦值,你需要把每一头牛都安排某个谷仓内,并且找出来那个每一头牛对它所住的谷仓打的分值,我们对这所有的分值取一个区间 ...

  5. hdu5497 Inversion

    Problem Description You have a sequence {a1,a2,...,an} and you can delete a contiguous subsequence o ...

  6. URAL - 1635 哈希区间(或者不哈希)+dp

    题意: 演队在口试中非常不幸.在42道考题中,他恰好没有准备最后一道题,而刚好被问到的正是那道题.演队坐在教授面前,一句话也说不出来.但教授心情很好,给了演队最后一次通过考试的机会.他让这个可怜的学生 ...

  7. 牛客编程巅峰赛S1第11场 - 黄金&钻石 B.新集合 (DFS)

    题意:有\([1,n]\)这\(n\)个数,构造集合,集合中不能包含\(u\)和\(v\),问最多能构造多少个集合. 题解:被这题卡了一整场.....以为是推公式,结果答案是暴搜? ​ 首先我们先用一 ...

  8. Python 实现多线程的几种方式

    threading.Thread 模块 继承实现: import threading import time class TestThread(threading.Thread): def __ini ...

  9. ssh原理及加密传输

    1.ssh??(保证过程中是加密的,即安全的)ssh 是 Secure Shell 的缩写,是一个建立在应用层上的安全远程管理协议.ssh 是目前较为可靠的传输协议,专为远程登录会话和其他网络服务提供 ...

  10. 用阿里云ecs部署kubernetes/K8S的坑(VIP、slb、flannel、gw模式)

    1 阿里云ecs不支持keepalived vip 1.1 场景描述 本来计划用keepalived配合nginx做VIP漂移,用以反代多台master的apiserver的6443端口,结果部署了v ...