脚本语言是什么
脚本语言是为了缩短传统的“编写、编译、链接、运行”过程而创建的计算机编程语言。
早期的脚本语言经常被称为批处理语言或作业控制语言。
一个脚本通常是解释运行而非编译。
脚本语言通常都有简单、易学、易用的特性,目的就是希望能让程序员快速完成程序的编写工作。
编程语言分为编译型语言和解释型语言,脚本语言就属于解释型语言。
脚本语言是一种计算机程序语言,因此也能让开发者藉以编写出让电脑听命行事的程序。 以简单的方式快速完成某些复杂的事情通常是创造脚本语言的重要原则, 基于这项原则,使得脚本语言通常比C语言、C++语言或 Java之类的系统编程语言要简单容易, 也让脚本语言另有一些属于脚本语言的特性:
语法和结构通常比较简单
学习和使用通常比较简单
通常以容易修改程序的“解释”作为运行方式,而不需要“编译”
程序的开发产能优于运行性能
计算机语言是为了各种目的和任务而开发的,
一个常见任务就是把各种不同的已有组件连接起来以完成相关任务。
大多脚本语言共性是:
良好的快速开发,
有效率的执行,
解释而非编译执行,
和其它语言编写的程序组件之间通信功能很强大。
许多脚本语言用来执行一次性任务,尤其是系统管理方面。
它可以把服务组件粘合起来,因此被广泛用于GUI创建或者命令行,
操作系统通常提供一些默认的脚本语言,即通常所谓shell脚本语言。
脚本通常以文本(如ASCII)保存,只在被调用时进行解释或编译。
测试大型项目中经常把脚本和其它低级编程语言一起使用,各自发挥优势解决特定问题。
脚本经常用于设计互动通信,它有许多可以单独执行的命令,
可以做很高级的操作,(如在传统的Unix shell(sh)中,大多操作就是程序本身。)
这些高级命令简化了代码编写过程。诸如内存自动管理和溢出检查等性能问题可以不用考虑。
在更低级或非脚本语言中,内存及变量管理和数据结构等耗费人工,为解决一个给定问题需要大量代码,
当然这样能够获得更为细致的控制和优化。脚本缺少优化程序以提速或者降低内存的伸缩性。
综上所述,脚本编程速度更快,且脚本文件明显小于如同类C程序文件。
这种灵活性是以执行效率为代价的。
脚本通常是解释执行的,速度可能很慢,且运行时更耗内存。
在很多案例中,如编写一些数十行的小脚本,
它所带来的编写优势就远远超过了运行时的劣势,尤其是在当前程序员工资趋高和硬件成本趋低时。
linux默认的命令行Bash用的指令就是脚本语言的一种。
我们常用的Python由于其特性也分类为脚本语言的一种。
本人有幸接触过Lua语言,lua也是轻量小巧的脚本语言。应该会有lua相关的博文
解释器
既然脚本语言是解释型语言,就必须来讨论一下解释器。就定义上虽然划分了编译型语言和解释型语言,有着各自独有的编译器和解释器,但它们未必就是相互独立的。
解释器执行程序的方法有:
1.直接执行高级编程言(如Shell内建的编译器)
2.转换高级编程语言到更有效率的字节码(Bytecode),并执行字节码
3.用解释器包含的编译器对高级语言进行编译,并指示中央处理器执行编译后的程序(例如:JIT)
其中3的——用解释器包含的编译器对高级语言进行编译,并指示中央处理器执行编译后的程序——这句话我觉得很有意思,所以解释器中包含编译器,所谓的读取一句执行一句其实源代码输入后结果的差别,如果出来的是另一种代码,可执行文件,那就是编译器,直接输出源码执行后的结果,那就是解释器。
不能因为名字定义就错误认为编译器一定没有编译的过程。
比如说可以写一个C语言的解释器,效果是对C语言进行编译,然后运行生成的可执行文件,再将得到的结果直接输出,那么这就是一个定义上的解释器。
Perl,Python,MATLAB,与Ruby是属于第二种方法,而UCSD Pascal则是属于第三种方式。
在翻译的过程中,这组高级语言所写成的程序仍然维持在源代码的格式(或某种中继语言的格式),而程序本身所指涉的动作或行为则由解释器来表现。
在解释器上运行程序比直接运行编译过的代码来得慢,是因为解释器每次都必须去分析并翻译它所运行到的程序行,而编译过的程序就只是直接运行。
这个在运行时的分析被称为”解释式的成本”。
在解释器中,变量的访问也是比较慢的,因为每次要访问变量的时候它都必须找出该变量实际存储的位置,而不像编译过的程序在编译的时候就决定好了变量的位置了。
哪些是编译原理相关的技术
那么脚本语言中究竟涉及到了哪些编译相关的技术呢?
可以确定的是,通过上文的描述,我们可以理解,解释型语言和编译型语言差别在输出对象上,
实际执行中,都逃不开词法分析器、语法分析器和语义分析。
由于编译型语言和解释型语言的代码执行顺序不同,所以当源码中有错误时,
编译型语言会直接在编译过程报错,并不会生成目标代码程序,
而解释型语言则会将错误之前的代码段全部执行完毕,然后到有问题的语句再报错。
比如:
echo hello
for((i=1;i<=10;i++)); do
echo hello
for((i=1;i<=10;i++));
echo hello
done
done
其中第二个for循环少了do,所以程序会输出一次hello,然后报错。
每种解释型语言处理方式不同,但是可以猜测,
解释型语言不会逐个“物理行”解析,但是“按命令”解析执行是可以的,
比如python在交互模式下就是你输入一行,编译并执行这一行,
但是你如果输入是if、while的话,它会让你将代码块都输入完整后才将这一段作为一个完整的命令
引用
脚本语言wiki
解释器百度百科
知乎:Java 是编译型语言还是解释型语言?中的RednaxelaFX的已失效博文,但是被路人备份了传送门
知乎:python需要编译,为什么还把他叫做脚本语言?