本文提供的 “栈式过程虚拟机” 的实现,挂在本人的 github 上面,对想要深入了解 “栈式过程虚拟机” 的人,它或许可以起到一个不错的作用,但是本人建议一般性了解就可以了,另外顺带一提:如果你想要依靠它维持生活,在咋们国家是不可能不现实的,到时候你就只有 “多冷的隆冬 恨啊啊啊 在东北玩泥巴” 西北风吹啊吹;差不多这样子的凄惨。

如果你真想要搞 “过程虚拟机” 这方面的东西,或许可以给你一个中肯建议,如果可以进 “Oracle、Google、Microsoft” 里面搞这个东西,那么,不要犹豫的去吧,不然就自己娱乐的玩玩就可以了,不要对任何人提起这个东西否则你会被一帮逗比们说成装逼的,突破国外技术封锁、自主研发是一种美丽的幻想,要是国内有人忽悠喊回国XX公司一定不要回来,国内无论是技术界还是这些个公司的风气各方面就不对,回来只有领药丸被各种政治斗争的关系户给干了。(当然要是一帮真正搞技术的人,在一起弄家公司搞的话,这个可以有!)

准确的说有时我并不明白,你了解某些东西的时候,为什么别人总会把你视作装逼,或许这就是这些人为什么到现在都只是我眼中的很低级 “不入流” 的家伙的缘故把,挂着 “高级工程师”、“架构师” 的名头;干着 “不入流” 的事情,讲着不 “负责任” 的话,装着各种神乎其技的逼,拿着老外的东西当个宝,别人开源就自主就懂了~!可笑吧。

当然 “过程虚拟机” 其实实现并不是大多数人们想象中的那般困难,好比弄弄操作系统内核拿着 “C/C++” 可劲的 “肝” 几个月的时间也能 “肝” 出一个可运行的 “超级简单的玩具内核” 出来,当然还有一点是成熟度、稳定性、效率方面的问题。

我这个人非常憎恶装逼侠,所以本文的内容不建议各位装逼 “大佬” 观看,毕竟我只是个 “小菜鸟” 不是吗?您们都是大佬,当然在这块领域让我真正的崇拜的是搞 “模拟芯片” 真正的大佬,例如 PPU、GPU、CPU、电路芯片模拟,而不是搞 “过程虚拟机” 的大佬,他们之间的技术层次差距应该还是会比较大的,当然 “搞过程虚拟机” 里面还是有真正的大佬;来自一枚小菜鸟的 “盲目的崇拜”!崇拜大佬这是很正常的事情,因为知道它们厉害,看不到之间的距离,所以知道自己有多菜。

栈式过程虚拟机,有很多的缺点也有很多的优点,好的一点就是说编码与实现容易而且容易理解,但坏的一点就是说效率方面会有一些问题,大量的R/D读写栈内存,内存I/O的效能,影响了整体的执行效能,而且它不与 “C/C++”、.NET CLR/JIT[Win32K]、V8-Engine 那般会利用 CPU 的高速缓存与寄存器条目之间进行优化,R/D 读写内存的效率与读写寄存器的效率差距还是有点明显【内存的效率低于R/D读写CPU寄存器条目或缓存的效能】,当然这是利用CPU的振荡态频率高精度测量下的情况【100ns为一个基本单位】,Win32k PDH 中提供了可用于测量CPU振荡态频率的C函数,不过纵然如此,它还是远远比 “过程解释器” 快的多的多,这点不用质疑;

所以 “过程虚拟机” 又分了另外一种类别叫做 “基于寄存器的过程虚拟机” 而,“.NET CLR/JIT[Win32K]、V8-Engine” 都属于这一类型的过程虚拟机,它们可以提供很不错的目标平台原生代码的性能;另外实现一个相对完整一点,super simple 的栈式过程虚拟机,几千行代码的样子应该差不多。

