程序设计语言:自然语言的子集,确定性与精确性的规范

2024-07-11
来源:网络整理

很多初学者都会分不清这三个概念,应该说这三个概念是完全不一样的,不能混淆,在这篇文章中,我会尽力讲清楚这三个概念以及它们之间的关系。

首先说一下编程语言,它和人类的自然语言一样,也是一种语言,是自然语言的一个子集。大家都知道,自然语言是一个极其庞大而复杂的系统,有很多不确定性和不准确性,因此,我们没有办法形式化地描述自然语言。编程语言只是自然语言中非常小的一个子集,在计算机系统中,一切都需要确定性和精确性来描述,因此,编程语言也是极其规范的,在编程语言中,不确定性和不准确性几乎是不允许的,也就是不能有语法上的歧义。这样的编程语言可以通过一系列产生式来形式化地描述,这一系列产生式就叫做语法,语言就是由语法来定义的。从另一个角度来看,编程语言只是一种语言,它只对程序做出形式化的要求。也就是说,编程语言对应着编程中的编码阶段。我们有必要了解一下程序开发的三个阶段。 程序开发按时间顺序可以分为三个阶段:1.编码阶段,2.编译阶段,3.运行阶段。在编码阶段,我们使用编程语言。语言除了定义语法之外,不做其他任何事情。当然,一种语言也有很多版本,例如C语言就有很多版本。这里说的语言版本与编译器版本是不同的。C语言的标准版本是ANSI C。如果初学者问“哪种C语言更好?”这样的问题,这样的问题反映出他们对语言和编译器的关系缺乏了解。从语言的角度来看,VC和TC没有太大的区别,它们基本上都可以支持ANSI C。

我们再来看编译器。编译器和语言的关系,就好比翻译器和语言的关系一样。编译器就是翻译器,把用某种语言编写的源程序翻译成用目标语言编写的等效目标程序。前面我们说过,语言是一个由语法定义的抽象概念,唯一真正存在的东西就是定义语言的语法。在使用一种语言的时候,我们只能说用这种语言编写了程序。编译器可以将源程序翻译成某种语言,然后生成目标程序。我们通常说某种编译器支持某种语言,就是说编译器可以识别和翻译这种语言。现在的C编译器一般都支持ANSI C语言,另外编译器的设计者还可能对ANSI C进行一定的扩展,各个编译器的扩展功能都不一样。因此,一种编译器诞生之后,很有可能又会出现一种新的语言。 TC和VC对ANSI C做了不同的扩展,例如TC有far等关键字,这些是ANSI C所没有的;VC有嵌入式汇编_asm的语法,而TC则使用了asm关键字,而ANSI C是没有的。编译器的输入是源程序,它的输出是目标程序,一般来说,源程序是用高级语言编写的,而目标程序则是针对特定机器的机器语言程序。另一方面,编译器除了提供编译功能外,还提供了一些运行时库,所谓运行时库就是一些预先编写好的子程序组成的子程序库,例如C语言中的函数就是由C的运行时库提供的。在ANSI C中,定义了一些C语言的标准库函数,这些库函数是标准C所必须的,也可以说这些库函数已经成为ANSI C的一部分。此外,不同的编译器还可以提供自己的非标准库供用户使用。 TC中的库其实是TC自己提供的,不属于ANSI C。简单的说编译器是由编译器和运行时库组成的,在程序的编译阶段,通过编译器对源程序进行编译,生成目标程序。

在程序运行阶段,编译后的程序是在特定的平台上执行的。Java虚拟机是一个平台,DOS和也是平台。编译器的作用是沟通源程序和程序的运行平台。源程序对于运行平台来说是无法识别的,但当编译器将源程序编译成平台可以识别的目标语言时,程序就可以在这个平台上运行。

编程语言开发者_开发程序的语言_小程序开发者用什么语言

需要注意的是,编译器在这其中起到了非常重要的作用。我们现在可以明确一些概念了,编程语言只是语言而已,很难说好不好,这就好比说“中文和英文哪个好?”使用某种编程语言,我们就可以编写自己的程序,把想要完成的功能表达给计算机,这个阶段就叫编码阶段。编译器由编译器和运行库组成,编译器负责把源程序翻译成目标程序,运行库提供一些基本的子程序供程序编写者使用。我们可以说编译器是否支持某种语言,比如TC编译器支持ANSI C,而GCC则是可以支持多种语言的编译器。但是,不同的编译器除了提供对某种语言的支持外,还可能对该语言的某些功能进行扩展。编译器对语言的支持差别并不是很大,因为很多语言都建立了标准,比如ANSI C。编译器的另一个重要特性是对操作平台的支持。 平台是指程序运行所需的所有软件和硬件的基础。编译器通过把源程序编译成目标程序和编译器提供的运行库来支持运行平台。例如,TC只能编译C源程序才能生成使用CPU和操作系统DOS的DOS程序。VC只能编译C源程序才能生成使用CPU和操作系统DOS的程序。用编译器编译源程序称为编译阶段,编译器将源程序编译为针对某一平台的目标代码。程序在特定平台上运行时称为运行阶段。需要指出的是,在编码阶段使用编程语言和编译器提供的库函数,在此阶段生成源程序。在编译阶段使用源程序和编译器,在此阶段生成目标程序。在运行阶段使用目标程序和运行平台,此时生成程序运行结果。

所以讨论一种编程语言好坏是没有意义的,因为它们用在不同的场合。比如讨论汇编语言和Java语言的优劣是没有意义的。说“C语言哪种好”也是没有意义的。我觉得大家学的C都是基于ANSI C的C,不同的C语言之间的差别很小。我们通常把TC和VC称为编译器,而不是语言。编译器可以支持一种或多种编程语言。TC可以支持ANSI C,VC可以支持ANSI C和ANSI C++,而GCC是支持多种语言的编译器。如果真要说VC比TC好,只能说VC编译器提供的库函数多,VC能支持的平台多,VC编译出来的代码也多。

上面的这些概念我已经纠结了很久,不想多说了。我们先来看开发环境。为了方便程序员进行编码、调试等工作,编译器厂商在制作出编译器之后,都会提供一个集成开发环境(也称IDE)。在这个IDE中,用户可以完成编码、编译、调试、运行的全部工作。而且在最新的IDE中,可能还会提供可视化设计功能,方便用户设计程序界面。比如VB等。另一方面,开发环境除了IDE之外,还包括程序运行的平台。比如硬件是IBM PC兼容机,操作系统是等等。

也许,我能说的就这么多了。我觉得我说得不是很好,但我已经尽力了。有些事很难说清楚。“只可意会,不可言传”就是这个意思。别怪我说话不好。你只要用心去体会就好。

分享