picoc编译器初始化过程分析

简单的c语言解释器----picoc 简单的c语言解释器----picoc 说明 picoc 是一款google 开发并开源的c语言解释器,类似于lua解释器解释lua脚本语言,picoc可以直接解释C语言源代码。 源码路径 https://gitlab.com/zsaleeba/picoc 编译 下面说明一下在ubuntu上面对picoc的编译。 编译依赖 libreadline-dev sudo apt-get install libreadline-dev 编译安装 cd picoc make all 使用 交互式模式 # ./pic 阅读详情

前面提过了最近在 分析picoc的源代码,这篇文章先对picoc的初始化流程做一个简要的分析,其中涉及到的知识点做一些简要的解释。

一、关键数据结构Picoc_Struct

Picoc是通过Picoc_Struct数据结构将整个编译过程组织起来的,其定义位于文件“interpreter.h”中。

这个结构比较大,内容也比较多,这里只挑重要的截了两张图。主要需要注意的就是上面图中红框圈出的结构,整个picoc编译器就是依靠这些结构组织起来的,大部分的操作也是围绕着这些结构展开的。初始化流程中会这些结果的功能做介绍,这里先不介绍了。

二、初始化流程

Picoc启动后会对编译器进行初始化,由PicocInitialize()函数实现。由于过程比较清晰,这里就不画流程图了。初始化主要包括以下内容:

(1)平台初始化PlatformInit()

Picoc的平台初始化中只是将断点处理BreakHandler()与系统的程序终止信号SIGINT连接起来,以便使用断点调试功能。

(2)输入输出初始化BasicIOInit()

这个是将编译器的输入、输出和报错与系统的标准输入、输出和报错连接起来。

(3)栈初始化HeapInit()

为编译器使用的栈分配空间,将栈内存对齐,并进行初始化。

栈大小(StackSize):通过getenv获得系统环境变量“STACKSIZE”大小,系统未定义或设置为0则取编译器自定义的值PICOC_STACK_SIZE,大小为512KB,定义如下图。

注意:在C语言中栈(Stack)可以存放函数参数、局部变量、局部数组等作用范围在函数内部的数据,它的用途就是完成函数的调用。因此栈的大小决定了程序中能使用的变量的多少。对每个程序来说,栈能使用的内存是有限的,这个在这里由StackSize决定,程序运行期间不能再改变。如果程序使用的栈内存超出最大值,就会发生栈溢出(Stack Overflow)错误。如果没有改过的话,在 Windows下VS默认是 1MB,在 Linux下GCC默认是 8MB。

栈内存对齐:为什么要对齐?这个一是内存访问的性能原因,一是平台硬件限制原因。在Windows或Linux平台上,编译器默认程序访问的地址必须向8或16字节对齐,即能够被8或16整除,以便提高内存访问效率。当然这个是可以通过预编译命令来修改的。如果你是往非x86的其它平台上移植,需要关注一下这个问题。

从程序上看其实就是把栈帧指针、栈顶指针和栈底指针移到能够被8整除的位置。根据我在Ubuntu18.04上的测试,Picoc默认要是向8字节对齐的。

(4)共享字符串表初始化TableInit()

初始化用于存储共享字符串的表。

原理:需要注册的字符如果不在表中,则计算其哈希值,为其分配空间并将其存入表中;字符串在表中则返回该字符串对应的入口地址。

在table.c的TableSetIdentifier()函数中,当找不到对应的字符串时,重新分配空间。这个位置的分配空间操作有点技巧。先看一下结构定义:

再看下新字符串的空间分配:

新字符串的内存分配是从结构TableEntry的TableEntryPayload处开始,然后长度为IdentLen + 1,其中IdentLen为字符串长度,不含'\0'。然后将字符串值拷贝到该位置:

由于在TableEntry表中定义了一个TableEntryPayload的union,因此NewEntry中具体存储什么内容要看加入数据的时候用的是什么。这里使用的地址是“&NewEntry->p.Key[0]”,后续的代码中也有使用“&NewEntry->p.v.Key[0]”的情况。所以需要去看加入链表的时候给的是什么内容,注意不要搞混了。

这里简单解释一下:共用体union的所有成员占用同一段内存,修改一个成员会影响其余所有成员。结构体占用的内存大于等于所有成员占用的内存的总和(成员之间可能会存在缝隙),共用体占用的内存等于最长的成员占用的内存。共用体使用了内存覆盖技术,同一时刻只能保存一个成员的值,如果对新的成员赋值,就会把原来成员的值覆盖掉。

不清楚union结构的特点的朋友,可以看下这篇文章。

