把ebssembly用于提升速度和代码重用每日前端夜话x博客

有这样一种技术,可以把用高级语言编写的非 Web 程序转换成为 Web 准备的二进制模块,而无需对 Web 程序的源代码进行任何更改即可完成这种转换。浏览器可以有效地下载新翻译的模块并在沙箱中执行。执行的 Web 模块可以与其他 Web 技术无缝地交互 - 特别是 JavaScript(JS)。欢迎来到WebAssembly。

对于名称中带有 assembly 的语言,WebAssembly 是低级的。但是这种低级角色鼓励优化:浏览器虚拟机的即时(JIT)编译器可以将可移植的 WebAssembly 代码转换为快速的、特定于平台的机器代码。因此,WebAssembly 模块成为适用于计算绑定任务(例如数字运算)的可执行文件。

有很多高级语言都能编译成 WebAssembly,而且这个名单正在增长,但最初的候选是C、C ++ 和 Rust。我们将这三种称为系统语言,因为它们用于系统编程和高性能应用编程。系统语言都具有两个特性,这使它们适合被编译为 WebAssembly。下一节将详细介绍设置完整的代码示例(使用 C 和 TypeScript)以及来自 WebAssembly 自己的文本格式语言的示例。

在编译过程中,C 源被翻译成汇编语言,然后再将其翻译成机器代码。在英特尔汇编语言(AT&T flavor)中,上面的最后一个 C 语句的功能类似以下内容(## 为汇编语言的注释符号):

%rax 和 %rdx 是 64 位寄存器,addq 指令意味着 add quadwords,其中 quadword 是 64 位大小,这是 C 语言中 long 类型的标准大小。汇编语言强调可执行机器代码涉及类型,通过指令和参数的混合给出类型(如果有的话)。在这种情况下,add 指令是 addq(64 位加法),而不是例如 addl 这样的指令,它增加了 C 语言典型的 int 的 32 位值。使用的寄存器字长是完整的 64 位( **%rax 和%rdx **)而不是其 32 位的(例如,%eax 是 %rax 的低 32 位,%edx 是 %rdx 的低 32 位)。

汇编语言的效果很好,因为操作数被存储在 CPU 寄存器中,而合理的 C 编译器(即使是默认的优化级别)也会生成与此处所示相同的汇编代码。

这三种系统语言强调显式类型,是编译成 WebAssembly 的理想选择,因为这种语言也有明确的数据类型:i32 表示 32 位的整数值,f64 表示 64 位的浮点值,依此类推。

显式数据类型也鼓励优化函数调用。具有显式数据类型的函数具有 signature,它用于指定参数的数据类型以及从函数返回的值(如果有)。下面是名为 $add 的 WebAssembly 函数的签名,该函数使用下面讨论的 WebAssembly 文本格式语言编写。该函数把两个 32 位的整数作为参数并返回一个 64 位的整数:

浏览器的 JIT 编译器应该具有 32 位的整数参数,并把返回的 64 位值存储在适当大小的寄存器中。

通常,JS 没有显式数据类型,但 JS 中的按位或运算符能够产生一个整数值。这就解释了看上去毫无意义的按位或运算符:

n 和 0 之间的按位或运算得到 n,但这里的目的是表示 n 保持整数值。return 语句重复了这个优化技巧。

在 JS 方言中,TypeScript 在显式数据类型方面脱颖而出,这使得这种语言对于编译成 WebAssembly 很有吸引力。(下面的代码示例说明了这一点。)

三种系统语言都具有的第二个特性是它们在没有垃圾收集器(GC)的情况下执行。对于动态分配的内存,Rust 编译器会自动分配和释放代码;在其他两种系统语言中,动态分配内存的程序员负责显式释放内存。系统语言避免了自动化 GC 的开销和复杂性。

WebAssembly 的概述可以总结如下。几乎所有关于 WebAssembly 语言的文章都提到把近乎原生的速度作为语言的主要目标之一。原生速度是指已编译的系统语言的速度,因此这三种语言也是最初被指定为编译成 WebAssembly 的候选者的原因。

WebAssembly 语言并非为了取代 JS,而是为了通过在计算绑定任务上提供更好的性能来补充 JS。WebAssembly 在下载方面也有优势。浏览器将 JS 模块作为文本提取,这正是 WebAssembly 能够解决的低效率问题之一。WebAssembly 中的模块是紧凑的二进制格式,可加快下载速度。

同样令人感兴趣的是 JS 和 WebAssembly 如何协同工作。JS 旨在读入文档对象模型(DOM),即网页的树形表示。相比之下,WebAssembly 没有为 DOM 提供任何内置功能,但是 WebAssembly 可以导出 JS 根据需要调用的函数。这种关注点分离意味着清晰的分工:

生产级代码案例将使 WebAssembly 代码执行繁重的计算绑定任务,例如生成大型加密密钥对,或进行加密和解密。

考虑函数 hstone(对于hailstone),它以正整数作为参数。该函数定义如下:

例如,hstone(12) 返回 6,而 hstone(11) 返回 34。如果 N 是奇数,则 3N + 1 是偶数;但如果 N 是偶数,则 N/2 可以是偶数(例如,4/2 = 2)或奇数(例如,6/2 = 3)。

hstone 函数可以通过将返回值作为下一个参数传递来进行迭代。结果是一个 hailstone 序列,例如这个序列,以 24 作为原始参数开始,返回值 12 作为下一个参数,依此类推:

请注意,两个幂很快收敛,只需要 N 除以 2 得到 1;例如,32 = 25的收敛长度为5,64 = 26的收敛长度为6。这里感兴趣的是从初始参数到第一个出现的序列长度。我在 C 和 TypeScript 中的代码例子计算了冰雹序列的长度。

Collatz 猜想是一个冰雹序列会收敛到 1,无论初始值 N> 0 恰好是什么。没有人找到 Collatz 猜想的反例,也没有人找到证据将猜想提升到一个定理。这个猜想很简单,就像用程序测试一样,是数学中一个极具挑战性的问题。

下面的 hstoneCL 程序是一个非 Web 应用,可以使用常规 C 语言编译器(例如,GNU 或 Clang)进行编译。程序生成一个随机整数值 N> 0 八次,并计算从 N 开始的冰雹序列的长度。两个程序员定义的函数,main 和 hstone 是有意义的。该应用程序稍后会被编译为 WebAssembly。

示例1. C 中的 hstone 函数

代码可以在任何类 Unix 系统上从命令行编译和运行(% 是命令行提示符):

以下是例子运行的输出:

1.将非 Web 程序 hstoneCL 编译到WebAssembly中:

2.使用 Emscription 开发 Web 服务器(或等效的)来托管 Web 化应用:

图1. web化 hstone 程序结果非常显著,因为完整的编译过程只需要一个命令,而且不需要对原始 C 程序进行任何更改。

还有另一个问题:WebAssembly 代码不需要镜像 C 等源程序中的功能边界。例如,C 程序 hstoneCL 有两个用户定义的函数,main 和 hstone。生成的 WebAssembly 模块导出名为 _ main 的函数,但不导出名为 _ hstone 的函数。(值得注意的是,函数 main 是 C 程序中的入口点。)C 语言 hstone 函数的主体可能在某些未导出的函数中,或者只是包含在 _ main 中。导出的 WebAssembly 函数正是 JS glue 可以通过名称调用的函数。但是应在 WebAssembly 代码中按名称导出哪些源语言函数。

示例2. 修订后的 hstone 程序

如上所示,修改后的 hstoneWA 程序没有 main 函数,它不再需要,因为该程序不是作为独立程序运行,而是仅作为具有单个导出函数的 WebAssembly 模块运行。指令 EMSCRIPTEN_KEEPALIVE(在头文件 emscripten.h 中定义)指示编译器在 WebAssembly 模块中导出 _ hstone 函数。命名约定很简单:诸如 hstone 之类的 C 函数保留其名称 —— 但在 WebAssembly 中使用单个下划线作为其第一个字符(在本例中为 _ hstone)。WebAssembly中的其他编译器遵循不同的命名约定。

要确认此方法是否有效,可以简化编译步骤,仅生成 WebAssembly 模块和 JS 粘合剂而不是 HTML:

HTML文件现在可以简化为这个手写的文件:

程序代码可以像以前一样编译,然后使用内置的Web服务器启动:

在浏览器(在本例中为 Chrome)中请求修改后的 HTML 文档后,可以用浏览器的 Web 控制台确认 hstone 函数已导出为 _ hstone。以下是我在 Web 控制台中的会话段,## 为注释符号:

EMSCRIPTEN_KEEPALIVE 指令是使 Emscripten 编译器生成 WebAssembly 模块的简单方法,该模块将所有感兴趣的函数导出到 JS 编程器同样产生的 JS 粘合剂。一个自定义的 HTML 文档,无论手写的 JS 是否合适,都可以调用从 WebAssembly 模块导出的函数。为了这个干净的方法,向 Emscripten 致敬。

函数 hstone 接受一个 i32 类型的参数,并返回相同类型的值。函数的主体与 C 语言示例中的主体基本相同。代码可以编译成 WebAssembly,如下所示:

示例 3. TypeScript 代码的 HTML页面

上面的 HTML 页面中的脚本元素可以逐行说明。第 1 行中的 fetch 调用使用 Fetch 模块从托管 HTML 页面的 Web 服务器获取 WebAssembly 模块。当 HTTP 响应到达时,WebAssembly 模块将把它做作为一个字节序列,它存储在脚本第 2 行的 arrayBuffer 中。这些字节构成了 WebAssembly 模块,它是从 TypeScript 编译的代码。文件。该模块没有导入,如第 4 行末尾所示。

在第 4 行的开头实例化 WebAssembly 模块。WebAssembly 模块类似于非静态类,其中包含面向对象语言(如Java)中的非静态成员。该模块包含变量、函数和各种支持组件;但是与非静态类一样,模块必须实例化为可用,在本例中是在 Web 控制台中,但更常见的是在相应的 JS 粘合代码中。

脚本的第 6 行以相同的名称导出原始的 TypeScript 函数 hstone。此 WebAssembly 功能现在可用于任何 JS 粘合代码,因为在浏览器控制台中的另一个会话将确认。

WebAssembly 具有更简洁的 API,用于获取和实例化模块。新 API 将上面的脚本简化为 fetch 和 instantiate 操作。这里展示的较长版本具有展示细节的好处,特别是将 WebAssembly 模块表示为字节数组,将其实例化为具有导出函数的对象。

计划是让网页以与 JS ES2015 模块相同的方式加载 WebAssembly 模块:

然后,JS 将获取、编译并以其他方式处理 WebAssembly 模块,就像是加载另一个 JS 模块一样。

文本格式语言采用 Lisp 推广的 S 表达式(S for symbolic)语法。S 表达式(简称 sexpr)表示把树作为具有任意多个子列表的列表。例如这段 sexpr 出现在 TypeScript 示例的 WAT 文件末尾附近:

树表示是:

在文本格式中,WebAssembly 模块是一个 sexpr,其第一项是模块,它是树的根。下面是一个定义和导出单个函数的模块的简单例子,该函数不带参数但返回常量 9876:

该函数的定义没有名称(即作为 lambda),并通过引用其索引 0 导出,索引 0 是模块中第一个嵌套的 sexpr 的索引。导出名称以字符串形式给出;在当前情况下其名称为“simpleFunc”。

文本格式的函数具有标准模式,可以如下所示:

签名指定参数(如果有)和返回值(如果有)。例如,这是一个未命名函数的签名,它接受两个 32 位整数参数,返回一个 64 位整数值:

名称可以赋予函数、参数和局部变量。名称以美元符号开头:

WebAssembly 函数的主体反映了该语言的底层栈机器体系结构。栈存储用于暂存器。考虑一个函数的示例,该函数将其整数参数加倍并返回:

当 WebAssembly 代码转换为机器代码时,WebAssembly 栈作为暂存器应尽可能由通用寄存器替换。这是 JIT 编译器的工作,它将 WebAssembly 虚拟栈机器代码转换为实际机器代码。

Web 程序员不太可能以文本格式编写 WebAssembly,因为从某些高级语言编译是一个非常有吸引力的选择。相比之下,编译器编的作者可能会发现在这种细粒度级别上工作是有效的。

WebAssembly 的目标是实现近乎原生的速度。但随着 JS 的 JIT 编译器不断改进,并且随着非常适合优化的方言(例如,TypeScript)的出现和发展,JS 也可能实现接近原生的速度。这是否意味着 WebAssembly 是在浪费精力?我想不是。

WebAssembly 解决了计算中的另一个传统目标:有意义的代码重用。正如本文中的例子所示,使用适当语言(如 C 或 TypeScript)的代码可以轻松转换为 WebAssembly 模块,该模块可以很好地与 JS 代码一起使用 —— 这是连接 Web 中所使用的一系列技术的粘合剂。因此 WebAssembly 是重用遗留代码和扩展新代码使用的一种诱人方式。例如最初作为桌面应用的用于图像处理的高性能程序在 Web 应用中也可能是有用的。然后 WebAssembly 成为重用的有吸引力的途径。(对于计算限制的新 Web 模块,WebAssembly 是一个合理的选择。)我的预感是 WebAssembly 将在重用和性能方面茁壮成长。

WebAssembly(WASM)是一种低级的二进制格式,它允许开发者使用C、C++、Rust等语言编写的代码在Web浏览器中运行,从而实现接近原生的性能。WASM的目标是成为Web平台的一个标准组成部分,提供一个安全、高效的环境来运行高性能的应用程序。WASM的代码不能直接在浏览器中编写,而是需要通过编译器将高级语言转换为WASM二进制格式。以下是一个简单的流程,展示了如何使用WASM提升We

如果你来自传统的强类型语言,可能会很熟悉void的概念:一种类型,告诉你函数和方法在调用时不返回任何内容。void作为运算符存在于JavaScript中,而作为基本类型存在于TypeScript中。在这两个世界中,void的工作机制与大多数人习惯的有点不同。JavaScript中的voidJavaScript中的void是一个运算符,用于计算它旁边的表达式。无论评估哪个表达式,void总是返回un

我看到没有多少人谈论改进JavaScript代码的实用方法。以下是我用来编写更好的JS的一些顶级方法。使用TypeScript改进你JS代码要做的第一件事就是不写JS。TypeScript(TS)是JS的“编译”超集(所有能在JS中运行的东西都能在TS中运行)。TS在vanillaJS体验之上增加了一个全面的可选类型系统。很长一段时间里,整个JS生态系统对TS的支持不足以让我觉得应该推荐它。但值得

每个团队都必须在开发过程中做出各种决定。其中通常会涉及到yarn,npm或其它用于构建和打包javascript代码的工具。一些开发人员渴望朝着某个方向前进,有时他们会花费大量时间来尝试,去做出实际上对他们的工作几乎没有什么影响的决策。首先,要了解为什么要做出一个有趣的决定,我们需要看一下javascript中包管理的历史。npm出现之前:前端依赖项是保存到存储库中并手动下载的2010:npm发布

在现代Web开发中,在线IDE(集成开发环境)如codesandbox-client面临着巨大的性能压力。随着项目复杂度的提升,传统JavaScript在处理大规模代码编辑、实时预览和多语言支持时往往力不从心。WebAssembly(Wasm)作为一种低级二进制指令格式,为解决这一问题提供了新的可能。本文将深入探讨codesandbox-client中WebAssembly的高级应用,重点介绍性能...

在 Python 中,sys模块是与解释器交互的桥梁,提供了一系列用于访问 Python 解释器本身和操作系统相关信息的函数与变量。无论是获取命令行参数、控制程序退出、还是查看系统环境,sys模块都扮演着不可或缺的角色。本文将系统讲解sys模块的常用功能及实战场景,帮助你高效利用其特性。 一、sys ...

鸿蒙Next的Performance Analysis Kit为开发者提供了强大而全面的性能分析能力,从基本的CPU、内存监控到高级的分布式性能分析,覆盖了各种性能优化场景。通过合理利用这些工具,结合优化实践,开发者可以显著提升应用性能,打造流畅、稳定的优质应用,在激烈的市场竞争中脱颖而出。性能优化是一个持续的过程,建议开发者在开发的各个阶段充分利用Performance Analysis Kit,及早发现并解决性能问题,不断提升应用质量。

一、n8n触发器:自动化工作流的"启动器"在n8n中,触发器是工作流的起点,它决定了流程何时以及如何开始执行。理解触发器的工作原理,就掌握了自动化的主动权。触发器节点负责监听特定事件或条件,一旦满足要求,就会触发整个工作流的运行。与动作节点不同,触发器节点没有上游节点,它们是工作流的入口点。今天,我们将重点介绍三种最常用的核心触发器:手动触发器、定时触发器(Cron)和Webhook触发器,它们

THE END
0.在c语言中怎么解决数字溢出问题编程语言在C语言中,数字溢出是一个常见的问题,尤其是在计算阶乘这样的大数时。由于C语言的整数类型(如 int、long、long long)都有固定的大小和范围,当数值超过其最大值时,就会发生溢出,导致程序行为不可预测。 一、数字溢出问题的根源 C语言中的基本整数类型(如 int)通常为 4 字节(32位),最大值为 2,147,483,647jvzquC41cuq/e|ip0pku1zzguvopp|4:98<6:947787:5<5
1.小学组多题目练习27 HDU-2014 青年歌手大奖赛_评委会打分 72795 C语言程序设计练习(三) 28 CodeForces-4C Registration System 118638 Codeforces Beta Round 4 (Div. 2 Only) 29 UVA-10474 Where is the Marble? 29076 30 HDU-4585 Shaolin 2397 2013ACM-ICPC杭州赛区全国邀请赛 31 HDU-1716 排列2 6642 2007省赛集训jvzq<84xlwjhg7sgv1gsvrhng1;99:
2.C语言底层逻辑剖析函数篇(其三),函数递归与迭代超详解,斐波那契数列递函数递归在C语言中是极其重要并且难以理解的知识点,所以我们才会单独拿出一期内容来单独学习,大家集中精力,开始发车了。 由于递归的定义并不太好描述并且比较抽象,我们来看一下, 程序调用自身的编程技巧称为递归( recursion)。递归做为一种算法在程序设计语言中广泛应用。 jvzquC41dnuh0lxfp0tfv8|gkzooa@8445=:68ftvkimg8igvcomu86498=99@5
3.#include<stdio.h>#include<math.h>intf(intx){if(x>=2){但是原样例输入4输出2,这是因为原题中的冰雹猜想只要求计算变成1的步数(原引用[1]的代码就是如此)。而现在题目要求的是刨冰猜想,要求不同。 所以,我们按照新的逻辑实现。 但是,题目要求修改包含f、g函数的C语言代码?而引用[1]中并没有f和g函数,只有一个getAnswer函数。引用[3]中有一个remove函数。所以可能jvzquC41ygtlw7hufp4og}4cpu}ft8
4.c语言实现冒号排序下冰雹的元气博客//c语言实现冒号排序inta[10] = {5,67,32,6,45,67,8,32,43,56};inti,j,t;for(i =1; i <10; i++)//控制循环次数{for(j =0; j <10-i; j++)//每次把最大的交换到最后一个位置//所以循环到上次循环的前一个位置就可以的{if(a[j] > a[j +1])//交换时时每次挨着的互相交换{ t jvzquC41yy}/ewgnqiy/exr1newcm8u134>96?530jznn
5.共享单车C语言开发项目:全面分析与实现共享单车C语言开发项目:全面分析与实现 一、提出问题 在本项目中,参与者被要求将历史使用模式与天气数据相结合,以便预测华盛顿特区的自行车租赁计划中的自行车租赁需求。 二、理解数据 2.1 收集数据 一般而言,数据由甲方提供。若甲方不提供数据,则需要根据相关问题从网络爬取,或者以问卷调查形式收集。本次共享单车jvzquC41yy}/rqu30et0fnyckn5HqwlZkcthFjsEjge`:n<222=40qyon
6.浅谈ARM汇编语言在上述汇编语言程序中,我们首先使用 MOV 指令将 R0 初始化为 0,将 R1 初始化为 10。ADD 指令计算 R0 和 R1 的和(第二个和第三个参数)并将结果放入 R0(第一个参数) );这对应于总数 += i;等效 C 程序的行。随后的 SUBS 指令将 R1 减 1。 jvzquC41yy}/gnkqewy/exr1ctzjeuj173<3:?3jvor
7.路径规划汇总十篇1.Dijkstra算法描述及C语言函数实现 为了求出最短路径,Dijkstra就提出了以最短路径长度递增,逐次生成最短路径的算法。即如果存在一条从i到j的最短路径(ViVk,Vj),Vk是Vj前面的一个顶点,那么(ViVk)也必定是从i到k的最短路径。例如,对于源顶点V0,首先选择其直接相邻的顶点中长度最短的顶点Vi,那么通过jvzquC41yy}/z~jujw4dqv3ep1nbq€jp1396:>3jvor
8.C语言实现简单选择排序算法下冰雹的元气博客代码不难理解,基本上学过c语言,大多数人第一次用for循环排序都是用的简单选择排序,只是可能不知道这个名字罢了,不过尽管和冒号排序同为O(n^2 )但是性能上还是稍微优于冒号排序的。jvzquC41yy}/ewgnqiy/exr1newcm8u134>96?520jznn
9.志愿者在上下楼梯时应做到C. 个人 D. 班组 查看完整题目与答案 支部委员会的工作任务是什么? 查看完整题目与答案 写出下列数列的通项,并指出当数列趋于无穷时的变化趋势及其收敛B. 狂风暴雨、雷电及冰雹后立即巡视。 C. 新安装和大修后的主变、断路器,二十四小时内每两小时巡视一次。 D. 大风后,重点巡视设备和母线上有无杂物和悬jvzquC41o0yiwjxjwczj0lto1vo0dA84;3ke7B:d6glcd?6748<6hni;;d?:0qyon
10.C语言解决百鸡百钱问题下冰雹的元气博客利用循环嵌套的方法,```c#includejvzquC41yy}/ewgnqiy/exr1newcm8u134>96?580jznn
11.蚂蚁科技集团被国家金融监督管理总局罚没37.62亿余元实况网三言科技7月7日消息,据国家金融监督管理总局官网,国家金融监督管理总jvzq<84o0ewukvju0et0pn|u1v{qkjs142842@5914;1:?60jvsm
12.C语言程序设计案例式教程黑马程序员编著著作C语言是编程者的入门语言,也是许多大学的第一门程序设计课程。黑马程序员编著的这本《C语言程序设计案例式教程》充分考虑到这一点,通过案例式的教学方式,在案例设计上从易到难,循序渐进,让初学者可以在做中学,学中做。 本书共分为10章,用案例诠释了C语言的基础语法知识和C语言核心内容,具体内容包括C语言概述、数jvzq<84rtqjve}3o0fgoimfpi0ipo8igvcom3<<;78=82<2443;:/:3jvor
13.C++编程实践题解本文提供了一系列C++编程实践题目的解决方案,包括数列求和、二进制转换、立方根计算等,通过实际例子展示了C++语言的应用技巧。 C++程序设计实践》实验4 【描述】 计算数列1+1/3+1/5+…的前n项之和。 【输入】 输入一个正整数n。 【输出】 输出数列前n项的和。 jvzquC41dnuh0lxfp0tfv8lqwdoykjkoq5bt}neng5eg}fknu524<<58781
14.利用C语言控制台打印九九乘法表下冰雹的元气博客利用C语言控制台打印九九乘法表 运用循环嵌套的方式,外层循环控制行,内层循环控制列进行打印 内循环每循环一次外循环打印一个换行 #include<stdio.h>voidmain(){inti,j;for(i=1;i<10;i++) {for(j=1;j<=i;j++) {printf("%d*%d=%d ",i,j,i*j);//只需要两个变量就可以了}printf("\n"); } jvzquC41yy}/ewgnqiy/exr1newcm8u134>96?5:0jznn
15.C语言共用体(联合体)union解析下冰雹的元气博客voidmain(){ typedef union score {inta;charb;doublec;chard[10];inte;//新增定义一个e}s1; s1 score; score.a =7; score.e=6; 这时是e被打印出来 但是 当交换位置时 共用体相比数组和结构体等用相对没那么广泛 数据类型强制转换和单机片某些方面还是有着很方便的作用的。jvzquC41yy}/ewgnqiy/exr1newcm8u134>96?560jznn
16.C语言——经典200道实例(1620)c语言精彩编程200例C语言——经典200道实例(16-20) 本文精选了五个经典的编程问题,包括求最大公约数和最小公倍数、字符统计、数列求和、寻找完数及计算小球弹跳轨迹等,通过实际代码展示了问题的解决方法。 16.最大公约数和最小公倍数 题目:输入两个正整数m和n,求其最大公约数和最小公倍数。jvzquC41dnuh0lxfp0tfv8vsa6>63?6431gsvrhng1jfvjnnu1739<95928
17.合理利用for循环打印素数下冰雹的元气博客复习c语言期间当然离不开最一点基础题喽,今天有一道题我想了好一会,打印100-300之间的素数因为这个是之前做过的题,没想太多就直接for循环嵌套了 ,可是素数我们知道只有两个因数,只能被自己本身和一整除,当进行到第二层循环式,肯定要找一个临时变量来接收这个值得,这样的话方便用if语句这进行判断 jvzquC41yy}/ewgnqiy/exr1newcm8u134>96?540jznn