使用内联中间语言

使用内联中间语言(Inline IL)

内联中间语言(Inline IL)能够直接在中间语言(intermediate language,IL)中定义函数体,中间语言是 F# 编译后的语言,它主要为语言添加了实现特定低级运算符和函数,比如,加法和box 和 not 的功能。我们很少会用到这个功能,因为F# 库FSharp.Core.dll 已经公开了所有的、可能需要的生成中间语言的功能。然而,有一些极为罕见的情况,不能在 F# 中完成,而只能在中间语言中实现,内联中间语言是很好的选择。

使用内联中间语言很简单,只要把中间语言指令放在括号和#号中间,(# #)。中间语言指令放在字符串中间,使用能够被ilasm.exe 编译的标准记号,它必须是正确的中间语言形式,否则会编译出错;然后,传递参数给中间语言指令,它们被压入中间语言评估栈(IL evaluation stack)中;还必须使用标准的冒号,告诉编译器返回的类型是什么,这要放在括号中间;还需要显式地指定参数类型,因为编译器没有办法出它们的类型。

我们现在看一下使用内联中间语言的示例。假设由于某种原因,我们要使用在 F# 基本库fslib.dll 中定义的加法和减法运算符,用我们自己定义的函数去替换它们。我们定义了两个函数add 和 sub,函数体使用中间语言定义:

// declare add functionusing the IL add instruction

let add (x:int)(y:int) = (#
"add"x y : int #)

// declare sub functionusing the IL sub instruction

let sub (x:int)(y:int) = (#
"sub"x y : int #)

// test these functions

let x = add 1 1

let y = sub 4 2

// print the results

printfn "x: %i y:%i" x y

示例的运行结果如下:

x: 2 y: 2

程序员应该小心使用这种方法,因为写一个毫无意义的程序并不重要,编译器不可能为此而发出警告。考虑下面的的程序,我们修改了一下前面的示例,把 "add" 指令替换成 "ret" 指令,表示是返回值,在这个上下文中没有意义。这个示例在编译时没有错误和警告,但是运行时会出错。

// create a faulty add function

let add (x:int) (y:int) = (#
"ret"x y : int #)

// attempt to use fault function

let x = add 1 1

示例的运行结果如下:

Unhandled Exception: System.InvalidProgramException:Common Language Runtime

detected an invalid program.

at Error.add(Int32 x, Int32 y)

注意

随.NET SDK 发布的一个工具能够帮助检测这种错误,这个工具叫peverify.exe,更多有关这个工具的信息,参见http://msdn2.microsoft.com/en-us/library/62bwd2yd(vs.80).aspx

使用内联中间语言

时间: 2024-12-20 09:08:08

使用内联中间语言的相关文章

Linux C中内联汇编的语法格式及使用方法(Inline Assembly in Linux C)

在阅读Linux内核源码或对代码做性能优化时,经常会有在C语言中嵌入一段汇编代码的需求,这种嵌入汇编在CS术语上叫做inline assembly.本文的笔记试图说明Inline Assembly的基本语法规则和用法(建议英文阅读能力较强的同学直接阅读本文参考资料中推荐的技术文章 ^_^). 注意:由于gcc采用AT&T风格的汇编语法(与Intel Syntax相对应,二者的区别参见这里),因此,本文涉及到的汇编代码均以AT&T Syntax为准. 1. 基本语法规则 内联汇编(或称嵌入汇

去除MathType内联公式后自动生成的空格

使用MathType公式编辑器在Microsoft Word 2016 中输入的内联公式后会自动产生一个空格,每次都需要手动删除.以下是解决办法,不再需要每次输入公式以后都要点键盘上的backspace去删空格. 1. 打开注册表: 开始-运行-regedit 2. 找到 HKEY_CURRENT_USER\Software\Design Science\DSMT6\WordCommands\ 3. 在该目录里增加字符串NoSpaceAfterInline,并将值设置为1. 退出注册表,运行of

关于C++内联函数

关于C++内联函数有以下实验: 有三段测试代码 1.手动展开内联函数. 2.非内联函数. 3.inline标记的内联函数.(函数只有一行代码,以确保函数被内联) 测试三种情况: VS工程在Release版下的有关内联的三个设置选项 1./Ob0 禁用内联展开(默认情况下是打开的). 2./Ob1 只展开标记为 inline 或 __inline 的函数,或在类声明内定义的 C++ 成员函数中的函数. 3./Ob2 展开标记为 inline 或 __inline 的函数和编译器选择的任何其他函数(

内联框架

主文件: <!doctype html> <html> <head> <meta charset="utf-8"> <title>无标题文档</title> </head> <body> <iframe src="text.html" width="500" height="500" name="one"&

java内联函数

在说内联函数之前,先说说函数的调用过程. 调用某个函数实际上将程序执行顺序转移到该函数所存放在内存中某个地址,将函数的程序内容执行完后,再返回到  转去执行该函数前的地方.这种转移操作要求在转去前要保护现场并记忆执行的地址,转回后先要恢复现场,并按原来保  存地址继续执行.也就是通常说的压栈和出栈.因此,函数调用要有一定的时间和空间方面的开销.那么对于那些函数体  代码不是很大,又频繁调用的函数来说,这个时间和空间的消耗会很大. 那怎么解决这个性能消耗问题呢,这个时候需要引入内联函数了.内联函数

内联函数详解

什么是内联性和外联函数 类的成员函数可以分为内联函数和外联函数.内联函数是指那些定义在类体内的成员函数,即该函数的函数体放在类体内.而说明在类体内,定义在类体外的成员函数叫外联函数.外联函数的函数体在类的实现部分. 内联函数在调用时不是像一般的函数那样要转去执行被调用函数的函数体,执行完成后再转回调用函数中,执行其后语句,而是在调用函数处用内联函数体的代码来替换,这样将会节省调用开销,提高运行速度. 内联函数与前面讲过的带参数的宏定义进行一下比较,它们的代码效率是一样的,但是内联函数要优于宏定义

内联函数的定义及说明

一.什么叫inline函数? inline(小心,不是online),翻译成"内联"或"内嵌".意指:当编译器发现某段代码在调用一个内联函数时,它不是去调用该函数,而是将该函数的代码,整段插入到当前位置.这样做的好处是省去了调用的过程,加快程序运行速度.(函数的调用过程,由于有前面所说的参数入栈等操作,所以总要多占用一些时间).这样做的不好处:由于每当代码调用到内联函数,就需要在调用处直接插入一段该函数的代码,所以程序的体积将增大.拿生活现象比喻,就像电视坏了,通过

css中内嵌,内联以及外联的区别

在学习css的过程中,经常会用到内嵌,内联以及外联这三种,接下来我就对于自己所学的一点介绍一下: 1.内嵌 <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title></title> </head> <body> <h1 style="color:red;">

CSS 中的内联元素、块级元素、display的各个属性的特点

CSS的内联元素和块级元素 块级元素<h1>-<h6>.p.dt是不可以内联块级元素的 1.block和inline这两个概念是简略的说法,完整确切的说应该是 block-level elements (块级元素) 和 inline elements (内联元素).block元素通常被现实为独立的一块,会单独换一行:inline元素则前后不会产生换行,一系列inline元素都在一行内显示,直到该行排满. 2.大体来说HTML元素各有其自身的布局级别(block元素还是inline元