Frossky 发布的文章

Windows 10电脑上出现了用鼠标选择任意文本就会自动复制的问题。这个很头痛,因为我很习惯选择后进行一些其他操作,而不是复制。尤其是选择后直接粘贴,预期的结果是用剪切板的内容覆盖掉选择的内容,然而这个神秘的自动复制,让这个操作就失效了。并且是在任意窗口都会这样。
先是让AI写了一个自动的Python脚本去检测按键输入。很顺利的检测到了,在鼠标选择文本之后,会有一个虚拟按键输入,左Ctrl加Insert。
接下来就要去找到底是哪个程序输入的,这个过程千难万阻,最终也没有成功。依次尝试了Process Monitor、Spy++、API Monitor、Inside clipboard等等这些方法。但是由于Windows它不会记录虚拟按键发送者的名称,所以找起来真是大海捞针。Spy++ 和API Monitor可能更接近于成功,但是这两者都只能监控一个控件或者一个窗口,无法做全系统的监控,这也可以理解,因为全系统的这种消息实在是太多了。
最后想到一个办法,是不是可以拦截左Ctrl加Insert键,让它不再复制?发现微软官方的PowerToys就可以做到。在它的键盘管理器里面可以去重新映射快捷键。将左Ctrl加Insert键映射为Disable就解决了。
郁闷的是,一直不知道这个在背后捣鬼的程序是谁。AI都猜测是某个类似于画词翻译的程序。

使用的qiniu服务器,也就是小智ESP32 Server开源服务器。对于意图识别,似乎必须是从用户端的话语中判断的,无法从系统提示词中进行意图识别。也无法进行条件判断式的意图识别。举例如下。
如果在系统提示词中写入满足一定的条件,便进行MCP调用的时候,那MCP永远不会调用;但是如果系统提示词中写入满足一定的条件,大模型进行特定的回复的时候,却是可以进行的。
在用户下达的指令中,提出满足一定的条件去调用MCP工具的时候,大模型听到这句话不等这个条件达成,便立即进行了调用。
因此我估计,这是属于MCP Client端也就是服务器端实现的问题,而不完全是大模型本身的问题。可能需要看一下服务器端对MCP Client实现的源码。

小程序开发时 wx.showActionSheet 这个函数, 在点击对应选项后,有时候ActionSheet不会自动隐藏,是什么原因,如何改进为必然自动隐藏?
在小程序开发中,wx.showActionSheet 通常在点击选项后由系统自动收起。如果出现不自动隐藏的情况,通常是由于逻辑阻塞或系统/版本差异导致的。

  1. 常见原因分析
    回调函数内存在阻塞逻辑:在 success 回调中执行了耗时过长的同步操作(如复杂的循环计算),导致 UI 线程响应滞后。
    并发冲突:在 success 回调中立即触发了另一个模态框(如 wx.showModal 或 wx.showLoading),部分 Android 版本下,新的 UI 层可能会干扰 ActionSheet 的正常销毁流程。
    Android 版本特异性:在旧版 Android(6.7.2 以下)中,点击背景蒙层或取消按钮的行为与 iOS 不同,若逻辑依赖于 fail 回调执行清理,可能会出现异常。
    itemList 溢出或限制:如果 itemList 长度超过 6 个,或者在点击后立即执行了页面跳转/重载,可能导致组件状态未能正确更新.

我的小程序中是因为立即调用了showModal导致的, modal显示后actionSheet没有消失反而叠加在其上. 并且只有第一次会出现, 第二次就不再出现了(我猜测可能showActionSheet所有已经加载到了内存中).
需要使用延时的方法来解决(100ms足够), 如果是用await调用wx.showActionSheet, 也需要在调用后进行延时再处理其他逻辑.

wx.showActionSheet({
  itemList: ['选项A', '选项B'],
  success(res) {
    // 先让 ActionSheet 消失,再处理逻辑
    setTimeout(() => {
      // 这里放置业务代码,如打开 Loading 或 跳转
      console.log('点击了第', res.tapIndex, '项');
    }, 100); 
  }
});

