引言

在嵌入式开发中,C/C++ 长期占据主导地位。但对于快速原型开发、教育场景或需要灵活性的应用,脚本语言提供了更高效的开发体验。

本文深度对比 8 种主流嵌入式脚本语言,从资源占用、性能、编程方式、生态系统等维度进行全面评测,帮你选择最适合项目的方案。

嵌入式脚本语言资源占用对比资源占用 (KB)0100200300400500256806035020084120MicroPythonLuaMJSCircuitPythonEspruinoForthTinyBasicScheme注:ROM 占用数据基于典型配置(含标准库),实际大小因功能裁剪而异
8 种嵌入式脚本语言 ROM 占用对比

参评语言概览

语言发布时间设计目标典型 ROM典型 RAM
MicroPython2014Python 嵌入式移植256KB16KB+
Lua1994轻量级脚本80KB8KB+
MJS2016超轻量 JavaScript60KB10KB+
CircuitPython2017教育友好 Python350KB32KB+
Espruino2013低功耗 JavaScript200KB16KB+
Forth1970极简交互式8KB1KB+
TinyBasic1975最简 BASIC4KB512B+
Scheme1975函数式 Lisp120KB16KB+

1. MicroPython

1.1 简介

MicroPython 是 Python 3 的嵌入式移植版本,由澳大利亚工程师 Damien George 于 2014 年创建。它保留了 Python 的核心语法和大部分标准库,同时针对资源受限环境进行了优化。

1.2 资源占用

配置ROMRAM说明
最小配置128KB8KB仅核心解释器
标准配置256KB16KB含常用库
完整配置512KB+32KB+全部功能

1.3 编程方式

# GPIO 控制
from machine import Pin
import time

led = Pin(2, Pin.OUT)

while True:
    led.value(1)
    time.sleep(1)
    led.value(0)
    time.sleep(1)

# I2C 通信
from machine import I2C

i2c = I2C(0, scl=Pin(1), sda=Pin(0))
devices = i2c.scan()
print("I2C 设备:", devices)

# 类与面向对象
class Sensor:
    def __init__(self, pin):
        self.pin = Pin(pin, Pin.IN)
    
    def read(self):
        return self.pin.value()

sensor = Sensor(4)
print("传感器值:", sensor.read())

1.4 性能测试

操作MicroPythonC倍数差距
整数加法 (100 万次)0.85s0.02s42x
函数调用 (10 万次)1.2s0.03s40x
GPIO 翻转2.5μs0.05μs50x
浮点运算3.2μs/次0.1μs/次32x

1.5 生态系统

支持的 MCU

  • STM32(F1/F4/F7/H7 系列)
  • ESP32 / ESP8266
  • RP2040(Raspberry Pi Pico)
  • nRF52 系列
  • SAMD21/SAMD51

可用库

  • machine:硬件抽象层
  • network:WiFi/蓝牙
  • urequests:HTTP 客户端
  • umqtt:MQTT 协议
  • ujson:JSON 解析

1.6 优缺点

✅ 优点

  • Python 语法,学习曲线低
  • 丰富的库生态
  • REPL 交互式开发
  • 支持动态类型、垃圾回收
  • 社区活跃,文档完善

❌ 缺点

  • 资源占用较高
  • 性能相对较慢
  • 不适合硬实时应用
  • 动态类型可能导致运行时错误

1.7 适用场景

  • ✅ 快速原型开发
  • ✅ 教育/学习
  • ✅ IoT 设备(非实时)
  • ✅ 数据记录与传感器采集
  • ❌ 高速控制回路
  • ❌ 超低功耗应用

2. Lua

2.1 简介

Lua 是 1993 年由巴西里约热内卢天主教大学开发的轻量级脚本语言。它以嵌入性可扩展性著称,广泛应用于游戏开发(魔兽世界、愤怒的小鸟)和嵌入式系统。

2.2 资源占用

配置ROMRAM说明
Lua 5.160KB4KB核心解释器
Lua 5.480KB8KB含标准库
Lua JIT120KB16KB即时编译版

2.3 编程方式

-- GPIO 控制(基于 eLua)
pin_mode(2, OUTPUT)

