<!DOCTYPE html>
<html lang="zh-Hans">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <meta name="renderer" content="webkit">
    <meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=5">
    <title>WebAssembly字节码是什么？速度远超JavaScript（JS）的一门技术 | 云图网</title>
    <meta name="keywords" content="# 浏览器,# 编辑器,App,c,Chrome,C语言,FireFox,GitHub,go,google,https,JavaScript,Web,优化,开源,微软,杀毒软件,游戏,漏洞,程序员,虚拟机,设计">
<meta name="description" content="一、WebAssembly是什么？ WebAssembly是针对Web设计的一种低级语言，这种可移植的二进制格式旨在提高Web应用的运行速度。这种语言的设计初衷是获得比JavaScript（JS）更快的解析速度（最高提高20倍）和执行速度。 WebAssembly的出现是要解决这些问题： JavaScript：性能不够…">
<meta property="og:type" content="article">
<meta property="og:url" content="https://blog.ytso.com/tech/pnotes/260473.html">
<meta property="og:site_name" content="云图网">
<meta property="og:title" content="WebAssembly字节码是什么？速度远超JavaScript（JS）的一门技术">
<meta property="og:image" content="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2022/05/23/20220524005624821.png">
<meta property="og:description" content="一、WebAssembly是什么？ WebAssembly是针对Web设计的一种低级语言，这种可移植的二进制格式旨在提高Web应用的运行速度。这种语言的设计初衷是获得比JavaScript（JS）更快的解析速度（最高提高20倍）和执行速度。 WebAssembly的出现是要解决这些问题： JavaScript：性能不够…">
<link rel="canonical" href="https://blog.ytso.com/tech/pnotes/260473.html">
<meta name="applicable-device" content="pc,mobile">
<meta http-equiv="Cache-Control" content="no-transform">
<link rel="shortcut icon" href="https://imgcdn.ytso.com/wp-content/uploads/2024/10/20241015181503433.jpg">
<link rel='dns-prefetch' href='//cdnjs.cloudflare.com' />
<style id='wp-img-auto-sizes-contain-inline-css' type='text/css'>
img:is([sizes=auto i],[sizes^="auto," i]){contain-intrinsic-size:3000px 1500px}
/*# sourceURL=wp-img-auto-sizes-contain-inline-css */
</style>
<link rel='stylesheet' id='stylesheet-css' href='https://blog.ytso.com/wp-content/themes/justnews/css/style.css?ver=6.21.5' type='text/css' media='all' />
<link rel='stylesheet' id='material-icons-css' href='https://blog.ytso.com/wp-content/themes/justnews/themer/assets/css/material-icons.css?ver=6.21.5' type='text/css' media='all' />
<link rel='stylesheet' id='remixicon-css' href='https://cdnjs.cloudflare.com/ajax/libs/remixicon/4.2.0/remixicon.min.css?ver=6.9.4' type='text/css' media='all' />
<link rel='stylesheet' id='font-awesome-css' href='https://blog.ytso.com/wp-content/themes/justnews/themer/assets/css/font-awesome.css?ver=6.21.5' type='text/css' media='all' />
<style id='wp-block-library-inline-css' type='text/css'>
:root{--wp-block-synced-color:#7a00df;--wp-block-synced-color--rgb:122,0,223;--wp-bound-block-color:var(--wp-block-synced-color);--wp-editor-canvas-background:#ddd;--wp-admin-theme-color:#007cba;--wp-admin-theme-color--rgb:0,124,186;--wp-admin-theme-color-darker-10:#006ba1;--wp-admin-theme-color-darker-10--rgb:0,107,160.5;--wp-admin-theme-color-darker-20:#005a87;--wp-admin-theme-color-darker-20--rgb:0,90,135;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){:root{--wp-admin-border-width-focus:1.5px}}.wp-element-button{cursor:pointer}:root .has-very-light-gray-background-color{background-color:#eee}:root .has-very-dark-gray-background-color{background-color:#313131}:root .has-very-light-gray-color{color:#eee}:root .has-very-dark-gray-color{color:#313131}:root .has-vivid-green-cyan-to-vivid-cyan-blue-gradient-background{background:linear-gradient(135deg,#00d084,#0693e3)}:root .has-purple-crush-gradient-background{background:linear-gradient(135deg,#34e2e4,#4721fb 50%,#ab1dfe)}:root .has-hazy-dawn-gradient-background{background:linear-gradient(135deg,#faaca8,#dad0ec)}:root .has-subdued-olive-gradient-background{background:linear-gradient(135deg,#fafae1,#67a671)}:root .has-atomic-cream-gradient-background{background:linear-gradient(135deg,#fdd79a,#004a59)}:root .has-nightshade-gradient-background{background:linear-gradient(135deg,#330968,#31cdcf)}:root .has-midnight-gradient-background{background:linear-gradient(135deg,#020381,#2874fc)}:root{--wp--preset--font-size--normal:16px;--wp--preset--font-size--huge:42px}.has-regular-font-size{font-size:1em}.has-larger-font-size{font-size:2.625em}.has-normal-font-size{font-size:var(--wp--preset--font-size--normal)}.has-huge-font-size{font-size:var(--wp--preset--font-size--huge)}.has-text-align-center{text-align:center}.has-text-align-left{text-align:left}.has-text-align-right{text-align:right}.has-fit-text{white-space:nowrap!important}#end-resizable-editor-section{display:none}.aligncenter{clear:both}.items-justified-left{justify-content:flex-start}.items-justified-center{justify-content:center}.items-justified-right{justify-content:flex-end}.items-justified-space-between{justify-content:space-between}.screen-reader-text{border:0;clip-path:inset(50%);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;word-wrap:normal!important}.screen-reader-text:focus{background-color:#ddd;clip-path:none;color:#444;display:block;font-size:1em;height:auto;left:5px;line-height:normal;padding:15px 23px 14px;text-decoration:none;top:5px;width:auto;z-index:100000}html :where(.has-border-color){border-style:solid}html :where([style*=border-top-color]){border-top-style:solid}html :where([style*=border-right-color]){border-right-style:solid}html :where([style*=border-bottom-color]){border-bottom-style:solid}html :where([style*=border-left-color]){border-left-style:solid}html :where([style*=border-width]){border-style:solid}html :where([style*=border-top-width]){border-top-style:solid}html :where([style*=border-right-width]){border-right-style:solid}html :where([style*=border-bottom-width]){border-bottom-style:solid}html :where([style*=border-left-width]){border-left-style:solid}html :where(img[class*=wp-image-]){height:auto;max-width:100%}:where(figure){margin:0 0 1em}html :where(.is-position-sticky){--wp-admin--admin-bar--position-offset:var(--wp-admin--admin-bar--height,0px)}@media screen and (max-width:600px){html :where(.is-position-sticky){--wp-admin--admin-bar--position-offset:0px}}
/*wp_block_styles_on_demand_placeholder:69c7d01e3c8ac*/
/*# sourceURL=wp-block-library-inline-css */
</style>
<style id='classic-theme-styles-inline-css' type='text/css'>
/*! This file is auto-generated */
.wp-block-button__link{color:#fff;background-color:#32373c;border-radius:9999px;box-shadow:none;text-decoration:none;padding:calc(.667em + 2px) calc(1.333em + 2px);font-size:1.125em}.wp-block-file__button{background:#32373c;color:#fff;text-decoration:none}
/*# sourceURL=/wp-includes/css/classic-themes.min.css */
</style>
<link rel='stylesheet' id='wpcom-member-css' href='https://blog.ytso.com/wp-content/plugins/wpcom-member/css/style.css?ver=1.7.19' type='text/css' media='all' />
<script type="text/javascript" src="https://blog.ytso.com/wp-includes/js/jquery/jquery.min.js?ver=3.7.1" id="jquery-core-js"></script>
<script type="text/javascript" src="https://blog.ytso.com/wp-includes/js/jquery/jquery-migrate.min.js?ver=3.4.1" id="jquery-migrate-js"></script>
<link rel="EditURI" type="application/rsd+xml" title="RSD" href="https://blog.ytso.com/xmlrpc.php?rsd" />
<meta name='description' content='一、WebAssembly是什么？ WebAssembly是针对Web设计的一种低级语言，这种可移植的二进制格式旨在提高Web应用的运行速度。这种语言的设计初衷是获得比JavaScript（JS）更快的解析速度（最高提高20倍）和执行速度。 W…' />
<meta name='keywords' content='# 浏览器,# 编辑器,App,c,Chrome,C语言,FireFox,GitHub,go,google,https,JavaScript,Web,优化,开源,微软,杀毒软件,游戏,漏洞,程序员,虚拟机,设计' />
<style>:root{--theme-color: #08c; --theme-hover: #07c; --logo-height: 32px; --logo-height-mobile: 26px; --menu-item-gap: 28px; --member-login-bg: url('https://blog.ytso.com/loginwall.jpg'); --header-bg-color: #fff; --header-bg-image: none; --theme-border-radius-s: 3px; --theme-border-radius-m: 5px; --theme-border-radius-l: 8px; --theme-border-radius-xl: 12px; --thumb-ratio-default: 480 / 300; --thumb-ratio-post: 480 / 300; --post-video-ratio: 860 / 482;}</style>
<link rel="icon" href="https://imgcdn.ytso.com/wp-content/uploads/2024/10/20241015181503433.jpg" sizes="32x32" />
<link rel="icon" href="https://imgcdn.ytso.com/wp-content/uploads/2024/10/20241015181503433.jpg" sizes="192x192" />
<link rel="apple-touch-icon" href="https://imgcdn.ytso.com/wp-content/uploads/2024/10/20241015181503433.jpg" />
<meta name="msapplication-TileImage" content="https://imgcdn.ytso.com/wp-content/uploads/2024/10/20241015181503433.jpg" />
    <!--[if lte IE 11]><script src="https://blog.ytso.com/wp-content/themes/justnews/js/update.js"></script><![endif]-->
</head>
<body class="wp-singular post-template-default single single-post postid-260473 single-format-standard wp-theme-justnews lang-cn el-boxed header-fixed">
<header class="header header-fluid">
    <div class="container">
        <div class="navbar-header">
            <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target=".navbar-collapse" aria-label="menu">
                <span class="icon-bar icon-bar-1"></span>
                <span class="icon-bar icon-bar-2"></span>
                <span class="icon-bar icon-bar-3"></span>
            </button>
                        <div class="logo">
                <a href="https://blog.ytso.com/" rel="home">
                    <img src="https://imgcdn.ytso.com/wp-content/uploads/2021/12/20211207181156143.png" alt="云图网">
                </a>
            </div>
        </div>
        <div class="collapse navbar-collapse mobile-style-0">
            <nav class="primary-menu"><ul id="menu-justnews-footer-menu" class="nav navbar-nav wpcom-adv-menu"><li class="menu-item"><a href="https://blog.ytso.com/category/industrynews">业界资讯</a></li>
<li class="menu-item current-post-ancestor active menu-item-style menu-item-style-1 dropdown"><a target="_blank" href="https://blog.ytso.com/category/tech" class="dropdown-toggle">技术专区</a>
<ul class="dropdown-menu menu-item-wrap menu-item-col-5">
	<li class="menu-item"><a href="https://blog.ytso.com/category/tech/cloud">云计算</a></li>
	<li class="menu-item"><a href="https://blog.ytso.com/category/tech/ai">人工智能</a></li>
	<li class="menu-item"><a href="https://blog.ytso.com/category/tech/safety">信息安全</a></li>
	<li class="menu-item"><a href="https://blog.ytso.com/category/tech/bigdata">大数据</a></li>
	<li class="menu-item"><a href="https://blog.ytso.com/category/tech/dev">研发管理</a></li>
	<li class="menu-item"><a href="https://blog.ytso.com/category/tech/webdev">大前端</a></li>
	<li class="menu-item"><a href="https://blog.ytso.com/category/tech/opensource">开源</a></li>
	<li class="menu-item"><a href="https://blog.ytso.com/category/tech/aiops">智能运维</a></li>
	<li class="menu-item current-post-ancestor current-post-parent active"><a href="https://blog.ytso.com/category/tech/pnotes">编程笔记</a></li>
	<li class="menu-item"><a href="https://blog.ytso.com/category/tech/wp">WordPress</a></li>
</ul>
</li>
<li class="menu-item"><a href="https://blog.ytso.com/category/enterprise-strategic-planning">企业战略规划</a></li>
<li class="menu-item"><a href="https://blog.ytso.com/category/download">下载专区</a></li>
<li class="menu-item"><a href="https://blog.ytso.com/category/it%e6%b1%9f%e6%b9%96%e5%8f%b2">江湖史</a></li>
<li class="menu-item"><a href="https://blog.ytso.com/category/notes">随笔记录</a></li>
</ul></nav>            <div class="navbar-action">
                <div class="navbar-search-icon j-navbar-search"><i class="wpcom-icon wi"><svg aria-hidden="true"><use xlink:href="#wi-search"></use></svg></i></div><form class="navbar-search" action="https://blog.ytso.com/" method="get" role="search"><div class="navbar-search-inner"><i class="wpcom-icon wi navbar-search-close"><svg aria-hidden="true"><use xlink:href="#wi-close"></use></svg></i><input type="text" name="s" class="navbar-search-input" autocomplete="off" maxlength="100" placeholder="输入关键词搜索..." value=""><button class="navbar-search-btn" type="submit" aria-label="搜索"><i class="wpcom-icon wi"><svg aria-hidden="true"><use xlink:href="#wi-search"></use></svg></i></button></div></form>                    <div id="j-user-wrap">
                        <a class="login" href="https://blog.ytso.com/login">登录</a>
                        <a class="login register" href="https://blog.ytso.com/register">注册</a>
                    </div>
                                            <a class="wpcom-btn btn-primary btn-xs publish" href="https://blog.ytso.com/contribute">
                            <i class="fa fa-edit"></i> 投稿                        </a>
                                </div>
        </div>
    </div><!-- /.container -->
</header>

<div id="wrap">    <div class="wrap container">
        <ol class="breadcrumb" vocab="https://schema.org/" typeof="BreadcrumbList"><li class="home" property="itemListElement" typeof="ListItem"><a href="https://blog.ytso.com" property="item" typeof="WebPage"><span property="name" class="hide">云图网</span>首页</a><meta property="position" content="1"></li><li property="itemListElement" typeof="ListItem"><i class="wpcom-icon wi"><svg aria-hidden="true"><use xlink:href="#wi-arrow-right-3"></use></svg></i><a href="https://blog.ytso.com/category/tech" property="item" typeof="WebPage"><span property="name">技术专区</span></a><meta property="position" content="2"></li><li property="itemListElement" typeof="ListItem"><i class="wpcom-icon wi"><svg aria-hidden="true"><use xlink:href="#wi-arrow-right-3"></use></svg></i><a href="https://blog.ytso.com/category/tech/pnotes" property="item" typeof="WebPage"><span property="name">编程笔记</span></a><meta property="position" content="3"></li></ol>        <main class="main">
                            <article id="post-260473" class="post-260473 post type-post status-publish format-standard hentry category-pnotes tag-11563 tag-11609 tag-app tag-c tag-chrome tag-firefox tag-github tag-go tag-google tag-https tag-javascript tag-web tag-14208 tag-199 tag-178 tag-1052 tag-222 tag-12788 tag-76 tag-307 tag-12968 entry">
                    <div class="entry-main">
                                                                        <div class="entry-head">
                            <h1 class="entry-title">WebAssembly字节码是什么？速度远超JavaScript（JS）的一门技术</h1>
                            <div class="entry-info">
                                                                <time class="entry-date published" datetime="2022-05-24T00:28:44+08:00" pubdate>
                                    2022年5月24日 00:28                                </time>
                                <span class="dot">•</span>
                                <a href="https://blog.ytso.com/category/tech/pnotes" rel="category tag">编程笔记</a>                                                            </div>
                        </div>
                        
                                                <div class="entry-content text-indent text-justify">
                            <p><strong>一、WebAssembly是什么？</strong></p>
<p>WebAssembly是针对Web设计的一种低级语言，这种可移植的二进制格式旨在提高Web应用的运行速度。<strong>这种语言的设计初衷是获得比JavaScript（JS）更快的解析速度（最高提高20倍）和执行速度。</strong></p>
<p><strong>WebAssembly的出现是要解决这些问题：</strong></p>
<ul>
<li>JavaScript：性能不够理想，以及语言本身的一堆坑（这个大家都懂）</li>
<li>Flash：私有技术（而且漏洞一堆），并且是纯二进制格式</li>
<li>Silverlight：私有技术，并且是纯二进制格式</li>
<li>各种插件（Plug-in）：安全性问题，平台兼容问题</li>
</ul>
<p>&nbsp;</p>
<p><strong>二、WebAssembly的公布时间</strong></p>
<p>WebAssembly社区小组于2015年4月成立，其使命是“为Web设计一种全新的、可移植的、能够高效加载及易于编辑的轻量级格式，以促进跨浏览器协作”。</p>
<p><strong>三、从何处入手</strong></p>
<p>首先你必须使用<strong>Binaryen</strong>设置<strong>Emscripten SDK</strong>，将C/C++代码或Rust代码转化为WA的“.wasm”二进制文件，或者使用与Lisp类似的<strong>S-表达式</strong>将代码转化为“.wast”（或“.wat”）文本格式，如图1所示。</p>
<p><center><noscript><img decoding="async" class="aligncenter size-full wp-image-27363" title="bf34e5dd-a685-46ca-8c33-db58dd8c38a7.png" src="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2022/05/23/20220524005624821.png" alt="【技术分享】WebAssembly入门：将字节码带入Web世界" width="600px" data-lazy-srcset="https://www.shejiku.net/wp-content/uploads/2017/11/b5ff64e1a584bb8e1e88.png 1280w, https://www.shejiku.net/wp-content/uploads/2017/11/b5ff64e1a584bb8e1e88-768x376.png 768w" data-lazy-sizes="(max-width: 1280px) 100vw, 1280px" data-lazy-src="https://www.shejiku.net/wp-content/uploads/2017/11/b5ff64e1a584bb8e1e88.png" /></noscript><img decoding="async" class="aligncenter size-full wp-image-27363 j-lazy" title="bf34e5dd-a685-46ca-8c33-db58dd8c38a7.png" src="https://blog.ytso.com/wp-content/themes/justnews/themer/assets/images/lazy.png" data-original="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2022/05/23/20220524005624821.png" alt="【技术分享】WebAssembly入门：将字节码带入Web世界" width="600px" data-lazy-data-srcset="https://www.shejiku.net/wp-content/uploads/2017/11/b5ff64e1a584bb8e1e88.png 1280w, https://www.shejiku.net/wp-content/uploads/2017/11/b5ff64e1a584bb8e1e88-768x376.png 768w" data-lazy-sizes="(max-width: 1280px) 100vw, 1280px" data-lazy-src="https://www.shejiku.net/wp-content/uploads/2017/11/b5ff64e1a584bb8e1e88.png" /><noscript><noscript><img decoding="async" class="aligncenter size-full wp-image-27363" title="bf34e5dd-a685-46ca-8c33-db58dd8c38a7.png" src="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2022/05/23/20220524005624821.png" alt="【技术分享】WebAssembly入门：将字节码带入Web世界" width="600px" sizes="(max-width: 1280px) 100vw, 1280px" /></noscript><img decoding="async" class="aligncenter size-full wp-image-27363 j-lazy" title="bf34e5dd-a685-46ca-8c33-db58dd8c38a7.png" src="https://blog.ytso.com/wp-content/themes/justnews/themer/assets/images/lazy.png" data-original="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2022/05/23/20220524005624821.png" alt="【技术分享】WebAssembly入门：将字节码带入Web世界" width="600px" sizes="(max-width: 1280px) 100vw, 1280px" /></noscript></center>图1. 从源代码到Web的处理过程</p>
<p>你可以从这个<strong>在线工具</strong>开始学习，快速查看代码片段。</p>
<p>在页面右侧的反汇编输出中，你可以看到头两行代码如下所示：</p>
<table class="syntaxhighlighter plain" border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="plain plain">0000000: 0061 736d                                  ; WASM_BINARY_MAGIC</code></div>
<div class="line number2 index1 alt1"><code class="plain plain">0000004: 0b00 0000                                  ; WASM_BINARY_VERSION</code></div>
</div>
</td>
</tr>
</tbody>
</table>
<p>第一行与魔术数字“0x6d736100”有关，这个数字代表的是“/0asm”。第二行显示的是版本号，这里版本号为“0xb”。由于当前WA的版本号是0xd，因此这个在线工具生成的字节码不能用于当前版本的Web浏览器，不过这段代码还是值得一看的。当WebAssembly最终发布时，其版本号会被设定为0x1。</p>
<p><strong>四、WebAssembly如何工作</strong></p>
<p>目前WebAssembly需要通过JavaScript加载和编译。主要包括以下四个步骤：</p>
<p>1、加载wasm字节码。</p>
<p>2、将wasm字节码编译为模块。</p>
<p>3、实例化模块。</p>
<p>4、运行函数。</p>
<p>翻译过来就是：</p>
<table class="syntaxhighlighter plain" border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="plain plain">fetch('your_code.wasm').then(response =&gt; response.arrayBuffer()</code></div>
<div class="line number2 index1 alt1"><code class="plain plain">).then(bytes =&gt; WebAssembly.instantiate(bytes, {})</code></div>
<div class="line number3 index2 alt2"><code class="plain plain">).then(instance =&gt; instance.exports.your_exported_function ()</code></div>
</div>
</td>
</tr>
</tbody>
</table>
<p>从上述代码可知，“WebAssembly.instantiate”可以同时用于编译和实例化模块。</p>
<p><strong>五、WebAssembly的使用场景</strong></p>
<p>作为asm.js的下一代改进版，WebAssembly使用了JavaScript中一个非常受限的指令子集，该子集最适合作为C编译器的编译目标。WebAssembly不包含JavaScript对象，也不直接访问文档对象模型（Document Object Model，DOM）。从本质上来讲，WebAssembly只允许对类型数组进行算术运算和操作。</p>
<p>一些初步样例表明，使用wasm实现的斐波那契数生成算法比对应的JS实现性能上更优，有超过350%的性能提升。</p>
<p>目前，WebAssembly只是在简单模仿JS的功能，但人们计划扩展WebAssembly的使用场景，以处理JS中难以处理的事情，同时不增加语言的复杂度。比如，人们计划使WebAssembly默认支持SIMD（Single Instruction，Multiple Data，单指令流多数据流）、线程、共享内存等等功能。</p>
<p>许多流行视频游戏编辑器已经准备就绪，开始将WebAssembly技术与WebGL 2.0相结合，将部分3D功能引擎移植到这个全新平台上。你可以试一下Epic出品的<strong>Zen Garden</strong>，体验这种全新技术。</p>
<p><strong>六、这是否就是JavaScript的末日</strong></p>
<p>WebAssembly会促进JavaScript的发展，而不是导致其灭亡，它可以为Web中的关键功能带来语言上的多样性并提高性能。WebAssembly不单单给JS带来性能上的提升，同时也造福了Web浏览器。</p>
<p>可以预想的是，五年后，我们使用JS的方式将大大不同。目前，我们在很多场景中都难以使用JS代码完成任务，大部分功能都需要借助复杂库来实现。</p>
<p>由于WebAssembly的易用性和简单性，我们预测会有越来越多的代码从C++或Python转化为JS，甚至直接转化为WebAssembly。这意味着你不需要去学习一门全新的语言。JS虚拟机还是会存在，但对应工具会不断发展，以获取更优的性能。</p>
<p><strong>七、WebAssembly与基于MS ActiveX/Adobe Flash/Orcale Java Applet/MS Silverlight/Google NaCl构建的富因特网应用之间有何区别</strong></p>
<p>由于不同的公司各自推出了不同的标准，因此富因特网应用（Rich Internet Application, RIA）无法形成标准的开放格式。</p>
<p>比如，微软在自家的IE浏览器中推广ActiveX技术。该技术让开发者能够通过COM组件将打包功能重新集成到Web页面中。</p>
<p>Google推出了Native Client，让开发者将一些C/C++代码打包集成到浏览器中，然而，只有Chrome支持这项技术，达不到广义上的可移植要求。</p>
<p>几年前，Mozilla发布了asm.js，打开了性能优化的大门。他们最早提出了使用JS中的严格子集。通过限制语言的功能性，他们能够预测虚拟机的下一步反应，从而通过移除某些不必要的检查操作以提高性能。但这种技术也会影响语言的动态行为。</p>
<p>所有的这些技术构成了今天WA诞生的基础。WebAssembly运行在JS虚拟机内部，使用了JS的部分功能，这意味着它不仅能够与运行最新Web浏览器的设备兼容，也能做到向前兼容。为了实现这一点，设计人员正在开发一个polyfill，核心思想是将每个函数转换为语义上等效的JS代码，虽然这样做会影响运行性能，但至少能解决代码的运行问题。</p>
<p><strong>八、WebAssembly长什么样</strong></p>
<p>顾名思义，WebAssembly的最终形式是一种低级字节码，可以转换为汇编代码，但与通常的CPU汇编代码不同。</p>
<p>我们来看看“Hello world”这个例子（值得一提的是，虽然“Hello world”是大多数程序员相当熟悉的一个程序，但这个程序并不是特别适合这门语言，因为WA默认情况下没有集成打印功能，这也是为什么以下代码必须通过JS从标准库中导入该功能，然后传递所需的参数）。</p>
<p>size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream)这个C语言库函数可以从ptr指向的数组中读取数据，并将数据写入到stream文件流中。</p>
<p>紧跟在wasp代码之后的是wasm字节码的版本号，如上文所述。</p>
<table class="syntaxhighlighter plain" border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
<div class="line number5 index4 alt2">5</div>
<div class="line number6 index5 alt1">6</div>
<div class="line number7 index6 alt2">7</div>
<div class="line number8 index7 alt1">8</div>
<div class="line number9 index8 alt2">9</div>
<div class="line number10 index9 alt1">10</div>
<div class="line number11 index10 alt2">11</div>
<div class="line number12 index11 alt1">12</div>
<div class="line number13 index12 alt2">13</div>
<div class="line number14 index13 alt1">14</div>
<div class="line number15 index14 alt2">15</div>
<div class="line number16 index15 alt1">16</div>
<div class="line number17 index16 alt2">17</div>
<div class="line number18 index17 alt1">18</div>
<div class="line number19 index18 alt2">19</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="plain plain">;; WebAssembly WASM AST Hello World! program</code></div>
<div class="line number2 index1 alt1"><code class="plain plain">(module</code></div>
<div class="line number3 index2 alt2"><code class="plain spaces">  </code><code class="plain plain">(memory 1 </code></div>
<div class="line number4 index3 alt1"><code class="plain spaces">   </code><code class="plain plain">(segment 8 "hello world!/n")</code></div>
<div class="line number5 index4 alt2"><code class="plain spaces">  </code><code class="plain plain">)</code></div>
<div class="line number6 index5 alt1"><code class="plain spaces">  </code><code class="plain plain">(import $__fwrite "env" "_fwrite" (param i32 i32 i32 i32) (result i32))</code></div>
<div class="line number7 index6 alt2"><code class="plain spaces">  </code><code class="plain plain">(import $_get__stdout "env" "get__stdout" (param) (result i32))</code></div>
<div class="line number8 index7 alt1"><code class="plain spaces">  </code><code class="plain plain">(export "main" $main)</code></div>
<div class="line number9 index8 alt2"><code class="plain spaces">  </code><code class="plain plain">(func $main (result i32)</code></div>
<div class="line number10 index9 alt1"><code class="plain spaces">    </code><code class="plain plain">(local $stdout i32)</code></div>
<div class="line number11 index10 alt2"><code class="plain spaces">    </code><code class="plain plain">(set_local $stdout (call_import $_get__stdout))</code></div>
<div class="line number12 index11 alt1"><code class="plain spaces">    </code><code class="plain plain">(return (call_import $__fwrite</code></div>
<div class="line number13 index12 alt2"><code class="plain spaces">       </code><code class="plain plain">(i32.const 8)         ;; void *ptr    =&gt; Address of our string</code></div>
<div class="line number14 index13 alt1"><code class="plain spaces">       </code><code class="plain plain">(i32.const 1)         ;; size_t size  =&gt; Data size</code></div>
<div class="line number15 index14 alt2"><code class="plain spaces">       </code><code class="plain plain">(i32.const 13)        ;; size_t nmemb =&gt; Length of our string</code></div>
<div class="line number16 index15 alt1"><code class="plain spaces">       </code><code class="plain plain">(get_local $stdout))  ;; stream</code></div>
<div class="line number17 index16 alt2"><code class="plain spaces">    </code><code class="plain plain">)</code></div>
<div class="line number18 index17 alt1"><code class="plain spaces">  </code><code class="plain plain">)</code></div>
<div class="line number19 index18 alt2"><code class="plain plain">)</code></div>
</div>
</td>
</tr>
</tbody>
</table>
<p>代码1：wast版的Hello World程序（参考自github）</p>
<p><center><noscript><img decoding="async" class="aligncenter size-full wp-image-27361" title="bf34e5dd-a685-46ca-8c33-db58dd8c38a7.png" src="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2022/05/23/20220524005626226.png" alt="【技术分享】WebAssembly入门：将字节码带入Web世界" width="600px" data-lazy-src="https://www.shejiku.net/wp-content/uploads/2017/11/78088562ab666cff4427.png" /></noscript><img decoding="async" class="aligncenter size-full wp-image-27361 j-lazy" title="bf34e5dd-a685-46ca-8c33-db58dd8c38a7.png" src="https://blog.ytso.com/wp-content/themes/justnews/themer/assets/images/lazy.png" data-original="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2022/05/23/20220524005626226.png" alt="【技术分享】WebAssembly入门：将字节码带入Web世界" width="600px" data-lazy-src="https://www.shejiku.net/wp-content/uploads/2017/11/78088562ab666cff4427.png" /><noscript><noscript><img decoding="async" class="aligncenter size-full wp-image-27361" title="bf34e5dd-a685-46ca-8c33-db58dd8c38a7.png" src="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2022/05/23/20220524005626226.png" alt="【技术分享】WebAssembly入门：将字节码带入Web世界" width="600px" /></noscript><img decoding="async" class="aligncenter size-full wp-image-27361 j-lazy" title="bf34e5dd-a685-46ca-8c33-db58dd8c38a7.png" src="https://blog.ytso.com/wp-content/themes/justnews/themer/assets/images/lazy.png" data-original="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2022/05/23/20220524005626226.png" alt="【技术分享】WebAssembly入门：将字节码带入Web世界" width="600px" /></noscript></center>代码2：wasm字节码形式的Hello World程序</p>
<p>虽然我们可以手动编写字节码，但我想没有哪个程序员会这么做。相反，他们会选择使用wasp的S-表达式，或者其他更为人性化的高级语言，这样能够生成等价的编译器优化的代码。</p>
<p><strong>九、WA的安全性如何，对网络威胁方面的意义</strong></p>
<p>在浏览器中运行时，WebAssembly运行在一个安全的沙箱化环境中，这意味着WebAssembly与其他Web语言一样，遵守相同的同源策略和权限策略。根据维基百科的定义，<strong>同源策略</strong>可以“防止某个页面中的恶意脚本通过该页面的文档对象模型（DOM）获取其他Web页面上敏感信息的访问权限”。</p>
<p>这听起来是一个非常完美的解决方案。</p>
<p>然而，过去的很多案例表明，攻击者出于个人利益，总是能够找到一种方法来滥用或转移新技术的使用场景。比如，攻击者已经使用某些流行的开源项目或某些自制代码中的JS混淆代码，实现恶意代码隐藏并绕过杀毒软件的检测。</p>
<p>因此我们很容易就能预测到，WA可能会被攻击者用来实现高级混淆或加密。这个问题对训练有素的分析师来说并不是不能克服的，但对攻击工具的调试和挖掘将变得更加困难，也更加耗时。</p>
<p>目前，如果你在浏览器界面点击右键，查看wasm模块，你所看到的结果会与当前所使用的浏览器有关。你可能会在开发者调试器窗口看到某个函数的“原生代码”引用，也可能看到Firefox中的一个警告信息（如图2所示），还有可能看到Chrome中文本形式的WA代码（如图3所示）。</p>
<p><center><noscript><img decoding="async" class="aligncenter size-full wp-image-27362" title="bf34e5dd-a685-46ca-8c33-db58dd8c38a7.png" src="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2022/05/23/20220524005627173.png" alt="【技术分享】WebAssembly入门：将字节码带入Web世界" width="600px" data-lazy-srcset="https://www.shejiku.net/wp-content/uploads/2017/11/6e4269454c8ca10b8ba1.png 975w, https://www.shejiku.net/wp-content/uploads/2017/11/6e4269454c8ca10b8ba1-768x225.png 768w" data-lazy-sizes="(max-width: 975px) 100vw, 975px" data-lazy-src="https://www.shejiku.net/wp-content/uploads/2017/11/6e4269454c8ca10b8ba1.png" /></noscript><img decoding="async" class="aligncenter size-full wp-image-27362 j-lazy" title="bf34e5dd-a685-46ca-8c33-db58dd8c38a7.png" src="https://blog.ytso.com/wp-content/themes/justnews/themer/assets/images/lazy.png" data-original="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2022/05/23/20220524005627173.png" alt="【技术分享】WebAssembly入门：将字节码带入Web世界" width="600px" data-lazy-data-srcset="https://www.shejiku.net/wp-content/uploads/2017/11/6e4269454c8ca10b8ba1.png 975w, https://www.shejiku.net/wp-content/uploads/2017/11/6e4269454c8ca10b8ba1-768x225.png 768w" data-lazy-sizes="(max-width: 975px) 100vw, 975px" data-lazy-src="https://www.shejiku.net/wp-content/uploads/2017/11/6e4269454c8ca10b8ba1.png" /><noscript><noscript><img decoding="async" class="aligncenter size-full wp-image-27362" title="bf34e5dd-a685-46ca-8c33-db58dd8c38a7.png" src="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2022/05/23/20220524005627173.png" alt="【技术分享】WebAssembly入门：将字节码带入Web世界" width="600px" sizes="(max-width: 975px) 100vw, 975px" /></noscript><img decoding="async" class="aligncenter size-full wp-image-27362 j-lazy" title="bf34e5dd-a685-46ca-8c33-db58dd8c38a7.png" src="https://blog.ytso.com/wp-content/themes/justnews/themer/assets/images/lazy.png" data-original="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2022/05/23/20220524005627173.png" alt="【技术分享】WebAssembly入门：将字节码带入Web世界" width="600px" sizes="(max-width: 975px) 100vw, 975px" /></noscript></center>图2. Firefox浏览器的WA调试界面</p>
<p><center><noscript><img decoding="async" class="aligncenter size-full wp-image-27364" title="bf34e5dd-a685-46ca-8c33-db58dd8c38a7.png" src="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2022/05/23/20220524005628862.png" alt="【技术分享】WebAssembly入门：将字节码带入Web世界" width="600px" data-lazy-srcset="https://www.shejiku.net/wp-content/uploads/2017/11/88d42e86c924e6572577.png 975w, https://www.shejiku.net/wp-content/uploads/2017/11/88d42e86c924e6572577-768x491.png 768w" data-lazy-sizes="(max-width: 975px) 100vw, 975px" data-lazy-src="https://www.shejiku.net/wp-content/uploads/2017/11/88d42e86c924e6572577.png" /></noscript><img decoding="async" class="aligncenter size-full wp-image-27364 j-lazy" title="bf34e5dd-a685-46ca-8c33-db58dd8c38a7.png" src="https://blog.ytso.com/wp-content/themes/justnews/themer/assets/images/lazy.png" data-original="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2022/05/23/20220524005628862.png" alt="【技术分享】WebAssembly入门：将字节码带入Web世界" width="600px" data-lazy-data-srcset="https://www.shejiku.net/wp-content/uploads/2017/11/88d42e86c924e6572577.png 975w, https://www.shejiku.net/wp-content/uploads/2017/11/88d42e86c924e6572577-768x491.png 768w" data-lazy-sizes="(max-width: 975px) 100vw, 975px" data-lazy-src="https://www.shejiku.net/wp-content/uploads/2017/11/88d42e86c924e6572577.png" /><noscript><noscript><img decoding="async" class="aligncenter size-full wp-image-27364" title="bf34e5dd-a685-46ca-8c33-db58dd8c38a7.png" src="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2022/05/23/20220524005628862.png" alt="【技术分享】WebAssembly入门：将字节码带入Web世界" width="600px" sizes="(max-width: 975px) 100vw, 975px" /></noscript><img decoding="async" class="aligncenter size-full wp-image-27364 j-lazy" title="bf34e5dd-a685-46ca-8c33-db58dd8c38a7.png" src="https://blog.ytso.com/wp-content/themes/justnews/themer/assets/images/lazy.png" data-original="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2022/05/23/20220524005628862.png" alt="【技术分享】WebAssembly入门：将字节码带入Web世界" width="600px" sizes="(max-width: 975px) 100vw, 975px" /></noscript></center>图3. Chrome浏览器的WA开发者工具</p>
<p>我们需要改进Web浏览器以支持更加智能的WA调试工具。在任何情况��，浏览器都应该支持某个恶意模块的下载（因为模块需要在用户主机上运行）及反汇编，以帮助逆向研究人员分析模块的目的。否则，就像.NET一样，会有某些代码混淆器阻止人们将字节码还原为初始代码。但后者可能不是出于恶意目的，有时候是合法的，比如源代码作者希望通过这种方法保护他们的知识产权。</p>
<p><strong>十、WA何时发布</strong></p>
<p>Mozilla Firefox 52版（3月7日发布）、Google Chrome 57版（3月9日发布）以及Opera 44版（3月21日发布）已经默认支持并启用了WA。其他主流浏览器厂商，比如微软和Apple也正在推进浏览器支持WA。你可以在线跟踪相关的研发状态。</p>
<p><strong>十一、如何禁用</strong></p>
<p>禁用WA的方法取决与你正在使用的具体浏览器。</p>
<p>对于Chrome，你可以访问“chrome://flags/#enable-webassembly”这个URL，在组合框中选择“Disabled”即可。需要注意的是，你还需要重新启动浏览器使更改生效。</p>
<p>对于Firefox，你可以访问“about:config”这个URL，找到名为“javascript.options.wasm”的首选项，双击将该布尔值改为“False”，就可以禁用WA。</p>
<p>Google、苹果、微软和Mozilla的工程师们正在联合开发WebAssembly。<strong>WebAssembly是一种可用于未来浏览器中的字节码(bytecode)，可使浏览器性能提升20倍。</strong></p>
<p>字节码是一种机器可读的指令集，与高级语言相比，字节码的加载速度更快。WebAssembly项目旨在开发全新的字节码，从而让桌面和移动端浏览器变得更高效。</p>
<p>目前浏览器使用JavaScript语言来解释代码，提供网站上诸如表格和动态内容等功能。通过asm.js，当前浏览器的内容加载速度已经得到改善，但基于字节码的系统与.NET有些类似，加载速度更快。</p>
<p><strong>WebAssembly源于Asm.js，是一个二进制格式，本地解码速度比JavaScript解析快得多(测试显示超过20倍)，在移动设备上的使用体验更佳。</strong></p>
<p>当前Asm.js面临的一个问题是解析速度，这在移动设备上尤其致命，而WebAssembly则会让JavaScript得到解脱。WebAssembly文件名后缀.wasm，将支持广泛的编程语言。</p>
<p>WebAssembly已被提议为未来浏览器的新标准，将来一旦部署，它将为网页内容和网页应用带来类似于手机应用(App)般的性能。在WebAssembly真正普及前，开发人员计划首先将其作为弥补JavaScript脚本的缺陷进行发展。</p>
<p>WebAssembly目前尚处于开发的早期阶段，其规范和更高阶的设计尚未最终确定，但<strong>鉴于Google、苹果、微软和Mozilla等大牌浏览器厂商都参与其中，相信WebAssembly会以最快的速度上市。</strong></p>
<p>&nbsp;</p>
<div class="entry-readmore"><div class="entry-readmore-btn"></div></div>                                                        <div class="entry-copyright"><p>原创文章，作者：ItWorker，如若转载，请注明出处：https://blog.ytso.com/tech/pnotes/260473.html</p></div>                        </div>

                        <div class="entry-tag"><a href="https://blog.ytso.com/tag/%e6%b5%8f%e8%a7%88%e5%99%a8" rel="tag"># 浏览器</a><a href="https://blog.ytso.com/tag/%e7%bc%96%e8%be%91%e5%99%a8" rel="tag"># 编辑器</a><a href="https://blog.ytso.com/tag/app" rel="tag">App</a><a href="https://blog.ytso.com/tag/c" rel="tag">c</a><a href="https://blog.ytso.com/tag/chrome" rel="tag">Chrome</a><a href="https://blog.ytso.com/tag/c%e8%af%ad%e8%a8%80" rel="tag">C语言</a><a href="https://blog.ytso.com/tag/firefox" rel="tag">FireFox</a><a href="https://blog.ytso.com/tag/github" rel="tag">GitHub</a><a href="https://blog.ytso.com/tag/go" rel="tag">go</a><a href="https://blog.ytso.com/tag/google" rel="tag">google</a><a href="https://blog.ytso.com/tag/https" rel="tag">https</a><a href="https://blog.ytso.com/tag/javascript" rel="tag">JavaScript</a><a href="https://blog.ytso.com/tag/web" rel="tag">Web</a><a href="https://blog.ytso.com/tag/%e4%bc%98%e5%8c%96" rel="tag">优化</a><a href="https://blog.ytso.com/tag/%e5%bc%80%e6%ba%90" rel="tag">开源</a><a href="https://blog.ytso.com/tag/%e5%be%ae%e8%bd%af" rel="tag">微软</a><a href="https://blog.ytso.com/tag/%e6%9d%80%e6%af%92%e8%bd%af%e4%bb%b6" rel="tag">杀毒软件</a><a href="https://blog.ytso.com/tag/%e6%b8%b8%e6%88%8f" rel="tag">游戏</a><a href="https://blog.ytso.com/tag/%e6%bc%8f%e6%b4%9e" rel="tag">漏洞</a><a href="https://blog.ytso.com/tag/%e7%a8%8b%e5%ba%8f%e5%91%98" rel="tag">程序员</a><a href="https://blog.ytso.com/tag/%e8%99%9a%e6%8b%9f%e6%9c%ba" rel="tag">虚拟机</a><a href="https://blog.ytso.com/tag/%e8%ae%be%e8%ae%a1" rel="tag">设计</a></div>
                        <div class="entry-action">
                            <div class="btn-zan" data-id="260473"><i class="wpcom-icon wi"><svg aria-hidden="true"><use xlink:href="#wi-thumb-up-fill"></use></svg></i> 赞 <span class="entry-action-num">(0)</span></div>
                                                    </div>

                        <div class="entry-bar">
                            <div class="entry-bar-inner">
                                                                <div class="entry-bar-info entry-bar-info2">
                                    <div class="info-item meta">
                                                                                    <a class="meta-item j-heart" href="javascript:;" data-id="260473"><i class="wpcom-icon wi"><svg aria-hidden="true"><use xlink:href="#wi-star"></use></svg></i> <span class="data">0</span></a>                                        <a class="meta-item" href="#comments"><i class="wpcom-icon wi"><svg aria-hidden="true"><use xlink:href="#wi-comment"></use></svg></i> <span class="data">0</span></a>                                                                            </div>
                                    <div class="info-item share">
                                                                                    <a class="meta-item mobile j-mobile-share" href="javascript:;" data-id="260473" data-qrcode="https://blog.ytso.com/tech/pnotes/260473.html">
                                                <i class="wpcom-icon wi"><svg aria-hidden="true"><use xlink:href="#wi-share"></use></svg></i> 生成海报                                            </a>
                                                                                    <a class="meta-item wechat" data-share="wechat" target="_blank" rel="nofollow noopener noreferrer" href="#">
                                                <i class="wpcom-icon wi"><svg aria-hidden="true"><use xlink:href="#wi-wechat"></use></svg></i>                                            </a>
                                                                                    <a class="meta-item weibo" data-share="weibo" target="_blank" rel="nofollow noopener noreferrer" href="#">
                                                <i class="wpcom-icon wi"><svg aria-hidden="true"><use xlink:href="#wi-weibo"></use></svg></i>                                            </a>
                                                                                    <a class="meta-item qq" data-share="qq" target="_blank" rel="nofollow noopener noreferrer" href="#">
                                                <i class="wpcom-icon wi"><svg aria-hidden="true"><use xlink:href="#wi-qq"></use></svg></i>                                            </a>
                                                                                    <a class="meta-item qzone" data-share="qzone" target="_blank" rel="nofollow noopener noreferrer" href="#">
                                                <i class="wpcom-icon wi"><svg aria-hidden="true"><use xlink:href="#wi-qzone"></use></svg></i>                                            </a>
                                                                                    <a class="meta-item douban" data-share="douban" target="_blank" rel="nofollow noopener noreferrer" href="#">
                                                <i class="wpcom-icon wi"><svg aria-hidden="true"><use xlink:href="#wi-douban"></use></svg></i>                                            </a>
                                                                                    <a class="meta-item linkedin" data-share="linkedin" target="_blank" rel="nofollow noopener noreferrer" href="#">
                                                <i class="wpcom-icon wi"><svg aria-hidden="true"><use xlink:href="#wi-linkedin"></use></svg></i>                                            </a>
                                                                                    <a class="meta-item facebook" data-share="facebook" target="_blank" rel="nofollow noopener noreferrer" href="#">
                                                <i class="wpcom-icon wi"><svg aria-hidden="true"><use xlink:href="#wi-facebook"></use></svg></i>                                            </a>
                                                                                    <a class="meta-item twitter" data-share="twitter" target="_blank" rel="nofollow noopener noreferrer" href="#">
                                                <i class="wpcom-icon wi"><svg aria-hidden="true"><use xlink:href="#wi-twitter"></use></svg></i>                                            </a>
                                                                            </div>
                                    <div class="info-item act">
                                        <a href="javascript:;" id="j-reading"><i class="wpcom-icon wi"><svg aria-hidden="true"><use xlink:href="#wi-article"></use></svg></i></a>
                                    </div>
                                </div>
                            </div>
                        </div>
                    </div>
                                            <div class="entry-page">
                    <div class="entry-page-prev entry-page-nobg">
                <a href="https://blog.ytso.com/tech/pnotes/260472.html" title="UI自动化测试工具Protractor，Angular应用的E2E测试框架" rel="prev">
                    <span>UI自动化测试工具Protractor，Angular应用的E2E测试框架</span>
                </a>
                <div class="entry-page-info">
                    <span class="pull-left"><i class="wpcom-icon wi"><svg aria-hidden="true"><use xlink:href="#wi-arrow-left-double"></use></svg></i> 上一篇</span>
                    <span class="pull-right">2022年5月24日 00:28</span>
                </div>
            </div>
                            <div class="entry-page-next j-lazy" style="background-image: url('https://blog.ytso.com/wp-content/themes/justnews/themer/assets/images/lazy.png');" data-original="http://ytso-blog-oss-img.oss-accelerate.aliyuncs.com/wp-content/uploads/2022/05/23/20220524010056196.jpg">
                <a href="<error>
    <code>wp_die</code>
    <title><![CDATA[WordPress &amp;rsaquo; Error]]></title>
    <message><![CDATA[&lt;h1&gt;Error establishing a Redis connection&lt;/h1&gt;
&lt;p&gt;To disable Redis, delete the &lt;code&gt;object-cache.php&lt;/code&gt; file in the &lt;code&gt;/wp-content/&lt;/code&gt; directory.&lt;/p&gt;
]]></message>
    <data>
        <status>500</status>
    </data>
</error>
<!--
Performance optimized by Redis Object Cache. Learn more: https://wprediscache.com

Retrieved 1932 objects (318 KB) from Redis using Predis (v2.4.0).
-->
