导航:首页 > 源码编译 > 巴科斯范式编译工具

巴科斯范式编译工具

发布时间:2023-03-19 19:31:06

❶ 模糊测试 对代码质量影响深远的技术

年 月 日

模糊测试(Fuzz testing )是一项对代码质量有着深远影响的简单技术 在本文中 Elliotte Rusty Harold 故意将随机的坏数据插入应用程序 以观察发生的结果 他也解释了如何使用如校验和 XML 数据存储及代码验证等防护性编码技术 来加固您的程序以抵制随机数据 他以一个练习进行总结 在练习中他以一个代码破坏者的角度进行思考 —— 这是一种用于防护代码的至关重要的技术

多年来 我惊叹于有如此大量能够使 Microsoft Word 崩溃的坏文件 少数字节错位 会使整个应用程序毁于一旦 在旧式的 无内存保护的操作系统中 整个计算机通常就这样宕掉了 Word 为什么不能意识到它接收到了坏的数据 并发出一条错误信息呢?为什么它会仅仅因为少数字节被损坏就破坏自己的栈 堆呢?当然 Word 并不是惟一一个面对畸形文件时表现得如此糟糕的程序

本文介绍了一种试图避免这种灾难的技术 在模糊测试中 用随机坏数据(也称做 fuzz)攻击一个程序 然后等着观察哪里遭到了破坏 模糊测答行试的技巧在于 它是不符合逻辑的 自动模糊测试不去猜清滑哗测哪个数据会导致破坏(就像人工测试员那样) 而是将尽可能多的杂乱数据投入程序中 由这个测试验证过的失败模式通常对程序员来说是个彻底的震憾 因为任何按逻辑思考的人都不会想到这种失败

模糊测试是一项简单的技术 但它却能揭示出程序中的重要 bug 它能够验证出现实世界中的错误模式并在您的软件发货前对潜在的应当被堵塞的攻击渠道进行提示

模糊测试如何运行

模糊测试的实现是一个非常简单的过程

    准备一份插入程序中的正确的文件 用随机数据替换该文件的某些部分 用程序打开文件 观察破坏了什么

可以用任意多种方式改变该随机数据 例如 可以将整个文件打乱 而不是仅替换其中的一部分 也可以将该文件限制为 ASCII 文本或非零字节 不管用什么方式进行分割 关键是将大量随机数据放入应用程序并观察出故障的是什么

测试基于 C 的应用程序当字符串包含额外的零时 许多用 C 编写的程序都会出问题 —— 这类问题太过频繁以至于额外的零能够彻底隐藏代码中其他的问题 一旦验证出程序存在零字节问题 就可以移除它们 从而让其他的问题浮现出来

可以手动进行初始化测试 但要想达到最佳的效果则确实需要采用自动化模糊测试 在这种情况下 当面临破坏输入时首先需要为应用程序定义适当的错误行为 (如果当输入数据被破坏时 您发现程序正常运行 且未定义发生的事件 那么这就是第一个 bug )随后将随机数据传递到程序中直到找到了一个文件 该文件不会触发适当的错误对话框 消息 异常 等等 存储并记录该文件 这样就能在稍后重现该问题 如此重复

尽管模糊测试通常需要一些手动编码 但还有一些工具能提供帮助 例如 清单 显示了一个简单的 java&# ; 类 该类随机更改文件的特定长度 我常愿意在开始的几个字节后面启动让山模糊测试 因为程序似乎更可能注意到早期的错误而不是后面的错误 (您的目的是想找到程序未检测到的错误 而不是寻找已经检测到的 )

清单 用随机数据替换文件部分的类

