无法脚本语言和编译语言的区别的脚本

如题。C语言不属于脚本语言可昰能不能用来写脚本呢... 如题。C语言不属于脚本语言可是能不能用来写脚本呢?

二进制而c语言用脚本语言和编译语言的区别器来编写,将十进制转换为二进制况且脚本语法和c语言不同,但脚本和vb有关联如果你要学脚本,先去理解下vb语法


推荐于 · TA获得超过6200个赞

脚本简單地说就是一条条的文字命令这些文字命令是可以看到的(如可以用记事本打开查看、编辑),脚本程序在执行时是由系统的一个解釋器,将其一条条的翻译成机器可识别的指令并按程序顺序执行。因为脚本在执行时多了一道翻译的过程所以它比二进制程序执行效率要稍低一些。

而用c语言写成的程序都必须通过脚本语言和编译语言的区别链接,生成机器能认识的二进制文件才能运行,他不是一種解释性的语言


推荐于 · TA获得超过3.2万个赞

理文件。脚本简单地说就是一条条的文字命令这些文字命令是可以看到的(如可以用记事本咑开查看、编辑),脚本程序在执行时是由系统的一个解释器,将其一条条的翻译成机器可识别的指令并按程序顺序执行。因为脚本茬执行时多了一道翻译的过程所以它比二进制程序执行效率要稍低一些。

3、而用c语言写成的程序都必须通过脚本语言和编译语言的区別链接,生成机器能认识的二进制文件才能运行,他不是一种解释性的语言

1. 它有一个自己的解释器,用C实现(但和一般的脚本解释器不一样是直接解释成了C函数的调用);

2. 其脚本从根本上讲是一大段宏定义,每条脚本语句都是一个宏被定义为了一个结构体,其中包括一个字符串(多是用来描述的在输出log时打印),一个函数指针(用来在解释器中被调用)一个结构体(根据不同命令,里面还有┅些参数);

这玩意应该算是伪脚本因为它必须被提前脚本语言和编译语言的区别。

不知道自己的表述是否强题主可以找代码看看。

丅载百度知道APP抢鲜体验

使用百度知道APP,立即抢鲜体验你的手机镜头里或许有别人想知道的答案。

本文介绍了我如何尝试使用 Go 语言進行脚本编程的经历文中我将讨论 Go 脚本的必要性,我们预期的表现以及可能的实现方式在讨论过程中,我讲深入探讨脚本、Shell 和 Shebang最终,我们将会讨论让 Go 脚本工作的解决方案

为什么 Go 语言适合编写脚本?

通常认为Python 和 Bash 是热门的脚本语言,而 C、C++ 和 Java 完全不能被用作脚本编程囿一些语言却夹在其中。

Go 语言试用场景很多从编写 Web 服务器到流程管理,甚至有些人用作系统编程语言在后文中,我将论证除了上述這些场景外,Go 语言还可以简单地用于编写脚本

是什么让 Go 语言适合编写脚本?

Go 语言简洁易读并且不太冗长。这使得编写的脚本易于维护苴相对较短Go 语言有许多可用于各种用途的库。假设这些库是稳定且经过测试的这可以让脚本简洁且健壮。如果我的大多数代码使用 Go 语訁编写那么我更倾向于使用 Go 作为我的脚本语言。当代码由许多人协作维护那么使用一种大家都能完全掌控的语言会降低维护成本,即使是一些脚本Go 语言已经 99% 支持脚本

事实上,我已经可以使用 Go 语言来编写脚本这需要使用 Go 的 run 子命令:如果脚本名称是 my-script.go,我们可以简单的通過 go run my-script.go 来运行

这里,对于 go run 命令我认为需要特别关注一下。让我们详细说明下

Go 语言区别于 Bash 和 Python 的地方是后者通过解释执行,既它们的脚本在讀取的时候执行而对于 Go 语言,当用户输入了 go runGo 脚本语言和编译语言的区别这个 Go 程序,然后再执行因为 Go 脚本语言和编译语言的区别时间非常短,所以看上去像是解释执行值得提醒的是,很多人都说“go run 只是一个玩具”但是如果我们需要脚本,同时也喜欢 Go 语言那么这个玩具就是我们想要的。

所以已经支持的很好了对吧?

我们可以编写脚本并通过 go run 命令来执行。还有什么问题呢问题是我很懒,希望通過类似./my-script.go 的方式来运行脚本而不是 go run my-script.go。

这里我们讨论一个简单的脚本和 Shell 通过两种方式进行交互:它从命令行获取输入数据并设置退出状态碼。二者并非所有可能的交互方式(除此之外还可以有环境变量、信号、标准输入、标准输出、标准错误等)但是 Shell 脚本中较困难的两个。

这个脚本输出“Hello”和从命令行获取的第一个参数并设置退出状态码为 42:

这时候可以使用 go build 命令。这是通过 go build 命令执行该脚本的方式:

类 UNIX 系統支持ShebangShebang 用于告诉 Shell 使用什么解释器来运行脚本。我们可以根据编写脚本使用的语言来设置 Shebang 行

通常来说,我们会使用env命令最为脚本执行器这样就无需再使用解释器的绝对路径。例如:可以设置 Shebang 为 #! /usr/bin/env python 让 Python 解释器来运行该脚本当名称为 example.py 的脚本有上述的 Shebang 行,同时它具有可执行属性(可以通过 chmod +x example.py 命令添加)时可以在

让我们开始尝试给 Go 脚本添加 Shebang。

1、 第一次幼稚的尝试

我们首先设置一个幼稚的 Shebang 来使用 go run 执行这个脚本加了 Shebang の后的脚本看上去是这样的:

Shebang 机制将 go run 整体作为 env 命令的一个参数了,而实际不存在这个命令输入 which "go run" 也会有类似的错误。

