Perl 内部结构详解 -- PerlGuts Illustrated (2 SV)

PA 代码+笔记 1 PA1 –开天辟地的篇章:最简单的计算机 1.1在开始愉快的PA之旅之前 讲义中提到使用union,前面知道CPU的寄存器是公用内存的,所以把gpr[8]结构体改成了union,但是实验报错,然后继续改,看到下面的eax,ecx之类的寄存器,于是在外面又套了一个union,但是还是报错,后来在网上搜,看到简书上面有一个解答,就是在eax,ecx之类的寄存器外面套一个struct,... 阅读详情

_SV_HEAD and struct sv

下面来看一下最简单的类型struct sv,代表了SV,GV,CV,AV,HV,IO的通用结构。如下图所示:


第一个字段Any可以指向任意结构,除了RV,所有的其他类型都是由Any指向的附加数据来实现。
第二个字段REFCNT表明了有多少pointers引用了这个object。初始置为1,当有pointers指向它或者被销毁的时候,这个值需要相应的加1或者减1,当值为0的时候,内存释放。
第三个字段包含了FLAGS & TYPE,是一个32 bit unsigned int。如下图:


常见的flags见下边具体示例。

C:\>perl -MDevel::Peek -e "Dump $a"
SV = NULL(0x0) at 0x182a9fc
  REFCNT = 1
  FLAGS = ()

C:\>perl -MDevel::Peek -e "Dump \$a"
SV = RV(0x299158) at 0x29914c
  REFCNT = 1
  FLAGS = (TEMP,ROK)
  RV = 0x182a9fc
  SV = NULL(0x0) at 0x182a9fc
    REFCNT = 2
    FLAGS = ()


SvIV and SvNV

整数和小树,结构如图所示:


C:\>perl -MDevel::Peek -e "$a = 123; Dump $a"
SV = IV(0x182aa20) at 0x182aa24
  REFCNT = 1
  FLAGS = (IOK,pIOK)
  IV = 123

C:\>perl -MDevel::Peek -e "$a = 123.9; Dump $a"
SV = NV(0x184882c) at 0x182aa2c
  REFCNT = 1
  FLAGS = (NOK,pNOK)
  NV = 123.9

SvPV

字符串,结构如图所示:


除了SV以外,额外的结构xpv被分配,它包含三部分:

PVX 指向实际的字符串。
CUR 标记字符串的长度,PVX+CUR 处的字符应该为'\0',标记字符串的结束。
LEN 标记内存分配给char * 的长度,以4为增量。

POK标记表示PVX所指向的内存包含有效字符串,否则所包含的字符串无效。

C:\>perl -MDevel::Peek -e "$a = 't'; Dump $a"
SV = PV(0x296fec) at 0x182aa24
  REFCNT = 1
  FLAGS = (POK,pPOK)
  PV = 0x182472c "t"\0
  CUR = 1
  LEN = 4

C:\>perl -MDevel::Peek -e "$a = 'test'; Dump $a"
SV = PV(0x296fec) at 0x182aa2c
  REFCNT = 1
  FLAGS = (POK,pPOK)
  PV = 0x182466c "test"\0
  CUR = 4
  LEN = 8 (随着长度增加,以4为增量)

C:\>perl -MDevel::Peek -e "$a = 'test'; $a = undef; Dump $a"
SV = PV(0x296ffc) at 0x182aa34
  REFCNT = 1
  FLAGS = ()  (包含字符串,但是无效)
  PV = 0x1824674 "test"\0
  CUR = 4
  LEN = 8

SvOOK

为了提高移除字符串开头字符的速度,使用了OOK标记,IVX存储着偏移量,结构如图所示:


C:\>perl -MDevel::Peek -e "$a = 'xtesting'; $a=~s/.//; Dump $a"
SV = PVIV(0x182005c) at 0x182aa4c
  REFCNT = 1
  FLAGS = (POK,OOK,pPOK)
  IV = 1  (OFFSET)
  PV = 0x182467d ( "x" . ) "testing"\0
  CUR = 7
  LEN = 11

SvPVIV and SvPVNV

类似字符串,但是PVIV储存了额外的整数或者小数信息,可以根据flag直接进行数学运算,结构如图所示:


