编程语言的语法和语义

http://blog.csdn.net/gengzhikui1992/article/details/50762309

为了完整地定义编程语言,我们需要: 
语法,描述程序看起来是什么样的; 
语义,描述程序的含义。

语法

语法的定义

每一种编程语言都有一系列规则,描述在那种语言中什么样的字符串被认为是有效程序。这些规则定义了这种语言的语法。通过语言的语法规则,我们能把像 y = x + 1 这样可能有效的程序与像 >/;x:[email protected] 这样毫无意义的字符串区分开。

抽象语法树

当然,计算机程序的预期用途是被计算机读取,而要读程序就需要语法解析器:这个分析器程序能够读取代表程序的字符串,根据语法规则检查它是否有效,然后把它转换成一个适合被进一步处理的结构化表示。 
有各种各样的工具能把一种语言的语法规则自动转换成一个语法解析器。 
总体来讲一个语法解析器应该读入像 y = x + 1 这样的字符串,然后把它转换成抽象语法树( AST)。抽象语法树是源代码的一种表示,去掉了空格之类的无关细节,而只关注程序的分层结构。

语法总结

语法关心的只是程序的表面是什么样的,而不是它的含义。程序有可能语法正确但没有任何实际意义。例如,程序 y = x + 1 本身可能没有任何意义,因为并没有事先说明 x 是什么,而程序 z = true + 1 可能会在运行时候报错,因为它试图在一个布尔型值上加数字。

操作语义

操作语义定义

考虑程序含义的最实际方法是思考它做了些什么:在运行程序的时候,我们期望发生什么呢?在运行时编程语言中不同的结构都是如何表现的?把它们放到一起组成更大的程序时会是什么效果? 
这是操作语义学( operational semantic)的基础,这种方法为程序在某种机器上的执行定义一些规则,以此来捕捉编程语言的含义。这个机器常常是一种抽象的机器:

小步规约

那么,我们如何设计一台抽象机器,并使用它定义一种编程语言的操作语义呢?一种方法就是假想一台机器,用这台机器直接按照这种语言的语法进行操作一小步一小步地对其进行反复规约,从而对一个程序求值。不管最后得到的结果含义是什么,我们每一步都能让程序更接近最终结果。

这种小步规约类似于对代数式求值的方式。例如, 为了对 (1×2) + (3×4) 求值,我们知道应该:

  1. 执行左侧的乘法( 1×2 变成了 2),这样表达式就规约成了 2 + (3×4);
  2. 执行右侧的乘法( 3×4 变成了 12),这样表达式规约成了 2 + 12
  3. 执行加法( 2 + 12 变成了 14),最终得到 14。

我们可以认为 14 就是结果, 因为通过上面步骤已经不能再进一步规约了;我们认为 14 是一个特殊代数表达式,它是一个值,有自己的含义,不需要进一步的努力了。

小步规约的形式化规则

把如何进行每一小步的规约写成形式化规则,这个非形式化的过程就可以转换成一个操作语义。 
这些规则本身需要用某种语言( 元语言)写下来,而这种语言通常是数学符号。 
参考:《计算的本质:深入剖析程序和计算机》

时间: 2024-12-29 07:10:06

编程语言的语法和语义的相关文章

编程语言的语法与语义

