你的专属编程语言会是什么样子?

25

你自己的(我假设是完美的)编程语言会是什么样子?给一个小例子并解释你的新颖想法!

我对语法非常感兴趣。


这个问题非常主观,但我真的看不出关闭它的任何有效理由。 - Serafina Brocious
我看到了很多关于主观问题的负面评论,并学会了相应地打标签。在StackOverflow上有一个“隐藏此标签”功能,人们可以使用它来隐藏所有被标记为主观的问题。 - Daniel O
我们中的许多人积极地清理网站上的无效问题,因此阻止标签(特别是“主观性”)会使这更加困难。 话虽如此,您真的应该编辑此帖子并选中社区wiki复选框--这就是它存在的目的。 - Serafina Brocious
坦白地说,如果我们有“Jon Skeet事实”,我认为我们也可以有一个“语言设计思想”的问题。 - Daniel Daranas
语法是语言中比较无聊的部分之一。当然,它很重要,但语义和表现力更有趣。 - Michael Ekstrand
1
语法决定了语言的表现力。 - Daniel O
25个回答

37

有点神秘,但这就是我想要的:

乐高积木!


编程与乐高有很多共同之处(相比于例如钣金加工)。虽然通常是1x1的平块乐高,但相似性还是存在的。 - Scott Wisniewski
1
我本来想给你点赞的,但事实证明我已经点过了。 - Chris Lutz
3
要制作出像样的东西,至少需要1X2的平坦乐高积木。如果不够这个数量,你只能做出小塔。 - RCIX

15

Jon指出“不同的任务适合不同的语言和范式”,这是正确的。然而,有一些考虑因素与领域无关。这些主要涉及语法,但由于代码更多被阅读而非编写,我认为语法很重要。

首先,有一些事情是许多语言做错了的,那就是毫无根据地以C语言作为语法基础。实际上,C语言的语法相当糟糕,我就举两个例子。

第一个例子容易引起争议:分号是不必要的。看看下面的代码,语法完全明确、易于编译器解析,既不需要分号,也不需要显式的换行符。

answer = 42
fraction = answer * 2 /
           (answer + 1)
Console.WriteLine(
    "Some funny number: {0}",
    fraction
)

这实际上与Python非常相似,但更加宽松:定义fraction跨越多行。这是合理的,因为第一行尚未完成。

我对类似C的语法还有一个问题,那就是它们通常会隐式地声明变量。它们只是轻声地说“Foo var”,而不是清晰地宣布“我正在声明一个类型为Foo的变量”。由于在大多数情况下,Foo甚至不是保留字,程序员在这里没有提供任何视觉提示。我更喜欢VB的显式Dim var As Foo,即使这里使用的关键字有点模糊。

(C ++通过引入许多几乎相同且经常模棱两可的语法(从变量初始化到函数声明)使情况变得更加糟糕)。

我编写的语言另一个需要具备的特性是静态类型。虽然动态类型确实有用,但使用它们的情况却很少。即使是大多数“脚本语言”也不需要它们。我认为这经常与隐式类型混淆,后者则更具有一定的用途。再次以Python的例子为例,为什么它不提供静态类型?它已经具有强类型,静态类型检查只会是一种必然选择,并且可以大大减少调试工作。同样适用于显式变量声明。我无法看到暗示性变量声明提供了什么优势。

因此,我们已经有了一种语言的概要:

  • 清晰的语法,避免历史杂乱无章。特别是:
    • 没有分号
    • 没有VB式的显式线路延续
  • 显式变量声明
  • 静态类型

此外,我非常喜欢某些C ++概念,例如通用模板,RAII(即避免收集垃圾而不是收集它),不可变性以及通过迭代器定义值范围的概念。我曾在其他地方说过,我相信迭代器是最基本的创新之一。给它们一个小口红,你甚至都看不出来C++这只丑陋的野兽:

for i in MyVector:
    print(i)

与其

for (typename vector<T>::const_iterator i = MyVector.begin();
     i != MyVector.end();
     ++i)
    cout << *i << endl;

