WebAssembly,Web的新时代

by admin on 2020年3月27日

WebAssembly 一直被视为清除 Web
质量放下的恩人,各大主流浏览器也侵扰选取拥抱 WebAssembly 。越发是
Firefox ,在对 WebAssembly 的优化上下了过多素养,疑似引入分层编写翻译和
IndexedDB 缓存。

澳门新葡亰平台官网 1

IT之家10月十二日新闻谷歌(Google卡塔尔国近日发表Google地球将最终协理具备别的依据Chromium的浏览器。谷歌(GoogleState of Qatar在博客小说中公布了这一音信,解释了在后台举办的转移以使其获取辅助。

那 WebAssembly 如今实际利用起来的功效情况怎么样?PSPDFKit近些日子创办并开源了一个 澳门新葡亰平台官网,WebAssembly
测量检验基准,目的在于通过测验掌握渲染情状,来巩固网页版
PSPDFKit的施行质量。该测量检验关切的是使用的其实实践的情形,测验得分越低代表越好。

引用小编:张敏(zhāng mǐn 卡塔尔(قطر‎,AMD开源工夫主题Web团队软件本领CEO,原Opera
Software软件经营,在浏览器及Web
Runtime领域办事10年,潜心于Web及开源技术。主要编辑:陈秋歌本文为《技士》原创随笔,未经同意不得转发,更多卓越随笔请订阅《技士》在浏览器之争中,Chrome依据JavaScript的出色品质获得了市集主导地位,然则由于JavaScript的无类型天性,招致其运作时消耗大批量的质量做为代价,那也是JavaScript的瓶颈之一。WebAssembly目的在于解决这一标题。本文从WebAssembly的来自到支付实施对其做完备探求,扶助开拓者对WebAssembly有周全的打听。缘起让我们从浏览器战役聊到。微软依附Windows系统捆绑Internet
Explorer的后天优势制伏Netscape后,步入了长达数年的静默期。而Netscape则于一九九八年将Communicator开源,并由Mozilla基金会衍生出Firefox浏览器,在二零零零年揭露了1.0本子。从今未来,第一遍浏览器战争拉开帷幔。本场战火由Firefox浏览器领衔,Safari、Opera等浏览器也积极进取,Internet
Explorer的主导地位第壹回直面挑战。二零零六年Google推出Chrome浏览器,不但稳步侵蚀Firefox的商海,更是强逼了高大的Internet
Explorer。在这里次大战之后的二零一二年,StatCounter的多少建议Chrome以微弱优势超过Internet
Explorer成为世界上最流行的浏览器。深入分析Google Chrome浏览器制伏Internet
Explorer的案由,除了对Web规范更温和的支撑外,非凡的性质是里面举足轻重的要素,而浏览器品质之争的精气神则体今后JavaScript引擎。早前,JavaScript引擎的兑现情势阅世了遍历语法树到字节码解释器等比较原始的法门,将每条源代码翻译成相应的机器码并实行,并不保留翻译后的机器码,使得解释实行异常慢。二〇一〇年12月,Google发表了V8
JavaScript引擎。V8被规划用来坚实Web浏览器中JavaScript的实施品质,通过即时编写翻译JIT手艺,在奉行时将JavaScript代码编译成更为急速的机器代码并保留,下一次施行同一代码段时不必要再编写翻译,使得JavaScript获得了几十倍的天性进步。可是,JavaScript是个无类型的言语,那直接形成说明式c=a+b有多种意思:a、b均为数字,则算术运算符+表示值相加;a、b为字符串,则+运算符表示字符串连接;…表明式试行时,JIT编写翻译器需求检查a和b的类型,鲜明操作行为。若a、b均为数字,JIT编写翻译器则将a、b确感觉整型,而只要某一变量形成字符串,JIT编写翻译器则必须要将事前编写翻译的机器码推倒重来。一句话来讲,JavaScript的无类型性情建设构造在花费大批量性情代价的底子之上。纵然JIT编写翻译器在对变量类型产生变化时已拓宽对应优化,但依然有过多处境JavaScript引擎未进行或不能优化,比如for-of、try-catch、try-finally、with语句以致复合let、const赋值的函数等。综上可得,JavaScript的无类型是JavaScript引擎的质量瓶颈之一,改过方案有两种:一是安插一门新的强类型语言并威逼开拓者实行项目钦点;二是给现存的JavaScript加上变量类型。微软支付的TypeScript归属第一种改良方案。它是扩张了JavaScript天性的语言,蕴含了档期的顺序讲解,编写翻译时类型检查,类型猜想和擦除等成效,TypeScript开辟者在宣称变量时钦点项目,使得JavaScript引擎能够越来越快将这种强类型的语言编写翻译成弱类型。看看第三种方案:代码1代码1意味着带有多少个参数的JavaScript函数,和常常JavaScript代码区别的地点在于a=a
| 0及b=b |
0,以致重临值前面均选用申明实行了按位OTucson操作。这么做的独特的地方是使JavaScript引擎强迫调换变量的值为整型试行。通过标记加上变量类型,JavaScript引擎就能够越来越快地编写翻译。既然扩大变量类型能够升高Web性能,有未有措施将静态类型代码比如C/C++等转移成JavaScript指令的子集呢?上边的这段代码赶巧是当作JavaScript子集的asm.js,由代码2的C语言编写翻译而来:代码2其实,早在壹玖玖贰年起就早就有Netscape
Plugin
API在内的能够行使浏览器运维C/C++程序的体系在付出。而二零一一年出版的asm.js是当下较为多如牛毛的方案。asm.js是一种中间编制程序语言,允许用C/C++语言编写的微处理机软件作为Web应用程序运转,并维持越来越好的习性,而Mozilla
Firefox从版本22起成为第二个为asm.js特别优化的网页浏览器。Google也一致在为原生代码运营在Web端而尽心尽力。GoogleNative Client选取沙盒技艺,让英特尔x86、ARM或MIPS子集的机器码直接在沙盒上运营。它能够在没有须求安装插件的图景下从浏览器直接运营原生可举办代码,使Web应用程序能够用相符于机器码运作的速度来运营。而谷歌Portable Native
Client则稍有转移,通过一些前端编写翻译器将C/C++源代码编写翻译成LLVM的中等字节码并不是x86或ARM代码,况兼开展优化以致链接。有了连串匡助,第三种方案质量升高潜在的能量远远胜出第一种。然则,无论是asm.js或现存PNaCl的化解方案,都面对着有个别欠缺或任何浏览器不援救的泥坑,而二零一四年3月对Chromium难点跟踪代码的探究更是注脚,谷歌Native
Client小组已被关门。作为Web浏览器质量和代码重用的缓和方案,asm.js及PNaCl都未能被周围采取,那么有未有上述表格中的性情全体占优,且跨商家的缓和方案吧?WebAssembly意在消除这些主题材料。新时代WebAssembly是一种新的相符于编写翻译到Web的,可移植的,大小和加载时间赶快的格式。那是四个新的与平台非亲非故的二进制代码格式,指标是减轻JavaScript质量难题。那个新的二进制格式远远小于JavaScript,可由浏览器的JavaScript引擎直接加载和执行,那样可节省从JavaScript到字节码,从字节码到施行前的机器码所花费的即时编写翻译JIT时间。
作为一种低档语言,它定义了一个抽象语法树,开辟职员能够以文本格式进行调度。WebAssembly描述了一个内部存款和储蓄器安全的沙箱实践情况,能够在现存的JavaScript虚拟机中完成。
当嵌入到Web中时,WebAssembly将免强施行浏览器的同源和权限安全计谋。因而,和平常现身安全漏洞的Flash插件相比较,WebAssembly是三个越发安全的解决方案。WebAssembly可由C/C++等语言编写翻译而来。别的,WebAssembly由Google、Mozilla、微软以致苹果公司起头的W3C社区组合营努力,基本覆盖主流的浏览器商家,因此其可移植性相较Silverlight等有宏大升高,平台宽容问题将不重现身。在Web平台的大队人马种类中,对于原生新职能的支撑须求Web浏览器或Runtime提供复杂的法则的API来兑现,可是JavaScript
API往往比较慢。使用WebAssembly,那几个标准API能够更轻易,而且操作在更低的品位。比如,对于一个面孔识别的Web项目,对于访谈数据流大家得以由轻便的JavaScript
API完结,而把面部识别原生SDK做的事务交由WebAssembly完毕。须求明白的是,WebAssembly不是将C/C++等任何语言编写翻译到JavaScript,更不是一种新的编制程序语言。探究asm.js上文的C语言求和代码经由编写翻译器生成asm.js后如代码3所示。代码3上述代码转变为WebAssembly的文本格式稍显复杂,为了掌握方便,我们精简单的asm.js开始。代码4wast文本文件将asm.js代码转变为WebAssembly的文本格式
add.wast。代码4WebAssembly中代码的可装载和可实行单元被称呼二个模块。在运营时,三个模块可以被一组import值实例化,多少个模块实例能够访谈同一的分享状态。近年来文本格式中的module首要用S表明式来代表。纵然S表达格式不是正式的文本格式,但它轻巧表示AST。WebAssembly也被设计为与ES6的modules集成。四个单纯的逻辑函数定义满含五个部分:成效部分证明在模块中各种内部函数定义的签字,代码段部分含有由功效部分宣称的各样函数的函数体。WebAssembly是含有再次回到值的静态类型,而且具备参数都满含类型。上边的add.wast能够解读为:评释了叁个名称为$add的函数;包括三个参数a和b,两个都以34个人整型;结果是贰个33位整型;函数体是叁个33个人的加法:上边是一对变量$a获得的值;上面是一些变量$b得到的值;由于并未有分明的归来节点,因而return是该加法函数的尾声加载指令。二进制Wasm文件如图1所示,由C语言求和代码通过编写翻译生成二进制文件,通读文件能够找到相应的头顶、类型、导入、函数以至代码段等。通过JavaScript
API载入Wasm二进制文件后,最终转换来机器码实施。图1
经过编写翻译的二进制文件工具链开辟人员以往能够行使相应的工具链从C / C
++源文件编写翻译WebAssembly模块。WebAssembly由许多工具支持,以扶植开荒人士创设和管理源文件和扭转的二进制内容。EmscriptenEmscripten是内部不可能避开的工具之一,如图2所示。在图2中,Emscripten
SDK微处理机用于处理多少个SDK和工具,并且钦赐当前正被利用到编写翻译代码的一定SDK和工具集。图2
Emscripten工具链流程图及生成JavaScript流程Emscripten的主要性工具是Emscripten编写翻译器前端,它是比方说GCC的正经八百编写翻译器的归纳替代达成。Emcc使用Clang将C/C++文件转变为LLVM字节码,使用Fastcomp把字节码编写翻译成JavaScript。输出的JavaScript能够由Node.js实施,只怕放置HTML在浏览器中运作。那带给的一贯结果正是,C和C++程序通过编写翻译后可在JavaScript上运转,不必要任何插件。WABT和Binaryen而外,对于想要使用由别的工具生成的WebAssembly二进制文件感兴趣的开垦者,如今官方额外提供了此外两组分化的工具:WABT
——WebAssembly二进制工具包;Binaryen——编写翻译器和工具链。WABT工具包扶植将二进制WebAssembly格式调换为可读的文本格式。此中wasm2wast命令行工具得以将WebAssembly二进制文件调换为可读的S表明式文本文件。而wast2wasm命令行工具则施行完全相反的经过。Binaryen则是一套更为完善的工具链,是用C++编写成用于WebAssembly的编写翻译器和工具链基本功构造库。WebAssembly是二进制格式并且和Emscripten集成,由此该工具以Binary和Emscript-en的终极合併命名称叫Binaryen。它意在使编写翻译WebAssembly轻松、快捷、有效。它饱含且不仅仅包括上边包车型大巴多少个工具。图3
Binaryen生成WebAssembly流程wasm-as:将WebAssembly由文本格式编写翻译成二进制格式;wasm-dis:将二进制格式的WebAssembly反编写翻译成文本格式;asm2wasm:将asm.js编写翻译到WebAssembly文本格式,使用Emscripten的asm优化器;s2wasm:在LLVM中支出,由新WebAssembly后端爆发的.s格式的编写翻译器;wasm.js:包涵编写翻译为JavaScript的Binaryen组件,包含解释器、asm2wasm、S表明式剖析器等。Binaryen近年来提供了多少个生成WebAssembly的流程,由于emscripten的asm.js生成已经极其牢固,而且asm2wasm是一个一定轻松的经过,所以这种将C/C
++编写翻译为WebAssembly的不二秘籍已经可用。图4
Emscripten+Binaryen生成WebAssembly的完全流程简单来讲,Emscripten以致Binaryen提供了总体的C/C++到WebAssembly的消除方案。而Binaryen则帮助提高了WebAssembly的工具链生态。提示由于WebAssembly正处在活跃开垦阶段,各样编写翻译步骤和编写翻译工具会有小幅更正和改过,相信最后的编写翻译工具和步子会趋于便捷,开采者要求潜心官方网站的新式动态。实战Linux和mac
OS平台编写翻译原生代码到WebAssembly可由如下步骤落成。编写翻译情况策动操作系统必得有能够干活的编写翻译器工具链,由此必要设置GCC、cmake情形,其他Python、Node.js及Java情状也是急需的。图5
编写翻译意况设置假若是以另外情势安装了Node.js,也许供给改进~/.emscripten文件的NODE_JS属性。安装精确的emscripten分支要编写翻译原生代码到WebAssembly,大家需求emscripten的incoming分支。由于emscripten不唯有是用来WebAssembly的编写翻译工具链,选取准确的分层尤为关键。图6
安装emscripten的incoming分支在这之中UCRUISERLTO具体的UKugaL是。拍卖装置卓殊可运营emcc
-v命令进行验证安装。假若蒙受如图7所示的不当,表明带有JavaScript后端的LLVM编写翻译器并未有被扭转。图7
emcc -v命令报错图8 emcc
-v下令报错施工方案经过图8步骤,能够缓慢解决该难题,何况在~/.emscripten
文件中期维改进如下配置:在这里早前编写翻译程序今昔四个完完全全的工具链已经持有,大家得以行使它来编写翻译轻巧的顺序到WebAssembly。不过,还大概有部分别样注意事项:必需透过参数-s
Wasm=1到emcc;除了Wasm二进制文件和JavaScript
wrapper外,要是还希望emscripten生成一个可径直运维的次第的HTML页面,则必需钦定叁个恢宏名字为.html的出口文件。在编写翻译早先,首先希图八个最大旨的add.c程序,见代码6。代码6按代码7所示的吩咐编辑好add.c程序并编写翻译:运行WebAssembly应用以Chrome浏览器为例,假如一贯在浏览器内本土展开HTML文件,会有图9所示的错误:图9
XMLHttpRequest本地访谈的跨域乞请错误由于XMLHttpRequest跨域诉求不帮衬file://合同,必须经过HTTP实际出口,可以由Python的SimplHTTPServer改进,见代码8:代码8在浏览器中输入并开垦add.html,就能够平素看看调换来WebAssembly的应用程序输出结果。创造独立WebAssembly暗许情状下,emcc会创制JavaScript文件和WebAssembly的咬合,当中JS加载包括编写翻译代码的WebAssembly。对于C/C++开荒职员,他们可能更趋向于创建独立的WebAssembly,用于JavaScript开拓人士调用,见代码9。代码9上述命令运营后,大家得以获得独立的Wasm文件。必要验证的是,该参数还是在开辟中,只怕每Nissan生标准和贯彻转移。JavaScript
API调用
从C/C++程序编写翻译获得八个.wasm模块然后,JavaScript开辟人士能够通过如下格局张开载入.wasm文件并实践。WebAssembly社区组也可能有计划经过Streams使用streaming以至异步编写翻译,见代码10。代码10末段一行调用导出的WebAssembly函数,它扭曲调用大家导入的JS函数,最后施行add(201700,
2卡塔尔国,并且在调节台得到期待的结果输出。图10
WebAssembly求和函数在调节台的出口性能那就是说,WebAssembly的真实属性如何呢?首先大家用直白被用来作为CPU基准测量检验的斐波那契
数列来扩充自己检查自纠,这里运用的是性质相当差的递归算法,在Node.js
v7.2.1景况下,能够看出WebAssembly质量优势尤其刚毅。图11
CPU基准测验反应WebAssembly的切实地工作属性再看看最宗旨的1000纳秒时间内,求和计量的运算量总计,在同一台微计算机的Firefox
50.1.0本子的演算结果如图12所示。图12
1000纳秒内求和计量的运算量总计纵然重复测量试验时结果不尽相近,重启浏览器并屡次测量检验取平均值后还能够见到WebAssembly的运算量比JavaScript快了近一个量级。Demo图13呈现了Angry
Bots
德姆o,它是由WebAssembly项目揭露的三个德姆o,由Unity游戏移植而来。图13
Angry Bots 德姆o / Google Chrome
55.0.2883.87通过如下格局能够体验WebAssembly在浏览器中的强大品质。即使GoogleChrome较新的稳固版也已协理WebAssembly,依然引入使用canary版及Firefox的nightly版实行测量检验。1、下载浏览器:1-1.
Google Chrome;1-2. Mozilla Firefox;1-3. Opera;1-4. Vivaldi。2、张开WebAssembly协理 :2-1. 谷歌(Google卡塔尔国Chrome:chrome://flags/#enable-webassembly;2-2. Mozilla
Firefox:about:config→接受→搜索javascript.options.wasm→设置为true;2-3.
Opera:opera://flags/#enable-webassembly;2-4.
Vivaldi:vivaldi://flags#enable-webassembly。访谈:。使用W、A、S、D等键达成移动操作,点击鼠标举办射击。该WebAssembly游戏在浏览器中运作极度流利,比美原生品质。除了新颖的浏览器开端对WebAssembly稳步帮衬外,AMD开源本领骨干支付的Crosswalk项目早在二零一四年二月底的Crosswalk
22安居版即已插手对WebAssembly实验性的帮忙,开采者能够使用该版本体验Angry
Bots
德姆o。开发者WebAssembly对于Web有名满天下的品质升高,对于开辟者更是是前边三个只怕JavaScript开荒职员来说,并不意味着WebAssembly将会代表JavaScript。图14
WebAssembly与JavaScript引擎的涉及WebAssembly被规划为对JavaScript的增补,而不是顶替,是为了提供一种艺术来赢得应用程序的重要性部分接近原生质量。随着岁月的推移,即使WebAssembly将允许各类语言被编写翻译到Web,不过JavaScript的发展趋势不会就此被弱化,并且照旧将保持Web的纯净动态语言。此外,由于WebAssembly创设在JavaScript引擎的幼功布局上,JavaScript和WebAssembly就要不计其数光景中相配使用。那么WebAssembly是还是不是但是面向C/C++开采者呢?答案还是是还是不是认的。WebAssembly最先达成的主就算C/C++,由Mozilla主导开采的保养高效、安全和相互作用的Rust也能在贰零壹肆年末被成功编写翻译到WebAssembly了,现在还恐怕会再而三加码别的语言的支撑,见代码11。代码11在以后,通过ES6模块接口与JavaScript集成,Web开拓职员并无需编写C++,而是能够平昔动用其余人编写的库,重用模块化C++库能够像使用JavaScript中的modules相符简单。进展依附开采路径图,2015年四月11日,WebAssembly达到浏览器预览的里程碑。GoogleChrome V8引擎及Mozilla Firefox
SpiderMonkey引擎都早已在trunk上支撑WebAssembly浏览器预览。2015年11月下旬,Microsoft
Edge浏览器接受的JavaScript引擎ChakraCore
v1.4.0启用了WebAssembly浏览器预览扶持。而Webkit
JavaScriptCore引擎对于该帮衬也在积极拓宽中。近些日子,WebAssembly社区组已经有起头二进制格式公布候选和JavaScript
API在三个浏览器中落到实处。作为浏览器预览时期的一有的,WebAssembly社区组今后正在征采更遍布的社区举报。社区组的始发目的是浏览器预览在二〇一七年第一季度停止,但在浏览器预览时期的机要发现恐怕会延伸该周期。当浏览器预览甘休时,社区组将爆发WebAssembly的草案标准,并且浏览器商家能够开头暗中认可提供切合标准的落成。估摸在二〇一七年上半年,四大主流浏览器对原生的WebAssembly协助将到达稳定版。具体到谷歌(Google卡塔尔(قطر‎V8引擎的最新进展,asm.js代码将不再通过Turbofan
JavaScript编译器而是编写翻译到WebAssembly后,在WebAssembly的原生试行遇到中奉行最终的机器码。这种改动带给的收益有,为asm.js将事前编写翻译带到了Chrome,且完全向后非常。新的WebAssembly编写翻译路子重用了有个别Turbofan
JavaScript编写翻译器后端部分,由此能够在少了成都百货上千编写翻译和优化消耗的前提下,发生相符的代码。在GoogleChrome中,WebAssembly将快捷在Canary版中暗中同意启用,开采组织也冀望能够揭示到二〇一七年第一季度末的牢固版中。社区包罗全部重大浏览器商家代表的W3C
Web——Assembly社区组于二〇一六年十二月中成立。该小组的任务是,在编写翻译到适用于Web的新的、便携的、大小和加载时间飞速的格式上,促进先前时代的跨浏览器合作。该社区组也正值将WebAssembly设计为W3C开放标准。近期,除了文中所述主流浏览器商家Mozilla、谷歌、微软、及苹果公司之外,Opera
CTO及AMD的8位该领域行家均出席了该社区组。当然,并非唯有社区组成员能力到场标准的制定,任什么人都足以在做出进献。展望由于根本的浏览器厂商对WebAssembly援助表现积极,並且都在落实WebAssembly的各种机能,由此在Web中高质量须求的采纳比方在线娱乐、音乐、摄像流、A奥迪Q3/V福睿斯、平台模拟、设想机、远程桌面、压缩及加密等都可以获取临近于原生的品质。相信WebAssembly将会创建Web的新年代。

谷歌(Google卡塔尔国早先运用的是Native
Client技能,只限于谷歌(Google)Chrome。该商厦以后早就加多了对WebAssembly的支撑,它将支撑具备基于Chromium的浏览器。不过,唯有Chrome帮忙WebAssembly八线程,那意味Google和别的浏览器之间存在质量差别。好音讯是,基于Chromium的Edge浏览器确实支撑WebGL,因而与精湛艾德ge和其余浏览器比较,现款Edge的品质会越来越好。

PSPDFKit 在 macOS 与 Windows 系统上个别对 Chrome、Firefox、Safari 和
Edge 浏览器举办测量检验。结果开掘,Firefox 在四个操作系统上实践 WebAssembly
的效用最高,且小幅减价 Javascript Fallback
。但别的浏览器则不顺遂,Chrome 67 与 Chrome 69
金丝雀(Canary卡塔尔(قطر‎版本表现有在差距,Chrome 69 比 Chrome 67 在实施WebAssembly 上存有晋级。Safari 和 Edge 在分级的主场上的变现都非常不好。

依据Chromium的浏览器-包罗Chrome,就要推出的Edge和Opera都支持WebAssembly。一旦基于Chromium的新版Edge浏览器宣布,WebAssembly中的应用程序在Edge中的办事方法将与在Chrome中的应用程序相通。Firefox为WebAssembly提供了很好的接济,但鉴于SharedArrayBuffer难点,不能不禁止使用对四线程的支持。尽管Opera基于Chromium,但眼前版本的Opera仅提供WebAssembly的单线程帮忙。Safari具有强盛的WebAssembly达成,但它缺乏对WebGL2的通通帮助。

澳门新葡亰平台官网 2

四头,Mozilla正致力于提供多线程帮助。Mozilla、谷歌(Google卡塔尔和其余删除了SharedArrayBuffer,防止范客户碰到Specter和Meltdown漏洞。Google为Chrome提供了站点隔开分离援助,以免止Spectre和Meltdown,并在这里进程中启用SharedArrayBuffer。Firefox这几天从不站点隔开分离,由此无法运行SharedArrayBuffer。可是,Mozilla正在极力为站点隔开提供支撑,那应该允许它们启用SharedArrayBuffer并支持WebAssembly的十六线程。

澳门新葡亰平台官网 3

PSPDFKit在获取测量检验甘休后跟这么些浏览器厂家举行了联系,并得到了相应回复。Chrome
代表他们就要 Chrome 69 引进新的 baseline WebAssembly 编写翻译器,并在下三个canary 版本发表后,暗许启用该编写翻译器。别的还将分娩用于缓存已编写翻译的
WebAssembly 模块的代表方案,以便无需在历次浏览器刷新时再一次编写翻译。Safari
被以为是存在三个 bug 严重影响 WebAssembly
的表现,苹果已将难点列入待修复列表。Edge
则意味正在大力使 WebAssembly
更便于选用和扩大,微软前途将把越来越多近期不可能在 asm.js 中落到实处的机能带到
WebAssembly 。

对于 WebAssembly ,你怎么看?接待批评切磋。

(文/开源中华夏族民共和国卡塔尔国    

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图