C:\>perl -MDevel::Peek -e "$a = '123.0'; 0+$a; Dump $a"
SV = PVNV(0x29838c) at 0x182aa34
  REFCNT = 1
  FLAGS = (IOK,NOK,POK,pIOK,pNOK,pPOK)
  IV = 123
  NV = 123
  PV = 0x1824674 "123.0"\0
  CUR = 5
  LEN = 8

C:\>perl -MDevel::Peek -e "$a = '123testing'; 0+$a; Dump $a"
SV = PVNV(0x298394) at 0x182aa34
  REFCNT = 1
  FLAGS = (POK,pIOK,pNOK,pPOK)
  IV = 123
  NV = 123
  PV = 0x1824674 "123testing"\0
  CUR = 10
  LEN = 12

SvRV

类似指针,指向任意其他结构,结构如图所示:

C:\>perl -MDevel::Peek -e "$a = '123testing'; $b = \$a ; Dump $b"
SV = RV(0x182ab68) at 0x182ab5c
  REFCNT = 1
  FLAGS = (ROK)
  RV = 0x182aa4c
  SV = PV(0x296ffc) at 0x182aa4c
    REFCNT = 2
    FLAGS = (POK,pPOK)
    PV = 0x182467c "123testing"\0
    CUR = 10
    LEN = 12



可视化编程教育随想 前言 之前写了一篇有关apaas/ivx的文章,让我的思路发散到了编程教育,尤其是可视化教育编程方面。不仅因为我是学教育出身,更多的是因为教育是民生基础而编程又是互联网科技的代表。恰巧最近又看了许多华南师范大学焦建利教授对电化教育方面的技术反思文章,遂决定随笔两两记录一下对编程教育、网络学习方面的看法。观点非常主观,若有不同观点不吝赐教。 网络学习的市场潜力在互联网刚兴起时就被嗅探到了,国家当时也... 阅读详情

相关推荐

CrewAI 多 Agent 实战包 v1(Mock免Key跑通+通义千问可选+流水线样例)

本资源是 CrewAI 风格多 Agent 可运行工程包:研究→写作→审校等流水线样例。无 API Key 时自动降级 Mock 引擎跑通;有 DASHSCOPE_API_KEY 时可接真实 CrewAI + 通义千问。含中文 README、samples、smoke 留档、单元测试。本包不含密钥。关联博客:https://blog.youkuaiyun.com/mtl1994

如何将Perl编译成exe文件

如何将Perl编译成exe文件

choclover的专栏 8812

市场销售总监年终汇报必备PPT.pptx

市场销售总监年终汇报必备PPT

实验记录 | 6/16

(9:52)首先理清楚老师的需求。 (1)希望能够完整的复现这个过程。 (2)希望复现的结果足够准确。(就是,你如何证明你的处理过程是正确的?===>复现结果与文献一致) (3)希望你能够理解,这个pipeline 各个环节的意义(这一块我觉得是最难的,你如何理解它每一步的操作?为什么要这样处理?你能否根据自己的实际需求,对其进一步地作出个性化的调整?)。 这三点也是我现在对自己的要求。 接前面的步骤。 我们早上来的时候,发现在out_RNA的结果文件夹中,生成了我们期待的三个文件。 ...

weixin_40640700的博客 925

3U 与 SV630A 伺服实现 CANLINK 通讯

SD410这组参数特别重要,这个32位特别重要,是防止数值乱码的关键。

weixin_42714122的博客 2694

用Matlab机器人工具箱搞定六轴机械臂建模:从DH参数到3D可视化(附完整代码)

本文详细介绍了如何使用Matlab机器人工具箱进行六轴机械臂建模,涵盖从DH参数转换到3D可视化的完整流程。通过正运动学验证、逆解计算和工作空间分析等实战案例,帮助开发者快速掌握机械臂建模技巧,并提供性能优化建议和完整代码示例。

weixin_28733637的博客 359

将Perl解释器加入应用程序中,扩展功能

summary:    本文讲述在应用程序中应嵌入Perl解释器的方法和理由  如果系统需要提供扩展性,让用户可以轻松的加入一些对自己很有用的功能,在应用程序中嵌入一个解释器无疑是最好的选择,你当然可以提供API让用户扩展,但解释型语言简单易用,一般都带有自动垃圾收集,对用户更合适。这个解释器可以是任何语言的,但以比较流行的语言为最佳,这样用户扩展功能时比较容易,因为参考资料和能提供帮助的人都比较