当然,我知道上面的语法被许多编程语言所使用。但它们都只提供了 C++ 强大迭代器概念的简化版本(按照 C++ 的术语来说,大多数编程语言只支持最基本的输入迭代器类型,也就是最不强大的迭代器)。

此时我应该说明一下,所有这些思想的版权都属于我,有专利正在申请中(特别是针对 MayOrMayNotBe 操作符,它实际上并不比较对象引用)。


2
静态类型几乎总是过早优化。你有多少动态类型的经验? - David Thornley
14
这与优化完全无关(尽管这是一个不错的附加功能)。它只是使你更有效率(依我的看法),因为它增强了编译器提供有意义诊断的能力。我的主张是动态类型被认为拥有许多实际上并不存在的优点。 - Konrad Rudolph
值得一提的是,我在动态类型方面拥有丰富的经验。我曾经用Ruby on Rails和PHP进行Web开发,我广泛地使用Python和Perl来完成各种任务,并且我已经使用VB6进行开发多年了。 - Konrad Rudolph
-1 所有这些想法的版权都属于我 谁会在 Stack Overflow 上寻找他们不能使用的想法呢?说真的,如果你的想法受版权保护,为什么要在 CC 许可下发布它们呢? - Nateowami
@Nateowami 嗯,那显然是个玩笑。 "专利申请中" 应该立刻就能看出来了。 - Konrad Rudolph
哦!抱歉!如果我能的话,我会反转它... - Nateowami

10

我没有"完美"编程语言的概念,因为并不是只有一个任务需要执行。

不同的任务适合不同的语言和范式。


所以我们只应该努力创建适合特定任务的定制语言吗?我同意可能需要在低级别语言(如C和汇编)之间进行区分,您可以预测代码的影响和高级语言之间。 - Daniel O
4
我们应该(并且确实如此!)创造适合任务类别的语言。有些任务自然适合函数式语言,有些自然适合脚本语言(以及其中的细分),而其他一些则更适合面向对象编程。如果试图做到完美,你会变成样样精通,却无法成为真正的专家。 - Jon Skeet
但是并没有规定函数式语言不能具有面向对象的方面。看看Scala、Boo(可选鸭子类型)和C#,它们绝对是多面手,似乎对它们来说完美无缺。我甚至可以说,语言演化得越久,它就会拥有更多的特性。 - Daniel O
1
好吧,除非我看到这种神话般的语言在所有其他任务上都比其他语言更好,否则我会保持怀疑态度。 - Jon Skeet
1
@LiraNuna:但这是我的观点:一种试图将所有语言的最好部分结合起来的语言会很糟糕,就像一辆试图既运动又适合五口之家的汽车一样糟糕。 - Jon Skeet
显示剩余5条评论

6

它看起来像C#。我会很喜欢拥有微软!


6
我的完美语言应该可以随着我的需求提升功能。如果我需要编写一个简单的工具程序而不需要类,我可以做到;如果我需要使用类,我也可以做到;如果我想编写完全面向对象的解决方案,我也能够做到。链接器应该足够智能化,让我创建小型快速命令行实用程序(没有运行时依赖项)或我能想象到的最大的臃肿的面向对象图形用户界面应用程序。
问题是我所喜欢的东西有着相反的目标,因此我总是被迫使用完全不同的语言。我目前使用的语言包括 PowerShell、VBScript、PowerBasic、Java 和 C#(有时还有 VB .NET、VB 6、C++、Python 和 Perl 等)。
如果有一种像 C# 一样的语言,允许我在创建这些小型应用程序时使用没有运行时依赖项的全局函数,并在需要时完全利用 .NET Framework 和 Java SDK 的强大功能,那就太好了。

5

完美的编程语言往往只存在于科幻小说中。例如:

  • 奥森·斯科特·卡德(Orson Scott Card)的《安德的游戏》系列 - 要创造就必须进入另一个维度,在脑海中形成一种纯净的想法。当你回来时,它就存在了。
  • 罗伯特·A·海因莱因(Robbert A. Heinlein)在《野兽之数》中探索了世界即神话的概念
  • 大卫·布林(David Brin)的《地球》通过亚声音结合眼部和手指运动进行编程。

