【问题标题】:What statically typed languages are similar to Python? [closed]哪些静态类型语言类似于 Python? [关闭]
【发布时间】:2010-02-15 09:17:44
【问题描述】:

Python 是我目前所知道的最好的语言,但是由于自动完成,静态类型是一个很大的优势(虽然对动态语言的支持有限,但与静态语言相比,它根本算不上什么)。我很好奇是否有任何语言试图将 Python 的优点添加到静态类型语言中。特别是我对具有以下功能的语言很感兴趣:

  • 语法支持:例如字典、数组推导式
  • 函数:关键字参数、闭包、元组/多个返回值
  • 运行时修改/创建类
  • 避免在任何地方指定类(在 Python 中,这是由于鸭子类型,尽管类型推断在静态类型语言中会更好地工作)
  • 元编程支持:这是在 Python 中通过反射、注释和元类实现的

是否存在具有大量这些特性的静态类型语言?

【问题讨论】:

  • 这种“运行时修改/类的创建”几乎是反“静态类型”,你可以得到。还有其他方法可以解决静态类型程序中的问题。
  • 自动补全是一种工具功能,而不是语言功能。一些 IDE(例如 Komodo)可以为 Python 进行自动完成。只要你避免棘手的元编程。
  • @viraptor:我可以添加“避免在任何地方指定类”。类是大多数类系统中的类型,对于静态类型语言来说,不必指定类型有点奇怪。
  • @viraptor - 我理解许多静态语言的困难,但这并不是一个完整的障碍。 @Lott - 静态类型似乎总能带来更好的自动补全@David:类型推断避免了总是指定类的必要性
  • @David Thornley:实际上我喜欢 Haskell,您可以在其中删除大部分类型声明并且仍然是完全静态的。它可能会有所不同,但为什么奇怪呢?...

标签: python programming-languages


【解决方案1】:

Boo 是一种用于公共语言基础结构(又名 Microsoft .NET 平台)的静态类型语言。语法高度受 Python 启发,哈希/列表/数组是语法的一部分:

i = 5
if i > 5:
    print "i is greater than 5."
else:
    print "i is less than or equal to 5."

hash = {'a': 1, 'b': 2, 'monkey': 3, 42: 'the answer'}
print hash['a']
print hash[42]

for item in hash:
    print item.Key, '=>', item.Value

【讨论】:

  • 嘘真的很好。语法支持与 Python 一样好或更好。功能支持是一流的。类型推断和鸭子类型是可用的。有闭包和宏提供了一种元编程形式。类一般不能在运行时修改,但对于某些特性,这不是问题
  • Boo 与 Python 的执行速度是否有任何基准比较?
  • 这只是一个猜测,但我假设 Boo 的执行速度与 C# 大致相似,在这种情况下,性能可能会大大高于 Python:benchmarksgame.alioth.debian.org/u32/…
  • IIRC,不再支持 Boo
【解决方案2】:

Cobra 是 CLR 的静态类型语言(作为 Boo)。从它的网页:

Cobra 是一种通用编程 语言:

 - a clean, high-level syntax
 - static and dynamic binding
 - first class support for unit tests and contracts
 - compiled performance with scripting conveniences
 - lambdas and closures
 - extensions and mixins
 - ...and more
Sample code:

"""
This is a doc string for the whole module.
"""


class Person
    """
    This is a class declaration.
    """

    var _name as String  # declare an object variable. every instance of Person will have a name
    var _age as int

    cue init(name as String, age as int)
        _name = name
        _age = age

    def sayHello
        # This is a method

        # In strings, anything in brackets ([]) is evaluated as an expression,
        # converted to a string and substituted into the string:
        print 'Hello. My name is [_name] and I am [_age].'

    def add(i as int, j as int) as int
        """ Adds the two arguments and returns their sum. """
        return i + j

