关于rustc的一点看法

首先,我不是一个rustc的熟手,也就2018年才开始接触,最近两周又系统了了解了一下基础语法;没有用rustc写过大点的实用系统(3000行以上代码),属于兴趣学习者。

其次,我对编程语言没有什么偏执的热爱,有喜欢的,但没有讨厌的。当前工作用C# 做web后台,sql(oracle 和sqlserver) 作数据处理较多,日常辅助脚本用perl 和clisp 较多,也偶用python,vc++写些简单应用。具体用什么语言编写程序,主要看工作需要,没有具体指定的时候,哪种写起来方便就用哪种。

关于rustc,在技术站点看到较多讨论,也看到不少大佬们的推荐,但一直一来由于本身工作用不到这种语言,所以断断续续的学习,拖了许久。看书期间,结合对c++的理解,感觉rustc的设计理念确有独到之处,期间理念,道理多有体会。不过在自己写程序的时候,被各种编译错误、警告,搞的头大,有种想放弃的感觉,为何呢?感觉这rustc 就是把程序员当傻子一样看,许多强制性要求,让人感觉很不爽,比起python的缩进语法更让人恼火。

       那么什么才是好的编程语言呢? 这个问题,不好说,每个人都会有不同的看法,也没有所谓的标准答案。一直以来,我认为,好的编程语言,应该是语法灵活,简洁,表达力强,给程序员以足够的自由,符合直觉。这要求前提应建立在程序员知道自己在做什么,而不是假设程序员都是SB,经常犯错,需要编译器的各种不必要监督,比如pthon的如何缩进,rustc的如何各种引用形式和生存期限制。一开始写不好,没关系;对于非专业人士,写的不专业也没关系,重要的是能写出来东西,解决问题是首要的。比如,说起来感觉很恐怖的内存泄露问题,在多数时候,都是可以容忍的,因为大多数时候写的程序,不需要一直运行,只是一次一次的执行(每次启动进程,执行时间短,执行后,进程销毁,所有占用资源自会释放)。专业的服务器软件,当然由专业技术人员来编写,作为专业人士,有义务对语言有较高的把控,写出来的程序要有质量保证。总结起来,就是编程语言要有普适性,入门容易,解决初级常见问题;专业级,解决各种问题。

      rustc学习过程中的体会。首先是参考资料较少,且多是英文。对于有多年编码经验的人,熟悉一门编程语言的语法该是比较容易的事情,几天时间就够了,通过编写一些例程,综合试验一下语法,然后边查库参考边写程序,就可以用其解决一些问题了。其次,写起来不自然,感觉比较造作或者说有理有据的造作。最后一点,感觉最为重要,基于trait的实现会使代码较为分散,规模大了后,记忆量增大,整体把控可能较为困难。通过trait实现的所谓面向对象比较牵强。比起老牌c++,java,甚至比javascript的funciton,perl的package都有差距,表现在数据封装不强大,没有继承;基于trait的约束与c#的泛型约束较为相似, 然而,在写rustc的过程中,发现没有帮助文档,比如字符串连接该如何写呢?据以往经验就是直接+或.或append或strcat,都不对,那如何查看String有哪些方法呢?没有。更不用说,关于数据生命期的问题,更是让人不习惯,皆因不合直觉(却又符合rustc的理念),比如下面代码:

    let arr = vec![1,2,3];
    let mut str_init = String::from("");
    let ret_str = arr.iter().fold(&mut str_init,|acc,x| {acc.push_str(&format!("{} ",x)); acc});

    写起来,比较费精神,对于我这种新手,仔细理解起来,还可以理解,就是费神,为何不能简化为 下面的代码,简简单单,只要知道知道基础语法,理解iter和fold方法,就顺手写出来了,可惜,不能编译过。

let ret_str = arr.iter().fold("",|acc,x|acc+x.to_string());

没有比较就没有伤害。下面纯c/c++的写法:

    int i,idx=0;
	int arr[] = {1,2,3};
	char szbuf[100];

	for(i=0;i<sizeof(arr)/sizeof(int);++i){
		idx += _snprintf(szbuf+idx,sizeof szbuf,"%d ",arr[i]);
	}

	szbuf[idx-1]=0;

	printf("%s\n",szbuf);

纯函数式的语言的写法,拿lisp实现如下:

(defvar arr #(1 2 3))
(setf ret_str (reduce (lambda (acc x) (format nil "~a ~a" acc x)) arr))
(print ret_str)

perl实现:

my @arr=(1,2,3);
my $ret_str = join(' ',@arr);
print $ret_str,"\n";

python实现:

arr = [1,2,3]
ret_str = " ".join(map(str,arr))
print(ret_str)

以上比对后,很容易发现以理解起来的难易程序也看,lisp和perl的实现最为直观,其实为python,c/c++,最复杂的就是rustc。如此简单的功能,确定在rustc中涉及了许多的语法要点,复杂性可见一斑。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值