前段时间翻译了一篇文章 微软是如何重写 C# 编译器并使它开源的,文章讲了微软用 C# 重写 C# 编译器的坎坷路,引发了一些童鞋的思考:用 C# 编写 C# 编译器(Roslyn),那么 C# 编译器本身是由谁来编译的?C# 语言编写了 C# 编译器,而 C# 语言又是由 C# 编译器编译的,这不就是先有鸡还是先有蛋的问题吗? 虽然(博客园)文章下方评论中提出这类问题的人不多(注:除了公众号,我的技术文章一般也会隔天在博客园发布),但我相信有这类疑问的人肯定不少.这个问题提得很好,会产生这个疑…
Coursera上面有Stanford的课程“Compilers”,该课程使用“龙书”作为参考书,并有一个编程项目,完成一个完整的编译器.这个编译器支持的语言称为COOL,是一个面向对象的用于教学的语言,支持完整的面向对象特性.COOL项目给出了一些基础源码,学生在这个基础源码上实现词法分析.语法分析.语义分析(类型检查)和代码生成,词法分析适用flex工具,语法分析适用bison工具,生成的代码是MIPS汇编,能在SPIM模拟器上运行. https://github.com/tuituji/C…
在Java中,我们常常会看到一个类型:Class.并且在类似Person.class,cache.getClass()等代码中见到它的身影. 众所周知,Class是用来描述一个类的类型,而Object是所有对象的最终父对象.那么就会引申出下边的两个结论: 1.如果从对象的角度来看,那么肯定是先有Object对象,其次才有其派生的对象Class. 2.Class表示的是类.对象,肯定是先有类这个概念,其次才有各个类型(抽象的.非抽象的),包括Object. 这就会出现一个问题,到底是先有Class…
我们在实际项目中一般习惯头文件(.h)和源文件(.cpp)分开写,这样做的好处良多,但是如果遇到了类模板,这样可能会有一点儿问题. 我们通过一个例子来看: person.h: #pragma once #include<string> #include<iostream> using namespace std; template<class nameType,class ageType> class Person { public: Person(nameType n…
.NET大牛之路 • 王亮@精致码农 • 2021.07.09 维基百科对编译器的解释是:编译器是一种程序,它将某种编程语言编写的源代码(原始语言)转换成另一种编程语言(目标语言).编译是从源代码(通常为高阶语言)到能直接被计算机或虚拟机执行的目标代码(通常为低阶语言或机器语言)的翻译过程. 在 .NET 平台中,在执行模型的不同阶段有两个不同的编译器:一个叫 Roslyn 编译器,负责把 C# 和 VB 代码编译为程序集:另一个叫 RyuJIT 编译器,负责把程序集中的 IL(中间语言) 代码…
在上一篇文章中有讲到使用反射手写IL代码动态生成类并实现接口. 反射的妙用:C#通过反射动态生成类型继承接口并实现 有位网友推荐使用 Roslyn 去脚本化动态生成,今天这篇文章就主要讲怎么使用 Roslyn 动态生成类. 什么是Roslyn 最初 C# 语言的编译器是用 C++ 编写的,后来微软推出了一个新的用 C# 自身编写的编译器:Roslyn,它属于自举编译器. 所谓自举编译器就是指,某种编程语言的编译器就是用该语言自身来编写的.自举编译器的每个版本都是用该版本之前的版本来编译的,但它的…
.Net 新一代编译器 Roslyn 会带来怎样的影响? Roslyn是微软创建的一个.NET编译器平台,该项目于2014年4月3日开源. 最初 C# 语言的编译器是用 C++ 编写的,后来微软推出了一个新的用 C# 自身编写的编译器:Roslyn,它属于自举编译器. Roslyn动态编译 .Net有了Roslyn后C#.VB.net也具备了脚本语言的优点,不用预先编译就能够运行,同时又具备了预编译语言的特性,执行效率更高 接口的动态实现 随着远程过程调用技术的兴起简化开发过程就成了框架设计开发…
.Net内存泄露原因及解决办法 1.    什么是.Net内存泄露 (1).NET 应用程序中的内存 您大概已经知道,.NET 应用程序中要使用多种类型的内存,包括:堆栈.非托管堆和托管堆.这里我们需要简单回顾一下. 以运行库为目标的代码称为托管代码,而不以运行库为目标的代码称为非托管代码. 在运行库的控制下执行的代码称作托管代码.相反,在运行库之外运行的代码称作非托管代码.COM 组件.ActiveX 接口和 Win32 API 函数都是非托管代码的示例. COM/COM++组件,Active…
作用域与闭包 什么是作用域 编译器 理解作用域 嵌套的作用域 词法作用域 词法分析时 欺骗词法作用域 函数与块作用域 函数中的作用域 隐藏标识符于普通作用域 函数作为作用域 块作为作用域 提升 先有鸡还是先有蛋? 编译器再次袭来 函数优先 作用域闭包 启蒙 事实真相 循环 + 闭包 模块 什么是作用域 作用域是一组定义在何处储存变量以及如何访问变量的规则. 编译器 javascript 是编译型语言.但是与传统编译型语言不同,它是边编译边执行的.编译型语言一般从源码到执行会经历三个步骤: 分词/…
原文:你不知道的js系列 先有鸡还是先有蛋? 如下代码: a = 2; var a; console.log( a ); 很多开发者可能会认为结果会输出 undefined,因为 var a 在 a = 2 后面,好像变量似乎被重新定义了,所以结果会是默认值 undefined. 然而,正确结果是 2. 下面这段代码,a 在 定义之前被引用.不会抛出错误,也不会输出 2 . console.log( a ); var a = 2; 结果输出 undefined. 编译器 回忆一下第(一)节中的内…