编程语言之脚本语言
2023-08-03 17:57:25 阿炯

编程语言(英语:programming language),是用来定义计算机程序的形式语言。它是一种被标准化的交流技巧,用来向计算机发出指令,一种能够让程序员准确地定义计算机所需要使用数据的计算机语言,并精确地定义在不同情况下所应当采取的行动。

最早的编程语言是在电脑发明之前产生的,当时是用来控制提花织布机及自动演奏钢琴的动作。在电脑领域已发明了上千不同的编程语言,而且每年仍有新的编程语言诞生。很多编程语言需要用指令方式说明计算的程序,而有些编程语言则属于宣告式编程,说明需要的结果,而不说明如何计算。其描述一般可以分为语法及语义。语法是说明编程语言中,哪些符号或文字的组合方式是正确的,语义则是对于编程的解释。有些语言是用规格文件定义,例如C语言的规格文件也是ISO标准中一部分,2011年后的版本为ISO/IEC 9899:2017,而其他语言(例如Ada或者Perl)有一份编程语言实现文件,视为参考实现。其原本设计是专用于计算机,也用来定义算法或者数据结构。故而程序员试图使程序代码容易阅读。编程语言往往使程序员能够比使用机器语言更准确地表达他们所想表达的目的。对那些从事计算机科学的人来说,懂得程序设计语言是十分重要的,因为在当今所有的计算都需要程序设计语言才能完成。之所以有那么多种不同的编程语言存在的原因是,编写程序的初衷其实也各不相同;新手与老手之间技术的差距非常小,而且有许多语言对新手来说太容易学;还有不同程序之间的运行成本(runtime cost)各不相同。有许多用于特殊用途的语言,只在特殊情况下使用。例如PHP专门用来显示网页;Perl适合文本处理;C语言被广泛用于操作系统和编译器的开发(所谓的系统编程)。

高级语言的出现使得计算机程序设计语言不再过度地依赖某种特定的机器或环境。这是因为高级语言在不同的平台上会被编译成不同的机器语言,而不是直接被机器执行。最早出现的编程语言FORTRAN的一个主要目标,就是实现平台独立。虽然大多数的语言既可被编译又可被解译,但大多数仅在一种情况下能够良好运行。在一些编程系统中,程序要经过几个阶段的编译,一般而言,后阶段的编译往往更接近机器语言。这种常用的使用技巧最早在1960年代末用于BCPL,编译程序先编译一个叫做“0代码”的转换程序(representation),然后再使用虚拟器转换到可以运行于机器上的真实代码。这种成功的技巧之后又用于Pascal和P-code,以及Smalltalk和二进制码,在很多时候,中间过渡的代码往往是解译,而不是编译的。

如果所使用的翻译的机制是将所要翻译的程序代码作为一个整体翻译,并之后运行内部格式,那么这个翻译过程就被称为编译。因此,一个编译器是一个将人可阅读的程序文本(叫做源代码)作为输入的数据,然后输出可执行文件(object code)。所输出的可执行文件可以是机器语言,由计算机的中央处理器直接运行,或者是某种模拟器的二进制代码。若程序代码是在运行时才即时翻译,那么这种翻译机制就被称作直译。经直译的程序运行速度往往比编译的程序慢,但往往更具灵活性,因为它们能够与执行环境互相作用。

每一种程序设计语言可以被看作是一套包含语法、词汇和含义的正式规范。这些规范通常包括:
数据和数据结构
指令及流程控制
引用机制和重用
设计哲学

编程语言不成文规定:标识符(Identifier)命名常规

大多数被广泛使用或经久不衰的编程语言,拥有负责标准化的组织,经常会晤来创造及发布该编程语言的正式定义,并讨论扩展或贯彻现有的定义。

数据和数据结构