所有这些仍然归结为同样的基本难题。任何不强迫人类学习技能的编程语言都会限制思维自由。自然语言也不好,因为它有许多歧义性。

我希望找到一种既能自由发挥又具备强大功能和最小语法的编程语言。最近我开始学习Lisp,目前看来非常不错。


在“Hitchhiker's”终端的概念基础上,加入了一个虚拟现实的元素——您可以将其物理塑造为终端内的数据,并随着您对其进行更改而生效。 - new123456

5

通过亚马逊机械众包实现的大规模并行计算。

job = "Upvote this answer"
@price = "$0.01"
fork(10000, job, @price)

哈哈:Mechturk方法的麻烦在于你必须处理“处理器”给你错误答案的情况,然后沮丧。 :-) - Stephen C

4

我很喜欢C宏,但我认为如果您可以使用相同的语言编写宏或“元代码”会更好。 (C是一个糟糕的例子; 在脚本语言中可能会很好。)

在这些示例中,我使用大括号来标识元代码。您将能够通过“预处理器”运行源代码以展开元代码。否则,它只会在运行时扩展一次。

print "Your product ID is: ", { print '"', generateGUID(), '"' }

或者

lookupTable[] = {
                  /* insert code to generate table here
                   *
                   * This lets you modify the algorithm easily
                   * but speeds up the final program.
                   * 
                   * This would be especially appropriate in
                   * cases where you would otherwise type out
                   * the table as a literal (yuck)
                   */
                }

有时候我们不得不写几行非常重复的代码;我现在想不出一个好的例子,但这种情况下也会非常有帮助。


1
这就是元编程的全部内容。有许多语言具有本地支持(如Lisp系列,Nemerle等),还有一些语言通过hack方式实现(例如我的MetaPy项目)。能够在“编译时”运行代码(无论那是什么)非常有价值。 - Serafina Brocious
这个想法的其他变体包括Lisp(defmacro,syntax-rules),Forth,Prolog(term_expansion),MetaOcaml和Template Haskell。 - Darius Bacon
请记住,即使在像Lisp这样的语言中,这也比看起来更困难;Lisp宏比Lisp函数更难以掌握。 - David Thornley
SO太棒了...哇,你可以学到很多东西... - Artelius

4

这并不会与借鉴 Eiffel 和 C# 的最佳理念有太大的区别(因为,明显地,我没有足够的知识来想出更好的东西——首先我没有学过计算机科学)。

然而,我的主要实际关注点是要 在经典的“源代码文本”方法之外再进一步。我知道这似乎是一个 IDE 的事情,但为什么我不能有一个可配置的代码视图,其中包含了前置条件/主体/后置条件等列,而不是“线性”的形式(i):

  function f
  // f's preconditions
  // f's body
  // f's postconditions
  end

  function g
  // g's preconditions
  // g's body
  // g's postconditions
  end

为什么不 (ii) - 想象一下这是一个带边框的表格

f      f's parameters    f's prec      f's body      f's postc    f's comments
g      g's parameters    g's prec      g's body      g's postc    g's comments

而且,为什么我不能选择如何在样式(i)中“开始”和“结束”函数(大括号,关键字...)?为什么我不能立即显示或隐藏私有或受保护的成员?为什么我不能立即看到带有所有继承函数的“平面版本”?等等。
重点不是拥有一个神圣的代码文件,在其中编辑,然后多个“酷炫视图”,而是能够在(i),(ii)和任何对您最有用的形式中编辑和添加代码。
在某种程度上,谈论“IDE”可能似乎与此话题无关。但另一方面,我认为这将改变我们编写和阅读代码的方式,早晚会发生。这最终将影响语言演变的方式。未来的目标不仅是增强可读性,还包括“可理解性”和互动性。

3

对我来说,Python非常接近理想状态... 我只是希望能够摆脱一些烦人的问题,比如self关键字... 但是如果使用一个好的编辑器,Python可以非常快速地完成惊人的事情...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接