当前位置: 首页 > article >正文

squirrel语言全面介绍

Squirrel 是一种较新的程序设计语言,由意大利人 Alberto Demichelis 开发,其设计目标是成为一个强大的脚本工具,适用于游戏等对大小、内存带宽和实时性有要求的应用程序。以下是对 Squirrel 语言的全面介绍:

语言特性

  • 动态类型:变量的数据类型在运行时确定,无需显式声明,这使得编程更加灵活。
  • 面向对象:支持类和继承,允许定义类、创建类的实例,能自动执行构造函数,比 Lua 更好地支持面向对象编程。
  • 函数式编程特性:具有高阶函数、生成器、尾递归等函数式编程特性,方便进行函数式风格的编程。
  • 内存管理:采用自动内存管理机制,主要是引用计数结合备用垃圾回收器,减轻了程序员手动管理内存的负担,同时也提高了内存使用效率。
  • 异常处理:具备异常处理机制,能够捕获和处理运行时出现的错误,增强了程序的稳定性和可靠性。
  • 协程:支持协程,即非抢先式的内部线程,可用于实现异步操作和并发任务,提高程序的响应性和性能。

语法特点

  • 与 C/C++ 相似:语法与 C/C++ 非常相似,对于 C/C++ 程序员来说很容易上手,保留字也与 C++ 几乎一致,但没有指针,内存由虚拟机管理,不存在newdelete关键字。
  • 弱类型:是弱类型语言,没有charfloatintdouble等关键字,不过 Squirrel 3.0 支持使用double代替float,其内部浮点数为float类型。
  • 新增关键字:新增了localtypeofinstanceofresumyielddelegateparent等关键字。其中,local用于定义在堆栈中创建的变量,离开函数后自动销毁;resumyield用于协程操作。
  • 循环控制语句:增加了foreach循环,使用起来比 Lua 的foreach循环更简单,例如foreach(local i in arrayvar)用于遍历数组,foreach(local key, value in tablevar)用于遍历表。

应用场景

  • 游戏开发:由于其轻量级、高效的内存管理和对实时性的支持,被广泛应用于游戏开发中,用于实现游戏逻辑、脚本系统、角色行为等。例如《Left 4 Dead 2》《Portal 2》《Apex Legends》等游戏都使用了 Squirrel 语言。
  • 嵌入式系统:设计初衷是易于嵌入到其他应用程序中,因此在嵌入式系统中也有一定的应用,能够为嵌入式设备提供灵活的脚本支持。
  • 脚本编写:适合作为脚本语言,用于编写各种脚本,如游戏中的任务脚本、场景脚本,以及其他应用程序中的配置脚本、自动化脚本等。

执行速度

在执行一个 10000 元素的数组创建及遍历测试中,其速度大约是 C++ 的 1/4,比 Lua 快 20%,具有较好的性能表现,能够满足大多数应用场景的需求。

开发与维护

Squirrel 语言由 Alberto Demichelis 开发和维护,以开源的形式发布,使用 zlib/libpng 许可证,后来改为 MIT 许可证,方便项目在谷歌代码上托管,这也使得开发者能够自由地使用、修改和分发该语言。

以下是一个简单的 Squirrel 语言代码示例,包含了变量定义、函数定义、类定义和使用,以及循环控制结构等基础内容。

squirrel-code-exampleSquirrel语言基础代码示例

// 定义变量
local num = 10;
local str = "Hello, Squirrel!";// 定义函数
function add(a, b)
{return a + b;
}// 调用函数
local result = add(5, 3);
print("5 + 3 = " + result + "\n");// 定义数组
local numbers = [1, 2, 3, 4, 5];//for循环
for(local i = 0; i < numbers.len(); i++)
{print(i + "\n");
}// 使用 foreach 循环遍历数组
foreach(i in numbers)
{print(i + "\n");
}

这个示例包含以下几个部分:

  1. 变量定义:定义了一个整数变量num和一个字符串变量str
  2. 函数定义:定义了一个名为add的函数,用于计算两个数的和。
  3. 数组和循环:创建了一个整数数组numbers,并使用for循环遍历数组中的每个元素并打印。

实例2:

