刘晓玲这样说的话,方远肯定知道她的意思,因为比较的话就有伤害,并且对自己的错会错自己的锐气,所以说他也没有当场反驳刘晓玲,但是对方远这种就是说自制力很强,然后能力也很强的人来说,越是比较的话越是能提升他,他一直在总结别人为什么比自己要强的原因。
方远在他心中的话,他既然报考了研究生并且也考上了,所以是他在还是在不停的提升自己,对他来讲的话,最薄弱的就是服务器代码的编程,然后刘晓玲最薄弱的也是这个位置,然后每天他们都在讨论服务器代码编程的思路,这一天刘晓领有遇到一个很难解决的问题,对方远说道你能知道这行代码所表达的什么意思吗?它为什么能用在服务器编程上面?
这个其实是别看他的那个,嗯就是代码很长,但他在服务器编程里面算是比较简单的,你看到没有这个再买的话,放在这一排它的作用是这样的,然后方也开始掩饰着啊,刘小林在旁边一直看着方言演示,大概过了半个小时,方言真的把所有的bug问题都解决了,然后刘小林夸奖他说的,关羽你真的是够厉害的,我几天的百得百思不得其解的事情你一下子就解决了。
没有,你也不要老是看着我马在马我在马的时候你也要跟着我一起码,只有那样的话你才可以提升自己,你你看着我一会儿就忘记了,我看你也没做笔记,所以说这一点的话很关键,然后我就给你详细介绍一下,写代码的一个流程,还有自己的思路,还有一些方法,但是这些可能就是说投机取巧的方法的话,你还是要从基础上面说起。
好的方远,你说的这些的话我一定会铭记于心的,我也被不停的在实战中你不停的努力的,其实是我刚才确实一直盯着你在忙,我自己也没动手,这一点我真的很欠缺。
我发现你对买码代码有点恐惧症了,这都4年多了,应该不会再有这种夜马拉近100万的代码吧,像这种服务器编程也要涉猎的看来我们两个人出去的话在公司就是必须是资深工程师,在一些公司的话一个初级初级,嗯程序员再到初级工程师,再到资深工程师的话,肯定是要经过上上10年的工作积累,但是我们进公司的话一定要起点比他们高,所以说你这个时候就要严格要求自己,每一个细节都要做到位。
方远这样说的话,刘晓玲听得全神贯注,她也不否认他确实是对码代码有一些恐惧症,但我这算这事不是一时半会儿能够解决的,都需要长期的一个磨合过程的,还有需要一个不断的经经验总结的一个过程。
码代码主要要注意以下几点,其实是初级工程师到资深工程师都要经历了一个步骤,所以说你要把这些东西牢记于心里面。就拿现在的代码我跟你举个例子:
在rva的语义和流程分析上,我偷了很大的懒,基本等于没做,因为觉得做起来太麻烦了。流程分析可以在一段语法上完全没有问题的代码中,找出可能有问题的代码,这个不同编译器支持程度也不同,其实在绝大多数情况下,不做这个问题也不大,不过rva面对了一个相关的不可逃避的问题,因为它和python一样有一个特性:若一个函数或方法最后没有return,则自动return一个空对象,rva中是nil,python中则是none,比如:
funcf():
prt"helloworld"
f最后应该隐式returnnil根据实现的不同,这个问题也有各种程度的解决办法最简单的就是编译器不做任何处理,采用解释器执行,无论是解释ast还是字节码,若一个函数执行到最后还没有return,虚拟机就自动returnnil另一个简单方法是,无论何种情况,给函数后面加一个returnnil即可,虽然会造成下面这种情况:
funcf():
return0
returnnil
但这在语法上是正确的,执行也没有问题,只是最后的return永远执行不到而已,就是占用代码空间
不过rva并不能用上述这两种方式,原因有两点:
1rva的实现可能是(也是目前唯一的方式)转换为其它代码,而其它语言的编译器可能很严格,如果rc不报错,而是转换后的代码报错,会增加排错难度
2为提高效率,rva引入了类型推导,在第二种做法下,会对类型推导产生干扰,例如,一个函数中所有return都是t型表达式。
原本可以将其返回类型推导为t,但增加一个returnnil的额外代码会改变这个结果。而另一种方式,如果先推导函数返回类型,再根据返回类型为object或t在代码最后补returnnil或return0,这就和语言规范冲突了。
因为rva规定没有显式return的情况下returnnil
ps更激进一点的意见是,直接改语言规范,在没有显式return的情况下,返回值未定义,不过目前没有往这个方向走,其实将来可以在这方面做努力的,下面会提rva在这个问题上采用了一种简单的折中处理,直接检测函数的最后一个语句,若没有return则补一个returnnil,不过不能简单检测最后一个语句就是return,比如如下代码:
funcf(a):
ifa==0:
return123
else:
return456
其实这种嵌套return也只有if语句的情况,编译器需要判断最后一条语句“必定”return,则分三种情况:
1没有嵌套语句块的语句,只需要判断是不是return即可
2for、while循环,虽然嵌套了语句块,但是不能保证一定能执行语句块,即根本不进入循环,所以也不会“必定”返回,不需判断。
3if语句,需判断
if语句的判断规则是,一个if语句必定return,当且仅当它带else部分,且所有语句块都必定return
这是一个递归定义,所以判断的算法也是递归的,很简单
ps目前还没有实现for和while的带else语法,如果像python一样有forelse和whileelse语法,上述第2条就不成立了,对于for和while也需要判断,而且算法更复杂些
很明显rva目前这种做法是不完善的,比如对这种代码:
funcf():
return
a=0
因为我比较懒,就只检测了最后一条语句,但另一方面我认为这种代码比较少,所以就没详细考虑,不过要做似乎也不是很难,只需要循环检测stt_list即可,后面有空再改进
------------------------------------------