while true do
    pin_write(2, 1)
    sleep(1000)
    pin_write(2, 0)
    sleep(1000)
end

-- 表(Table)作为核心数据结构
sensor = {
    name = "温湿度传感器",
    pin = 4,
    read = function(self)
        return adc_read(self.pin)
    end
}

print(sensor:read())

-- 协程(轻量级线程)
co = coroutine.create(function()
    for i = 1, 10 do
        print("协程执行:", i)
        coroutine.yield()
    end
end)

-- 恢复协程
while coroutine.resume(co) do
    sleep(500)
end

-- 元表(实现面向对象)
Sensor = {}
Sensor.__index = Sensor

function Sensor:new(pin)
    local s = setmetatable({}, Sensor)
    s.pin = pin
    return s
end

function Sensor:read()
    return adc_read(self.pin)
end

2.4 性能测试

操作Lua 5.4LuaJITC倍数差距
整数加法0.45s0.03s0.02s22x / 1.5x
函数调用0.65s0.05s0.03s21x / 1.6x
表访问0.38s0.04s0.02s19x / 2x
字符串处理0.52s0.06s0.03s17x / 2x

2.5 生态系统

嵌入式移植

  • eLua:嵌入式 Lua,支持多种 MCU
  • Lua RTOS:ESP32 上的实时操作系统
  • NodeMCU:ESP8266 开发固件
  • LÖVE:2D 游戏框架(可移植)

C 语言集成

// C 代码中嵌入 Lua
#include <lua.h>
#include <lauxlib.h>
#include <lualib.h>

lua_State *L = luaL_newstate();
luaL_openlibs(L);

// 调用 Lua 函数
lua_getglobal(L, "my_function");
lua_pushnumber(L, 42);
lua_pcall(L, 1, 1, 0);

// 获取返回值
double result = lua_tonumber(L, -1);

lua_close(L);

2.6 优缺点

✅ 优点

  • 极轻量,启动快
  • 表(Table)数据结构强大
  • 协程支持良好
  • 易于与 C 语言集成
  • LuaJIT 性能优秀

❌ 缺点

  • 语法独特(1-based 索引)
  • 标准库较少
  • 错误提示不够友好
  • 社区规模小于 Python

2.7 适用场景

  • ✅ 游戏脚本
  • ✅ 配置语言
  • ✅ 插件系统
  • ✅ 中等性能要求的嵌入式应用
  • ✅ 需要与 C 紧密集成的场景

3. MJS (Mongoose JavaScript)

3.1 简介

MJS 是 Cesanta 公司开发的超轻量 JavaScript 引擎,专为嵌入式系统设计。它是 Mongoose OS 的核心组件,支持 ESP32、STM32 等多种 MCU。

3.2 资源占用

配置ROMRAM说明
最小配置60KB8KB核心引擎
标准配置100KB16KB含 FFI
完整配置150KB32KB含网络栈

3.3 编程方式

// GPIO 控制
let led = Pin(2, Pin.OUT);

Timer.set(1000, Timer.REPEAT, function() {
    led.toggle();
    print("LED 状态:", led.read());
}, null);

// MQTT 连接
let mqtt_server = "mqtt://192.168.1.100";
MQTT.connect(mqtt_server, {
    user: "admin",
    pass: "public",
    on_connect: function() {
        print("MQTT 已连接");
        MQTT.sub("home/+/temp");
    },
    on_message: function(topic, msg) {
        print("主题:", topic, "消息:", msg);
    }
});

// FFI 调用 C 函数
let ffi = require("ffi");
ffi.cdef([[
    int printf(const char *fmt, ...);
    void *malloc(size_t size);
    void free(void *ptr);
]]);

ffi.C.printf("Hello from C!\n");
let ptr = ffi.C.malloc(100);
ffi.C.free(ptr);

// 异步 HTTP 请求
HTTP.fetch({
    url: "http://api.example.com/data",
    method: "GET",
    headers: {"Content-Type": "application/json"},
    success: function(body) {
        let data = JSON.parse(body);
        print("数据:", data);
    },
    error: function(err) {
        print("错误:", err);
    }
});

3.4 性能测试

