编译原理学习

目标程序-》编译过程-》机器代码(编译过程分为编译器和解释器)编译器作用将目标语言编译为目标等价的语言。而解释器会获取用户输入选择的想要生成的机器代码。(就是可以随意转换)java的字节码。

编译过程:举例:post = inter+arg*60

词法分析(单词词法分析)会整合为单独的语法。post  = id1+id2*60

语法分析(语句分析建立语法树)

语义分析(类型检测以及类型转换)

中间代码生成(跨平台完成的地方。)

代码优化

机器代码生成(机器语言,或者汇编语言)

2.静态和动态区别

(静态变量是先声明在赋值)


这个我自己照着敲了一遍懂了。

还有就是静态初始化时机是在哪个阶段,目前有点蒙。(第一次调用类)

3 。值传递。引用传递

 //值传递,引用传递 (小心别名机制)
        static int x = 10;
        static void Main(string[] args)
        {
            Add(x);//值传递结果10
            Console.Write(x);
            Z z = new Z();
            AddZ(z);//引用调用
            Console.Write(z.r);//结果30
            Console.ReadLine();
        }
       static void Add(int arg) {
            arg = arg * 3;
        }
        static void AddZ(Z arg)
        {
            arg.r = arg.r * 3;
        }

4。语法翻译过程:

前缀表达式,

中缀表达式(我们平时人用的就是9+(3+1)*3+10/2),

后缀表达式(机器识别的。栈和树表示,遇到数字进栈,遇到符号将处于栈顶的数字出栈,进行运算,结果进栈,依次):

    931-3*+102/+  :  1.931 -   2. 923 * 3. 96 + 4. 15 10 2 / 5. 15 5 + 6. 20 

中缀转后缀(遍历中缀左到右,数字输出,符号判断与栈顶符号优先级,若有括号或者优先级底与栈顶符号则栈顶元素依次出栈全部,将当前符号进栈):

        1.9输出    2.+进栈  3.(进栈  4.3输出  5. -进栈 6.)出栈- 7.*进栈 8.3输出 9.出栈*+进栈+ 10.10输出 11./进栈 12. 2输出

        13.输出/+ 

后缀表达式:931-3*+102/+ (大话数据结构有图形实例)

   中缀转前缀:后往前,数字输出,符号判断栈顶符号优先级,大于等于时输出,有括号直接进,在将最终的翻转.

使用var定义变量和object不同,它在效率上和使用强类型方式定义变量完全一样,因为还没运行时编译器就已经根据上下文推断出是什么类型了,所以要比object效率要高。善用隐式类型,在难以确定类型的情况下如将用于存储匿名类型或匿名类型集合时使用会有奇效,在新语法中的使用颇多,是一把编程利器。

中间代码。反射就在这层次处理

只能吸收这么多。后续再补。



猜你喜欢

转载自blog.csdn.net/u013341672/article/details/79892883