首页 文章 精选 留言 我的

精选列表

搜索[解释型编程语言],共10000篇文章
优秀的个人博客,低调大师

Snow 编程语言 v0.8.0 发布: 支持字符串转义、常量与 Docker 自动构建

更新内容 新增功能 字符串增强:支持转义符与 Unicode 字符,新增字符串转义/反转义工具类(Demo26)。 访问控制:下划线开头函数仅限模块内部调用,提升封装性(Demo25)。 常量与语义分析: 新增 const 关键字与全局常量表,支持跨模块常量查找与折叠。 新增成员访问表达式与语义分析器,改进 FunctionChecker 扫描策略。 改进 IR 指令生成逻辑,支持浮点数(Demo23、Demo24)。 构建与发布:优化 Windows/Linux 并行构建,新增统一发布脚本与 Docker 自动构建支持。 性能与稳定性 修复字符串常量在 .water 文件写入时的断行问题,VM 执行期可正确还原。 优化全局变量处理、常量折叠与声明语句的语义分析逻辑。 发布脚本简化,减少冗余错误提示与配置。 Bug 修复 修复字符串常量在 VM 与 .water 文件写入时的表示错误。 修复全局变量声明与作用域相关报错,提升语义分析健壮性。 开发者体验提升 新增 Demo22–Demo26 测试与运行配置,覆盖字符串、私有函数、常量等场景。 更新测试配置文件,移除无用注释与调试参数。 如遇到使用问题,欢迎及时 提交 Issue

优秀的个人博客,低调大师

Snow 编程语言 v0.7.0 发布: 数组支持、类型推断与全局安全等多项增强

更新内容 新增功能 支持标准 URL 格式,增强模块兼容性与可用性。 编译器增强错误定位功能,定位信息更精准,便于问题排查。 支持一维及多维数组类型和字面量,丰富数据结构支持。 数组元素赋值、访问和数组常量递归序列化,提升数组操作能力。 检查和禁止全局变量重复声明,保证变量唯一性和安全性。 支持数组下标访问类型分派,类型推断更智能。 支持模块函数调用自动省略当前模块前缀,提升模块内调用便捷性。 性能和稳定性改进 优化数字字面量的语义分析与错误提示,提升溢出检测准确性与用户体验。 修复常量类型在 VM 中的表示问题,区分浮点数、双精度、长整数,防止类型混淆。 优化常量生成逻辑,提升代码可读性和维护性。 重构关键字与标准库、模板代码,整体代码更规范,结构更清晰。 移除词法分析器中的调试代码,保持代码整洁性。 重构 VM 相关生成逻辑,移除冗余字段,简化结构。 开发者体验提升 IDEA 配置和运行配置文件优化,便于本地开发和演示。 多个 Demo、BugFarm 测试项目重构和完善,测试流程更加流畅。 命令行 debug 标志统一为 --debug,使用体验一致。 优化和完善文档及代码注释,增强代码可读性与维护性。 Bug 修复 修复数字字面量溢出、类型后缀、位宽符号等边界条件相关问题。 修复 NumberTokenScanner 误判和死循环问题,增强词法分析健壮性。 修复变量作用域与寄存器别名导致内外循环变量互相影响的问题,保证作用域隔离。 修复语法分析、词法分析等边界条件 Bug,提升整体稳定性。 修复模块内函数自动补全和语义分析相关问题,确保符号解析准确。 修复全局变量重复声明问题,保障全局作用域安全。 文档改进 移除废弃的字面量后缀(如 i、d),文档更清晰。 更新 README 和相关说明文档,确保文档与代码同步。 完善方法与命令行文档主描述,参数显示更清晰,注释更完善。 如遇到使用问题,欢迎及时 提交 Issue

优秀的个人博客,低调大师

木兰编程语言重现:完善函数功能,常用字拆分数据处理实例