mslk的专栏 3470

中国ETF基金行情数据API接口

上交所:https://tsanghi.com/api/fin/etf/XSHG/daily?token={token}&ticker={ticker} 深交所:https://tsanghi.com/api/fin/etf/XSHE/daily?token={token}&ticker={ticker}

2401_83242712的博客 4030

NJU NEMU

太难了(流泪猫猫头)

qq_44836676的博客 3355

ThinkBook 16p 2024 BIOS降压定频实战:从解锁CFG Lock到AC Loadline调优

高性能笔记本在满载时频繁撞上温度墙,通常源于固件层默认电压冗余过大,而系统级降压工具又受限于CFG Lock锁定。要根治问题,需要从BIOS固件层面理解电压管理机制——AC/DC Loadline参数控制着CPU在不同负载下的电压请求,通过修改这些负载线值可以安全降低电压,解锁CFG Lock后还能让XTU、ThrottleStop等软件调参工具恢复可用。这种BIOS级调优在工程实践中广泛用于改善散热、稳定频率、压降风扇噪音,尤其适用于联想ThinkBook 16p 2024与拯救者Y9000P等采用HX平

weixin_32496547的博客 387

告别手动下载!用Python脚本5分钟搞定NREL风速数据(附完整API调用代码)

本文详细介绍了如何使用Python脚本自动化获取NREL风速数据,从API密钥申请到数据保存的全流程。通过完整的API调用代码和实战技巧,帮助研究人员和开发者高效下载全球高精度风速数据,告别繁琐的手动操作,提升工作效率。

weixin_33724059的博客 297

PA1

PA1.1 1.实现用于模拟寄存器的结构体CPU_state 在nemu\include\cpu\reg.h中。 我们都知道,cpu的寄存器是公用内存的,所以要用到union(这个我记得网上有答案,所以不讲了) 实现后: 2.思考题:在cmd_c()函数中,调用cpu_exec()的时候传入了参数-1,你知道这是什么意思吗? cput_exec()在nemu\...

Z0uY&z#1的博客 2万+

Akamai移动端Sensor数据采集与BMP风控机制深度解析

本文深度解析了Akamai在移动端风控中的核心机制,重点阐述了Sensor数据如何通过采集陀螺仪、加速度计等硬件信息,结合设备指纹生成连续且符合物理规律的行为轨迹。详细剖析了数据从采集、加密校验到通过BMP风控三重验证(校验位、时间差、数据逻辑)的完整流程,并提供了从模拟优化到自建风控模型的实用应对思路。

quiet的专栏 284

Perl 内部结构详解 -- PerlGuts Illustrated (1)

首先看一下Perl data structure。Perl内部称为SV(scalar value), AV(array value), HV(hash value), 此外IV代表integer, NV代表double, PV代表string, RV代表指针,指向另外的任意数据结构。 Perl内部的数据结构之间的关系很像OO,用C structure内存裁减的方式模拟C++的继承。各种结

USTBHacker的专栏 3879

基于CrossSim的存储硬件原型机ANN仿真:MNIST手写数字识别实现与分析

本项目基于CrossSim仿真平台,在存储硬件原型机上实现了MNIST手写数字识别的ANN模型。通过搭建CrossSim仿真环境,设计传统ANN基准模型和考虑硬件非理想特性的CrossSim模型,对比分析了不同配置下的识别性能。实验结果表明,在引入硬件噪声和器件变异的情况下,模型准确率仍能达到95%以上,验证了存储内计算架构的可行性。研究为存储硬件与计算单元融合提供了实验依据,展示了CrossSim在神经形态计算系统仿真中的实用价值。

huanghm88的专栏 596

基于Simulink的自适应控制(Adaptive Control)电励磁同步电动机

目录基于Simulink的自适应控制(Adaptive Control)电励磁同步电动机项目实例1. 项目背景2. 系统架构2.1 电励磁同步电动机模型2.2 三相逆变器模型2.3 自适应控制器(Adaptive Controller)2.4 系统框图3. 模型设计3.1 创建Simulink模型3.2 自适应控制(Adaptive Control)设计3.3 仿真环境搭建4. 参数优化4.1 自动调优5. 实际应用案例5.1 工业驱动系统5.2 风力发电系统6. 结论进一步优化建议需求分析电励磁同步电动机

