最近有一个Perl讨厌栈溢出的集群,所以我想我会把我的"你讨厌你最喜欢的语言的五件事"问题带到栈溢出中。带上你最喜欢的语言,告诉我五件你讨厌的事情。这些事情可能只是让你恼火,承认设计缺陷,公认的性能问题,或任何其他类别。你只需要恨它,它必须是你最喜欢的语言。
不要把它与另一种语言进行比较,也不要谈论你已经讨厌的语言。不要用你最喜欢的语言谈论你喜欢的事情。我只想听到你讨厌但能容忍的事情,这样你就可以使用所有其他的东西,我想听到你希望别人使用的语言。
每当有人试图把他们最喜欢的语言强加给我时,我就会问这个问题,有时也会作为一个面试问题。如果有人找不到五件事来恨他最喜欢的工具,那么他对它的了解就不足以鼓吹它或者用它赚大钱。他没有在足够不同的情况下使用它来充分探索它。他主张把它作为一种文化或宗教,这意味着如果我不选择他最喜欢的技术,我就错了。
我不太在乎你用哪种语言。不想使用特定的语言?那就不要了。你通过尽职调查做出一个明智的选择,但仍然不使用它?好的。有时候正确的答案是"你有一个强大的编程团队,有良好的实践经验,在酒吧有很多经验。换成foo是愚蠢的。"
这对于代码审查也是一个很好的问题。真正了解代码库的人会对代码库有各种各样的建议,而不太了解代码库的人则会有非特定的抱怨。我问"如果你可以重新开始这个项目,你会做什么不同的事情?"在这片幻想的土地上,用户和程序员会抱怨他们不喜欢的任何事情。"我想要一个更好的界面,"我想从视图中分离模型","我将使用这个模块而不是另一个","我将重命名这组方法",或者他们对当前情况真正不喜欢的任何东西。这就是我如何处理特定开发人员对代码库的了解。这也是一个关于程序员的自我和他告诉我的事情有多紧密联系的线索。
仇恨不是了解人们了解多少的唯一维度,但我发现它是一个很好的维度。他们讨厌的事情也给了我一个线索,告诉我他们对这个主题的思考有多好。
这是一个关于"你最喜欢的语言"的老问题的很好的解释。很好的理由。
我发现有趣的是,尽管有这么多的.NET读者,但在撰写本文时,有24个答案,其中只有一个(我的)是关于.NET或.NET语言的。我不知道这是关于so或.net的什么,但它很有趣…
最初的15年用C/C++编程,我讨厌(按字母顺序):1。指针2。指针3。指针4。指针5。指针
我想知道有多少人因为不懂如何用自己选择的语言编程而对讨厌自己选择的语言做出了评论……
许多人发表评论说他们不知道自己最喜欢的语言。这是关于这个问题的一个美妙之处:它可以快速地显示出你有多少思考和学习,而不必问具体的问题。
这是一个很好的问题。如果你想知道某些语言是什么样的,那么在这一页上阅读3个不同的回复就很容易成为你所能找到的最有用的信息。如果你已经掌握了语言,这也是衡量程序员经验(和谦逊)水平的一个很好的方法。
@安德鲁:关于lolcode,我不喜欢的是你的评论没有在里面编译。作者缺乏远见…
好吧,这个问题肯定会引起回应,如果不是真正的答案。五件事…为什么是五?不管怎样,我同意在一个人最喜欢的语言中找不到缺陷确实会显示出他对这个工具缺乏知识。当我第一次读标题的时候,我想:"对,我可能不喜欢德尔福的东西,但为什么要恨?"但是在我读到上面提到的观点之后,我看到了它的有效性:我对德尔菲的知识确实是不完整的,相当不完整。然而,当我开始讨厌我最喜欢的语言时,我想知道我会允许自己把它称为我最喜欢的语言多久…
哇,我很惊讶SQL还没有在这里弥补。我猜那意味着没人喜欢它:)
跨实现的语法不一致
细微的代码差异可能由于看似模糊的原因而导致大量的性能后果。
不支持文本操作
容易的入门成本,但在掌握语言方面有陡峭的学习曲线。
在整个社区中实现最低限度的标准化以获得最佳实践,这包括语法样式。
…还有一些讨厌它的额外理由,不用额外收费
WHERE子句位于最后一个,使提前执行更新或删除变得容易,从而破坏整个表。相反,应该去前面的某个地方。
关系划分很难实现。
我可以将一个值设置为空,但不能用空来测试它是否相等。我可以检查是否为空,但这会使代码复杂化——在我看来,这是不必要的。
为什么我们需要完全重新指定分组列的公式,而不是在列上设置别名,然后按别名分组(或按列索引进行排序)?
也许没人能学会爱它,直到他们不再把它当作一种语言。:)
+1代表一切。但是人们想知道为什么我会忍受ORM的头痛…
据记载,我的生活就是写SQL:)
显然,我们需要一个开放的标准SQL解析器,DB供应商可以插入它,只负责后端数据检索…
@艾伦……这不是我的意思吗?:)
@我以为它代表豆科植物。
我不明白为什么insert的语法与update的语法如此不同。合并是不可理解的。
不支持文本操作?
@Dalin与C或Ruby相比,SQL的文本操作非常糟糕,尤其是在考虑到regex文本替换时。
SQL并不是语言设计的一个闪光的例子,但是通过查询优化和机械组件到数据库的操作,许多约束被强加到了体系结构上。尽管如此,数据库开发或多或少是独一无二的,因为SQL是一种声明性语言,控制机械组件(磁盘头移动和旋转延迟)的操作。不受摩尔定律的约束。stackoverflow.com/questions/339744/…
我非常喜欢SQL,但我讨厌它缺少regex或任何其他高级字符串操作选项。
我对字符串操作和SQL的一般感觉是"如果可以的话,做一些其他的事情,几乎任何事情都可以做"。如果没有任何查询需要它…
喜欢检查空值和不能按别名分组!说真的。编译器无法在内部转换"[!]=null"into[not]is null"??
我不能写SELECT col1, col2, col3, col4, col5, from 。
@所有"SQL不适合字符串操作"的注释:在我公司的一些遗留代码中,有一种脚本语言完全用T-SQL(SQL Server 2000)实现,我曾经不得不修改它。那是…有趣。
如果您认为空值是第三个可能的结果,那么它的必要性应该是明确的,就在真和假之后。因为它的意思是"未知",所以你不能分辨出未知的事物是否与另一个未知的事物相匹配。另一个例子:如果null等于null,这意味着不可能进行连接的整个概念,因为任何null值都可以与另一个null值匹配。如果您理解这一点(也称为三元逻辑),那么您可能会理解引入针对空值测试的"is"运算符的原因。
VASH是正确的。另一个(更容易消化?)表述方法:如果你把空值设为空,那么你就不能消除语言中的奇怪,你只需要把它推到其他更不方便的地方。
+1.缺少WHERE条款造成的破坏。感谢$DEITY回滚;
我不确定它是语言、实现还是用户,但它总是被低估了。在某些实现中,至少有一些地方会删除注释。我在看你的视图,一些小丑总是打开它在设计模式迟早。
我讨厌Java的五件事:
没有一流的功能。
没有类型推断。
在EG图形中缺少健全的默认值。
NullPointerException不包含有关空值的详细信息。
无意义的"可配置"框架/服务提供者接口/工厂类/依赖注入系统的激增。可配置性几乎从未被使用过,dry被严重破坏,代码的大小是4倍,可读性是2倍。
我知道,我应该去斯卡拉看看。
你有没有想让Java的NPE包含关于NULL的信息?
@格雷格,我希望我有某种想法,但我没有。诚然,这不是一个小问题,因为可能为空的东西可能不会分配给任何变量。
@两者:NPE显示在堆栈事务的第一行。它包含(大多数时间)类、Java文件名和行号,例如:"在您的.Falue.Code .Currar。实例(Inest.java:1234)",然后打开该文件,转到该行,它是一个没有分配给它的变量。
@奥斯卡·雷耶斯-呃,我们知道。但这行中可能有多个变量,异常消息不会告诉我哪一个是空的。
我读这本书的时候正要说斯卡拉。作为课程的一部分,我们正在学习。令人惊奇的东西。
斯卡拉也有疣。但是,它比Java好得多。
@是的,但是当你知道这一行的时候,一个简单的调试就可以告诉你被证明是错误的变量。
@是的,如果你能复制这个问题,而且它在你自己的机器上,所以你可以附加一个调试器,而且它不在一个循环中,循环大约10000次…
+1.框架等的扩散。
@瓦伦丁,想象一下,NullPointerException在一个晚上运行的巨大日志文件中的乐趣,你需要弄清楚发生了什么……调试不是一个选项。
如果使用Eclipse(或任何类似的方法),可以在行中设置断点,然后将断点属性设置为仅在变量为false时停止,否则将继续。换句话说,条件中断。
你总是用一种邪恶来交换另一种邪恶
类型推断…无聊的。
@Grayger,编写代码,使每行的源代码中只有一个候选项,即每行中只有一个数组索引-[..]-或一个句点-foo.bar()。那么,毫无疑问是哪一个导致了NPE。
@Thorbj&248;rn-ravn-andersen,所以我的方法(有5个参数)调用应该在5行上?P
@当然不是所有的参数都已经计算并放入局部变量。
@Thorbj&248;rn-Ravn-Andersen,我强烈反对:添加额外的变量只是为了保存一个曾经使用过的值,这会给读者增加很多精神负担,使代码更加冗长。(显然,作为调试技术,可以将代码转换为临时执行此操作。)
@Zarkonnen,"代码临时转换作为一种调试技术"在您需要在生产中发现无法复制的问题时没有多大帮助,并且不允许您更改代码。你可以不同意,等你凌晨3点打电话回来…
@托尔比安徒生:"不允许更改代码"?我会逃跑。迅速地。
@配置器,我们在这里讨论生产代码,这个问题发生在生产中。我不知道你的情况,但我们在生产过程中不允许更改经过验收测试等的代码。
@索比&248;RN Ravn Andersen:好吧,这有点道理:)我认为如果你只做了一个更改,你应该被允许更改生产代码来添加日志,但我不确定在大多数地方如何接受。
@配置程序,在真正的紧急情况下,任何事情都会发生,但问题首先是为什么日志语句不在代码中,以及为什么您需要插入它们来查明源代码行上的哪个候选语句是罪魁祸首。换句话说,我开始提到的防御代码。
有些JAVA讨厌…:)
JavaScript的:
所有的事情insanely式最酷的是复杂的,然后所有的凉爽,是包在这样一个小的量的代码,你可以遵循它,愚蠢的奋斗
"+"是一个荒谬的选择算子A的concatenation弱型语言。他们试图吓唬人非禽兽?
它是一块雷区的跨浏览器兼容(不介意它甚至山或不)
它通常与不信任(如scummery阻塞后面的按钮,弹出窗口永远不会的。
它几乎是不可能的,因为只有一个调试有几个不同的错误信息和一个不同的类型(数字、字符串、对象等)
如果它不是为jQuery可能安静,我恨它多用于AS I:)
我想知道在禁用后退按钮上总共花费了多少程序员时间。必须是数百万,如果不是数十亿。
javascript确实是最模糊的语言…除了那些其他的。
为了美观,我们似乎需要再次进行自然语言编程!
我同意莫什的观点。它本身就是一种美丽而有力的语言。是那些讨厌的浏览器把它的名字弄混了。
…在这里我认为美是主观的:)
@莫什:在绝大多数情况下,javascript在哪里?你的意思是"汽车不会导致全球变暖,它是驾驶汽车来实现的"——当然,这是真的,但是忽略了一点——你对汽车还能做什么?
我想为3辩护。在某些情况下,(对我来说)数字和字符串共享一个相似的运算符是完全有意义的,它对每个运算符都有不同的作用。例如,python的"2*2"表示4,而"yes"*2"表示"yes"。相同的运算符,不同的含义。我觉得这很有道理。
@克里斯:是的,在强类型语言(如python)中,"+"是一个很好的连接操作符。在弱类型语言(如JavaScript或C)中,它是可怕的;它决定(安静地!)"sum:'+2+3"不是"sum:5",而是"sum:23"。有更多javascript经验的人可以给出更好的例子。
我同意3。
所以你的问题不是使用+来添加和连接,而是语言用来决定要做哪一个的荒谬的上下文规则?
未声明的标识符是全局变量。艾克!
@什里瓦察:C是弱类型?
Fugly?真的?
@什里瓦察:C是什么时候开始的弱类型语言?面向对象
Javascript的优点在于它能让我继续工作
jquery很简单。jquery代码看起来像是某个喜欢吃很多括号的人生病了。
是的,与python相比,c是弱类型的(例如,您可以将整数赋给char s,通过void*指针将任何内容强制转换为任何内容等)。它是静态类型而不是动态类型,还需要显式类型而不是类型推断,但这些与强V/S弱类型无关。[随机示例:Python具有隐式动态强类型,Haskell具有(可选地显式)静态强类型,Java具有明确的(主要是静态的)强类型,C具有显式静态(相对较弱)类型。
我从不希望"max"作为值返回。
@Shrevatsar:C是强静态类型。也许你需要一本初学者的教科书。
@维耶特:你能说出你对强类型的定义吗?(正如我已经说过的,"强类型"并没有很好的定义。见c2.com/cgi/wiki?强类型化——在大多数定义中,C的强类型比python或ocaml弱。)我对强类型化的定义(我已经从上下文中清楚说明)是强制类型化不会被静默执行。无论如何,这是与JavaScript和这个问题相关的意义。
如果所有浏览器从一开始就都有字节码解释器,那么Web应用程序现在会更高级吗?
@史里瓦察的经典例子是:以东x1(2),以东x1(3)。
javascript没有"适当的"关联数组:不能将任意对象用作键。我觉得这个想法令人难以置信。
如果很快你就错了。
好吧,至于7,如果你收到一条错误消息,你就很幸运了。在我见过的大多数JS环境中,唯一的"错误消息"是导致脚本安静地终止。D:
我将为需要的闭包的破坏范围规则添加一个要点,比如:var that=this;
没有特别的JS,但我讨厌DOM
我强烈反对Mauricio Scheffer:DOM和依赖浏览器的API确实非常糟糕,但是语言本身也非常糟糕。在我找到jquery之前,我一直拒绝触摸它。
javascript是一种政治语言。这就是为什么typeoff(空)是对象。有人在LiveScript上犯了个错误。JScript复制了错误。现在这个错误是一个很好的标准。
@戈登·塔克:你想把它还回去吗?
@戈登·塔克:哦,这是有道理的。我在想你是说它会回来,而不是说它会回来。
JavaScript有一种倾向,被不知道足够的JavaScript的人误认为是Java或C的丑陋版本。当你真正了解它的时候,它是一种非常漂亮的语言。
大多数人都不同意:在语言方面,浏览器之间几乎没有不兼容的地方,而DOM是问题所在。如果你知道你在做什么,javascript会非常时髦。如果不这样做,您将在HTML中分散许多过程代码,而不是在JS文件中编写好的OO代码(它所属的位置)。如果javascript和actionscript一样,在类中添加了可选的类型检查,我会称之为两个领域中最好的一个。
PHP:
1)强迫我做不必要的变量:
1 2
$parts = explode('|', $string);
$first = $parts[0];
2)lambdas的一个实现非常蹩脚,它大致相当于使用eval() ,而且非常错误,我从未使用过它(参见http://www.php.net/create_函数)。
3)只能捕获可能发生的大约80%错误的Try/Catch系统。
4)regex支持和lambda支持一样差劲,因为它必须写在常规字符串中,这使得学习编程工具的难度是学习编程工具的三倍。而PHP应该是一种"简单"的语言???????
5)如果不写两次或构建自己的函数,或使用"@"运算符,就无法安全地从$u post中提取内容:
1
$x = isset($_POST['foo']['bar']) ? $_POST['foo']['bar'] : null;
6)奖励答案:"@"。如果您无法正确地编写代码,只需添加"@",对于以后必须调试代码的任何人来说都太糟糕了。
那么list($first)=explode("",$string);呢?
或$first=explode('',$string);$first=$first[0];
理想情况下,我想使用一些_函数(explode('',$string)[0]);
1的最佳解决方案是使用Strtok。只有当你得到第一个元素时,这才有效——否则列表是我能想到的唯一其他方法(除了使用一些可怕的regex…)。我也希望在函数末尾添加[0]。它非常简洁直观。
BTW为5。你不能检查函数中的isset,php会对你发送一个未定义的变量到函数中大喊大叫。
它奇怪的变量范围呢?
什么奇怪的变量范围?将所有内容都设置为本地并强制您在要使用全局时声明是一个好主意,它可以防止noobs生成只使用全局的函数,而不是像它们应该那样使用参数和返回值。
您忘记了参数顺序随机变化的函数
看这个很有趣,因为几乎所有这些gripe都是在较新版本的PHP中解决的。主要是实lambda和三元快捷运算符。此外,通过设置一个简单的错误处理程序,您可以将所有PHP错误(通知、警告等)转换为异常,这样它们就可以被try/catch块捕获。
5.3已固定2,仅此而已。自定义错误处理程序仍然无法捕获致命错误,因此Try/Catch仍然无法捕获所有错误。
@PHP太多,请考虑编译器错误的致命错误。在像Java和C语言这样的语言中,如果你留下分号或语法错误,不让它编译,你会得到一个编译器错误,就像PHP中的致命错误一样。
@单击upvote:但是致命错误与编译错误不同-如果您使用null 而不是对象,而不是尝试调用方法会导致致命错误。你能想象如果Null PoExtExchange会突然中断你的程序而无法捕捉到异常的话,尝试构建一个可靠的Java程序吗?
如何使语言变得更难?你为什么认为它是最难学的?这根本不是真的。
我最喜欢的部分是我想爆炸,当我听最后一个so播客时,必须先把它扔到一个单独的变量中。
@弗朗茨:我想他是说雷格克斯是一种强硬的语言——我同意。对于regex来说,在不添加字符串转义的情况下跟踪转义已经足够困难了。
@1:stackoverflow.com/questions/1965017/…
$parts=当前(explode('',$string));
对于5:滤波器输入。
php 5.3.0+具有类似lambda的函数:php.net/manual/en/functions.anonymous.php
PHP不是一种语言,它是一种黑客。
你忘记了动词名词、动词名词、名词动词、名词动词、动词、动词、名词、名词动词等
要解决第一个问题:函数elem($array,$key)返回$array[$key];…elem(explode('',$string),0);
@奥利:当你在编写需要在任何地方运行的库代码时,用短名称定义函数是危险的(因为它可能会与其他地方的某个函数发生冲突),而一个较长的函数名就不再方便了。此外,函数调用也很昂贵,特别是当您需要处理多个$key时。
对于1:为什么不$first=reset(explode('',$string));不过,我同意其余的……而且,对于1来说,在那里使用重置是一种黑客行为…叹息
命名空间…名字支付什么?
@太多的php:即使在php 5.3 lambda中,设计也很糟糕,您必须指定要捕获的变量,甚至不能捕获$this和self…
#1应该是substr($string, 0, strchr($string, '|')) 。
C++
太容易随机破坏内存,并且几乎不可能找到错误(尽管,Valgrind在解决这个问题上走了很长的路)。
模板错误消息。
当使用模板时,很容易最终不得不将所有内容都包含在一个文件中,然后得到愚蠢的编译时间。
标准库在现代是个笑话(默认情况下仍然没有线程或网络?)
大量令人讨厌的小部分C(尤其是短/int/无符号/等之间的所有转换)
我同意STL,但我要说的是,有什么是相当好的。
为胜利而战。-)
IOMANIP如果它是一只小狗,它应该一直和我保持100米的距离。
Unicode。我确实尊重ASCII的简单性,但看在上帝的份上,我们已经进入了21世纪。
如果标准委员会是像我们这样的技术极客,那么1998年兰伯斯就应该在这里。当然,在2003年,如果他们有一点愿望站在最前面的话。但不,他们有费马的数学技能和年龄。
哎呀。我希望我对C++的爱不会那么强烈。:)
常数正确性-这么多的努力只为这么少的收益。
最让我困扰的是C++缺少标准的POSIX C++ API,虽然这不是语言的错误。
@Kieveli常量正确性实际上是我在用其他语言编程时最怀念的事情之一。尤其是动态类型的。RAII是一个我经常错过的大功能。
+模板错误消息为1。哎呀。
…隐式转换实际上是相互关联的。
大多数C++问题来自ISO标准,锁定了10年。
我完全不同意4-这在操作系统上的处理方式完全不同,任何试图将其固定到标准的操作都将是一团糟。
我想你可以把boost和qt算作标准库。
+1"模板错误消息"。
+1个模板错误消息。正在将线程添加到0x(每当get位于此处时=/)
我肯定认为const正确性通常比它的实际价值值更大的实现时间和"噢,我忘了标记方法const,现在我的构建将无法编译"。
+模板错误消息1000
@ TStnn:我认为当它不能用C++编译器编译时,你可以调用QT标准。(除非你先通过其他东西传递代码…)(
@deadmg-或者我的var是const,但是在库的深处,有人做了一个迭代器而不是const,所以我不能将const值传递给它。
模板错误消息,哦,我多么鄙视你
C:#。
类的默认应密封
有没有lock 语句应为特异性,你要锁定的对象,方法,如有应Acquire 这回报一次性锁定令牌。corollary:有不应该是一个对象的监视器。
GetHashCode() 和Equals() 不在时一切都很System.Object 特瑞科散列。相反,有一个IdentityComparer 这是同样的事情,和保持IComparer ,IComparable IEqualityComparer IEquatable 定制接口,和比较。
支持immutability普尔
可怜的方式扩展方法应该发现更多的不只是有意识的决策(事实上我使用的命名空间。
那些是我的头离顶问我明天和我来了一个不同的5:)
默认密封?为什么?
Java将HASCODE()和等值()方法作为对象上的方法,我发现这是一个非常合理的设计。由于每个对象都能够将自己与其他对象进行比较并生成自己的哈希代码,因此在语义上讲是有意义的,所以我不理解为什么您会反对这种做法。
我真的不同意默认密封类。不过,我想这是你的单子。
@埃里克:对于大多数类来说,派生是没有意义的,而且大多数类实际上支持得很差。默认情况下,每个虚拟类都应该是抽象的,并且每个其他类都应该是密封的,这意味着您只能将叶类作为动态类型,而不能在继承层次结构中使用节点类。
默认情况下是密封的:继承应该设计成一个类(这需要时间并限制将来的选项)或者被禁止。Hash码/均等:它也吸引Java。总有一天我会写一篇关于它的博文。阅读有效Java,详细说明为什么继承链中的等式是很难的。
默认情况下,密封意味着您已经考虑到了可能有人想要从您的类继承的所有可能的原因,并且您认为其中任何一个都没有意义。对不起,我们都不聪明。
在这种情况下,我不够聪明,您无法从我的代码中派生出:因为我无法预测将来我可能做出哪些可能会破坏您的代码的更改。这是一个非常重要的问题,IMO。密封代码更具限制性,但会带来更多的实现自由度和健壮性。
我同意除3之外的所有观点:对于equals()在继承链下被破坏这一事实,IEquatable如何帮助解决?
@buu:通常只有在一种平等感是合理的时候才使用iequatable,这通常会排除未密封的类型。对于其他情况,您将使用IEqualityComparer,这是有效的上下文敏感:"我将在中比较平等,因为这是我关心的。"
好点。谢谢你的澄清,乔恩。
嗨,乔恩,你能详细解释一下为什么要禁止继承吗?如果将继承设计成一个类,这是否意味着该类将非常庞大并表示多个实体?我可以看到在类中有很多switch语句。
Rwendi:为继承设计并不意味着它必须是大量的或者已经知道子类将要做什么。它只需要知道哪些遗赠者可能是专门的,并适当地处理它们。(接下一条评论)
我有一篇关于"遗产税"的博客文章:msmvps.com/blog s/jon-skeet/archive/2006/03/04/…它现在已经相当旧了-我可能需要重写一段时间。Josh Bloch(毫不奇怪)在有效的Java中做得更好。见第二版第17项。
我不敢相信没有人提到"goto-case"语法,我讨厌这个!
很高兴你不是安德斯!对我来说,"默认密封"这件事只是一座过桥。这听起来像是来自一些难以理解的Java社区进程社区的宣传,其中有一些毫无意义的JSR被分配给它。
我会"杀死"任何一个在.NET中默认密封所有类的人,即使它试图隐藏在月球的另一边。实际上我有一个更好的"主意",禁止使用密封的关键字…
@波普:我想那时我们必须同意不同意。我强烈要求你阅读Josh Bloch的"有效Java"的主题。
@鲍比:我不明白这跟JCP有什么关系。这仅仅是因为我提到了有效的Java吗?当你有足够的智慧和乔希·布洛克的相匹配时,请告诉我…
@波普:我认为死亡威胁是对一个和系安全带一样合理的建议的极端反应。
@缪斯吉尼斯:这是一个比喻,它表明了我在这方面的极端立场,我强烈反对它。我知道走极端是不好的,但在这种情况下,我正以极端的态度与极端的解决方案作斗争:p
@Musigenesis:猜猜不是每个人都知道经典的vb 6笑话:"像下一个维护代码的人一样的代码是一个知道你住在哪里的神经病杀手",或者每个人都在挖掘这种笑话……
@缪斯根尼斯:我认为我们必须对"极端"有不同的看法。我是说,我认为违约应该被封存。我不是要禁止继承-您仍然可以显式地取消类的密封。通过直截了当,你就会表明你已经考虑过后果。
我将继续讨论并同意乔恩·斯基特关于默认情况下保持类密封的主题。如果你想让某个东西可以继承,那就让它继承吧。不过,不要假定每个类都应该是可继承的。
@乔恩:在"极端"一词中,我指的是波普的说法,他会"杀死"默认情况下封课的任何人(我知道他不是真的那个意思)。我100%同意默认的密封等级——这就像系安全带一样有意义。:)
@缪斯根尼斯:对不起,我的评论应该是给波普的,他声称我的想法是一个"极端的解决方案"。
没有朋友阶级的支持。
+10表示"每个对象都不应该有监视器(甚至不应该有一个索引到延迟创建的监视器表中,我认为这是目前的情况)。
好名单。我同意每一点,尤其是"默认密封"和对比较/哈希代码没有隐式支持。在基对象中应该尽可能少地有内置的东西,并且应该明确地指定类支持它的所有其他东西。
+默认情况下,密封等级为1。我坚信(并且Jon已经在上面提到过)设计一个适当支持继承的类比设计一个密封的、不变的类要困难一个数量级。因此,"允许继承"应该是一个有意识的决定。
+默认为1封。计划继承:类的契约必须描述派生类必须、可以和不能做什么。
+1表示不可变支持差。我总是喜欢不可变的数据结构。
你真的不讨厌数组协方差!?
@我不喜欢它,但它是一些有用的前仿制药。这对我来说不是什么大"恨"。
我在密封类方面遇到的最大问题是很难在fitness或单元测试中模拟它们。想到的最大的例子是httpContext——它不能被扩展,只能实现ISeviceProvidor。如果我想模拟对接受httpContext的函数的调用,那么最好在扩展/重写httpContext的mockhttpContext中传递。相反,您必须创建一个httpContext实例并填充它,并且没有办法监视调用了什么函数。即使是模仿犀牛也不能应付封闭的课堂。
@马特:对我来说,这意味着httpContext应该实现一个合适的接口,而不是应该解封。重写类的任意方法而不理解这些方法中的一个是否通常会在内部调用另一个方法,这只是将一个问题替换为另一个问题,IMO。
我认为只要有一个关键词允许你覆盖封条,我就可以默认使用封条:如果我们愿意,请允许我们使用剪刀运行!我认为一个更好的解决方案(实际上可以在C/.NET的未来版本中实现)应该是一个DesignedForInheritanceAttribute,以及当类从中派生时编译器发出的警告。
显然,您可以覆盖基类级别的密封,但不能覆盖派生级别的密封。如果我设计了一个不从中派生的类,我不希望它被违反。
这是我的2c默认的类密封。应该这样做。即使在框架本身,这也会引起麻烦。例如,有一次,我想扩展List 的一些默认行为(具体来说,我想添加事件以添加、删除等)。所以我走了,从List 中得到了一些有用的东西,但实际上我不能从那里做任何事情……
哇,我很久没看这个话题了:)。我确实理解你关于"默认密封"的观点。继承经常被过度使用和错误使用。然而,在实践中,我怀疑默认情况下的封闭会使我们的生活变得更好。在我自己的代码中,我不在乎,因为我可以根据自己的需要修改它(我不开发公共图书馆)。不幸的是,设计精美的第三方API是例外,而不是规则。那么,这是什么意思?这可能意味着我正在使用的API中几乎所有darn类都是密封的。我宁愿继承
如果需要的话,这些不足的类会被完全屏蔽掉。由于这个理论上的API一开始设计得很糟糕,所以我强烈怀疑它们在接口上是否提供了足够的灵活性来满足我的需要,所以现在我被搞砸了。在理论上,我认为你可能是对的,在实践中,充其量,我怀疑这样做会有帮助。
互斥类呢?我认为它解决了第二个问题。
@Terr0q:是的,但是代价是成为一个完整的win32内核对象而不是一个轻量级的.NET锁。
(它也不能将"lock"从关键字中释放出来,这是当前情况的一个麻烦。)
@乔恩·斯基特是的,静音很重。但是,管理锁令牌涉及更多的信息和操作,这些信息和操作可能会被错误地处理,而锁只为每个锁引入一个更多的变量处理(这绝对更容易)。如果我们在一个项目中真的需要令牌支持系统,我们总是可以实现它:)在语法方面,好的,有相同权重的利弊:关键字(虽然不好,但可读性更好),括号(更多的缩进,但我们更好地查看被锁定的内容),一些奇怪的变量在里面做一些奇怪的事情:)
没有数组属性。方法中没有常量。
我相信,默认情况下,一切都应该是虚拟的。
乔恩·斯基特没有设计C,这是件好事,否则我的单子看起来像"1"。类在默认情况下是密封的;2。锁定太复杂;3.大多数对象不可哈希"!
@加布:锁定仍然很容易做对-这只是坏的锁定(例如锁定"this"或(…)类型)将被破坏。您仍然可以在哈希表中使用任何类型-只需使用显然是必需的referenceEqualityComparer。
@约翰·斯基特,现在是明天。你今天有5个吗?
@Thorbj&248;rn:它们仍然是一样的,就像它发生的那样:)
c
有一个手动的字符串缓冲区的交易是易错的疼痛。因为这么多的计算是非常移动和调整字符串(如使用电脑不太多的大数运算的东西为人们的思想方式,当他们的反馈),它真的很可以使用托管C + +语言的字符串或对象要处理的论文。当我必须做它在直C,它感觉游泳在流沙。
同意。字符串操作1 5是通过一项关于恨的事情。
我想我不太感兴趣的有4人,我只是一个真正的熊。所以,我想我真的是一个直C语言的喜爱,所以也许我应该刚刚通过这个问题。
C字符串操作是伟大的,所有你必须做的是可以计数。比较它与语法的噩梦在C + +对象使用
只是使用的电器安全字符串库或东西。XML语言中最难操作的是,很多项目做的XML操纵,但你不要有帖子说"Perl是一个湖,因为它没有完全破碎的T支持DOM节点作为一个原始数据类型。他们使用图书馆。
C字符串操作吸,但只要语言问题),它是最糟糕的。
好吧,我真的真的别本的投诉。C是一个低层次的语言,系统的工作。这不是意味着需要UI的东西,比现代的语言。这是一个的情况下,试图在一头大象上袍。你做什么,问C它真的不想做的。C字符串操作有足够的问题,只是用锤子而不是a飞利浦螺杆。
我不知道什么说,我真的做不多的UI编程方式,所以这没什么。但我所以不要整个很多的数字运算。我仍然觉得自己做了很多的字符串操作,它可能做更多的痛苦比在C,C++或其他语言。使用的C / I的焊料,和我不恨它。但我希望有什么人不难处理字符串。我可以告诉你这是如何可能的外观,因为我没有固定它的思想在语言的多个层次。我有一个程序库是相当多的帮助,但他们仍然需要更多的努力比我喜欢。
消除一个链接,但等待……也有足够的空间漫游目的地……好吧,如果必须插入语句来检查……但等待,如果我是在堆字符串?好的,必须保持在保持可变履带尺寸……这不能继续下去和…
也许我是愚蠢的和没有使用任何多的C,但不能使你只是在抽象数据类型为char *(和相关属性)A结构和调用它的字符串?
"trinithis:你需要写,可以做(和有一些小的事情,是图书馆实现),但你经常运行到一个问题和整合现有的代码或使用datatype做法与其他图书馆。
blwy10:strcat @?尝试使用getcwd() 或readlink() 正确。
很好的实现只使用一个GString的字符串类(glibs library.gnome.org /开发/油嘴/稳定/ glib-strings.html)和字符串处理变为容易,至少比在C + +。
如果设计委托esoteric位(dangermouse.net esoteric /语言/ bit.html):"易扩展的C字符串处理更多其他的基本数据类型,如整数,:)"。
我们需要一个线程五事我们不要恨……
我想加上"没有函数重载"
字符串操作是最美丽的部分。你如何能让任何简单的字符串!有一些怪物比字符串,和无数的图书馆去做A或A拷贝行动现场特异性的克林贡学院plurals查找当我想读第一个字符。
我讨厌"我讨厌某些语言"的五件事怎么样?D好的。
涂上橘红并不代表它就是苹果。好的。
当一种语言被设计出来时,设计者通常会想到它对什么有用。把它用在完全不同的事情上是可行的,但抱怨的时候却不是傻乎乎的。使用Python。我肯定有人或者有人会有一天用python代码创建exe的实用程序。你为什么要在上帝的世界上这么做?这会很好,不要误会我,但没有用。所以别抱怨了!好的。
一个设计良好的项目可能包含多种语言的代码。这并不是说你不能只用一种语言完成一个项目。有些项目可能在你使用的任何语言的能力范围内。好的。
你是站在木腿上吗?好的。
平台可以对语言的功能产生很大的影响。现在垃圾收集器,或者甚至帕斯卡早期尝试"垃圾收集",可以帮助内存褪色(也许malloc更多的RAM??)计算机速度更快,因此,当然,我们对语言的期望更高。坦率地说,我们可能应该这样做。但是,为了方便编译器创建哈希表或字符串或其他各种概念,需要付出巨大的代价。这些东西不能继承到使用它们的平台上。说它们很容易包括到一种语言中,只是告诉我你可能没有一条腿可以站立。好的。
3-到底是谁的错?好的。
漏洞。你知道的。我喜欢虫子。为什么我喜欢虫子。因为这意味着我可以保住我的工作。没有虫子,比萨店就会关门。然而,用户讨厌错误。但这里有一点冷水。每个错误都是程序员的错。不是语言的。一种具有如此严格语法的语言,它可以显著减少可能生成的错误的数量,这将是一种完全无用的语言。它的能力可能一方面就可以计算。你想要灵活性还是力量?你有虫子。为什么?因为你不完美,你会犯错。以C中一个真正可识别的例子为例:好的。
1 2
int a[10];
for (int idx = 0; idx < 15; idx++) a[idx] = 10;
我们都知道会发生什么。然而,我们中的一些人可能没有意识到的是……这种功能非常有益。取决于你在做什么。缓冲区溢出是该功能的成本。上面的代码。如果我真的把它公开了。这又是…跟我说……""我的错"。不是因为允许我这么做。好的。
我们不应该把它放到回收站吗?好的。
很容易指出一种我们不理解的语言中的某个特性,因为我们不经常使用它,称之为愚蠢。抱怨它在那儿等等。哥多总是招待我。人们总是抱怨Goto使用的是一种语言。不过,我敢打赌,你上一个节目中有一种goto。如果你曾经使用过休息或继续,你就使用了goto。就是这样。当然,这是一个"安全"的后盾,但它就是它。Goto有它们的用途。是否使用"隐式"goto(如continue或break)或显式goto(使用任何语言的实际关键字"goto")。不是说语言开发人员是完美无缺的,而是典型的……如果功能在时间的黎明就已经存在(对于这种语言)。这方面可能是该语言的一个定义性质量。意思是…由于向后兼容性,它正在被使用,并且可能不会被挂起。今天正在使用。就像5分钟前一样。正确使用。好。。可以说,也有人不正确地使用它,但这与我名单上的3有关。好的。
1。-一切都是一个物体。好的。
好啊。。这是2的一个子集。但这是迄今为止我在仇恨列表中看到的最令人恼火的抱怨。不是所有的东西都是物体。有许多概念不属于或不需要成为对象。把不属于他们的东西放在哪里是丑陋的,可以降低程序的效率。当然。可能不太依赖语言。这也与5有关。这意味着…对。全球都可以。与静态方法相关联的函数是可以的。将OO编程与全局函数结合是可以的。现在。。这并不意味着我们都应该走出去,把我们的代码从它的对象模型中"释放"出来。在设计代码的一部分或整个项目时,在将其组合在一起时,应该考虑在幕后发生的事情。不仅是这个概念在哪里存在,还有其他许多因素。如果不起作用,为什么要将全局函数包装在类或名称空间概念中?采用静态成员变量。这让我很开心,因为……嗯..当然,这取决于语言和实现,但一般来说,您只是声明了一个全局。是的,有一些理由用OO包装器包装这些非OO概念。其中一个当然是自我记录代码。这是有道理的。所以…就像我说的。不要出去"释放"你的代码。但是任何一种好的现代语言都会有一个全球的概念,而不是OO建模。是的,我特别想指出,没有全局概念的OO编程语言很可能存在严重的设计缺陷。虽然再次…取决于语言的意图和设计,所以我不想选择任何特定的语言,这里有太多的语言需要分析。不管是谁,考虑一下代码应该在哪里存在,并且是最有效的。在一些不增加功能或支持的东西上添加一束光斑只会更快地磨损键盘。这对任何人都没有好处。好。。除非你喜欢布朗尼点的人可能错误地教你,一切都是一个对象。好的。
简而言之,编程不仅仅是轻敲键盘。任何项目都有很多设计考虑。我知道这是陈词滥调,但你必须从各个角度来看待它。即使是现在的类型安全语言。你不只是丢弃代码并期望它能很好地工作。当然。。这可能有效,但可能不是正确的方法。总之,选择最适合特定工作和环境的语言和格式。但是没有语言能带走它背后的思想。如果你不想……你只是在打字。好的。好啊。
+1,即使一切都应该是一个对象。;)
语言并不完美,如果你列出你讨厌的语言,你可能会得到一些有趣的评论和想法。首先,它允许其他人给你提供你不知道存在的解决方案(浏览帖子,你会看到一些东西是学习的)。第二,它构成了语言开发者的用户反馈(如果你的用户列出了他们最讨厌你的软件的5件事,你会不会感兴趣?)第三,思考工具的缺陷有点有趣。
+1、精彩帖子
你刚刚成就了我的一天。
我当然同意你的意见。在我写这篇文章的另一个屏幕上,我有11个"对象",它们只包含数据,在逻辑上不能包含任何其他内容。它们只存在于组织父对象中的字段,因此我不会以包含2页字段的对象结束。
如果您在该级别查看它,那么不仅break和continue是goto,而且循环是goto(如果满足条件,则跳过循环的开始),if是goto(如果不满足条件,则跳过块,则函数调用是goto(跳转到函数的开始,然后向后跳转),……
@如果你考虑氦,即使是例外也可以被认为是某种形式的goto。@znr++在几周内投出最好的帖子。
从源代码"has no use"创建可执行文件?什么?
Perl可以从80年代后期的Perl文件中创建一个可执行文件。分发一个文件很有用。不需要a)安装Perl,b)安装程序的组件,c)可能编写一个脚本来设置路径并执行所有这些…是的,真的没用。
我同意1,但不同意给出的示例。对于这样的软件,您应该尽可能接近普通的窗口。
我同意你的观点,但我不得不大声指出"因为你不完美,你会犯错。"我不完美什么?B-)
@勉强同意。Py2Exe什么时候没用了?当然,开发人员并没有真正的用处来编译他们的Python代码,因为他们都安装了一个解释器,但并不是每个人都是开发人员。不必安装和更新python以及无数的库以及对用户系统的依赖关系,只需发送一个.exe就可以轻松地运行它们。
确切地。尝试将wxpython程序分发给希望轻松安装的人。痛苦的挑战。
但是,如果不能从源文件创建.exe文件,Windows用户将无法运行它。;)
@Sylverdrag更不用说这些列表可以帮助程序员根据每种语言的限制(预期的限制或其他限制)来决定哪种编程语言是合适的。
很好的列表,但是现在每个人都应该理解为什么for 循环和goto 是坏的。
"在一些不增加功能或支持的东西上添加一堆耀斑,只会更快地磨损键盘。"实际上,什么流行语言会这样做?我只能想到Perl和C…其他人则从新的范例中汲取经验,以帮助创建更好的代码(而不是更狂热的代码)。@miffthefox@delty,您当然可以创建一个exe,但是您也可以创建一个单行批处理文件,以使用正确的lang运行时启动应用程序。理想情况下,操作系统应该管理整个包(Linux发行版所做的,尽管仍然过于狭隘)
什么不是物体?一切到原子,以及在原子之下的东西都是一个物体,概念上的物体也是如此。全球经济是不好的(或任何一个国家)。它们在某些情况下可能很方便,但应该谨慎使用。每次你添加更多的状态,你的程序就会获得(指数级)更多的错误。继续是goto吗?也许吧,但是每个语句都可以成为下一个语句的goto。我个人从未见过goto在任何高级语言中的用法(我主要是一个装配工…)
也许在PHP中,很多函数返回错误值而不是引发异常,goto可能很有用,但在任何高级语言中都不是。
@ Longpoke——那么,一行批处理文件如何检测某个版本的.NET/爪哇,无论您的项目使用什么,如果运行时存在,则运行代码,或者向用户显示一个有用的消息,提示安装运行时?
@很抱歉,那个评论太老了,我忘了它和什么有关。o
@miffthefox:嗯,你是对的,你不能在windows中运行,这是一个主要的缺陷,但是你可以双击jar来运行它,因为jdk在windows上注册了jar,尽管这也很糟糕,因为它使代码必须管理其依赖性。根据旧版本的Java是坏的和不安全的,但不知道.NET,因为有1/2 / 3/4…再说一次,大多数开发人员不关心安全性,所以他们只会强迫用户安装一堆无用的本地垃圾,并附带一些旧的JRE。
写得好,但消息很糟糕。编造借口。
我讨厌Java的五件事(目前是我最喜欢的语言)没有特别的顺序。
尽管我是Java泛型的粉丝,但它的设计方式却有很多奇怪之处。因此,泛型有许多令人讨厌的限制(其中一些是类型擦除的结果)。
object.clone()和可克隆接口的工作方式完全被破坏了。
而不是走大路,把一切都变成一个物体(A.LA.smalltalk),sun wimped创建了两种不同的数据类型:对象和原语。因此,对于基本数据类型和wierd好奇(如装箱/拆箱)现在有两种表示,并且无法将原语放入集合中。
摆动太复杂了。别误会我:秋千有很多很酷的东西,但它是过度工程的一个很好的例子。
最后一个抱怨同样是Sun和那些为Java编写XML库的人的错误。Java XML库太复杂了。为了简单地读取XML文件,我经常要担心我使用的解析器是什么:dom还是sax?每个API都同样令人困惑。语言中的本机支持,以便于解析/编写XML将是非常好的。
java.util.date糟透了。它不仅不必要地复杂,而且所有有用的方法都已被弃用(并被其他增加复杂性的方法所取代)。
你忘了java.util.date!
啊,是的。Java日期/时间类。嗯,我可能忘记了,因为我已经很久没有用过了。
我同意所有这些,但我想听听你对(2)的解释。说它"完全破碎"并不是什么解释。你能解释一下吗?谢谢。
不能在克隆中重新分配最终字段。
另外:"cloneable"接口没有"clone()"方法。这使得可克隆界面成为一种矛盾修饰。而且,由于clone()返回一个对象,类型安全性就不在窗口中了(即使在J2SE5.0中引入了泛型之后,也不会出现任何纠正此问题的尝试)。
只要我们攻击可克隆的,可能还包括所谓的可序列化"接口"。每次使用它,我总是想刺伤自己。
为了胜利!
很难做一些简单的事情,比如打开一个文件并从中读取。
JAXB使XML读/写变得非常灵活(1.6以上),但我会承认其余的,还有一些我还没有想到的。
我讨厌beans——丑陋的set/get代码vs c/ruby属性,类不变量就在窗口外,带有构造残缺对象的构造函数——"运行足够的集合,最终这个对象会对某些东西有用"。下一个在砧板上:我真的厌倦了标记和清扫垃圾收集器。最好有其他GC设置,如"无"、"引用计数"或"S&M"、"ER"、"M&S"。不必再担心内存泄漏听起来很酷(哦,真的吗?)但是,当你的应用程序中有缓存的东西时,通过CPU缓存爆破PG的成本会下降。
@Ryan Clone()不一定需要返回"object"。J2SE 5 Java引入了协变返回类型,这意味着您可以返回基类的任何子类型。所以公共mytype clone()是可能的!
@Eric+1 decorator模式做错了:d.有趣的是,在C文件处理中,这样简单得多-,-。
"在语言中容易解析/编写XML的本地支持会很好。"如果你认为Java应该有这个,你就不懂Java…用e4x享受你膨胀的javascript…
对于XML,我发现XMLPP(pull parser)是最容易使用的。我喜欢这样,我可以像迭代器一样传递xmlpp。这是什么?一个FO标签?我来分析一下。
DOM和SAX是解析XML的两种固有的不同方法。一种是基于文档的(即读取整个文档,然后操作它)与基于流的(像在输入中看到的那样对令牌作出反应-对于较大的文档更好)。但我同意使用它们都可以成为PITA,特别是因为它们是通过"服务提供者"接口实现的。
Ruby的速度有很多缺陷,但我并不讨厌。它也有一些缺陷,社区布道过度,但这并不真正困扰我。我讨厌的是:
我同意最后一个观点,当我开始学习Ruby时,我也很惊讶地发现传递函数(块)在概念上不同于传递任何其他参数。
次优的M17N和Unicode支持,尽管它越来越好。1.9仍然很复杂…
我认为元编程滥用被称为"惯用Ruby":)
1。全局变量(尤其是类/模块名)减少了加载同一库2的多个版本的可能性。可变字符串文本(必须编写cblah="blah".冻结以优化gc)3.运算符不是方法(!=,!~!,如果,当),那么你不能做100%正确的代理和期货。
我从未想过元编程滥用的薄弱环节。好点。
我希望Ruby块只是具有更优雅语法的javascript匿名函数。在我看来,这比他们所做的更有意义。
回复:在函数args之后传递闭包(块):这允许您扩展自己的语言来创建"访问者"等。实际上,它非常有用。没有什么可以阻止您将函数/闭包引用作为标准参数进行生成和传递。
不过,我可以看到在框架中过度简化的动态编程会破坏对IDE的支持。我不想听上去像个粉丝男孩(粉丝迷?)而且,Ruby实现的运行速度确实有点慢。而且,我对Rails版本的冲击有点厌倦了:我希望我的Postgres驱动程序继续工作。
您可以在所需语法的一个字符内找到:a l i a s:l:lambda object.method(1,l a a.bar,"blah"),我完全同意它不是最佳的,但我认为它是一种有用的,更重要的是,实用的约定。
线程不是真正的内核线程,而是"绿色"线程。使用require-to-include其他ruby文件不会扩展路径,因此如果库中的多个文件从不同的路径加载相同的文件,它们将被链接两次。
4种创建语法是什么?我只知道……}并且做…结束。
另外两个语法是lambda和proc.new。
关于文档,我曾经听过一个在实用程序出版社工作的人的谈话,他说公司成立时,他们想要一本红宝石书,因为只有一本是日语的。所以他们可以让公司翻译和出版那本书。但是他们所做的却恰恰相反:读源代码——)Ruby Book显然是推出实用程序设计的书籍之一。
我发现有趣的是其中3个与人有关,而不是语言本身。鲁比仍然是我最不讨厌的语言。
洛尔。迈尔丁,我希望我能为这个答案投两次票。-)
我认为这可能是语言能力和IDE能力之间的内在权衡。使一种语言更具表现力可能会对一个IDE能够提供的帮助有很大的限制。如果是这样的话,我每次都会使用语言能力,因为我发现强大的IDE对编写代码的帮助比阅读代码的帮助大得多,而对后者我做得更多。
哦,天哪,有这么多的以东人。
仅仅因为你可以通过阅读来推断一些代码的目的,并不意味着这是找出某个函数的真正方法。
实际上,我喜欢排在最后的块,并且不在参数列表括号内(如果有的话)。原因是,函数通常是最大的参数:它经常跨越行。我讨厌分裂的参数列表,而不介意单独的语法。
@阿玛丹,我不介意它作为一种可选的,偶尔的方式,以通过长的街区…但由于通常只有一条路可以通过,我认为这有点糟糕。
Perl
混合使用sigils
1 2 3 4 5 6 7 8 9 10 11 12 13 14
my @array = ( 1, 2, 3 );
my $array = [ 4, 5, 6 ];
my $one = $array[0]; # not @array[0], you would get the length instead
my $four = $array->[0]; # definitely not $array[0]
my( $two, $three ) = @array[1,2];
my( $five, $six ) = @$array[1,2]; # coerce to array first
my $length_a = @array;
my $length_s = @$array;
my $ref_a = \@array;
my $ref_s = $array;
例如,这些都是一样的:
1 2 3 4 5 6 7 8 9 10 11 12
$array[0] # First element of @array
@array[0] # Slice of only the First element of @array
%array[0] # Syntax error
$array->[0] # First element of an array referenced by $array
@array->[0] # Deprecated first element of @array
%array->[0] # Invalid reference
$array{0} # Element of %array referenced by string '0'
@array{0} # Slice of only one element of %array referenced by string '0'
%array{0} # Syntax error
$array->{0} # Element of a hash referenced by $array
@array->{0} # Invalid reference
%array->{0} # Deprecated Element of %array referenced by string '0'
它是在Perl6 写:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
my @array = ( 1, 2, 3 );
my $array = [ 4, 5, 6 ];
my $one = @array[0];
my $four = $array[0]; # $array.[0]
my( $two, $three ) = @array[1,2];
my( $five, $six ) = $array[1,2];
my $length_a = @array.length;
my $length_s = $array.length;
my $ref_a = @array;
my $ref_s = $array;
缺乏真正的OO
1 2 3 4 5 6 7 8 9
package my_object;
# fake constructor
sub new{ bless {}, $_[0] }
# fake properties/attributes
sub var_a{
my $self = shift @_;
$self->{'var_a'} = $_[0] if @_;
$self->{'var_a'}
}
它是在Perl6 写:
1 2 3 4 5 6 7 8
class Dog is Mammal {
has $.name ="fido";
has $.tail is rw;
has @.legs;
has $!brain;
method doit ($a, $b, $c) { ... }
...
}
设计特点不匹配
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
/(?=regexp)/; # look ahead
/(?<=fixed-regexp)/; # look behind
/(?!regexp)/; # negative look ahead
/(?<!fixed-regexp)/; # negative look behind
/(?>regexp)/; # independent sub expression
/(capture)/; # simple capture
/(?:don't capture)/; # non-capturing group
/(?<name>regexp)/; # named capture
/[A-Z]/; # character class
/[^A-Z]/; # inverted character class
# '-' would have to be the first or last element in
# the character class to include it in the match
# without escaping it
/(?(condition)yes-regexp)/;
/(?(condition)yes-regexp|no-regexp)/;
/\b\s*\b/; # almost matches Perl6's <ws>
/(?{ print"hi
" })/; # run perl code
它是在Perl6 写:
1 2 3 4 5 6 7 8 9 10 11
/ <?before pattern> /; # lookahead
/ <?after pattern> /; # lookbehind
/ regexp :: pattern /; # backtracking control
/ ( capture ) /; # simple capture
/ $<name>=[ regexp ] /; # named capture
/ [ don't capture ] /; # non-capturing group
/ <[A..Z]> /; # character class
/ <-[A..Z]> /; # inverted character class
# you don't generally use '.' in a character class anyway
/ <ws> /; # Smart whitespace match
/ { say 'hi' } /; # run perl code
漆多址调度
1 2 3
sub f( int $i ){ ... } # err
sub f( float $i ){ ... } # err
sub f($){ ... } # occasionally useful
它是在Perl6 写:
1 2 3 4
multi sub f( int $i ){ ... }
multi sub f( num $i ){ ... }
multi sub f( $i where $i == 0 ){ ... }
multi sub f( $i ){ ... } # everything else
可怜的操作符重载
1 2 3 4 5
package my_object;
use overload
'+' => \&add,
...
;
它是在Perl6 写:
1 2
multi sub infix:<+> (Us $us, Them $them) |
(Them $them, Us $us) { ... }
我不认为缺乏真正的OO会像你所做的那样糟糕。有时候,它是一个救世主,尤其是当你使用的CPAN模块没有考虑公开你需要的东西时。缺少多个分派可能会更糟:Perl可能是强类型的;-)
基本上,我讨论了Perl5和Perl6的区别。
my@two=@array[0,1];
$数组> >【0】!= $数组〔0〕!=数组〔0〕
糟糕的异常处理是Perl5的一个问题。我也不喜欢它不是强类型的,而且我不能定义参数化函数
M/(怎么了?=>展望未来)/;?
应该是(?=向前看)。…固定的。
我喜欢Perl不是强类型的,但是添加一些类型信息会很有用。
真的。我真的不喜欢字符类符号的变化。这是一件我认为不应该改变的事情。我不介意(?)不捕捉)-很明显是一个群体,这比它捕捉与否更重要。
字符类表示法的唯一变化是它们必须位于<>的内部。这可以让你做<-[a-z]>的否定。
似乎你选择了批评一种你不喜欢的语言(你应该批评Perl6)
与Perl6相比有什么意义?您是建议Perl6修复您的问题,还是继续它们?
Perl6改进了它们。
我同意所有这些,除了regex构造——我认为Perl的正则表达式和其他任何语言都一样好。
这不是一个bug,这是一个特性!Perl可能是我最喜欢的"get'er done"语言,但是Perl5中侧面的OO包在概念和符号混乱方面确实有点像鲨鱼。
+1对于所有可能的数组/散列符号的列表,除了两个以外,其余都是由语法授权的,具有完全不同的含义:—)
Perl应该死了。但是它不能。它被Linux标准库指定为强制的:(
"不一致的信号"实际上是类型化的去引用操作符,应该这样考虑。这些例子中的每一个都是有意义的。Perl6将打破这一点,因此,不管它在Perl5上的改进如何,它都是完全攻击性的。Perl中的大多数实际不一致都可以归因于成长的痛苦。
我想我需要说的不仅仅是:ozonehouse.com/mark/periodical
缺少真正的OO?实际上,您似乎不喜欢缺乏实现OO的通用方法的干净实现。其他人则认为OO只是关于消息传递、隔离和多态性。还有一些人会对"oo"的真正含义有不同的定义。虽然我同意你的一些缺点,但这不是其中之一。
问题是"[…]关于你最喜欢的语言[…]"。
tnanc;dr(非字母数字字符太多;未读取)
@德鲁·斯蒂芬斯:用其他语言来说,你的意思是{COBOL, microcode, VB} ?
忘记"假"哦。Perl最大的问题是,在列表上下文中调用EDOCX1时返回5个元素,而在标量上下文中调用EDOCX1时返回2个元素。这是不对的。
有时我会按自己喜欢的方式来做PHP,而Python会做得太多。
没有命名空间;所有内容都在一种非常大的名称空间更大环境下的地狱
缺乏标准函数:数组函数接受针尖第一个论点,干草堆作为第二个(参见数组搜索)。字符串函数通常采用先干草堆,后针(见斯特罗普斯)其他功能只是使用不同的命名方案:bin2hex,strtolower,卡尔塔托伊德
有些函数有奇怪的返回值,超出正常值:这是迫使你有第三个变量当php能有效地解释一个空的数组类型为false杂耍。几乎没有其他的功能相同。
1 2 3
$var = preg_match_all('/regexp/', $str, $ret);
echo $var; //outputs the number of matches
print_r($ret); //outputs the matches as an array
语言(直到php6)会最好尊重弱智向后兼容性,使之执行错误的实践和功能当不需要时(参见mysql_escape_string与mysql_real_escape_string)。
语言是从将语言模板化为完整的后端系统。这意味着任何人可以在需要的时候输出任何东西,它会被滥用。你结束了模板引擎语言…
导入文件很糟糕。你有4种不同的方法(包括,包括一次,要求,需要一次),他们都很慢,非常慢。事实上,整个语言是缓慢的。至少,漂亮比python慢(即使有框架)和ROR集合。
不过,我还是喜欢PHP。这是Web开发的链锯:您希望一个中小型站点能够真正快速地完成,并确保任何人都可以托管它(尽管配置可能有所不同)?PHP就在那里,它无处不在,安装一个完整的灯或wamp堆栈只需要5分钟。好吧,我现在要回去和python一起工作……
我很想打字。或者至少让我选择激活它。
您可以部分拥有它,只需使用!==和==用于比较。这确保了类型得到尊重,但对于+-/*等,我相信PHP提供了足够的选择。弱类型是一种语言选择,就像鸭子类型一样,让人们自己选择会使语言更加不一致。
喜欢第4点的讽刺:)
我想第1点是在5.3)中实现的,而参数排序变得更好,命名仍然很差。不过,我同意向后兼容。
Web开发的链锯?伙计,我会在我的签名中使用它。呵呵。
我唯一不同意的就是奇怪的返回值。用php现在的方式,您可以做的是(preg_match_all("/regexp/",$str,$ret))打印$ret;(或者如果(preg…(…)>2)…等),这可能就是重点。
当返回空数组时,PHP将通过松散的键入将其评估为false。返回数组本身仍然可以让您喜欢"if($matches=preg_match_all($regexp,$str))…"。在后面添加"or"听起来是一个非常糟糕的理由,可以用这种方式获得返回值。
我相信这个短语的共同版本是"瑞士陆军电锯",这也是准确的。而且,你应该写你最喜欢的语言,而不是你"有点"喜欢的语言。
爱4。这也是一直困扰我的事情之一。
我认为,速度的论点很主观。与语言本身相比,速度更取决于代码的效率。差的PHP代码可能比高质量的Python代码慢,但好的PHP也可能比差的Python执行得更好。
这是主观的,尤其是因为您遇到的最大瓶颈是网络,以及将页面呈现给用户需要多长时间(css,js),这大约占加载页面所需时间的90%。但是,文件导入真正糟糕的是,它基本上只是对您输入的文件调用"eval"。它既不聪明,也不安全,也不快。
不,你现在真的要逃走了
命名空间schmamespace。PHP在万维网上,所以一切都应该是全局的
这里是一些我喜欢的东西(是不是我最喜欢的是Java语言):
泛型类型的擦除(IU)reified仿制药)
无法捕捉多(不同类型异常的catch块,单)A
缺乏破坏者(finalize()是一个非常穷的替代品)
NO的支持关闭或用作数据处理(匿名内部类类是一个非常详细的替代品)
在总检查异常,或更特别制作检查(例如,unrecoverable SQLException异常)
NO水平的支持所有的语言文字
当NO的推理型constructors of通用类是所谓的单位类型参数(S)必须重复在双方的"="
无法捕捉多(不同类型的)异常的catch块在A单>想最可能是添加在Java 7
是的,你知道你正在处理异常晚…
@svish-我认为关键是,只有当您不关心所处理的异常类型时,才使用这个构造。换言之,当你想把它们处理得一模一样的时候
当语言有一个GC和一个在每个版本中都变得越来越好的GC时,我不会将缺少析构函数称为缺陷。在Java 1.1.8中,析构函数丢失了,但在Java 6中没有,因为GC得到了极大的改进。
C修复了所有这些问题,除了捕获多个异常。泛型被重新定义,析构函数被/IDisposable替换,闭包由anon方法和lambda实现,异常被取消选中,有集合文本,并且有"var"以避免指定两次构造的类型。
Java肯定有闭包。匿名内部类关闭其作用域中的局部最终变量。我同意匿名内部类不是匿名函数的适当替代,但它们是闭包。
无法捕获多个异常-请指定一种支持此操作的语言。至少它是为Java计划的。计划的实现可能并不优雅,但这比不努力解决问题要好。但是,如果您的意思是应该取消选中SQLException,那么我同意。
a non内部类不是闭包:尝试创建一个访问者回调,其中"sum+=current.amount()"是封闭范围中的非最终变量。关上,但没有雪茄。
缺少毁灭性的东西:我怎么能忘记呢?这经常很糟糕。
打字涂改真的很烦人。
@Finnw:既然你问了,Python支持在单个except 子句中捕获多个异常(作为异常类的元组)。
Roboprog,这是因为Java中的一切都是通过值传递的。如果您创建了一个通过get/set对访问的具有t[1]的ref类,则可以将本地final Ref 传递到anon函数中并执行myRef.set( myRef.get().intValue() + current.amount() 。现在我应该去试试看,以确保它确实有效。
匿名内部类是用于闭包的语法醋(与语法糖相反)。
C + +
模板语法
金刚石的继承问题
在1994:14 /漆是现代语言的标准库的一个小的升压是close)。
iostreams
在iostreams的语法使用
Python
空间是有意义的(有时)
underscored关键字
公司的线程支持(至少现在)
"自我"而不是"这个"
空间是有意义的(有时)
你可以把"自我"称为你真正想要的"这个"(尽管别人很难理解)。self"不是关键字,您可以随意命名变量。
你能把这些分成两个单独的答案吗?
接下来,我将列出python中空格(尤其是缩进)的意义,作为它最大的优点之一…;)
@奥利弗-我同意,但是当你把空格和制表符混合在一起时会让人困惑。制表位空间与任何数量的空格都不同。
就我个人而言,如果我要做这个列表,我会列出3到4次"空间是有意义的"。
@我可以,但懒惰压倒一切。
米帕迪:该死!我怎么不知道呢?谢谢!
为什么强调"有时"?
我不认识Python,但"有时"似乎很有趣!
"空间是有意义的"是Python最好的特性之一!!p.s.尝试在解释程序"从未来的导入大括号"中运行此函数
@米帕迪,你为什么首先要给"这个"起个名字?为什么Python不能像其他人那样做(比如c+/c/y/bo)?
实现Python方法的方式(它们只是一个函数,对象作为第一个参数)允许各种灵活的技巧,例如猴子修补。每种方法写一次"自我"真的很难吗?
在我将编辑器设置为"用空格替换制表符"之前,空格和制表符不相等也让我很沮丧。我觉得空白语法非常有吸引力。
除了线程支持,我几乎不同意您的整个python列表。空白没有意义,缩进有意义;有很大的区别。
@戈尔加波:欢迎你不同意,我当然对任何事情都没有很大的权威。:)不过,我将指出,您可以使用空白来实现缩进。
@奥利弗-混合你的空间和标签,你会有一个真正有趣的时间调试。它至少会浪费几分钟(如果你在Python方面有经验的话),当你在压力之下最终发现问题时,你会觉得自己像个白痴。这种情况发生得比你想象的要多,而且代码块缺少真正的标记,使得不可能尝试将代码按某种顺序放回原处。
GNUD -是的。是的,为每个方法编写自己是非常困难的,因为它表明,历史上,Python没有考虑OOP。python解释器应该处理这个问题。你会认为,如果其他OOP语言都能正确地获得self/this指针,那么Python最终会解决这个问题吗?
我真的很喜欢Python的"自我"的一面,它最终教会了我如何思考OOP。现在在C中编写C++程序是非常容易的(关于类)。"方法"将把对象(结构)作为第一个参数。当然,在C语言中仍然缺少很多东西,但是从OOP的角度来写作现在必须更简单。
哦,天哪,Python的线程支持或缺乏是荒谬的。但是我不同意关键词。我认为在这种情况下,这种词法差异是必要的。
只是很高兴它不像语言空白
@calyth并没有说明python忘记了考虑oop;它只是说明了他们遵循的是显式的哲学,而不是隐式的。如果你不知道我的意思,运行import this
所以空间在C中没有意义?if(condA)foo();elseif(condC)bar();
@调用:它们只在缩进中有意义:if x and y: 和if a and y: 和if a and
y: 完全等价。
imho:python中提到的点中没有一个是坏的(除了[python关键字]3)。我喜欢Python以自己的方式做事。:)
如果self不是显式的,那么理解python的作用域规则将更加困难。Python的作用域规则与其他常规语言非常不同。
真的。就像没有人发明了一个文本编辑器,它将空格/制表符突出显示为特殊字符(什么,你在记事本中编码吗?).另外,如果你把标签扩展到空格,请死在火里。
不过,python线程是垃圾。我不能更改线程优先级吗?
@化名:Jython,我的朋友。python没有语言并发构造,所以最好是为它获取一个库。
因为空白而拒绝使用python的人是我能想象到的最迟钝的事情。大括号在类C语言中是多余的,因为所有好的代码都是缩进的。您甚至不需要在python中一直缩进,您可以用分号分隔语句(不过,就像在C语言中一样,没有人这样做,因为它是延迟的)print 'hurr'; print 'durr' 。虽然我希望我可以创建匿名函数/类,这是大括号的自然特性,但几乎没有什么大不了的,而且您可以经常使用lambda来实现这一点。
下划线关键字有什么问题?python尽其所能避免出现在名称空间之外。例如,不是将序列协议定义为要求对象具有"length"方法,而是要求它们具有一个len方法,该方法被称为内置命名空间中的"len"函数。据我所知,对于Python本身的机制,它从不要求您在对象中使用非下划线的名称。
Objective-C
1)没有命名空间的命名公约手册,"I Don’t心灵这类分离的条件,但我是做小姐能进口类定义的所有命名空间A A线(样单进口com.me.somelibrary。*)。
2)有一些孔在图书馆安静区样重要的正则表达式的支持。
3)物业是一位笨拙的语法要求,三线(两个单独的文件中声明a)物业。
4)我喜欢保留/释放模型,但它是更容易比它应该释放a参考然后小心化妆后使用它。
5)在需要的语言特征是A,是一intertwined Xcode使用Objective-C i不能帮助思考这方面的……完成基本的酒店,是非常iffy。它更像一个系统奖励的东西你想你发现了它的存在,然后后来作为一个选择。然后我想我从来没有喜欢自动完成的引擎。
同意我们的命名空间,类和prefixing信码是愚蠢的。我将添加缺少的支持类变量是真实的,我不喜欢他们faking与静态文件。
房地产verbosity绝对同意。它应该是默认的"告诉它到对其他要素的综合。我也有一个与流感的数量和金额C、C代码需要移动之间和基础类型。
Objective-C语言的特性。他们是认真的,令人震惊的,我不能理解的是,炒作不好C #看到他们的知识。
我真的很喜欢codesense,但它仍然不应该是什么。我个人认为这将需要时间和频点的效果。如果你已经使用很多nspoint最近建议,它应该是第一,和它应该弹出的速度更快。
别忘了发送消息的语法:[ [ [ ] ] ] someobject SendMessage dosomethingelse doanotherthing;制作《#确定开放/关闭了一根火柴的女孩是复杂的信息,特别是,它的工作对我不一样了。
事实上,我真的很喜欢那个和你objc Lisp方面的编辑需要的只是良好的匹配与一支撑,如Emacs或Xcode。我通常在前支撑型I型对任何在他们,所以我真的办不到相匹配的问题。和Xcode,突出区域的,也可以由支撑式clicking在线或只是由含双支撑。
要让它在那里"要素的综合。是/否的是布尔值。命名参数。奇怪的混合点符号)和[ ]。
克里斯说:"你的东西是booleans YES/NO 是坏?和更重要的是,你说的东西——参数都是坏的?bools?我理解,但可能是一个objc命名参数的最佳特性(readability而言)。
岩石的命名参数。我喜欢的是让代码更可读。
属性语法真的需要四线标记,如果你是retain 性质和你不想泄漏内存。
在VB的是/是我太liking风格。本文方法的参数都是好的,如果有多的,多的覆盖,但不pointless
也许我masochist样,但我prefixed类的名称。这让谷歌文档和searches晶莹剔透,从来没有一个关于字符串的任何混乱,如果你的类使用一个被称为NSString类。
"That’s kubi:真的好点,但我仍然喜欢能够将所有在一个prefixed集团进出口公司。你得到的包的方式与该样#进出mapkit mapkit.h></。我想我可以这样设置它自己……
C++
串。它们与平台字符串不可互操作,因此您最终有一半时间使用std::vector。未定义复制策略(写时复制或深度复制),因此无法为直接语法提供性能保证。有时它们依赖于STL算法,这些算法使用起来并不十分直观。太多的图书馆都有自己的图书馆,不幸的是,它们使用起来更为舒适。除非你必须把它们结合起来。
字符串表示的多样性现在,这是一个平台问题-但我仍然希望当一个不那么顽固的标准字符串类可以在更早的时候使用时会更好。我经常使用以下字符串表示:
普通lpctstr,
由cotaskmemalloc分配的lpc(w)str,
BSTR
(W)字符串,
CString
STD::载体
将范围检查和基本操作添加到已知长度的(w)char*缓冲区的roll-my-own类(sigh)
建立模型。我已经厌倦了花在和谁包括什么、转发声明、优化预编译头和包括保持至少增量构建时间可承受等方面的所有时间。这在80年代是伟大的,但现在呢?打包一段代码有很多障碍,所以它可以被重用,甚至连妈妈的狗也会厌倦听我说话。
难以解析这使得外部工具特别难以编写,并且很难正确地编写。今天,我们C++的成员大多缺少工具链。我喜欢我的C思考和代表,但没有他们我也能活下去。如果没有伟大的重构,我就不能。
线程太硬语言甚至不认识它(到目前为止),而编译器的自由——虽然伟大——也会带来痛苦。
静态和按需初始化从技术上讲,我在这里作弊:这是"打包代码以便重用"中的另一个难题:只有在需要时才初始化某些东西是一个噩梦。对于所有其他redist问题,最好的解决方案是将所有内容都放到头中,这个问题说"neener-你不能"。
当然,其中很多超出了严格的语言范围,但是IMO需要对整个工具链进行判断,并且需要不断发展。
在STL上查找文档就像在寻找有关如何从头构建图形卡的手册。
坦白地说,这些要点听起来好像你从来没有费心去学习C++。这在第3章中很明显,因为包含守护程序是每个C++程序员都应该知道的。我也不知道该如何理解第1点,你是否对std::string 感到困惑?也许读一篇关于std::vector 的好文档和/或教程(以及为什么你不应该在没有设计过std::string 的地方使用它)可以为你澄清这一点。
@尼布卡德尼扎尔:我发现迈尔斯在STL上发光,但这并不能解决根本问题。坦率地说,这听起来好像你不必维护一个大型项目,你也不必在数十个包含层次结构中寻找循环依赖。我知道包括警卫,但我们为什么要麻烦他们?顺便说一句,他们不会解决所有的问题。如果我一半的时间都不能使用,那么一个std::string 是怎样的"标准"呢?(C++0X至少修复了这一点,但我仍然坚持使用不同的字符串表示的几十个库)。
EDCOX1,5,因为C++没有模块。我认为这取决于你使用std::string 的方式。string类允许您通过std::string::c_str 以const char* 的形式访问字符串数据,这已经使std::string 与每个也接受const char* 参数的类/函数完全兼容。
因为C++没有模块-正是我的抱怨:构建模型是古董(我也只接受任何其他解决方案,而不是模块)。-----完全兼容,但与许多其他场景完全不兼容(我认为C++0x修复这一点,我说这里有一点)。如果STD::字符串已经普及到10年前的字符串类,我会很高兴,但它不是-另一个抱怨。
@彼得森·埃多克斯1〔12〕——我明白你现在的意思了。但是看到它是如何简单地不是一个模块系统,你将不得不生活与包容性警卫。也就是说,我怀疑是否会有一个C++的模块系统。我仍然不确定std::string的意思——如果任何函数接受了const char* 参数,那么您只需传递std::string::c_str ,并完成它。
JavaScript:
可以修改Object 原型。程序中的每一个对象都会得到新的属性,有些可能会中断。
所有对象都是散列图,但是很难安全地使用它们。尤其是,如果你的钥匙恰好是__proto__ ,你就有麻烦了。
函数引用时没有对象关闭。实际上,根本没有对象闭包——相反,每当使用对象表示法或new 运算符调用函数时,都会设置this 。导致很多混乱,特别是在创建事件回调时,因为this 没有设置为程序员期望的值。
推论:调用不带对象符号的函数或new 运算符会导致this 被设置为与全局对象相等,从而导致许多破坏。
尽管这两个操作根本不同,但重载的加法运算符也执行字符串连接。当您期望的值实际上是一个字符串时,会导致痛苦。
== 和!= 运算符执行类型强制。不同类型之间的比较包括一个没有人能完全记住的规则列表。这可以通过=== 和!== 运营商的存在来缓解。
null 和undefined 都存在,它们的含义有着微妙的不同,但又是多余的。为什么?
建立原型链的奇怪语法。
parseInt(s) 需要一个C型数字,因此将前导零的值视为八进制等。您至少可以使用parseInt(s, 10) 但默认行为令人困惑。
没有块范围。
不能多次声明同一个变量。
可以使用一个变量而不声明它,在这种情况下,它是全局的,可能会破坏程序。
with { } 。
很难用类似javadoc的工具来记录。
对于null 和undefined :有时您真的想知道变量是否被赋值。因为空值是一个值,所以只有未定义才是判断的方法。当然,我唯一一次发现这个有用的方法是创建getter/setter函数。
javascript是我最喜欢的语言,它非常接近我要写的列表。例外情况:对象闭包/这不会让我困惑;空/未定义不会让我困惑;不知道您所说的建立原型链的语法是什么意思;带有闭包的块范围(我相信Mozilla的块范围实现就是围绕这一点的语法糖);我会注意到不声明->global就使用变量是必要的缺少文档化的全局对象的后果(窗口是dom,而不是js)。
缺少对象闭包,事实为空!==未定义也不会使我困惑,但它们仍然是设计缺陷,以及与其他程序员(我随后必须修复他们的代码)的大量混淆源。另外,我不同意隐式全局是一个必然的结果——这只是Netscape选择的解决方案。一种可能的(尽管有些不愉快)选择是要求程序员声明每个文件中所有引用的全局(例如,jslint需要这样做)。我很容易想到其他的选择。
我想我不认为对象闭包/这个和空/未定义是设计缺陷。我把它们看作是设计的选择,有好处也有缺点,而且我恰好欣赏它们的好处。关于全局变量,我想补充的一点是,语言没有提供任何方法来区分同名的全局变量和局部变量。
"如果你的一把钥匙恰好是原型"——好吧,这是一个有特殊含义的保留字。这就像抱怨不能使用for 作为变量名。
@哈希的关键是一个字符串。字符串可以有任何值,包括保留字。尤其是值"for" 作为哈希键有效。__proto__ 不是保留字。用作哈希键时不能按预期工作的特殊字符串值违反了对关联数组如何在任何语言中工作的合理预期。它们还违反了ECMAScript规范。
事实上不需要分号来终止语句,除了每个人似乎都认为他们是这样的,所以他们使用它们。语句以javascript中的换行符终止。
托马斯:Newline并不总是以语句结尾。因此,明智的编码人员用分号终止每个语句,以使代码更清晰。
如果你认为未定义可能被破坏,你可以在你的函数中声明一个新的…var未定义;但是,您最好使用以下方法:函数isset(obj)返回类型obj==='未定义';它失败的唯一方法是使用未声明的var。但在本例中,您可以得到window.varname,它可以工作。
newline may or may not end a statement depending on context 是我的前5名
Python:
缺乏静态类型
默认参数处理(特别是您可以更改将来调用方的默认参数!)
所需下划线太多(构造函数必须称为__init__ )
缺乏适当的私人成员和职能(公约只是说,大多数以下划线开头的东西都是私人的,除了像__getattr__ 这样的东西以外,其他东西都不是私人的)
将print 转换为一个文件的有趣语法(但它们在python 3中修复了这个语法)。
真的?如何更改默认参数?那太好了!
如果它是一个可变的对象,因为它只创建了一个实例,那么在第一次计算函数时,对它所做的任何更改都将反映在将来的所有调用中。
大多数人认为缺乏静态类型是一个优势。无论如何,在Python3中,您将能够使用函数注释进行类型检查。
我想要的是使用静态类型的选项。
btw:init不是真正的构造器,当你进入那里时,对象已经被创建了(猜猜自己是什么…)。构造函数实际上是新的,在这里您可以访问要实例化的类。
如果您喜欢静态类型,为什么Python是您最喜欢的语言?
Finnw:静态类型对于某些类型的程序来说非常好,而对于其他类型则不需要。我通常不介意缺少静态类型,但是当您需要它时,至少有一个选项是非常好的。
唯一一次我错过静态类型是在IDE中,因为静态类型提高了自动完成功能。python 3的函数注释可以解决这个问题,对于任何用类型信息注释函数的代码(假设有人会想出一种标准的方法)。
请添加:除了python 2.x中的finally构造之外,没有尝试。
@pi:try-except最终添加在python 2.5中:python.org/doc/2.5/ref/try.html
静态类型会破坏python,即使它是内置的可选功能…
实际上,按照惯例,以单个下划线开头的内容被认为是"私有"的。以双下划线作为前缀和后缀的名称由语言保留。
您还可以在方法上使用双下划线前缀(不使用双下划线后缀),这使得它们"真正"是私有的,但通常情况下,这是一个坏主意,这会使代码不太容易扩展。最好使用单下划线约定。正如其他人所指出的,默认参数只适用于可变对象。在可变对象是预期输入的情况下,最好只使用None 默认值或类似的值,然后在主体中检查它们。很烦人,但一旦你意识到了,就没什么大不了的了。
@Greg Hewgill你看过ctypes吗?
我认为缺乏静态类型是一个特性,而不是缺少功能…
python 3现在有一个(可选)语法,可以用于类型检查:stackoverflow.com/questions/1275646/python-3-and-static-typi&zwnj;&8203;ng
如果你不喜欢"self"关键字。如何比为方法添加"public"或为非方法函数添加"static"更好呢?或重写公共静态void函数名()。比起公共/内部/静态,我更喜欢自我/非自我。private为"var",internal为"uuuvar"。我同意下划线很糟糕,但我更喜欢python而不是静态输入(除非我是按loc:~付费)。
python不强制成员隐私是一种有意识的语言选择。不难再加上这个,但它不存在,因为我们都是成年人。在类的实现中胡闹的任何人都知道他在做什么,并且这样做是出于正确的原因。这太好了!如果一个pythonista不需要干扰实现,那么我们的良好意识将阻止我们这样做,因为它是没有文档的或者类似的,我们不想编写脆弱的代码。
C.*
我希望我可以在任何类型上使用switch() ,并且case 可以是任何表达式。
不能将对象初始值设定项语法与"readonly"字段/private set autoprops一起使用。通常,我希望在生成不可变类型方面获得语言帮助。
对命名空间和类、方法、属性/索引器块以及多语句块和数组初始值设定项使用{} 。这使得你很难知道他们是分开的还是错配的。
我讨厌写《江户记》1(4)。我不想回到方法调用语法,因为查询语法缺少某些内容。
我想要一个查询语法的do 子句,类似于foreach 。但那不是真正的查询。
我真的够到这里了。我认为C非常棒,很难找到很多坏掉的。
+1用于开启任何类型的开关
+对于交换问题和问题,我到目前为止还没有真正考虑过。
我讨厌{}。它们看起来太像了。不匹配对我来说从来都不是什么问题,因为我总是把它们放在同一个水平上,除非它们基本上是一行话。
+1用于Linq查询。尤其是当您只希望返回一个对象时。而不是(从y select.first()中的x),为什么不选择a(从y select top 1中的x)或更接近实际SQL语法的内容。
如果您希望可以在任何类型上切换(),并且这种情况下可以是任何表达式,请检查F模式匹配。c-sharpcorner.com/uploadfile/mgod/&hellip;
+1:因为C在这个名单上属于更高的位置;-)(哦,还有Linq的事情)
+1表示linq方法调用,对于任何类型的switch()ing,我都给出+45。
任何基本类型上的switch ?case 是什么表达?听起来vb.net更好:)msdn.microsoft.com/en-us/library/cy37t14y(vs.71).aspx
用扩展方法只在2/3行代码中编写do方法是很简单的-几乎可以肯定,这里的许多人自己编写了一行代码…
当然,切换类型可以更好地处理多态性吗?
@刺激8d:不,不打开类型,任何类型的switch 。不仅仅是int 、enum 、string 。
PHP
如果您不控制服务器,就没有调试功能,即使这样,它们也有点糟糕。
大量错误的PHP代码四处浮动,给所有的PHP程序员起了一个坏名字。
函数命名不一致
如果我想要一个静态类型的变量,就不能使用它(90%的时候我都非常喜欢动态类型)
注册全球是魔鬼
注册全球曾经吃过我的狗:(
1:我推荐xdebug和一个GUI客户机,比如macgdbp。这真的减轻了一些痛苦…我同意其他观点。
(2)= WordPress
#2:哦,天哪,别让我开始。作为一个PHP开发人员,我总是要保护自己不受那些只看到许多人用PHP造成混乱的人的伤害。
+作为一名PHP开发人员,我花了太多时间为自己辩护。
+1代表2——也会导致薪水下降:(
我听说过:很久以前,查克·诺里斯对这个世界很生气,他把注册全球用户从地狱踢到了PHP。
有一些IDE,如NuSphere的phped,它们自带的调试器可以与任何服务器一起工作,而不管您的控制级别如何。此外,在使用自己的服务器(如localhost)时,可以使用任何调试器,如您所说的。无论如何,您都不希望使用实时生成进行逐行调试。
C(好吧,这不是我最喜欢的,但还没有完成。)
套接字库语法。
没有函数重载。
C型字符串。
缓冲区溢出。
神秘语法。我不知道我找过多少次像阿托伊这样的东西,拍了拍我的额头,然后大喊"当然!"
编辑:如果我使用更多的库代码,我可能会想出更多的方法(比如使用套接字,但那些代码特别糟糕),但我已经觉得自己在选择C时作弊了。有这么多语言存在,只是为了利用C的好部分来替换坏的部分,这有点像打败一匹死马。
什么套接字语法?C没有插座的概念。
cs.utah.edu/dept/old/texinfo/glibc-manual-0.02/library_15.ht&zwnj;&8203;毫升
哦,拜托!你可以想出五个。指针算术不好吗?:)
事实上,我从来都不明白这有什么不好。我是从K&R那里学来的(和大多数人一样,我想),从来没有遇到过什么问题。
好吧,同龄人的压力影响到了我。我想出了一个。(作为第五个牙医,我永远无法割断它。)
+我嘲笑"C"型弦,@brain-d-foy:pointer算术只有在你不懂的时候才会很糟糕。
Chris Luts:即使是在我学习C语言(在我知道C++或其他任何OO语言之前),我才知道char数组有问题。:)
指针算法是一种动力锯-非常有效,但你要冒着全副武装的风险
图书馆!=语法
认真地…"隐式语法"点是有效的,但应该参考实际的语法(即:类型声明)来获得该点。例如:char *(*(**foo [][8])())[]; 更不用说标准库是一堆无用的垃圾。""没有函数重载"也是一个非常糟糕的问题…C是一个可移植的汇编程序,而不是一种OO语言。
@朗普克:没人说过库==语法。函数重载没有什么特别的OO。很多语言都有它,当我用C语言写东西的时候,我总是很怀念它。
@比尔:嗯,这有点没用,因为现在除了胶水代码外,C什么都没用……
@朗普克:也许如果它有好的特性,人们可以忍受在它里面写的不仅仅是胶水代码。:)
@比尔:是的,嗯,它还需要彻底的改造,我发现编程汇编程序比C更直观(虽然我不确定是否可以有效地删除所有未定义的行为,但至少语法和语义可以修复相当多)。我一直希望看到一个现代版本的C,艾达,D,C++,和GO太大,不能称之为。
@Longpoke-没有人认为汇编程序比C更直观。你不可能是认真的。讨厌C,好吧。但暗示汇编程序比C容易多少是虚伪的。你看过一个好的C编译器的汇编程序输出吗?
@Xcramps是语法,而不是语义(尽管语义相当于一个有很好文档记录的库)。以c与intel x86的风格比较:在c中,指针引用是*x ,而在x86中,指针引用是[x] 。现在想象一下,如果你能扩展奥利德堡的功能。双重引用是[[x]] ,而在c中是**x 。调用deref是[x]() ,而在c中是(*x)() 。func指针声明:[int function(int a, [float] b)] x ,vs int (*x)(int a, float* b) x 。显然前者更优越。检查任何东西都比C语法好。
但是,如果英特尔x86汇编程序语法被通用化为类似C语言的话,那就更好了。尽管如此,与C语言相比,所允许的受限子集非常容易理解。
智力测验
没有命名空间或动态模块支持。如果没有这些基础知识,我们怎么能写出化工厂的控制系统呢?
无句法糖分,如>10(移动10次)、0(插入零)、+5(添加5)。
普通Lisp:
关键词往往过于冗长。
图书馆的支持是可怜的。
在希望更严格地处理内存的操作系统中工作不好。
没有很好的工具与操作系统进行交互。
"循环"功能没有很好的定义,当然看起来不那么含糊。
"loop"可能不是lispy,但它有什么定义不好的地方?
我自己还没读过这个标准,我主要是读保罗·格雷厄姆的《口齿不清》。他说,该标准主要是示例,根本没有很好地定义角案例。
你不是说关键字太冗长了吗?
我同意这不是"Lispy",但是cltlv2花了很多时间在上面。我只是觉得它设计得太多了。sunsite.univie.ac.at/bookmarks/cltl/clm/&hellip;
除了"循环","格式"也不是很清晰。我讨厌"格式"和"循环",尽管lisp是我最喜欢的语言。
JavaScript
数字作为字符串-数学可以当数字是以字符串的形式出现。5+2=52?GRRR…
权限-所有最好的东西都需要用户的权限!
屏幕更新-浏览器必须处于稳定状态才能更新屏幕。似乎没有办法强制屏幕在脚本中间进行更新。
慢-虽然谷歌的Chrome很不错…
浏览器的不同使得使用这种语言成为一种[审查过的]。
数字作为字符串很容易固定。如果你有一个字符串,你需要解析它(x,10)。巨大的失败是当你省略了,10,它将"017"解释为八进制
我一直在做的是将我所有的数值变量乘以1。这似乎迫使javascript将它们作为数字来读取。它不把小数转换成整数。
当他们还是孩子的时候,不是每个人都知道1+1=11吗?
false==0==[]=="但空值和NaN不是。楠!=南。NUL= =空。
typeof"a string"="字符串"。typeof new string("another string")="对象。new string('a').constructor=="a".构造函数。typeof new array()='对象'
for(列表中的x)返回索引而不是值。
for(x in object)返回函数
(好的,技术上不是javascript)domelement.onmouseover/out针对子节点触发。
@boltbait,这可能只是转换为parsefloat(str)调用。javascript确实将数字和字符串视为不同的类型。
函数而不是块范围,这不仅会导致标准的循环计数器头痛,而且有时还表现为需要在循环中使用额外的函数来提供围绕变量的闭包。
在找到appjet.com之前,我一直远离javascript——现在我喜欢它了!照顾4&5,减轻2&3的痛苦。现在我渴望一个JavaScript编译器…
吉米:南!=NaN很重要(C的错误)
好吧,也许是南!=nan不是一个"真正"的问题,但是[nan,null,and]形成了一个不神圣的混乱三位一体。外接程序Isnan(未定义)==true,Undefined==null,Undefined!=NaN,例如。
我个人认为南!=nan,null==null,null!=其他一切,南!=其他一切都有意义
-1、这个列表主要是关于浏览器的问题,而不是语言本身。
@莫什:是的,但支持是真正的"集束炸弹",不是吗?
typeof null='对象'
@毛里西奥,除了在浏览器中,你会如何使用这种语言?
@吉米:isNaN(undefined) == true 是完全有道理的,Undefined是你不希望isNaN('string') == true 返回假数字,是吗?
@吉米:稍微澄清一下,如果var == NaN 它测试的是'typeof var'。=数字
@Boltbait:MozillaRhino,Windows脚本宿主,node.js,仅举几个例子。问题在于语言,而不是特定的运行时或环境。
PHP:
我们永远不能确定所有Web服务器上都有某些几乎常见的扩展。
试图成为未来的一切(goto,闭包,…)
对于没有经验的用户来说,许多安全风险
更多的操作符重载会更好
所有不知道如何使它正常工作的可怜的程序员,给它起了个坏名字。
然而,PHP是(脚本)语言。;-)
好吧,只剩下一件事了!
有第五个。
完全同意第5点-也将在一个javascript列表上。
我不同意"所有不知道如何使它正常工作,并且给它起了坏名字的可怜的程序员"。我将用"大量附加的运行时语言配置选项"来替换它。
Ruby是我最喜欢的语言,以下是我不喜欢的:
绿色线程+阻塞C库=巨大失败
太慢了
标准库本身与Bang的使用不一致!方法
模块include+extend混乱。
"开放类"不能确定范围-我想添加一个字符串dostuff,但我不希望它泄漏到所有第三方库中。
没有二进制部署打包解决方案。
你试过Ruby 1.9.1吗?与Ruby1.8.6相比,它提供了巨大的速度提升。
试试JRUYC。JVM JIT FTW!
+1因为包括合理的问题,而不是"讨厌"来自顶级的Ruby答案。
VB6
Windows只。
不再支持。
阵列可以在任何数,而当时所有被标准化为0。
许多应用程序依赖于编译DLL的运行时间。
浏览器控件的许多复杂的控制或像一个复杂的代码块,打破当你运行在IDE未编译的代码,但只是当编译工作精细。
VB是最喜欢的人的语言吗?该_。为什么是"syntaz T是完全不同与其他语言和incompatible"和"坏习惯带到了关于在其他语言"?
只是好奇什么的,坏习惯吗?我需要一些对我的同事们也用弹药。-);
我真的觉得很# 3强大的功能,不是真的爱我一个有这VB.NET。awk中有它的意义,然后在awk数组(哈希):真的伪装
乔:"也许你应该计划在PL/1语言中,你可以启动或Pascal数组:你从任何地方)
1和4,C和.NET # T不需要完整的框架和操作系统吗???????????????嘿,我听说你单者……"它仍然是完整的框架,"你和我一样,有eats Debian(它)。关于5,右有VB6的程序员(Back in the Day)"保持默认编译选项的在线点播"……
仍然有偶尔的支持VB6。宠物pieves:不能初始化变量在声明一个类,在每parametrized constructurs,文件,等等。如果他们将修复这些问题,是一个永恒的语言,可以轻松的10年。
"下一个是什么在线错误了……"意思是说"这样的代码是一ked **,让它继续运行,但无论如何。= =)
它’s,惜不吃早在2个,然后我会已经是它在highschool为主。
我会加上这些:1没有括号!2变量声明。3函数调用和数组访问。
此外,许多旧的vbx安装程序没有检查major.minor.revision.build on dll版本的"minor"部分,实际上会导致系统dll降级。
不同的语法实际上并没有那么糟糕。C和朋友的} ,pascal/ruby的end ,或vb的End If ,还有什么信息更丰富?(还是Wend ?哈尔哈尔)
Delphi:
IDE有点不稳定。
代码洞察有时会被混淆。
调试有时有问题。
更新几个项目文件可能很麻烦。
如果在一个或多个包不可用时启动,则会多次弹出错误消息。
所有这些似乎都是关于IDE的Delphi而不是语言Delphi的抱怨(又称Object Pascal)
大概是因为物体帕斯卡是完美的;-)
嗯,我喜欢对象帕斯卡,因为这是我开始的…但自D7以来,每一个IDE都是彻底的失败。主要是由于D7以来的疯狂的不稳定性,之后的版本在我的系统上没有正常运行(我在3中使用过)。
@邪恶的跳蚤:自从Delphi2007年以来,事情本应变得更好,这也是我自己的经验…
德尔菲2007是岩石坚实。我每天都用它,而且它很管用。我以前用过Delphi2005大约3个月,对我来说真的很糟糕。德尔菲2007是甜蜜的。
Delphi2009比Delphi2007稳定得多,但我无法想象使用旧版本Animore。
我仍然使用Delphi6并且喜欢它…
我来晚了一点,但还是要这样做:-必须写下两次方法签名(接口+实现)-单元名必须与文件名相同。世界跆拳道联盟????
IDE有合理的代码完成,因此您只需编写一次方法签名。记住,有了Delphi,它真的是一站式服务——IDE和语言真的结合在一起了。
腕管从打到打,这几年来一直在开始和结束…
@至少你不需要使用shift键:-
我发现开始..结束比更清楚。你读代码的时间比写代码的时间要长得多。但是对于gripe,在一个案例中不能使用枚举类型的已定义子范围,即使在案例中声明范围是完全合法的。另外,没有跨单元的前向引用。
德尔菲现在不是已经死了吗?
@亚历山德恩:不,它从未像现在这样活跃、流行或伟大。
+1、易于构建、可选的命名空间、清晰的语法
您忘记了:编译器使用许多语言都不知道的严格性来强制类型安全,但将字符串视为"特殊的"。"char"的大小取决于编译器,它有一个令人困惑的"interfaces"实现,而"interfaces"实际上几乎完全与类无关——类是面向对象的编程,而接口是与Microsoft COM接口无关的!类不被引用计数,但接口是!
例如,如果实现子类TinterfacedObject,则可以对接口进行引用计数。但接口确实在过程/函数的入口和出口点调用了"编译器魔术"。
JavaScript
每个脚本都在一个全局"名称空间"中执行……在处理来自不同源的脚本时,必须注意这一点
如果使用了一个变量,但在手工之前还未定义,则该变量被视为全局变量。
浏览器供应商根据自己的喜好制定标准,使美国开发人员使用如此漂亮的语言进行编码的难度超过了应有的水平。
区分大小写-考虑到没有合适的IDE来开发带有编译时检查的JS
解决方法(例如使用hasOwnProperty 方法)执行一些简单的操作。
Afaik,浏览器供应商对JS语言(而不是DOM)的所有扩展至少都被推到了标准采用,即使标准过程未能实现这一点。属性/解决方法:双刃剑。为了强迫"简单",我们失去了很多力量和灵活性。那抱怨总是让我恼火。编写正确的循环(并检查对象成员是否正确)!
哈斯克尔:
从懒惰的评价空间泄漏。
数字层次的困境与重构abstractions到数学。
使它更严格的一个IO总线调试。
大手柄实现I/O方式似乎相当不兼容的标准。(这是唯一的输出,输出低8位人物——然后使用内置的代码,那么这是假设待办事项二进制I / O ICK)。
结合大学($) 算子可以让一些prettier表达的变化。
大多数的论文不要上升到水平的恨,和有人试图修复或固体解决方案构建每个大学的论文。
编辑:这是个有点混乱。有些人似乎认为这是一个良好的命令参数,但我不想解释什么,我不是。我只是人,我到下面的链接点,http://hackage.haskell.org TRAC / / / / changedollarassociativity Haskell wiki的素数,这表示它好。
为什么要更改($)的关联性?f g h x"括号as"((f g)h)x"和"f$g$h$x"括号as"f(g(h x))"。
我是3哈斯克尔。标准库需要包含大量数学抽象,包括向量空间等。前奏曲还需要一个操作符,它像($)一样链接,但从左到右source>func1>filter func2>map(func10)。
你错过了一个非常糟糕的例子:haskell程序员倾向于使用一个字母的变量名。
左关联($)运算符只是函数应用程序,在Haskell中,它由空格字符表示。@正义:试试翻转功能。(>)=翻转($)
我和你一起上了江户十一〔三〕号。中缀右关联身份函数是最好的。
缺少转换运算符(从字符串到int)、IO的奇怪语法和仅限列表的访问是我讨厌的。
有人能解释5点吗?我认为正确的关联性是($)的关键。
我最讨厌的是使用可变数组的丑陋(例如:haskell.org/haskellwiki/prime_numbers_using_st_array)。但是,使用不可变装箱数组的动态编程工作得非常好。
6。由于懒惰,很难计算出时间和空间的复杂性。
7。语言中有一半有用的东西是在一大堆研究论文中描述的。
8。像通过嵌套数据类型递归这样的基本操作需要一堆重复的样板文件或语言扩展(SYB的rank-2多态性)
9。无点风格!有什么意义?除了满足受虐狂的最低限度的渴望?(当然,有一半时间,由于单态限制,它不会自动进行类型检查。)
10。这很难。我花了很长时间才摆脱新来的。尽管如此,我还是喜欢:d
@Erik Hesselink:@apocalisp:,@tim matthews:,请参阅我添加的链接。这是一个微妙的问题。美元符号似乎通过""复制了函数应用程序。实用程序具有不同的优先级。关联性是一个小问题,但正如左关联性对于函数应用很好一样,对于这个括号和与函数应用混合也很好。
"埃里克,诺曼,apocalisp:如果你改变associativity美元,它可以用来delimit多参数。f $ x y z $ quux quaffle 成为f (x y z) (quux quaffle) ,公用事业的权力仍然是目前联想美元,因为如果你想其他的意思是,你可以使用f . x y z $ quux quaffle 。
我知道我参加晚会迟到了,但仇恨是永恒的!
爪哇
runtime.exec()。所以,如果我不手动清除stdout和stderr缓冲区,我的代码会挂起吗?真的。死吧,PLZ。
空指针异常。负责任的编程意味着我必须像对待未爆炸的炸弹一样对待大多数对象,这在面向对象的语言中是一种pisser。当不可避免的事情发生时,我需要知道哪个对象在我的脸上爆炸了,但是Java显然感觉告诉我会作弊。
文件I/O。为什么我要跳过这么多圈才能读取DAG文本文件?在复制文件时,我必须将源文件漏斗状地放到我的代码中,然后手动处理输出字节缓冲区?你是认真的吗?
原语与原语包装。请注意,Java现在有许多特性,允许您在某些地方处理原语及其包装对象,而不是在其他地方可互换,不用担心,编译器会让您知道哪个是哪个。这就像是一个围绕着一个基本上是断断续续的设计决策工作的黑客。就是这样。(编辑:事实上,编译器是一个比我想象的更糟糕的安全网,尤其是在进行相等性检查时。如果"a"和"b"是整数,"a==b"只有在其中至少一个类型为"int"时才能保证其行为符合预期。如果它们都是"integer"类型,那么只有当这两个数字介于-128和127之间时,该语句才会执行您认为的操作。` integer a=1000;integer b=1000;return a==b;`将返回'false`。真的。
XML。我有一个非常简单的小XML文件需要创建,我必须做什么?
1 Java告诉你它是哪个对象,它是前面的那个对象。或stacktrace第一行中的[]运算符
嗯,不。它会告诉我它在哪条线上。如果该行中只有一个对象可以为空,那就足够了。如果这行中有多个对象可能是空的,我必须猜测。
文件IO:移动文件是痛苦的,但是Java的IO API并不是那么糟糕。我以前很讨厌它,但那是在我学会编码之前。现在,我发现它非常方便。当然,如果你只是想要C的readalltext/readallbytes之类的东西,那还是不方便的。
Salm Talk
我不想在Java、Delphi、C语言或Ruby中开发(这是不实用的,因为我公司的主要开发语言是C语言、Delphi和Java)。
从左到右的评估。
有类注释,但没有方法注释(至少在squak中)
没有真正的标准库,细节差异很大
缺少命名空间
你对Smalltalk最讨厌的是什么?
斯莫尔脱口秀让我比其他语言更不高兴,这不太好。
因为我的日常工作用C++来排除(几乎)所有其他语言,任何让我喜欢它的东西都会伤害我的士气。:-)如果我的目标仅仅是对我的日常工作感觉更好,我会学习国际交流!
卢阿
我喜欢这门语言,但有一些东西多年来一直困扰着我!
不支持二进制操作(从5.1开始,它可能随5.2一起提供)。
应该有一个内置的二进制缓冲区实现,例如允许就地长字符串连接。
我知道它不适合语法,但有时我会怀念longvariablename++或verbosaviablename+=5。
参考文献假设了C的知识(我有它,但对于新来的人来说是一个减号),并推迟了一些对C参考文献的帮助!有时也太短了。
它开始拥有大量的图书馆,但是你必须从不同的地方获得它们。另一方面,下载量非常小!;-)
不确定"长字符串连接"的确切含义,但是Lua有一个构建字符串的工具:打包一个字符串表,并使用table.concat(..) 生成结果。
当我使用lua时,我非常怀念continue 语句。几乎完全是因为我发现较少的缩进级别更美观。
@凯泽:我知道,并且使用它,但是我觉得在这个过程中有一些记忆的浪费(可能是错误的)。不管怎样,这确实是个小问题…:-)@david:我也同意这一点。
Python
1-3:没有明显的打包/构建/文档系统选择(如Perl的cpan 、POD 或ruby的gem 、rake 、rdoc 。
4:python 3.0不兼容,每个单独的python项目都需要两个源分支(2.x和3.x)。但python 3.0不兼容,不足以证明它的合理性。大多数PY3K的优势都太微妙了。
5:Jython,Ironpython,CPython不兼容。
VB.NET
AndAlso /OrElse 和And /Or 的行为似乎是倒退的。也许应该换个位置。
When 只能用于异常捕获。有条件地执行When 的能力对于其他一些事情来说是很好的。
在vs-ide中没有friggin重构(实际上不是语言的错误),就像在c中一样。#
Not Is Nothing 。是的,这已经由IsNot 进行了修复,但出于某种原因,我看到Not Is 使用得太频繁了。(我更频繁地看到,在把英语作为第二语言的开发人员中,从这个角度看,它有更好的意义吗?)
它不需要ToString() 上的() 和大多数功能。(导致草率的编码习惯)
断线时必须做_ 。
它允许可选参数。(导致草率的编码习惯)
声明数组是由UpperBound 完成的,而不是由容量完成的。"将arr(2)变暗为字符串"将实际容纳3个元素。
使= 成为比较和赋值运算符。
+1表示上界数组声明。我也不喜欢可选的参数,但是C的人在叫嚷他们?奇怪的。据某人(不记得是谁,就这么说了)说,在vb11中允许中间线中断(想想FluentInterfaces)而不允许。我很期待:)
通过.net,你没有充分的理由继续使用vb…走C路。
C正在获取可选参数,我错过了它们。
做一些办公室互操作工作。你最终会为可选参数祈祷。
@我有,但我只是觉得它滥用得太多了。
对于值类型,没有任何内容是空的,也没有默认值(T)。这会产生很好的效果,比如if(真,没什么,5)返回零!
可选参数如何导致草率的编码习惯?
因为您或下一个开发人员可以"忘记"在方法调用上按正确的顺序设置参数,并导致您自己额外的调试/故障排除/重新编译时间。一旦建立了这个模式,它将继续使用,导致额外的时间浪费。
@jpinto3912-vb具有C似乎还没有的文本XML处理。blogs.msdn.com/b/bethmassi/archive/2007/10/30/&hellip;
在2010年的世界大战中,你不必在过去必须去的大部分地方使用"UU"。
目标凸轮
非并发垃圾收集器。我可以整天编写多线程程序,但它们每次只能得到我的八个内核中的一个。这让我很难过。
没有类型类(或其道德等效类)。这里有furuse-san的gcalm,但是它是a)不如类型类好,b)不在inria分布中。
急需一座可可桥。说真的。如果我写更多的代码和基于DNA的生命形式的实际接口,那么我可能会自己分解并写下这该死的东西。为什么还没有其他人这么做?
函数是可恶的。说真的,模块应该是一流的值。应该只有一种功能。读蒙塔古和R_我之前,你火焰我为这个。
应该使用llvm作为后端。我要杀谁才能让ocaml为我的愚蠢的小ARM6核心编译?
所以是的,我有一些问题。我仍然喜欢这门语言。太棒了。
我同意100%。ocaml是一种我非常喜欢的语言,但是由于你列出的因素的组合,我永远不会使用它。
嘿,原来ocaml-3.12增加了一流的模块。我应该编辑我的原始条目,用项目5替换项目4,并附加一个新的项目5:标记框。说真的,先生们,我认为争论现在已经解决了——无精打采、毫无标签的G机是将功能语言降低到现有硬件中的正确方法。请在添加LLVM后端和并发垃圾收集器的同时修复此问题。我不想通过访问haskell而丢失"mutable"关键字,但诱惑几乎是压倒性的。
VBA(包括MS Office IDE):
1)文件质量差2)错误信息差3)阵列操作程序不足4)必须对dim语句重复类型5)无法彩色打印(必须购买第三方加载项)
我不知道VBA如何成为任何人的首选语言
因为这是我大部分工作要做的。我必须支持大量复杂、相互关联的Excel电子表格。我希望有一天能在一个控制台应用程序中重写它,但这需要一段时间。
我为你感到非常抱歉…(VBA是垃圾)
@埃里克:做一个非CS工程师,安装MSoffice,在做电子表格、文档等的时候开始解决日常问题。
缺少从变量到其命名对象类型的转换如何?已将问题varent/containt分配给contact生成的类型不匹配。
我自己的Top5"我真正讨厌C++":
[5]自动生成构造函数、析构函数和赋值运算符。伙计,每当我在课堂上不申报什么东西,就意味着我不需要它,也不是我忘了它。编译人员,听到了吗?!
[4]模板语法。哦,每当我决定从类体中提取定义时,是否真的需要输入所有这些"<"和">"?
(3)弦。天哪,我受够了"const char*",我必须处理空的情况,我必须浪费O(n)来获取它的长度,我必须为concat操作分配一个缓冲区。
[2]宏处理。每当我不理解编译器的情况时,我就开始寻找一个宏。
[1]运算符重载。我看到代码"A+B*C",在看到A、B和C的实际类型之前,我一个字也说不出这个代码是关于什么的。
+ 1(1)很多人抱怨Java应该有操作符重载,显然他们在C++中从来没有编码过多。
+1对于列表中的所有项(我希望我能为列表中的每个项+1;-)重新进行运算符重载,我将通过编写一个非常特殊的类来说明,在这个类中,所有可能的运算符都将被重载,像+、+=或=这样的东西将具有完全不可理解的含义,并且与C中的语义无关。
Re:操作符重载:如果程序员编写的奇怪的重载操作符不执行它们所传达的操作,那么这不是语言的错误,而是程序员的错误。我喜欢操作符重载带来的灵活性。
@ SteveClaridge运算符重载在处理内存时不难处理,并且只通过Java的方式传递引用。C++中的灾难是因为你可以获取值或引用,你必须自己管理内存。
+1用于自动创建构造函数
构造函数和析构函数的生成并不是因为您忘记了它们,而是因为不管编译器需要它们在哪里。构造,以便编译器可以调用成员变量的构造函数,也可以调用析构函数。-没有其他合理的地方可以给他们打电话。
到blwy10:如果我试图创建一个对象,但没有定义构造函数,我希望看到一个错误。我不希望接收成员未初始化的对象。
回复:(3)你很幸运,至少还有二十多个字符串的其他实现供你选择!
回复:操作员过载。A.ADD(B).MULT(C)'不再告诉我‘A+B*C’。不管是哪种方式,我要么查找类型和函数,要么相信程序员给了事物合理的名称。而‘a.add(b).mult(c)’是丑陋和冗长的。
如果(3)咬你,你就做错了什么。写得好的C++代码使用STD::String。
Delphi(又称对象pascal),我将讨论本机版本,而不是.NET。
VAR块!
语言中的接口是用COM使用来设计的,因此比C语言或Java更复杂。也就是说,除非您明确地禁用了引用计数。
无try except finally end; 。
对象创建过于明确:
1 2 3 4 5 6 7 8
var obj: TMyObject;
...
obj := TMyObject.Create;
try
...
finally
obj.Free;
end;
而是像
1
auto obj: TMyObject; // compiler adds the default constructor call and the destructor call in a try/finally block.
好吧,语言太好了,我真的想不起来了,所以我把自己推到这里:内置类型,如字符串、整数。或者枚举最好有方法。即用i.ToString 代替IntToStr(i) 。
Lua:
我明白原因,但我是认真的。默认情况下,变量应该是本地的,使用global 关键字,而不是相反。
一般来说,我不太喜欢do/end风格的语义。我更喜欢C型背带。
动态键入。我知道,你们中有些人会说"啊?"但我完全被宠坏了,因为我知道给定变量中的具体数据类型。持续的if (type(var) =="string") then stuff() end 是一种痛苦。
变量在使用前不需要定义。我更愿意对我要做的事情直截了当,而不是冒着打字错误的风险去做我喜欢称之为"古怪豆"的事情。
PHP:
同样,动态输入。
没有封口。我知道,你可以做$function($arg); ,但那不算数。
同样,变量可以在定义之前使用。我有一个个人策略,在使用任何变量之前,总是将其显式初始化为已知值,并将其扩展到我可以控制的任何最佳实践文档中。
C/C++:
头部=颈部疼痛。
不支持关闭。(我对C++0x感到兴奋,这有它们。)
静态类型。""等等,"你说。你刚才说你不喜欢动态打字!"是的,我确实说过。但是静态打字也会让人很痛苦。(如果给我一个选择,我仍然会选择静态类型。)最理想的情况是,我想要一种默认静态类型的语言,但也支持动态类型。(我还想要一匹小马,五百亿美元,请告诉全世界。)
听起来好像你对C++进行了预处理,它支持你对C++的每一个不喜欢。
我不理解$function($arg)和闭包之间的关系。$function是一个动态分配的函数名,闭包基本上等同于块范围(通常错误地与匿名函数混淆)。
对不起,你说得对。闭幕是个错误的词。
关于静态/动态类型,您的理想系统似乎是C的描述。
路易斯库巴尔和宾迪:你这么说很有趣。自从写这篇文章以来,我一直在使用C很多,这是非常棒的。
红宝石:
该死的慢
自负的群体
不是很小的谈话
对nil调用方法时出错,而不只是返回nil_la目标C
非本机线程
C
无参数多态性(即C++模板)。它使编写可重用的数据结构和算法成为一种痛苦(几乎没有任何静态检查)。例如,请参见qsort和bsearch的comparator参数:comparator接受void指针:(
没有数据结构库。我真的讨厌自己写哈希表。我也真的不喜欢在网络上搜索可重用数据结构库。尤其是如果它是不完整的。
串。表示效率低下,如果使其正常,就太难安全地输入字符串,那么就太难处理了。snprintf 没有标准。很难用sprintf 创建格式字符串,然后用它以安全的方式再次使用sprintf 创建字符串。
只有词汇宏。如果不同的编译器期望函数注释出现在不同的地方,那么我必须将相同的HAS_NO_SIDE_EFFECTS 放在不同的地方。为什么我不能抓住函数,切换编译器类型,然后通过宏调用在正确的位置插入它呢?
没有用于公共功能的可移植库。对于插座和线程,我使用SDL——一个无聊的游戏库。对于.ini风格的解析器,我能找到的唯一一个为Ubuntu打包的库,我发布在每日的wtf上(它计算哈希值数组,然后对其进行线性扫描…)
C++
模板语法很重而且不受欢迎。让我看看,for(map::const_iterator it = mymap.begin(); it != mymap.end(); ++it) 。
STL中的设计错误。改变向量的分配策略真的应该改变它的类型吗?
过于复杂的类型系统。类型T1有一个convert-to-t2方法,t2有一个隐式的from-t1构造函数。哪个叫?重载、重写和多重继承是如何交互的?糟糕,我想…
来自模板的异常长和笨拙的错误消息。你知道我的意思…
引用意味着您在调用站点上看不到输出参数。在C语言中,您可以猜测foo(bar, &baz) 可以和不能修改的内容。
"改变向量的分配策略真的应该改变它的类型吗?"--如果不考虑不同类型的分配策略,我看不到如何使用多个分配策略。类型包括对其执行的操作,如果使用不同的分配器,则操作必须不同。
+ 1为C++点4。模板错误消息会使您的眼睛出血。
但是,当你修复C中的所有问题时,基本上就得到了C++。
@ Calth:当你修复C++中的所有问题时,基本上可以得到D:
C 2,3。5。都被油嘴滑舌的人处理得很好。
写得很好的清单+1。
我同意很多关于5的观点:参考文献对指针的影响太小,它们会模糊读者,所有这些都是为了方便起见,不必在名称前面使用* 。
JavaScript
函数对象语法:
1
f = new Function("foo","bar","return foo+bar;" );
(它采用n个参数,第一个n-1是函数的参数,然后n是实际函数,in字符串形式。这太傻了。)
函数参数可以是重复的。
1
f = new Function("foo","foo","return foo;" );
最后一次重复是唯一的一次但曾经使用过:
1 2
f("bye","hi" ) // returns"hi"
f("hi" ) // returns undefined
E4X应该就死了。我的用户是总是抱怨没有按他们认为的方式工作。我们面对现实吧,当你需要一页的时候半个伪代码塞特,是时候反思一下了。
一个标准的概念stdin/stdout/stderr(和文件!)会很好。
无效的!=未定义的
必须处理是件令人恼火的事两者都有。有时候它很有用,但大多数语言都是一瘸一拐的还有一个很好。
实际上,空=未定义(松散相等)。但是,NULL!==未定义(严格不等式)。只有在测试严格的相等性时(空=未定义,这是错误的),才需要同时处理这两个问题。
另外,为什么要使用函数构造函数?F=函数(foo,bar)返回foo+bar;
为了补充丹尼尔·卡西迪所说的内容,函数构造函数基本上是存在的,以确保语言的一致性,并在其自身的基础上进行开发。您不打算将它用于任何非动态生成的内容(对于大多数目的来说,这可能是一个坏主意)。
+五分之一。这只会让你的生活更加艰难。
C.*
这是一种很好的语言,尤其是LINQ,但是泛型支持比C++更差。它有很大的潜力,但是当前的实现只对强类型集合和类似的琐碎事情有用。它的下落示例:
不能将泛型参数限制为枚举(仅限类或结构)。
泛型参数不能是静态类。为什么?这似乎完全是人为的限制。
不能指定泛型类型必须具有具有特定签名的构造函数,因为不能在接口上具有构造函数。为什么不?这只是另一个具有特殊名称".ctor"的方法。
同样,不能指定泛型类型必须具有静态方法,因为这些方法也不能在接口上声明。像static T Parse(string s) 这样的东西通常会有用。
编译器太急于禁止某些类型的转换,而程序员知道这些类型的转换实际上是可以工作的,因此它们需要像(TheRealType)(object)value 这样的丑陋。
没有协方差,如IList 不能转换为IList ,即使string[] 可以转换为object[] 。(不过,微软可能会在C 4.0中修复这个问题。)
不能指定泛型类型必须具有构造函数…虽然这是正确的,但您可以指定要在其中使用它的构造函数。class test其中t:new(int)或类似的东西。
如果可以将ilist强制转换为ilist,则可以对其调用add(object),并添加类似整数的内容。这很难保证类型安全。
可以使用where t:enum将类型参数限制为枚举的
不,你不能。:)
你说得对,我的错。
>"虽然这是真的,但是您可以指定要在哪里使用它的构造函数。"class test其中t:new(int)或类似于"um..什么?
"泛型参数不能是静态类。为什么?"这也是接口不能有静态方法的原因。您可以对泛型类型调用什么方法?静态类没有实例方法;静态方法是不可继承的。或者,类中的哪个方法可以具有静态参数类型——您不能实例化它,所以根据定义,不能有实例!
Groovy/Graves
鸭子打字
约定优于配置,假设您知道约定
你讨厌春天的一切
你讨厌冬眠的一切
集合之间的常见操作不是(但最近的版本改进了这一点)
也许比所有这些更重要:可怕的文档,通常要么丢失,要么完全错误。
Python
__init__
有些库很尴尬,比如smtplib
"self"必须在方法声明中!!!!
(对于3.0之前的版本)对Unicode的支持有点差
缺少内联try catch
不直接引用"本/当前模块"(必须使用sys.modules[__name__] )
我不介意在方法中使用self ,除了上下文之外,没有其他方法来区分方法和函数。我想met 可以成为一个关键词,但是……
Haskell:
空间泄漏——默认情况下为懒惰付出的代价——也许代价太高了?
即使是像head 和tail 这样的纯函数也可以调用error ,引导您到IO 。
来自Monad 的fail —把MonadZero 带回来。
Num 类-(+) 应该是AdditiveGroup 或类似的。
江户十一〔5〕不是江户十一〔11〕。
操作脚本/AS3
没有抽象类
没有私有构造函数(因此singleton是一个黑客)
fp10之前没有类型化数组
在flash-ide中编译/发布时间慢得离谱
内置函数(如数学)的性能很慢
否则,它实际上是一种很好的语言——比JavaScript好得多,这与流行的观点相反,比PHP好上百万倍。
Noai-JS> AS!;)
啊哈!AS3> JS
诺艾!
ptthhhhhhhhfff
没有方法重载,不会在除数为零时引发异常
1~5个出色的flash代码编辑器。
@无眼皮:ActionScript3被编译,具有内联XML功能(不需要DOM),输出可以在98%的互联网连接计算机上工作(源代码:adobe:-)并且在库中具有大量出色的图形功能。JS.
Python。
尽管已经提到了Python处理范围的奇怪方式,但我认为,它最糟糕的后果是它是有效的:
1 2 3 4 5 6 7 8
import random
def myFunction():
if random.choice(True, False):
myString ="blah blah blah"
print myString
也就是说,if块内部的作用域与函数的其余部分相同,这意味着变量声明可以出现在条件分支内部,并且可以在它们外部访问。大多数语言要么阻止您这样做,要么至少为您提供某种严格的模式。
此函数有时会成功,有时还会引发异常。尽管这是一个人为的例子,但这可能会导致一些微妙的问题。
我真的认为这很好。它很容易指出语言x的范围规则,并说它的范围规则是疯狂的,但我的感觉是学习的规则越少越好。
我认为一般来说,语言的作用域规则是简单和一致的,条件块和循环拥有自己的作用域并不是更多的规则,而是递归地应用相同的规则。
…而且我通常会在"如果不管怎样"之前将我的字符串设置为"无",表示"还没有设置"。
@Kaleisin我也这么认为,但这是另一个获得安全代码的步骤,在其他语言中是免费的。
@欺骗者:既然你似乎在暗示在其他语言中,myString 需要在if 作用域之外声明/初始化,以便在该作用域之外存在,那么这又是怎样的一个步骤呢?
由于myString 显然是一个字符串,对于大多数用例来说,将其初始化为nul字符串""会更安全,而不是None 。
冷聚变
大型闪存窗体的编译时间。
动态变量类型(有时我讨厌它们。)
cfscript中缺少功能。
cftable(无法使其正确显示)。
缺少cfchart中的图表类型。
完全缺乏NTLM支持(企业就绪-是的,对)
CFC中的病态VaR范围界定
没有真正的空的概念-你的变量就消失了!
无法测试某些事物的存在性(如作用域,只是其中的成员)
哦上帝…冷聚变为什么还没死?
因为它太硬了。:)
冷融合是僵尸。僵尸已经死了…但不知怎么的,他们仍然在四处游荡,仍然咬着人们的脸。(我得说:我每天都在工作。)
我在一家公司工作,这家公司在ColdFusion有自己的主要网站。我讨厌试着调试乱七八糟的东西。一些服务器使用了ColdFusion 5,其他服务器使用了6,还有一些服务器通过BlueDragon在.NET上运行了ColdFusion代码,这并没有帮助。
Python的:
太慢!
列表操作不返回的列表,所以你可以做list.append .append(4)(5)。(A I均值参考同一个列表不是一个拷贝)。这是一个小gripe;它只来了一个时代。
Don’t返回值的语句(if,for,while,打印等)。这是一个重要的问题时,只有一个波长。
一个lambda也只能表达。有没有真正需要的这个限制,他们在每一个等价功能的方式。如果我想要的按钮的事件调用函数这两个出版社?我需要创建一个命名管道供应是一个函数的功能动作的监听器,而做"(λ):F1;F2()"将不会伤害。
你只能把标准Z A ZA AS _ 0 9名。有函数样"真的吗?"和"+"将是伟大的。当然,这可能会导致混淆,但我需要的所有功能,我们将立即说"P"$ % 3"。你喜欢阅读的是清晰的:"dec2bin"或"DEC→我"?("商店_结果"或"storeresults")或"商店的结果"?
你的第二点是小修。为什么不列出.extend([4,5])?
@第2部分,列表是可变的。为什么在添加新条目时返回自身的副本?
@尼克:他不想退回一份副本,他想把原始的清单退回,这样他就可以对它进行连锁修改了。我想。
在PY3K中,您可以在标识符中使用非ASCII字符,但我认为它仍然试图坚持使用字母而不是符号。很遗憾,我认为现在是他们把这种能力添加到语言中的好时机。
我对5号的本能反应在恐惧中颤抖。今年夏天,我不得不清理那些有斜线、空格、问号、减号、冒号等不好玩的列名。
是的,lambda对我来说也是一个很大的wtf。总的来说,你似乎想要口齿不清。
这很大程度上受到了我最近接触这个计划的影响,是真的。对于5,事实上,用破折号作为分隔符的函数名("打印列")比打印列或打印列更漂亮,而且转换(dec->bin)比(dectobin)或(dec2bin)更清晰。
"太慢了!"…相比之下?
菲利普:与Java、C、C++、Haskell(Dasn Haskell是快的)相比,可能是方案。
#2:列表。扩展([4,5])
list+[4]+[5]+[部分理解]
如果langauge允许在函数名中使用+符号,解析将是地狱!!a+b是函数名还是表达式?如果你有一个叫做"A+B"的函数和两个变量A,B,那么A+B应该怎么做??
tmp=2048 x=3 tmp>>x根据您建议,函数名可以使用其他字符是"tmp>>x"函数还是表达式?"tmp>x"或"tmp%x"怎么样?这会破坏Python的可读性。
函数名中的标点符号是我不喜欢Lisp&Scheme的原因之一。
符号出现在Lisp标识符中而不是其他语言中的原因:Lisp保留符号的数量:5(,),`,`,'和',最后两个是可选的。
@hasen和asa:在我的建议下,tmp>x是一个名为"tmp>x"的函数/标识符,您必须键入"tmp>x"才能使用大于号符号。好吧,也许这不是最好的主意。
"太慢了!"…我的python数据处理代码在一台3年前的笔记本电脑上以50k-200k行/秒的速度运行。这对我来说已经足够好了…
"lambda:(f1(),f2())"是我在一些情况下使用的一个技巧。
我并没有收到所有关于将lambda限制在一行的抱怨。只需使用常规函数!
空腹吞咽"太慢"部分。在您的->垃圾箱添加…??????如果你想让你的代码看起来像美索不达米亚的象形文字,我认为你在寻找珍珠或红宝石。
@TM:当然。而且,当我们在做的时候。当你有功能的时候,为什么要有lambda呢?如果要向语言添加功能,请使其有用。
1:# psyco.sourceforge.net ~~~ # 3:好的原因:波长侧效应应该是免费的!产生的_编程/功能/维基之外,应该是一if 回报?4:使用# ~~~而不是全成熟的功能。你可以,所以他们的巢。# ~~~需要运营商可以插入5是在变量的名字听起来像是一个很好的主意,我……除非你不相信a = 2; b = 3; c = b-a Raise a NameError ?);
你是我的语言,Java的。这里是什么,我恨它。
5分)处理。4)捕捉异常。3)布尔类型。2)BigDecimal类型。1)C和Java。#是的是的
Boolean 可以是零。本counterintuitive I find。
是不是一BigDecimal 图书馆和语言特征。我也有我的BigDecimal 和Exception 。主要从写作班是要测试通过一堆箍跳得到实际的工作。我应该澄清我annoyed通过这件事,我不想为你的游说。
对于Java来说,5是不够的!
第1项,实际上不是关于Java的。:)
我可以对问题2-4进行澄清。
布尔值到底有什么问题?另外,第(2)项是库而不是语言问题
缺少指针?我以为每个物体都是爪哇的指针…
你把"为什么"一部分从你的清单中删去了。=
参考文献就足够了。对于很少需要更改引用对象的情况:您可以始终创建一个这样做的指针类。我不明白你为什么讨厌例外,布尔和BigDecimal。
那么,如果没有指针,为什么会有空指针异常呢?
@马克,这只是个坏名字,NullReferenceException更合适
那么,在Java中,指针和引用之间的区别究竟是什么呢?你为什么想要一个指针?
你不能把Fanbois作为你的物品之一。每种语言都有。:)
Alternative to Boolean是使用Boolean,不能为空(但不能为对象)。对于原始数组imho,指针是很好的
如果你参加一个采访,声称Java没有指针,那么你将处于一个受伤害的世界。Java只不过是指针。如果您不这么认为,请描述如何在不将引用传递回正在调用的对象的情况下调用方法…
@布莱恩:我敢肯定VisualBasic没有Fanboyz。如果有的话,他们现在已经死了。
我是说.NET之前的Visual Basic。vb.net有很多。
@onebyone.livejournal.com:指针算术不是指针的基础-除非唯一计数的指针是C指针。没有指针算术Pascal/艾达,Modula和PL/1,最近FORTRAN,以及几乎每种高级语言,除了C和C++之外还有指针。
从创建了很多Perl模块的人的角度来看,这里还有更多关于Perl5的内容,尤其是在Moose上。
令人毛骨悚然的崩溃,使变量超载和绑定。这两个功能都是一个失败的尝试,无法允许对内置类型进行透明扩展。
它们都以各种方式失败,并要求像我这样的模块作者要么实现可怕的黑客来支持它们,要么说"永远不要将重载的对象传递给foo()方法"。这两种选择都是不可接受的。
缺少对编译过程和元模型的适当挂钩。如果Perl内核允许我们通过一个健全的API来影响编译过程,从而允许我们钩住元模型(包、类等),那么通常的moose,特别是角色的使用,可能会更加安全。
语言中缺少内置的命名参数。相反,每个人都会重新投资。真烦人。
同样,缺少可选类型。我不希望使用静态语言,但是能够指定类型和约束,特别是在函数/方法参数上,这将是非常好的。Perl6可以做到这一点。类型是可选的,但非常丰富,内置类型和用户定义类型之间没有根本区别。
向后兼容警察。这更像是一个文化问题。由于Perl5对向后兼容性有很强的承诺,所以上面的一些问题永远不会得到真正的解决。因此,即使要添加一些东西来有效地替换当前的束缚和过载的大便球,这些特性也永远不会被删除。当然,向后兼容性也是Perl5最大的优势之一。
额外的仇恨:Perl内置的异常机制是个笑话。异常可能是一个字符串或对象,这一事实使捕获代码的异常异常异常永远存在,而语言语法中缺少捕获,则是其缺点所在。
干得好,先生。
#5应该是1 IMO,这需要更多的投票。
我听说你喜欢疣,所以我在你的疣上放了一个疣,这样你可以在愤怒的时候拔掉它,而你与例外摔跤。
Python:
通常在文件的末尾有程序的入口点。(因为如果它调用模块中定义的任何函数,它必须出现在源中这些函数之后。)我讨厌你花时间寻找程序的入口点,所以我总是有一个简单的main.py 文件,其中包括:
1 2 3 4 5
def main():
...
if __name__ == '__main__':
main()
当引发异常时,它只能由主线程捕获。或者类似的。
析构函数非常无用,因为用Python编写时,它们可能会破坏垃圾收集IIRC。
我从来没有弄清楚在python 2中相对导入是如何工作的。
我想在标准图书馆看到更多的藏品。例如:链接列表、线程安全集合…
丙:
没有区分函数指针(可执行)和数据指针(您真的不想执行)。
极不可读。让代码看起来像它所做的事情,比让它首先完成任务要困难得多。
缺乏对Lisp Think的明确支持。做功能性的事情是可能的,几乎不可能,但还不清楚。
库之间关于错误代码返回方式的严重不一致。
过时的字符串处理。字符串不是字符串,而是以空结尾的blob。这是所有温克值得。
Lisp:
()涉及按SHIFT键。每次我口齿不清的时候,我就把它和[]互换。
这就是为什么Lisp机器在自己的键上有一个圆括号!
Perl5从最烦人到最少。
1.)向后兼容警察。是的,backcompat是一种优势,但是Perl5太过强大了。现在我们甚至不需要显式地启用语言中的新特性。我更喜欢相反的,如果一个新特性导致了一个问题,让我禁用它或强制执行旧的行为。例如,Perl 5.10添加了say ,如果我有自己的say ,我宁愿让no feature 'say' ,而不是让use feature 'say'; 或use 5.010; 。另外,如果5.8有效,但5.10无效,我宁愿让use 5.008; 限制我的代码仅使用5.8之前(包括5.8)的可用功能如果没有定义use version; ,那么它应该默认为您运行的任何版本,并且建议不要限制它,除非您必须这样做。
2.)过度煮沸。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
#!/usr/bin/perl
use strict;
use warnings;
use utf8;
use autodie;
use English '-no_match_vars';
use 5.010;
package Package::Name;
BEGIN {
Package::Name::VERSION = 0.1;
}
sub somesub {
my $self = shift;
my ( $param1, $param2 ) = @_;
}
1;
现在您可以开始编码了。这不会因为1而改变。当然,这类东西有捷径,如use common::sense; 或use modern::perl; ,这将缩短上述内容,您可能需要一些稍微不同的模块或pragma。但由于1,我们永远无法将其减少到。
1 2 3 4 5
#!/usr/bin/perl
package Package::Name 0.01;
sub somesub ( $param1, $param2 ) {
}
一些模块正在帮助实现这一点,5.0.12中有一个新的包版本,它完全允许这种语法,尽管我认为它首先需要use 5.012; 和Method::Signatures ,但它永远不会被完全解决(用语言)。
3.)变量选择差
锉锉
1 2 3 4 5 6 7
#!/usr/bin/perl
use strict;
use warnings;
open my $fh,"< foo" or die $!;
local $/; # enable localized slurp mode
my $content = <$fh>;
close $fh;
wtf是$! 和$/ 吗?重写以清晰易读。
1 2 3 4 5 6 7 8
#!/usr/bin/perl
use strict;
use warnings;
use English '-no_match_vars';
open my $fh,"< foo" or die $ERRNO;
local $INPUT_RECORD_SEPARATOR; # enable localized slurp mode
my $content = <$fh>;
close $fh;
别忘了,如果你不想受到性能冲击,'-no_match_vars' 必须在那里。
没有创建匿名标量的直接方法如何?
1 2
#!/usr/bin/perl
my $scalar_ref = \do{ my $anon_scalar };
他们不能想出点什么吗?
1 2
#!/usr/bin/perl
my $scalar_ref = <>;
哦,那么Perl如何不友好地进行线程处理呢,因为默认情况下,所有变量(包括特殊变量)都是全局的。至少现在,您可以使用my $_; 来定义它的词汇范围,并在其他方面使用local 。
4.)非常难看的语法
声明是一种更好的语法。我也希望->被替换为。(个人偏好无关紧要)
5.)太多的timtowtdi或者太多的最佳实践似乎让你不得不阅读3-5本书来理解你应该怎么做。
6.)以前(不再适用)。不健全的释放。5.10.0的功能5.10.1的功能在下一个版本之前没有设置时间。现在它是每年发布的功能,每季度更新一次。
7.)象牙塔透视图。社区问题,似乎是大量的开发者想要高门槛的进入,并认为不尊重对待n00b(或真正不同意他们的人)是可以的。
8.)疯狂的版本号/字符串Perl有浮点版本号,它们很难看。哦,开发人员不知道不是所有的下游处理版本比较的方式都一样。不是语言问题
1 2 3 4
0.012 # simple
5.012001 # semantic
4.101900 # time based + version (for multiple versions in a day)
0.035_002 # prerelease
Perl中的所有有效版本..我们不能用像…
1 2 3 4
0.12 # simple
5.12.1 # semantic
20100713 # time based (just use the date and be careful not to need to release more than 1 a day)
0.35-beta2 # prerelease
附加
9.)没有明显的方法在升级后重新安装所有XS模块。
由于匹配变量的存在,导致性能受到影响,我一直觉得这是一个令人恼火的错误,尤其是Perl自己造成的问题。如果语言编译器能够确定某个特定的重新匹配没有被捕获并自动使用更快的代码。(这样做的一个基础是确定在下一个re匹配之前从不使用match vars,这符合编译器级别的定理证明。)
Perl5.10具有/P标志,因此您可以使用每个匹配的捕获变量,而不是全局捕获变量。
"显式启用"是使更新版本成为一件微不足道的事情所必需的。如果他们的所有脚本每次都崩溃,没有人会更新。
@Thor抱歉缩短了你的名字,我不相信,因为我不相信这些功能中的大部分在大多数程序中都有重叠。即使他们这样做了,我不相信人们会在升级时逃避,如果修复是简单的添加'没有功能'的功能';在顶部的罕见情况下,一些东西确实打破。我们惩罚那些使用现代Perl的人,奖励那些不使用的人。就我的2美分。我真的很好奇…你见过"说"这个功能吗?你认为有多少地方可以打破一切?
@每次我升级Perl时,ThorOh和一些东西都会中断,这是由于重新构建XS模块的PITA。
@Xenotracide,我不再做Perl了,但我知道如果在生产中使用的一个版本破坏了程序,在生产中没有大量的重新测试,我们就不会安装它。我们不想这样,所以事情不会发生得那么快。生产中没有任务关键代码吗?
@Thor在新版本的平台上发布关键任务代码之前,您没有进行广泛的测试吗?…基本上,我不认为我们不应该无限期地向Perl添加新的关键字…如果他们想经历逆贬低。例如,第一个版本必须使用use feature ,下一个版本必须使用use version ,然后才可以使用。我会没事的。
@Thor还说,如果你有在5.8 上有效的关键任务代码,那么为什么不把use 5.008; 放在最上面呢?如果这意味着以后的版本中没有任何功能可用(除非明确导入)。
@色诺,有很多选择。我仍然认为,如果小更新中断程序,将导致更新的人更少。
@Thor从5.10到5.12不是一个小更新。
德国的
我的母语…虽然听起来比克林贡语还要美,但这是个语法地狱…
连词:即使是规则动词,对每个人和每个时间都有不同的形式(除了少数例外)。例如:我看到,你看到,他/她/它看到,我们看到,你看到,他们看到翻译成:ich sehe,du siehst,er/sie/es sieht,wir sehen,ihr seht,sie sehen。
礼貌的称呼形式:等于第三人称复数,在中年时用来等于第二人称复数…我真的不喜欢区分"du"和"sie"的概念,因为我的哲学是每个人都应该被视为平等的尊重,因为它值得(我的意思是,什么是脏话,嗯?)
标点符号:给我看一种经常使用更多逗号的语言!
缺少合适的词:例如,没有真正意义上的德语"便利"或这个词的任何派生词…几乎每一种情况下,你都不能把它翻译成另一个德语单词并保留它的意思…相反,你必须组成一个完整的子集来描述它。
英语和邓丽士:当然,英语有"幼儿园"或"争论论",但德语却充斥着没人需要的英语。更糟糕的是:我们重新定义了一些我们采用的词,例如在德语中,"handy"指的是手机,与英语中的形容词"handy"无关。还有对语法的影响,导致了"邓式英语"的表达(见维基百科的链接文章)还有很多,但我不想夸大这一点,这些都是我个人最讨厌的德语。
PHP
没有构造函数重载
函数命名不一致(str_replace,but strtolower)
定义()不象C++那样逐字替换全局变量。
当与XHTML结合时,if语句这样的语句必须以无缩进开头,即使要保持XHTML缩进一致,XHTML也是缩进的。
前任:
必须键入:
1 2 3 4 5 6 7 8 9 10
<?php
if($x == NULL)
{
?>
<p>
<?= $x . ' is null' ?>
</p>
<?php
}
?>
捕捉错误很糟糕
(不知道为什么再次将5改为1,但无论如何)
您的示例代码非常令人震惊…您可以从php部分中跳出来输出一些文本,但随后再次跳到php中输出一个字符串。我建议你用
=$x?> is null</p>
。此外,您还可以执行 [HTML] ,它的可读性更高。
在逃离PHP后放置一个空间,下面的新行将被视为合法的空白。空间也是如此,这很烦人,但它至少让您在模板中保持健全的缩进。
弗斯
类型推断是有限的。
它只向前传播。
f不会根据所使用的方法和属性来推断对象类型:如果没有线索,则会出现"查找不确定对象类型"错误。
不能混合float和int:1+2.3是类型错误。
为了定义monad或计算表达式,必须创建一个builder对象是有点尴尬的。在haskell或scala中,可以直接在一元对象上定义monad操作。
虽然较轻的语法是首选的,但是缩进规则有时不是很直观,或者变得很麻烦。
"1+2.3是一个类型错误"--F是从Fortran派生的吗?
不,f不是从Fortran派生的,而是从ocaml派生的。像f_一样,ocaml不会自动从int转换为float。与f不同,+运算符在ocaml中不是重载的:它仅用于int和+。用于漂浮物。
在Fortran中,即使+运算符重载,但它只对int使用+运算符,对float使用+运算符,不允许混合。(供应商扩展通常允许自动升级。)
是的,在这方面,F和Fortran完全一样。
C++
与char*和std::string相关的库中的不一致。所有C++ LIBS都应该采用STD::Stand。
字符不是iostream的字节。我做了很多面向字节的工作。拥有一个"字节"类型和一个"字符"类型会使它变得非常简单。这也将使扩展到Unicode更加容易。
位操作对于一个值应该很容易。我应该能够在不玩和/或跳舞的情况下访问和设置值的第n位。
缺少用于GUI的标准化接口。这就是微软真正能够很好地利用C_定位自己的地方。操作系统制造商提供的标准接口绑定对我的工作来说非常重要。
我有一本书在探索斯努波尔的各种项目。第一章探讨了snobol编程和语言的历史和文化,并花了一些时间来论证一个好的程序员喜欢一种语言,不是因为它的缺陷,而是尽管有缺陷。
我最喜欢的语言是icon/unicon。但还是有一些事情让我很恼火:
它不是很出名,也不是那么受欢迎。
与PHP、Perl、Java等相比,它有一个小得多的库。数据库访问是通过ODBC来完成的,这实际上很烦人。
尽管它在处理列表方面表现出色,但我还是怀念PHP内置的explode() 和implode() 。
它没有表常量。列表,是的,表格,否。
它是一种编译(实际翻译)的语言。
Python(3.1)
用于条件语句的奇怪的无序T if C else F 语法。
bytes 字面值看起来太像str 字面值了。我们应该有类似于x'414243' 的东西,而不是b'ABC' 。
str 在某些平台上是utf-16,在其他平台上是utf-32。(尽管至少它比2.x字符串有所改进。)
具有相同的加法和连接运算符。这对像numpy.array 这样的类型很疼。
跑得慢。
回复:5,numpy还决定使用np.concatenate()(16chars!)函数实现连接,导致脚本中出现愚蠢的长行…
爪哇
检查型异常
类型消除
缺少运算符重载(例如,对于biginteger/bigdecimal)
缺少regexp/日期/持续时间/复杂文本
对不变性的支持不足
D
我们有接线员,但没有!在操作符中?
动态数组"length"属性-ya canna do
array.length += 512;
没有exit语句-如python的sys.exit()等。当然,可以调用c的exit,但未刷新的输出不会被刷新。
关联数组文字+字符串文字吸吮
在关联数组文本中找到的字符串文本被解释为静态的,因此这一点
char[][char[]] hash = ["hello":"world","goodbye":"angels"];
由于不同长度的字符串文本,没有一些额外的强制转换就无法工作,尽管A.我没有要求它被解释为静态数组B.静态数组无论如何都不允许出现在关联数组中。
不允许循环依赖项(想导出那个Java LIB)吗?有趣地重新设计类层次结构)
有人检查了我的这些;不确定它们是否都是相关的。
关联数组+数组/字符串文本最终固定:—)
我不使用d,但a not_in b 与not (a in b) 在我使用的所有语言中都有"in"操作符。
我不敢相信,我最喜欢的Python宠物皮还没有被提到:
(在3.x之前)相对进口看起来像绝对进口。
这是从您所处的目录还是从sys.path导入foo?
压缩鸡蛋,导致一个系统路径充满什叶派。zipped eggs意味着您不能使用grep 和find (除其他外,调试问题1)!幸运的是,有pip。使用PIP。
其中包括的一些电池不太理想。使用它们很痛苦。
可能是发行版和打包程序的错误,但仍然是:源文件编码在安装/编译时设置为fscking-ascii。世界跆拳道联盟?意味着我必须把"编码:utf-8"的东西放在我做过的每一件作品中。
PY3K修复了我的其他一些小毛病,比如坚持字符串是Unicode的,而8位的处理方式不同…
源编码用于默认为latin-1 ,然后在python 2.3或2.4之后默认为ascii ,现在在python 3中默认为UTF-8 !
软件开发工程师
DUAL 表。
不能使用别名。
我永远记不起分析函数的语法,所以我忘记了/太懒了,不能使用它们。
缺少组合的LIKE 和IN 条件运算符。(10g后,有一个REGEX_LIKE 操作员可以完成这个动作。)
连接语法不好。
SQL不是我真正喜欢的语言,但它是我每天使用的前三种语言之一。可能还有更多的东西,但这些是我头脑中最重要的。
我和SQL*PLUS 有很多问题。我编写了一个Perl替换程序,它按照我在命令行中的要求执行,我在Emacs 中使用sql.el 进行交互式SQL 会话。这些工具帮助我解决我的SQL*PLUS 问题。
说到这里:
珀尔
"只有perl 可以解析Perl。"(但这主要是语法突出显示中的一个问题,我不喜欢在任何语言中使用太多。)
有时我会惊讶于"简单(但偶尔令人惊讶)规则……:它看起来像一个函数,因此它是函数,优先级并不重要。"(摘自perlfunc(1) )
取消对复杂数据结构的引用有时会令人困惑。我不能确定这是Perl中的真正缺陷还是拥有真正强大的数据结构工具的结果。不管怎样,我通常都可以花几分钟来思考我在做什么。
没有选项可以导致系统调用像dbi模块一样引发错误。(多亏了Brian D Foy,我现在知道CPAN上的autodie 模块可以做到这一点,但我希望它是内置的。)
脚本中默认未启用警告和限制。(-e 选项将关闭它们以供命令行使用。)
同样,肯定会有更多的事情,但这些是我最近注意到的问题。我想补充一下对=over 和=back 的需求,以及POD 中古怪的L<...> 语法,但也许这应该是一个单独的列表。
现在,对于Trifecta:
科恩贝克
使用参数查找文件将替换父脚本参数的值。(执行. file arg1 将arg1 放入$1 中。)
ksh 不是理想的交互式shell,默认为vi 键绑定,而不是Emacs 。(我的解决方案是使用bash 作为交互式外壳。)
通用实用程序(如grep )在不同的平台上实现不同,从而防止了完美的可移植性。一些有用的命令需要安装在一些平台上,并且是其他平台上操作系统核心的一部分。
条件的语法太重。(if [ ... ]; then ... fi 号)
尽管它是图灵完成的,但您最终还是希望使用更具表现力的语言,如Perl。
4的一个解决方案是习惯于短路评估:
对于4)在Perl中,pragma是autodie。
也可以在Oracle10中使用类似regexp_的运算符。只有regexp_count是Oracle11中的一个新功能。
对于Perl:ppi可以解析Perl。"致命"和"自动驾驶"都是核心模块,您不需要从CPAN安装它们。""使用严格"将在5.12中默认启用。
@Alexander Re:use strict; 不,你不必使用5.012;严格使用5.012(或严格使用)。IMO与默认值不同。
第一个帖子,所以请放轻松点:)…很棒的社区网站,顺便说一句!
我试着阅读所有其他的回复,只是为了不让我的回复重叠。
C…无特殊顺序:
1)switch语句中的情况不允许出错。如果没有失败…为什么必须显式地键入break;无论如何?它只是迟钝和混乱,因为它意味着没有休息的能力;!!!!
2)不能在子作用域中声明同名的变量,但可以用与类变量相同的名称声明变量?既允许也不允许。否则,就没有意义了。
3)函数中没有可选/默认参数
4)在finally中,每行都应隐式捕获异常。或者至少是NullReferenceException异常。例如,在访问数据库之后,应该始终清理数据库。因此,finally块应该如下所示:
1 2 3 4 5 6 7 8 9
finally
{
if(par1 != null)
par1.Dispose();
if(comm != null)
comm.Dispose();
if(conn != null)
conn.Dispose();
}
如果能写得像:
1 2 3 4 5 6
finally
{
par1.Dispose();
comm.Dispose();
conn.Dispose();
}
但是,没有…您必须检查是否正在访问空对象,否则它可能会从finally块中引发nullreferenceexception。不管怎样,谁真的需要在finally块中出现异常?
5)泛型:可以指定new()来实例化泛型对象,但该对象需要有一个默认的构造函数。为什么不指定一个签名,这样就不需要在还没有空构造函数的情况下创建空构造函数,而只需要使用它拥有的构造函数。
C switch语句不是很好,但fallthrough不是解决方案。逗号分隔多个case值的可能性要好得多。
case语句中有fallthru。
#4:这有一个using 区块。
#5:哦,这太烦人了!可能是接口中没有静态方法的结果。
Lua:
元表在"单击"之前很容易混淆
缺少像a += 20 这样的赋值运算符是一种痛苦
没有集成的面向对象解决方案意味着每个人和他的狗都使用自己的风格
用于注释的语法(-- 排除了前后递增/递减运算符的可能性。
在不攻击C端的情况下,不可能有任何类型的先发制人的多任务系统
C(我猜,部分内容是VisualStudio IDE):
虽然D 型源自B 型,但还不能用Class 等协方差来代替Class 。
图形设计人员不支持基于泛型的继承(或抽象类的继承),即使通过添加额外的继承级别来解决设计人员的问题,继承本身也可以正常工作,这样设计人员总是可以看到代码的具体非泛型变体。
没有构造函数继承
泛型类型参数的WHERE子句中没有构造函数
在打开解决方案时,VisualStudio似乎有一种神秘地签出文件(如项目文件和/或单元测试定义)的趋势,即使这些文件似乎实际上没有被更改。
如果你明天再问我,可能会有不同的清单。即使协方差和设计师的麻烦将在我的前5名中解决,直到它们被解决(方差加在c 4.0中,这似乎至少发生在其中一个中…)。
是的,神秘结帐很烦人,尤其是如果有人作为文件的专用锁。
Python
调试时错误/异常不明确
我工作时不用它
在类中使用init、repr、str等
不能简单地编译可执行文件(.exe或其他)
我还没试过做其他的事,但我肯定会让我恼火的。
对于所有那些C-ish语言程序员来说,self对我来说比这更有意义,因为对象是指它自己。
您应该看看py2exe-py2exe.org,它允许您创建一个具有所有必需依赖项的可执行文件。
Py2Exe仍然需要操作半打DLL等等。不管怎样,底线是有一个安装程序。这使得python对于我来说很难买到桌面产品。(仍在使用tcl/tk,以及starkits)
为什么要一个exe文件?Java和C语言需要安装运行时文件……并且没有人对此抱怨。真正的问题是很少有人在他们的机器上安装了python
Emacs Lisp
没有足够的商业市场可以在elisp中进行全职编码。
GNU Emacs与Xemacs不兼容
方案中的嵌套函数是整洁的,我希望elisp有这个概念[1]
用于简单地循环列表的Do循环或其他一些功能不是标准的(假定您现在可以使用lambda进行mapc)[1]
应该有(函数(lambda(…))[1]的简写
[1]当然,Lisp的一个优点是,用一行程序在自己的代码中修复这些问题并不难。但它不是内置的,这让我很恼火。
问得好;我有点尴尬,因为我不能想出更好的事情来恨,但老实说,法官大人,没有什么好恨的。
关于最后的抱怨:你可以做#'(lambda (...)) 。
拜托,没有词汇量?线程?FFI?另外,Xemacs基本上已经死了,无需担心太多。
C++:
1:头文件。
链接代码比编译代码更困难。此外,要求模板在该翻译单元中具有完整的源代码也是荒谬的。在那边的另一个档案里……你两秒钟前编译的那个。去那儿看看。愚蠢的编译器。
2:清空标准库。
我的意思是,是的,有STD::C++0x中的线程,但没有STD::Socket或任何类似的东西。没有跨平台代码的主要原因是,您必须为要在多个平台上执行的每个函数学习一个新的库。如果没有提供OS标准或OS函数作为标准,C++只适合于推动位。
3:没有多次返回或返回值重载
double x,int y,char z=func();与void func(double x,int y,char z);一样有效。拜托。没有返回值重载的唯一原因是我们"可能"写了不明确的代码。可能!拜托,当我真的写了模棱两可的代码时,请给我悲伤,而不是以前。
4:无反射
可以让反射编译时间。确实是这样。没有任何使很多图书馆写作困难,充其量,并严重地困扰我。我可以滥用预处理器,但是……
5:鸭子在模板上打字
Yaargh。请提供概念和正确的模板错误消息。实际上不可能使用类似于库的boost,因为如果你弄错了,你就是在黑暗中射击。
Python:
数字运算速度慢。这不是什么问题,除非…
这并不是一个简单的方法,可以将C代码包含在导入时自动编译的程序中。
在PY3K接管之前,我们仍然必须遵守愚蠢的整数除法规则。
在PY3K接管之前,我们仍然需要将像imap和izip这样的好东西放在一个单独的模块中。
在PY3K接管之前,我们必须做很多工作。
关于第二点:使用weave,请参见stackoverflow.com/questions/23930/&hellip;
你不需要PY3K就能让from __future__ import division 工作
内联C(虽然不是完全正确的),您可能想要检查赛通。
哈斯克尔
序曲默认导入。
类型类的范围是通用的。
模块不是一流的。
类型不能依赖于值。
monad与functor不统一。
自我
而不是真正的代码浏览器几百扇小窗户飞周围。
只有一个研究项目,不够稳定,没有活动社区。
没有相当快的版本对于Linux或Windows。只有Mac OS X.
不支持标准键盘命令。
哦!关于编写本机插件的文档已经过时了!
自我?如…你自己?或者什么?
好吧,self是一种通用的smalltalk,它是一种编程语言。在关键字后面称为self。请参阅research.sun.com/self/language.html
呜,你喜欢自己吗?我是一个非常喜欢自己的人。方法和类的统一(也就是说),除了beta,在其他地方从未见过。
猜猜看,我也是。
C.*
我的大部分抱怨都与C++约定自动成为C语言的最佳选择有关。
类接口中不允许静态。它仍然是课堂的一部分。为什么它不能成为接口的一部分?!我必须为此创造出如此愚蠢的黑客工作环境。
区分大小写。我知道在这一点上它会破坏传统的应用程序,但是为什么不从一开始就不区分大小写呢?
.NET的奖励一(非特定于C)
编译器不够智能。在.NET3.x中,编译器可以在编译时计算出"var",那么为什么不进行其他常见的优化呢?我们都知道字符串与字符串生成器/不变与可变的事物。当很多情况下,很明显StringBuilder比多个concat.s更好时,编译器为什么不为您转换它呢?我敢肯定编译器在默认情况下可以为我们做很多其他的优化(可以选择否决),并为我们节省大量的时间。
嗯,一个更智能的编译器会更好,但是我发现vb.net(后台)编译器比C编译器稍好一点。我认为两个语言开发团队都需要更多的交流:p
@安迪:我同意不了。似乎他们是两支实力不同的优秀球队。把它们结合起来,想象一下结果!
var不是一个优化。String和StringBuilder之间的关系将取决于实际情况,这在实践中几乎没有关系。
C.*
当正在枚举的集合中的对象发生更改时,foreach命令将弹出,
由于在错误的线程上访问了虚拟对象,因此用户界面控件将其吐出。当然,所有dispatcher.invoke调用都可以移动到clr管道中,
Pinvoke、编组等,
我花了两年时间学习远程处理,
它不像红宝石那么性感。
+1-完全同意第2点。这是一种真正的痛苦,他们还没有在WPF中修复它(它使用了更多的线程),我也感觉到远程处理的痛苦。
.NET框架(库)
很少使用的嵌套类型(如MessageBoxButton 应为MessageBox.Button )
可变结构(Rect ,Point )
System 命名空间中的内容太多
太多不同的平等观念(Object.Equals 、Object.ReferenceEquals 、operator == 、operator != 、IComparable.CompareTo() == 0 )
数组具有可变成员,但长度不可变。
还有一个:
就平等而言,情况可能更糟。在C语言中没有==运算符,与其他一些语言一样,Object.ReferenceEquals也存在,因为==可以被重写(对于空处理也很好)。
还有一件事:我要修复的一切都是密封的。httpContext和system.codedom都被密封,这两种情况完全不同,这两种情况都让我发疯。
Perl 5:
现在所有真正好的东西似乎都需要mod euperl,它在我想去的任何地方都有很低的可用性。
一些真正令人难以置信的功能可以封装在模块中,但在引擎盖下的通常是脆弱或令人恐惧的:源过滤器、typeglobs、驼鹿正在做的任何事情…
datetime很出色,但仍然做出了一些非常糟糕的设计决策(在减去两个datetime对象时不返回秒表持续时间)
核心和CPAN上的双生命模块仍然会导致冲突
模块作者仍将交互式内容放入模块配置脚本中,这样就无法自动安装它们。
这些都与Perl的实际语言无关:)
是啊。。。Perl是一种很好的语言…:)我会想一想,看看我能不能想出一些更具体的语言答案。
好吧,这里有一个真正的例子:即使我用perl-c进行测试编译,perl仍然不能告诉我它将在一个未定义的子程序上爆炸。真是糟透了。
你为什么要-c告诉你?Perl是一种动态语言。这意味着Perl不能知道运行时要做的一切。这就是重点。:)
另外一个C++投票在这里…仍然是我的最爱和一些亲密的追随者-C和Python。这是我目前的仇恨清单,没有特别的顺序:
从C继承的整数类型过多-有符号错误与无符号错误导致的问题太多
复制构造函数和赋值运算符-为什么编译器不能自动从另一个创建一个?
变量参数疯狂-va_list不适用于对象,我对sprintf()、snprintf()、vsnprintf()和它们的所有亲属创建的问题感到厌烦。
模板实现需要在编译时完全可见-我正在考虑缺少"导出"实现或至少是可用的实现
缺少对属性的支持-我希望有一个只读成员,如"a.x",可以公开读取,并且只能在内部分配。我真的讨厌"val=obj.getx()"和"obj.setx(val)"。我真的想要具有访问控制和一致语法的属性。
C/C++
缺乏完整的交换功能
模板语法
您不能定义定义(无多道)
编译器之间的结构打包不兼容
字符有符号还是无符号?
爪哇
边缘不可变
没有像c这样的ref关键字#
到处都是尝试/捕获块
运行时性能差
所有与字符串相关的内容
Python
没有"主要"(我习惯了!)
带下划线的关键字
有限螺纹支撑
"self"而不是"this"
缺少C/C++类比语法
我在前面的一篇文章中注意到了这一点,但是在python中,"self"不是一个关键字,因此如果需要,可以将其称为"this";您可以使用如下方法:def my_method(this,whatever):this.whatever=whatever。当然,从objc的背景来看,"self"比"this"更好。:)
我对python还不是很精通,所以谢谢你的澄清…
python:def main(): ... 解决了第一点。
…我在Python中看到的习惯用法是"if name='main': your code here"来表示"main"。它看起来工作得很好,而且丑到可以通过代码搜索找到:)
如果我正确理解你的评论,你真的应该学习Lisp家庭语言。看看计划(最容易学习)或clojure(最"现代")。
C++具有整体交换功能。int a, b; std::swap(a, b); 。
@比利:嗯,它通常需要使用stack,因为它使用一个temp变量来进行交换。实际上,在ASM中,无论变量的大小如何,都可以在不使用临时变量的情况下进行交换。当我写积分时,我的意思是"作为语言/编译器的函数"
@马尔科科科格鲁:大多数编译器在硬件上可用时都会足够聪明,如果它能提高性能的话。在现代硬件上,我敢打赌交换指令被转换成与std::swap 所做的一样有效的东西,因此没有多少优化(如果有的话)。
@比利:我还没有遇到过一个编译器,当类型不是pod而是某种大结构时,它会做你所说的。对于小型数据类型和结构,您是对的,它不使用堆栈。但是对于大型结构,在我检查它们的ASM输出时,它们总是使用"复制到/来自"堆栈代码。
R
不是我最喜欢的语言,但我经常使用它,而且有很多抱怨…
S3对象只是美化了lists ,而S4类仍然将所有数据公开给用户。
赋值运算符可以是<- -> 或= ,参见mike dewar的rant。
my.var 是一种非常令人困惑的OO语言变量命名约定,请参阅Google的样式指南。
我不必为使用循环而后悔
神秘的错误信息
我认为循环问题是一个社区问题,而不是语言问题…相关:apply()是我使用过的最不透明和最令人沮丧的语言结构。
如您所说,变量名中的. 字符不是特殊字符,解析器会完全忽略它。除了对S3方法调度至关重要!谁认为这是个好主意?
JD,对不起,这就是我的意思(这是一个社区事务)。我喜欢申请,但有时我只想做一个循环,不想让自己觉得不舒服。哈伦,看,你在说我不知道的事情。
一些基础库函数有一些奇怪的接口,如果您以交互方式工作,这些接口是有意义的,但是如果您编写的代码较长,则会导致讨厌的错误。最坏的例子:sample(10:12, 3) 给出10到12之间的三个数字;sample(10:10, 3) 给出小于或等于10的三个数字!谁认为这是个好主意?(不,记录行为的事实不是借口!)
TCL
这是我做每件事时最喜欢的语言。多年来,它的发展(缓慢,非常缓慢)解决了大多数困扰我的事情。而且该语言非常灵活,很容易实现语法甜头来覆盖那些仍然困扰我的东西。但是,语言中有些东西是不容易改变的,只是打破了它的禅意:
数组(关联类型,Perl称之为散列)没有适当的值语义。这使得它们很难传递到函数并从函数返回。而且,这意味着它们不能嵌套。因此,发明了dicts(字典),但为时已晚,尼斯数组访问语法:
$array($foo)
为了向后兼容,现在被愚蠢的数组永远占据了。我们现在陷入了:
dict get $dict $foo
它更冗长,对我来说可读性也差得多。
没有真正的封闭。虽然它可以被全局或名称空间模拟,但这首先破坏了关闭的原因。尽管如此,目前我还不能真正了解闭包是如何在纯值语义系统中实现的。
茶杯很难使用,与所有其他存储库工具相比,它一点也不直观。这比TCL核心更是ActiveState的问题,在编码时并没有真正打破TCL的Zen,但仍然很烦人。
我同意前两点。我已经制定了一些计划,在哪里发展数组,使它们有更多的用途,我看到了一些关于dict语法的想法(尽管我不确定是否同意所有这些想法),我希望有闭包和想法(主要问题是如何进行自省,以及如何根据我们严格的值要求通过lambda值传递它们)。我还真的想要真正的GC和UDP支持。(茶杯是别人的问题。)
C++
(除了lambda函数,我已经避免了在cpp0x中可用的内容)
不强制使用"this"访问成员变量,::globalFunction访问全局命名空间。
中的所有内容(更具体地说,算法中缺少lambda函数,将在0x thu中修复)
处理依赖项/头文件和源文件
基本数据类型上的愚蠢名称(应命名为uint8、int16等)
常量转换功能
我讨厌所有语言的五件事(至少我知道):
我说什么/打什么,不是我的意思
毫无疑问,他们会遇到那些认为自己是语言专家的人,但只会把语言搞得一团糟(例如,坚持删除注释/未使用的局部变量的人会加快程序的执行时间)
除非语言是过时的,否则它可能会继续发展(实际语言或有效使用它背后的概念),要求您积极地与它一起开发,以免落后。
无法修改lexer/compiler(外接程序自己的上下文相关语法)
没有完美的语言(每种语言都缺少一些有用的特性,这些特性通常是不可能模拟的,不可避免的会有一个丑陋的接口,或者只是需要太多的时间来实现和实现它)
lisp有do-what-i-mean标志。
所以lisp可以发现我打算将变量初始化为1,但是出于习惯我写了0?(最近做了这件事,并且很难跟踪bug,因为它涉及网络,所以它可以根据包丢失/订购情况工作)
C。
我最讨厌的是:
没有多重继承-假设您可以用MVC相关的东西提供任何GUI框架基类(控件、窗口、任何东西)等等…框架/基础类不可知论!
没有"friend"关键字…我知道,RAD受害者会因为各种各样的恶作剧和搞笑的失职行为而滥用它,但如果有人能执行德米特的法律,那就更好了。
没有语言集成的DBC功能,有合同,但我更希望有一个通用的规范样式"!"-后缀运算符
不,AOP(我不明白…这种语言有属性,在编译器中添加拦截代码是很容易的!)
没有弱事件委托-观察者模式现在变成了内存泄漏诱饵…:
1:如果您需要多个继承,那么考虑接口(有太多的接口会与多个继承混淆);4:您可以得到一个非常好的AOP库。
4:刚刚进入AOP,C将是一种很棒的语言!我真希望他们很快能为这个增加一些东西。5:完全同意。我一直在慢慢地将所有东西转换成RX和IOBServable,这看起来更舒服。
@我知道接口,但这不是重点。对于许多任务,您不仅需要接口,还需要能够以可理解的方式编写代码的行为。当然,我们可以使用策略-模式(例如)来实现MVC,但是更好的方法是通过添加一个通用的基类来将完整的数据上下文处理添加到system.windows.forms.form中——噢,我使用postsharp.net。真是太神奇了。@哈里斯博士,我完全同意。我不明白他们为什么不把属性扩展到拦截。那就完全解决了。
啊,但与你不需要它的次数相比,这是一个罕见的情况,它带来了各种各样的疯狂问题——例如,如果你有从A&B继承的C类,并且都定义了一个foo方法,那么你用什么(非任意的)设置来确定调用哪个foo?
如果您问我,如果有人试图从两个具有冲突成员名的类继承,编译器将失败并出现错误。然而,我确实认为,鉴于受过良好教育的开发人员知道如何区分关注点并遵守德米特定律,这种情况很少会发生。那些只为谋生而写代码的人(Morts,大约90%的开发人员)总是给我们地狱般的多重继承。我想解决这个问题的最好方法是只允许ELVIS和爱因斯坦类型的人使用软件。
斯卡拉是我最喜欢的语言。恨五件事?容易的:
学好要花很长时间。我知道你可以把斯卡拉写成"更好的Java"。这就是我们过去常说的C++和C语言。我同意这是语言中深刻思想的必然结果。但还是…
方法与函数:def f(x: Int) = x*x 定义了一个方法f,而不是函数f。方法不是函数,尽管早期的scala教程中有很多内容模糊了区分。语言也试图模糊它,因为如果您在某些地方提供了一个方法,而在某些地方期望函数是可以接受的。我们必须同时拥有方法和函数吗?是的,这是基本的。但起初我很困惑。
以"cake"模式从mixin组合类或对象容易出现NPE。例如,trait X { val host: String; val url ="http://" + host } 是一种mixin,根据其在类声明中的位置,该mixin在实例化时是否会出现NPE。编译器可以告诉您它是否会失败,但不会(无论如何在2.7中),在复杂的继承图中很难诊断这个问题。
2.8中的数组依赖implicits与主scala集合类型进行网格化。但隐含并不适用于所有地方。在预期提供Seq 的情况下,可以提供Array 。但是,在预期提供Option[Seq] 的情况下,不能提供Option[Array] 。我知道没有完全正确的方式来处理Java数组。
类型擦除。说得够多了。
目标C/可可/可可触摸:
缺少命名空间
很难将原始值与cocoa的任何有趣且强大的技术一起使用,例如,分布式对象、通知、kvo
与使用快捷点语法访问属性不一致,通常必须使用全长访问器
iPhone上没有gc,一般来说gc对于一种高度动态的语言来说是相当晚的。
不一致的库支持,至少在CocoaTouch中是如此;一些非常基本的东西最近才得到高级支持,例如音频处理。
缺少积木!
块是最新版本的(但我相信在iPhone上还没有)。实现也相当漂亮。
如果您想要一种与Objective-C类似的真正动态语言,您应该尝试使用smalltalk。
二郎不在这个名单上。在我最喜欢的语言中,当然也有一些缺陷:
语法。这包括3个终止标记(,;)和美学,但更普遍的是关于代码的语义如何在文本中表达。一个例子是,所有小写符号都是原子,所以要引用一个函数,你不能只命名它,你必须使用fun my_function/1 和?PRECEDE_CONSTANTS_WITH_QUESTION_MARKS 。来自Scheme、Haskell等。您只希望可以使用一个名称。
图书馆的支持是差强人意的。这主要是外部库,甚至是旧的标准库。Erlang的新版本有一些明智的POSIX regex,但是旧版本的有一个非常糟糕的库,用于基本的字符串操作。你也永远不知道什么时候你得到了价值,或者说你得到了价值。
相关:用于构建和分发的非统一工具。Ruby有gem 和rake ,rspec。Perl有CPAN。我不知道在二郎有什么体面的等价物。
一些特定于二郎的工具非常奇怪。Mnesia是一个很好的数据库,但是从SQL中可以学到很多琐碎的东西。与文件@spec 相同,它有一种奇怪的方式来描述签名。
当你只想要那一点点突变的时候,功能范式常常会受伤。假设您想要一个哈希表,您不能像Scheme或SML那样简单地对其进行黑客攻击。ets 和dets 减轻了一些疼痛,但没有减轻多少。
第六、奖金:
对于模块来说,导入和导出语法是一堆失败,与Java的80行EDCOX1、8条语句不同。
话说回来,二郎是一种快乐^^
我最喜欢的是C,但是C已经有很多答案了,所以我将继续我的下一个"最喜欢"部分:
T-SQL
GO 语句,以及您需要它来编写各种DDL/DML脚本的事实,以及它也破坏了事务语义的事实,这使得编写原子脚本比编写原子脚本困难得多,而您真正需要原子脚本来升级生产数据库。
分号语义不一致。99%的语法不需要它,MERGE 语句必须以它结尾,WITH 语句必须以它开头…下定决心!
WITH CHECK CHECK /WITH NOCHECK CHECK 。UUUU GLY。
UDF中的可选参数不是真正可选的。调用者必须指定DEFAULT (甚至不要尝试使用NULL )。与真正可选的SP相比。
"…可能导致循环或多个级联路径。"恨恨恨恨恨恨恨恨恨恨恨恨恨
haskell(所有的GHC扩展,不仅仅是基本haskell'98规范)。
有一件事我很讨厌:它不是主流。
二郎
没有静态推断像在哈斯克尔找到的一样打字。这个可能导致运行时错误和仔细编写代码或使用dialyzer(1) 发现差异。动态类型是也被认为是缓慢的;
与C、Java等相比几乎是未知的;
's lists(3) 模块相当瘦,有时我缺乏列表处理的有用功能(例如,在哈斯克尔的Data.List 中);
让我在每一个陈述的结尾加上, 在第条中,在第条的末尾加上. 。
普通LISP
条件不是类(因为类出现在后面),即使它们的接口几乎相同
有些名称很奇怪,例如flet/labels(唯一的区别:scope)和defvar/defparameter(唯一的区别:已经定义的行为),或者任何位旋转函数(dpb、ldb等)。
包是…很难纠正——每次我认为我理解他们,他们就不做我想做的事。
内置数据结构和函数并不像它们可能的那样通用(例如,为什么我不能以可移植的方式定义自己的哈希函数?)
函数、变量等的多个名称空间(原则上我并不反对,但cl使其过于复杂;norvig说他不能从规范中分辨出来,但至少有7个名称空间)
方案:
在某些实现中没有动态作用域、没有bignums或复数、不可移植的类型声明、没有本机哈希表。
C
它是如此的灵活和强大,以至于很容易编写出非常糟糕的,或者完全危险的代码(或者,如果你喜欢,"拥有强大的力量就有巨大的责任")。
"="用于赋值,而"=="用于相等;在"if"语句中容易混淆。
语言中许多基本部分的实现依赖于编译器;例如,基本类型的大小、位域中的位顺序、联合中的填充和字节顺序。
位字段不可参数化(也就是说,可以对int进行数组,但不能对其进行数组)。
可以改进字符串处理。
Python:
我仍然是一个适度的Python用户,所以我的抱怨很可能是知识的锁或误用。欢迎评论。我真的很喜欢这种语言。
螺纹支撑和镀金不良。如果您想使用多核平台,大多数Python程序员可能会建议使用多处理或某种类型,不要使用线程。它不会给你期望的表现。
属性仅用于实例变量。_ class_var=property(class method(some_method))不起作用。如何获取属性包装类变量?
没有访问控制。所有访问控制都是语法管理。就像私有是私有的,保护是受保护的,等等…希望每个程序都遵循命名约定。来吧,我们可以做得更好。
我同意Python的简单和清晰的语法哲学,但在我看来,一些简单和清晰的语法不被支持似乎是一个很好的判断锁。例如,A++,++A,A——和——A,自减/增量,这些有什么问题?Fo=(a> b)?A:B)一元手术,怎么了?(我知道PY2.6引入了类似的东西,但是考虑到几乎所有其他语言对这些简单语法的大量支持,为什么要重新设计轮子呢?为什么不遵循最佳实践呢?一件好事不应该保持其良好的"形式"?
程序到接口。python没有接口或抽象类概念(py3k有一个称为abc的概念),一切都是具体的。我认为,提供"interface"或"abstract"关键字来构建类骨架并保护类继承和扩展不是一个坏主意。它有助于自上而下的设计。目前,我只需要用notimplementederror来填充每个方法,这是一项非常乏味的工作。
我得加上这个。低于3.x的版本具有str和unicode类型。这真是一场噩梦。它使ASCII和非ASCII/Unicode混合最有可能失败(坏,坏)
我看到人们抱怨速度。我不明白。它是一种解释语言,代码直到运行时才编译为机器代码,这就是它的本质。你不能将翻译语言和编译语言的速度进行比较。据我所见,在解释/脚本语言中,Python并不慢。
4。你错过了+A和A-?天堂…如果你拿到了,我可以要回内嵌汇编程序吗?6。啊,你只习惯用7位的ASCII码。ASCII和Unicode的混合迟早会咬到你,很严重,而且很难调试。在这种情况下,显式要比隐式好得多。
同意。这就是为什么我说这是一个噩梦,因为你不能百分之百地确定你在处理纯ASCII和Unicode。幸运的是,py3k将所有使用UTF-8编码的单码作为默认值(而不是ASCII)。我们都在谈论的只是单曲…++/-对我来说似乎不是很邪恶。:)短于i+=1。问题是i+=1是一个不能用在表达式中的语句,其中++/--是表达式。
对于4:foo=a,如果a>b,否则b——当用括号括起来时,这看起来可能更好。我喜欢这种语法,因为你可以把它读作"如果a大于b,foo等于a,否则b",foo=(a>b?A:B)很难破译。
您可以创建类属性,但它可能是不直观的。请参阅我的问题:stackoverflow.com/questions/2173206/&hellip;
问题是,++和--可以用在像a=b*++a+c[a++] 这样的表达式中,imo很难预测a的结果值。我对a++ 没有问题(即使您只保存了1个字符)。但是如果选择允许后一种语言而不是前一种语言,那么对于具有完全支持前/后增量的语言背景知识的程序员来说,这可能会更令人困惑。
我在尼默尔最讨厌的五件事:
局部函数不能产生
编译lambda的能力有时取决于它是否内联
元组的值/引用类型语义不一致
数组索引和类型参数之间偶尔出现歧义
缺乏普遍采用
卢阿
我喜欢在Lua中编程,但这让我很恼火:
没有办法在语言中写下API——没有什么类似于.ch文件或Java接口。
这种语言有一流的功能,但有人忘了告诉设计图书馆的人。
编写函数的语法太重了。
语法分为语句和表达式。
表达式形式是贫乏的:没有"let"形式,没有真正的条件表达式,…
尽管如此,我还是坚持认为Lua非常棒。
C.*
默认情况下,引用类型可以为空;在语言中,空关键字是非类型化的。
缺乏歧视工会
异常作为默认的、非异常的错误处理方法——没有太多的替代方法。
陈旧的switch语句语法和限制
构造器+静态方法之间不必要的区别
静态方法不能是接口的一部分
缺少按形状的接口实现而不是显式的接口实现-导致了许多语言设计攻击,如LINQ查询语法、foreach、集合和对象初始值设定项-这些都不能灵活地重用。例如,对象初始值设定项语法可能很好,但对不可变对象的作用很差。
无法独立于实现继承类的"interface"-导致代码重复和提供接口、抽象基类、几个常见实现的总体架构代码,并且无法选择要使用的每个类的位。另外,会导致与特定实现紧密耦合的代码过多,因为通常显式引用实现类型而不是接口。
由于类"interface"与它的实现紧密耦合,因此不能通过组合来多次继承;实际上缺少mixin。
接口的上述限制导致了几乎相同的接口的扩散,这些接口在任何类型的层次结构中都不会自然地重叠。扩展后的IComparable vs.IEquatable vs.IComparable vs.object.equals vs.operator==etc.等,使满足所有这些要求的自定义类型比所需的工作(特别是集合类)多得多。显然,语言设计者意识到了这一点,因此对于像linq、foreach和集合初始值设定项这样的东西,可以通过形状而不是界面来工作的各种解决方法。
重复使用括号和大括号而不是布局是结构。
返回值可以忽略,从而限制类型推断的有效性。
枚举不是普通类型,不能有方法。此外,枚举值不是类型安全的,尽管没有0值,但可以初始化为0。通过将标志和非标志枚举集中在一起混合隐喻。
缺少适当的值类型支持。由于clr的限制,值类型不能被继承,具有不同的构造函数语义,并且性能较差。另外,关于值类型的语义混淆:一些值实际上是值(并且不能修改),而另一些值实际上是非别名、非空引用(变量)。对于下一个问题,这一点尤其令人困惑:
字段和属性之间的语义区别,特别是缺少可修改性修改器(AL+C++的EDCOX1(3))
不能专门化泛型
无法提供默认的泛型类型参数(例如工厂泛型)
typedef的缺乏使仿制药的使用变得困难(using 是一个有限但很好知道的替代品!)
不能对除类型(如函数、普通值或名称)之外的其他内容进行泛型。这意味着您不能执行类似于Dependency属性的一般实现这样的操作,这会导致诸如Dependency属性之类的讨厌的实现,从而导致代码片段和可读性较差的代码的过度使用。
指定通用类型需求的能力有限,例如通用求和方法,它同时接受int、double和bigint(不需要复杂的、通常是缓慢的黑客攻击)。
接口方法实现或虚拟方法重写不能返回更具体的类型或接受更一般的类型,即即使在C 4中也有有限的协变/逆变支持。
哇!!!!这是一个很长的列表!!
C是非常实用的,也是我的主要语言——但是在使用一个更为特殊的语言来处理一个特定的子问题之后,我经常想知道为什么C语言有一些局限性——特别是因为其中一些问题导致整体语言比更复杂的语言复杂——冒着C趋向于C++末端的频谱增长。就复杂性而言。不过,老实说,我不认为C真正解决这些问题是件好事。最好用一种新语言来修复它们,而不是处理一个更加复杂的兼容性场景。
我讨厌的是(Class) 和as Class 之间的区别。主要是与整个江户一〔2〕事有关。
Python,再次:
没有开关关键字。不,字典不是它的替代品。甚至没有一堆elif 声明。
换行处理不一致。为什么我可以这样做:
而不是:
1 2 3
from itertools import cycle,
islice,
izip
为什么我不能这样做:
1 2 3 4 5 6 7 8 9
if stuff \
and foo \
or bar:
return"Formated string with %(arg)s" % \
{'arg':"bloody slash
<div class="suo-content">[collapse title=""]<ul><li>使用括号来满足所有行继续的需要。</li></ul>[/collapse]</div><hr><P>Python:</P><li>全局解释器锁-处理这会使并行处理复杂化。</li><li>lambdas函数有点笨拙。</li><li>没有内置的有序字典类型。</li><li>根据python的编译方式,它可以使用ucs-2与ucs-4进行内部Unicode编码,许多字符串运算符和迭代器可能会对超过默认宽度的多字节字符产生意外结果。字符串切片和迭代取决于位宽度,而不是检查和计数字符。(大多数其他编程语言也会做类似的事情,并且对这些字符有类似的奇怪行为。)</li><li>围绕Python的GUI框架存在不一致性。</li><div class="suo-content">[collapse title=""]<ul><li>我对Python没有太多问题。我喜欢这门语言。但是3是非常需要的。</li><li>gil不会使并行处理复杂化。恰恰相反。如果不使用<wyn>multiprocessing</wyn>或类似的方法,gil只将脚本限制在一个CPU上。</li><li>它还没有内置,但3.1.1 Collections模块具有orderedDict类。</li></ul>[/collapse]</div><hr><P>目标凸轮</P><li>缺少命名空间工具。</li><li>Wordy类和对象规范。</li><li>复杂的构建系统。</li><li>不方便进行填充。</li><hr><P>方案</P><ul><li>缺乏静态类型</li><li>没有静态函数重载(由于上述原因)导致字段访问器的长名称</li><li>没有统一的对象系统</li><li>有点慢</li><li>相对较小的社区</li></ul><hr><P>C.*</P><P>我知道这很愚蠢,但我希望数据类型能够自己转换成我想要的类型,而不必添加<wyn>(int)</wyn>或<wyn>Convert.ToInt32</wyn>或其他任何类型。这只会节省我的时间。如果我写一些东西来输出一个<wyn>int</wyn>,然后发现我需要一个<wyn>long</wyn>,这让我很恼火,然后我经常不得不通过改变我所做的一切来使它工作。为我做吧!</P><P>对不起,我想不出五个,但我是新来的,所以也许我会回来再加一个:p</P><hr><P>克洛杰尔</P><ul><li>函数定义中缺少可选参数和关键字参数的内置语法。当然,您可以很容易地添加它,但这意味着图书馆作者不使用它。普遍破坏还没有被证明是一个好的替代品。</li><li>缺少方法组合(在普通lisp中找到的排序方法之前/之后/周围)</li><li>太依赖Java互操作,例如没有内置文件IO</li><li>有时我需要静态类型。这不是纯粹的仇恨;我通常更喜欢动态的,尝试将两者混合在一起基本上是不令人满意的。</li><li>对于内置数据结构,没有内置的快速二进制序列化格式,尽管我听说人们正在研究它。</li></ul><hr><P>我讨厌C++的五件事</P><ul><li>链接时间。使用分布式构建,我可以在运行链接器的同时重建整个项目。</li><li>没有标准的方法来防止内存操作的重新排序。使用写组合内存通常需要滥用volatile关键字。防止读取重新排序(在处理SIMD数学管道时通常对优化至关重要)通常是通过在例程中间注入一个空ASM块来完成的。</li><li>多步骤宏可以解决字符串化问题:</li></ul>[cc]
<wyn>#define STR_LINE2(x) #x</wyn>
<wyn>#define STR_LINE(x) STR_LINE2(x)</wyn>
<wyn>#define LINE_NUMBER STR_LINE(__LINE__)
做琴弦操作通常很痛苦。
非标准化printf变体的扩散(vsnprintf_s与vsnprintf_s)。
C++
涉及模板时出现的神秘错误消息
缺少模板约束(许多情况下,可以使用模板元编程解决,但这将导致无法读取代码(至少对于普通程序员而言),在大多数情况下)
指向成员函数语法的指针
C++标准委员会应该更频繁地发布Offic标准(或者至少发布对标准库本身的单独更新),我的意思是真正的Tr1是2005发布的,我们仍然没有标准库中的SydDypTR、绑定和类似的内容。
-
关于C *:
我讨厌没有关键字来指定从方法中抛出哪些异常就像在Java中一样。与使用XML注释相比,它是记录异常的更好方法。
我还想要一个更好的通用约束语法,比如约束的ORing和ANDING。
为什么一个方法不能返回多个值?
缺乏对语言中面向方面编程的支持。
为什么不能用属性为每个属性访问器添加注释?
缺少像Perl那样的内置regexp支持。
+1对于方法本身记录的异常。不得不去API看看我所做的一些调用可能会抛出什么,以确保我处理所有的案例,这真是太糟糕了。更好的是:一个代码片段,可以为所有可以抛出的异常添加catch()es。
Python
标准库在许多地方都违反了自己的风格准则。(PEP-8)
py3k的super关键字充满了不必要的魔力(你不能将它分配给其他名称,没有self就可以工作,为什么我们有这个显式参数?)
在PY2K中,Unicode支持不完整,而在PY3K(Unicode中的标准输入,没有二进制数据!)世界跆拳道联盟?创建一个新的WSGi标准是非常简单的。)
吉尔。非常有限的多线程支持(使用cpython)
pypi(python包索引)糟透了。嫉妒地瞥了一眼红宝石
PHP:
荒谬的assert()函数…它在代码内部运行eval()。
?>标记会删除后面的换行符吗?!
对数字字符串的奇怪处理(尝试将其作为数组键)
痛苦的Unicode支持似乎不再由php 6解决
低成本的入门意味着95%的人给PHP程序员起了一个可怕的名字——试图在5%的人中找到一个可以雇佣的人是疯狂的。
Python
python 3没有django。
静态类型。是的,动态类型是很好的事情,但有时我确实希望它是静态的。
正确的Unicode支持(在python 3中固定)
施工人员命名。我讨厌我的代码中所有这些下划线。
线程不是很有效
我使用Java,我最大的缺点是字符串操作效率低下。使用+运算符时。说真的,编译器不能计算出我要添加多少字符串,然后在后台为我生成StringBuffer内容吗?
通常,使用+的代码比一系列StringBuffers操作更可读。
另外,我讨厌本地数组和集合框架之间的冗余。.toarray()的语法非常难看。
如果在单个语句中使用"+"进行字符串连接,编译器会将其转换为StringBuilder.append()。但是,这不会发生在多个语句中。
我指的是多语句情况。我希望能够编写一系列变量和常量字符串文本的串联,并让编译器找出在编译时要合并哪些文本,然后自动为哪些文本添加StringBuffer内容。
我只看到一件事,问了五个问题。
实际上,有两个……我的其他蜜蜂已经被其他人提到了,所以这就是三角洲:)
如果没有多个线程访问,那么您可能应该使用StringBuilder而不是StringBuffer。它更快。
我真的不喜欢这种微观优化。大多数时候,编译器足够聪明,可以使用StringBuilder,如果不是,我通常不会介意额外的微秒。我更喜欢可读性,并在需要时进行优化。
EL表达式语言,EDCOX1 0和EDCX1 1在JSP页面和JSF 2 FACELET中被用来从底层Java代码中提取数据。
所有有趣的事情,比如带有参数和基于注释的命名方法调用,都只存在于Java EE 6中的EL中,它只在GalasFISS V3中可用。
对于1)为早期的servlet 2.5容器获取正确的jar,以及2)让它们在不干扰容器中以前的任何可用实现的情况下工作,这是一个极大的痛苦。
只有早期版本的jsf(如1.2)会取消方法调用,让您使用f:setpropertyactionlistener-http://weblogs.java.net/blog/2009/07/22/say-sayonara-spal-相信我,这不是很好。
EL解析器不知道它要解析和解释的代码片段来自何处,所以您倾向于为所有内容提供一个ID,这样您至少可以识别出哪个标签使它变得暴躁。
Eclipse在每个EL方法调用时都会发出警告,因为它是JSF1.2。也一样。
哈斯克尔
有时类型系统感觉是向后的。如果我不希望编译器为我的变量推断类型呢?如果我想要相反的结果,它在哪里对所说的变量进行约束检查呢?例如,它不是推断列表元素的类型,而是确保它们都属于特定的类型类。这是一个微妙但巨大的差异,使我很难为统计研究所编程。这是可以做到的,但它比其他一些语言需要更多的努力。Haskell为非用户界面部分提供了支持,但是我把用户界面留给了一种非类型化语言。
允许构造无限值有时会导致一些真正令人沮丧的错误。
命名限制。
有时发情的处理会让我很恼火,直到你的程序崩溃,你才知道,因为你把它们弄混了。当我们丢失本应阻止此操作的类型信息时,这里出现了问题。
类型类应该自动为一些小的案件派生,比如证人类型,但在那里有很强的滥用潜力。
Re 1,您的意思是有一些类型约束,您想强加,您不能使用像foo :: SomeTypeClass a => [a] 这样的约束吗?
Python
lambda S.grrr中无报表
foo( a for b in c if d ) 感觉不对,每次我摆脱它,它都让我吃惊。不是应该是foo( (a for b in c if d) ) 吗?
我能听写理解吗?
map和filter操作符在列表理解中有特殊的语法,如何减少呢?还是排序?
只需在其中包含一个yield 语句,函数就可以神奇地转换为生成器,并且其接口完全改变。此外,在第一台next() 之前,该发电机不能进行任何工作。至少,不使用返回生成器的函数。
JavaScript
没有用于生成模块化代码库的简短语法。必须调用返回公共方法字典的函数。每次修改模块的接口时,都必须在(至少)两个地方对其进行编辑。
创建闭包涉及从返回函数的函数返回闭包("sup dog)yo"函数。杂乱!
for each ( foo ) 的语法和行为让人感觉像是事后诸葛亮。
知道代码何时实际运行(以及以何种顺序运行)更像是一门黑暗的艺术。唯一正确的方法就是把所有的东西(是的,那也是)放在一个大文件里。即使这样,您仍然需要等待一个document.onload
我错过什么了吗?在不手工构建JSON序列化值的情况下,是否没有简单的方法来获取这些值?(是的,jquery可以这样做,有点)。
PY3K中提供了听写理解。
@SilentGhost:我确实看到了,我很高兴这一点和其他的变化,但是直到PY3K得到广泛的认可,它才是天上的馅饼。
dict((f(k),g(k))代表K,在keymaker中)
普通LISP
缺少用于更现代功能(套接字、线程等)的标准库
可以使用映射到本机窗口系统的标准化UI
方案将lambda表达式赋给变量并将该变量直接用作函数调用的能力看起来更适合funcall。我想多个名称空间的副作用
库的标准化源代码级打包系统,以便从多个实现中轻松使用
我想知道强类型的Lisp是什么样子的
我假设"强类型"是指强静态类型(大多数lisp避免隐式强制等)。它可能看起来很像PLT的打印方案。
是的,对不起!我一直在研究haskell,非常喜欢它的类型系统(好吧,不管我到目前为止理解什么)。我来看看打印的方案,谢谢你的提示
>我想知道强类型的Lisp是什么意思,像qi?
R(R-统计项目)
糟糕,糟糕的弦支护
对于一些简单的描述性任务,比如交叉表,令人惊讶的困难
大数据集操作在内存中完成。
c=355;
基于方法参数的运行类型的多调度缺陷。这应该是最重要的,但还没有释放出来。
界面实现是声明而非结构的。我真的喜欢谷歌的语言是做什么的
异步呼叫方法真的很漂亮(我很确定所有的线索都是骨头,而不是轻量级的线索)
没有宏系统。我不是在谈论C型宏观;我在谈论Lisp/Scheme型宏观
操作者是静态的方法,他们的签名被过度限制(你不能创造新的人)。
C
位字段——它们没有被语言很好地指定,它们的工作方式依赖于编译器和体系结构。
通常很难找到在大量代码中定义特定符号的位置,特别是如果该符号是由宏生成的。这提醒了我…
预处理器是一个相当丑陋的黑客,可以忍受各种各样的虐待。
缺少标准大小的整数(最近由uint*进行了修正,但有许多旧代码在那里浮动,其中包含自定义typedef或为dword、word、byte等定义)。
缺少与Perl的cpan.org类似的东西(很乐意出错)。
编辑:当我想到C的CPAN时,我想…我会怎么称呼这件事,想到"ccan",然后在谷歌上搜索,我发现了:网址:http://ccan.ozlabs.org/
不过,它似乎还处于初期阶段。
比特场太棒了!我不针对多个编译器和体系结构,所以我不知道它们不可移植。我想可以理解。(如果C没有工会的话,我会说比特场也没问题。)
如果C还是"性感"的话——我们现在有了解决所有这些问题的技术。但是没有足够的程序员关心。
珀尔
我喜欢这种语言,我不想添加已经使用过的东西,但还没有人提到过,所以我会把它扔到锅上。当我使用这个特性时,我发现它是我生命中最可怕的经历(我曾经用汇编语言工作过):
它们只有一种最糟糕、最丑陋、最恐怖的语法,但它们无法提供比使用某些(非常漂亮的)printf() 工作所能实现的功能更多的功能。没有人应该尝试使用这两个函数来做任何输出,仅仅是因为它们有多糟糕。
我相信有人会不同意,但是当我调查他们时,希望他们能解决我的问题,我发现他们是一个"痛苦的世界"(引用大lebowski),并希望perl6已经摆脱了他们,或者,更好的,完全重写他们,使其更有用。
当我第一次学习Perl自动生成报告时,我使用了很多。关于格式/写的精彩之处在于,您可以从格式字符串中看到报表的外观(或多或少)。但至少可以说,这一机制是笨拙的。现在有更好的解决方案。
FORMAT()对页眉、页脚和页码进行分页和应用,这些都是您在使用printf时必须自行完成的。format()还可以处理换行等。
@布赖恩德福伊:好的观点。我没有足够的空间来提到我用来做这些事情的替代方法:。如果您需要纯文本,pdfotex工作得很好。
JavaScript;
如果你不清楚自己在做什么,"this"的动态绑定是非常混乱和危险的。
函数声明需要关键字"function"。这不是我反对的打字方式,而是当我想做一些稍微聪明的事情时阅读它。嗯,现在我想起来了,也许这是一个优点。阻止我做聪明的事。
作为数字2的结果,如果代码段很短,那么复制/粘贴代码段的代码(就字符而言)通常比将其声明为函数的代码要少。不幸的是,这会导致不好的实践,尤其是在我自己的代码中。
Javascript通过拥有第一类函数和闭包来实现作为函数语言的动作,但无论是在运行时还是编译时,都无法验证函数中的引用透明性。如果不这样做,一些架构就会变得很危险或者很庞大。
它的名声非常糟糕,因此我不能对任何人说"我用javascript编程",而不被嘲笑。
我要冒险出去,因为我不能真的全职使用它,但我还是会试试的!
Perl 6
FUNC(FRW)!= FUNC("FRW")
这让我很恼火,但有很好的理由。在Perl5打印版(5+6)*10中,时不时还会收到我的消息
在很多地方解析可能比Perl5容易,但有时它仍然会杀死我的编辑器。
它仍然有很多线路噪音Perl5,这让很多人害怕。这意味着很难让他们兴奋等。
目前还没有图书馆。
如果Perl6最终确实支持Perl5,这将是一个没有问题的问题,但这可能是一个不值得承担的负担。
没有repl,或者Ruby称之为irb。
一个具有制表符完成、颜色编码等功能的固态交互式Perl6将使使用和学习它变得更好。
目前的文档基本上是英文规范,不太容易阅读。
我知道这是一个愚蠢的陈词滥调,但它还没有出来!
前三个是语言,其余的不是语言本身,而是它还没有过时的事实。
只有两个与语言有关。剩下的是工具,这些东西会改变。所以,只剩下三个了。:)
PHP
几乎所有的标准函数都在全局范围内
函数参数顺序不一致
函数命名不一致
不区分大小写的函数
根据php.ini文件的不同,脚本的行为可能会有所不同
能够使用未定义的变量
在某些情况下,必须先将结果赋给变量,然后才能在函数中使用它
更主观地说:
配置文件的目的是更改行为。为什么有问题?你能提供更多关于"可怕的错误捕捉"的细节吗?
@关于配置文件,我指的是php.ini文件。像magic引号之类的东西使得编写在任何地方都能工作的代码变得更加困难。我记不起我说的"抓错"是什么意思(因此我把它从答案中去掉了)
到目前为止,我最讨厌我最喜欢的语言的是我的选择一直在变化。每次我觉得我找到了一个,我就会找到五件(或更多)我讨厌的事情。然后那边的草看起来更绿了…
C++缺少良好的重构工具,缺少检查异常
Java缺少模板,缺少EDCOX1×12关键字
你在Java中没有EDCOX1,2个关键字,但是你可以用同样的方法声明一个方法,一个变量,甚至一个类!使用final 关键字
不是真的。"方法和类的final与变量的final含义不同。对于变量,"最终"与C++中的"const"不一样,参见StAdppOrth.COM/Quase/502430/& Helip;爪哇中根本没有"const正确性",可以将数组声明为"最终"并修改其内容。
C++:
缺乏象征意义。
过分沉迷于C兼容性。
极其复杂的预处理器。
模板错误几乎无法理解。
没有垃圾收集。
vba(因为你认为你的语言不好)
一行中的空白是严格的强制执行的
语句刚刚结束,需要一个"uu"来中断到下一行,但并非每一行都能被打破。
没有++、--、+=、-=语句。真的吗?
数组可以从任何索引开始,而不仅仅是0。
某些类型(即定点"十进制"值)必须是变量的子类型,不能作为自己的类型使用。
!=和< >。
"="用作比较器和赋值,而不是拆分为"="和"="。
"选项显式"。
自2000年以来,用户界面一直没有更新。
Office2K7没有升级到vb.net
大多数对象模型都是非感性的,过于冗长。
我没有用过很多vba,但是用于比较和分配的= 听起来很糟糕!在数学表达式中,我一直使用==,我猜想像x=x+(x=0) 这样的东西是语法错误(或者是不可预测的)(尽管我从未真正使用过这个例子)。
C:
1)静态方法必须是类的成员
2)静态扩展方法只能添加到静态类中
3)接口函数的实现没有用"override"之类的东西来标记,以表明它们来自于基类或接口(这使得很难确保只使用代码检查来覆盖您期望的方法(使用正确的签名)。
我只有3个。我想那很好。
C.*
1)缺乏编写值类型泛型的实际能力。例如,任何白痴(大多数白痴)都可以编写一个例程,计算C++中的int、浮动、双等列表的标准偏差,它是直接编写、易于阅读和执行的快速非泛型代码。我认为,如果你能用C语言写一些东西,而不至于在其他2语言上搞笑,那么你就是一个非常棒的程序员。
2)协方差和反方差,尽管这是加在4。
3)LINQ的文档非常糟糕(好吧,不是语言的一部分)。
4)每当我想做同样的事情时,尝试使用foreach/iterators,除了上次略有不同的事情(例如,用逗号在字符串和单词之间以及最后两个字符串之间具体化)。如果我用IEnumerable编写它,就很难编写和读取它,而用for(int i=0 i<…)编写它的效果并不好,而且效率也较低。
5)我知道我会收到关于这方面的投诉,但没有经过检查的例外情况。这不需要以Java的方式实现(框架开发人员在他们为什么不这么做的情况下做了一些很好的说明),但是我会很高兴编译器警告那些不喜欢检查异常的用户可以关闭。
如果要用逗号连接字符串,请在第一次迭代中以不同的方式进行连接(除了第一次迭代外,其他所有迭代中的字符串都是用逗号进行连接)。这比在上一次迭代中做不同的要容易得多。
C.*
泛型参数不变 c 4.0为泛型类型引入协方差和逆变
可重写的类成员必须显式标记为虚拟
爪哇
原始数据类型不是对象:这有什么问题?自Java 5以来,你有自动装箱/解包
好吧,.NET一切都是一个对象,包括基本数据类型(唯一的区别是它们是在堆栈中分配的)。这种方法的优点是可以直接将行为(方法)添加到基元类型,而不必使用单独的"实用工具"类,如Java。
自动氧化很糟糕。把一切都变成一个物体。在极少数情况下允许访问原语。问题是对象不能覆盖许多运算符,如-和*等,因此不能使其在整数对象上工作。Java的泛型怎么样?使用泛型时无法强制转换,必须取消对象的能量化。太蠢了。
C + +
它需要太多的时间,使一个简单的代码段。
for(性病::向量:const迭代器iter _ = [……]
vector.remove(不删除)。
vector.push _阵线(一)不存在。
头文件
NO的λ
如果没有空的虚拟destructor自动至少有一个虚拟函数。
Boost至少解决了2和6。其余的,我同意你的看法。
3,是的。它只是不删除。4使用DEQE。
7。理由是,如果派生类不添加任何非pod成员,则可能不需要虚拟析构函数。这里解释:WWW IGM.MUV.FR/DR/CPP/C++-FAQ/ValueStudio.HTML。我认为它应该强制您声明一个析构函数为"nonvirtual~classname()",让它知道您已经考虑过了这一点。
2。对于每个(v.begin(),v.end(),foo);3.std::vector没有移除成员函数。也许您的意思是std::remove_if()?使用member函数erase从容器中删除元素,并删除要由谓词删除的元素。4。谢天谢地,因为这样它就不能作为一个线性数组工作,或者它会使分配器更加复杂。6。使用Boost的lambda。
#4对于一个向量不能有效地实现。所以不要责怪C++,而是选择适合你需要的容器类。
C#
I'm very happy with C# but these two really annoy me:
Constructor-based initialization for immutable classes is less convenient, less intuitive (when you read the code you don't understand what you assign to what), has less IDE backing than inline object initialization. This makes you lean towards mutable classes inevitably. I know this has been mentioned before, but I strictly have problems with initialization syntax for immutable classes.
switch 太冗长了。每当我看到一个开关合适的情况时,我真的倾向于使用if..else if.. ,仅仅是因为它更简洁(大约少打30%)。我认为切换不应该有错误,应该隐含break ,case 应该允许以逗号分隔的值列表。
抱歉,您的无知,但是不可变类型的基于构造函数的初始化有什么问题?
首先,您必须编写一个并在其中编写所有冗余的赋值语句。另一方面,可变类通过在构造函数指令之后分配属性来支持内联初始化语法,这要容易得多。其次,对于参数化的构造函数,很难知道分配给什么。内联初始化向您展示了这一点。.NET 4.0使用命名参数部分解决此问题。在许多函数语言中,不可变类的构造函数实际上同时起到了"成员定义"的作用,这为您节省了很多。见F或scala。
C.*
不容易检查类型是否为数字
这意味着您可能无法使用大多数Microsoft堆栈、IIS和MSSQL。
C不是针对特定问题的特定工具,而是尝试成为每种范式的语言。
缺乏社区。当然,现在已经开始出现面向C_的开源框架和库。与Java开发人员多年来所使用的相同。
很难找到好的帮助。互联网上到处都是关于如何解决C_问题的糟糕例子。这又回到问题3。
JavaScript
根据ECMAScript 5规范:
好吧,我有点喜欢最后一个,但有7种困惑
原型继承很好,但是你必须知道你在做什么:)。JavaScript是一种很好的工具语言,但对于实现某些逻辑,我更喜欢类型检查,并且只使用ThinhJS层。
是的,一直困扰我的是设置继承链,但这是一个很好的方法:closure library.googlecode.com/svn/docs/&hellip;
所有这些对我来说都很有意义…为什么有些人觉得这些概念如此困难/烦人?我喜欢松散而严格的比较和使用实例。还有数字作为浮点数意味着它们就像现实生活一样工作。原型继承是我最喜欢的特性…在你的帖子里有理由解释他们为什么让你生气是很好的。
我不认为有必要保卫1。==是一个超级运算符,因为它执行类型强制,而且几乎不是您想要的。我确实认为,虽然它是正确的,但有一个不可能的值(NaN,空,未定义)不等于另一个不实际。我同意上帝希望数字是浮动的,但是要检查浮动数学的界限(ji-theta),以确保我们有可接受的操作值可以很快变老。最后一个是个笑话,但我确实觉得它令人困惑(太棒了)。这些都是给一种语言的爱的信,如果我能的话,我会用它来编码。
但仅仅是因为vb6毒害了整整一代程序员
我在以前是vb6商店的vb.net商店工作,在这里工作的每一个曾经是vb6开发人员的人都顽固地拒绝学习任何关于.NET的知识。他们的代码就好像它仍然是vb6,他们的应用程序就像vb6应用程序一样糟糕。我的老板积极地反对使用LINQ,因为她担心别人很难理解,这是真的,因为没人想理解。
我认为,如果微软只使用C的话,我们都会过得更好,这让我不得不说,因为我认为大括号远不如VB冗长的结束语句。
我同意(我正在用vb.net编码)。如果你环顾论坛和董事会,你会发现很多用vb.net编写的代码看起来像vb6,甚至vbscript……人们只是认为"它和往常一样",只是拒绝了解框架或新功能。甚至到目前为止,有人告诉我OOP"很难书写、阅读和理解",而VB6则容易得多。出于某种原因,我只在vb社区中看到这种行为,在我看来,拖动vb6名称空间是微软对vb.net做出的最糟糕的决定。
我同意他们在向后兼容方面做得有点过分,带来了许多不应该属于现代语言的垃圾。让我难过的是,他们现在不能真正解决问题,他们错过了机会,就像你说的,C有自己的问题。我们有一些顽固分子使用.NET编写VB6代码,但也不错。我记得10年前,那些老定时器用vb6编写COBOL/Fortran程序,现在这真的是一些糟糕的代码需要维护。一切都在一个功能和很多goto!
Python:
速度
静态分析(缺少)
仅限于一个表达式的匿名函数
Python 3
允许缩进的两个制表符和空格你会认为人们从过去学习(makefile)。只需选择空格和禁止标签。Yaml说得对。
缺乏流行的第三方图书馆标准库很好,但是让python 2如此强大的许多原因在于第三方领域。python 2得到了正确的答案:—)。
IEEE浮标编程语言中的浮点数令人困惑,因为它们不同于我们在数学中使用它们的方式。相反,数字操作应视为仅在需要时(即打印到屏幕)转换为小数点格式的表达式。我认为枫树和Mathematica做得对。
标识符的字符集太受限制list.empty? 优于list.is_empty 甚至len(list) != 0 。同样,process.kill! 比process.kill 更好。Ruby和Lisp说得对。
调用函数时,必须始终写括号如果我们能在明确的情况下省略它们,那就太好了。又怎么样了?dict.items 还是dict.items() ?鲁比也把这个弄对了。
Python:
没有标准的GUI工具包(社区对此进行了一轮又一轮的讨论,但似乎从未解决过任何问题)。
分发和安装python应用程序和库的工具和方法的演变是非常困难的。(尽管最近这似乎越来越接近修复。)
随着解释器的发展,cpython仍然很慢(尽管pypyy最近看起来相当不错,但如果它成为"标准"的python,这个问题就消失了)。
在不重写很多方法的情况下,不能对内置类(例如,list和dict)进行子类化,即使您只想简单地钩住一个事件(例如,要钩住正在添加到列表中或从列表中删除的项,您需要重写delitem、append、extend、insert、pop和remove——不存在子类"change"事件通知,也不存在子类"change"事件通知任何"受保护"的方法,它将上述所有方法使用的公共代码排除在外)。
直到发明了virtualenv,在一台机器上为不同的目的保持不同的Python环境才是真正的痛苦。
python:数组部分选择并没有提供您所要求的。
A[1]给你一个元素A[1:2]给你一个元素,而不是[A[1],A[2]A[1:3]给出2个元素
我讨厌这样,但也许那只是因为我主要在Verilog工作。
好吧,你只剩下四个了!
在我的书中,那5个都算!
当您执行[0:2]或[2:4]时,它是有意义的,它比PHP的array_slice()要好得多。
我仍然不相信,彼得!这两种方法都有两个要素,这正是让我恼火的行为。我会(并且确实)期望[2:4]会返回元素2到4(包括元素2和元素4)。
我相信用图形的方式更容易理解[0:2]->0 1 2 3 4 4 5 5 6 7->[0,1][6:7]->0 1 2 3 3 3 3 4 5 6 7 7->[6][6][6]->0 1 2 2 3 3 4 4 5 6 7->[6,7[[6,7[-3:-1]->0 1 2 3 3 3 4 5 6->[5,6]数字代表的是一个限值,而不是一个具体的位置[2:8]->0 1 2 2->0 1 124;->[2]
这是我学到的技巧:从第二个数字中减去第一个数字。它告诉你你要切片多少个元素。因此[5:6]将包含一个元素,因为(6-5==1)和[12:87]将包含75个元素,因为(87-12==75)
至少它与range()函数是一致的,所以您可以设置一个类似"小心!最后一个元素将被省略"
马蒂:当定义一个范围时,将一个终结元素放在一个标准的实践中,例如在C++中:EDOCX1×0是最后一个元素之后的指针;在C中:EDCOX1,1个,这里是EDCOX1,2个指向下一个数组元素的点。参见Dijkstra的文章is.gd/6fiz
如果它是包含的,那么它将阻止许多优秀的Python习惯用法。首先,S[0:len(s)]实际上会给出比现有元素更多的元素(尽管大多数内置类型实际上会将其视为S[0:len(s)-1])。另外,如何选择0项?可能是S(2∶1)?S[0:-1]怎么样?当前,它不会返回0项,而是返回除最后一个元素以外的所有元素。是的,我经常从数组中提取长度为0的切片(当索引是根据变量计算的时候)
Java-不支持语言层面的合成
雷布尔
REBOL是我最喜欢的语言之一。我不能说我有最爱,尽管哈斯克尔的排名也相当高。
它奇怪的语法在许多开发人员尝试之前就吓跑了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
use [email rules url] [
[cc]; A small DSL that sends email to people about URLs.
rules: [
some [
into [
set email email!
set url url!
(send/subject email url reform ["Check Out" url ])
]
]
]
; Global context
notify: func [ [catch] dsl [block!] ] [
unless parse dsl rules [
throw make error!"You screwed up somehow."
]
]
]通知[[[email protected] http://www.google.com][[email protected] http://www.yahoo.com]].
1 2 3 4 5 6 7 8 9 10 11 12
</li><li><P>递归方言很容易用<wyn>PARSE</wyn>进行验证,但很难进行评估。(这里的堆栈很有用。)</P></li><li>REBOL与许多流行的技术(尤其是XML)的集成非常差。我怀疑这在一定程度上是自大的,因为rebol <wyn>BLOCK!</wyn>数据类型几乎可以做XML所能做的一切。然而,现实世界中有XML。</li><li>没有Unicode。</li><li>得益于Altme,Rebol的用户社区非常孤立。我能理解他们为什么要使用Altme。它是用篮板写的,展示了它的优势。不幸的是,这也把他们推到了自己的小岛上。</li><P>即将到来的3号篮板有望解决许多问题,除了最后一个。</P><hr><P>爪哇:</P><li>非常不一致。</li><li>图形API有时很难使用</li><li>NullPointerExceptions不告诉您什么是空值</li><li>有时,我编写的程序不适用于不同的JVM,这是一个巨大的痛苦,与Java的"一次写入,运行任何地方"语句相矛盾。</li><li>秋千没有它应有的好。</li><hr><P>红宝石。</P><li>奇怪的范围规则-变量、常量和方法的行为各不相同。规则也会根据用于创建闭包的关键字而更改。或者你是在一个类,特征类,对象,模块,还是模块本身。然后是实例eval,它将规则更改为一组不同的规则。当一个模块被"包含"或"扩展"时,它们会再次发生变化,而这个模块本身对范围做了不同的事情。有些规则集不能通过元编程来模拟,所以必须使用eval。除非你使用的是Ruby1.9,这里的一切都不同。</li><li>名称间距基本上是无用的。如果您有foo::file,那么stdlib文件对于所有foo可能都是中断的。</li><li>Require语句已中断。如果两个文件相互需要,那么这些文件的行为可能会发生显著的变化,这取决于从其他地方首先加载的是哪个文件。</li><li>库会急剧而突然地更改API,因此您必须要求所有依赖项的特定次要修订号。对于系统中的每个Ruby应用程序。</li><li>rubygems包系统会覆盖"require"而不是将文件放在搜索路径中-因为当您可以替换系统时,为什么要使用它?</li><hr><P>C是我的最爱,但也很可怕。</P><ul><li>它有史以来最差的预处理器。他们为什么不用M4之类的东西?</li><li>整个头文件与源文件模型已损坏。帕斯卡说对了单位。</li><li>它需要在switch语句。</li><li>从void*开始的联合和强制转换会破坏类型系统。这使得垃圾收集者不可能。</li><li>没有嵌套函数。GNUC有这个功能,但它应该是标准的。</li><li>没有对分配的内存进行边界检查。有一些工具可以发现这一点,但是它们不会检测到错误,其中一段代码计算错误地址并写入分配给一个完全不相关的区域。我讨厌整个指针算术。</li><li>数组没有边界检查。</li><li>关于可移植性的问题太多了。即使wchar-t在不同的平台上也不同。</li></ul><div class="suo-content">[collapse title=""]<ul><li>顺便说一下,gcc支持switch语句中的事例范围。</li></ul>[/collapse]</div><hr><P>MEL(玛雅表达语言):</P><ul><li>一维数组:强制我手动同步两个或多个列表,或者使用分隔字符串来模拟更复杂的数据结构。当然,它们也是不变的。</li><li>单线程和慢速:导致整个maya应用程序在完成任务时挂起。由于无法杀死长时间的操作,而必须关闭并重新打开maya,因此可以获得额外积分。</li><li>脚本源路径不是递归的:这意味着要存储脚本的每个目录都必须添加到脚本路径中。</li><li>没有名称空间:强制不一致地使用命名约定,以确保全局过程不会发生冲突。</li><li>模式命令:每个命令都是模式的,这意味着创建、修改和查询操作都是通过设置标志来处理的。这也迫使开发人员使大多数命令返回数组</li><li>命令样式不一致:大多数数组命令实际上返回数组,但tokenize命令必须将数组作为引用,然后填充数组,而不是吐出数组。这和其他的不一致之处。</li></ul><P>这些以及其他几个原因是Autodesk采用Python作为第二代脚本语言的原因,这也带来了一些其他恼人的因素:</P><ul><li>并非所有的MEL命令都受支持:大多数命令都受支持,但有时您会发现自己必须使用mel()函数来执行某些任意代码。更糟糕的是,逃避你必须做的所有烦人的事情。</li><li>继承了模式命令样式:必须使用相同的create=true、query=true、edit=true。</li></ul><hr><P>我可以为python添加另一个:</P><P>给出一个清单<wyn>l = [l1, l2, ..., ln]</wyn>,然后是<wyn>repr(l) = [repr(l1), repr(l2), ..., repr(ln)]</wyn>,但是<wyn>str(l) != [str(l1), str(l2), ..., str(ln)] (str(l) = repr(l))</wyn>。之所以决定这样做,是因为列表中可能有一些模糊的条目,如<wyn>l = ["foo], [bar,","],["]</wyn>和<wyn>str(l)</wyn>将返回<wyn>"[foo], [bar, ], []"</wyn>,这"可能会混淆用户"。然而,这使得<wyn>str</wyn>不可能仅仅用于转储数据,因为list会终止"以可读格式转储数据"。噢!</P><hr><P>再想一想,再写一遍……</P><P>我讨厌PHP的五件事,尽管我喜欢它(没有特别的顺序):</P><ul><li>内置函数中的命名和参数顺序不一致。</li><li>多亏了SPL,面向对象的数组方法,但遗憾的是还没有字符串。</li><li>PHP本身没有真正的并发性,只有通过宿主WebServer的多处理</li><li>没有像在javascript中那样的异步调用</li><li>操作码缓存只能通过扩展。不是很糟糕,只是很烦人。</li></ul><P>这些语言特征(或缺乏)让我很恼火,但更大的问题是这些更多的人/社区相关的事情:</P><li><P>事实上,很多使用PHP的人对编程和良好实践一无所知,并且产生了非常混乱的代码。javascript也有同样的问题。</P></li><li><P>大量的教程/书教了非常糟糕的实践和风格。这可能是3的主要原因。</P></li><li><P>它的坏名声主要是因为3和4。</P></li><hr><p>My 5 for Delphi:</p><li>Procedures and functions aren't necessarily distinguished from variables if not parameterized(EG,I can have statement such as X:=Getpositionscreen;instead of X:=Getpositionscreen()</li><li>尝试/最后尝试/除了需要休息(以前曾说过,但它仍然是我的一个。</li><li>不,不。</li><li>能有一个多重对象(功能、全球变量、局部变量)来命名相同的对象,德尔菲会很高兴地尝试把你的意思包括在内。名字应该是独一无二的。</li><li>ODD if condition rules.一个单一的条件检查不需要一个()周围的检查,但如果我要多次检查,我需要一个()周围的检查,有时需要多次检查。</li><li>No inherited includes.如果我需要从窗口单元的一个基准功能和一个固有形式,我就必须把窗口都包括进去。</li><hr><P>必须假设我们有一种语言。是吗?</P><hr><P>斯卡拉:</P><ul><li>标准库的奇怪之处:它并不总是显示出最佳实践,而且还不够重视。</li><li>硬编码函数x,tuplex类</li><li>缺乏性能:吸气剂和setter是分开的,这违反了干燥,使诸如玻璃钢的事情几乎不可能。</li><li>需要=初始化属性</li></ul><div class="suo-content">[collapse title=""]<ul><li>"硬编码的functionx,tuplex类"——它们还有其他的选择吗?</li><li>没有什么。只是它将以参数化的方式优雅。</li></ul>[/collapse]</div><hr><P>Python</P><P>我只是不明白…</P><ul><li><wyn>math.ceil()</wyn>和<wyn>math.floor()</wyn>返回浮点数,而不是整数(可能是为了避免底层C函数中的整数溢出,但为什么不强制转换为python long?)</li><li><wyn>len()</wyn>是函数而不是方法</li><li><wyn>reload()</wyn>非常有限,10个模块中没有9个模块重新加载,只有当一个模块是导入的标签时才重新加载,也就是说,如果foo本身不是模块,则不能执行<wyn>from bar import foo; reload(foo)</wyn>。</li><li>可变的默认参数只有一个引用(为什么不为每个函数调用一个新的实例呢?!)</li><li>所有这些带下划线的变量——如果它们是如此私有,我们为什么会在代码中看到如此多的内置变量?获取命名空间!</li><li>字符串是不可变的-也许有一个很好的理由,但我遇到了很多情况,我想调整一个特定的字符…</li></ul><P>那些基于实现有意义但令人讨厌的…</P><ul><li><wyn>array.sort()</wyn>不返回数组(我想它发生在适当的位置)</li><li>列表/生成器的理解没有定义新的范围(只是<wyn>for</wyn>循环的语法结构,对吗?)</li></ul><P>还有一对用python 3固定的</P><ul><li>默认整数除法</li><li><wyn>global</wyn>只能引用顶级命名空间</li></ul><div class="suo-content">[collapse title=""]<ul><li>对于2,我相信len(instance)只是调用方法实例。</li><li>@当然,但是在句法上,<wyn>__len__()</wyn>应该只是<wyn>len()</wyn>的别名。</li><li>我完全同意你的看法。我只是说,如果你真的需要它作为一种方法,你可以把它作为一种方法。</li><li>我不太了解python,但我认为floor和ceil返回float的原因与c相同。<wyn>Math.Floor(double.MaxValue) > int.MaxValue</wyn>在c中返回true。</li><li>在c中,情况也是如此,在c中(c python是用它编写的),但是当达到int限制时,python int会自动转换为任意长度的long,这实际上意味着python程序员几乎不必考虑整数溢出。在我看来,c python是建立在<wyn>floor</wyn>和<wyn>ceil</wyn>的C实现之上的,转换为适当的python变量的步骤没有实现。</li><li>+我对Python最讨厌的是。</li><li><wyn>math</wyn>模块只是C的math.h上的一个非常薄的外壳。</li></ul>[/collapse]</div><hr><P>我觉得最喜欢的语言是不可能选择的。动态类型和静态类型无法进行比较,所以我只列出我使用的类型</P><P>C++:</P><ul><li>模板元编程语法不好。隐式<wyn>::value</wyn>将使其更加简洁。</li><li><wyn>->.</wyn>为什么编译器不知道我在做一个<wyn>ptr.thing</wyn>而只是为我做一个<wyn>-></wyn>?</li><li>我讨厌空白。所以整个<wyn>vector<vector<int>></wyn>必须是<wyn>vector<vector<int> ></wyn>,这会让我感到不安,然后每当我看到那行代码时,我就无法集中注意力,最后我试图找到使用<wyn>int[][]</wyn>或其他东西的方法。</li><li>宏。我个人喜欢宏的概念。但是用C++,我认为系统是一个黑客。</li><li>我讨厌江户十一〔七〕。</li></ul><P>Python:</P><ul><li>字符串不可变。这样我就不能只做字符串[4]="b"</li><li>通过引用隐式复制的列表。泄漏到[[0]*宽度]*高度问题</li><li>缺少尾部递归(每当我错误地键入递归函数时,我必须空闲地钻取以避免发出1000秒的错误消息)</li><li>字典键不接受列表/听写</li><li>缺乏深度范围。当我进行列表理解时,我不希望其中的变量影响外部范围</li></ul><div class="suo-content">[collapse title=""]<ul><li>alist=list("abc");alist[4]="b";…在Python中。</li><li>在xrange(height)中,u的宽度为[0]*而不是[0]*宽度]*高度</li><li>使用sys.setrecursionlimit(20)调试递归函数</li><li>python应该如何精确地使hash变为可变的,以便生成dict键?如果需要键的序列,请使用元组或冻结集。</li></ul>[/collapse]</div><hr><P>JAVA是根据许多慢的,但我同意一定程度的使用。</P><P>Java很有戏剧性。他们有很多课程只是为了你想做的一件事。但您知道xd的灵活性属性。</P><P>Java起初很难,但总是很有趣。</P><P>当你写一个简单的代码打印"你好,世界!"请不要使用Java!我相信我是有道理的。</P><P>Java是一种混合,所以不要说它纯粹是一种面向对象编程语言。</P><P>还有很多,但我只限于五个XD。谢谢!</P><hr><P>红宝石</P><li>无类型推理</li><li>方法/函数不是第一类对象</li><li>虽然块变量的范围是词法变量,但变量的范围不是词法变量。</li><li>内部DEF</li><li>super和super()的区别</li><hr><P>C.*</P><P>最讨厌C的宠物必须是:</P><P>(1)事件具有对所有侦听器的强引用,从而防止对任何侦听事件的内容进行垃圾收集。如果你想看到这些问题,只需在网上搜索所有试图通过创建某种"弱引用事件处理程序"来解决问题的人。</P><P>(2)在调用之前需要检查事件是否等于空,这似乎是语言应该处理的事情。</P><P>(3)XML序列化程序无法在XML文件中读取/写入注释。在手工和用C编写的工具修改XML文件的环境中,这并不好。只需使用一个原始的XML文档就可以解决这个问题,但是能够将其抽象到类中会更好。</P><P>(4)构建过程不允许您直接访问XSD文件,而是需要一个中间步骤来创建C分部类。这也会导致XAML文件出现问题,有时需要重新生成两次,才能使更改正确地通过。</P><P>(5)不支持MMX和SSE 1、2、3、4等CPU内部特性,因此在运行C应用程序时,这些宝贵的CPU功能将无法使用。</P><P>其他没有进入前5名的人:</P><P>(6)无法将字段标记为属性,必须从get go显式实现所有属性:</P><P>例如,目前有:</P>[cc]public class MyClass {
private int someInt;
public int SomeInt {
get {
return someInt;
}
set {
someInt = value;
}
}
}
想要
1 2 3 4
public class MyClass {
[IsProperty(public, get, set)]
private int someInt;
}
(7)不支持多个返回值,例如:
1 2 3 4 5 6 7 8 9 10 11
public int, string, double MyFunction()
{
....
return x,y,z;
}
public void TestMyFunction()
{
int x, string y, double z = MyFunction();
}
(8)不支持协变返回类型
我有一些关于泛型实现的抱怨,但我会在那里解决的。我认为C是完成所有GUI、网络和配置管道的优秀语言,也是我在以长期支持的方式快速启动和运行的第一语言。
昆雅?社区太小。在附近找不到另一个说话人的时候,要想让一个好的语言沉浸程序运行几乎是不可能的。?不规则动词。是的,我知道英语和西班牙语也提到过,但昆尼亚是被发明的。为什么还需要不规则动词??不支持Unicode。在我能阅读大多数信息之前,我的电脑上必须有三种不同的Tengwar字体,其中一些字体的字距很差。考虑到罗马文字的存在,这真的不是一个大问题,但滕华是如此美丽,你不想使用它。?不是所有的概念都能在昆尼亚中被轻易地引用,导致恼人的迂回,或诉诸辛达林,N_Men_rean,或(manw?救我)克林贡让我明白我的意思。
红宝石:
明显的空白。对于解释器,除非语句看起来应该继续(或者显式地转义换行符),否则行尾=语句结束。
缓慢的
在线文档不如python的好(在防御方面,python的很好)
我提到过慢吗?
如果你想要快红宝石,你试过磁悬浮列车吗?语言从不慢。只有它们的实现速度可以很慢。:)
@布莱恩,大多数语言只有一个实现。直到最近Ruby才使用它,所以Yes语言可能很慢。
Python:
1)它是一种脚本语言,而不是完全编译的(我希望能够编译二进制文件——我不关心字节码)。如果我必须使用很多库(即每个使用我的程序的人都必须安装所有库,这基本上意味着没有正常人能够或有耐心正确地设置库,除非我做大量不必要的工作)。我知道生成二进制文件的方法,但它们并不总是有效的,我猜无论如何它们都会将解释器捆绑在二进制文件中(我不想这样)。现在,如果我能得到一个字节码编译器,它将包含我导入的所有文件的副本(并且只有那些文件)放在我的程序的文件夹中,这可能是一个合适的折衷方案(那么没有人需要下载额外的库等)。如果编译好的python文件可以压缩成一个单独的文件,其中一个文件被指定为在完成之前运行程序的文件,那就更好了。
2)有时似乎有点麻烦;有几次,原本应该工作的代码根本没有工作(没有程序员错误),特别是与"从modulex导入*"和其他与导入相关的问题,以及一些与全局和局部变量相关的问题有关的代码。
3)最大递归深度可能更高。至少有一次我觉得我需要它走得更高。
4)没有switch语句(更不用说允许数字、字符串和范围的语句)
5)更新的python版本似乎没有很多有用的字符串操作,而且它们似乎没有关于如何在没有它们的情况下执行相同操作的简单文档。
6)强制自动垃圾收集(我希望能够手动执行,尽管不一定强制执行)。
7)没有一个没有使用图形用户界面的预先制作的计时器类(可能有一个,但是在我做了所有的搜索之后,它肯定不方便找到!我确实找到了一些东西,但在我尝试它的时候它根本不起作用。)通过计时器,我指的是每x秒执行一个指定函数的排序,它能够在需要时关闭它,等等。
8)提供示例的社区中的人很少告诉他们导入了哪些模块,以及如何导入它们。
9)不太支持与Lua集成。
10)似乎没有办法向类的特定实例(而不是整个类)添加一个额外的函数,除非您使用具有所需函数的对象向该类动态添加一个对象变量(但仍然必须为此创建另一个类)。
对于10:如果c是一个实例,而f是一个函数,那么c.newfunction=f。"获取"(c)——不要忘记f需要有一个额外的参数(self)。
三。sys.setrecursionlimit(限制)--4.感谢上帝没有开关声明!——5。你是说字符串模块?所有这些操作都可用作字符串对象的方法。——6。gc.disable()相信我,你不想手动操作。只需一个调试GC问题的会话,您就知道我的意思了。——7。+1尽管Pyqt在qtimer上做得很好。——8。你一定没看过。——9。???——10。听起来是个糟糕的主意,但您可以在运行时向实例添加StaticMethods。对于绑定方法,这可以通过重写的__new__ 或__metaclass__ 来实现。
您可以很容易地将方法添加到具有Class.method = some_method 的类中。我刚用Ironpython测试过它,我认为它也适用于cpython。
+1点1
C
字符串处理
内存管理(决定谁应该分配,谁应该释放内存)
没有命名空间(最大)
标准库中没有列表/数组和其他基本DS
< BR>
JavaScript
使用不带var的变量会自动使其成为全局变量
分号不是必需的
比较运算符"=="和"=="及其用法的混淆
没有适当的支持来处理二进制数据
再一次。。无名称空间
变量没有块范围。(来自C世界的相当令人恼火)
Lua:
内置的错误系统绝对是可怕的。
您可以通过修改lua解释器来实现一个try-catch系统;但是它与内置函数抛出的错误不兼容。
事实上,他们有"newindex"而不是"setindex"作为setter
…只有当密钥不存在时,才会触发uNewIndex。如果是这样,则根本不调用元方法。
没有好的类型比较系统。
有type()函数,但它只处理基本类型(所有表都是表)。它确实需要一个用于类型比较的元方法。我以前用一个"is"操作符和一个"uuu"类型的元方法实现了这一点,它工作得非常好。
定义新的关键词是个婊子养的。
您可以这样做,但是Lua中的代码没有很好的文档记录,所以要找到您想要的结果是一种尝试和错误。当你想实现我在上面提到的事情时,这是一个主要的问题(尽管没有那么多的setindex,这是一个简单的修改)。
我不能在网络浏览器中使用它。
是的,这不是语言本身的问题,但该死的,我是否愿意使用Lua而不是JavaScript…:)
Python
没有名字
伪私人属性/名称芒格林(Mostly with Getatr).
文件路径操纵是跨越多个模块的扩展。彼此相依为命。通道呼唤不寻常,难以阅读,在大多数情况下,强奸毒品。Common filepath operations still don't have convenience functions,like getting a list of files in a dir.类型模块固定这是被拒绝的。
(EDOCX1,12)
Python Documentation(I'm very,very grateful there is documentation at all,and it's formated so nicely,but I hate wading through 5000 lines of quick-start use examples for find the individual function documentation for particular modular(I'm looking at you optparse and logging))建筑物类型在大约10个不同的地点有文件记载。
Python:
1)行继续语法:"…"有效,但"…"无效,且尾随空格通常不可见,没有编辑器的异常EOL标记。2)裸的"提升"在堆栈跟踪中不可见,因为堆栈跟踪看起来像上一个引发的异常。3)慢4)与Web服务器的集成较差(mod_python:dead,mod_wsgi:limited scope of operation)。这由3]复杂化,需要后台监控或某种内存持久性才能很好地执行。5)对混合选项卡和空格的过度容忍,允许控制流的更改有时保持隐藏。(可能在最新版本中修复)
Objul-C 2
严格遵守语言和运行时,而不是库,并且不按任何特定顺序:
缺乏CVARS。
没有模块。我对缺少名称空间并不感到非常不满意,但是模块将是很好的选择。
基于ivar的属性语法要求声明在3个位置使用变量名。这相当可怕。
C遗产。除了oo和gc之外,任何讨厌C语言的东西都存在。
对象不能位于堆栈上。与obj-c相比,它对其他语言的编程实践没有什么问题。例如,当在C++中获得堆栈返回值时,我觉得很奇怪。如果我在编写代码时没有真正查看库文档,我将假定每个函数都返回一个指针,这通常会在以后进行一些非常重要的清理。
length属性很容易与length()函数混淆;请改用size()。
在选择器字符串(""+$.month+"")中插入变量的语法很糟糕。
$(event.currentTarget)不总是用于冒泡和捕获
属性语法在选择器语法(".foot")不返回任何内容的地方起作用("[class='foot']")。
包含选择器([class~=done])有时在javascript(this.classname.search("done")>0)工作时失败。
卢阿
如果你做了foo.bar(1,2),那么在bar方法中"self"是零。你必须记住改为做foo:bar(1,2)。我宁愿让它被切换("self"应该在默认情况下被定义,除非使用":"运算符,或者调用一个不是方法的函数)。
默认情况下,变量是全局的。我宁愿放弃"local"关键字,改为使用"global"关键字。
未声明的变量被赋予nil。我宁愿收到一条错误消息。您可以通过操纵全局env的元表来回避这一点,但我宁愿在默认情况下实现它,并且能够停用它。
参数的多个返回值处理得不是很好。假设您有一个函数foo()返回1,2,3(三个值),bar()返回4,5(两个值)。如果您进行打印(foo(),bar()),您将得到"1,4,5"…调用时只扩展"last"元组。
(table length)运算符只在用连续整数索引的表中工作。如果您的表不是这样的,并且您想知道它有多少个元素,那么您需要用循环分析它,或者在每次插入/删除元素时更新计数器。
您可以使用基于环境的函数来规避2,方法是创建一个函数,该函数将自动将所有新文件设置为其自己的env。这可以同时用作文件缓存。我很惊讶你没有在名单上加上"非常可怜的Capi"。
好吧,那些最让我讨厌的5个人。我不使用C API。
Re 1:问题在于,对于所有内容(包括类),您都有一个数据结构,而类只是一个特殊的表。因此,您只是将表中的函数调用为Lua。尽管在函数调用中将环境设置为您所处的任何位置(而不是全局范围),这是很好的。
@对不起,我不明白你的意思。"您只是将表中的函数调用为lua"是什么意思?
是的,我说得不太好。我想说,"对Lua来说,"你只是在调用一个表中的函数。"
我懂了。在第1点上,我并不是说应该从语言中消除"不自我"的行为——我说应该改变它;所以foo.bar(1,2)通过"自我",foo:bar(1,2)不通过自我。我相信第一种是最常见的情况,应该使用最常见的语法。
对象Pascal:
在您正在编辑的文件中有很多来回跳跃的地方,因为接口和实现被分成两部分,但仍然被阻塞到同一个文件中。
数组的动态索引,字符串从1开始,声明固定数组时指定起始索引,动态分配数组始终从0开始。
类和对象(更不用说接口)被栓接在语言的顶部,除此之外,不能像记录那样进行堆栈分配。
当调用不带参数的函数时()是可选的,当您处理函数指针或试图引用使用函数名的函数的结果时,会导致很多麻烦。
没有外部类型定义,参数列表无法处理固定数组类型或函数指针类型。
这只是一种语言,一个标准库的抱歉借口和不可靠的IDE应该有自己的列表。
我刚刚发现在C中创建泛型方法时,不能将枚举用作类型约束。
微软对原因有充分的解释,但仍然如此。我疯了
1
public static T MyFunc<T>(string arg) where T:Enum //wont work :(
C.*
无法创建引用(var&t=struct)
没有本地作用域析构函数(IDispose接近但不相同)
ToString,我几乎不喜欢每个对象都有它,但事实证明我不喜欢像string.format那样使用它。我更喜欢接受某种类型的东西(如int、float、text、chars)。因此,我不需要传入任何对象,而需要传入带有隐式类型转换或接口的内容。最后我写了类似这样的东西来安全地避开HTML的文本,这非常有效。
无法使用虚拟类型转换(blah)obj;如果obj不继承/具有blah接口,则不起作用。简单的解决方法是提供一个带有转换函数的接口。
没有本地创建。我不想写var o=new item();我想写(类似于)Item o() (如果它有一个自动释放)。
Python:
没有表示块结尾的分隔符会引入歧义,这样自动缩进就不会与格式不好的代码一起工作。
无宏(修饰符不算数)
没有像haskell's cabal或perl's cpan那样的库自动获取
无法声明变量const(是的,可以扮演自己的角色,但是…)
元编程被削弱
差点忘了全局解释器锁
爪哇:
没有过程编码,它编译成过程代码,所以让我使用它!
没有多重继承,试图用15000个接口做同样的事情很糟糕。
约会课,我需要说更多吗?
我不能完全使用多态性。Java不会覆盖不同参数类型的触发器。
我想不出第五个原因,如果我想,我会回来编辑这篇文章。
JavaFX
类型推理有时不起作用就像你所期望的,所以你经常需要明确声明类型。
DEF在C中表现为喜欢const,而不是Java中的最终
您可以通过访问index>=seq.length在序列中插入一个值,这实际上会引发一个编译器错误(根据引用)。
如果将空值赋给字符串,则默认为""。如果将空值赋给整数,则会引发编译器错误(与引用所说的相反)。
以与RuntimeExceptions相同的方式处理CheckedExceptions
C.*
5。空合并运算符
这个??操作员允许您写:
而不是:
1
x = (y == null) ? y : z;
我喜欢这个接线员,但我想要另一个:
1
x = y ??? y.foo() : z.foo();
而不是
1
x = (y == null) ? y.foo() : z.foo();
我一直在用这种东西,我觉得打== null 部分很烦人。
4。平等者应该有更好的支持
我必须用以下方法开始每种Equals(object obj) 方法:myclass other=obj作为myclass;if(other==null)返回false;
你只需要写:
1
public override bool Equals(MyClass other) {...}
语言应注意提供Equals(object obj) 方法。注:其他应保证不为空。
三。不能对不同类型使用三元运算符
这不编译,我认为应该!
1 2 3
string foo ="hello";
int bar = 4;
object baz = foo == null ? foo : bar;
2。缺少命名空间private
我喜欢internal 保护,但我希望有一种保护,它只允许从同一精确名称空间内访问。这对于更好地控制大型类库中的访问是很好的。
1。无多重继承
我实际上只对接口的默认实现使用实现(类)继承,但有时我想这样做。
第一个实际上很容易用空的coalesce操作符实现:x=(y??z).foo();我还倾向于使用toString和空字符串来执行此操作:x=(y???)
好主意!(更多)
VB.NET
1)如果不是x是"foo"(而不是<>"foo") 2)"Orelse"和"Andalso"短路(而不是简单的"or"和"and",其作用不同) 3)无(非空)
高谈阔论:
死了很久
没有简单的分配(你不能说a := 3 ,你必须说put 3 into a
无限函数
没有实际数据结构,只有弦乐。用itemDelimiter 来做"列表",并用手工逃避。你也可以得到像EDOCX1那样的线条和词汇
作为一个集成电路,我认为冷冻特性的一个独特的高谈阔论特征是特殊的it 变量:
1 2
ask"How many years old are you?"
answer"You are" & it*12 &" months old."
C中缺少预处理器。
我知道他们把它忘了,因为有些人会滥用它,但我认为他们把孩子和洗澡水一起扔了。代码生成被认为是一件好事,在C++中,预处理器是我的第一线代码生成器。
-1,这本质上是一件坏事。另一种语言拥有它,并不意味着在C中包含它是一件好事。#
哦?????坏事?谁告诉你的?教授们什么都会说。我是其中之一。正是因为Java的发明者认为它太难做,并且找到了一些方法来使用它,这并不意味着它没有真正好的用途。这类人不告诉你的一件事是如何为自己思考。
你想要C的预处理器?它只是一个简单的文本替换器。如果有什么我想要的真实的Lispy宏,就像你可以在Nemerle(一个非常C类的.NET语言)中找到它们一样。
@氦:没有竞争。Lisp宏是最好的。
我只有一个,但我相信它值得分享。
CSPAC/NET
我们有length属性来获取数组中的元素数,count属性来获取集合中的元素数。如果考虑到clr会在场景后面自动添加ilist、icolection、ienumerable到从零开始的一维声纳数组,这看起来会更奇怪。
我相信CLR团队和BCL团队在讨论这个问题时遇到了困难;)
Python
缓慢的
我终于习惯了打印语句,现在有了这个打印函数????(PY3K)
没有Py2Exe或CxFreeze工作
不规范(轻微吹毛求疵)
仅递归深度100(IIRC)
默认递归限制为1000,请尝试:sys.getrecursionlimit() ;您可以使用:sys.setrecursionlimit() 更改它。
C 4
"动态"关键词,适合滥用。如果您想要/需要使用反射,使用并使其明显地显示您正在使用它,不要尝试用动态来伪装它。
-1:动态(goto,var,break,for,if,and…)有非常有效的用途,而且这不是5件事。
VB.NET
默认情况下为弱类型(选项严格会修复此问题,但默认情况下不启用)
方法上不需要括号(myFunction而不是myFunction()等)
数组定义/使用是否使用括号(myarray(12)而不是myarray[12])
不支持直接递增(i++)
是否支持传统的On Error 关键字和整个vb6命名空间
SAS
从来没有自己的想法(每件事都是借来的)。
贪图巨大的数据集。
使用Java,但从来没有学会做一个对象是什么。
窃取Perl,但将其隐藏在数据步骤中。
总是和统计学家撒谎!
我恨Python
告诉我关于Python的事
五件事我恨PHP
当它抱怨一个错误时
goto
引用引用(EDOCX1&9)foreach $arr => $val
无多遗传
没有编译出真实的作品,而没有牺牲一块羊羔到一个黑暗的上帝
Goto的事让我很惊讶。你能解释一下为什么不吃是件坏事吗?
goto 有时是有用的。许多人不知道如何使用它,不好地使用它,滥用它,或者盲目地教导别人以东(9)是黑暗的主撒但。它不是。它只是一个工具,你必须知道如何正确使用,就这样。反哥特十字军只是弱智的人,他们不知道如何做一些事情,因此希望没有人能够做到。
从php 5.3开始提供goto操作符。php.net/manual/en/control-structures.goto.php
参考资料有什么问题。你在里面放了一个"&;",这是一个参考。没有它,就没有了。问题出在哪里?
它们被窃听了:bugs.php.net/bug.php?ID=29992&edit=2
Perl代表一种可怕的语言。
无"公开"或"私人"或"受保护"声明/定义。
"my$variable_name;"不会在子例程外部声明全局。
"my$variable_name;"由子例程访问,但"use strict;"或其他"use"创建警告。
函数原型最终会出现无法解释、无法证明、不需要的或其他一些借口。
过度热情的符号在阅读符号球时会以"酷和快"结尾。
当一个人变热的时候,他们喜欢保持热,不需要任何东西来冷却他们。
经过一周的Perl之后,我最终无法编写函数并将其原型化。
模块到底是什么,它是否需要".pm"扩展名?
如果要创建一个公共变量并从子例程内部访问它,如何在不创建警告的情况下完成此操作?
你在哪里能找到一些能教人一些整洁Perl的整洁脚本?
我的变量不会专门创建全局变量。这就是重点。如果经过一周的Perl之后,您不能编写函数,那么您就没有使用LearningPerl。模块是一个库,并且.pm扩展名会自动添加到使用和需要查找的文件名中。
听起来好像你不打算在Perl写Java或C++。您应该在Perl编写Perl,并将Java留给Java:因为Perl不是您最喜欢的语言,所以不通过这个测试:
他没有说Perl不是他最喜欢的语言。只是他充满激情地恨这一切。也许其他语言更糟。