注:项目目标见码云代码库 为方便使用 Python 的标准库与第三方库,支持了函数调用时指定形参名的方式,比如下面代码第一行打开文件的encoding="utf-8": 与之相关,定义函数时可以指定形参默认值,也一并添加。 这段代码是为了获取常用汉字的拆字数据。源数据包括了几万汉字的信息比如: U+4FC7 俇 ⿰亻狂 U+4FC8 俈 ⿰亻告 U+4FC9 俉 ⿰亻吾 U+4FCA 俊 ⿰亻夋 首先写了个简单的常用字库,用以判断一个字是否属于常用的 2500 字(详见源码)。 上图的代码是过滤了源数据,只取出了常用字中,拆分出的部分也属于常用字的部分,并输出到 json 文件。比如: "圣": { "字型": "⿱", "部分": [ "又", "土" ] }, "地": { "字型": "⿰", "部分": [ "土", "也" ] }, 通过此段实例代码,验证了添加的函数功能,并发现了一些字符串转义处理上的问题并修复。 另外,将字典中无键的反馈信息中文化: d = {1 : 'a', 3 : 'c'} print(d[4]) 反馈: (..•˘_˘•..) 字典中不存在此键:4 见第2行:print(d[4]) 代码统计 下面是几个主要部分的代码行数统计,格式为:上周->本周。 测试 木兰测试用例:1090 -> 1228 运行测试.py,检验所有木兰测试代码片段:148 -> 151 test语法树.py,确保生成的语法树与原始版本一致。修复并添加:63 -> 67 实现:2075 -> 2130 分析器/语法分析器.py:886 -> 916 分析器/语法树.py,功用/调试辅助.py,包括对 ast 库的中文封装:271 -> 284 演示高亮.py:98 -> 100 环境.py,加载木兰模块:88 -> 89 功用/反馈信息.py:43 -> 45 未变 分析器/词法分析器.py:187 中.py,主程序:35

优秀的个人博客,低调大师

图解golang里面的读写锁实现与核心原理分析了解编程语言背后设计

