首页 文章 精选 留言 我的

精选列表

搜索[具身基座模型],共10000篇文章
优秀的个人博客,低调大师

WebAssembly完全入门——了解wasm的前世今身

前言 接触WebAssembly之后,在google上看了很多资料。感觉对WebAssembly的使用、介绍、意义都说的比较模糊和笼统。感觉看了之后收获没有达到预期,要么是文章中的例子自己去实操不能成功,要么就是不知所云、一脸蒙蔽。本着业务催生技术的态度,这边文章就诞生了。前部分主要是对WebAssembly的背景做一些介绍,WebAssembly是怎么出现的,优势在哪儿。如果想直接开始撸代码试试效果,可以直接跳到最后一个板块。 WebAssembly是什么? 定义 首先我们给它下个定义。 WebAssembly 或者 wasm 是一个可移植、体积小、加载快并且兼容 Web 的全新格式 例子 当然,我知道,即使你看了定义也不知道WebAssembly到底是什么东西。废话不多说,我们通过一个简单的例子来看看WebAssembly到底是什么。 上图的左侧是用C++实现的求递归的函数。中间是十六进制的Binary Code。右侧是指令文本。可能有人就问,这跟WebAssembly有个屁的关系?其实,中间的十六进制的Binary Code就是WebAssembly。 编译目标 大家可以看到,其可写性和可读性差到无法想象。那是因为WebAssembly不是用来给各位用手一行一行撸的代码,WebAssembly是一个编译目标。什么是编译目标?当我们写TypeScript的时候,Webpack最后打包生成的JavaScript文件就是编译目标。可能大家已经猜到了,上图的Binary就是左侧的C++代码经过编译器编译之后的结果。 WebAssembly的由来 性能瓶颈 在业务需求越来越复杂的现在,前端的开发逻辑越来越复杂,相应的代码量随之变的越来越多。相应的,整个项目的起步的时间越来越长。在性能不好的电脑上,启动一个前端的项目甚至要花上十多秒。这些其实还好,说明前端越来越受到重视,越来越多的人开始进行前端的开发。 但是除了逻辑复杂、代码量大,还有另一个原因是JavaScript这门语言本身的缺陷,JavaScript没有静态变量类型。这门解释型编程语言的作者Brendan Eich,仓促的创造了这门如果被广泛使用的语言,以至于JavaScript的发展史甚至在某种层面上变成了填坑史。为什么说没有静态类型会降低效率。这会涉及到一些JavaScript引擎的一些知识。 静态变量类型所带来的问题 这是Microsoft Edge浏览器的JavaScript引擎ChakraCore的结构。我们来看一看我们的JavaScript代码在引擎中会经历什么。 JavaScript文件会被下载下来。 然后进入Parser,Parser会把代码转化成AST(抽象语法树). 然后根据抽象语法树,Bytecode Compiler字节码编译器会生成引擎能够直接阅读、执行的字节码。 字节码进入翻译器,将字节码一行一行的翻译成效率十分高的Machine Code. 在项目运行的过程中,引擎会对执行次数较多的function记性优化,引擎将其代码编译成Machine Code后打包送到顶部的Just-In-Time(JIT) Compiler,下次再执行这个function,就会直接执行编译好的Machine Code。但是由于JavaScript的动态变量,上一秒可能是Array,下一秒就变成了Object。那么上一次引擎所做的优化,就失去了作用,此时又要再一次进行优化。 asm.js出现 所以为了解决这个问题,WebAssembly的前身,asm.js诞生了。asm.js是一个Javascript的严格子集,合理合法的asm.js代码一定是合理合法的JavaScript代码,但是反之就不成立。同WebAssembly一样,asm.js不是用来给各位用手一行一行撸的代码,asm.js是一个编译目标。它的可读性、可读性虽然比WebAssembly好,但是对于开发者来说,仍然是无法接受的。 asm.js强制静态类型,举个例子。 function asmJs() { 'use asm'; let myInt = 0 | 0; let myDouble = +1.1; } 为什么asm.js会有静态类型呢?因为像0 | 0这样的,代表这是一个Int的数据,而+1.1则代表这是一个Double的数据。 asm.js不能解决所有的问题 可能有人有疑问,这问题不是解决了吗?那为什么会有WebAssembly?WebAssembly又解决了什么问题?大家可以再看一下上面的ChakraCore的引擎结构。无论asm.js对静态类型的问题做的再好,它始终逃不过要经过Parser,要经过ByteCode Compiler,而这两步是JavaScript代码在引擎执行过程当中消耗时间最多的两步。而WebAssembly不用经过这两步。这就是WebAssembly比asm.js更快的原因。 WebAssembly横空出世 所以在2015年,我们迎来了WebAssembly。WebAssembly是经过编译器编译之后的代码,体积小、起步快。在语法上完全脱离JavaScript,同时具有沙盒化的执行环境。WebAssembly同样的强制静态类型,是C/C++/Rust的编译目标。 WebAssembly的优势 WebAssembly和asm.js性能对比 下面的图是Unity WebGL使用和不使用WebAssembly的起步时间对比的一个BenchMark,给大家当作一个参考。 可以看到,在FireFox中,WebAssembly和asm.js的性能差异达到了2倍,在Chrome中达到了3倍,在Edge中甚至达到了6倍。通过这些对比也可以从侧面看出,目前所有的主流浏览器都已经支持WebAssembly V1(Node >= 8.0.0). 与JavaScript做对比 我自己在一个用create-react-app新建的项目中,分别对比了WebAssembly版本和原生JavaScript版本的递归无优化的Fibonacci函数,下图是这两个函数在值是45、48、50的时候的性能对比。 看图说话,这就是WebAssembly与JavaScript很实际的一个性能对比。几乎稳定的是JavaScript的两倍。 WebAssembly在大型项目中的应用 在这里能够举的例子还是很多,比如AutoCAD、GoogleEarth、Unity、Unreal、PSPDKit、WebPack等等。拿其中几个来简单说一下。 AutoCAD 这是一个用于画图的软件,在很长的一段时间是没有Web的版本的,原因有两个,其一,是Web的性能的确不能满足他们的需求。其二,在WebAssembly没有面世之前,AutoCAD是用C++实现的,要将其搬到Web上,就意味着要重写他们所有的代码,这代价十分的巨大。 而在WebAssembly面世之后,AutoCAD得以利用编译器,将其沉淀了30多年的代码直接编译成WebAssembly,同时性能基于之前的普通Web应用得到了很大的提升。正是这些原因,得以让AutoCAD将其应用从Desktop搬到Web中。 Google Earth Google Earth也就是谷歌地球,因为需要展示很多3D的图像,对性能要求十分高,所以采取了一些Native的技术。最初的时候就连Google Chrome浏览器都不支持Web的版本,需要单独下载Google Earth的Destop应用。而在WebAssembly之后呢,谷歌地球推出了Web的版本。而据说下一个可以运行谷歌地球的浏览器是FireFox。 Unity和Unreal游戏引擎 这里给两个油管的链接自己体验一下,大家注意上网的方式。 Unity WebGL的戳这里 Unreal引擎的戳这里 WebAssembly要取代JavaScript? 答案是否定的,请看下图。 大家可以看到这是一个协作关系。WebAssembly是被设计成JavaScript的一个完善、补充,而不是一个替代品。WebAssembly将很多编程语言带到了Web中。但是JavaScript因其不可思议的能力,仍然将保留现有的地位。 什么时候使用WebAssembly? 说了这么多,我到底什么时候该使用它呢?总结下来,大部分情况分两个点。 对性能有很高要求的App/Module/游戏 在Web中使用C/C++/Rust/Go的库 举个简单的例子。如果你要实现的Web版本的Ins或者Facebook, 你想要提高效率。那么就可以把其中对图片进行压缩、解压缩、处理的工具,用C++实现,然后再编译回WebAssembly。 WebAssembly的几个开发工具 AssemblyScript。支持直接将TypeScript编译成WebAssembly。这对于很多前端同学来说,入门的门槛还是很低的。 Emscripten。可以说是WebAssembly的灵魂工具不为过,上面说了很多编译,这个就是那个编译器。将其他的高级语言,编译成WebAssembly。 WABT。是个将WebAssembly在字节码和文本格式相互转换的一个工具,方便开发者去理解这个wasm到底是在做什么事。 WebAssembly的意义 在我的个人理解上,WebAssembly并没有要替代JavaScript,一统天下的意思。我总结下来就两个点。 给了Web更好的性能 给了Web更多的可能 关于WebAssembly的性能问题,之前也花了很大的篇幅讲过了。而更多的可能,随着WebAssembly的技术越来越成熟,势必会有更多的应用,从Desktop被搬到Web上,这会使本来已经十分强大的Web更加丰富和强大。 WebAssembly实操 要进行这个实际操作,你需要安装上文提到过的编译器Emscripten,然后按照这个步骤去安装。以下的步骤都默认为你已经安装了Emscripten。 WebAssembly在Node中的应用 导入Emscripten环境变量 进入到你的emscripten安装目录,执行以下代码。 source emsdk/emsdk_env.sh 新建C文件 用C实现一个求和文件test.c,如下。 int add(int a, int b) { return a + b; } 使用Emscripten编译C文件 在同样的目录下执行如下代码。 emcc test.c -Os -s WASM=1 -s SIDE_MODULE=1 -o test.wasm emcc就是Emscripten编译器,test.c是我们的输入文件,-Os表示这次编译需要优化,-s WASM=1表示输出wasm的文件,因为默认的是输出asm.js,-s SIDE_MODULE=1表示就只要这一个模块,不要给我其他乱七八糟的代码,-o test.wasm是我们的输出文件。 编译成功之后,当前目录下就会生成test.wasm。 编写在Node中调用的代码 新建一个js文件test.js。代码如下。 const fs = require('fs'); let src = new Uint8Array(fs.readFileSync('./test.wasm')); const env = { memoryBase: 0, tableBase: 0, memory: new WebAssembly.Memory({ initial: 256 }), table: new WebAssembly.Table({ initial: 2, element: 'anyfunc' }), abort: () => {throw 'abort';} } WebAssembly.instantiate(src, {env: env}) .then(result => { console.log(result.instance.exports._add(20, 89)); }) .catch(e => console.log(e)); 执行test.js 运行以下代码。 node test.js 然后就可以看到输出的结果109了。 WebAssembly在React当中的应用 通过fetch的方法调用 直接用fetch的方式。大概的调用方式如下。 const fibonacciUrl = './fibonacci.wasm'; const {_fibonacci} = await this.getExportFunction(fibonacciUrl); 而getExportFunction具体代码如下。 getExportFunction = async (url) => { const env = { memoryBase: 0, tableBase: 0, memory: new WebAssembly.Memory({ initial: 256 }), table: new WebAssembly.Table({ initial: 2, element: 'anyfunc' }) }; const instance = await fetch(url).then((response) => { return response.arrayBuffer(); }).then((bytes) => { return WebAssembly.instantiate(bytes, {env: env}) }).then((instance) => { return instance.instance.exports; }); return instance; }; 通过import C文件来调用 先通过Import的方式来引进依赖。 import wasmC from './add.c'; 然后进行调用。具体的方式如下。 wasmC({ 'global': {}, 'env': { 'memoryBase': 0, 'tableBase': 0, 'memory': new WebAssembly.Memory({initial: 256}), 'table': new WebAssembly.Table({initial: 0, element: 'anyfunc'}) } }).then(result => { const exports = result.instance.exports; const add = exports._add; const fibonacci = exports._fibonacci; console.log('C return value was', add(2, 5643)); console.log('Fibonacci', fibonacci(2)); }); 详细的代码在这里,欢迎Star。 写在后面 如今技术出现的越来越多,但是实际上在工作中能够用到的,越并不是那么多。其实很多大厂所输出的一些技术,都是有业务场景的,有业务做推动。而不是凭空造轮子。所以总结下来适合自己的才是最好的。当然不是说不要了解新技术,了解新技术跟上步伐是十分必要的。我们现在不用,不代表不需要了解。相反,以后再遇到类似的业务场景时,我们就会多一种选择,可以更加从容的对待。 欢迎微信搜索关注【SH的全栈笔记】,回复【队列】获取MQ学习资料,包含基础概念解析和RocketMQ详细的源码解析,持续更新中。 好了以上就是本篇博客的全部内容了,如果你觉得这篇文章对你有帮助,还麻烦点个赞,关个注,分个享,留个言。

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