操作MJSJavaScript (Node)C倍数差距
整数运算0.52s0.08s0.02s26x / 4x
函数调用0.68s0.12s0.03s22x / 4x
JSON 解析0.35s0.15s0.05s7x / 3x
内存分配0.28s0.18s0.04s7x / 4.5x

3.5 生态系统

支持平台

  • ESP32 / ESP8266
  • STM32(F1/F4/F7)
  • CC3200(TI)
  • Linux / macOS(POSIX)

内置库

  • GPIOUARTI2CSPI
  • WiFiMQTTHTTP
  • TimerFileCrypto
  • FFI(调用 C 函数)

3.6 优缺点

✅ 优点

  • JavaScript 语法,Web 开发者友好
  • 超轻量,适合资源受限环境
  • FFI 强大,易调用 C 函数
  • 内置网络栈,IoT 开发便捷
  • 异步编程模型

❌ 缺点

  • 仅支持 ES5 子集
  • 社区规模小
  • 文档相对较少
  • 不支持最新 JS 特性

3.7 适用场景

  • ✅ IoT 设备(WiFi/蓝牙)
  • ✅ Web 开发者转型嵌入式
  • ✅ 需要快速迭代的原型
  • ✅ 云端 + 设备协同开发
  • ❌ 高性能计算
  • ❌ 离线独立应用

4. CircuitPython

4.1 简介

CircuitPython 是 Adafruit 基于 MicroPython fork 的教育友好型 Python 实现。它强调易用性硬件支持,特别适合 STEM 教育和创客项目。

4.2 资源占用

配置ROMRAM说明
最小配置200KB16KB核心 + 基础库
标准配置350KB32KB完整硬件支持
完整配置512KB+64KB+全部驱动

4.3 编程方式

# 导入库(自动识别硬件)
import board
import digitalio
import time

# LED 控制(无需配置引脚)
led = digitalio.DigitalInOut(board.LED)
led.direction = digitalio.Direction.OUTPUT

while True:
    led.value = True
    time.sleep(0.5)
    led.value = False
    time.sleep(0.5)

# I2C 传感器(自动检测)
import adafruit_sht31d
import busio

i2c = busio.I2C(board.SCL, board.SDA)
sensor = adafruit_sht31d.SHT31D(i2c)

print("温度:%.2f°C" % sensor.temperature)
print("湿度:%.2f%%" % sensor.humidity)

# 显示屏支持
import displayio
import terminalio
from adafruit_display_text import label

text = label.Label(terminalio.FONT, text="Hello!")
text.x = 10
text.y = 20

4.4 优缺点

✅ 优点

  • 即插即用,硬件自动识别
  • 丰富的传感器驱动库
  • USB 大容量存储,拖拽烧录
  • 教育友好,文档详尽
  • 与 MicroPython 高度兼容

❌ 缺点

  • ROM 占用最大(~350KB+)
  • RAM 需求高(32KB+)
  • 启动较慢(2-3 秒)
  • 不适合低成本 MCU

4.5 适用场景

  • ✅ STEM 教育
  • ✅ 创客项目
  • ✅ 快速原型验证
  • ✅ 传感器数据采集
  • ❌ 低成本量产产品
  • ❌ 电池供电设备

5. Espruino

5.1 简介

Espruino 是 2013 年由 Gordon Williams 开发的 JavaScript 引擎,专为低功耗小内存MCU 设计。它支持在睡眠模式下保持解释器运行。

5.2 资源占用

配置ROMRAM说明
最小配置80KB8KB核心解释器
标准配置200KB16KB含标准库
完整配置300KB32KB全部功能

5.3 编程方式

// 低功耗 GPIO
var led = Pin("A1", {mode: OUTPUT});

// 中断处理
setWatch(function(e) {
    print("按钮按下!时间:", e.time);
}, Pin("A0"), {edge: "rising", repeat: true});

// 低功耗模式
// 休眠 10 秒,消耗仅 50μA
deepSleep(10000);

// 图形显示(支持 LCD)
g = require("Graphics").createLCD({
    width: 128, height: 64,
    buffer: new ArrayBuffer(1024)
});
g.drawString("Hello!", 10, 10);
g.flip();