基础筑基 读写锁的特点 读写锁区别与互斥锁的主要区别就是读锁之间是共享的,多个goroutine可以同时加读锁,但是写锁与写锁、写锁与读锁之间则是互斥的 写锁饥饿问题 因为读锁是共享的,所以如果当前已经有读锁,那后续goroutine继续加读锁正常情况下是可以加锁成功,但是如果一直有读锁进行加锁,那尝试加写锁的goroutine则可能会长期获取不到锁,这就是因为读锁而导致的写锁饥饿问题 基于高低位与等待队列的实现 在说golang之前介绍一种JAVA里面的实现,在JAVA中ReentrantReadWriteLock实现采用一个state的高低位来进行读写锁的计数,其中高16位存储读的计数,低16位存储写的计数,并配合一个AQS来实现排队等待机制,同时AQS中的每个waiter都会有一个status,用来标识自己的状态 golang的读写锁的实现 成员变量 结构体 type RWMutex struct { w Mutex // held if there are pending writers writerSem uint32 // 用于writer等待读完成排队的信号量 readerSem uint32 // 用于reader等待写完成排队的信号量 readerCount int32 // 读锁的计数器 readerWait int32 // 等待读锁释放的数量 } 写锁计数 读写锁中允许加读锁的最大数量是4294967296,在go里面对写锁的计数采用了负值进行,通过递减最大允许加读锁的数量从而进行写锁对读锁的抢占 const rwmutexMaxReaders = 1 << 30 读锁实现 读锁加锁逻辑 func (rw *RWMutex) RLock() { if race.Enabled { _ = rw.w.state race.Disable() } // 累加reader计数器,如果小于0则表明有writer正在等待 if atomic.AddInt32(&rw.readerCount, 1) < 0 { // 当前有writer正在等待读锁,读锁就加入排队 runtime_SemacquireMutex(&rw.readerSem, false) } if race.Enabled { race.Enable() race.Acquire(unsafe.Pointer(&rw.readerSem)) } } 读锁释放逻辑 func (rw *RWMutex) RUnlock() { if race.Enabled { _ = rw.w.state race.ReleaseMerge(unsafe.Pointer(&rw.writerSem)) race.Disable() } // 如果小于0,则表明当前有writer正在等待 if r := atomic.AddInt32(&rw.readerCount, -1); r < 0 { if r+1 == 0 || r+1 == -rwmutexMaxReaders { race.Enable() throw("sync: RUnlock of unlocked RWMutex") } // 将等待reader的计数减1,证明当前是已经有一个读的,如果值==0,则进行唤醒等待的 if atomic.AddInt32(&rw.readerWait, -1) == 0 { // The last reader unblocks the writer. runtime_Semrelease(&rw.writerSem, false) } } if race.Enabled { race.Enable() } } 写锁实现 加写锁实现 func (rw *RWMutex) Lock() { if race.Enabled { _ = rw.w.state race.Disable() } // 首先获取mutex锁,同时多个goroutine只有一个可以进入到下面的逻辑 rw.w.Lock() // 对readerCounter进行进行抢占,通过递减rwmutexMaxReaders允许最大读的数量 // 来实现写锁对读锁的抢占 r := atomic.AddInt32(&rw.readerCount, -rwmutexMaxReaders) + rwmutexMaxReaders // 记录需要等待多少个reader完成,如果发现不为0,则表明当前有reader正在读取,当前goroutine // 需要进行排队等待 if r != 0 && atomic.AddInt32(&rw.readerWait, r) != 0 { runtime_SemacquireMutex(&rw.writerSem, false) } if race.Enabled { race.Enable() race.Acquire(unsafe.Pointer(&rw.readerSem)) race.Acquire(unsafe.Pointer(&rw.writerSem)) } } 释放写锁 func (rw *RWMutex) Unlock() { if race.Enabled { _ = rw.w.state race.Release(unsafe.Pointer(&rw.readerSem)) race.Disable() } // 将reader计数器复位,上面减去了一个rwmutexMaxReaders现在再重新加回去即可复位 r := atomic.AddInt32(&rw.readerCount, rwmutexMaxReaders) if r >= rwmutexMaxReaders { race.Enable() throw("sync: Unlock of unlocked RWMutex") } // 唤醒所有的读锁 for i := 0; i < int(r); i++ { runtime_Semrelease(&rw.readerSem, false) } // 释放mutex rw.w.Unlock() if race.Enabled { race.Enable() } } 关键核心机制 写锁对读锁的抢占 加写锁的抢占 // 在加写锁的时候通过将readerCount递减最大允许加读锁的数量,来实现对加读锁的抢占 r := atomic.AddInt32(&rw.readerCount, -rwmutexMaxReaders) + rwmutexMaxReaders 加读锁的抢占检测 // 如果没有写锁的情况下读锁的readerCount进行Add后一定是一个>0的数字,这里通过检测值为负数 //就实现了读锁对写锁抢占的检测 if atomic.AddInt32(&rw.readerCount, 1) < 0 { // A writer is pending, wait for it. runtime_SemacquireMutex(&rw.readerSem, false) } 写锁抢占读锁后后续的读锁就会加锁失败,但是如果想加写锁成功还要继续对已经加读锁成功的进行等待 if r != 0 && atomic.AddInt32(&rw.readerWait, r) != 0 { // 写锁发现需要等待的读锁释放的数量不为0,就自己自己去休眠了 runtime_SemacquireMutex(&rw.writerSem, false) } 写锁既然休眠了,则必定要有一种唤醒机制其实就是每次释放锁的时候,当检查到有加写锁的情况下,就递减readerWait,并由最后一个释放reader lock的goroutine来实现唤醒写锁 if atomic.AddInt32(&rw.readerWait, -1) == 0 { // The last reader unblocks the writer. runtime_Semrelease(&rw.writerSem, false) } 写锁的公平性 在加写锁的时候必须先进行mutex的加锁,而mutex本身在普通模式下是非公平的,只有在饥饿模式下才是公平的 rw.w.Lock() 写锁与读锁的公平性 在加读锁和写锁的工程中都使用atomic.AddInt32来进行递增,而该指令在底层是会通过LOCK来进行CPU总线加锁的,因此多个CPU同时执行readerCount其实只会有一个成功,从这上面看其实是写锁与读锁之间是相对公平的,谁先达到谁先被CPU调度执行,进行LOCK锁cache line成功,谁就加成功锁 可见性与原子性问题 在并发场景中特别是JAVA中通常会提到并发里面的两个问题:可见性与内存屏障、原子性, 其中可见性通常是指在cpu多级缓存下如何保证缓存的一致性,即在一个CPU上修改了了某个数据在其他的CPU上不会继续读取旧的数据,内存屏障通常是为了CPU为了提高流水线性能,而对指令进行重排序而来,而原子性则是指的执行某个操作的过程的不可分割 底层实现的CPU指令 go里面并没有volatile这种关键字,那如何能保证上面的AddInt32这个操作可以满足上面的两个问题呢, 其实关键就在于底层的2条指令,通过LOCK指令配合CPU的MESI协议,实现可见性和内存屏障,同时通过XADDL则用来保证原子性,从而解决上面提到的可见性与原子性问题 // atomic/asm_amd64.s TEXT runtime∕internal∕atomic·Xadd(SB) LOCK XADDL AX, 0(BX) 更多文章可以访问www.sreguide.com 本篇文章由一文多发平台ArtiPub自动发布

优秀的个人博客,低调大师

《TCP/IP Sockets编程(C语言实现) (第2版)》 代码下载(链接以及文件打包)

作者所属大学Baylor的网站,在相关的页面上提供了下载。 http://cs.ecs.baylor.edu/~donahoo/practical/CSockets2/textcode.html 后来发现这篇日志访问挺高的,干脆自己打个包放上来了。 http://files.cnblogs.com/wuyuegb2312/Sockets%E7%BC%96%E7%A8%8B%E6%BA%90%E7%A0%81.rar 本文转自五岳博客园博客,原文链接:www.cnblogs.com/wuyuegb2312/archive/2011/07/29/2120837.html,如需转载请自行联系原作者

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册