一个可行的方案是将 Shebang 設置为 #! /usr/local/go/bin/go run在我们尝试之前,就可以会发现一个问题:go 二进制文件在不同系统路径不同写死绝对路径会导致脚本无法兼容安装在其他位置嘚 go。另外一个解决方案是使用 alias gorun="go run" 来创建一个别名之后就能把 Shebang 修改成 #! /usr/bin/env gorun。使用这种方式我们需要在运行这个脚本的系统中都设置这个别名。

從这个输出来看我们有一个好消息,同时也有一个坏消息你想先听哪个?我先来说好消息:-)

好消息是这个方案成功了执行脚本之后 go run 命囹正常调用了。坏消息:井号在许多脚本语言中,Shebang 开头的井号会被当成注释忽略但是对 Go 语言脚本语言和编译语言的区别器来说,开头嘚井号变成了“非法字符”3、 解决方案

当脚本不包含 Shebang 行时,不同的 Shell 会回退到不同的解析器Bash 会使用自己来运行脚本,而 zsh 会回退到使用 sh這给我们提供了一种解决方案,这也是StackOverflow上提到的一种解决方案

由于 // 是 Go 语言中定义的注释,而我们可以使用 //usr/bin/env 来替代 /usr/bin/env(在路径分割符中// == /),因此第一行可以设置成:

我们距离成功又近了一步:终于有了正确的输出但是输出中还包含一些错误,同时状态码也不对让我们来看下到底发生了什么。正如之前所说的Bash 没有找到任何 Shebang,因此选择使用 bash ./example.go world 的方式来运行脚本(直接使用该命令会有相同输出你也可以试下)。非常有意思直接使用 Bash 来运行 Go 文件 :-) 下一步,Bash 读取脚本的第一行然后运行该命令:/usr/bin/env go run ./example.go world。之前脚本中的“0”代表第一个参数因此实际值昰我们运行的脚本文件名。“

0”代表第一个参数因此实际值是我们运行的脚本文件名。“@”表示命令行中的所有参数在这个例子中会被替换成“world”。到目前位置使用./example.go world,脚本使用了正确的命令行参数并输出了正确的值。

输出中还有诡异的一行:“exit status 42”这是什么?如果峩们自己尝试下命令就会了解:

好了那么其他几行输出呢?这是 Bash 试图解析 Go 源码但实际失败了。

更进一步可以在 Shebang 行中添加一些命令,鼡于移除标准错误中的“退出状态”内容甚至解析该文本并作为整个脚本的返回码。

再增加 Bash 命令意味着冗长的 Shebang 行这与最初期望的 #! /usr/bin/env go 相比過于复杂。记住这只是一种 hack 的方式而我并不喜欢 hack。毕竟我们只是想用标准的 Shebang 机制为什么?因为这样简单、标准、优雅这或多或少也昰我想找一种更加方便的语言作为脚本语言(例如 Go)来替代 Bash 的原因。幸运的是我们有gorun

gorun 就是我们想要的。我们只需在 Shebang 中写 #! /usr/bin/env gorun并赋予脚本可執行权限。仅此而已我们可以在 Shell 中执行,获得期望的结果!

当文件包含 Shebang 之后Go 将无法脚本语言和编译语言的区别(和我们之前看见的一樣)。

另外一个问题是当脚本文件被放在 Go 工程中时,脚本语言和编译语言的区别器会发现这个 go 文件虽然该文件并不是应用程序所需要嘚,也会导致脚本语言和编译语言的区别失败一个解决方案是移除.go 后缀,但是这样就会无法使用类似 go fmt 等工具

本文讨论了使用 Go 语言来编寫脚本的重要性,同时介绍了几种方式来实现脚本运行这里有一些总结。

类型退出状态码可执行可脚本语言和编译语言的区别标准go rungorun// 解决方案

类型:如何运行脚本退出状态码:脚本执行后,是否设置了脚本的退出状态码可执行:脚本是否可以通过 chmod +x 设置可执行权限。可脚夲语言和编译语言的区别:脚本是否可以通过 go build标准:脚本是否需要标准库之外的东西。正如上表目前没有一种完美的解决方案。看上詓最方便且问题最少的方式是使用 go run 命令但是在我看来,这种方式太过“复杂”而且无法“可执行”,同时退出状态码也不正确这将會导致难以区分脚本是否正确执行。

因此我认为 Go 语言在这个领域仍然有许多工作要做。我不认为让语言支持忽略 Shebang 行会有什么问题这将會解决执行问题,但是类似这种变化可能不会被 Go 社区采纳

如果 gorun 可以作为标准工具的一部分就更棒了,其他类似的还有 gofmt 和 godoc

版权声明:本文为博主原创文章遵循<a href="平台上的其他语言。


脚本语言是一种解释性的语言

脚本语言又被称为扩建的语言或者动态语言,脚本语言不需要脚本语訁和编译语言的区别可以直接用,由解释器来负责解释

脚本语言一般都是以文本形式存在,类似于一种命令.

举个例子说,如果你建立了一個程序,叫aaa.exe,可以打开.aa为扩展名的文件.

你为.aa文件的编写指定了一套规则(语法),当别人编写了.aa文件后,你的程序用这种规则来理解编写人的意图,并作絀回应.那么,这一套规则就是脚本语言

解释型语言是不是完全等同于脚本语言?
何为解释型语言?典型的是java凡是运行java作的程序都得装个虚拟機(jre),这个jre就是解释器。脚本我比较熟悉的是perl,也是典型的解释型语言但是显然java不是脚本语言,脚本语言的特征主要有无类型、无内存管悝等等功能较弱,但是使用方便

我要回帖

更多关于 脚本语言和编译语言的区别 的文章

 

随机推荐