为啥要尝试写一个呢,自从工作后,感觉就很少接触github了,也没精力去玩啥开源了,但自己还是喜欢学习其他东西,可能多动症???尝试写一个jvm吧,本次选用语言是rust。其实我个人也是rust初学者,到现在,仍然只是会一些简单语法,对于其宏、多线程仍然是跨不过去的门槛,所以本次 只会用一些基础语法来进行开发,目前应该java coder和go coder比较多,我本人也是一个java coder,所以这篇文章,仍然是以java coder能够看懂的情况下来开发。墨滴链接:【https://mdnice.com/writing/60f896096b4a4f6aa55aee6ab8ce4f35】公众号:Azhs的技术小屋(https://mp.weixin.qq.com/s/PTxS_1nnKdYy1Pz6aB0Abg)目前准备分为这么几个部分:command line processingfind class fileparse class fileimplements runtime_datainstruction set and interpreterheap and objectmethod invokearray and stringnativeexception...大概这么几个步骤,可能没有看到GC,我这儿想说的是,选rust的原因就在于它是一门无GC语言,当然如果想模仿一下也是可以,无非就是自己实现一套buffer的申请和回收,这个可以考虑,简单实现难度不大,如果加入动态GC、安全点啥的就挺有难度了,后面再说趴~最后要说的就是我估计进度会很慢,毕竟公司是真滴挺卷的,基本只有周末时间来开发一点点~命令行处理预期效果我可以通过类似java -v 或者 xxx -help的方式看到一些命令, 我的二进制包叫azh, 所以命令如下./target/debug/azh -h./target/debug/azh -v一、环境准备主要是一些必备的tracing日志包、env环境等包的引入[package]name = "azh" # 放你自己想要的名字,build时二进制包的名字version = "0.1.0"edition = "2021"[dependencies]getopts = "0.2.21"tracing = "0.1.37"tracing-subscriber = "0.3.16"二、主要开发2.1 定义Command命令行结构体#[derive(Debug)]pub struct Command {    pub help_flag: bool,      pub version_flag: bool,    pub info_flag: bool,}其中三个属性分别对应命令的help、version、info。2.2 实现command解析: parse_command()方法获取命令行参数let args: Vec<String> = env::args().collect();let program = args[0].clone();let mut opts = Options::new();定义参数的解析方式let opts = opts        .parsing_style(ParsingStyle::StopAtFirstFree)        .long_only(true);opts.optflag("h", "help", "Print help message");opts.optflag("v", "version", "Print version and exit");opts.optflag("", "info", "Print info about azh-jvm");rust是标准的函数式编程,可以在学习过程中慢慢发现它的美。上面代码中有两个点得注意下:ParsingStyle::StopAtFirstFree: 解析时剩余参数不作为标记参数的一部分long_only: 为true时允许使用 -xxx对参数进行匹配let matches = match opts.parse(&args[1..]) {        Ok(m) => m,        Err(err) => {            print_introduction_message(&program, opts);            panic!("{}", err.to_string());        }    };    // 匹配help    if matches.opt_present("help") {        command.help_flag = true;    }    if matches.opt_present("version") {        command.version_flag = true;    }    if matches.opt_present("info") {        command.info_flag = true;    }rust是门很严格的语言,上面的match代码段就是做一个判断,如果parse错误我们要选择什么处理方式,rust的特点就是任何代码,要么success,要么就err,所以当我们考虑了所有的场景后,如果你的代码build成功,基本就不会出现线上问题。相信java coder很容易遇到npe问题(NullPointerException, 我在公司线上遇到过,一个npe 1块钱,我们并发很高,记得那天还是没有直播带货的场景,1s就出现了300来个npe... 当时就请各位同事周会喝奶茶...)print_introduction_message() 方法fn print_introduction_message(program: &str, opts: &mut Options) {    let brief = format!("Usage: {} [-options] class [args...]", program);    info!("{}", opts.usage(&brief));}impl Command {    pub fn print_introduction_message(&self) {        let args: Vec<String> = env::args().collect();        info!(            "------ Usage: {} [-options] class [args...] ------",            args[0]        );    }}上面就基本完成了,最后你只需要cargo build + cargofmt 后如果没有error就构建二进制包成功了,最好也不要有waring、一个好的开发者不应该有任何一个waring出现在屏幕上。然后通过你的二进制包,输入./xxx -h的方式就可以复现我们刚才的命令了~
点赞 23
评论 6
全部评论

相关推荐

小时候觉得老师是很伟大的职业 感觉老师都是人中龙凤才能当 后来考入大学 发现以前的老同学也是公费师范生了 他们什么样什么人品 我还不清楚吗 只能希望他们以后也会有改变 要不纯属耽误孩子 实习之后发现 有的领导 能当上领导也可能运气成分很多 自己决策方面很差 分配给属下的东西自己也说不明白  前些年那些明星 各种塌房 少林寺大师都能有情人和孩子 越长大越发现世界就是个草台班子 以前对不懂的东西有一层羡慕的滤镜 接触之后发现就不是那回事了
RazerYang:其实也是幸存者偏差,你只关注草台班子的部分,所以觉得世界都是草台班子。实际上你每天能安全地从床上醒来,有稳定的天然气、自来水和电力供应,能让你吃上热乎的饭菜,能收到持续稳定的信号去刷手机,花几块钱就能坐地铁从城市的一端快速移动到另一端,花几百块就能在一天之内安全穿越整个国家,这都不是一个草台班子能实现的。燃气、水利、电力、通信、公交、民航,还有最重要的公安和国防,这些都不是草台班子能做的,有无数普通人构筑了你生活的方方面面,而你也将加入他们。
我对___祛魅了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务