ECMA-335 (CLI) 标准 读书笔记——总结CLI类型系统(上)

    看到类型系统的概述时,就忍不住按图索骥,想搞清楚CLI如何定义的整个类型系统。于是翻遍了整个标准,将类型系统中最核心的、与运行平台密切相关的类型定义与说明整理了出来,以供理清思路。

 

    标准的第四部指出,CLI的核心是Kernel Profile,而Kernel ProfileRuntime infrastructure libraryBase Class Library (BCL) 组成。

 

 

·         Runtime infrastructure library CLI提供了编译器需要的服务和从特定格式的文件流中动态调用类型的能力,CLI规范的第二部中指定了这些特定的文件格式。

·         BCL是现代编程语言的一个简单的运行时库,它作为C#语言运行时库的标准,同时也作为CLI标准库的一部分。它提供了类型来描述CLI的内建数据类型,简单的文件存取,定制属性,安全属性,字符串处理,格式化,流,集合等等。

  

这里我们可以看出支持CLI核心特征的Runtime infrastructure library主要由指令系统构成,而BCL则主要由类型系统构成。所以我们研究CLI的核心就要从它的指令系统和类型系统入手。

 

我们先来总结一下CLI的类型系统。

通用类型系统的概述请参考:ECMA- 335(CLI)标准 读书笔记(第一部:概念和架构 8~8.2

类型分为值类型和引用类型。

值类型分为内建值类型和用户定义类型。

引用类型分为自描述、接口、指针和内建引用类型。

 

类型系统里最核心的是内建类型,包括内建值类型和引用类型。其它的特征则可以根据不同的系统平台要求在实现时进行裁减。

 

第二部 7 类型和签名

元数据提供了定义和引用类型的机制。第10章描述了与类型定义相关的元数据,这里不区分类型是类,接口还是值类型。

用于引用类型的机制分为以下两部分:

·         用户定义类型的逻辑描述,该类型被引用但没定义在当前模块中,它们被存储于元数据的表中(22.38章)。

·         编码一个或更多类型引用的签名,除了多种修饰语外。语法非终结符的Type描述了签名中的独特入口。签名的编码在23.1.16章详述。

7.1 内建类型

下面的表详细列出了CLI中所有的内建类型(包括指针类型):

Type ::=

Description

Clause

‘!’ Int32

Generic parameter in a type definition, accessed by index from 0

9.1

| ‘!!’ Int32

Generic parameter in a method definition, accessed by index from 0

9.2

| bool

Boolean

7.2

| char

16-bit Unicode code point

7.2

| class TypeReference

User defined reference type

7.3

| float32

32-bit floating-point number

7.2

| float64

64-bit floating-point number

7.2

| int8

Signed 8-bit integer

7.2

| int16

Signed 16-bit integer

7.2

| int32

Signed 32-bit integer

7.2

| int64

Signed 64-bit integer

7.2

| method CallConv Type ‘*’

‘(’ Parameters ‘)’

Method pointer

14.5

| native int

32- or 64-bit signed integer whose size is platform-specific

7.2

| native unsigned int

32- or 64-bit unsigned integer whose size is platform-specific

7.2

| object

See System. Object in Partition IV

 

| string

See System.String in Partition IV

 

| Type ‘&’

Managed pointer to Type. Type shall not be a managed pointer type or typedref

14.4

| Type ‘*’

Unmanaged pointer to Type

14.4

| Type ‘<’ GenArgs ‘>’

Instantiation of generic type

9.4

| Type ‘[’ [ Bound [ ‘,’ Bound ]*] ‘]’

Array of Type with optional rank (number of dimensions) and bounds.

14.1and 14.2

| Type modopt ‘(’ TypeReference ‘)’

Custom modifier that can be ignored by the caller.

7.1.1

| Type modreq ‘(’ TypeReference ‘)’

Custom modifier that the caller shall understand.

7.1.1

| Type pinned

For local variables only. The garbage collector shall not move the referenced value.

7.1.2

| typedref

Typed reference (i.e., a value of type System.TypedReference), created by mkrefany and used by refanytype or refanyval.

7.2

| valuetype TypeReference

(Unboxed) user defined value type

13

| unsigned int8

Unsigned 8-bit integer

7.2

|  unsigned intl6

Unsigned l6-bit integer

7.2

|  unsigned int32

Unsigned 32-bit integer

7.2 

|  unsigned int64

Unsigned 64-bit integer

7.2 

|  void

No type. Only allowed as a return type or as part of void *

7.2

 

7.4 本地数据类型

CLI的一些实现将运行于现有的操作系统或运行时平台上,这些平台指定的数据类型要执行某些特定的功能。元数据允许通过指定CLI的内建和用户定义类型如何被转换成本地数据或者从本地数据转换过来的方式,与这些本地数据类型进行交互。这些转换信息能被(使用关键词marshal)用于:

  • 方法的返回类型,规定了一个本地数据类型实际被返回的和应该被转换回指定的CLI数据类型。
  • 方法的参数,规定了被调用者提供的CLI数据类型应该被转换成指定的本地数据类型。(如果参数通过引用传递,更新的值应该在调用结束后,从本地数据类型被转换回CLI类型。)
  • 用户定义类型字段,规定了任何企图传递包含该字段的对象的时候,平台方法都应该作一份这个对象的拷贝,用指定的本地数据类型替换这些字段。(如果对象通过引用被传递,更新的值应该在调用结束后被转换回来。)

下面的表中列出了CLI支持的所有本地类型,并提供了每个类型的描述。(更多完整的描述请看第四部分中enum的定义System.Runtime.Interopservices.UnmanagedType,它提供了用于编码这些类型的实际值。)所有0-63的编码值被保留用于向后兼容所有已经存在的CLI的执行。64-127的值被留作将来用于这个和相关标准上。

NativeType ::=

Description

Name in the class

library enum type

UnmanagedType

‘[’ ‘]’

Native array. Type and size are determined at runtime from the actual marshaled array.

LPArray

|bool

Boolean. 4-byte integer value where any non- zero value represents TRUE, and 0 represents FALSE.

Bool

| float32

32-bit floating-point number.

R4

| float64

64-bit floating-point number.

R8

| [unsigned] int

Signed or unsigned integer, sized to hold a pointer on the platform

SysUInt or SysInt

| [unsigned] int8

Signed or unsigned 8-bit integer

U1 or I1

| [unsigned] int16

Signed or unsigned 16-bit integer

U2 or I2

| [unsigned] int32

Signed or unsigned 32-bit integer

U4 or I4

| [unsigned] int64

Signed or unsigned 64-bit integer

U8 or I8

|lpstr

A pointer to a null-terminated array of ANSI characters. The code page is implementation- specific.

LPStr

|lpwstr

A pointer to a null-terminated array of Unicode characters. The character encoding is implementation-specific.

LPWStr

| method

A function pointer.

FunctionPtr

| NativeType ‘[’ ‘]’

Array of NativeType. The length is determined at runtime by the size of the actual marshaled array.

LPArray

| NativeType ‘[’ Int32 ‘]’

Array of Native Type of length lnt32.

LPArray

| NativeType

‘[’ ‘+’ Int32 ‘]’

Array of NativeType with runtime supplied element size. The int32 specifies a parameter to the current method (counting from parameter number 0) that, at runtime, will contain the size of an element of the array in bytes. Can only be applied to methods, not fields.

LPArray

| NativeType

‘[’ Int32 ‘+’ Int32 ‘]’

Array of NativeType with runtime supplied element size. The first int32 specifies the number of elements in the array. The second 1nt32 specifies which parameter to the current method (counting from parameter number 0) will specify the additional number of elements in the array. Can only be applied to methods, not fields

LPArray

 

[例子:

.method int32 M1( int32 marshal(int32), bool[] marshal(bool[5]) )

方法 M1 带了两个参数: 一个int32和一个带有5 bool的数组.

.method int32 M2( int32 marshal(int32), bool[] marshal(bool[+1]) )

方法M2带了两个参数: 一个 int32和一个 bool型数组: 数组元素的个数由第一个参数的值给定。

.method int32 M3( int32 marshal(int32), bool[] marshal(bool[7+1]) )

方法M3带了两个参数: 一个int32和一个 bool型数组: 数组元素的个数由第一个参数的值加上7给定.]

 

接下篇:ECMA-335 (CLI) 标准 读书笔记——总结CLI类型系统(下)

转载于:https://www.cnblogs.com/cubean/archive/2010/04/07/1706657.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/362830.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

centos7安装openjdk8

首先&#xff0c;打开openjdk安装官网 http://openjdk.java.net/install/ 输入安装命令&#xff1a; su -c "yum install java-1.8.0-openjdk" 装完之后会有提示版本跟安装的路径&#xff1b;在/usr/lib/jvm下可以查看到对应的名字&#xff0c;ls-l 配置环境变量&…

CSB文件上传漏洞 -->Day4(图片挂马)

22二号&#xff0c;冬至啦&#xff0c;深圳这边只有5&#xff08;尊嘟好冷啊&#xff09;&#xff0c;写这篇文章的时候都已经是凌晨一点了&#xff0c;相信大部分的人都在温暖的被窝里面了吧&#xff01;&#xff01;&#xff08;可怜的我&#xff0c;还得写writeup&#xff0…

微信小程序禁止刷新之后苹果端还可以下拉的问题

一、问题描述 最近在做一个小程序项目&#xff0c;需要禁止下拉刷新&#xff0c;于是在page.json里面添加了这段话 "enablePullDownRefresh":false 全局关闭下拉刷新&#xff0c;这段话确实禁止了下拉刷新&#xff0c;无论是安卓手机端还是苹果端&#xff0c;但是在…

调试OpenJDK

knowyourmeme.com/photos/531557 THX为mihn 有时调试Java代码还不够&#xff0c;我们需要逐步了解Java的本机部分。 我花了一些时间来实现JDK的正确状态&#xff0c;所以简短的描述可能对开始旅行的人很有用。 我将使用全新的OpenJDK 9&#xff01; 首先&#xff0c;您必须通过…

算法题解:旋转数组的最小数字

题目描述 把一个数组最开始的若干个元素搬到数组的末尾&#xff0c;我们称之为数组的旋转。输入一个非递减排序的数组的一个旋转&#xff0c;输出旋转数组的最小元素。 解题思路 将旋转数组对半分可以得到一个包含最小元素的新旋转数组&#xff0c;以及一个非递减排序的数组。新…

函数的自执行,变量提升和函数提升

其实之前虽然刚开始学习JavaScript的时候经常看到function add(){}、var addfunction(){}、function(){}之类的这种写法&#xff0c;但是具体是什么叫什么却没有去考虑过这个问题…… function add(){}这种写法叫做函数声明 var addfunction(){}这种写法叫做函数表达式 fun…

Python之机器学习-sklearn生成随机数据

sklearn-生成随机数据 import numpy as np import pandas as pd import matplotlib.pyplot as plt from matplotlib.font_manager import FontProperties from sklearn import datasets %matplotlib inline font FontProperties(fname/Library/Fonts/Heiti.ttc) 多标签分类数据…

外汇游乐场

介绍 F X Playground是基于JavaFX的原型制作工具或实时编辑器&#xff0c;它消除了编译Java代码的步骤。 这个概念并不是什么新鲜事物&#xff0c;例如在网络世界中&#xff0c;有许多HTML5 游乐场提供在线编辑器&#xff0c;使开发人员可以快速原型化或尝试各种JavaScript库。…

轻轻松松看懂Spring AOP源码

轻轻松松看懂Spring AOP源码 https://baijiahao.baidu.com/s?id1596466083334197175&wfrspider&forpc 如果对spring的核心容器和JDK动态代理、CGLIB有所了解&#xff0c;接下来再看spring AOP源码会比较容易。文中所有代码片段截图对应的spring版本是5.0。 本文内容曾…

2015年,Web 进入移动时代

最近 Morgan Stanley 发布了一份87页的报告&#xff0c;对 Internet 的未来趋势进行预测&#xff0c;报告显示&#xff0c;移动 Web 目前发展迅猛&#xff0c;包括 Kindle, iPhone, 智能手机&#xff0c;平板电脑&#xff0c;GPS 设备&#xff0c;游戏机在内的无线设备呈爆炸式…

vue2.0移除或更改的一些东西

一、vue2.0移除了$index和$key 虽然说现在很多文章说他们的代码是vue2.0版本的&#xff0c;但是有一些仔细一看&#xff0c;发现并不全是2.0版本&#xff0c;有些语法还是1.0的版本&#xff0c;比如这个$index,$key&#xff0c;这两个压根就不是2.0的写法&#xff0c;2.0早就把…

Java Keystore教程

目录 1.简介 2. SSL及其工作方式 3.私钥 4.公开证书 5.根证书 6.证书颁发机构 7.证书链 8.使用Java keytool的密钥库 9.密钥库命令 10.在Apache Tomcat上使用密钥库和自签名证书配置SSL 1.简介 我们谁没有去ebay&#xff0c;亚马逊买东西或他的个人银行帐户来检查。 您是否认为…

spring AOP源码分析(一)

spring AOP源码分析&#xff08;一&#xff09; 对于springAOP的源码分析&#xff0c;我打算分三部分来讲解&#xff1a;1.配置文件的解析&#xff0c;解析为BeanDefination和其他信息然后注册到BeanFactory中&#xff1b;2.为目标对象配置增强行为以及代理对象的生成&#xff…

attr和prop的区别以及在企业开发中应该如何抉择

attr和prop有很多相同的地方&#xff0c;比如都可以操作标签的属性节点&#xff0c;而且获取的时候都只可以获取到相同节点的第一个&#xff0c;例如这样&#xff1a; $(span).attr(class);和$(span).prop(class);都只能返回第一个span的class 同理做属性的修改和添加,删除也都…

从n个数里面找最大的两个数理论最少需要比较

答案是&#xff1a;nlogn-2 过程是这样的&#xff1a;甲乙比甲胜出&#xff0c;丙丁比丙胜出&#xff0c;最后甲丙比较&#xff0c;甲胜出。。。容易得出找出最大数为n-1次。现在开始找出第二大的数字&#xff1a;明显&#xff0c;第二大的数字&#xff0c;一定和甲进行过比较。…

Java抽象– ULTIMATE教程(PDF下载)

编者注 &#xff1a;在本文中&#xff0c;我们提供了Java教程中的全面抽象。 抽象发生在类级别的设计中&#xff0c;目的是隐藏实现API /设计/系统提供的功能的方式的实现复杂性&#xff0c;从某种意义上讲简化了访问底层实现的“接口”。 此过程可以在越来越“更高”的抽象层次…

用递归方式判断字符串是否是回文

题目要求&#xff1a;使用递归方式判断某个字串是否是回文&#xff08; palindrome &#xff09;回文”是指正着读、反着读都一样的句子。比如“我是谁是我” 设计思想&#xff1a;首先能实现可输出任意字符串&#xff0c;然后定义返回值数据类型&#xff0c;判断递归结束条件的…

Vue.js 相关知识(动画)

1. 简介 Vue 在插入、更新或移除 DOM 时&#xff0c;提供多种不同方式的过渡效果&#xff0c;并提供 transition 组件来实现动画效果&#xff08;用 transition 组件将需执行过渡效果的元素包裹&#xff09; 语法&#xff1a;<transition name””>元素或组件&#xff…

三个水桶等分8升水的问题

目录 智力题目答案问题分析程序代码&#xff08;PHP&#xff09;运行结果小结推荐阅读智力题目 有三个容积分别为3升、5升、8升的水桶&#xff0c;其中容积为8升的水桶中装满了水&#xff0c;容积为3升和容积为5升的水桶都是空的。三个水桶都没有刻度&#xff0c;现在需要将大水…

使用拦截器分析Java EE应用程序的性能下降/提高

在开发具有某些性能要求的Java EE应用程序时&#xff0c;必须在每个发行版之前验证是否满足这些要求。 您可能会想到&#xff0c;哈德森的一项工作每天晚上在某些特定的硬件平台上执行一系列测试测量。 您可以检查已实现的时间并将它们与给定的要求进行比较。 如果测量值与要求…