字符串的哈希值计算在函数TableHash()中。这个就是采用固定的计算规则获得字符串的Hash值,这里就不具体分析了,感兴趣的可以自己去看代码。

(5)变量初始化VariableInit()

初始化全局变量名表pc->GlobalTable和字符串名表pc->StringLiteralTable,以及对应的变量值表pc->GlobalHashTable和pc->StringLiteralHashTable。

Picoc这里为了节约空间,将变量的名字和值分开存储,即Table存储所有变量的名称,HashTable存储对应变量的值。

(6)词法分析初始化LexInit()

初始化词法分析相关的关键字表pc->ReservedWordTable和pc->ReservedWordHashTable,并将关键字与Token对应起来。

关键字在注册时会先检查其是否在共享字符串表中,有则直接使用。没找到则重新为其分配内存并存入pc->ReservedWordTable表中。

(7)类型初始化TypeInit()

初始化编译器支持的变量类型数据结构,将各种变量类型的信息存储到pc中对应的结构里。当前支持类型包括:int、short、char、long、unsigned int、unsigned short、unsigned long、unsigned char、void、function、macro、goto、label、double、pointer、array、struct、union、enum、type等。

(8)包含文件初始化IncludeInit()

初始化系统变量和库函数调用,即在编译器的列表pc->IncludeLibList中注册对应的头文件中提供的定义和系统函数,从而将编译器与系统提供的原型定义和函数库连接起来,编程时可以直接使用C语言的底层函数。主要头文件包括:ctype.h、errno.h、math.h、stdbool.h、stdio.h、stdlib.h、string.h、time.h、unistd.h(linux系统)。

(9)库初始化LibraryInit()

这个里面主要是定义了编译器的版本以及大小端的宏。

(10)平台库初始化PlatformLibraryInit()

初始化编译器本身提供的测试函数和打印行号的函数。

(11)调试初始化DebugInit()

初始化调试用断点的数据结构。

三、结论

总结一下,picoc的初始化过程主要是建立编译器运行所需的环境,初始化数据结构和变量定义,并将编译器与系统连接起来。重点需要关注的就是第一部分中提到的那些数据表和堆栈结构,后续会对相关的结构和操作进行详细分析。

这段时间其实一直在研究picoc,但是没有写文章,主要是觉得目前理解的比较浅,怕写错了误导大家^-^。目前基本上是当做学习笔记来写的,发出来是想给初学者理一理思路,有什么问题请大家批评指正~~~

-----------------------------------

原创不易,请多支持!