开源鸿蒙“校园合伙人”:以青春代码,共筑数字中国新基座

五年前,开源鸿蒙作为中国开源土壤中的一颗种子开始萌芽;五年后,它已成长为一棵枝繁叶茂的大树,根系深扎,枝叶触及千行万业。从最初的约700万行代码扩展到如今的1.3亿行,从零散的贡献者发展到超过9300名共建者,从单一的应用场景拓展到支持120多款芯片、1300多款软硬件产品,开源鸿蒙以其稳健的发展步伐,展现了中国开源社区的生命力。 近年来,工业和信息化部明确提出“推动开源鸿蒙在关键行业的规模化应用”“构建自主可控的基础软件生态”,将国产操作系统的发展提升至国家数字安全与产业竞争力的战略高度,并强调发挥高校、科研机构在开源技术研发中的基础性作用。在这一政策引导下,开源鸿蒙建设不仅是一项技术工程,更成为国家数字化转型中的重要实践。 在这一生态建设的过程中,活跃着一群年轻的身影,他们是开源鸿蒙的“校园合伙人”。在开源鸿蒙项目群技术指导委员会(TSC)的推动下,开源鸿蒙技术俱乐部在全国38所高校陆续成立。秉承“开展创新工作,成就一流人才”的宗旨,这些俱乐部成为连接校园与产业、理论与实践的重要平台。在这里,师生们从技术使用者逐步转变为生态共建者,在开源社区的实践中实现专业成长。 在近期举办的开源鸿蒙技术大会上,来自多所高校的师生分享了他们与开源鸿蒙的故事,展现了开源鸿蒙技术俱乐部的多元实践路径。 在湖南大学,开源鸿蒙技术俱乐部的团队成员将机器人系统从树莓派+Linux迁移到开源鸿蒙平台,充分利用其分布式能力与实时特性,实现了多机协同与低延迟响应。这一创新不仅帮助团队在国际机器人竞赛中取得佳绩,更成功转化为商品化的教学实验箱,服务于更多院校的教学实践。从兴趣出发到实现产业价值,湖南大学的校园合伙人展现了技术创新与市场需求相结合的可能。 与此同时,上海交通大学的师生深入系统底层,在安全内核、EROFS文件系统、渲染模块等关键技术领域开展研究。他们着力解决社区发展中的技术难题,特别是在电力行业,其研究成果帮助基于开源鸿蒙的电鸿操作系统实现了EAL5+级别的安全认证,为关键行业的国产化替代提供了技术支持。这些实践表明,高校在基础软件生态建设中能够发挥重要的技术支撑作用。 北京航空航天大学则通过构建“科研驱动—竞赛实践—课程融合—激励机制”的人才培养体系,将开源鸿蒙社区的真实需求引入教学科研环节。学生们在课程学习、竞赛实践和社区贡献的良性循环中,从技术使用者成长为生态共建者,形成了可持续的人才培养模式。 开源鸿蒙技术俱乐部的价值不仅体现在技术贡献上,更体现在他们对开源理念的认同和实践。在全球化与技术发展并行的今天,他们通过一行行代码、一个个项目,表达了对中国开源社区发展的信心与支持。这份信心,源于实践,基于成果。 作为产学研用协同发展的重要一环,开源鸿蒙技术俱乐部成为连接高校智慧与产业需求的桥梁。他们将课堂知识转化为社区贡献,将产业需求转化为研究课题。 如今,在金融、能源、交通、政务、人工智能、消费电子等多个领域,开源鸿蒙正逐步成为支持各行业数字化转型的基础平台。在金融行业,基于开源鸿蒙的智慧银行实现叫号机与智能手表的联动,提升服务体验;在交通领域,智慧隧道解决方案已在多个省份投入使用;在政务领域,2万多部开源鸿蒙社保终端在山西全省部署,实现"一分钟"办理养老资格认证。这些实际应用场景的落地,彰显了开源鸿蒙作为数字底座的实用价值,而今天在校园中参与共建的学生,未来有望成为推动技术落地、促进生态发展的中坚力量。 五年来,开源鸿蒙从无到有、稳步发展;五年来,一群校园合伙人用代码参与建设,用实践见证成长。他们既是学生,也是共建者;既是学习者,也是创新者。 优秀的系统生态,需要持续的共建与完善。今天,开源鸿蒙的校园合伙人在实验室里写下的代码,可能成为明天行业解决方案的一部分;他们在俱乐部里产生的创意,或许正在孕育未来数字生活的创新。随着国家对开源生态支持力度的加大,以及更多高校加入开源鸿蒙技术俱乐部,相信会有更多青年学子加入“校园合伙人”的行列,用专业能力和创新精神,为数字中国建设贡献力量。

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

