14

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

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

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

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

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

优点:

  • 获取我想要的确切语法
  • 获得更快的周转时间;很难量化,但看到 1.5 倍的开发人员生产力我不会感到惊讶,特别是由于测试基础设施可以为某些项目启用
  • 我可以轻松地向编译器添加自定义功能,以便与我的运行时完美配合
  • 我得到了完全按照我想要的方式设计和工作的东西——尽管这听起来像 NIH,但这会让我的生活更轻松

缺点:

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

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

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

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

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

4

10 回答 10

15

可悲的是,没有关于失败语言的指标或故事。只是成功的语言。显然,失败的次数多于成功的次数。

我有什么依据?两个共同的经历。

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

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

那只是我,一位顾问。

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

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

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

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

他深陷于自己对完美语言的私人愿景中,无法适应一种相对普遍、无处不在的新技术。

于 2008-10-11T10:52:32.847 回答
5

我说去吧。

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

但这里有几点需要注意:

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

祝你好运:D

于 2008-10-11T11:16:00.943 回答
5

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

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

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

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

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

于 2008-10-11T14:27:15.753 回答
5

对 Nemerle 的主要抱怨:编译器有可怕的错误报告,实现是地狱般的错误(编译器和库),宏只能在函数内部或作为属性应用,并且依赖关系相当严重(尽管还不够破坏者)。

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

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

于 2011-02-08T10:15:13.370 回答
4

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

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

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

于 2008-10-11T10:54:54.963 回答
4

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

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

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

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

于 2008-10-11T11:14:50.430 回答
2

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

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

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

于 2008-10-11T10:48:34.790 回答
2

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

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

于 2008-10-11T13:04:31.847 回答
1

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

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

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

于 2008-10-11T14:35:18.577 回答
0

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

我只是古玩!

于 2008-10-11T11:00:12.003 回答