现代计算机内部的数据都只以二元方式储存,即开-关模式(on-off)。现实世界中代表信息的各种数据,例如名字、银行账号、度量以及同样低端的二元数据,都经由程序设计语言整理,成为高阶的概念。一个程序中专门处理数据的那个系统被称为程序语言的型态系统(type system);对型态系统的研究和设计被称为型态理论(type theory)。语言可以被分为静态型态系统(statically typed systems),例如C++和Java,和动态型态系统(dynamically typed systems),例如Lisp,JavaScript,Tcl和Prolog。前者可被进一步分为包含宣告型态(manifest type)的语言,即每一个变量和函数的型态都清楚地宣告,或type-inferred语言(例如MUMPS,ML)。

大多数语言还能够在内置的型态基础上组合出复杂的数据结构型态(使用数组,列表,堆栈,文件等等)。面向对象语言(Object Oriented Language)允许程序员定义新的数据型态,即对象(objects),以及运行于该对象的函数(functions)和方法(methods)。除了何时以及如何确定表达式和型态的联系,另外一个重要的问题就是语言到底定义了哪些型态,以及允许哪些型态作为表达式的值。诸如C编程语言之类的低端语言允许程序命名内存位置、内存区域以及编译时的常量;ANSI C甚至允许表达式返回结构值(struct values)。功能性的语言一般允许变量直接使用运行时计算出的值,而不是指出该值可能储存的内存地址。

常见的数据结构:数组、记录、链表、堆栈、队列、树、图、堆、散列。

指令及流程控制
一旦数据被确定,机器必须被告知如何对这些数据进行处理。较简单的指令可以使用关键字或定义好的语法结构来完成。不同的程序语言利用序列系统来获取或组合这些语句。除此之外,一个程序语言中的其他指令也可以用来控制处理的过程(例如分支、循环等)。

引用机制和重用
引用的中心思想是必须有一种间接设计储存空间的方法。最常见的方法是通过命名变量。根据不同的语言,进一步的引用可以包括指向其他储存空间的指针。还有一种类似的方法就是命名一组指令。大多数程序设计语言使用宏调用、过程调用或函数调用。使用这些代替的名字能让程序更灵活,并更具重用性。

编程语言已超过上千种,大部分用在计算领域。编程语言和人类使用的自然语言在精确度和完整性上有很大的差异。人们在用自然语言沟通时,内容可以不明确,甚至小的错误,而听的人仍然可能理解说的人想要说的内容。但电脑不同,电脑“只做被告知要做的事”,无法理解编程者想要写的程序。语言的定义、编程以及编程输入的组合需完整定义程序执行时的外部特性。另一方面,算法的概念可以表示为伪代码抑或者为编成码,是交织有自然语言和代码的编程语言,和其他人沟通时使用,此时就不一定要那么精确。其提供定义片段资料的结构化机制,以及在资料中需自动进行的运算或是转换。编程者利用编程语言提供的抽象化来表示计算的相关概念,这些概念则是由许多最简单元素(称为语言基元)的集合所组成。程序设计就是指利用语言基元来撰写新的程序,或是将旧程序改写,配合新的应用或是新的环境。

计算机程序语言可能是以批处理任务的方式执行,中间不需和用户交互,也有可能是由用户在解释器中指定执行特定的的程序。若某一编程语言的是目的是在某一应用软件(如Unix shell)或其他命令行接口执行其他程序,此编程语言会称为脚本语言。

衡量各编程语言的使用量

很难去比较哪一种编程语言的使用量最大,而且“使用量”一词也很难定义。某一种编程语言可能需要较多的时间进行开发,另一种编程语言可能产生的代码较长,第三种编程语言可能在CPU中执行的时间较长。有些语言在特定的领域十分受欢迎,例如COBOL在公司的数据中心仍相当常用,多半是在大型计算机上执行,Fortran常用在科学及工程应用,C语言常用在嵌入式设备应用及操作系统,Perl常用于系统管理和文本处理,JavaScript用于网页等。有许多不同的测量编程语言使用的程度的方法,不同的测量方式各有误差:
1.计算招聘广告中提到各编程语言的次数。
2.计算教授或描述各编程语言书籍卖出的数量。
3.占计各编程语言目前仍在使用代码的长度,不过可能会低估一些公开搜索不容易找到的编程语言。
4.利用搜索引擎计算找到不同编程语言的次数。