首先要把mcp库升级到最新的版本, 旧版本是不支持的.

pip install --upgrade mcp

关键代码:


from mcp.server.fastmcp import FastMCP, Context

@mcp.tool()
def change_agent(apidataId: str, roleName: str, ctx: Context) -> object:
    pprint(ctx.request_context.request.headers)

这会打印一个headers对象, 例如:


({'host': 'mcpserver.url.cn:port', 'accept': '*/*', 'accept-encoding': 'gzip, deflate', 'connection': 'keep-alive', 'user-agent': 'python-httpx/0.27.2', 'x-linx-device-id': 'xx:xx:xx:xx:xx:xx', 'x-linx-agent-id': 'xxxxxxxxxxxxxxxxxx', 'content-length': '176', 'content-type': 'application/json'})

在小程序中是不能借助客户端能力实现MCP inspector的, 因为要和服务器建立websocket连接, 而小程序建立socket连接或者http请求都要在后台添加url, 并且必须是ssl的形式(https/wss), 这样就无法对任意MCP服务进行inspect. 如果要对任意MCP服务进行inspect, 只能通过云服务的方式, 并且不能是小程序云函数, 因为小程序云函数不支持sse和WebSocket.
如果已经在云端建立了MCP inspector服务, 那么似乎是否一定是小程序载体就没有必要了, web似乎是更好的载体.

python方案 https://github.com/pupil-labs/pupil
浏览器js方案 https://github.com/brownhci/WebGazer 测试了下,需要校准,并且在比较低分辨率的摄像头上似乎效果很不准确.

AI大模型方案 moondream gaze detection https://moondream.ai/ 2B参数做到相对精准的检测. 今年年初发布的开源模型. 油管上有个视频介绍.但速度太慢了, 22秒的视频在RTX A6000上处理的12分钟.
另一个方案gaze-lle https://github.com/fkryan/gazelle 似乎没有找到视频介绍, 也不知道速度如何. https://huggingface.co/spaces/fffiloni/Gaze-LLE 我在huggingface上运行一张图片的时间要30多秒.

研究这个有个感悟, 就是旧方案解决的不是很好的领域, 使用AI可以得到更好的解决, 然而AI需要大量训练且速度更慢能耗与资源消耗高几个数量级. 已眼动跟踪来说, 旧方案如webgazer使用浏览器js即可运行, 而AI方案要A6000才能运行且效率极低.

对比来说, Tobii的方案能实现虚拟键盘打字确实就很厉害了, 虚拟键盘每行有十几个按键都能准确触发确实很了不起.而七鑫易维也能实现每行十多个按键的识别输入也很厉害. 按豆包的反馈, 高精度方案使用瞳孔角膜反射法, 并使用近红外光辅助摄像头捕捉普洱钦点. 还有高成本方案虹膜追踪, 低成本方案使用巩膜追踪法. 但是, 豆包这个成本说法不可信, 因为红外光和摄像头的成本是不高的, 如果算法在普通计算机上能运行, 那么运行成本也是不高的.

在尝试webgazer后发现其精度太差, 而核心其实是应该更近的拍摄眼睛, 因此想到VR/AR方案中也有眼动跟踪的需求, 于是又搜索到了这个方案:
EyeTrackVR https://github.com/EyeTrackVR/EyeTrackVR , 这个方案还有一个完善的文档网站 https://docs.eyetrackvr.dev/
接着在油管搜索 EyeTrack, 又发现两个项目, 这两个项目不用嵌入VR眼镜, 是独立的眼部跟踪:
基于py的: https://github.com/JEOresearch/EyeTracker
基于C++的: https://github.com/YutaItoh/3D-Eye-Tracker

到这儿就颇有些感悟, 眼动跟踪这个看起来有些高端昂贵的产品(比如tobii要一两万, 其他的价格也不低), 从第一性原理出发(SD分辨率摄像头+红外光), 硬件成本似乎并不高, 剩下的其实只是软件算法而已. 另一个感悟是, 摄像头能产生的价值似乎远比想象的还要高得多.