PicoC:谷歌推出的C语言解释器 htmltable {th, td {th {pre {简介:谷歌开源的PicoC是一个为资源受限环境设计的小型高效C语言解释器。它支持在PC、STM32微控制器等嵌入式设备以及Android平台上运行C代码,无需预编译。PicoC具有强大的可移植性,适用于教育、快速原型设计、实时系统控制和移动应用开发。开发者可以通过研究其源码学习解释器设计,并定制或增强功能。PicoC展示了C语言在多种平台的广泛应用和灵活性。 阅读详情

相关推荐

无人机或其它嵌入式系统上用的类C语言脚本解释器-picoc

无人机或其它嵌入式系统上用的类C语言脚本解释器-picoc

picoc编译器环境搭建及测试

在Win10上面搭建了开源的C语言解释器picoc的编译环境,并进行测试验证。

halps的专栏 1976

C语言解析器PicoC在STM32上的应用

别人的PicoC例程修改了一下,可以继续作脚本语言的功能

picoc编译器脚本运行流程分析

对开源的C语言解释器picoc的脚本解析和运行流程进行简要分析。

halps的专栏 1396

picoc-V2.2-命令行交互-C解释器

不用建工程,可用于测试C语言代码。

Xilinx ZYNQ 7000学习笔记二(FSBL代码分析启动-汇编代码)

Xilinx ZYNQ 7000学习笔记

u011116085的博客 4246

SumatraPDF 内嵌 MuPDF 的 Fitz 上下文(fz_context)完全指南:从创建、异常处理到多线程克隆

`fz_context`(Fitz Context)是 MuPDF 渲染引擎中最核心的全局状态对象:MuPDF 中几乎所有公开函数都把 `fz_context` 结构体作为第一个参数传入。它承载着基于 `setjmp` 的异常栈、资源缓存(resource store)、字体渲染与色彩管理的辅助上下文等关键设施。SumatraPDF 正是在仓库的 [ext/mupdf](https://link.

gitblog_00487的博客 357

从工艺文件到寄生分析:手把手教你用华大九天RCExplorer做版图预检(附ITF文件解析)

本文详细介绍了华大九天RCExplorer工具在模拟IC和版图设计中的应用,从工艺文件解析到寄生参数提取的全流程。通过ITF文件的深度解析和实战案例,帮助工程师掌握金属层、介质层及通孔参数的关键影响,提升设计效率与准确性。文章还提供了与StarRC工作流集成的实用技巧,是国产EDA工具应用的权威指南。

weixin_42522552的博客 405

【亲测免费】 PicoC:轻量级C语言解释器实战指南

PicoC:轻量级C语言解释器实战指南 项目介绍 PicoC是一款微型C语言解释器,专为嵌入式脚本需求设计。它源于zsaleeba的原始作品,目标在于提供一个极简但功能足够使用的C环境,允许开发者在有限资源的环境中执行C风格的脚本。尽管PicoC并不追求完全符合C90标准,但它旨在让多数C程序无需修改即可运行。此外,PicoC通过增强脚本能力超越了传统C的范畴,但在某些高级特性(如存储类、结构体定...

gitblog_00764的博客 1882

海康VisionMaster零代码开发实战:从PLC工程师到视觉专家的捷径

本文为PLC工程师提供了利用海康VisionMaster视觉平台实现零代码视觉开发的实战指南。文章详细阐述了如何通过图形化流程设计替代传统编程,快速搭建视觉检测应用,并实现与PLC的无缝通讯,是工程师从设备控制迈向视觉系统集成的有效捷径。

weixin_29201859的博客 293

Synopsys的CoreConsultant使用简析

CoreConsultant使用简析

weixin_58165606的博客 1万+

PicoC 开源项目使用手册

PicoC 开源项目使用手册 项目概述 PicoC 是一个微型的 C 语言解释器,专为脚本编程设计。它源自 zsaleeba/picoc,并经过定制,旨在提供一个轻量级的解决方案,让开发者能够在不需要编译的环境中执行 C 风格的代码。尽管它不实现 C90 标准的所有特性,但PicoC足够贴近原始标准,使得大部分程序无需修改即可运行。 1. 项目目录结构及介绍 PicoC 的项目结构紧凑,以下是其主...

gitblog_00241的博客 1256

双翌视觉系统配合机械手大视野定位案例(单目标带角度抓取)

一、定位原理概述 1.系统构架 视觉定位系统采用正向打光方式,光源在机械手上方,CCD从上往下拍摄,进行图像分析定位。相机将计算出的像素坐标转换为机械手的物理坐标,视觉软件与机械手进行网口通讯,将视野内物料的物理坐标发送给机械手,机械手抓取物料放在指定工位。 2.相机标定概述 系统采用宫格标定确定像素坐标和物理坐标一一对应关系,同时利用3点或者多点旋转标定求出旋转中心 系统采用宫格标定,自定义行列数和间距及旋转角度,通过机械手发送的当...

weixin_51554164的博客 2171

树莓派pico C开发点滴(一)

树莓派pico C语言开发中IO中断处理的一点点

anod的专栏 509

别再纠结了!车规MCU选M7还是R52?一张图看懂你的车身控制器/域控制器该用谁

本文深入探讨车规MCU选型中Cortex-M7与Cortex-R52的核心差异,提供基于安全等级与实时性需求的选型决策图。通过对比ASIL认证、实时性能及成本效益,帮助工程师在车身控制器/域控制器设计中做出精准选择,避免潜在风险与隐性成本。

weixin_42628688的博客 397

vue:npm安装pnpm报错,npm ERR! code ENOTFOUND,npm ERR! syscall getaddrinfo,npm ERR! errno ENOTFOUND详细排查解决!

vue2 vue3,npm install -g pnpm 安装出现错误,安装pnpm及解决安装失败问题,解决 npm无法安装pnpm问题,npm 安装 pnpm 时 报错 npm ERR! code ENOTFOUND,pnpm无法安装报错,vue npm install -g pnpm安装报错,request to http://registry.cnpmjs.org/pnpm failed, reason: getaddrinfo ENOTFOUND registry.cnpmjs.org,安装pnp

✅ 精选推荐文章 3608

pico编译器c语言,picoc

tiny-c-interpreterthis is a github mirror of picoC (http://code.google.com/p/picoc/)picocPicoC is a very small C interpreter for scripting. It was originally writtenas a script language for a UAV's on...

weixin_42405890的博客 1065

《ESP32单片机基础入门》第2章:开发环境搭建

【代码】《ESP32单片机基础入门》第2章:开发环境搭建。

2301_79143213的博客 579

构建一个轻量级的嵌入式虚拟平台,开发工程用板stm32 picoc解释器,大量自定义函数,sarm拓展,lwip移植,nes模拟器移植,系统优化,等等技术的融合

起初想到这个想法的时候,完全是起源与mtk手机上的一个冒泡开发实验系统,在这套系统上移植一个一个picoc的嵌入式c语言解释器,我就在想能不能在嵌入式上也跑上这个解释器,在嵌入式上运行许多的应用程序,其他的嵌入式芯片只需要移植我这个平台就可以了,到目前为止,项目的函数的构建已经完成了一大半,只有网络与对话框等没有完成,还存在一定的bug 这个轻量级的嵌入式虚拟平台,开发工程用板stm32 picoc解释器,大量自定义函数,sarm拓展,lwip移植,nes模拟器移植,系统优化,等等技术的融合 在这个虚拟平台

LOTOOHE的博客 7714

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

PicoC:仅 3500 行代码的 C 解释器,让资源受限设备直接跑 C 脚本

一块只有几百 KB 内存的飞行控制器想在线调试一段 C 逻辑,装不下完整编译器,也没法每次都重新烧录固件——这就是 PicoC 要解决的问题:一个体量极小的 C 语言解释器,让你用标准 C 的语法在目标机器上直接执行脚本和交互命令。 ## 定位速览:是什么,取舍在哪 PicoC 是一个解释执行的 C 运行环境,最初为无人机的机上飞控系统编写,现在同样适用于机器人、嵌入式及普通脚本场景。核心源码

gitblog_00527的博客 407

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

PicoC 开源项目 FAQ

PicoC 开源项目 FAQ 项目基础介绍 PicoC 是一个极简的 C 语言解释器,旨在提供轻量级脚本功能。它起源于作为无人机飞行系统上的脚本语言需求,之后因其小巧灵活,适应了更广泛的机器人、嵌入式以及其他非嵌入式应用领域。核心代码仅约3500行,专注于提供C语言的基本要素,不追求ISO C标准的完整实现。编译后的体积小,对代码空间和数据空间的需求非常低,适合资源有限的小型嵌入式设备。PicoC...

gitblog_01156的博客 831

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

C语言解析器PicoC在STM32上的应用:为嵌入式开发提供新视角

C语言解析器PicoC在STM32上的应用:为嵌入式开发提供新视角 去发现同类优质开源项目:https://gitcode.com/ 项目介绍 在嵌入式开发领域,C语言一直以其高性能和高效率占据核心地位。而PicoC,一种轻量级的C语言解析器,为开发者提供了一种新的编程方式。本项目提供了一份经过修改的PicoC例程,专门适配STM32平台。通过此项目,开发者可以在STM32设备上直接运行C语言脚本...

gitblog_06790的博客 516

如何用Task构建工具实现微前端多团队协作的终极方案

在现代软件开发中,**微前端架构**和**多团队协作**已成为大型项目的标配。然而,随着项目规模的扩大,构建流程的复杂性也呈指数级增长。Task作为一款现代化的跨平台构建工具,为微前端架构提供了完美的解决方案。本文将深入探讨如何利用Task构建工具实现高效的微前端多团队协作方案,帮助团队提升开发效率和构建速度。 [![Task构建工具微前端架构示意图](https://raw.gitcode.c

gitblog_00764的博客 443

Picoc C语言解释器的STM32平台移植

Picoc C语言解释器的STM32平台移植 Picoc是google开源代码项目中看到的一个项目,其初衷貌似是要做一个在小的嵌入设备上的C解释器。它的核心代码只有3500行左右,可读性不错,虽然没有实现完整的ISO C标准,基本的C运行库还是具备了。 picoc代码上看,基本有如下几块:lex词法解析,table一个基本数据结构(用于存放变量),是个字符串hash表,heap管理内存分配(包

zerokkqq的专栏 7501

SylixOS C语言解释器

在做HMI的时候,经常会用到一种叫做脚本的东西,可以自定义的实现一些逻辑控制等工作。这种自定义的逻辑控制可以对设备进行简单编程,而不需要重新开发软件,非常适合自动化的相关应用。 在使用SylixOS时,也想使其具备脚本功能,浏览相关资料发现已经支持了一个C语言解释器Picoc。Picoc是google开源代码项目中的一个项目,其初衷是在一个小的嵌入式设备实现c语言的解释执行。其核心代码只有4

zerokkqq的专栏 2234
上一篇: CODESYS开发教程2-设备添加
下一篇: CODESYS开发教程3-IO控制
--莫名--
博客等级 码龄24年 653粉丝 35原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值