豫ICP备17040950号-2

如何实现一个简单的寄存器虚拟机

虚拟机总共有两种,基于栈的和基于寄存器的。栈式的生成字节码会更多,但是单个指令比较简单,虚拟机更好设计。基于寄存器方式实现的虚拟机以后更好优化,执行效率会更高。当然硬件层面的寄存器和内存完全是不同的概念。而软件层面的虚拟寄存器就是数据段的内存。比如基于寄存器的虚拟机都是用一个变量(内存)来模拟寄存器。

虚拟机基于寄存器基于栈的概念和区别

什么是虚拟机

虚拟机是借助于操作系统对物理机器的一种模拟。但是我们今天所讲述的虚拟机概念比较狭义,与vmware或者virtual-box不同,而是针对具体语言所实现的虚拟机。例如在JVM或者CPython中,JAVA或者python源码会被编译成相关字节码,然后在对应虚拟机上运行,JVM或CPython会对这些字节码进行取指令,译码,执行,结果回写等操作,这些步骤和真实物理机器上的概念都很相似。相对应的二进制指令是在物理机器上运行,物理机器从内存中取指令,通过总线传输到CPU,然后译码、执行、结果存储。

寄存器虚拟机

前面说到,虚拟机是真机的一种模拟,而栈虚拟机模拟的是基于栈计算的机器,和现在常见的基于寄存器的硬件机器不同,于是相应的也有基于寄存器的虚拟机,不过这个虚拟机可能跟真机差别比较大

首先可以看看真机用寄存器的原因,计算机的存储有一个规律,访问速度越快的存储,单价(单位容量的成本)越高,因此实际实现的时候,容量会很受限,反之因为便宜而容量可以很大的存储,储存速度就慢,访问速度(或单价)从高到底大致是寄存器,cpu cache,内存,机械磁盘,磁带等,当然也有像ssd这种,介于内存和机械磁盘之间,为了减少耦合和简化设计,cpu的计算是面向寄存器(或类似的计算芯片,例如x86的FPU是基于栈实现,当然这个栈不是内存上的,是硬件内置),对于内存,主要是load和store操作,也就是说,做运算时将数据从内存load到寄存器,计算过后再store到内存里,编译器会分析出某些变量如果store后会被再次load,就不会load,因为已经在寄存器了;或者发现某些变量在一段代码中反复store到内存再load出来使用,可能直接把这些操作都优化了,只保留寄存器操作,可以大幅度提高执行速度。当然,寄存器越多,这种优化的空间就越大

后台参数校验Validator

前言

在日常的开发中,服务端对象的校验是非常重要的一个环节,比如用户注册的时候:校验用户名,密码,身份证,邮箱等信息是否为空,以及格式是否正确,但是这种在日常的开发中进行校验太繁琐了,代码繁琐而且很多。Validator框架应运而生,它的出现就是为了解决开发人员在开发的时候减少代码的,提升开发效率。它专门用来做接口的参数校验,比如:密码长度、是否为空等等。

概述

JSR303 定义了 Bean Validation(校验)的标准 validation-api,但并没有提供实现。Hibernate Validation是对这个规范的实现 ,并且增加了 @Email@Length@Range 等注解。Spring Validation 底层依赖的就是Hibernate Validation

JSR303:JSR303是一项标准,只提供规范不提供实现。定义了校验规范即校验注解如:@Null、@NotNull、@Pattern。位于:javax.validation.constraints包下。
hibernate validation:是对 JSR303 规范的实现并且进行了增强和扩展。并增加了注解:@Email、@Length、@Range等。
**spring Validation: ** 是对Hibernate Validation的二次封装。在SpringMvc模块中添加了自动校验。并将校验信息封装到特定的类中。