【问题标题】:When is a new language the right tool for the job?什么时候一种新语言是适合这项工作的工具?
【发布时间】:2008-10-11 10:30:20
【问题描述】:

很长一段时间以来,我一直在尝试不同的语言来找到我想要的功能集,但我一直没能找到。我的语言非常适合我的各种项目,但我提出了这些语言的交集,这将使我能够用一种语言完成 99.9% 的项目。我想要以下内容:

  • 基于 .NET 构建或具有 .NET 实现
  • 在编译时和运行时对 .NET 运行时的依赖很少(这很重要,因为主要用例之一是在 .NET 运行时完全自定义的嵌入式开发中)
  • 有一个 100% .NET 代码的编译器,没有非托管依赖项
  • 支持任意表达式嵌套(见下文)
  • 支持自定义运算符定义
  • 支持类型推断
  • 优化尾调用
  • 具有明确的不可变/可变定义(很好——我已经开始喜欢这个,但没有它也可以生活)
  • 支持用于强大元编程的真实宏(绝对必备)

我主要使用的两种语言是 Boo 和 Nemerle,但我也使用过 F#。

对 Nemerle 的主要抱怨:编译器有可怕的错误报告,实现是地狱般的错误(编译器和库),宏只能在函数内或作为属性应用,而且依赖关系相当严重(尽管不是足以破坏交易)。
对 Boo 的主要抱怨:没有任意表达式嵌套(dealbreaker),宏难以编写,没有自定义运算符定义(潜在的 dealbreaker)。
对 F# 的主要抱怨:丑陋的语法、难以理解的元编程、非免费许可证(史诗般的交易破坏者)。

所以我想得越多,就越想开发自己的语言。

优点:

  • 得到我想要的确切语法
  • 获得更快的周转时间;很难量化,但我不会对 1.5 倍的开发人员生产力感到惊讶,尤其是由于测试基础架构可以为某些项目提供支持
  • 我可以轻松地向编译器添加自定义功能,以便与我的运行时完美配合
  • 我得到的东西是按照我想要的方式设计和工作的

缺点:

  • 除非它得到普及,否则我将被维护的负担所困。我知道我至少可以说服 Nemerle 人,因为我认为每个人都想要更专业的东西,但这需要一个村庄。
  • 由于第一个骗局,我对在专业环境中使用它持谨慎态度。也就是说,我已经在使用 Nemerle 并使用我自己的自定义修改编译器,因为他们根本没有很好地维护它。
  • 如果它不受欢迎,寻找开发者将变得更加困难,以至于Paul Graham 甚至可能不会宽恕。

因此,基于所有这些,普遍的共识是什么——这是一个好主意还是一个坏主意?也许更有帮助的是,我是否错过了任何重大的利弊?

编辑:忘记添加嵌套示例——这是 Nemerle 中的一个案例:

def foo = 
    if(bar == 5)
        match(baz) { | "foo" => 1 | _ => 0 }
    else bar;

编辑#2:认为如果存在将转换为这种语言的代码类型的示例,这不会有什么坏处(仅 S. Lott 的回答可能足以吓跑我不要这样做) .该代码大量使用了自定义语法(操作码、:=、quoteblock 等)、表达式嵌套等。您可以在此处查看一个很好的示例:here

