编程语言是一种用于表达计算的形式语言,可描述算法、数据操作以及与计算机的交互。它提供构建程序和解释程序含义的规则。编程语言也用于在人与人之间交流计算思想:程序员可以借助其符号体系描述过程、组织抽象,并在不依赖某次具体执行的情况下推理程序行为。对编程语言的研究是计算机科学的一个分支。(cs.princeton.edu)
句法与语义
语言的句法规定如何构成有效的表达式和语句。词法规则识别名称、关键字、数值字面量和运算符等元素;语法规则则决定这些元素如何组合。例如,一种语言可能要求将函数实参放在括号内,或使用缩进划分代码块。语法分析器会分析这种结构,通常生成树状表示,供后续处理使用。(docs.python.org)
语义学规定这些结构的含义,包括表达式如何产生值、语句如何改变程序状态,以及函数调用和错误的行为。操作语义通过计算步骤描述执行过程;指称语义赋予程序数学意义;公理语义则描述关于程序执行可以确立的性质。因此,句法上有效的代码不一定有意义或正确:它可能违反类型规则,也可能算出并非预期的结果。(cs.princeton.edu)
语言的定义与语言的实现是两个不同的概念。定义确立允许的结构与行为,而实现则提供使这些结构与行为得以落实的软件或硬件。语言规范可能将某些细节留给具体实现决定,包括程序表示、优化和诊断信息的某些方面。(haskell.org)
抽象与历史发展
早期电子计算机使用机器码编程,其指令与机器的体系结构紧密对应。汇编语言引入了表示指令和地址的符号记法。随后出现的高级语言使程序员能够表达操作,而不必逐一指定底层机器指令。这种分离使源程序更容易移植到具有相应语言实现的其他机器上。(ibm.com)
IBM公司于1957年将Fortran作为商业产品发布,它是早期面向科学计算和数值计算的重要高级语言。其编译器将数学记法转换为可执行指令,证明了使用高级语言编程也能生成高效的机器码。Lisp编程语言的实现工作始于1958年秋季,它发展出另一种思路,以符号表达式、列表结构、函数组合和递归为核心。这些发展奠定了语言设计中不同的传统。(ibm.com)
抽象也存在于程序内部。函数、模块、类和用户定义类型,使复杂行为能够由具有明确接口的组件组合而成。这些机制支持信息隐藏和复用,而二者都是软件工程关注的重要问题。(cs.princeton.edu)
编程范式
编程范式是组织计算的一种典型方式。这些类别彼此重叠,并不是对语言进行互斥的分类。(cs.princeton.edu)
- **命令式编程**描述改变状态的命令。赋值、条件分支和循环规定计算如何进行。过程式编程则将这些命令组织成可复用的过程。
- **函数式编程**强调表达式求值和函数组合。函数本身也可以作为实参传递,或作为结果返回。Haskell等纯函数式语言将普通的值计算与输入、输出等效应区分开来。
- **面向对象编程**围绕对象组织软件,对象将状态与相关操作结合在一起。类及相关机制定义对象的接口和对象之间的关系。
- **声明式编程**强调描述所需的关系或结果,而不是规定执行的每一个步骤。逻辑编程通过事实和规则来表达问题,由语言实现提供搜索过程。(cs.princeton.edu)
语言可以是通用的,也可以专门面向特定任务。例如,SQL提供了用于定义、修改和查询数据库的语言构造。专用性关注语言预期的应用领域,而范式关注语言组织计算的方式。(postgresql.org)
类型与内存管理
类型系统对值进行分类,并限制适用于这些值的操作。类型可以描述数值、文本、函数或结构化集合。静态类型在执行前检查相关约束;动态类型则在执行期间进行相关检查。Haskell是具有类型推断功能的静态类型语言,而Python采用动态类型。类型推断意味着程序员不必显式写出每一处类型标注,并不意味着语言采用动态类型。(haskell.org)
类型检查可以拒绝某些无效的组合,但不能证明程序达到了预期目的。类型正确的计算仍可能遇到运行错误,或包含错误的算法。(haskell.org)
不同语言的内存管理方式也有所不同。有些语言要求显式分配和释放内存,而垃圾回收会自动识别不再需要的内存。Rust则利用所有权规则和编译时检查来管理内存使用,无须采用追踪式垃圾回收器。内存管理与类型机制是相互关联的设计问题,但描述的是程序行为的不同方面。(doc.rust-lang.org)
实现与标准化
编译器将程序转换为另一种表示形式,同时保留其规定的含义。输出可以是机器码,也可以是某种中间指令格式。解释器则通过实现程序表示中的各项操作来执行程序。这些技术可以结合使用;编译与解释并不是一种语言相互排斥的属性。(cs.princeton.edu)
Java体现了这种区别。源程序可以编译成供虚拟机使用的字节码。Java虚拟机规范规定了指令格式和行为,但不要求采用特定的执行技术:具体实现可以解释执行指令,也可以将其转换为本机机器码。其他语言也可以生成这种格式的代码。(docs.oracle.com)
语言参考文档和标准确立共同规则,以支持程序在不同实现之间的可移植性。标准库规定核心语言之外可复用的功能。不过,特定实现的扩展以及所支持功能的差异,仍可能影响兼容性;可移植性取决于程序所使用的具体语言功能和库功能。(cs.princeton.edu)