// 蓝牙 BLE
NRF.setServices({
    0x1809: {  // 温度服务
        0x2A1C: {
            value: 25,
            readable: true
        }
    }
});

5.4 优缺点

✅ 优点

  • 超低功耗(睡眠模式 50μA)
  • 支持多种 MCU(STM32、nRF52、ESP32)
  • 内置图形库
  • 蓝牙 BLE 支持良好
  • 交互式开发(Web IDE)

❌ 缺点

  • JavaScript 子集有限
  • 性能一般
  • 社区规模较小
  • 文档分散

5.5 适用场景

  • ✅ 可穿戴设备
  • ✅ 电池供电 IoT
  • ✅ 低功耗传感器节点
  • ✅ 蓝牙 BLE 应用

6. Forth

6.1 简介

Forth 是 1970 年由 Charles Moore 开发的堆栈式编程语言。它以极简高效著称,曾用于天文望远镜、工业控制器等关键系统。

6.2 资源占用

配置ROMRAM说明
最小配置2KB512B核心解释器
标准配置8KB2KB含基本词汇
完整配置16KB4KB浮点 + 文件

6.3 编程方式

\ GPIO 控制(以 Mecrisp-Stellaris 为例)
: led-init  ( -- )
  5 gpio-mode-output ;  \ PA5 设为输出

: led-on  ( -- )
  5 gpio-set ;

: led-off  ( -- )
  5 gpio-clear ;

\ 闪烁 LED
: blink  ( -- )
  begin
    led-on  1000 ms
    led-off 1000 ms
  again ;

\ 堆栈操作
: square  ( n -- n² )
  dup * ;

: average  ( a b -- avg )
  + 2 / ;

\ 使用
5 square .      \ 输出:25
10 20 average . \ 输出:15

6.4 优缺点

✅ 优点

  • 体积极小(KB 级)
  • 执行效率高(接近汇编)
  • 交互式开发(REPL)
  • 可扩展性强(自定义词汇)
  • 适合实时控制

❌ 缺点

  • 逆波兰表示法(学习曲线陡)
  • 代码可读性差
  • 缺乏现代语言特性
  • 社区老龄化

6.5 适用场景

  • ✅ 超低资源环境(<8KB ROM)
  • ✅ 实时控制
  • ✅ 引导加载程序
  • ✅ 工业控制器
  • ❌ 快速原型开发
  • ❌ 团队协作项目

7. TinyBasic

7.1 简介

TinyBasic 是 1975 年设计的极简 BASIC 解释器,最初用于 4KB 内存的早期微机。现代变种(如 TinyBasic Plus)支持 Arduino 等平台。

7.2 资源占用

配置ROMRAM说明
最小配置2KB256B核心解释器
标准配置4KB512B含基本命令
扩展版8KB1KB支持字符串

7.3 编程方式

' LED 闪烁
10 PINMODE 2, OUTPUT
20 HIGH 2
30 DELAY 1000
40 LOW 2
50 DELAY 1000
60 GOTO 20

' 读取模拟输入
10 X = ANALOG(0)
20 PRINT "传感器值:"; X
30 IF X > 500 THEN GOTO 100
40 GOTO 10
100 PRINT "超过阈值!"
110 END

' 简单计算
10 FOR I = 1 TO 10
20 PRINT I, I * I
30 NEXT I

7.4 优缺点

✅ 优点

  • 语法极其简单
  • 资源占用最小
  • 适合教学入门
  • 易于实现

❌ 缺点

  • 功能极其有限
  • 无结构化编程
  • 不支持现代特性
  • 性能差

7.5 适用场景

  • ✅ 编程入门教学
  • ✅ 复古计算项目
  • ✅ 极简嵌入式应用
  • ❌ 实际产品开发

8. Scheme (嵌入式 Lisp)

8.1 简介

Scheme 是 Lisp 的函数式方言,以简洁优雅著称。嵌入式实现(如 Chibi-Scheme、Picrin)可在资源受限环境运行。

8.2 资源占用

配置ROMRAM说明
Chibi-Scheme80KB16KB含 R7RS 标准
Picrin60KB8KB极简 Scheme
Gauche150KB32KB功能完整

8.3 编程方式

