【问题标题】:Statically-typed cross-OS Web platforms: Java, Mono, and what else? [closed]静态类型的跨操作系统 Web 平台:Java、Mono 等等? [关闭]
【发布时间】:2012-05-17 11:08:38
【问题描述】:

我很欣赏这个问题可能由于其开放式性质而被关闭,但我仍然很好奇。

如果我想使用静态类型语言开发一个跨平台的 Web 应用程序,我的选择是什么?我知道 Mono 和 Java,但还有什么?

(当我说跨平台时,我指的是 Windows 和至少一种常见的 Linux)

【问题讨论】:

    标签: java .net types open-source


    【解决方案1】:

    您可以对客户端和服务器部分使用单一语言:

    1. Java
    2. C#
    3. Google 的围棋
    4. 斯卡拉
    5. GWT(Java 框架)
    6. Haskell 网络框架

    【讨论】:

    • PHP 和 Python 不是静态类型语言。所以他们的框架不会阻止运行时的类型错误破坏服务器。
    • 您正在混合使用框架和语言。 GWT 是一个使用 Java 的框架。这可能会误导恕我直言。
    • @MikeMyers 哦,绝对赞成列出所有这些,但我只是认为 OP 非常清楚想要的语言,而不是使用相同语言的框架列表。这个问题确实突出了 Web 开发人员使用静态类型语言的有限选项。看到静态类型的 nodejs 版本会很酷。
    【解决方案2】:

    有几个高性能的 Haskell Web 框架强调强大的静态正确性:

    目标是依靠类型系统来提供高度优化的代码,并且运行时失败的可能性为零。

    引用 Yesod 网站:

    将运行时错误转化为编译时错误

    Yesod 相信 让编译器成为你的盟友,而不是你的敌人的哲学。我们使用 类型系统尽可能地执行,从生成适当的 链接,避免 XSS 攻击,处理字符编码 问题。一般来说,如果您的代码编译,它的工作原理。而不是 在任何地方声明类型,让编译器找出它们 你有类型推断。

    【讨论】:

    • 这些对我来说是全新的,感谢您提供的信息!然而,我对“零运行时失败”的说法持怀疑态度——请你详细说明一下吗?静态类型不会消除行为错误...
    • 我应该澄清一下:目标是在类型系统中编码尽可能多的属性,以在极限内接近零运行时失败的可能性。这并不意味着您拥有经过正式验证的网络应用程序,但这是朝着它迈出的一步。
    • 太棒了,我目前正在通过代码合同在 .NET 中使用形式验证。这些听起来像我的语言:)
    • 在更深入的研究方面,有一个正式的方法 - 用于 Web 应用程序的方法,impredicative.com/ur - 针对可证明正确的代码。
    • 被标记为信息最丰富/最有趣的答案(至少对我来说!)。不过,还有很多其他有见地的答案-感谢 SO 社区! :)
    【解决方案3】:

    如果您的意思是静态类型,那么遗憾的是没有那么多选择。 Google 的Go 语言似乎开始发展到网络应用领域(Google 的 App Engine 和诸如 GoWeb 等项目的 Go 支持),但这些努力可能还不是很成熟。

    Scala 可能是另一种可能的选择。虽然它也在 JVM 上运行,但由于语言的高级特性(参见例如 Lift),它的 Web 框架非常不同,可能值得单独查看。

    【讨论】:

      【解决方案4】:

      除了 Java 和 C#(通过 mono),您还可以使用
      Wt (C++ Web Toolkit) 形式的(现代)C++。 现在 C++ 的 C 向后兼容部分不是强类型的,但 C++ 程序是类型安全的。

      如果您想要真正强大的类型安全性,可以将 Haskell 与 Yesod 结合使用。 Yesod 的目标是使用强类型来防止 Web 应用程序编程中的常见错误。例如,URL 是经过类型检查的。如果不提供正确的参数,您将无法构建应用程序内链接。渲染网页时用户内容的转义是另一种情况,其中使用 Haskell 编译器确保字符串在包含在渲染页面中之前正确转义。

      【讨论】:

        【解决方案5】:

        我相信Ruby 的类型很严格,所以Ruby on Rails 是一个不错的选择。

        【讨论】:

        • 你确定 Ruby 是强类型的吗?维基百科似乎不这么认为……
        • 是的,但是 ruby​​ 不是静态类型。强类型意味着编程系统拒绝类型不匹配的表达式/操作。但这可能会在运行时强制执行,例如在 Ruby 中。
        • 啊,是的,当然,感谢您清理它。我会更新问题!
        猜你喜欢
        • 2020-05-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-11
        • 2011-03-13
        • 1970-01-01
        • 1970-01-01
        • 2012-11-04
        相关资源
        最近更新 更多