【一周总结】第1周__5.28~6.3

2018年5月25日,这是我最后一天上班。休息了个周末,5月28日到南京办了最后的离职手续,然后我就回到自由了。算下来距离大学毕业已过去2年,我计划已久的下一个阶段也终于到来了。

说实话,一上来第一周的状态比我以前预计的要好。没辞职之前我真的反复担心过辞职以后一个人整天闷在房间里会不会因为太单调而失去节奏,还担心过没有合适的娱乐方式的问题。真的开始后心绪反而比上班时平静了许多。辞职前我N次整理自己的想法,力图对自身各方面的问题、对于生活、对于要做的事情能保持一种适当的心情,一种能前进的心理姿态。这其实是非常重要的,但好在现在才发现负面凌乱的想法比预期的少得多了(一周下来貌似都没出现什么负面情绪,这归功于之前的心理准备足呀^ ^)。总之,第一周的状态自我感觉良好,算是个好的开头。

- - - - - - - - -  -- - - - - - - - -- - - - - - - -- - - - - - - -- - - - - - -- - - - -- - - - - -- - - - -- - - - - -- - - - -- - -- - -- - - - -- - -- - - - -- - -- - - -- 

废号少说。写这种一周总结写些什么合适呢?当然是回顾一下本周的进展,而对于我来说,一周的进展几乎等价于本周思考了、解决了哪些问题。所以以下都是回顾梳理本周思考过的问题脉络

周一

本想继续搞辞职前就没解决的一个疑问,是属于编译器前端Parser的:对于一条EBNF产生式,例如Statement :=  NUMBER | STRING | ID | "(" expr ")"  ,  怎样去写Statement这个非终结符Node的parse()? 

在StackOverflow上找到一个通俗易懂的回答: Constructing an Abstract Syntax Tree with a list of Tokens  ,但找了两个项目(tao-language、两周自制脚本语言)对照看了下,发现不止这么简单,那两个项目对于BNF产生式都用代码来逐条转换成了对应的数据结构,后面parse的时候只要编写parse那些数据结构的规则的代码就行了 (?存疑,其实没大看懂…)。

本想找个简单的四则运算Parser看看怎么写的,结果百度相关问题时直接转去另一个问题了:shunting-yard算法(调度场),这是个对中缀表达式进行计算求值的算法。

忽然觉得这样记流水账太麻烦了,接下来还是挑值得一提的问题 简单的点以下吧~

(或者,按问题主题说:我这第一期主要打算学4方面:①C++的使用  ②编译器  ③算法&模型  ④Windows开发

这周主要就是①了,熟悉了一些C++。

过程中总是这样的:本想解决一下A问题,过程中会牵涉到/转移到相关的 B问题,然后B问题可能又转移去C问题…这种情况需要自己注意到,倒不是说不能转来转去,如果觉得相关的问题同样应该了解那就可以随便看,当然最后不能忘了回到A问题

贴段代码吧:

 1 void timed_piece_of_code()
 2 {
 3     std::chrono::milliseconds simulated_work(2);
 4     std::this_thread::sleep_for(simulated_work);
 5 }
 6 
 7 int main() {
 8     auto start = std::chrono::high_resolution_clock::now();
 9 
10     std::cout << "Running some timed piece of code..." << '\n';
11     timed_piece_of_code();
12 
13     auto stop = std::chrono::high_resolution_clock::now();
14 
15     // 浮点毫秒类型 duration<float, milliseconds::period>
16     using FpMilliseconds = std::chrono::duration<float, std::chrono::milliseconds::period>;
17 
18     // 断言:利用traits判断(按模板匹配来确定类型,并使标志值差异):    不是浮点毫秒类型则报警。
19     static_assert(std::chrono::treat_as_floating_point<FpMilliseconds::rep>::value,"Rep required to be floating point");
21 
22     // 注意此处不允许隐式转换    
23     auto i_ms = std::chrono::duration_cast<std::chrono::milliseconds>(stop - start);
25     // 注意此处允许隐式转换
26     auto f_ms = FpMilliseconds(stop - start);
27 
28     std::cout << "Time in milliseconds, using default rep: " << i_ms.count() << '\n';
32     std::cout << "Time in milliseconds, using floating point rep: "<< f_ms.count() << '\n';
    
34 return 0; 35 }

只能说水平低的好处就是进步空间大。上述短短的代码让我这个初学C++的人从中学习了好几个语法点。

比如最基本的namespace的用法。我发现C++的#include<xx.h>类似于在Java中引用另一个项目模块(.h头文件中就是本module提供出来给外部引用的资源接口),而namespace1::namespace2::就等同于Java中的package包路径。

上述代码中最值得一提应当是traits这个东西了,我的理解就是通过模板匹配来区分类型,在特定类型能够匹配到的模板中设置的标志值,比如上述 :

std::chrono::treat_as_floating_point<FpMilliseconds::rep>::value

template<T> treat_as_floating_point 这个struct template就是个traits,当用float来实例化它时,就置标志值value为true,所以这个value的含义就相当于is_float标志。

当然,还有一些杂七杂八的东西,比如熟悉Visual Studio的使用、 创建dll动态库并引用……对了,还抄了个Hello World级别的win32 api的窗口程序,就是WinMain(), WndProc()那个。

最后想说:一个好的学习习惯很重要,比如:1.把一周每天的思路都作为一个sheet页记在Excel里,一周一个文件~  2.把本周看到的、值得回头看的资料保存在一个文件夹内,周末可安排固定时间复习一下。

另外,有效的学习时间才是学习时间,我还需要继续改进。希望早点进化到 自己思考、设计编写想实现的XXX的代码 这个阶段吧,而不是一直看资料、理解看到的代码。

最后的最后放张照片吧:)

猜你喜欢

转载自www.cnblogs.com/nanlan2017/p/9131524.html