一般国内物联网平台多选用腾讯云 IOT Explorer/阿里云/涂鸦等, 好处是稳定操心少, 问题是有起订数量(1~10k), 沟通成本和初期投入成本略高.
Home Assistant, 主打本地局域网部署
Fastbee, 国内产品, 个人使用免费但是商用要收费
dgiot, 国内产品, Apache2.0证书,可商用, 5.1k star
thingsboard https://github.com/thingsboard/thingsboard, 国外产品, apache2.0证书, 20.6k star

ghost邮箱配置需要注意,.env中的 mail__auth__usermail__from最好是一模一样,因为部分邮箱供应商(如腾讯企业邮)要求这两个一模一样,否则不给发邮件。而ghost发不出去邮件的提示语焉不详,没有清楚表明这一点。
另一点是,如果要让.env修改过生效,需要删除docker容器再重新做新的容器:

docker compose down -v
docker compose up -d

  1. 有个AI可以语音聊天似乎是很牛的事情,然而大家新鲜过后就很少再继续了。因为聊天是个很累的事情,要不断的搜肠刮肚想如何回复和新的话题。如果从聊天中没有足够的知识收益或者情绪收益,人们就懒得聊下去了。相反,通过音乐、评书、新闻、播客等,用户不需要说话就能持续稳定获得收益,用户就更不愿说话了。所以AI对话需要用户的“主动探索”而不是“被动接受”,花费的精力更多。
  2. 儿童和幼儿似乎有不同,他们的表达欲要高于成人,更愿意去探索和交流,所以会出现某个小孩因为小智音箱坏掉痛哭不已的视频。但现在AI语音似乎又不能很好适配这类用户的需求,因为儿童组织语言能力差,一句话说得比较慢,中间停顿思考的时间长,而Ai语音由于网络和处理延时本身较大,为了更快响应用户,往往用户稍有停顿就开始处理回答了,这样经常听不完整用户的语句。这个可能纯靠语音判断用户是否已经说完就比较难,我跟小朋友打电话的时候也经常搞不清楚他到底有没有说完还只是在思考,但当面看到他们的表情和动作就知道了。
    所以AI需要解决如何提供更多的收益给用户,如何准确识别用户已经讲完话。
    另外AI语音要表现得更像一个完整产品的话,也需要有自己完整的语音控制人机界面。能把所有手机操作变为语音界面。

Starlette

https://pypi.org/project/starlette/
Starlette 是一个轻量级、高性能的 ASGI(Asynchronous Server Gateway Interface) 框架,专为构建异步 Web 应用、API 和微服务设计。它以简洁的 API、异步原生支持和可扩展性著称,常与 FastAPI(基于 Starlette 构建)、Uvicorn(ASGI 服务器)等工具配合使用。

