信息技术数字 » 成语 » Lua 是什么:历史、设计、实际用途以及语言的主要特性
Lua 轻量级、可嵌入且多范式:表、函数和协同程序将一切联系在一起。
动态类型、带有要求的模块、带有元表的 OOP 和用于协作流程的协同程序。
干净的 C API,用于将 Lua 逻辑集成到本机应用程序中;非常适合游戏和物联网。
广泛的实际用途:引擎、模块、DAW 和微控制器,如 ESP8266/NodeMCU。
Lua 是那些以其平衡性而令人惊讶的语言之一:小巧、快速,专为嵌入应用程序而设计,同时又足够强大,能够涵盖多种编程风格。如果您想知道它究竟是什么、有何用途,以及为什么这么多工具选择它,这里有一份实用且文档齐全的指南。
在深入探讨这个主题之前,值得强调两个关键思想: Lua 于 1993 年出生于巴西 (PUC-Rio,TeCGraf 组)旨在实现轻量级和可扩展性,并且自 5.0 版本开始,它以 麻省理工学院执照 (以前是 BSD 类型的许可证)。它的执行不会直接解释源文本: 编译为字节码 并在自己的虚拟机中运行它;此外,还有 LuaJIT 用于运行时编译。
Lua 是什么以及它来自哪里?
Lua 在葡萄牙语中是“月亮”的意思 由Roberto Ierusalimschy、Luiz Henrique de Figueiredo和Waldemar Celes创作。它的重点从一开始就非常明确: 成为一种可嵌入、可移植且简约的语言其语法简洁,灵感源自 C 语言,并在可扩展性方面与 Perl 的理念类似。多年来,它已成为视频游戏、插件和嵌入式系统的脚本引擎。
从它的起源 便携性一直是人们痴迷的对象:实施于 ISO C几乎可以在任何地方运行,从大型服务器到只有几百 KB 内存的微控制器。早期版本采用类似 BSD 的许可证,并且 从 Lua 5.0 开始,他们使用 MIT,完全兼容 GPL。
理念与设计:轻量化、嵌入式、多范式
Lua 选择了“少数但非常强大的部件”。 其概念负荷可概括为三大支柱: 桌子 作为唯一的数据结构, 功能 作为一等公民和 协程 用于协作流量控制。有了这些底座,用户自己就可以举起 模块、对象、环境和抽象 量身定做。
它通常被描述为程序性的,但 自然适应 功能风格(闭包、高阶)、面向对象(通过元表和原型)和面向数据的方法。 它的极简主义 它并不意味着僵化:语言通过元表重新定义行为来扩展和塑造。
基本语法和执行
在 Lua 中, 变量没有静态类型;该类型由值拥有。它有 八种基本类型: 零, 布尔, 数, 绳子, 表, function, 用户数据 y 绪 (协程)。此外, 承认控制胁迫 运行时在数字和字符串之间。
语言的组织方式 块 编译器转换成匿名函数的代码片段;这有助于 封装状态 现在运行时不会出现意外的“魔法全局变量”。 评论 标有 -- 并支持带有长引号或括号的字符串文字; 运营商 包括算术、关系、短路逻辑(and, or, not)、串联(..) 和长度 (#).
关于流量控制, encontramos if/elseif/else, while, repeat until (主体保证至少一次)和两种变体 for: 数值的 (包括开始、结束和步骤)和 通用的 (迭代器如 pairs o ipairs)。 这 本地语句 限制词汇范围和 回报 允许多个值。
数据类型和强制
通过设计, Lua 是动态类型的自动转换主要发生在 绳子 y 数 在算术运算或文本上下文中。条件仅考虑 false 和 nil 为 false;其他一切都为真(包括 0 和空字符串)。
主要类型包括: 表 (字典/关联数组), function (一流价值观), 用户数据 (C 内存块)和 绪 (协同程序)。 表是异构的,它们支持除以下之外的任何类型的键 零 并构成列表、记录、树或稀疏矩阵等复杂结构的基础。
编程语言的种类及其特点表和元表:语言的核心
表是唯一的数据结构 并用于一切:从一个简单的数组({10,20,30})到目录、对象、模块和环境。访问 t y t.x 当键是名称时是等效的。带括号的构造函数允许 非常紧凑的表达式 初始化。
连接器 元表 se 重新定义行为 运算符和访问方式: __add, __eq, __lt, __concat, __len, __index, __newindex, __call等。这使得 负担过重 加法、比较、连接,或者如何响应访问缺失字段等等。因此,你可以构建 复数类、代理、验证器或包装器,只需几行即可。
模块和环境
功能 require 加载一个模块(执行时, 通常返回一个表 包含函数和常量)。在内部,Lua 将代码编译为函数,并在其内部执行 环境,返回其结果以供重用。全局变量“驻留在”表中,可通过以下方式访问 _G 在更现代的版本中,通过函数的可见环境(_ENV).
这种架构使得 二进制大小仍然很小:每个模块不需要加载所有内容,而是只显示足够的内容,然后由开发人员决定包含哪些内容。 词汇可见性 通过环境的分离可以最大限度地减少代码片段之间的副作用。
函数、闭包和块
在 Lua 中, 函数是一个值:赋值给变量,作为参数传递,并作为结果返回。没有严格的元数限制: 如果参数太多,则会被忽略;如果缺失,则用 零。甚至块也被视为匿名函数,这使得 封装本地状态 且不污染全球环境。
作为语法糖,运算符 : (冒号)允许你通过传递来定义和调用“方法” self 隐式地: obj:metodo(x) 等于 obj.metodo(obj, x). 关闭 它们捕获上值,这是构建迭代器、工厂和干净 API 的非常强大的基础。
面向对象“Lua 方式”
虽然它没有这样的课程, Lua 使用表和元表实现 OOP最广泛的图案用途 __index 委托给原型:对象在“模板”(原型表)中存储其状态并查找其方法。构造函数可以轻松地分配元表并返回新实例。
结合 构造函数、__index 和语法糖:,获得一个实用的 OOP:方法 self、伪继承(链式原型)、覆盖的可能性和 灵活的组合。对于插件、游戏或配置脚本来说,这是一种简单且非常有效的方法。
协程:协作式多任务
该 协程 它们提供非常精细的流量控制:它们可以 yield y resume 在特定点,保护电池。它们作为 协作多线程,非常适合游戏逻辑、反应系统、简单规划器或 惰性迭代器。此外,它们允许在 Lua 和主机代码(例如 C/C++)之间进行优雅的切换。
实际上, 协程继续前进,直到产生结果,将值返回给恢复它的人,然后从中断的地方继续执行。对于交互式任务、基于状态的人工智能或模拟来说,它是一个非常有价值的工具,因为它 低成本、清晰度.
标准库和实用程序
Lua 附带了一组紧凑但非常有用的标准库: 基本的 (断言、类型、配对、要求……) 绳子 (模式、gsub、gmatch、格式) 表 (插入、移除、排序、连接) 数学 (三角函数、指数函数、随机函数) io (文件), os (日期、环境、流程)和 调试 (挂钩、追踪、检查)。它们旨在满足 80% 的实际需求, 最小占用空间.
系统 字符串模式 提供强大的搜索、捕获和替换功能,无需使用完整的正则表达式;具有以下功能 gmatch o gsub 大多数典型的文本处理案例都以简单的方式得到解决。 简洁的.
强大的 Laravel 框架嵌入 C/C++ 和集成 API
其优点之一是 C 语言 API。主持人创建一个 lua_State,加载区块(lua_load),调用函数(lua_pcall 执行受保护的),寄存器 本机函数 可从 Lua 访问,并在 虚拟堆栈有用于错误处理、垃圾收集、元表和“用户数据”的实用程序,它们公开 C 世界结构。
这种设计使得 Lua 通用脚本引擎 对于 C/C++ 应用程序:逻辑委托给 Lua(易于迭代和部署),同时保留原生核心的性能。较小的占用空间(约 25.000 行 C 代码实现和数百 KB 的二进制文件)有助于集成 即使在普通设备上.
物联网和微控制器中的 Lua(ESP8266/NodeMCU)
Lua 因其简单性和快速的开发周期而非常适合物联网。 适用于 ESP8266 的 NodeMCU 提供运行 Lua 的固件,以及类似工具 Lua上传器 o ESPlorer 您可以上传脚本、打开控制台、测试代码片段并进行实时调试。文件 init.lua 通常 启动逻辑 设备(例如,闪烁 LED 或配置 GPIO)。
可能性 逐步执行部分代码,无需重新编译所有内容,可以非常轻松地进行实验:声明变量,制作一个 print(a+b)、切换引脚等。对于来自 Arduino 的用户来说,这个流程是 敏捷且具有教学意义,并且通常只需进行微小的更改就足以将脚本移植到其他兼容设备。
在视频游戏和软件中的显著用途
谢谢你的 轻便、性能和许可Lua 在引擎和模组中很受欢迎。像 Roblox 他们推广了一种典型的变体(Luau);标题和引擎如下 魔兽世界,沙盒 盖瑞模组 (关于《半条命 2》),RTS 最高指挥官, 部分 STALKER, LucasArts 冒险游戏 冥界狂想曲 y 逃离猴岛, 蠕虫 4:混乱或类似框架 LÖVE2D 已经证明了他们的力量 界面脚本、游戏逻辑和模组.
也出现在 MMO 和平台 如 胫骨 (通过 XML 进行广泛的定制) 仙境传说 (Homunculus AI),服务器和模组类型 多盗窃汽车:圣安地列斯 o 五米,游戏如 Factorio (基于 Lua 的模块), 刺猬, 转变, Minetest (创建模组或整个游戏), 继母 (动画和命令),甚至在标题中 以撒的结合:重生 (Afterbirth+ DLC 增加了 Lua mod 支持。)
在工具和系统领域, 窗口管理器 如 离子 y 真棒 使用 Lua 来配置和扩展,而像 REAPER, 摇滚盒 或 DAW 噪声 他们利用这一点 脚本和深度定制 (自带 API、OSC、MIDI、菜单、浮动窗口、集成终端)。它也被用于 处理输入数据、配置应用程序、控制硬件和自动执行任务。
性能、实现和垃圾收集
Lua 编译为 字节码 并在高效的虚拟机上运行;对于要求苛刻的场景, LuaJIT 添加运行时编译。垃圾收集器是 增量标记-清除类型,可配置(暂停和步进乘数)并支持 终结器(__gc) 为 用户数据 y 弱表 (不阻止释放内存的键/值)。
这种组合 快速控制 这意味着游戏、插件和嵌入式系统可以接受的低延迟。最小的占用空间使其能够部署在具有以下功能的设备上: 资源非常有限 而不放弃表达性语言。
设计比较与学习
与较重的语言不同, Lua 优先考虑经济性和互操作性它并非旨在取代 Python 或 JavaScript 成为“完整的生态系统”,而是在以下情况下成为最佳选择: 它们在 C 中提供了简单性、可移植性和可扩展性. 这本书 Lua 编程 技术文章深入探讨了解释其优雅设计的决策。
那些来自 Pascal、C 或语法清晰的语言的人会发现 平滑的进入曲线: 块 do ... end、可读的条件、20 个定义明确的关键字和模式 local 为 限制副作用它与 C 的“粘合剂”和灵活的表语义鼓励从下向上构建必要的内容。
LISP 编程语言仍然具有相关性的 10 个理由常见案例和轶事
在便携性方面, 在操作系统之间迁移 Lua 应用程序 通常只需很少的改动。在主机和设备上,有以下版本 PSP, Wii的 o 世嘉土星 (使用特定的库),以及使用 Lua 进行 简单.
在私人服务器和模组上(例如, 胫骨),人们使用 Lua 来 创建系统、脚本和扩展 高水平。如果你进入创意平台,比如 星期五之夜Funkin',Lua 用于修改 HUD, 模式图表 和场景装饰,展示了它的多功能性 动态编排.
解释其成功的优势
亮度和速度:非常小的二进制文件、适中的内存占用以及高效的解释器/虚拟机。在资源受限的设备上,这种节俭至关重要。
优秀的 C API:注册原生函数和暴露结构非常简单。对于复杂的基于主机的应用程序,Lua 是 理想的胶水 本机核心和高级逻辑之间。
多范式和模块化:使用表、元表、函数和协程,您可以构建所需的一切,不多不少。 经过深思熟虑的最低限度 避免使用不必要的轮子。
社区和文档:简洁的参考手册,丰富的示例,以及多语言材料(英语、西班牙语、葡萄牙语)。“理解其工作原理”的文化转化为 清晰且强大的代码.
要记住的语法细节和运算符
短路逻辑运算符 返回操作数(不仅仅是布尔值): a and b y a or b 可以返回非布尔值,对于默认分配非常有用(x = x or {}).
与 .. 连接, 长度用#表示 (在字符串和“数组类型”表中), 使用 ^ 进行幂运算以及与 C 类似的优先级,但具有右结合性等特殊性 .. y ^。 该 链式图案 它们提供方便的捕获和搜索,无需外部依赖。
为什么那么多引擎和工具选择它?
因为 减少设计与执行之间的摩擦:Lua 迭代速度很快,脚本易于分发和审核,并且原生核心不会频繁更改。此外, 具有宽松许可证的自由软件,完美契合商业产品和社区项目。
还有一个重要的文化因素: 语言的清晰度 它鼓励学习编程概念(高阶函数、闭包、迭代器),并将其应用于其他环境。对于混合团队(设计、脚本、引擎),这 加速交付 在不牺牲质量的情况下。
回顾了它的历史、设计和用途之后,我们很容易理解为什么 Lua 会赢得特殊的地位: 一门做大事的小语言从电子游戏和数字音频工作站 (DAW) 到物联网和浮动窗口,Lua 结合了表和元表、一流的函数和协程,打造出简洁、模块化且易于维护的解决方案。无论您是在寻找可靠的脚本引擎来集成到您的应用程序中,还是寻找一种简单易用的自动化语言,Lua 都是您的理想之选。
相关文章:编程语言的种类及其特点
目录
Lua 是什么以及它来自哪里?理念与设计:轻量化、嵌入式、多范式基本语法和执行数据类型和强制表和元表:语言的核心模块和环境函数、闭包和块面向对象“Lua 方式”协程:协作式多任务标准库和实用程序嵌入 C/C++ 和集成 API物联网和微控制器中的 Lua(ESP8266/NodeMCU)在视频游戏和软件中的显著用途性能、实现和垃圾收集设计比较与学习常见案例和轶事解释其成功的优势要记住的语法细节和运算符为什么那么多引擎和工具选择它?