我没什么可去的


当谷歌宣布他们新的Go编程语言时,我相当兴奋和高兴。耶,另一种解决世界所有问题的语言!别再吸了!烂透了!给我一个不烂的好语言,让我的日常能少烂!

谷歌当然把围棋描绘成“一个C++的修正者”。我只是看着this video罗布·派克描述围棋的目标,我可以肯定地说,谷歌的咒语仍然有效。视频展示了C++的很多恶。尽管有人试图自学,但我个人既不会读也不会写现实世界的C++因为我迷失在他展示的gobbligook中。

但我在YouTube上的评论是:


虽然我试图带着极大的兴奋接受Go,但我不得不得出结论,谷歌自己的消息传递很糟糕,主要是因为完全忽略了行业中一些成功的语言——即C#(以及一些不太常用的优秀语言)——就像微软对C#核心目标的消息传递一样,即使在C#发布时一次也没有提到Java,这有点糟糕(我花了一个小时寻找2000/2001年的C#发布白皮书来备份这段记忆,但我找不到它)。上面链接的视频连一个Java吸吮的例子都没有;它只是令人痛苦地指责Java和C++是一种糟糕的语言。老实说,我已经有十年没有用Java编写代码了,但是那时Java是最棒的,代码漂亮、优雅,或多或少也很容易使用。

与此同时,Java一直在以一些奇怪的方式发展,最终我发现它远不如C#有吸引力。但是谷歌对C#的首肯在哪里?哦,没错,C#不存在,它只是某人想象的一个片段,因为谷歌认为微软(C#的维护者)是竞争对手,咄。这种态度应该会让任何人自动怀疑语言创造者的真实意图,从而怀疑语言本身。C#实际上与Go在试图“修复”C++方面的方式非常相似。事实上,Go描述的大多数C++问题都是C#目标的焦点,还有其他几千个目标。令人惊讶的是,到目前为止,C#已经实现了大部分目标。

如果我们分解谷歌的目标本身,我们就看不到很多肉。相反,我们发现谷歌员工试图使用emacs或vi优化他们以前的C++开发工作的编码工作流(Rob甚至将IDEs列为现代语言中的失败)。他们在围棋中的要求实际上显得相当琐碎。看起来他们想写快速简单的类似于C语法的代码,这种代码不会妨碍他们的业务目标,执行速度非常快,并且快速编译,使他们能够脱离vi,非常快速地调用gcc或任何编译器,然后重新开始编码。这些当然是很好的财富,但我非常肯定这就是它。

相比之下,考虑一下。NET十年前的目标,。NET是应用C#的核心,因为C#运行在CLR上。. NET运行时):

  • 为了提供高度的语言互操作性
    • Visual Basic和C++还有Java,天啊!我们如何让他们以高性能相互交谈?
    • 通讯难以下咽。它并不糟糕,因为它的意图很好——在运行时之间有一个语言网络编组范例——但是在CORBA中发现了相同的目标,这很糟糕。
    • Go连语言互操作性都没有。它有C(也只有C)函数调用器。呸!Google不在现实世界!
  • 提供完全管理代码执行的运行时环境
    • 这本身不是一个特征,而是一种负担。但它实现了很多,即整合低级功能的质量保证资源,这反过来又为微软带来了跨多种语言和工具的即时质量和生产率,因为更少的资源不得不关注重复的细节。
    • Mono运行时现在可以运行很多语言。它比C++慢,但没有显著的水平。完全编译(预编译为机器级代码)的C#应用程序的执行速度大约是C++的90-95%,因此理论上围棋的性能相当不错。
  • 提供一个非常简单的软件部署和版本控制模型
    • 谷歌在其公司和网络沙箱中忽略了一个现实世界的需求,我不确定围棋是否有版本控制模型
  • 通过代码访问安全性和强类型检查提供高级代码安全性
    • 同样,这是现实世界的要求,谷歌在其公司和网络沙箱中忽略了这一点,因为他们的大部分代码只通过HTML/REST/JSON/SOAP向公众公开。
  • 为了提供一致的面向对象编程模型
    • 看来围棋不是OOP语言。围棋没有阶级支持。完全没有对象,真的。只有原语、数组和结构。惊喜!!:D
  • 通过使用行业标准如SOAP和XML来促进应用程序通信。
  • 为了简化网络应用程序开发
    • 我真的没有看到谷歌在这里创新,而是在他们的应用云上推广Python和Java?我绝对不认为这适用于围棋。
  • 为了支持硬件独立性和可移植性
    • 虽然实施这种(准时制)是一种负担,但目标是合理的。老skool Linux的人没有得到这个;必须重新编译应用程序的发行版是愚蠢的,软件应该被预编译。
    • Java和。NET在这里几乎是平等的。Java最早出现的时候,是“写一次,随处运行”的银弹。随着Mono运行时的成功创建和广泛采用。NET也有同样的可移植性。然而,Go需要重新编译。谷歌再次不在现实世界中,他们生活在一个盒子里(他们的总部和他们暴露的网络)。