一般做一套 “栈式过程虚拟机” 你首先就需要定义一套 “栈式指令集” 规范,你可以沿用现成或比较熟悉顺手的指令集规范,比如我就比较习惯写 .NET MSIL 中间语言指令集,当然这不等于 “.NET CLR/JIT[Win32K]” 就是 “栈式过程虚拟机”,MSIL指令集是栈式的,但“.NET CLR/JIT[Win32K]” 即时编译后的 native-code 却不是,评价一个 “过程虚拟机” 是不是栈式的,不是看它或者别人怎么说,而是要拿它最终编译并在目标平台执行的 native-code 来说话,否则都是扯淡的,当然 SimpleClr 它只是一个很简单的过程虚拟机,说白了就是拿来搞这玩的东西,所以它只有几十个被实现可用的 MSIL 中间语言指令,当然搞这个东西我大概就花了一天不到的样子,两个中午加一个下午的时间;

不要把它们想的太复杂,没有所谓复杂到不能理解的技术,它们只是有一定的门槛而已,还谈不上去太超前太火星,另外没有学习资料或文献这不是借口;可劲的去 “肝” 不停地去 “悟”,花时间早晚都能整懂,你可以从这里获取到这个虚拟机与即时编译并运行一段IL指令的 demo 的源代码 https://github.com/liulilittle/SimpleClr

另外本人在 github 上挂的代码是可以直接运行的,这类型的东西说再多其实很抽象,当然你是一名搞技术的天才那另当别论,当然既然是天才靠自己 “悟” 就可以了,它们也不是很需要参考这些代码了,最多也就是锦上添点花而已。

namespace SimpleClr
{
    using System;
    using System.Diagnostics;
    using System.Reflection.Emit;
    using System.Runtime.InteropServices;

public static class program
    {
        public delegate int Bootloader();

public unsafe static void Main(string[] args)
        {
            byte[] il =
            {
                clr.Nop,
                clr.Ldc_0, // int i = 0;
                clr.Stloc_0,
                clr.Ldloc_0, // IL_003
                clr.Inc,
                clr.Dup,
                clr.Stloc_0,
                clr.Ldc,
                0, 0, 0, 0, // constant
                clr.Clt,
                clr.Brtrue_s, // i < 1000 then goto IL_003
                3, 0, 0, 0, // label
                clr.Ldloc_0,
                clr.Ret,
            };
            *(int*)Marshal.UnsafeAddrOfPinnedArrayElement(il, 8) = 100000000; // 循环一亿次
            byte[] instructions = clr.Build(il);
            // 固定托管内存请求不要被移动设为非托管内存
            IntPtr address = GCHandle.Alloc(instructions, GCHandleType.Pinned).AddrOfPinnedObject();
            Bootloader bootloader = (Bootloader)Marshal.GetDelegateForFunctionPointer(address, typeof(Bootloader));
            // 把即时编译的函数转换成 bootloader
            int eax = 0;
            Stopwatch stopwatch = new Stopwatch();
            stopwatch.Start();
            {
                eax = bootloader(); // 引导即时编译的函数执行
            }
            stopwatch.Stop();
            Console.WriteLine("ticks={0}, eax={1}", stopwatch.ElapsedMilliseconds, eax);
            Console.ReadKey(false);
        }
    }
}