编程语言的语法与语义 摘自<Formal Syntax and Semantics of Programming Languages >by Kenneth Slonneger / Barry L. Kurtz 刘建文略译(http://blog.csdn.net/keminlau) Chapter 1 SPECIFYING SYNTAX Language provides a means of communication by sound and written symbols. Human

C++ 的二进制语法与语义

二进制的语法 C/C++ 默认数字使用十进制,八进制使用前缀 0, 十六进制使用前缀 0x 或 0X,二进制常数的提议被否决(引用 C 语言程序原理国际标准 的 6.4.4.1 章节字段 "A proposal to add binary constants was rejected due to lack of precedent and insufficient utility."),一直没有二进制的表示方法, GCC 使用 0b/0B 前缀作为扩展,其实很多编译器都有这个扩展的,

语法和语义和错误;

每一种编程语言都有自己独特的语法规则. 一种语言的语法,准确,严格地规定了如何组合该语言中的`词汇以形成语句. 必须严格遵守这些规则才能创建程序. 例如,"标识符的名称不能一数字开头" 重点概念:语法规则规定了程序编写的形式,语义则是指每条语句的含义 重点概念:程序员必须对程序的正确性和可靠性负责 在程序开发过程中会遇到三种不同类型的错误: 编译时时错误; 运行时错误; 逻辑错误; 只要存在编译时的错误,就不会得到可执行的程序代码. 在JAVA程序中,许多运行时错误成为异常,异常可被捕

词法、语法与语义相关知识

概念 http://www.juweixin.com/t/detail/148383 语法到底是什么?有人说语法是语言里的法律.法规:有人说语法是框架结构:还有人说语法就是对前人语言习惯的一种总结.以上这些说法都对,但是又不全对. In linguistics, grammar is the set of structural rules governing the composition of clauses, phrases, and words in any given natural l

语法、语义与哲学

语法:语言要素组成语句的规则:是部分如何和成整体的原则: 物质的组成规则. 语义:描述的是信息流通的过程:本质是信息的可理解性. http://www.juweixin.com/t/detail/148383 语法到底是什么?有人说语法是语言里的法律.法规:有人说语法是框架结构:还有人说语法就是对前人语言习惯的一种总结.以上这些说法都对,但是又不全对. In linguistics, grammar is the set of structural rules governing the com

学习编程之Python篇(一)

第一次接触编程,你将面对两大难题: 1.  对所要使用的编程语言的语法和语义不甚了了. 2.  不知道如何通过编程来解决问题. 作为一名新手,你会尝试同时来解决这两个难题:一边熟悉编程语言的语法语义,一边考虑如何靠编程解决问题.这是一个循序渐进的过程,万事开头难,务必保持耐心,切勿操之过急. 学习编程其实没有什么捷径可走,最好的方法就是反复操练,聆听规则,讨论方法,都不如真正做点什么. 在掌握了一些编程语言的语法语义之后,接下来的难题就是怎样才能写出好的程序.那么,我们首先来看看什么是好的程序.

understand软件使用教程(转)

源代码阅读工具(Scientific Toolworks Understand)的特色 1.支持多语言:Ada, C, C++, C#, Java, FORTRAN, Delphi, Jovial, and PL/M ,混合语言的project也支持2.多平台: Windows/Linux/Solaris/HP-UX/IRIX/MAC OS X3.代码语法高亮.代码折迭.交叉跳转.书签等基本阅读功能.4.可以对整个project的architecture.metrics进行分析并输出报表.5.可

编程语言的进化

早上读到了一篇文章<Lisp的永恒之道> 这一篇文章解决了我一直以来对Lisp编程语言的疑惑,加深了对DSL(领域编程语言),同时对编程语言的理解也越来越深入.写一篇文章的目的就是从主要编程语言的进化来看看编程语言发展的过程以及背后的设计哲学,当然,这个只是我自己的认识,如果有不足之处,请博友指教. 机器语言 最早的编程语言是卡带,也就是机器语言,这种语言没有语义和语法,操作符和数据混合在一起,偏向于具体的设备,依赖觉得硬件. 汇编语言 随后,汇编语言就出现了,汇编语言定义了基本的语法结构,定

Atitit.编程语言and&#160;自然语言的比较and&#160;编程语言未来的发展

Atitit.编程语言and 自然语言的比较and 编程语言未来的发展 1. 单词的间隔靠空格,编程的单词的间隔靠分界符..1 2. 语句分界符:自然语言使用逗号,编程语言使用分号1 3. 换行1 4. 段落and  fun method2 5. 上下文相关2 6. 操作泛型化2 7. 动词和名词之间的互换性2 8. 词类的判断3 8.1.1. 词类划分的形式标志3 8.1.2. 自然语言中的指代词(你.我.他.它等等)好比编程语言中的“指针(point)”.4 8.2. 这类疑问句似乎在编程语