任何人都知道任何静态类型的脚本语言? [关闭]

Posted

技术标签:

【中文标题】任何人都知道任何静态类型的脚本语言? [关闭]【英文标题】:Anyone know of any statically-typed scripting languages? [closed] 【发布时间】:2010-10-07 19:31:59 【问题描述】:

我即将开始一个基于 LFS 的 Linux 发行版,只是为了一个爱好项目。我计划做一些非常非标准的任务,其中大部分将涉及更改发行版中的几乎所有脚本。 (主要是 init 脚本,但我也会编写一组简单的包管理器脚本。)因为我要远离规范,而且我从来都不是动态类型语言的粉丝(perl, python、bash 和其他都很好,但不是我的强项),我想知道是否有人知道实际上已经声明变量的解释语言。

【问题讨论】:

Python 是强类型的。不是动态的。如果没有显式转换,您无法静默添加数字和字符串。 @gdivos:Python 既是强类型的 又是 动态的。它是动态的,因为您可以尝试使用任何类型的参数调用任何函数,并且直到运行时才会检测到不匹配的参数类型。静态语言会在编译时(或至少在运行时之前)检测到该问题。 不存在解释语言。每种语言都可以由编译器或解释器实现。而且,事实上,绝大多数编程语言至少有一个实现。此外,大多数现代语言实现实际上都有编译器和解释器。既然你提到了 Haskell:Hugs 就是一个 Haskell 解释器。 V8 是一个 javascript 编译器。微软的 PowerShell 是一个编译器。几年前,Bash 开发人员正在考虑切换到编译实现。 HotSpot JVM 既是解释器也是编译器。 此外,是否需要声明变量与语言是否为静态类型以及实现是否使用编译器、解释器或两者都完全正交。例如,未来版本的 ECMAScript 将要求声明变量,但 ECMAScript 是动态类型的。 您可能不再创建那个 Linux 发行版,但请尝试 Ammonite。它是作为脚本语言的 Scala。 【参考方案1】:

F# 提供了“类型安全、简洁、性能、表现力和脚本”的组合。

【讨论】:

F# 不是脚本语言。 什么定义了脚本语言?轻量级语法?一个REPL? F# 有那些... 被解释而不是编译。 解释与编译有什么关系?如果您可以通过执行“fsi foo.fsx”来运行 F# 程序,那与任何其他脚本有什么不同? 这与问题无关,可能不适合原始海报的目的。【参考方案2】:

通常静态类型语言是编译语言。我猜原因是,类型的静态分析相当昂贵,您必须深入了解您正在处理的所有代码。完成之后,不将所有信息写入文件感觉就像是一种浪费,这样您下次就不必再这样做了。所以你很快就会得到一种编译语言。

另一方面,将编译语言转换为“未编译”语言相当容易。您只是不将编译结果存储在任何地方,而是直接执行它们。我知道提供这样一个包装器的一个编译器是 GHC,标准的Haskell 编译器。您可以将#!/usr/bin/runhaskell 添加到您的源文件中,然后直接执行它们。而且由于您打算远离规范,因此 Haskell 似乎是一个完美的选择;)。但预计脚本的启动时间会相当长,因为所有“编译时间”分析和优化都不是免费的。

Haskell 不是为 shell 脚本而设计的,它是一种函数式语言,所以如果您以前从未见过它,可能需要一些时间来适应它。但是它的语法开销很小,而且函数式语言的优势在于抽象,所以我不明白为什么你不能创建一个让 shell 脚本变得有趣的库。甚至还有一些experimental Haskell shell,但它似乎更像是一个概念验证而不是真正的解决方案。

通常我会说所有类型分析的开销都很大,但我建议你选择你最喜欢的静态类型编译语言并寻找像 runhaskell 这样的包装器来执行用它编写的脚本。

【讨论】:

不存在编译语言。每种语言都可以由编译器或解释器实现。而且,事实上,绝大多数编程语言都至少有一个实现。此外,大多数现代语言实现实际上都有 both 编译器 解释器。既然你提到了 Haskell:Hugs 是一个 Haskell 解释器。 V8 是一个 JavaScript 编译器。微软的 PowerShell 是一个编译器。几年前,Bash 开发人员正在考虑切换到编译实现。 HotSpot JVM 既是解释器也是编译器【参考方案3】:

快速谷歌。 F3,javaFX脚本,Linden Scripting Language(第二人生的脚本),不像第一个答案的评论F#可以当脚本语言http://blogs.msdn.com/chrsmith/archive/2008/09/12/scripting-in-f.aspx

Felix、Tuga、CFGScript、Talc、Angelscript,并且猜测不止是快速搜索。

道格拉斯

【讨论】:

【参考方案4】:

查看您最喜欢的 shell 中的“排版”命令。 bash 和 ksh93 都可以强制整数和字符串,使用引用(变量变量)等。使用 ksh93,您还可以进行浮点数学运算并使用具有属性的对象。静态类型并不能真正为您购买任何在 init 脚本和类似脚本中有用的东西。你主要是读取文件和运行系统命令——这是 shell 真正擅长的。花点时间阅读 O'Reilly 的“学习 Korn Shell”一书,然后再决定所有其他 Unix 的设计都很愚蠢……;)

【讨论】:

和脚本早期的“set -o nounset”... 这是一个糟糕的建议。如果 OP 不是动态语言,他会讨厌 shell 脚本。它们比任何其他脚本语言都更具动态性。 这个答案提供了一个建议,以在 OP 已经熟悉的语言中强制执行类型,并且可能已经编写了 init 脚本。我想如果我刚刚说“这是不可能的”或“在这里,使用三个人都听说过的语言”:)【参考方案5】:

时髦。默认情况下,它是动态的、鸭式的。但也支持静态类型。

【讨论】:

以上是关于任何人都知道任何静态类型的脚本语言? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

史上最强TypeScript脚本介绍

动态语言,静态语言,强类型定义语言,弱类型定义语言

语言的分类

将 MySQL 脚本转换为 SQL Server [关闭]

动态类型是否与动态(后期)绑定相同?

如何关闭脚本调试?