// 定义数组大小,使用命名约定表示常量
local ARRAY_SIZE = 16;//姓名
local sName = ["陈明博", "张明", "李利", "杨洋", "张兰", "李丽", "汤米", "杨扬", "张贤", "王硕", "赵明", "兰平", "邱小平", "兰小娟", "朱丽叶", "胡莉"];// 检查名称是否存在的函数,返回布尔值function CheckName(sKey)
{for(local i = 0; i < sName.len(); i++){if(sName[i] == sKey){return true;}}return false;
}// 打印数组元素
for(local i = 0; i < ARRAY_SIZE; ++i)
{local str = format("%s\n", sName[i]);print(str);
}// 检查特定名称是否存在
if(CheckName("李利"))
{print("exist\n");
}
else
{print("does not exist\n");
}

此代码用 Squirrel 语言编写,主要功能是管理一个存储姓名的数组,实现姓名的遍历打印以及检查特定姓名是否存在于数组中

相关文章:

squirrel语言全面介绍

Squirrel 是一种较新的程序设计语言&#xff0c;由意大利人 Alberto Demichelis 开发&#xff0c;其设计目标是成为一个强大的脚本工具&#xff0c;适用于游戏等对大小、内存带宽和实时性有要求的应用程序。以下是对 Squirrel 语言的全面介绍&#xff1a; 语言特性 动态类型&a…...

SpringBoot配置文件加载优先级

目录 示例 配置文件&编写配置类 在Spring Boot项目中&#xff0c;配置属性的优先级是一个重要的概念&#xff0c;它决定了当存在多个配置源时&#xff0c;哪个配置源的属性将被应用。以下是SpringBoot中配置属性的优先级&#xff0c;从最高到最低&#xff1a; 命令行参数…...

【详细解决】pycharm 终端出现报错:“Failed : 无法将“Failed”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。

昨天在终端一顿操作后突然打开pycharm时就开始报错&#xff1a; 无法将“Failed”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写&#xff0c;如果包括路径&#xff0c;请确保路径正确&#xff0c;然后再试一次。 所在位置 行:1 字符: 1 Failed to act…...

CXL协议之FM(Fabric Management)解释

CXL协议中的FM功能详解 1. FM的核心作用 FM是CXL&#xff08;Compute Express Link&#xff09;架构中的核心管理实体&#xff0c;负责协调和管理CXL设备之间的通信、资源分配及拓扑结构。其核心功能包括&#xff1a; 设备发现与枚举&#xff1a;识别CXL拓扑中的设备&#x…...

用Promise实现ajax的自动重试

有时候遇到网络错误&#xff0c;希望可以多试几次&#xff0c;可以利用Promise递归调用实现 以若依系统的登出举例 export function logout() {return request({url: /logout,method: post}) } 修改下原本的登出逻辑&#xff0c;遇到ERR_NETWORK错误&#xff0c;也就是网络问…...

Unity URP 实现场景和UI添加后处理

在更新到URP之后&#xff0c;之前内置的渲染管线的那一套后处理已经无法使用&#xff0c;接下来&#xff0c;我们使用URP的内置后处理实现对场景和UI的后处理。 设置UI 如果UI需要使用后处理&#xff0c;在Canvas里&#xff0c;我们要选择Screen Space - Camera&#xff0c;然…...

搭建ISCSI传输的配置与管理

前提是&#xff1a; windows server2019设置成桥接模式&#xff0c;因为要让虚拟机和主机设置成一个网段&#xff0c;才能通过网络进行新建虚拟磁盘。 1.添加ISCSI角色 安装位置 选择文件和存储服务----------文件和iscsl 服务------------iscsl目标服务器 2.右上角点击任务&a…...

华为参访预约,团队考察体验黑科技之旅

华为参观学习背景 全球第1&#xff0c;中国骄傲 成立于1987年的华为&#xff0c;早在2013年其销售收入就已超过爱立信&#xff0c;成为全球行业第1名。2019年福布斯世界500强排名第61位&#xff0c;全球唯1一家没有上市的民营企业。目前&#xff0c;华为5G技术已经走在世界前沿…...

Java 设计模式之享元模式(Flyweight Pattern)

享元模式&#xff08;Flyweight Pattern&#xff09; 是一种 结构型设计模式&#xff0c;旨在通过共享对象来有效支持大量细粒度对象的复用&#xff0c;从而减少内存占用和提高性能。其核心是 分离内部状态&#xff08;可共享&#xff09;与外部状态&#xff08;不可共享&#…...