the goals of C#,

  • C#语言旨在成为一种简单、现代、通用、面向对象的编程语言。
    • go:“OOP就是cruft。”
  • 该语言及其实现应该支持软件工程原则,如强类型检查、数组边界检查、检测使用未初始化变量的尝试以及自动垃圾收集。软件的健壮性、持久性和程序员的生产率很重要。
    • 去:“嗯,查一下,可能吧。尤其是生产力。生产力意味着干净的代码。”
    • (就像我常说的,知道的越多,越意识到自己知道的是多么的少。显然你认为你已经把它都记下来了,小家伙。(
  • 该语言旨在用于开发适合在分布式环境中部署的软件组件。
    • 去:“是的,我们绝对想要。我们是谷歌。”
  • 源代码的可移植性很重要,程序员的可移植性也很重要,尤其是对于那些已经熟悉C和C++的程序员。
    • 去:“忘了C++就好。很糟糕。但是核心语法(花括号)是一样的,所以...检查!”
  • 支持国际化很重要。
  • C#旨在适用于为托管和嵌入式系统编写应用程序,从使用复杂操作系统的大型应用程序到具有专用功能的小型应用程序。
    • 去:“查!”
    • (是啊,只不过Go不是应用平台。完全没有。所以,不。取消选中。(
  • 虽然C#应用程序在内存和处理能力要求方面是经济的,但该语言并不打算在性能和大小上与C或汇编语言直接竞争。


现在,围棋只是看起来像一个语法,有一些基本的输入输出支持类。我必须承认,我对在Go网站上看到的内容有些不感兴趣(http://golang.org/)因为这种语言看起来并没有比Java和C#提供的可读性/可维护性提高多少。

  • Go据说提供了内存管理,但仍然大量使用指针。(顺便说一下,C#也支持指针,但是因为指针不安全,所以您必须声明您的代码为“包含不安全的代码”。大多数C#代码严格使用类型检查引用。(
  • Go消除分号作为语句终止符。“…它们会自动插入到每一行的末尾,看起来就像是一条语句的末尾…”抱歉,分号并没有使C++变得不可读或不可维护
    我个人认为没有标点符号(分号)的代码看起来像没有标点符号(没有句号)的英语语法
    你最后得到的是看起来像连载的句子
    当然,它们不是连载句,它们只是写得很懒、语法很差的句子
    接下来是水,lolcode
  • “{示例教程代码}没有隐式this并且必须使用receiver变量来访问结构的成员。“等等,什么,什么?嘿,我有个主意,让我们把所有的函数都变成静态的!
  • 其实据我所知,Go根本没有阶级支持。它只有原语、数组和结构。
  • Go在赋值时使用:=运算符语法,而不是=运算符。我想这将有助于消除人们键入=他们想键入的地方==并破坏他们的变量的问题。
  • Go有一个很好的“延迟”语句,类似于C#使用(){}并尝试...终于堵住了。它允许你变得懒惰和无组织,以至于应该在即时代码之后调用的延迟执行的代码不需要放在即时代码下面,我们可以随意插入延迟执行的代码。我们真的很需要。(除了,不是。)我认为delay的实际适用性适用于一些真正轻量级的AOP(面向方面编程)场景,只是delay是一种可怕的方法。
  • Go既有new()又有make()。感觉又在学C++了。是关于那些讨厌的指针...

    • 说真的,到底是怎么回事
       
      var p *[]int = new([]int) //分配切片结构;*p ==零;很少有用
      var v []int = make([]int,100) //切片v现在引用100个int的新数组

       
      ..用新语言“改进”C++的一个更好的解决方案是,哦,我不知道..
       
      int[]p = null;//声明一个数组变量;p为空;很少有用
      var v = new int[100];//变量v现在指向一个新的100整数数组

       
      ..?我肯定我遗漏了一些东西,尤其是因为我不明白什么是“切片”,但我怀疑我不应该在乎。哦,不要紧,我现在看到它“是一个三项描述符,包含一个指向数据的指针(在一个数组中)、长度和容量;在这些项目初始化之前,切片为零。”太好了。更多指针gobbligook。C#提供了定义丰富的系统。数组和所有这些东西对程序员来说都是透明的,他们真的不需要知道指针在某个地方,与对数组的引用相关联,这难道不应该吗?真的有必要有完全不同的语义吗(new()vs make())?哦耶。弗里金指针与参考。
  • 我看到围棋有一个fmt。Printf(),fmt。Fprintf(),fmt。Sprintf(),打印()Println()。我开始怀疑Go里是不是少了函数重载。我觉得是;http://golang.org/search?q=overloading
  • Go有“goroutines”。基本上就是,“go func() { /* do stuff */ }”它会作为一个函数动态执行代码,并行的。在C#中,我们称这些匿名委托为委托,委托可以只通过一行代码动态地传递给工作线程池线程,所以是的,它是受支持的。F#(一个年轻。顺便说一句,它对内联匿名委托声明和并行生成它们的支持与Go一样好。
  • 围棋有沟通的渠道。C#在这方面有WCF,坦率地说,这是一个烂摊子。就频道而言,你能到达的最近的地方是Sing#,是C#的变种,有丰富的通道支持。
  • Go不抛出异常。它恐慌可能会从中恢复。


虽然我非常尊重谷歌对计算科学的贡献,以及他们在构建网络可扩展应用程序方面的经验(坦率地说,当他们不与天才的搜索算法联系在一起时,这在设计层面上通常很糟糕),而且我毫不怀疑谷歌是一个有着丰富历史的经验丰富的网络应用软件开发人员,老实说,我认为他们在现实世界的应用程序编程解决方案方面一无所知。从一开始,微软就被全世界妖魔化了,但是有一件事他们和其他一些人都很严肃,严重的应用的真实体验。纵观人类历史,在地球上所有的网站、数据库和桌面应用程序中,微软可能一直负责核心应用程序的开发多数其中,紧随其后的可能是甲骨文。

我并不想让这成为谷歌对微软的辩论,但坦率地说,围棋演示忽视了C#这一事实严重质疑了围棋的可信度。

在我看来,谷歌试图用围棋做的事情的一个更好的方法是使用一种流行的语言,比如C#或Spec#,并将其从语言的实现库中分离出来,即。NET平台的BCL,用更简单的结构、支持代码和轻量级命令行工具来代替它们。老实说,我认为这将是a)比Go更好的语言和运行时,因为它提供了Go的大部分好处,但在某种程度上保留了所选运行时的大部分或全部优势(即CLR和C#相对于C/C++)但也是b)失败,浪费时间,因为C#/Spec#没有真正崩溃。再加上F#,等,我们的需求还是蛮满足的。所以不管怎样,谢谢你,谷歌,但是,真的,你现在应该走了。