【问题讨论】:

    标签: boo nemerle


    【解决方案1】:

    遗憾的是,没有关于失败语言的指标或故事。只是成功的语言。显然,失败多于成功。

    我的依据是什么?两种常见的体验。

    1. 每年一次或两次,我必须忍受一个可以彻底改变一切的产品/语言/工具/框架的推销。在过去 20 年左右的时间里,我的回答一直保持不变。告诉我需要支持的人,我的公司会支持他们。就是这样。再也不会收到他们的消息了。假设我已经听过其中的 25 个。

    2. 每年一次或两次,我必须与一个拥有孤立技术的客户合作。在过去的某个时候,一些聪明的编程构建了一个工具/框架/库/包,在内部用于多个项目。然后那个程序员离开了。没有人能弄清楚那该死的东西,他们希望我们替换/重写它。可悲的是,我们也无法弄清楚,我们的建议是从头开始重写。他们抱怨说,他们的天才在几周内就构建了一组应用程序,我们用 Java/Python/VB/C# 重写它们不能花费我们几个月的时间。假设我已经写了 25 个左右的此类提案。

    这只是我,一位顾问。

    确实,一个特别悲惨的情况是,一家公司的整个 IT 软件组合都是由一个聪明人编写的,他使用私人语言和工具。他没有离开,但他意识到他的语言和工具集已经远远落后于时代——最先进的技术已经在进步,而他没有。

    而这一举动——当然——是在一个意想不到的方向上。他的语言和工具还可以,但世界已经开始采用关系数据库,他绝对没有办法升级他的垃圾以远离平面文件。这是他没有预料到的。的确,这是他无法预料的事情。 【你不会掉进这个陷阱吧?】

    所以,我们谈了。他用 Plain-Old VAX Fortran 重写了很多应用程序(是的,这是很久以前的事了。)并且他重写了它以使用简单的老式关系 SQL 东西(当时是 Ingres。)

    经过一年的编码,他们遇到了性能问题。他们打电话给我,回顾他们在替换自制语言方面所做的所有伟大工作。可悲的是,他们做了最糟糕的关系数据库设计。最坏的可能。他们进行了文件复制、合并、排序等等,并使用 SQL 实现了每个低级文件系统操作,将数据库行左、右和中心复制。

    他深陷对完美语言的私人愿景,无法适应相对普遍、普遍的新技术。

    【讨论】:

    • 虽然我看不到这些事情的发生(主要是由于与现有语言的相似性以及我公司的许多开发人员都将使用它的事实),但我想这就是重点:) 肯定会记住这一点。非常感谢。
    • 这是最好的解释,比我能给出的任何解释都要好。 @Cody:听起来你真的不想要我们的建议。你只想制作一种语言。
    • @Marcin,如果我的评论是这样的话,我很抱歉。我的意思是,我无法看到这么远的地方,与其他人都落入了同样的陷阱,以及为什么关注他的建议如此重要。
    • 好点!第 1 点在金融和共同基金行业享有盛誉。请参阅 en.wikipedia.org/wiki/Survivorship_bias">Survivorship 偏差
    【解决方案2】:

    我说去吧。

    • 无论天气如何,这将是一次很棒的体验。
    • 如果您将其编译为 IL,那么您不必担心无法通过 C# 重用已编译的程序集
    • 如果您认为您对上面列出的语言有正当的投诉,很可能很多人会像您一样思考。当然,每 1000 个感兴趣的人中可能有 1 个愿意帮助您维护它 - 但这始终是风险

    但这里有几点需要注意:

    • 在开发前获取您的语言规范 IN STONE。确保事先弄清楚所有语言功能 - 即使是您将来可能只想要的东西。在我看来,C# 正在慢慢落入“哦,只是多一种语言扩展”的陷阱,这将导致其最终走向灭亡。
    • 确保对其进行优化。我不知道你已经知道了什么;但如果你不知道,那就学吧;) 没有人会想要一种语法优美但运行速度与 IE 的 javascript 实现一样慢的语言。

    祝你好运:D

    【讨论】:

      【解决方案3】:

      当我在 90 年代初开始我的职业生涯时,似乎有一种每个人都在开发自己的内部语言的热潮。我的前 3 份工作是在从事此工作的公司工作。一家公司甚至开发了自己的操作系统!

      根据经验,我认为这是一个坏主意,原因如下:

      1) 除了代码库之外,您还将花时间调试语言本身
      2) 您雇用的任何开发人员都需要经历语言的学习曲线
      3) 很难吸引和留住开发人员,因为使用专有语言工作对某人的职业生涯来说是一条死胡同

      我离开这三个工作的主要原因是因为他们有专有语言,你会注意到没有多少公司走这条路了:)。

      我要提出的另一个论点是,大多数语言都有整个团队,他们的全职工作是开发语言。也许你会是个例外,但如果你能够通过只兼职研究这门语言来达到这种发展水平,我会感到非常惊讶。

      【讨论】:

        【解决方案4】:

        对 Nemerle 的主要投诉: 编译器有可怕的错误报告, 实现是错误的 (编译器和库),宏 只能在函数内部应用 或作为属性,这是相当的 重度依赖(虽然不是 足以破坏交易)。

        我看到你的帖子已经写了两年多了。 我建议你今天尝试 Nemerle 语言。 编译器是稳定的。今天没有阻止程序错误。 VS集成有很多改进,还有SharpDevelop集成。

        如果你给它一个机会,你不会失望的。

        【讨论】:

        • 顺便说一句,还有VS2010支持。
        【解决方案5】:

        永远不要开发自己的语言。

        开发自己的语言是一个愚蠢的陷阱,更糟糕的是,它会限制您的想象力,并且要求您制定出您的开发环境和您正在编写的实际程序。

        如果您是 Larry Wall、AWK 人员或致力于测试编程边界的大量人员中的一员,这种情况几乎不适用。如果你属于这些类别中的任何一个,你不需要我的建议,但我强烈怀疑你的目标是一个没有合适的编程语言来完成任务以及执行任务的人的特征的利基市场。

        【讨论】:

        • 好吧,这种语言(如果发生的话)将诞生于高性能仿真/编译/代码转换(所有这些都紧密联系在一起)空间。 Nemerle 目前被用于其中的大部分,但限制已经显示和修补了一段时间。 [...]
        • 也就是说,感谢您的意见。这绝对不是一件容易的事,这就是为什么我想要尽可能多的意见:) 谢谢。
        【解决方案6】:

        如果你和你看起来一样聪明(很有可能),我的建议是先进行语言设计,重复几次,问问你信任的聪明人 smart与编程语言相关的社区,了解您提出的具体设计,然后做出决定。

        您可能会在创建设计的过程中意识到,例如,只需快速破解 Nemerle 即可满足您的所有需求。很多事情都是在认真思考一个问题时发生的,而最终的解决方案可能并不是您在开始项目时真正想到的。

        在最坏的情况下,您被困在实际实施设计中,但到那时您将对其进行校对并使其成熟,并且您将高度肯定地知道这是一条好路。

        一条相关的建议,从小处着手,只需定义您绝对需要的功能,然后在它们的基础上构建以获得其余部分。

        【讨论】:

        • 我一直在考虑这条路线(也就是修改 Nemerle),尤其是因为 Nemerle 的实现太不维护了。采用 Nemerle 并做出更好的实现甚至可能是值得的,因为这是我 99% 的问题。感谢您的意见。
        • 当你在做的时候,你可以添加一些缺失的东西,然后每个人都过上了幸福的生活。
        【解决方案7】:

        编写自己的语言不是一件容易的事。尤其是在任何类型的“专业环境”中使用的语言

        这是一个巨大的工作量,我怀疑你是否可以编写自己的语言,并且仍然编写任何使用它的大型项目 - 你将花费很长时间来添加你需要的功能,修复错误和一般语言设计的东西。

        我会强烈建议选择一种最接近您想要的语言,并将其扩展为您需要的语言。它永远不会完全是你想要的,但与你编写自己的语言所花费的时间相比,我会说这是一个小小的妥协..

        【讨论】:

        • 我其实并不担心核心语言的实现时间(我一直在做重新编译器工作,可以重用大量代码)——我真的只担心持续维护(有总是错误)和寻找开发人员的困难。不过,感谢您的意见:)
        【解决方案8】:

        Scala 有一个 .NET 编译器。虽然我不知道这个状态。它是 Scala 世界中的二等公民(更专注于 JVM)。但采用 .NET 编译器而不是从头开始创建新语言可能是一个不错的折衷方案。

        Scala 在元编程部门 ATM 中有点弱。其他语言特性可能会在一定程度上减少对元编程的需求。无论如何,如果您要为其实现元编程功能,我认为没有人会感到难过。还有一个编译器插件基础设施正在开发中。

        【讨论】:

          【解决方案9】:

          我认为大多数语言永远无法满足所有要求。

          您可能希望将您最喜欢的 2 种语言(在我的例子中是 C# 和 Scheme)结合起来并一起使用。

          从专业的角度来看,这可能不是一个好主意。

          【讨论】:

            【解决方案10】:

            听到一些你觉得用现有语言做不到的事情会很有趣。您正在从事哪些 C# 无法完成的项目?

            我只是好奇!

            【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2010-09-16
            • 1970-01-01
            • 2022-06-17
            • 2011-03-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多