C#入门学习记录(三)C#中的隐式和显示转换

C#类型转换&#xff1a;隐式与显式转换的机制与应用 在C#的强类型体系中&#xff0c;数据类型转换是实现数据交互和算法逻辑的基础操作。当数值类型范围存在包含关系&#xff0c;或对象类型存在继承层次时&#xff0c;系统通过预定义的转换规则实现类型兼容处理。隐式转换&…...

Rk3568驱动开发_设备树_9

什么是设备树&#xff1f; 以我目前的理解&#xff0c;设备树更像日常生活中用的地图&#xff0c;用户能根据地图去寻找到相应位置 设备树也是如此它描述了硬件设备的连接关系和配置信息&#xff0c;供 CPU&#xff08;或者更准确地说&#xff0c;是操作系统内核&#xff09;…...

一和零 (leetcode 474

leetcode系列 文章目录 一、核心操作二、外层配合操作三、核心模式代码总结 本题是一个01背包问题&#xff0c;只是背包是一个二维数组的背包&#xff0c;分别为0的个数不能超过m&#xff0c;1的个数不能超过n&#xff0c;而物品就是题目中的字符串&#xff0c;其容量为0和1的…...

深度学习:从零开始的DeepSeek-R1-Distill有监督微调训练实战(SFT)

原文链接&#xff1a;从零开始的DeepSeek微调训练实战&#xff08;SFT&#xff09; 微调参考示例&#xff1a;由unsloth官方提供https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Qwen2.5_(7B)-Alpaca.ipynbhttps://colab.research.google.com/git…...

【AI News | 20250320】每日AI进展

AI Repos 1、servers 该仓库提供详细入门指南&#xff0c;用户可通过简单步骤连接Claude客户端&#xff0c;快速使用所有服务器功能。此项目由Anthropic管理&#xff0c;展示MCP的多样性与扩展性&#xff0c;助力开发者为大语言模型提供安全、可控的工具与数据访问。 2、awe…...

从零开始实现 C++ TinyWebServer 阻塞队列 BlockQueue类详解

文章目录 阻塞队列是什么&#xff1f;为什么需要阻塞队列&#xff1f;BlockQueue 成员变量实现 push() 函数实现 pop() 函数实现 close() 函数BlockQueue 代码BlockQueue 测试 从零开始实现 C TinyWebServer 项目总览 项目源码 阻塞队列是什么&#xff1f; 阻塞队列是一种线程…...

Linux驱动开发基础(can)

目录 1.can的介绍 2.can的硬件连接 2.1 CPU自带can控制器 2.2 CPU没有can控制器 3.电气属性 4.can的特点 5.can协议 5.1 can的种类 5.2 数据帧 5.2.1 标准数据帧格式 5.3.1 扩展数据帧格式 5.3 遥控帧 5.4 错误帧 5.5 过载帧 5.6 帧间隔 5.7 位填充 5.8 位时…...

5.2《生活中的透镜》——5.3《凸透镜成像规律》讲后再上

教会什么:照相机、投影仪、放大镜的原理 培养什么:(再说) 课标: (二)运动和相互作用 2.3 声和光 2.3.5了解凸透镜成像规律的应用。 例7 了解凸透镜成像规律在放大镜、照相机中的应用。 一、导入 提问:生活中有哪些透镜?(放大镜、照相机、投影仪/幻灯机) ——直接提出…...

【LangChain入门 3 Prompts组件】聊天提示词模板 ChatPromptTemplate

文章目录 一、 聊天信息提示词模板1.1 使用关键字1.2 使用SystemMessage, HumanMessage, AIMessage来定义消息1.3 使用MessagesPlaceholder 在特定未知添加消息列表 二、关键类介绍2.1 ChatPromptTemplate 类2.1.1 from_messages()2.1.2 format_messages()2.1.3 format_prompt(…...

fastadmin后台管理员日志指定方法不记录

做的订单提醒,只要在线会把日志自动存储进去,这个又是每30s执行一次,数据库没多久就爆掉了,最终找到一个处理方法,可能不是最好的,仅供大家参考 具体位置: application/admin/model/AdminLog.php里面的$ignoreRegex方法 protected static $ignoreRegex [/^(.*)\/(selectpage…...

leetcode热题100道——字母异位词分组

给你一个字符串数组&#xff0c;请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。 字母异位词 是由重新排列源单词的所有字母得到的一个新单词。 示例 1: 输入: strs ["eat", "tea", "tan", "ate", "nat", &…...

MCU-芯片时钟与总线和定时器关系,举例QSPI

时钟源&#xff1a; 时钟源为系统时钟提供原始频率信号&#xff0c;系统时钟则通过&#xff08;分频、倍频、选择器&#xff09;成为整个芯片的“主时钟”&#xff0c;驱动 CPU 内核、总线&#xff08;AHB、APB&#xff09;及外设的运行。 内部时钟源&#xff1a; HSI&#x…...

力扣热题100(方便自己复习,自用)

力扣热题100 1. 两数之和 - 力扣&#xff08;LeetCode&#xff09; 查找两数之和是不是等于target也就是我们找到一个数之后&#xff0c;用target将其减掉&#xff0c;再寻找应当对应的元素是什么每找到一个数&#xff0c;我们就将其放在集合中&#xff0c;因为集合中可以去重…...

暂存合并分支

合并分支代码&#xff0c;冲突过多&#xff0c;没解决完 想切换分支&#xff0c;可以把合并暂存 先先 git add . 再git stash 恢复搁置&#xff1a; 查看当前的搁置列表&#xff1a; git stash list恢复特定的搁置 如果你想恢复特定的搁置更改&#xff0c;可以指定索引&a…...

力扣hot100——三数之和(双指针)

题目&#xff1a;三数之和 排序 双指针 本题的难点在于如何去除重复解。 算法流程&#xff1a; 1、特判&#xff0c;对于数组长度 n&#xff0c;如果数组为 null 或者数组长度小于 3&#xff0c;返回 []。 2、对数组进行排序。 3、遍历排序后数组&#xff1a; &#xff08…...

技术分享 | MySQL内存使用率高问题排查

本文为墨天轮数据库管理服务团队第51期技术分享&#xff0c;内容原创&#xff0c;如需转载请联系小墨&#xff08;VX&#xff1a;modb666&#xff09;并注明来源。 一、问题现象 问题实例mysql进程实际内存使用率过高 二、问题排查 2.1 参数检查 mysql版本 &#xff1a;8.0.…...

分享一个精灵图生成和拆分的实现

概述 精灵图&#xff08;Sprite&#xff09;是一种将多个小图像合并到单个图像文件中的技术&#xff0c;广泛应用于网页开发、游戏开发和UI设计中。在MapboxGL中&#xff0c;跟之配套的还有一个json文件用来记录图标的大小和位置。本文分享基于Node和sharp库实现精灵图的合并与…...

AI日报 - 2025年3月21日

&#x1f31f; 今日概览&#xff08;60秒速览&#xff09; ▎&#x1f916; AGI突破 | OpenAI成立安全委员会&#xff0c;加速AGI治理框架构建 ▎&#x1f4bc; 商业动向 | 微软发布医疗大模型DAX Copilot 3.0&#xff0c;覆盖全球临床场景 ▎&#x1f4dc; 政策追踪 | 中国发布…...

MongoDB 配合python使用的入门教程

MongoDB 入门教程 1. 安装 MongoDB 首先&#xff0c;你需要在你的机器上安装MongoDB。你可以从 MongoDB官网 下载并安装 Community 版本。安装完成后&#xff0c;启动MongoDB服务。 # 在Linux/Mac上启动MongoDB mongod# 在Windows上&#xff0c;你可以通过Windows服务启动Mo…...

函数:形参和实参

在函数的使用过程中分为实参和形参&#xff0c;实参是主函数实际调用的值而形参则是给实参调用的值&#xff0c;如果函数没被调用则函式不会向内存申请空间&#xff0c;先用一段代码演示 形参&#xff1a; int test(int x ,int y ) {int z 0;z x y;return z; } 为何会叫做…...

【C#知识点详解】ExcelDataReader介绍

今天来给大家介绍一下ExcelDataReader&#xff0c;ExcelDataReader是一个轻量级的可快速读取Excel文件中数据的工具。话不多说直接开始。 ExcelDataReader简介 ExcelDataReader支持.xlsx、.xlsb、.xls、.csv格式文件的读取&#xff0c;版本基本在2007及以上版本&#xff0c;支…...