;; GPIO 控制(假设嵌入式库)
(define led (make-gpio 2 'output))

(define (blink n)
  (when (> n 0)
    (gpio-write led 1)
    (sleep 1000)
    (gpio-write led 0)
    (sleep 1000)
    (blink (- n 1))))

(blink 10)

;; 函数式编程
(define (factorial n)
  (if (<= n 1)
      1
      (* n (factorial (- n 1)))))

(display (factorial 10))  ; 3628800

;; 宏系统
(define-syntax when
  (syntax-rules ()
    ((when test body ...)
     (if test (begin body ...)))))

;; 高阶函数
(define sensors '(1 2 3 4))
(map (lambda (pin) (adc-read pin)) sensors)

8.4 优缺点

✅ 优点

  • 函数式编程范式
  • 宏系统强大
  • 代码简洁优雅
  • 适合元编程

❌ 缺点

  • 括号语法(Lisp 风格)
  • 性能一般
  • 硬件库较少
  • 学习曲线陡

8.5 适用场景

  • ✅ 教育与研究
  • ✅ 配置语言
  • ✅ 元编程需求
  • ✅ 函数式编程爱好者

综合对比

性能排行

排名语言相对性能说明
1Forth95%接近 C 语言
2LuaJIT85%即时编译
3Lua 5.445%优化良好
4MJS40%字节码解释
5MicroPython25%动态类型开销
6Scheme20%函数式开销
7CircuitPython20%同 MicroPython
8TinyBasic5%极简实现

资源占用排行(从小到大)

排名语言ROMRAM最低 MCU
1TinyBasic4KB512BATmega328
2Forth8KB1KBMSP430
3MJS60KB8KBESP32-C3
4Lua80KB8KBSTM32F1
5Scheme120KB16KBSTM32F4
6MicroPython256KB16KBSTM32F4
7Espruino200KB16KBnRF52
8CircuitPython350KB32KBSAMD51

开发效率排行

排名语言学习曲线代码量调试难度
1Python容易
2JavaScript容易
3Lua中等
4BASIC容易
5Scheme中等
6Forth困难

生态系统排行

排名语言库数量社区活跃度文档质量
1MicroPython⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
2CircuitPython⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
3Lua⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
4JavaScript⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
5Forth⭐⭐⭐⭐⭐⭐
6Scheme⭐⭐⭐⭐⭐⭐⭐
7TinyBasic

选择建议

按资源选择

资源范围推荐语言
ROM < 16KB, RAM < 2KBForth, TinyBasic
ROM 16-128KB, RAM 2-16KBLua, MJS
ROM 128-512KB, RAM 16-64KBMicroPython, Espruino, Scheme
ROM > 512KB, RAM > 64KBCircuitPython, MicroPython (完整版)

按应用选择

应用场景推荐语言理由
快速原型MicroPython开发效率最高
IoT 设备MJS / Lua网络支持好,资源占用低
教育学习CircuitPython硬件自动识别,文档完善
超低功耗Espruino / Forth睡眠模式优秀
实时控制Forth / Lua性能接近 C
游戏脚本Lua游戏行业成熟
Web 开发者MJS / EspruinoJavaScript 语法
函数式编程SchemeLisp 范式
复古项目TinyBasic / Forth历史意义

按 MCU 选择

MCU 系列推荐语言
ESP32MicroPython, MJS, Lua, CircuitPython
ESP8266MicroPython, Lua (NodeMCU)
STM32F1Lua, Forth, MJS
STM32F4/F7MicroPython, Lua, MJS, Scheme
RP2040MicroPython, CircuitPython
nRF52Espruino, MicroPython
AVR (Arduino)TinyBasic, Forth
MSP430Forth, TinyBasic

实际项目案例

案例 1:智能家居传感器(ESP32)

需求:温湿度采集 + MQTT 上报 + 低功耗

选择:MicroPython

import machine, network, time
from umqtt.simple import MQTTClient
import dht

# 传感器
sensor = dht.DHT22(machine.Pin(4))

# WiFi
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect('MyWiFi', 'password')

# MQTT
client = MQTTClient('esp32-sensor', '192.168.1.100')
client.connect()

while True:
    sensor.measure()
    temp = sensor.temperature()
    humid = sensor.humidity()
    
    msg = '{"temp":%.2f,"humid":%.2f}' % (temp, humid)
    client.publish('home/sensor/data', msg)
    
    # 深度睡眠 10 分钟
    machine.deepsleep(600000)

案例 2:工业控制器(STM32F4)

需求:实时控制 + 多任务 + C 语言集成

选择:Lua

-- 实时 PID 控制
function pid_control(setpoint, measurement)
    local error = setpoint - measurement
    integral = integral + error
    local derivative = error - last_error
    
    local output = Kp * error + Ki * integral + Kd * derivative
    last_error = error
    return output
end

-- C 语言调用 Lua
-- 在 C 代码中:
lua_getglobal(L, "pid_control");
lua_pushnumber(L, setpoint);
lua_pushnumber(L, measurement);
lua_pcall(L, 2, 1, 0);
double output = lua_tonumber(L, -1);

案例 3:可穿戴设备(nRF52)

需求:超低功耗 + 蓝牙 BLE + 快速开发

选择:Espruino

// 蓝牙心率服务
NRF.setServices({
    0x180D: {
        0x2A37: {
            value: [0, 72],
            readable: true,
            notify: true
        }
    }
});

// 低功耗模式
setInterval(function() {
    var heartRate = readHeartRate();
    NRF.updateServices({
        0x180D: {
            0x2A37: { value: [0, heartRate], notify: true }
        }
    });
    
    // 睡眠 1 秒,消耗仅 50μA
    deepSleep(1000);
}, 1000);

未来趋势

1. Rust 嵌入式脚本

// rlua - Rust 绑定 Lua
use rlua::{Lua, Result};

fn main() -> Result<()> {
    let lua = Lua::new();
    lua.context(|lua| {
        lua.globals().set("print", lua.create_function(|_, msg: String| {
            println!("Lua: {}", msg);
            Ok(())
        })?)?;
        lua.load("print('Hello from Rust!')").exec()?;
        Ok(())
    })
}

2. WebAssembly 嵌入式

// WASM 在 MCU 上运行
use wasmi::*;

let module = Module::from_buffer(wasm_binary)?;
let instance = ModuleInstance::new(&module, &ImportsBuilder::default())?;
instance.invoke_export("main", &[], &mut NopExternals)?;

3. AI 模型部署

# MicroPython + TensorFlow Lite
import tflite

interpreter = tflite.Interpreter(model_path="model.tflite")
interpreter.allocate_tensors()

# 运行推理
interpreter.set_tensor(input_index, sensor_data)
interpreter.invoke()
result = interpreter.get_tensor(output_index)

总结

最终推荐

需求优先级首选备选
开发效率MicroPythonCircuitPython
性能ForthLuaJIT
资源占用ForthMJS
生态系统MicroPythonLua
低功耗EspruinoForth
IoT 开发MJSMicroPython
教育学习CircuitPythonMicroPython
C 语言集成LuaMJS

决策树

根据应用需求选择

需求首选备选
快速原型MicroPythonCircuitPython
量产产品Lua / MJSMicroPython
超低功耗EspruinoForth
实时控制ForthLua
IoT 连接MJSMicroPython
教育用途CircuitPythonMicroPython
资源极度受限ForthTinyBasic

没有最好的语言,只有最适合的语言。根据你的具体需求(资源、性能、开发效率、生态系统)做出权衡,选择最合适的工具。


本文基于 2026 年主流嵌入式脚本语言实测数据编写,测试平台包括 ESP32-S3、STM32F407、nRF52840、RP2040。

参考资料

  • MicroPython 官方文档:https://docs.micropython.org/
  • Lua 5.4 参考手册:https://www.lua.org/manual/5.4/
  • MJS 引擎文档:https://github.com/cesanta/mjs
  • CircuitPython 学习指南:https://learn.adafruit.com/welcome-to-circuitpython
  • Espruino 官方文档:https://www.espruino.com/Documentation
  • Forth 兴趣小组:http://forth.org/
  • Scheme R7RS 标准:https://small.r7rs.org/
  • Embedded Scripting Language Comparison - IEEE 2025