核心特性

  1. 异步原生
    完全基于 Python 的 async/await 语法,支持异步请求处理、WebSocket、HTTP/2 等现代 Web 特性,性能优于传统同步框架(如 Flask)。

  2. 轻量级且灵活
    核心代码简洁(约 6k 行),无强制依赖(仅需 anyio 处理异步 I/O),可按需扩展功能(如会话、认证、模板渲染)。

  3. 丰富的功能支持

    • 路由系统(支持路径参数、正则匹配)
    • WebSocket 双向通信
    • HTTP/2 与服务器推送
    • 中间件(Middleware)机制
    • 测试客户端(内置 TestClient
    • 静态文件服务
    • 请求/响应对象封装(支持表单、JSON、文件上传)
  4. 高性能
    底层基于 ASGI,配合 Uvicorn 或 Hypercorn 等服务器,性能接近 Node.js 或 Go 编写的服务。

安装

pip install starlette
# 如需WebSocket或表单处理,需安装额外依赖
pip install starlette[full]

快速入门示例

from starlette.applications import Starlette
from starlette.responses import JSONResponse
from starlette.routing import Route

async def homepage(request):
    return JSONResponse({"message": "Hello, Starlette!"})

async def user_profile(request):
    username = request.path_params["username"]
    return JSONResponse({"username": username})

app = Starlette(
    routes=[
        Route("/", homepage),
        Route("/user/{username}", user_profile),
    ]
)

运行服务(需安装 Uvicorn):

uvicorn main:app --reload

典型应用场景

  • 构建高性能异步 API
  • WebSocket 实时应用(如聊天、通知)
  • 微服务架构中的轻量级服务
  • 与 FastAPI 结合(FastAPI 复用了 Starlette 的核心功能,并增加了自动文档、数据验证等)

与其他框架的对比

  • Flask/Django:Starlette 是异步原生的,更适合 I/O 密集型场景(如数据库查询、外部 API 调用)。
  • FastAPI:FastAPI 基于 Starlette,专注于 API 开发(自动生成 OpenAPI 文档、Pydantic 数据验证),而 Starlette 更通用。
  • Sanic:Starlette 更轻量,生态更简洁,Sanic 则提供更多内置功能。

扩展生态

Starlette 可通过第三方库扩展:

  • jinja2:模板渲染
  • python-multipart:表单处理
  • itsdangerous:会话管理
  • httpx:异步 HTTP 客户端

总之,Starlette 是构建现代异步 Web 应用的高效选择,尤其适合需要高性能和灵活性的场景。

contextlib

contextlib 是 Python 标准库中的模块,专为上下文管理器(Context Manager)设计,提供了简洁、灵活的方式来创建和使用上下文管理器,常用于资源管理(如文件、网络连接、锁)、异常处理、临时环境设置等场景。

上下文管理器的核心是实现 __enter__()__exit__() 方法,而 contextlib 通过装饰器、工具函数等简化了这一过程,无需手动定义类。

核心功能与常用工具

1. @contextmanager 装饰器

最常用的工具,可将生成器函数直接转换为上下文管理器,无需编写完整的类。

  • 生成器中 yield 之前的代码相当于 __enter__() 方法(进入上下文时执行);
  • yield 之后的代码相当于 __exit__() 方法(退出上下文时执行,即使发生异常也会执行)。

示例:自定义文件读取上下文管理器

from contextlib import contextmanager

@contextmanager
def open_file(file_path, mode='r'):
    # __enter__ 逻辑
    f = open(file_path, mode)
    try:
        yield f  # 返回资源给 with 语句
    finally:
        # __exit__ 逻辑(确保资源释放)
        f.close()

# 使用
with open_file('test.txt') as f:
    print(f.read())

2. closing() 函数

用于包装实现了 close() 方法的对象,使其成为上下文管理器,退出时自动调用 close()
适用于没有原生支持上下文管理的资源(如网络连接、数据库连接)。

示例:关闭网络连接

from contextlib import closing
import urllib.request

with closing(urllib.request.urlopen('https://www.python.org')) as page:
    for line in page:
        print(line)
# 自动调用 page.close()

3. suppress() 函数

用于忽略指定的异常,避免手动编写 try-except 块。
进入上下文时若发生指定异常,会直接忽略并继续执行后续代码。

示例:忽略文件不存在异常

from contextlib import suppress

# 忽略 FileNotFoundError,不会报错
with suppress(FileNotFoundError):
    with open('nonexistent.txt') as f:
        print(f.read())

print("继续执行...")

4. redirect_stdout() / redirect_stderr()

用于重定向标准输出/标准错误到指定文件或对象,常用于日志记录、测试输出捕获。

示例:重定向打印输出到文件

from contextlib import redirect_stdout

with open('output.txt', 'w') as f:
    with redirect_stdout(f):
        print("Hello, contextlib!")  # 输出写入 output.txt

5. ExitStack

用于动态管理多个上下文管理器,适合上下文数量不确定的场景(如同时打开多个文件)。
通过 enter_context() 逐个添加上下文,退出时自动逆序关闭所有资源。

示例:动态打开多个文件

from contextlib import ExitStack

files = ['a.txt', 'b.txt', 'c.txt']
with ExitStack() as stack:
    # 逐个添加文件上下文,自动管理
    f_handles = [stack.enter_context(open(f, 'w')) for f in files]
    for f in f_handles:
        f.write('Hello!')
# 所有文件自动关闭

应用场景

  • 资源管理:文件、网络连接、数据库连接的自动关闭;
  • 异常处理:简化 try-except 逻辑,忽略特定异常;
  • 环境临时修改:如临时重定向输出、修改系统配置;
  • 动态上下文管理:处理数量不确定的上下文资源。

总结

contextlib 大幅简化了上下文管理器的创建和使用,避免了重复的 try-finally 代码,让资源管理更简洁、优雅。无论是自定义上下文,还是复用现有对象,它都是 Python 中处理“进入-退出”逻辑的首选工具。

uvicorn

Uvicorn 是一个高性能的 ASGI(Asynchronous Server Gateway Interface)服务器,专为运行异步 Python Web 应用设计,是 Starlette、FastAPI、Quart 等异步框架的首选服务器。它基于 uvloop(高性能事件循环)和 httptools(HTTP 解析工具)构建,性能接近 Node.js 或 Go 编写的服务器。

核心特性

  1. 异步原生支持
    完全兼容 ASGI 3 规范,支持异步请求处理、WebSocket、HTTP/1.1、HTTP/2 以及服务器推送(Server Push)。

  2. 高性能

    • 使用 uvloop 替代 Python 标准库的 asyncio 事件循环(性能提升约 2-4 倍);
    • 基于 httptools 实现快速 HTTP 解析,处理请求的效率极高。
  3. 易用性
    命令行启动简单,支持热重载(开发模式)、配置文件、SSL/TLS 等功能。

  4. 兼容性
    可作为 Gunicorn 的 worker 运行(多进程 + 异步),也可单独作为单进程服务器使用。

安装

# 基础安装
pip install uvicorn

# 完整安装(包含 uvloop 和 httptools,提升性能)
pip install uvicorn[standard]

快速使用

1. 运行简单的 ASGI 应用

创建一个简单的 ASGI 应用(app.py):

async def app(scope, receive, send):
    assert scope['type'] == 'http'
    await send({
        'type': 'http.response.start',
        'status': 200,
        'headers': [(b'content-type', b'text/plain')],
    })
    await send({
        'type': 'http.response.body',
        'body': b'Hello, Uvicorn!',
    })

启动服务器:

uvicorn app:app --reload  # --reload 开发模式,代码修改自动重启

访问 http://127.0.0.1:8000,即可看到响应。

2. 运行 Starlette/FastAPI 应用

以 FastAPI 为例(main.py):

from fastapi import FastAPI

app = FastAPI()

@app.get("/")
async def root():
    return {"message": "Hello, FastAPI + Uvicorn!"}

启动服务器:

uvicorn main:app --host 0.0.0.0 --port 8000 --workers 4
  • --host 0.0.0.0:允许外部访问;
  • --port 8000:指定端口;
  • --workers 4:启动 4 个 worker 进程(多核利用)。

常用命令行参数

参数 作用
--reload 开发模式,文件修改自动重启
--host 绑定主机地址(默认 127.0.0.1
--port 绑定端口(默认 8000
--workers 启动的 worker 进程数(推荐设置为 CPU 核心数)
--ssl-keyfile SSL 私钥文件路径(启用 HTTPS)
--ssl-certfile SSL 证书文件路径(启用 HTTPS)
--log-level 日志级别(debug/info/warning/error

生产环境部署

生产环境中,通常结合 Gunicorn(进程管理器)和 Uvicorn(worker)使用,兼顾多进程和异步性能:

# 安装 Gunicorn
pip install gunicorn

# 启动:Gunicorn 作为主进程,Uvicorn 作为 worker
gunicorn main:app --workers 4 --worker-class uvicorn.workers.UvicornWorker --bind 0.0.0.0:8000

与其他服务器的对比

  • Gunicorn:WSGI 服务器,不支持异步;可搭配 Uvicorn worker 实现异步支持。
  • Hypercorn:另一个 ASGI 服务器,支持 HTTP/3,功能与 Uvicorn 类似,但性能稍弱。
  • Daphne:由 Django 团队开发的 ASGI 服务器,兼容性好,但性能低于 Uvicorn。

总结

Uvicorn 是异步 Python Web 应用的高性能服务器,兼具易用性和扩展性,是 Starlette、FastAPI 等框架的标配。开发时用 --reload 提升效率,生产环境结合 Gunicorn 实现多进程部署,可充分发挥异步应用的性能优势。

官方支持的所有语言 https://modelcontextprotocol.io/docs/sdk
官方 python SDK https://github.com/modelcontextprotocol/python-sdk
官方 Typescript SDK https://github.com/modelcontextprotocol/typescript-sdk

官方SDK支持的前两位分别是python和Typescript. 这儿对比一下两者编程的复杂度.

导入库:

py

from mcp.server.fastmcp import FastMCP

ts

import { McpServer, ResourceTemplate } from '@modelcontextprotocol/sdk/server/mcp.js';
import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
import express from 'express';
import * as z from 'zod/v4';

新建server

py

# Create an MCP server
mcp = FastMCP("Demo", json_response=True)

ts

// Create an MCP server
const server = new McpServer({
    name: 'demo-server',
    version: '1.0.0'
});

加入工具

py

# Add an addition tool
@mcp.tool()
def add(a: int, b: int) -> int:
    """Add two numbers"""
    return a + b

ts

// Add an addition tool
server.registerTool(
    'add',
    {
        title: 'Addition Tool',
        description: 'Add two numbers',
        inputSchema: { a: z.number(), b: z.number() },
        outputSchema: { result: z.number() }
    },
    async ({ a, b }) => {
        const output = { result: a + b };
        return {
            content: [{ type: 'text', text: JSON.stringify(output) }],
            structuredContent: output
        };
    }
);

加入资源

py

# Add a dynamic greeting resource
@mcp.resource("greeting://{name}")
def get_greeting(name: str) -> str:
    """Get a personalized greeting"""
    return f"Hello, {name}!"

ts

// Add a dynamic greeting resource
server.registerResource(
    'greeting',
    new ResourceTemplate('greeting://{name}', { list: undefined }),
    {
        title: 'Greeting Resource', // Display name for UI
        description: 'Dynamic greeting generator'
    },
    async (uri, { name }) => ({
        contents: [
            {
                uri: uri.href,
                text: `Hello, ${name}!`
            }
        ]
    })
);

启动服务

py

# Run with streamable HTTP transport
if __name__ == "__main__":
    mcp.run(transport="streamable-http")

ts

// Set up Express and HTTP transport
const app = express();
app.use(express.json());

app.post('/mcp', async (req, res) => {
    // Create a new transport for each request to prevent request ID collisions
    const transport = new StreamableHTTPServerTransport({
        sessionIdGenerator: undefined,
        enableJsonResponse: true
    });

    res.on('close', () => {
        transport.close();
    });

    await server.connect(transport);
    await transport.handleRequest(req, res, req.body);
});

const port = parseInt(process.env.PORT || '3000');
app.listen(port, () => {
    console.log(`Demo MCP Server running on http://localhost:${port}/mcp`);
}).on('error', error => {
    console.error('Server error:', error);
    process.exit(1);
});

结论

很显然python代码更短, python库封装的更多.

Truffle 语言

Truffle 并非独立的编程语言,而是一种基于 Truffle 框架实现的动态语言实现技术——通常指通过 Truffle 框架构建的语言(如 GraalVM 生态中的 Ruby、Python、JavaScript 等实现,或特定领域语言)。这些语言实现利用 Truffle 的特性(如部分求值、即时编译),能够高效运行在 GraalVM 上,甚至实现跨语言互操作。

Truffle 框架

Truffle 是由 Oracle Labs 开发的开源语言实现框架,基于 Java 构建,专为快速实现高效的动态语言解释器设计,核心特点如下:

  1. 基于抽象语法树(AST)的解释器
    Truffle 要求语言实现者将源代码解析为 AST,框架通过遍历 AST 执行代码。每个 AST 节点封装了具体的语义逻辑(如加法、变量查找)。

  2. 部分求值(Partial Evaluation)与即时编译(JIT)
    Truffle 内置自优化机制:运行时会记录 AST 节点的执行热点(如频繁调用的函数),并通过 Graal 编译器将热点代码编译为机器码,大幅提升执行效率(接近静态编译语言)。

  3. 与 GraalVM 深度集成
    Truffle 是 GraalVM 的核心组件之一,基于 Truffle 实现的语言可直接运行在 GraalVM 上,支持跨语言调用(如 Java 调用 Truffle-Ruby 代码)、原生镜像编译(Native Image)等特性。

  4. 简化语言实现
    框架封装了复杂的优化逻辑(如类型推测、逃逸分析),语言开发者无需关注底层编译细节,只需专注于语言语义的实现。

典型应用

  • GraalVM 中的 graaljs(JavaScript)、truffleruby(Ruby)、graalpython(Python)均基于 Truffle 实现。
  • 可用于快速构建领域特定语言(DSL),或优化现有动态语言的性能。

简言之,Truffle 框架是动态语言高效实现的“基础设施”,而“Truffle 语言”则是基于该框架构建的语言实例。

GraalVM是由Oracle Labs发起的高性能JDK发行版,2011年源于其内部研究项目,核心目标是突破单一语言运行限制,同时提升Java及多语言应用的执行效率,适配云原生等现代应用场景。以下是其核心特性与关键信息的详细介绍:

  1. 多语言融合能力
    它借助Truffle语言实现框架,能同时支持Java、Scala等JVM系语言,以及JavaScript、Python、Ruby等非JVM语言,甚至还能运行C/C++、Rust等编译为LLVM字节码的语言。更关键的是不同语言可在同一应用中无缝互操作,比如JavaScript代码能直接调用Java方法,且无需额外的跨语言通信开销,数据可在同一内存空间传递,无需拷贝。
  2. 多样化运行模式
    • JVM运行模式:默认将Graal编译器作为顶级即时(JIT)编译器集成在HotSpot虚拟机中。该模式下应用正常在JVM加载执行,JVM将字节码传递给Graal编译器,由其编译为机器码后返回JVM,凭借激进内联、多态内联等优化手段,让高抽象度的Java程序大幅提升性能。
    • 原生镜像(Native Image):这是其极具创新性的功能,可在构建时将Java字节码及依赖的类库、JDK必要组件提前编译为特定系统和架构的独立原生可执行文件。该文件无需JVM即可运行,还具备启动快、内存占用低、打包紧凑的优势,很适合云原生微服务场景。
    • Truffle上的Java(Java on Truffle):基于Truffle框架实现的Java虚拟机规范,是完整的Java虚拟机,复用GraalVM的相关库和组件,不过目前属于实验性技术。
  3. 核心优势突出
    • 资源占用少:原生可执行文件仅包含应用必需的类、方法和字段,避免了JIT编译带来的额外资源消耗,降低了内存与CPU占用。
    • 安全性更高:剔除无用代码和JIT编译相关架构,且通过“封闭世界假设”限制动态加载未知代码,减少了应用的攻击面,还可嵌入软件物料清单,方便检测漏洞。
    • 适配性强:不仅获得Spring Boot、Quarkus等主流微服务框架的一等支持,还能适配AWS、谷歌云、Azure等主流云平台,便于开发和部署云原生应用。
  4. 良好的工具兼容性
    开发过程中可兼容常见Java IDE和开发工具,也支持JUnit测试框架;构建环节提供Maven、Gradle的构建插件;监控方面能适配Java飞行记录器(JFR)、JMX等常用监控工具,无需大幅调整现有开发和运维流程。