脚本语言(英语:Scripting language)是为了缩短传统的“编写、编译、链接、运行”(edit-compile-link-run)过程而创建的计算机编程语言。早期的脚本语言经常被称为批处理语言或作业控制语言。一个脚本通常是解释运行而非编译。脚本语言通常都有简单、易学、易用的特性,目的就是希望能让程序员快速完成程序的编写工作。而宏语言则可视为脚本语言的分支,两者也有实质上的相同之处。虽然许多脚本语言都超越了计算机简单任务自动化的领域,比如JavaScript、Perl、PHP、Python、Ruby和Tcl,成熟到可以编写精巧的程序,但仍然还是被称为脚本。几乎所有计算机系统的各个层次都有一种脚本语言。包括操作系统层,如计算机游戏,网络应用程序,字处理文档,网络软件等。在许多方面,高级编程语言和脚本语言之间互相交叉,二者之间没有明确的界限。
脚本语言是一种计算机程序语言,因此也能让开发者藉以编写出让电脑听命行事的程序。以简单的方式快速完成某些复杂的事情通常是创造脚本语言的重要原则,基于这项原则,使得脚本语言通常比C语言、C++语言或 Java之类的系统编程语言要简单容易,也让脚本语言另有一些属于脚本语言的特性:
1.语法和结构通常比较简单
2.学习和使用通常比较简单
3.通常以容易修改程序的“解释”作为执行方式,而不需要“编译”
4.程序的开发产能优于执行性能

一个脚本可以使得本来要用键盘进行的相互式操作自动化。主要由原本需要在命令行输入的命令组成,或在一个文本编辑器中,用户可以使用脚本来把一些常用的操作组合成一组序列。主要用来书写这种脚本的语言叫做脚本语言。很多脚本语言实际上已经超过简单的用户命令序列的指令,还可以编写更复杂的程序。

计算机语言是为了各种目的和任务而开发的,一个常见任务就是把各种不同的已有组件连接起来以完成相关任务。大多脚本语言共性是:良好的快速开发,有效率的执行,解释而非编译执行,和其它语言编写的程序组件之间通信功能很强大。许多脚本语言用来执行一次性任务,尤其是系统管理方面。它可以把服务组件粘合起来,因此被广泛用于GUI创建或者命令行,操作系统通常提供一些默认的脚本语言,即通常所谓shell脚本语言。

脚本通常以文本(如ASCII)保存,只在被调用时进行解释或编译。测试大型项目中经常把脚本和其它低级编程语言一起使用,各自发挥优势解决特定问题。脚本经常用于设计互动通信,它有许多可以单独执行的命令,可以做很高级的操作,(如在传统的Unix shell(sh)中,大多操作就是程序本身。)这些高级命令简化了代码编写过程。诸如内存自动管理和溢出检查等性能问题可以不用考虑。在更低级或非脚本语言中,内存及变量管理和数据结构等耗费人工,为解决一个给定问题需要大量代码,当然这样能够获得更为细致的控制和优化。脚本缺少优化程序以提速或者降低内存的伸缩性。

综上所述,脚本编程速度更快,且脚本文件明显小于如同类C程序文件。这种灵活性是以执行效率为代价的。脚本通常是解释执行的,速度可能很慢,且运行时更耗内存。在很多案例中,如编写一些数十行的小脚本,它所带来的编写优势就远远超过了运行时的劣势,尤其是在当前程序员工资趋高和硬件成本趋低时。

然而,在脚本和传统编程语言之间的界限越来越模糊,尤其是在一系列新语言及其集成常出现时。在一些脚本语言中,有经验的程序员可以进行大量优化工作。在大多现代系统中通常有多种合适的脚本语言可以选择,所以推荐使用多种语言编写一种脚本。


脚本语言分类

作业控制和shell语言
此类脚本用于自动化工作控制,即启动和控制系统程序的行为。大多的脚本语言解释器也同时是命令行界面,如Unix shell和MS-DOS COMMAND.COM。其他如AppleScript,可以为系统增加脚本环境,但没有命令行界面。具体包括:
4DOS
4NT / Take Command
AppleScript
ARexx(Amiga Rexx)
bash
csh
DCL
JCL
ksh
Cmd.exe批处理(Windows, OS/2)
Command.com批处理(DOS)
REXX
tcsh
sh
Winbatch
Windows PowerShell
Windows Script Host
zsh