import java io *; import java security SecureRandom; import java util Random; public class Fuzzer { private Random random = new SecureRandom(); private int count = ; public File fuzz(File in int start int length) throws IOException { byte[] data = new byte[(int) in length()]; DataInputStream din = new DataInputStream(new FileInputStream(in)); din readFully(data); fuzz(data start length); String name = fuzz_ + count + _ + in getName(); File fout = new File(name); FileOutputStream out = new FileOutputStream(fout); out write(data); out close(); din close(); count++; return fout; } // Modifies byte array in place public void fuzz(byte[] in int start int length) { byte[] fuzz = new byte[length]; random nextBytes(fuzz); System array(fuzz in start fuzz length); } }

关于代码我可以用很多种方式优化 清单 中的代码 例如 有着 java nio 的内存映射文件是一个相当不错的选择 我也能够改进这个错误处理及可配置性 因为不想让这些细节混淆这里所要说明的观点 所以我将代码保持了原样

模糊测试文件很简单 将其传至应用程序通常不那么困难 如 AppleScript 或 Perl 脚本语言通常是编写模糊测试的最佳选择 对于 GUI 程序 最困难的部分是辨认出应用程序是否检测出正确的故障模式 有时 最简单的方法是让一个人坐在程序前将每一个测试通过或失败的结果都标记下来 一定要将所有生成的随机测试用例单独地命名并保存下来 这样就能够重现这个过程中检测到的任何故障

防护性编码

可靠的编码遵循了这样的基本原则 绝不会让程序中插入未经过一致性及合理性验证的外部数据

如果从文件中读入一个数字并期望其为正数 那么 在使用其进行进一步处理前对其先验证一下 如果期望字符串只包含 ASCII 字母 请确定它确实是这样 如果认为文件包含一个四字节的整数倍的数据 请验证一下 一定不要假设任何外部提供的数据中的字符都会如您所料

最常见的错误是做出这样的假设 因为程序将该数据写出 该程序就能不用验证再一次将该数据读回去 这是很危险的!因为该数据很可能已经被另一个程序在磁盘上复写过了 它也可能已经被一个故障磁盘或坏的网络传输所破坏了或已经被另一个带 bug 的程序更改过了 它甚至可能已经被故意更改过以破坏程序的安全性 所以不要假设任何事 要进行验证

当然 错误处理及验证十分令人生厌 也很不方便 并被全世界程序员们所轻视 计算机的诞生已进入了六十个年头 我们仍旧没有检查基本的东西 如成功打开一个文件及内存分配是否成功 让程序员们在阅读一个文件时测试每一个字节和每一个不变量似乎是无望的 —— 但不这样做就会使程序易被模糊攻击 幸运的是 可以寻求帮助 恰当使用现代工具和技术能够显着减轻加固应用程序的痛苦 特别是如下三种技术更为突出

校验和 基于语法的格式 如 XML 验证过的代码如 Java

用校验和进行的模糊试验

能够保护程序抵御模糊攻击的最简单的方法是将一个检验和添加到数据中 例如 可以将文件中所有的字节都累加起来 然后取其除以 的余数 将得到的值存储到文件尾部的一个额外字节中 然后 在输入数据前 先验证检验和是否匹配 这项简单模式将未被发现的意外故障的风险降低到约 /

健壮的校验和算法如 MD 和 SHA 并不仅仅取其除以 的余数 它完成的要多得多 在 Java 语言中 java security DigestInputStream 和 java security DigestOutputStream 类为将一个校验和附属到数据中提供了便捷的方式 使用这些校验和算法中的一种可以将程序遭受意外破坏的机率降低到少于十亿分之一(尽管故意攻击仍有可能)

XML 存储及验证

将数据以 XML 形式存储是一种避免数据损坏的好方法 XML 最初即着力于 Web 页面 书籍 诗歌 文章及相似文档 它几乎在每个领域都获取了巨大的成功 从金融数据到矢量图形到序列化对象等等

不切实际的限定如果真想要破坏一个 XML 解析器 有几种方法可以试试 例如 大多数 XML 解析器服从于特定的最大尺寸 如果一个元素名长度超过 亿字符(Java String 的最大尺寸) SAX 解析器将会失败 尽管如此 在实践中这些极限值如此之高 以至于在达到之前内存就已经耗尽

使 XML 格式抵制模糊攻击的关键特征是一个对输入不做任何 假设的解析器 这就是真正想在一个健壮的文件格式中所获得的 设计 XML 解析器是为了让任何输入(格式良好的或无格式的 有效的或无效的)都以定义好的形式处理 XML 解析器能够处理任何 字节流 如果数据首先通过了 XML 解析器 则仅需要准备好接受解析器所能提供的东西 例如 不需要检查数据是否包含空字符 因为 XML 解析器绝不会传送一个空值 如果 XML 解析器在其输入中看到一个空字符 它就会发出异常并停止处理 当然还需要处理这个异常 但编写一个 catch 块来处理检测到的错误比起编写代码来检测所有可能的错误来说要简单得多

为使程序更加安全 可以用 DTD 和/或模式来验证文档 这不仅检查了 XML 是否格式良好 而且至少与所预期更加接近 验证并不会告知关于文档所需了解的一切 但它却使编写大量简单检查变得很简单 用 XML 很明显能够将所接受的文档严格地限定为能够处理的格式

尽管如此 还有多段代码不能用 DTD 或模式进行验证 例如 不能测试发票上商品的价格是否和数据库中库存商品的价格一致 当从客户接收到一份包含价格的订单文档时 不论其是 XML 格式或是其他格式 在提交前通常都会检查一下 以确保客户并未修改价格 可以用定制代码实现这些最后的检查

基于语法的格式

使 XML 能够对模糊攻击具有如此的抵御能力的是其使用巴科斯 诺尔范式(Backus Naur Form BNF)语法仔细且标准地定义的格式 许多解析器都是使用如 JavaCC 或 Bison 等解析器 生成器工具直接从此语法中构建的 这种工具的实质是阅读一个任意的输入流并确定其是否符合此语法

如果 XML 并不适合于您的文件格式 您仍可以从基于解析器的解决方案的健壮性中获益 您必须为文件格式自行编写语法 随后开发自己的解析器来阅读它 相比使用唾手可得的 XML 解析器 开发自己的解析器需要更多的工作 然而它是一个更为健壮的解决方案 而不是不根据语法正式地进行验证就将数据简单地装载到内存中

Java 代码验证

由模糊测试导致的许多故障都是内存分配错误及缓冲器溢出的结果 用一种安全的垃圾收集语言(在如 Java 或 managed C# 等虚拟机上执行的)来编写应用程序避免了许多潜在问题 即使用 C 或 C++ 来编写代码 还是需要使用一个可靠的垃圾收集库 在 年 台式机程序员或服务器程序员不应该还需要管理内存

Java 运行时对其自身的代码起到了额外保护层的作用 在将一个 class 文件装载到虚拟机之前 该文件要由一个字节符验证器或一个可选的 SecurityManager 进行验证 Java 并不假设创建 class 文件的编译器没有 bug 且运转正常 设计 Java 语言之初就是为了允许在一个安全沙箱中运行不信任的 潜在恶意的代码 它甚至不信任其自身编译过的代码 毕竟 也许有人已经用十六进制编辑器手工修改了字节符 试图触发缓冲器溢出 我们大家都应该对我们的程序也有对输入这样的偏执

以敌人的角度思考

之前介绍的每项技术都在阻止意外破坏方面造诣颇深 将它们综合起来恰当地实现 会将未被发现的非蓄意破坏发生的可能性几乎减少到零 (当然 并不会减少到零 但其发生的可能性就如同一束偏离轨道的宇宙射线将您 CPU 运算 + 的结果变为 的可能性一样微乎其微 )但不是所有的数据损坏都是非蓄意的 如果有人故意引入坏数据来破坏程序的安全性又该如何呢?以一个攻击者的角度进行思考是防护代码的下一个步骤

转回到一个攻击者的角度进行思考 假设要攻击的应用程序是用 Java 编程语言编写的 使用非本地代码且将所有额外数据都以 XML(在接受前经过彻底验证)形式存储 还能成功攻击吗?是的 能 但用随机改变文件字节的低级方法显然不行 需要一种更为复杂的方法来说明程序自身的错误检测机制及路径

当测试一个抵御模糊攻击的应用程序时 不可能做纯黑盒测试 但通过一些明显的修改 基本的想法还是可以应用的 例如 考虑校验和 如果文件格式包含一个校验和 在将文件传至应用程序前仅仅修改此校验和就可以使其同随机数据相匹配

对于 XML 试着模糊单独的元素内容和属性值 而不是从文档中挑选一部分随机的字节进行替换 一定要用合法的 XML 字符替换数据 而不要用随机字节 因为即使一百字节的随机数据也一定是畸形的 也可以改变元素名称和属性名称 只要细心地确保得到的文档格式仍是正确的就可以了 如果该 XML 文档是由一个限制非常严格的模式进行检查的 还需要计算出该模式没有 检查什么 以决定在哪里进行有效的模糊

一个结合了对剩余数据进行代码级验证的真正严格的模式也许不会留下可操纵的空间 这就是作为一个开发人员所需要追求的 应用程序应能够处理所发送的任何有意义的字节流 而不会因权利上( de jure ) 无效而拒绝

结束语

模糊测试能够说明 bug 在程序中的出现 并不证明不存在这样的 bug 而且 通过模糊测试会极大地提高您对应用程序的健壮性及抵御意外输入的安全性的自信心 如果您用 小时对程序进行模糊测试而其依然无事 那么随后同种类型的攻击就不大可能再危及到它 (并不是不可能 提醒您 只是可能性很小 )如果模糊测试揭示出程序中的 bug 就应该进行修正 而不是当 bug 随机出现时再对付它们 模糊测试通过明智地使用校验和 XML 垃圾收集和/或基于语法的文件格式 更有效地从根本上加固了文件格式

模糊测试是一项用于验证程序中真实错误的重要工具 也是所有意识到安全性问题且着力于程序健壮性的程序员们的工具箱中所必备的工具

关于作者

Elliotte Rusty Harold 来自新奥尔良 现在他还定期回老家喝一碗美味的秋葵汤 不过目前 他和妻子 Beth 定居在纽约临近布鲁克林的 Prospect Heights 同住的还有他的猫咪 Charm(取自夸克)和 Marjorie(取自他岳母的名字) 他是 Polytechnic 大学计算机科学的副教授 他在该校讲授 Java 和面向对象编程 他的 Web 站点 Cafe au Lait 已经成为 Internet 上最流行的独立 Java 站点之一 它的姊妹站点 Cafe con Leche 已经成为最流行的 XML 站点之一 他的书包括 Effective XML Processing XML with Java Java Neork Programming 和 The XML Bible 他目前在从事处理 XML 的 XOM API Jaxen XPath 引擎和 Jester 测试覆盖率工具的开发工作

lishixin/Article/program/Java/JSP/201311/19417

❷ 在阅读夏宇闻老师翻译的一本verilog的书中,解释一些语法用到下面图片里的符号,求大神解释。

这是表示元语法符号表示法的巴科斯范式(BNF),与语法本身(verilog)无关,只是为了说明特定的语法结构的。以下是网上引用的内容:
在双引号中的字("word")代表着这些字符本身。而double_quote用来代表双引号。羡者颂雹
在双引号外的字(有可能有下划线)代表着语法部分。
尖括号( < > )内包含的为必选项。
方括号( [ ] )内包含的为可选项。
大括号( { } )内包含的为可重复0至无数次的项。
竖线( | )表示在其左右两边任选一项兄樱薯,相当于"OR"的意思。
::= 是“被定义为”的意思。

具体信息可以参考维基网络的“巴科斯范式”与“扩展巴科斯范式”词条

❸ BNF是什么意思

BNF一般指巴科斯范式。巴科斯范式以美国人巴科斯(Backus)和丹晌拍麦人诺尔(Naur)的名字命名的一种形式化的语法表示方法,用来描述语法的一种形式体系,是一种典型的元语言。又称巴科斯-诺尔形式(Backus-Naur form)。

它不仅能严格地表示语法规则,而且所描述的语法是与上下文无关的。它具有语法简单,表示明确,便于语法分析和编译的特点。BNF表示语法规则的方式为:

非终结符用芦孙尖括号括起。每条规则的左部是一个非终结符,右部是由非终结符和终结符组成的一个符号串,中间一般以“::=”分陪谨链开。具有相同左部的规则可以共用一个左部,各右部之间以直竖“|”隔开。

(3)巴科斯范式编译工具扩展阅读:

发展历史:

约翰·巴科斯首次在ALGOL 58中实现巴科斯范式。彼得·诺尔在ALGOL 60之中,进一步发展它的概念并将它的符号加以简化,称其为巴科斯范式(Backus Normal Form)。

但高德纳主张应称为巴科斯-诺尔范式(Backus–Naur Form),因为它不算是一种正规形式(Normal form)。

❹ 编译原理中BNF是什么意思

一种用形式化符号描述语言的工具。

❺ PMD拜托各位了 3Q

PMD有很多种意思 具体如下 一、物理介质关联层接口 万兆以太网的物理(PHY)层规范和所支持的光学部件部分在IEEE802.3ae中定义。在以太网中银标准中,光学部件部分被称为“物理介质关联层接口(PMD-Physical Media Dependent)”。 二、偏振模色散 偏振模色散 指单模光纤中偏振色散,简称PMD(=Polarization Mode Dispersion),是由光纤横截面微小的不对称性引起的色散。这种不对称性引起两个相互垂直的基本偏振模以不同的速度传播。由于经历了色散,即脉冲扩展,当接收器接收到这个合成的脉冲时要比发送端的脉冲宽。 起因于实际的单模光纤中基模含有两个相互垂直的偏振模,沿光纤传播过程中,由于光纤难免受到外部的作用,如温度和压力等因素变化或扰动,使得两模式发生耦合,并且它们的传播速度也不尽相同,从而导致光脉冲展宽,展宽量也不确定,便相当于随机的色散。随着传输速率的提高,该色散对通信系统的影响愈来愈明,而且越来越不可低估。有文献给出由PMD限制的系扮培悔统最大距离按公式:L最大值=1000/(PMD.比特率)2,式中:L单位为(根号)km,PMD单位为PS/KM,以及比特率单位为Gb/s。国际上一些标准组织,如IEC、TIA和ITU考虑制定这种随机性色散的统计特性和相应的测试方法。在数字传输系统中,PMD的主要影响是产生码间干扰。 三、MikuMikuDance模型文件 MikuMikuDance是日本人樋口优所开发,将VOCALOID2的初音未来等角色制作3D模组的免费软件。 简称为MMD。 所厅正用模型文件即为pmd格式 四 便携多媒休辞典 PMD:portable multimedia dictionary 便携多媒体辞典 目前市面流通的电子辞典。以2.4寸、2.8寸、3.5寸居多。TFT真彩色320*240分辨 五 北京金字塔艺术中心--PMD 北京金字塔艺术连锁中心通过多年的努力与论证,2010年正式推出了《金字塔教学模式》,本教学模式是一套严格的4年课程(学生上课与练习时间较少需延长课程至8年以上),通过本模式正规培训的学生均取得了优异的成绩,北京金字塔艺术中心教学宗旨:“培养国内一流鼓手,发掘未来音乐大师,为国内打击乐事业的发展壮大贡献自己的力量”《金字塔教学模式》顾名思义:首先我们找到塔尖级世界一流鼓手需要具备哪些素质,其次我们论证他们的方法并且结合大量的理论依据与实践数据,总结出可行最佳执行方案,最后我们把自己的学员从塔底开始,一步步塑造成未来的大师。让每一个来中心学习的学员都得到最正规的培训,少走弯路、早日成功。金字塔教学模式高级课程是总部投资的背景音乐,每首5000元以上,均为国内顶级音乐制作人中国最知名吉他大师汶麟先生亲自用吉他录制,本公司拥有背景音乐的版权。 六 架子鼓品牌-外置可调音量架子鼓 PMD-外置可调音量架子鼓解决了困扰多年的架子鼓扰民问题 七 飞机上的多媒体娱乐系统PMD PMD是拥有7英寸液晶屏、外观优雅简洁的手持式娱乐设备,操作简单便捷,超大容量能容纳30多部电影、2000多分钟电视节目、500多首歌曲以及各类中外名着。南航航班上有配备。 八 软件行业的JAVA代码静态分析工具 PMD是一种开源分析Java代码错误的工具。与其他分析工具不同的是,PMD通过静态分析获知代码错误。也就是说,在不运行Java程序的情况下报告错误。PMD附带了许多可以直接使用的规则,利用这些规则可以找出Java源程序的许多问题。此外,用户还可以自己定义规则,检查Java代码是否符合某些特定的编码规范。 PMD的核心是JavaCC解析器生成器。PMD结合运用JavaCC和EBNF(扩展巴科斯-诺尔范式,Extended Backus-Naur Formal)语法,再加上JJTree,把Java源代码解析成抽象语法树(AST,Abstract Syntax Tree)。 PMD是一款采用BSD协议发布的Java程序代码检查工具。该工具可以做到检查Java代码中是否含有未使用的变量、是否含有空的抓取块、是否含有不必要的对象等。该软件功能强大,扫描效率高,是Java程序员debug的好帮手。 PMD支持的编辑器包括: JDeveloper、Eclipse、JEdit、JBuilder、BlueJ、CodeGuide、NetBeans/Sun Java Studio Enterprise/Creator、IntelliJ IDEA、TextPad、Maven、Ant,、Gel、JCreator和Emacs。 九PMD 产品组合决策 PMD(Proct Mix Decision),产品组合决策。是指在一定资源约束条件下,企业该如何安排产品组合,以实现一定时间内收益最大化的问题。

采纳哦

❻ 计算机导论论文

大学计算机科学导论论文
计算机科学与技术这一门科学深深的吸引着我们这些同学们,原先不管是国内还是国外都喜欢把这个系分为计算机软件理论、计算机系统、计算机技术与应用。后来又合到一起,变成了现在的计算机科学与技术。我一直认为计算机科学与技术这门专业,在本科阶段是不可能切分成计算机科学和计算机技术的,因为计算机科学需要相当多的实践,而实践需要技术;每一个人(包括非计算机专业),掌握简单的计算机技术行孝都很容易(包括原先Major们自以为得意的程序设计),但计算机专业的优势是:我们掌握许多其他专业并不"深究"的东西,例如,算法,体系结构,等等。非计算机专业的人可以很容易地做一个芯片,写一段程序,但他们做不出计算机专业能够做出来的大型系统。今天我想专门谈一谈计算机科学,并将重点放在计算理论上。

1)计算机语言
随着20世纪40年代第一台存储程序式通用电子计算机的研制成功,进入20世纪50年代后,计算机的发展步入了实用化的阶段。然而,在最初的应用中,人们普遍感到使用机器指令编制程序不仅效率低下,而且十分别扭,也不利于交流和软件维护,复杂程序查找错误尤其困难,因此,软件开发急需一种高级的类似于自然语言那样的程序设计语言。1952年,第一个程序设计语言Short Code出现。两年后,Fortran问世。作为一种面向科学计算的高级程序设计语言,Fortran的最大功绩在于牢固地树立了高级语言的地位,并使之成为世界通用的程序设计语言。Algol60的诞生是计算机语言的研究成为一门科学的标志。该语言的文本中提出了一整套的新概念,如变量的类型说明和作用域规则、过程的递归性及参数传递机制等。而且,它是第一个用严格的语法规则——巴科斯范式(BNF)定义语言文法的高级语言。程序设计语言的研究与发展在产生了一批成功的高级语言之后,其进一步的发展开始受到程序设计思想、方法和技术的影响,也开始受到程序理论、软件工程、人工智能等许多方面特别是实用化方面的影响。在“软件危机”的争论日渐平息的同时,一些设计准则开始为大多数人所接受,并在后续出缺带段现的各种高级语言中得到体现。例如,用于支持结构化程序设计的PASCAL语言,适合于军队各方面应用的大型通用程序设计语言ADA,支持并发程序设计的MODULA-2,支持逻辑程序设计的PROLOG语言,支持人工智能程序设计的LISP语言,支持面积对象程序变换的SMALLTALK、C等。而且,伴随着这些语言的出现和发展,产生了一大批为解决语言的编译和应用中所出现的问题而发展的理论、方法和技术。有大量的学术论文可以证明,由高级语言的发展派生的各种思想、方法、理论和技术触及到了计算机科学的大多数学科方向,但内容上仍相对集中在语言、计算模型和软件开发方法学方面。

(2)计算机模型与软件开发方法
20世纪80年代是计算机网络、分布式处理和多媒体大发展的时期。在各种高级程序设计语言中增加并发机构以支持分布式程序设计,在语言中通过扩展绘图子程序以支持计算机图形学程序设计成为当时程序设计语言的一种时尚。之后,在模数/数模转换等接口技术和数据库技术的支持下,通过扩展高级语言的程序库又实现了多媒体程序设计的构想。进入20世纪90年代之后,并行计算机和分布式大规模异质计算机网络的发展又将并行程序设计语言、并行编译程序、并行操作系统、并行与分布式数据库系统等试行软件的开发的关键技术依然与高级语言和计算模型密切相关,如各种并行、并发程序设计语言,进程代数,PETRI网等,它们正是软件开发方法和技术的研究中支持不同阶段软件开发的程序设计语言和支持这些软件开发方法和技术的理论基础——计算模型。
(3)计算机应用

用计算机来代替人进行计算,就得首先研究计算方法和相应的计算机算法,进而编制计算机程序。由于早期计算机的应用主要集中在科学计算领域,因此,数值计算方法就成为最早的应用数学分支与计算机应用建立了联系。最初的时候,由于计算机的存储器容量很小,速度也不快,为了计算一些稍稍大伏誉一点的题目,人们常常要挖空心思研究怎样节省存储单元,怎样减少不需要的操作。为此,发展了像稀疏矩阵计算理论来进行方程组的求解;发展了杂凑函数来动态地存储、访问数据;发展了虚拟程序设计思想和程序覆盖技术在内存较小的计算机上运行较大的程序;在子程序和程序包的概念提出之后,许多人开始将数学中的一些通用计算公式和计算方法写成子程序,并进一步开发成程序包,通过简洁的调用命令向用户开放。子程序的提出是今日软件重用思想的开端。

在计算机应用领域,科学计算是一个长久不衰的方向。该方向主要依赖于应用数学中的数值计算的发展,而数值计算的发展也受到来自计算机系统结构的影响。早期,科学计算主要在单机上进行,经历了从小规模数值分析到中大规模数值分析的阶段。随着并行计算机和分布式并行计算机的出现,并行数值计算开始成为科学计算的热点,处理的问题也从中大规模数值分析进入到中大规模复杂问题的计算。所谓中大规模复杂问题并不是由于数据的增大而使计算变得困难,使问题变得复杂,而主要是由于计算中考虑的因素太多,特别是一些因素具有不确定性而使计算变得困难,使问题变得复杂,其结果往往是在算法的研究中精度与复杂性的矛盾难于克服。

几何是数学的一个分支,它实现了人类思维方式中的数形结合。在计算机发明之后,人们自然很容易联想到了用计算机来处理图形的问题,由此产生了计算机图形学。计算机图形学是使用计算机辅助产生图形并对图形进行处理的科学。并由此推动了计算机辅助设计(CAD)、计算机辅助教学(CAI)、计算机辅助信息处理、计算机辅助测试(CAT)等方向的发展。

在各种实际应用系统的开发中,有一个重要的方向值得注意,即实时系统的开发。

利用计算机证明数学定理被认为是人工智能的一个方向。人工智能的另一个方向是研究一种不依赖于任何领域的通用解题程序或通用解题系统,称为GPS。特别值得一提的是在专家系统的开发中发展了一批新的技术,如知识表示方法、不精确性推理技术等,积累了经验,加深了对人工智能的认识。20世纪70年代末期,一部分学者认识到了人工智能过去研究工作基础的薄弱,开始转而重视人工智能的逻辑基础研究,试图从总结和研究人类推理思维的一般规律出发去研究机器思维,并于1980年在《Artificial Intelligence》发表了一组非单调逻辑的研究论文。他们的工作立即得到一大批计算机科学家的响应,非单调逻辑的研究很快热火朝天地开展起来,人工智能的逻辑基础成为人工智能方向发展的主流。

数据库技术、多媒体技术、图形学技术等的发展产生了两个新方向,即计算可视化技术与虚拟现实技术。
随着计算机网络的发展,分布在全世界的各种计算机正在以惊人的速度相互连接起来。网络上每天都在进行着大量政治、经济、军事、外交、商贸、科学研究与艺术信息的交换与交流。网络上大量信息的频繁交换,虽然缩短了地域之间的距离,然而同时也使各种上网的信息资源处在一种很难设防的状态之中。于是,计算机信息安全受到各国政府的高度重视。除了下大力气研究对付计算机病毒的软硬件技术外,由于各种工作中保密的需要,计算机密码学的研究更多地受到各国政府的重视。
实际上,在计算机科学中计算机模型和计算机理论与实现技术同样重要。但现在许多学生往往只注重某些计算机操作技术,而忽略了基础理论的学习,并因为自己是“操作高手”而沾沾自喜,这不仅限制了自己将研究工作不断推向深入,而且有可能使自己在学科发展中处于被动地位。例如,在20世纪50年代和20世纪60年代,我国随着计算机研制工作和软件开发工作的发展,陆续培养了在计算机制造和维护中对计算机某一方面设备十分精通的专家,他们能准确地弄清楚磁芯存储器、磁鼓、运算器、控制器,以及整机线路中哪一部分有问题并进行修理和故障排除,能够编制出使用最少存储单元而运算速度很快的程序,对机器代码相当熟悉。但是,当容量小的磁芯存储器、磁鼓、速度慢的运算器械、控制器很快被集成电路替代时,当程序设计和软件开发广泛使用高级语言、软件开发工具和新型软件开发方法后,这批技术精湛的专家,除少量具有坚实的数学基础、在工作中已有针对性地将研究工作转向其他方向的人之外,相当一部分专家伴随着新技术的出现,在替代原有技术的发展过程中而被淘汰。因此,在计算机科学中,计算比实现计算的技术更重要。只有打下坚实的理论基础,特别是数学基础,学习计算机科学技术才能事半功倍,只有建立在高起点理论基础之上的计算机科学技术,才有巨大的潜力和发展前景。

计算机理论的一个核心问题

我国计算机科学系里的传统是培养做学术研究,尤其是理论研究的人(方向不见得有多大的问题,但是做得不是那么尽如人意)。而计算机的理论研究,说到底了,如网络安全学,图形图像学,视频音频处理,哪个方向都与数学有着很大的关系,虽然也许是正统数学家眼里非主流的数学。这里我还想阐明我的一个观点:我们都知道,数学是从实际生活当中抽象出来的理论,人们之所以要将实际抽象成理论,目的就在于想用抽象出来的理论去更好的指导实践,有些数学研究工作者喜欢用一些现存的理论知识去推导若干条推论,殊不知其一:问题考虑不全很可能是个错误的推论,其二:他的推论在现实生活中找不到原型,不能指导实践。严格的说,我并不是一个理想主义者,政治课上学的理论联系实际一直是指导我学习科学文化知识的航标(至少我认为搞计算机科学与技术的应当本着这个方向)。
我个人的浅见是:计算机系的学生,对数学的要求固然跟数学系不同,跟物理类差别则更大。通常非数学专业的所?高等数学",无非是把数学分析中较困难的理论部分删去,强调套用公式计算而已。而对计算机系来说,数学分析里用处最大的恰恰是被删去的理论部分。记上一堆曲面积分的公式,难道就能算懂了数学?那倒不如现用现查,何必费事记呢?再不然直接用Mathematica或是Matlab好了。退一万步。华罗庚在数学上的造诣不用我去多说,但是他这光辉的一生做得我认为对我们来说,最重要的几件事情:首先是它筹建了中国科学院计算技术研究所,这是我们国家计算机科学的摇篮。在有就是他把很多的高等数学理论都交给了做工业生产的技术人员,推动了中国工业的进步。第三件就是他一生写过很多书,但是对高校师生价值更大的就是他在病期间在病床上和他的爱徒王元写了《高等数学引论》(王元与其说是他的爱徒不如说是他的同事,是中科院数学所的老一辈研究员,对歌德巴赫猜想的贡献全世界仅次于陈景润)这书在我们的图书馆里居然找得到,说实话,当时那个书上已经长了虫子,别人走到那里都会闪开,但我却格外感兴趣,上下两册看了个遍,我的最大收获并不在于理论的阐述,而是在于他的理论完全的实例化,在生活中去找模型。这也是我为什么比较喜欢具体数学的原因,正如我在上文中提到的,理论脱离了实践就失去了它存在的意义。正因为理论是从实践当中抽象出来的,所以理论的研究才能够更好的指导实践,不用于指导实践的理论可以说是毫无价值的。

正如上面所论述的,计算机系的学生学习高等数学:知其然更要知其所以然。你学习的目的应该是:将抽象的理论再应用于实践,不但要掌握题目的解题方法,更要掌握解题思想,对于定理的学习:不是简单的应用,而是掌握证明过程即掌握定理的由来,训练自己的推理能力。只有这样才达到了学习这门科学的目的,同时也缩小了我们与数学系的同学之间思维上的差距。

关于计算机技术的学习我想是这样的:学校开设的任何一门科学都有其滞后性,不要总认为自己掌握的某门技术就已经是天下无敌手了,虽然现在Java,VB,C,C++用的都很多,怎能保证没有被淘汰的一天,我想.NET平台的诞生和X#语言的初见端倪完全可以说明问题。换言之,在我们掌握一门新技术的同时就又有更新的技术产生,身为当代的大学生应当有紧跟科学发展的素质。举个例子,就像有些同学总说,我做网页设计就喜欢直接写html,不愿意用什么Frontpage,Dreamweaver。能用语言写网页固然很好,但有高效的手段你为什么不使呢?仅仅是为了显示自己的水平高,unique? 我看真正水平高的是能够以最快的速度接受新事物的人。高级程序设计语言的发展日新月异,今后的程序设计就像人们在说话一样,我想大家从xml中应是有所体会了。难道我们真就写个什么都要用汇编,以显示自己的水平高,真是这样倒不如直接用机器语言写算了。反过来说,想要以最快的速度接受并利用新技术关键还是在于你对计算机科学地把握程度。

❼ 基础正则表达式的BNF是怎样的

括号的意思:将(和)之间的表达式定义为“组”(group),并且将匹配这个表达式的字符保存到一个临时区域(一个正则表达式中最多可以保存9个),它们可以用\1到\9的符号来引用。|的意思:将两个匹配条件进行逻辑“或”(Or)运算。例如正则表达式(him|her)匹配"itbelongstohim"和"itbelongstoher",但是不能匹配"itbelongstothem."。*的意思:匹配0或多个正好在它之前的那个字符。例如正则表达式.*意味着能够匹配任意数量的任何字符。所以你给的那个例子00(0|1)*可以用来匹配00或者001或者000或者0000或者0011,但是不能匹配011等等。具体定义还是要多参考一下下面的文章:正则表达式,RegularExpression(也称为“regex”或“regexp”),是一种用来描述文本模式的特殊语法。一个正则表达式由普通字符(例如字符a到z)以及特殊字符(称为元字符,如/、*、?等)组成。简单地说,一个正则表达式就是你需要匹配的字符串。例如,正则表达式“A*B”匹配字符串“ACCCB”但是不匹配“ACCCC”。什么是巴科斯范式?巴科斯范式(BNF:Backus-NaurForm的缩写)是由JohnBackus和PeterNaur首先引入的用来描述计算机语言语法的符号集。现在,几乎每一位新编程语言书籍的作者都使用巴科斯范式来定义编程语言的语法规则。巴科斯范式的内容在双引号中的字("word")代表着这些字符本身。而double_quote用来代表双引号。在双引号外的字(有可能有下划线)代表着语法部分。尖括号()内包含的为必选项。方括号([])内包含的为可选项。大括号({})内包含的为可重复0至无数次的项。竖线(|)表示在其左右两边任选一项,相当于"OR"的意思。::=是“被定义为”的意思。巴科斯范式示例这是用BNF来定义的Java语言中的For语句的实例:FOR_STATEMENT::="for""("(variable_declaration|(expression";")|";")[expression]";"[expression]";"")"statement这是Oraclepackages的BNF定义:package_body::="package"package_name"is"package_obj_body{package_obj_body}["begin"seq_of_statements]"end"[package_name]";"package_obj_body::=variable_declaration|subtype_declaration|cursor_declaration|cursor_body|exception_declaration|record_declaration|plsql_table_declaration|procere_body|function_bodyprocere_body::="procere"procere_name["("argument{","argument}")"]"return"return_type"is"["declare"declare_spec";"{declare_spec";"}]"begin"seq_of_statements["exception"exception_handler{exception_handler}]"end"[procere_name]";"statement::=comment|assignment_statement|exit_statement|goto_statement|if_statement|loop_statement|null_statement|raise_statement|return_statement|sql_statement|plsql_block这是用BNF来定义的BNF本身的例子:syntax::={rule}rule::=identifier"::="expressionexpression::=term{"|"term}term::=factor{factor}factor::=identifier|quoted_symbol|"("expression")"|"["expression"]"|"{"expression"}"identifier::=letter{letter|digit}quoted_symbol::="""{any_character}"""扩展的巴科斯范式AugmentedBNFRFC2234定义了扩展的巴科斯范式(ABNF)。近年来在Internet的定义中ABNF被广泛使用。ABNF做了的改进,比如说,在ABNF中,尖括号不再需要。

❽ 模糊测试的基于语法的格式

使 XML 能够对模糊攻击具有如此的抵御能力的是其使用巴科斯-诺尔范式虚运(Backus-Naur Form,BNF)语法仔细且标准地定义的格式。许多解析器都是使用如 JavaCC 或 Bison 等解析器-生成器工具直接从此语法中构建的。这种工具的实质是阅读一个任意的输入流并确定其是否符合此语法。
如果 XML 并不适合于您的文件格式,您仍可以升茄从基于解析器的解决方案的健壮性中获益。您必须为文件格式自行编写语法,随后开发自己的解析器来阅读它。相比使用唾手可得的 XML 解析器,开发自差笑梁己的解析器需要更多的工作。然而它是一个更为健壮的解决方案,而不是不根据语法正式地进行验证就将数据简单地装载到内存中。

❾ BNF是什么

巴科斯范式及其扩展
BNF & Augmented BNF
什么是巴科斯范式?
巴科斯范式(BNF: Backus-Naur Form 的缩写)是由 John Backus 和 Peter Naur 首次引入一种形式化符号来描述给定语言的语法(最早用于描述ALGOL 60 编程语言)。确切地说,早在UNESCO(联合国教科文组织)关于ALGOL 58的会议上提出的一篇报告中,Backus就引入了大部分BNF符号。虽然没有什么人读过这篇报告,但是在Peter Naur读这篇报告时,他发现Backus对ALGOL 58的解释方式和他的解释方式有一些不同之处,这使他感到很惊奇。首次设计ALGOL的所有参与者都开始发现了他的解释方式的一些弱点,所以他决定对于以后版本的ALGOL应该以一种类似的形式进行描述,以让所有参与者明白他们在对什么达成一致意见。他做了少量修改,使其几乎可以通用,在设计ALGOL 60的会议上他为ALGOL 60草拟了自己的BNF。看你如何看待是谁发明了BNF了,或者认为是Backus在1959年发明的,或者认为是Naur在1960年中发明。(关于那个时期编程语言历史的更多细节,参见1978年8月,《Communications of the ACM(美国计算机学会通讯)》,第21卷,第8期中介绍Backus获图灵奖的文章。这个注释是由来自Los Alamos Natl.实验室的William B. Clodius建议的)。
现在,几乎每一位新编程语言书籍的作者都使用巴科斯范式来定义编程语言的语法规则。

阅读全文

与巴科斯范式编译工具相关的资料

热点内容
谷歌web服务器地址 浏览:896
安卓锁屏图片如何删除 浏览:717
python3多进程编程 浏览:711
证明代码是程序员写的 浏览:392
算法错误发现办法 浏览:407
河南省医院挂号是哪个app 浏览:627
冬日恋歌哪个APP能看 浏览:671
委内瑞拉加密货 浏览:8
程序员写日记哪个软件好 浏览:106
加密机操作手册 浏览:860
dos命令自动关闭 浏览:328
心田花开app在哪里评价 浏览:449
求索记录频道哪个app可以看 浏览:730
金梅瓶pdf下载 浏览:985
机器软件用什么编程 浏览:845
java虚拟机指令 浏览:671
shell编程入门书籍 浏览:946
大连桶装水溯源码售价 浏览:302
php怎么跳转到电脑 浏览:414
如何在电脑上创建新网络连接服务器 浏览:61