.NET框架源码解读之MYC编译器
在SSCLI里附带了两个示例编译器源码,用来演示CLR整个架构的弹性,一个是简化版的lisp编译器,一个是简化版的C编译器。lisp在国内用的少,因此这里我们主要看看C编译器的源码,源码位置是:\sscli20\samples\compilers\myc。
为了简单起见,该编译器实现了C语言的子集,如只支持 int 和void 类型,可以声明静态和局部变量,但是局部变量只能在函数的顶部声明,只支持 if-else、while和for等语句。编译器将C程序编译成MSIL语言,再调用IL编译器产生.NET程序,完整的语法如下表:
| letter ::= “A-Za-z”;
digit ::= “0-9″; name ::= letter { letter | digit }; integer ::= digit { digit }; ident ::= name | function_call; function_call ::= name “(” [expr {, expr}] “)”; factor ::= (ident | integer | “(” expr “)” ); unary_factor ::= [“+”|”-“] factor; term1 ::= [“*”|”/”] factor; term0 ::= factor { term1 }; first_term ::= unary_factor term1; math_expr ::= first_term { [“+”|”-“] term0 } rel_expr ::= math_expr (“==”|”!=”|”<“|”>”|”>=”|”<=”) math_expr; not_factor ::= [“!”] rel_expr; term_bool ::= not_factor { (“&” | “&&”) not_factor }; bool_expr ::= term_bool { (“|” | “^”) term_bool }; expr ::= bool_expr; assign = ident “=” expr; assign_stmt ::= assign “;” ; if_stmt ::= “if” “(” expr “)” stmt_block [ “else” inner_block ]; while_stmt ::= “while” “(” expr “)” inner_block; for_stmt ::= “for” “(” assign “;” expr “;” assign “)” inner_block break_stmt ::= “break” “;”; cont_stmt ::= “continue” “;”; ret_stmt ::= “return” expr “;”; stmt ::= ( if_stmt | while_stmt | for_stmt | break_stmt | cont_stmt | ret_stmt | assign_stmt ); inner_block ::= “{” { stmt } “}”; outer_block ::= “{” { inner_decl } { stmt } “}”; inner_decl ::= [ class ] type ident { “,” ident } “;”; class ::= “extern” | “static” | “auto”; type ::= “int” | “void”; params ::= type ident { , type ident }; outer_decl ::= [ class ] type ident { “,” ident } “;”; func_decl ::= [ class ] type ident “(” params “)” outer_block; |
编译器支持的参数如下表:
| 参数 | 说明 |
| /debug | 生成程序时创建调试信息 |
| /nodebug | 不创建调试信息 |
| /list | 输出MSIL中间源文件 |
| /dll | 创建一个DLL文件 |
| /exe | 创建一个可执行的.exe文件 |
| /outdir:path | 保存输出文件的文件夹 |
整个编译器的架构如下图所示:

.NET框架源码解读之MYC编译器的更多相关文章
- .NET框架源码解读之SSCLI编译过程简介
前文演示了编译SSCLI最简便的方法(在Windows下): 在“Visual Studio 2005 Command Prompt”下,进入SSCLI的根目录: 运行 env.bat 脚本准备环境: ...
- .NET框架源码解读之启动CLR
前面提到在SSCLI环境里运行.NET程序的时候,执行的命令类似java程序的执行过程,即通过clix程序解释执行.net程序.这个过程看起来跟在windows环境下执行.net程序表面上看起来不一样 ...
- .NET框架源码解读之准备CLR源码阅读环境
微软发布了CLR 2.0的源码,这个源码是可以直接在freebsd和windows环境下编译及运行的,请在微软shared source cli(http://www.microsoft.com/en ...
- .NET框架源码解读之SSCLI的调试支持
阅读源码一个比较快的手段就是在调试器里阅读,这样可以在实际运行SSCLI的过程中,通过堆栈跟踪的方式查看完整的程序执行路径. 当在SSCLI环境里执行一个托管程序的时候,堆栈上通常有托管和非托管代码同 ...
- jQuery框架源码解读
1.jQuery 1.9.1 parseJSON: function( data ) { // Attempt to parse using the native JSON parser first ...
- Vue 源码解读(8)—— 编译器 之 解析(下)
特殊说明 由于文章篇幅限制,所以将 Vue 源码解读(8)-- 编译器 之 解析 拆成了两篇文章,本篇是对 Vue 源码解读(8)-- 编译器 之 解析(上) 的一个补充,所以在阅读时请同时打开 Vu ...
- Vue 源码解读(10)—— 编译器 之 生成渲染函数
前言 这篇文章是 Vue 编译器的最后一部分,前两部分分别是:Vue 源码解读(8)-- 编译器 之 解析.Vue 源码解读(9)-- 编译器 之 优化. 从 HTML 模版字符串开始,解析所有标签以 ...
- 基于Docker的TensorFlow机器学习框架搭建和实例源码解读
概述:基于Docker的TensorFlow机器学习框架搭建和实例源码解读,TensorFlow作为最火热的机器学习框架之一,Docker是的容器,可以很好的结合起来,为机器学习或者科研人员提供便捷的 ...
- Restful 1 -- REST、DRF(View源码解读、APIView源码解读)及框架实现
一.REST 1.什么是编程? 数据结构和算法的结合 2.什么是REST? - url用来唯一定位资源,http请求方式来区分用户行为 首先回顾我们曾经做过的图书管理系统,我们是这样设计url的,如下 ...
随机推荐
- [Android] 开发第十一天
MainActivity.java 代码如下: package com.oazzz.test9; import android.support.annotation.Nullable; import ...
- UDP协议发包的使用(DatagramSocket、DatagramPacket)
1.UDP 是User Datagram Protocol的简称, 中文名是用户数据报协议,是OSI(Open System Interconnection,开放式系统互联) 参考模型中一种无连接的传 ...
- ease,seae-in,ease-in-out,ease-out区别
值 描述 linear 规定以相同速度开始至结束的过渡效果(等于 cubic-bezier(0,0,1,1)).(匀速) ease 规定慢速开始,然后变快,然后慢速结束的过渡效果(cubic-bezi ...
- Python中小整数对象池和大整数对象池
1. 小整数对象池 整数在程序中的使用非常广泛,Python为了优化速度,使用了小整数对象池, 避免为整数频繁申请和销毁内存空间. Python 对小整数的定义是 [-5, 256] 这些整数对象是提 ...
- python之CMDB
浅谈ITIL TIL即IT基础架构库(Information Technology Infrastructure Library, ITIL,信息技术基础架构库)由英国政府部门CCTA(Central ...
- Oracle NVL与NVL2函数
nvl( ) 函数 从两个表达式返回一个非 null 值. 语法 NVL(eExpression1, eExpression2) 参数 eExpression1, eExpression2 如果 eE ...
- redis相对关系型数据库的优势
它是键值数据库(非关系),数据查询比关系型数据库快. ps:redis是树状结构,查询快 redis是基于内存的一个数据库,I/O的效率影响较小. ps: 备份数据同步是才进行I/O操作.这个数据同步 ...
- python greenlet 背景介绍与实现机制
最近开始研究Python的并行开发技术,包括多线程,多进程,协程等.逐步整理了网上的一些资料,今天整理一下greenlet相关的资料. 并发处理的技术背景 并行化处理目前很受重视, 因为在很多时候,并 ...
- .net 架构
.net Webservice 三层架构,BLL(业务逻辑层),DAL(数据访问层)sql语句.MODEL模型层也就是实体层Entity(数据库字段和类的定义的映射). UI层(Web/Form)界面 ...
- python初步要点II
[python初步要点II] 1.is & is not 操作符用于测试2个对象是否指向同一个对象,即 id(a) == id(b). 2.整形和字符串对象是不可变对象,python会高效地缓 ...