文本处理语言
处理基于文本的记录是脚本语言最早的用处之一。如Unix's awk最早是设计来帮助系统管理员处理调用UNIX基于文本的配置和LOG文件。Perl最早是用来产生报告的,现在它已经成了全面成熟的语言。具体包括:
Awk
Perl
sed
XSLT

动态语言
一些通用动态语言,比如Perl,从一门脚本语言发展成了更通用的编程语言,由于“解释执行,内存管理,动态”等特性,它们仍被归类为脚本语言。脚本编程常与系统编程相对比,如Ousterhout在Ousterhout二分法或大型编程和小型编程中做出的那样。在这种视角下,脚本是胶水代码,被来连接软件组件,专门用于这个目的的语言叫做胶水语言。
APL
Dylan
Groovy
JavaScript/JScript
Lua
MUMPS(M)
newLISP
Nuva
Perl
PHP
Python
Ruby
Scheme
Shell脚本(如 Unix shell、Windows PowerShell等)
GNU Smalltalk
SuperCard
Tcl(工具命令语言)
VBScript

可扩展/可嵌入语言
少数的语言被设计通过嵌入应用程序来取代应用程序定制的脚本语言。开发者(如使用C等其它系统语言)包入使脚本语言可以控制应用程序的hook。这些语言和应用程序定制的脚本语言是同种用途,但优点在于可以在应用程序之间传递一些技能。具体包括:
Ch(C/C++解释器)
ECMAScript(实现为DMDScript、JavaScript等)
GameMonkeyScript
Guile
ICI
Lua
RBScript(REALbasic脚本)
Squirrel
Tcl

JavaScript直到现在仍然是网页浏览器内的主要编程语言,它的ECMAScript标准化保证了它成为流行的通用嵌入性语言。Tcl作为一种可扩展语言而创建,但更多地被用作通用性语言,就如同Python, Perl, Ruby一样。

应用程序定制的脚本语言
许多大型的应用程序都包括根据用户需求而定制的惯用脚本语言。同样地,许多电脑游戏系统使用一种自定义脚本语言来表现NPC(non-player character,non-playable character,non-player class)和游戏环境的预编程动作。此类语言通常是为一个单独的应用程序所设计,虽然它们貌似一些通用语言(如QuakeC, modeled after C),但它们有自定义的功能。具体包括:
Action Code Script
ActionScript
AutoLISP
Emacs Lisp
Game Maker Language
HyperTalk
IPTSCRAE
IRC script
Lingo
Matlab Embedded Language
Maya Embedded Language
mIRC script
NWscript
QuakeC
UnrealScript
Visual Basic for Applications
VBScript
ZZT-oop

WEB编程脚本
应用程序定制的脚本语言中有一种重要的类别,用于提供WEB页面的自定义功能。它专业处理互联网通信,使用网页浏览器作为用户界面。当然,大多现代WEB编程语言都比较强大可以做一些通用编程。具体包括:

ColdFusion(应用服务器)
Lasso
Miva
SMX
IPTSCRAE,一些网络开发团队用于创建论坛的工具

GUI脚本
GUI出现带来一种专业的控制计算机的脚本语言。它在用户和图形界面,菜单,按钮等之间互动。它经常用来自动化重复性动作,或设置一个标准状态。理论上它可以用来控制运行于基于GUI的计算机上的所有应用程序,但实际上这些语言是否被支持还要看应用程序和操作系统本身。当通过键盘进行互动时,这些语言也被称为宏语言。具体包括:
AutoHotkey
AutoIt
Expect

其它
BeanShell(Java的脚本)
CobolScript
Euphoria
F-Script
Groovy
Io
KiXtart
Object REXX
Pike
REBOL
ScriptBasic
StepTalk
Visual DialogScript


上文总结自:中文维基百科