盘古开发框架 v6.0 发布,行业数字化赋能开发基座

盘古开发框架是一套轻量稳健的工业级 Web 接口服务和中后台业务系统开发框架。原生支持微服务分布式架构的同时也兼容单体应用架构模式。基于商业友好的Apache-2.0协议免费开源发布。我们希望不仅是开源的受益者也能成为开源贡献者,与开源社区一起共建共享开源生态。 在线演示系统 开源项目主页 本次更新内容: - [pangu app starter] 整合集成 uni-app 和uview ui 提供移动端快速开发脚手架。 - [pangu app starter] 发布 pagu app starter 的 H5 版本、微信小程序版本、Android 原生版本的示例程序。 - [pangu] 解决 nacos 依赖版本升级后,ConfigParseUtils API 不向下兼容导致的 bug(出参类型结构变了)。 - [pangu] 升级 hutool 版本,解决 xml 序列化远程代码执行漏洞。 - [pangu] 增加配置项:pangu.log-reload 根据Nacos配置实现动态热刷新日志级别(缺省:true)。 - [pangu] 升级 SpringBoot 依赖 到最新版本 2.7.17。 - [pangu] 优化日志级别远程热加载功能。 - [pangu] 升级 nacos 到2.2.4,并完成兼容性适配调整。 - [pangu] 升级 dubbo 到3.2.9, 并完成 triple 协议切换和双向流式推送功能样例。 - [pangu] 变更 dubbo 调用自定义异常类返回方式。由 hack ExceptionFilter 改为接口方法声明自定义异常或者抛出 RcpException。 - [pangu] 调整了自定义 Starter 的自动装配逻辑。删除了原 pangu-xx-spring-boot-starter,合并为 pangu-spring-boot-starter。 - [pangu] 调整了框架封装指导思想,删除了大量无意义或通用性不高或扩展性不强的封装动作。使得框架更加透明与灵活。

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