一个很简单的基于栈式过程虚拟机的实现,它运行目标平台【x86】的原生代码。相关推荐

  1. 50行代码实现的一个最简单的基于 DirectShow 的视频播放器

    本文介绍一个最简单的基于 DirectShow 的视频播放器.该播放器对于初学者来说是十分有用的,它包含了使用 DirectShow 播放视频所有必备的函数. 直接贴上代码,具体代码的含义都写在注释中 ...

  2. 一个很简单的淘宝优惠券搜索助手 大家看看有没有用吧

    一个很简单的淘宝优惠券搜索助手 大家看看有没有用吧 下载地址:http://pan.baidu.com/s/1skRHTDF 转载于:https://www.cnblogs.com/devgis/p/ ...

  3. 一个很简单的淘宝优惠券搜索助手 大家看看有没有用吧 下载地址:http://pan.baidu.com/s/1skRHTDF

    一个很简单的淘宝优惠券搜索助手 大家看看有没有用吧 下载地址:http://pan.baidu.com/s/1skRHTDF

  4. python写一个很简单的Atm机系统,使用pickle模块和json模块来保存数据

    我做的是一个很简单的Atm系统,很多都没约束条件 目的: 用面向对象思维来处理 运用文件的读写 文件的读写用pickle模块和json模块来处理 pickle模块: pickle模块处理数据功能很强大 ...

  5. html案例:模拟一个很简单的聊天框

    html案例:模拟一个很简单的聊天框 实现的代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "htt ...

  6. 64位游戏找call_网络小游戏怎么修改技能满级,满血?教大家一个很简单的修改方法!...

    最近去忙着给小弟培训,都忘记上来发文章了,刚好小弟找了个小游戏练练逆向数据分析,下面就给大家讲讲他是怎么做到修改数据后,达到无限满血,全技能升级完的. 首先介绍几个概念: 网络游戏的变态功能的一般实现 ...

  7. 练习推导一个最简单的BP神经网络训练过程【个人作业/数学推导】

    写在前面: 各式资料中关于BP神经网络的讲解已经足够全面详尽,故不在此过多赘述.本文重点在于由一个"最简单"的神经网络练习推导其训练过程,和大家一起在练习中一起更好理解神经网络训练 ...

  8. 一个很简单的问题:遍历int数组并删掉所有偶数

    一开始想的很简单,使用for循环和if判断进行遍历,如果是偶数则remove.后来发现和arraylist记混了,数组删除的话必须依次向前移一位,然后去掉最后一位. int[] line = {1,2 ...

  9. 一个极简单的基于STM32的精确PWM脉冲计数

    一个极简单的精确PWM脉冲计数 基于hal库,直接上代码. void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim) {if(pl ...

最新文章

  1. .NET学习之Foreach……
  2. metasploit 快速入门(二)信息收集和扫描-续
  3. 雨林木风“115网络U盘”免费永久空间速度还挺快的
  4. 阿里巴巴开源 Dragonwell JDK 最新版本 8.1.1-GA 发布
  5. hive.ql.exec.DDLTask. MetaException(message:java.io.IOException: Attempt to start meta tracker faile
  6. python 04 基础
  7. html div 子元素 过多 卡顿,CSS不定高元素transition动画的解决方案
  8. long类型20位示例_Java Long类reverseBytes()方法与示例
  9. mysql哨兵机制_Redis 哨兵机制以及底层原理深入解析,这次终于搞清楚了
  10. 软件对于英特尔意味着什么?
  11. Caused by: java.net.UnknownHostException: localhost.localdomain: localhost.localdomain的问题解决...
  12. 条款6:明确拒绝编译器自动生成的函数
  13. TinyML与Tensor Flow Lite的关系
  14. 红胖子网络科技博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中...
  15. 阅读YYKit之YYImage实现gif展示
  16. QQ音乐会员QMC格式批量在线转换为MP3格式
  17. 如何实现高性能的在线 PDF 预览
  18. javascript入门到进阶 - js系列一:三种基本的数据结构
  19. 带头结点的单链表的创建(头插法和尾插法)
  20. 全国计算机考试照片传不上去,成人高考报名照片传不上去怎么办

热门文章

  1. 5个准入控制系统的常见问题解答让您进一步了解准入控制系统
  2. 第一个java程序HelloWorld
  3. 为了一亿像素,小米走进“第八号当铺”
  4. 典当行最多能够抵押多长时间
  5. 华为无线wifi设备连接到服务器,华为wifi路由器安装上网的方法
  6. 名悦集团:春节小长假后汽车保养该怎么做
  7. 17、TWS API和IB中的财务顾问
  8. 微信小程序开发之——mpvue开发小程序
  9. 青岛_QST_JavaEE实训_上课环境安装与配置总结
  10. A3Mall开源商城系统