MHD0815的博客 266

Perl 内部结构详解 -- PerlGuts Illustrated (6 CV)

CV code value,函数的结构,如下图: 下边示例可以看到几个主要参数: 函数所在的Stash & GV。 函数的参数表和临时变量表PADLIST。 D:\Tmp>perl -MDevel::Peek -e "sub a{my ($a,$b,$t); } Dump \&a" SV = RV(0x3a90f0) at 0x3a90e4 REFCNT = 1 FLAG

USTBHacker的专栏 2018

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Perl 内部结构详解 -- PerlGuts Illustrated (4 HV)

HV hash table是最复杂的数据结构,HV使用HE struct表示key/value结构,使用HEK表示key。 GvSTASH 当这个hash表示一个命名空间(模块),STASH指向Perl 语法树的一个节点,用来实现reset。(略过,未搞明白) ARRAY 数组用于分配储存hash值,它的大小必须是2的n次方,当hash为空情况下,ARRAY为NULL

USTBHacker的专栏 9166

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Perl 内部结构详解 -- PerlGuts Illustrated

之前想看一下Perl的实现,无意中搜到了这篇文章,对Perl内部类型的结构解释的很清晰,推荐感兴趣的都仔细看一下,想优化的时候做到心中有数。 接下来的几篇blog将翻译这篇文档中常见类型的部分,做个记录,加深印象,同时也方便大家阅读理解。 PerlGuts Illustrated 直接命令行的方法查看:perl -MDevel::Peek -e "$a = 123; Du

USTBHacker的专栏 2910

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Perl 内部结构详解 -- PerlGuts Illustrated (3 AV)

AV 数组,结构如图所示: 字段ALLOC 指向实际分配的SV 数组的开头地址。 字段ARRAY 指向数组本身的开头地址,由于数组的改变,这个地址比起实际分配的地址,可能会产生一定的偏移。 字段FILL 指向数组本身最后一个位置的偏移。 字段MAX 指向分配的SV 数组最后一个位置的偏移。 C:\>perl -MDevel::Pe

USTBHacker的专栏 2307

c++ 调用 perl 脚本

#include "EXTERN.h" //引用外部的头文件 #include "perl.h" //perl头文件 int _tmain(int argc, _TCHAR* argv[]) { STRLEN n_a; char *embedding[] = {"","test.pl",""}; //perl脚本和参数,第一个为空 //第二个为脚本文件,第三个为脚本的输入参数

sakuraflydance的专栏 2514

Perl 内部结构详解

PerlGuts Illustrated 直接命令行的方法查看:perl -MDevel::Peek -e "$a = 123; Dump $a" 简单的例子用来查看变量内部结构: useDevel::Peek; $a...

chuihe2040的博客 615

Home School Resource

INTERACTIVE SIMULATIONS FOR SCIENCE AND MATHhttps://phet.colorado.edu/

不以己悲的博客 489

NEMU PA1

PA1 简易调试器阅读源代码寄存器结构体功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 阅读源代码 思考题 1:opcode_table 到底是一个什么类型的数组? opcode_table 是结构体类型的数组。 思考题 2:在

qq_45655405的博客 2万+

PA1-3

综合课程设计实验报告PA1实现调试器si/cmd_siinfo/cmd_infox/cmd_Xp/cmd_pw/cmd_wd/cmd_d表达式求值表达式匹配PA1问题程序从哪里开始执行在cmd_c()函数中,调用cpu_exec()的时候传入了参数-1,意义何在框架代码中定义wp_pool等变量的时候使用了关键字static,static在此处的含义是什么,为什么要使用它EFLAGS寄存器的CF位...

qq_39450895的博客 7904

perl里面对子函数的引用

perl里面,对于变量 / 容器的引用,直接加一个"\"即可。但对于子函数来说,引用方式不一样,必须是前面加"\&"

u014210048的专栏 223
上一篇: Perl 内部结构详解 -- PerlGuts Illustrated (1)
下一篇: Perl 最简单配置文件
Bai_Yuanyong
博客等级 码龄24年 46粉丝 53原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值