🎯AutoScan v1.0.0 发布:解决Spring Boot项目基座跨包扫描痛点

AutoScan 是一个轻量级的 Spring Boot Starter,专门解决企业级 Spring Boot 开发中跨包扫描的痛点问题。在传统的 Spring Boot 项目中,技术基础设施和业务基础设施的包结构往往是固定的(例如 org.itrys.boot、org.itrys.base),而业务项目通常使用公司自己的域包(例如 com.company.project)。这导致传统的 @ComponentScan 机制无法同时扫描基础设施包和业务包。 AutoScan 通过实现 ApplicationContextInitializer 接口,在 Spring 容器启动的早期阶段自动扫描配置的基础包,完美解决了这一痛点。 v1.0.0 版本特性 核心功能 自动基础包扫描 - 在基础设施项目中配置一次,对所有依赖项目生效 业务包零配置 - 利用 @SpringBootApplication 的默认扫描机制 多层基础设施支持 - 业务项目也可以作为其他项目的基础设施 非侵入式设计 - 不改变现有代码结构,即插即用 开发者友好 - 提供详细的扫描日志便于调试 轻量级 - 无额外依赖,与 Spring Boot 完美兼容 技术规格 基于 Spring Boot 3.2.0 开发 兼容 Spring Boot 3.x/4.x JDK 17+ 无额外依赖 快速开始 1. 添加依赖 org.itrys autoscan-spring-boot-starter 1.0.0 2. 配置基础包 在 application.yml 中配置: auto-scan: base-packages: - org.itrys.boot # 技术基础设施 - org.itrys.base # 业务基础设施 - com.company.framework # 公司框架 dev-mode: true # 开发模式,输出详细日志 3. 启动应用 @SpringBootApplication public class ProjectApplication { public static void main(String[] args) { SpringApplication.run(ProjectApplication.class, args); } } 启动后,控制台会输出扫描日志: >>> [AutoScan] Initializing base package scanner... >>> [AutoScan] Configured base packages: [org.itrys.boot, org.itrys.base, com.company.framework] >>> [AutoScan] Successfully registered 58 bean(s) from base packages. 应用场景 技术基础设施项目 为所有业务项目提供核心框架能力 业务基础设施项目 基于技术基础设施,封装通用业务能力 常规业务项目 基于技术/业务基础设施开发具体业务(无需额外配置 business-packages)

资源下载

更多资源
腾讯云软件源

腾讯云软件源

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

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等操作系统。

用户登录
用户注册