【讨论】:

    【解决方案3】:

    虽然它不是面向对象的,但Haskell 提供了大量您感兴趣的功能:

    • 对列表推导的语法支持,以及用于各种排序/绑定结构的 do 表示法。 (字典的语法支持仅限于对列表,例如,

      dict = ofElements [("Sputnik", 1957), ("Apollo", 1969), ("Challenger", 1988)]
      
    • 函数支持完全闭包和使用元组类型的多个返回值。不支持关键字参数,但“隐式参数”的强大功能有时可以替代。

    • 不对类、类型或对象进行运行时修改。

    • 通过类型推断避免在任何地方指定类/类型。

    • 使用模板 Haskell 进行元编程。

    此外,为了让您有宾至如归的感觉,Haskell 有显着的缩进!

    我实际上认为 Haskell 与 Python 的整体感觉完全不同,但这主要是因为它极其强大的静态类型系统。如果您有兴趣尝试静态类型语言,Haskell 是目前最雄心勃勃的语言之一。

    【讨论】:

      【解决方案4】:

      它可能无法满足您的所有需求,但请查看Boo - The wristfriendly language for the CLI

      如果你这样做,我强烈推荐DSLs in Boo: Domain-Specific Languages in .NET,它除了 DSL 方面之外,还在一个非常好的附录中涵盖了 Boo 语法和大量元编程。

      此外,tutorials 是一个很好的资源。

      【讨论】:

        【解决方案5】:

        Go 编程语言。我见过一些类似的范例。

        【讨论】:

        • Go 确实有一些不错的语法结构,但据我所知,它没有很多其他功能
        【解决方案6】:

        Rpython 是静态类型的 Python 子集。

        【讨论】:

        • 无标准库,仅用于创建解释器。
        【解决方案7】:

        D 编程语言是一种静态类型的本地编译语言,具有一些受 Python 启发的重要特性。

        数组和关联数组内置于语言中。没有列表推导,但 std.range 和 std.algorithm 库填补了大部分空白。例如,下面是一种将 D 中从 0 到 100 的所有偶数相加的方法:

        auto result = reduce!"a + b"(
            filter!"a % 2 == 0"(
                iota(0, 100)
            )
        );
        

        目前还没有关键字参数,但有闭包。支持元组,但不会自动解包。

        在 D 中,您避免使用 auto 关键字和模板在任何地方指定类(和一般类型)。例如,下面是查找任意数值类型数组乘积的通用代码:

        // The return type of product() is inferred.
        auto product(T)(T[] array) {
            T ret = 1;
            foreach(num; array) { // typeof(num) is inferred.
                ret *= num;
            }
        
            return ret;
        }
        

        D 的元编程支持包括编译时自省(例如,您可以在编译时迭代类或结构的字段)、运行时类型信息和模板,这些模板实际上是为超越简单泛型的元编程而设计的。例如,下面是如何编写一个为两个结构生成默认比较操作的通用函数,如果您需要像二叉树这样的任意总排序,这很有用:

        /**Returns -1 if lhs < rhs, 0 if lhs == rhs, 1 if lhs > rhs.*/
        int compareStructs(T)(T lhs, T rhs) {
            foreach(tupleIndex, value; lhs.tupleof) {
                if(value < rhs.tupeof[tupleIndex]) {
                    return -1;
                } else if(value > rhs.tupleof[tupleIndex]) {
                    return 1;
                }
            }
        
            return 0;
        }
        

        【讨论】:

          【解决方案8】:

          Lobster (http://strlen.com/lobster/) 是一种具有 Python 式语法的静态类型编程语言。

          它有一些你想要的东西:

          • 类型推断,因此您的代码可以看起来类似于 Python,而无需在任何地方指定类型。事实上,它在类型推断方面比 Haskell 等语言更进一步。
          • 闭包:它们在语法上比 Python 更轻(创建您自己的控制结构),但更强大(可能是多行的,您可以从它们返回到封闭函数)。
          • 多个返回值。

          在这些项目上表现不佳:

          • 字典或数组解析的语法。尽管它的 map/filter 语法是如此之少,以至于它可能可以与数组推导式竞争。
          • 关键字参数目前仅适用于构造函数。
          • 类的运行时修改:不。它是一种非常静态的语言。
          • 反思:也不行,虽然这肯定是可能的。

          【讨论】:

            【解决方案9】:

            在动态类型语言中仍然可以自动完成;没有什么能阻止 IDE 进行类型推断或检查,即使语言实现没有。

            【讨论】:

            • 没错。 PyDev 之类的工具很好,但自动完成/智能感知很糟糕。当它工作时,它太慢了。
            • 动态语言所需的自动补全与静态语言相比微不足道。
            • 在动态类型语言中一般不可能自动完成。这也是不可取的。动态类型的全部优点是编写无法进行类型检查的代码通常很方便。如果你要编写一个可以自动进行类型检查的程序,你不妨使用静态类型。因此提出了这个问题。
            【解决方案10】:

            如果您正在寻找自动完成功能,那么您可能想坚持使用 Python 并改用出色的 IDE。

            试用 PyCharm:http://www.jetbrains.com/pycharm/index.html

            除非您正在编写一些极其动态的东西(无论如何您可能无法用静态语言编写),否则它会跟上代码并为您提供完成、重构和我们习惯于静态的所有其他好处类型的语言。

            您可以在真正需要的地方向 IDE 提供类型提示:

            def foo(bar):
                if 0: bar = Bar() # "if 0" will be removed from the bytecode automatically by python
                bar. # will now autocomplete
            

            【讨论】:

            • 有人知道 PyCharm 与 Eclipse Python 支持的比较吗?我会看看它,但如果它甚至接近静态类型语言,我仍然会感到惊讶
            • 我发现它至少比 PyDev 好得多。但是,大约一年前我改用 PyCharm,所以我对 PyDev 的看法有点过时了。
            • if 0 如何提供类型提示?
            • 类型提示是“bar = Bar()”,“if 0”是让python不使用该行(因为我们希望bar是传入的值)。当使用“if 0”时,python 将从字节码中完全删除该行,并且根本不会有性能损失。
            • 你必须经历这个骇客的事实表明 Python 的 IDE 可以如何改进
            【解决方案11】:

            我知道这是一个旧线程,但我认为值得一提的是 Nim,它最近达到了 1.0 版,它的最佳特性之一是它的元编程功能。 还有更多。

            https://nim-lang.org/

            【讨论】:

              【解决方案12】:

              我认为 Eric 和 PyScripter 在 Windows 上具有很好的自动完成功能,但可能不如 PyTools for Visual Studio (Express)。

              对于 Python 中的静态类型,我会使用 Cython:http://docs.cython.org/src/quickstart/cythonize.html

              【讨论】:

                猜你喜欢
                • 2010-10-27
                • 2011-01-20
                • 1970-01-01
                • 2015-10-26
                • 2016-09-26
                • 2014-02-03
                • 2010-12-05
                相关资源
                最近更新 更多