bri*_*foy 403 language-agnostic programming-languages
最近Stack Overflow上出现了一群Perl-hate,所以我想我会把" 你讨厌你最喜欢的语言的五件事 "问题带到Stack Overflow.拿你最喜欢的语言告诉我你讨厌的五件事.那些可能是让你烦恼,承认设计缺陷,公认的性能问题或任何其他类别的东西.你只需要讨厌它,它必须是你最喜欢的语言.
不要将它与其他语言进行比较,也不要谈论你已经讨厌过的语言.不要用你最喜欢的语言谈论你喜欢的事情.我只想听听你讨厌但容忍的事情,这样你就可以使用所有其他的东西了,我想听听你希望别人会用的语言.
每当有人试图将他们最喜欢的语言推到我身上时,我就会问这个问题,有时也会作为面试问题.如果有人找不到讨厌他最喜欢的工具的五件事情,他就不会很清楚这一点,无论是提倡它还是使用它来获取大笔资金.他没有在足够多的情况下使用它来充分探索它.他主张将其作为一种文化或宗教,这意味着如果我不选择他喜欢的技术,我就错了.
我不在乎你使用哪种语言.不想使用特定的语言?然后不要.您是否经过尽职调查以做出明智的选择但仍然不使用它?精细.有时候正确的答案是"你有一个强大的编程团队,有很好的实践和很多Bar经验.改变Foo会是愚蠢的."
这也是代码审查的一个很好的问题.真正了解代码库的人会对它有各种各样的建议,那些不太了解代码库的人会有非特定的投诉.我问的问题是"如果你能重新开始这个项目,你会做些什么不同的事情?" 在这个幻想的土地上,用户和程序员会抱怨任何他们不喜欢的东西."我想要一个更好的界面","我想将模型与视图分开","我会使用这个模块而不是另一个","我会重命名这套方法",或者他们真的不喜欢不喜欢目前的情况.这就是我如何处理特定开发人员对代码库的了解程度.这也是关于程序员多少的线索
仇恨并不是弄清楚人们知道多少的唯一方面,但我发现它是一个非常好的维度.他们讨厌的事情也让我知道他们对这个主题的思考程度.
Jer*_*hka 216
哇,我很惊讶SQL还没有在这里搞定.猜猜这意味着没有人喜欢它:)
......还有一些奖励它的奖励理由,不收取额外费用
Zar*_*nen 182
我讨厌Java的五件事:
我知道,我应该查看Scala.
jTr*_*der 159
JavaScript:
所有最酷的东西都是非常复杂的,但是,所有的冷静也包含在如此少量的代码中,你觉得愚蠢的努力追随它
对于弱类型语言的连接,'+'是一个荒谬的运算符选择.他们试图吓跑新手吗?
这是一个跨浏览器兼容性的雷区(更别说它是否打开了)
它通常是不受信任的 - 与诸如阻止后退按钮,永不死亡的弹出窗口等的捣乱有关.
调试几乎是不可能的,因为只有几个不同的错误消息和一些不同的类型(数字,字符串,对象等)
如果它不适合jQuery,我可能仍然讨厌它,就像我以前一样:)
too*_*php 148
PHP:
1)强迫我做出不必要的变量:
$parts = explode('|', $string);
$first = $parts[0];
Run Code Online (Sandbox Code Playgroud)
2)lambdas的实现如此蹩脚它大致等同于使用eval()
,所以我从未使用过这种可怕的错误(参见http://www.php.net/create_function).
3)一个try/catch系统,它只能捕获可能发生的大约80%的错误.
4)正则表达式支持就像lambda支持一样蹩脚,因为它必须写在常规字符串中,这是最难学习的编程工具之一,难度是其三倍.PHP应该是一种"简单"的语言?!?!?
5)无法在不写入两次或构建自己的函数或使用"@"运算符的情况下安全地从$ _POST中提取东西:
$x = isset($_POST['foo']['bar']) ? $_POST['foo']['bar'] : null;
Run Code Online (Sandbox Code Playgroud)
6)奖金回答:'@'.如果您无法正确编写代码,只需添加"@",对于以后必须调试代码的任何人来说都太糟糕了.
Chr*_*son 135
C++
Jon*_*eet 129
C#/ .NET:
lock
声明 - 相反,你应该有特定的锁定对象,并且应该有Acquire
返回一次性锁定令牌的方法.推论:每个对象都不应该有监视器.GetHashCode()
并且Equals()
不应该System.Object
- 不是所有的东西都适合散列.取而代之的是,有一个IdentityComparer
它做同样的事情,并保持IComparer<T>
,IComparable<T>
,IEqualityComparer<T>
以及IEquatable<T>
界面自定义比较.这些都是我的头脑 - 明天问我,我会想出一个不同的5 :)
Mic*_*urr 113
C
必须手动处理字符串缓冲区是一个容易出错的痛苦.由于如此多的计算实际上正在移动和修改字符串(计算机并没有像人们认为的那样在大数字运算时使用得那么多),能够使用托管语言或C++的字符串真的很棒对象来处理这些.当我必须在直线C中进行时,感觉就像在流沙中游泳一样.
小智 94
我恨"我讨厌某些语言的事情"列出的五件事怎么样?:d
5-绘制橙红色不会成为苹果.
设计语言时,设计师通常会考虑到它的用处.将它用于完全不同的东西可以起作用,但抱怨它不是愚蠢的.以Python为例.我确信有人会或某人有一天会创建一个实用程序来从Python代码创建exe.为什么上帝的地球,你会想这样做?这将是整洁的 - 不要误解我 - 但它没有用.所以不要抱怨它!
精心设计的项目可能包含来自多种语言的代码.这并不是说你不能用一种语言完成一个项目.有些项目可能完全符合您使用的任何语言的能力.
你站在木腿上吗?
平台可以对语言的作用产生很大影响.随着时下的垃圾收集者,或甚至帕斯卡早期尝试"垃圾收集",可以帮助内存淡化(也许malloc更多ram ??).计算机速度更快,当然,我们期望更多的语言.坦率地说,我们可能应该这样做.但是,为了方便编译器创建哈希表或字符串或各种其他概念,需要付出巨大的代价.这些东西可能不会继承到它们所使用的平台.要说它们很容易包含在一种语言中,只是告诉我你可能没有一条腿站立.
3-谁的错是真的吗?
错误.你懂.我喜欢虫子.为什么我喜欢虫子.因为这意味着我可以继续工作.没有错误,会有很多封闭的披萨店.但是,用户讨厌错误.但这里有一点冷水.每个bug 都是程序员的错.不是语言.具有如此严格语法的语言可以显着减少可能生成的错误数量,这将是一种完全无用的语言.它的能力可能一方面可能被计算在内.你想要灵活性还是力量?你有错误.为什么?因为你并不完美,而且你犯了错误.在C中采用一个真正可识别的例子:
int a[10];
for (int idx = 0; idx < 15; idx++) a[idx] = 10;
Run Code Online (Sandbox Code Playgroud)
我们都知道会发生什么.然而,我们可能有些人没有意识到的是......功能可能非常有益.取决于你在做什么.缓冲区溢出是该功能的成本.上面的代码.如果我真的把它发布给公众.那又是..跟我说吧......"我的错".不是C允许我这样做.
2-我们不应该把它放在回收站里吗?
很容易指出我们不理解的语言中的某个功能,因为我们不经常使用它并称之为愚蠢.抱怨它就在那里等.后藤总是在招待我.人们总是抱怨goto是一种语言.但我打赌你的最后一个节目包括一种goto.如果你曾经使用过休息或继续,你已经使用了goto.就是这样.当然,这是一个"安全"的转到,但它就是它.Goto有它们的用途.是否使用"隐式"getos,如continue或break,或使用显式gotos(对于任何语言使用实际关键字"goto").并非语言开发人员完美无缺,但通常......如果功能自时间开始就存在(对于那种语言).可能这方面是该语言的定义质量.意思是......由于向后兼容性,它正在被使用并且可能不会被闲置.它今天正在使用.和5分钟前一样.并且使用得当.嗯..可以说有人也使用它不正确,但这与我名单上的#3有关.
1. - 一切都是对象.
好吧..这个真的是#2的一个子集.但这是迄今为止我在仇恨列表中看到的最烦人的抱怨.并非一切都是对象.有很多不属于或不需要成为对象的概念.把东西放在他们不属于的地方只是丑陋而且会降低程序的效率.当然.也许并不多,取决于语言.这也与#5有关.这意味着......是的.全球还可以.与静态方法相关的函数是可以的.将OO编程与全局函数相结合是可以的.现在..这并不意味着我们都应该走出去,并从它的对象模型中"释放"我们的代码.在设计一段代码或整个项目时,在将它们组合在一起时应考虑幕后发生的事情.不仅在这个概念存在的地方还有许多其他因素.为什么将全局函数包装在类或名称空间概念中,如果它没有用处?获取静态成员变量.这非常让我感到高兴,因为......好吧......当然,取决于语言和实施,但总的来说,你刚刚宣布全球化.是的,有一些理由将这些非OO概念包装在OO包装器中.其中一个当然是自我记录代码.这是有道理的.所以......就像我说的那样.不要出去"免费"你的代码.但是,任何优秀的现代语言都将在其OO建模之外具有全局概念.是的,我特别指出,没有全局概念的OO编程语言很可能存在严重的设计缺陷.虽然..再次取决于语言的意图和设计,所以我不是试图挑选任何特定的语言,而且这里有太多的东西要分析.Anywho,考虑代码应该存在的位置并且是最有效的.将一堆闪光添加到不添加功能或支持的东西只会更快地磨损键盘.它没有任何好处.嗯..除非你喜欢那些可能错误地教你一切都是对象的人的布朗尼点.
简而言之,编程不仅仅是盲目地敲击键盘.任何项目都有很多设计考虑因素.我知道这是陈词滥调,但你必须从各个角度来看待它.即使是现在的类型安全语言.你不仅要删除代码并期望它能够正常工作.当然..它可能有用,但它可能不是正确的方法.总的来说,选择最适合特定工作和环境的语言和格式.但没有一种语言能够消除它背后的思想.如果你不在想......你只是在打字.
Rya*_*chi 88
我讨厌Java的五件事(目前,这是我最喜欢的语言)没有特别的顺序.
Myr*_*rys 73
Ruby有许多与其速度相关的缺陷,但我并不讨厌这些缺陷.它也有社区传福音过火的缺陷,但这并没有真正困扰我.这些是我讨厌的:
阻止传递给函数的方式很愚蠢.没有理由将块传递到参数列表之外,或者具有奇怪的特殊语法来访问(yield).我认为块应该被赋予一个不那么模糊的语法(或者哈希可以使用不同的分隔符;也许是<>而不是{}),并且作为参数传递给方法应该像所有其他参数一样.
object.method(1, {|a| a.bar}, "blah")
Run Code Online (Sandbox Code Playgroud)
这些奇怪的东西,比如块必须是传递的最后一个参数,并且传递多个块是不同的,语法更长,真的很烦我.
Bra*_*ert 72
混合使用的印记
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;
Run Code Online (Sandbox Code Playgroud)
例如没有这些是一样的:
$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'
Run Code Online (Sandbox Code Playgroud)在Perl6
它写道:
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;
Run Code Online (Sandbox Code Playgroud)缺乏真正的OO
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'}
}
Run Code Online (Sandbox Code Playgroud)
在Perl6
它写道:
class Dog is Mammal {
has $.name = "fido";
has $.tail is rw;
has @.legs;
has $!brain;
method doit ($a, $b, $c) { ... }
...
}
Run Code Online (Sandbox Code Playgroud)设计不佳的正则表达式功能
/(?=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\n" })/; # run perl code
Run Code Online (Sandbox Code Playgroud)
在Perl6
它写道:
/ <?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
Run Code Online (Sandbox Code Playgroud)缺乏多次派遣
sub f( int $i ){ ... } # err
sub f( float $i ){ ... } # err
sub f($){ ... } # occasionally useful
Run Code Online (Sandbox Code Playgroud)
在Perl6
它写道:
multi sub f( int $i ){ ... }
multi sub f( num $i ){ ... }
multi sub f( $i where $i == 0 ){ ... }
multi sub f( $i ){ ... } # everything else
Run Code Online (Sandbox Code Playgroud)运算符过载不良
package my_object;
use overload
'+' => \&add,
...
;
Run Code Online (Sandbox Code Playgroud)
在Perl6
它写道:
multi sub infix:<+> (Us $us, Them $them) |
(Them $them, Us $us) { ... }
Run Code Online (Sandbox Code Playgroud)I G*_*ICE 57
我会按照自己喜欢的方式做PHP,Python会做得太多.
无命名空间; 一切都在一个非常大的命名空间,在更大的环境中是地狱
在功能方面缺乏标准:数组函数将针作为第一个参数,haystack作为第二个参数(参见array_search).字符串函数通常首先使用haystack,第二针(参见 strpos).其他函数只使用不同的命名方案: bin2hex,strtolower, cal_to_jd
一些函数具有奇怪的返回值,这是正常情况:这会强制您在不知情的情况下声明第三个变量,而PHP可以通过其类型juggling有效地将空数组解释为false.几乎没有其他功能在做同样的事情.
$var = preg_match_all('/regexp/', $str, $ret);
echo $var; //outputs the number of matches
print_r($ret); //outputs the matches as an array
Run Code Online (Sandbox Code Playgroud)该语言(直到PHP6)尽力尊重近乎延迟的向后兼容性,使其在不需要时携带不良实践和函数(请参阅 mysql_escape_string与 mysql_real_escape_string).
语言从模板语言演变为全后端语言.这意味着任何人都可以在他们想要的时候输出任何东西,并且它会被滥用.你最终得到了模板语言的模板引擎......
它很糟糕,导入文件.你有4种不同的方法(include,include_once,require,require_once),它们都很慢,很慢.事实上整个语言都很慢.至少,比python(甚至是框架)和我收集的RoR慢得多.
不过我还是喜欢PHP.这是网络开发的链锯:你想要一个真正快速完成的中小型网站,并确保任何人都可以托管它(尽管配置可能不同)?PHP就在那里,它无处不在,安装一个完整的LAMP或WAMP堆栈只需要5分钟.好吧,我现在要回Python了......
Dón*_*nal 50
以下是一些我不喜欢Java的东西(这不是我最喜欢的语言):
gri*_*eve 40
C++
蟒蛇
Ken*_*ner 37
Objective-C的
1)没有命名空间,只是手动命名约定 - 我不介意在类分离方面,但我确实错过了能够在一行中导入命名空间中的所有类定义(如import com.me.somelibrary.*).
2)图书馆在RegEx支持等重要领域仍然存在一些漏洞.
3)属性语法有点笨拙,需要三行(在两个单独的文件中)来声明属性.
4)我喜欢保留/释放模型,但它比释放引用更容易,然后意外地使用它.
5)虽然不是真正的语言功能,但Xcode与Objective-C的使用密切相关,我不禁想到这方面......基本上自动完成,非常不确定.它更像是一个奖励你找到你想要的东西的系统,然后把它作为一个选择.但后来我想我从来没有喜欢自动完成引擎.
pet*_*hen 36
C++
字符串.
它们不能与平台字符串互操作,因此您最终会在一半的时间内使用std :: vector.未定义复制策略(写入或深层复制时复制),因此无法为直接语法提供性能保证.有时它们依赖于不太直观的STL算法.太多的库自己滚动,不幸的是使用它们更加舒适.除非你必须将它们结合起来.
各种各样的字符串表示
现在,这是一个平台问题 - 但我仍然希望,如果之前可用的不那么顽固的标准字符串类会更好.我经常使用的以下字符串表示:
建立模型.
我厌倦了所有的时间,包括什么,包括什么,前进声明,优化预编译标题,包括至少保持增量构建时间可以忍受等等.这在八十年代是伟大的,但现在呢?收拾一段代码有很多障碍,所以可以重复使用,甚至妈妈的狗也会听我的无聊.
难以解析
这使外部工具特别难以编写,并且正确.今天,我们C++人员大多缺乏工具链.我喜欢我的C#反思和代表,但我可以没有它们.没有很好的重构,我不能.
线程太难了
语言甚至不认识它(到现在为止),编译器的自由 - 虽然很棒 - 但是很痛苦.
静态和按需初始化 从技术上讲,我在这里作弊:这是"用于重用的包装代码"中的另一个难题:只有在需要时才能初始化某个东西是一场噩梦.所有其他redist问题的最佳解决方案是将所有内容放入标题中,这个问题说"neeener - 你不能".
当然,其中很多都超出了严格的语言范围,但IMO需要对整个工具链进行评判并需要进化.
Dan*_*idy 35
JavaScript:
该Object
原型可被修改.程序中的每个对象都会获得新属性,而某些东西可能会中断.
所有对象都是哈希映射,但很难安全地使用它们.特别是,如果您的某个钥匙恰好是__proto__
,那么您就遇到了麻烦.
函数参考时没有对象关闭.实际上,this
只要使用对象表示法或new
运算符调用函数,就不会设置任何对象闭包.导致很多混乱,特别是在创建事件回调时,因为this
没有设置为程序员期望的.
new
运算符导致this
设置等于全局对象,导致很多破坏.尽管两个操作根本不同,但加载运算符也会执行字符串连接.当您期望为数字的值实际上是字符串时会导致痛苦.
==
和!=
操作员执行类型强制.不同类型之间的比较涉及一系列规则,凡凡人都无法完整记住.这是由存在减轻===
和!==
运营商.
既存在null
又undefined
存在,具有微妙的不同但又多余的含义.为什么?
用于设置原型链的奇怪语法.
parseInt(s)
期望一个C风格的数字,所以将前导零的值视为八进制等.您至少可以parseInt(s, 10)
但默认行为令人困惑.
没有块范围.
可以多次声明同一个变量.
可以使用变量而不声明它,在这种情况下它是全局的并且可能会破坏您的程序.
with { }
.
真的很难用一样的工具JavaDoc的记录.
Gre*_*ill 34
蟒蛇:
__init__
)__getattr__
都没有)print
转到文件的有趣语法(但他们在Python 3中修复它)Jay*_*uzi 32
C#
我希望我可以switch()
在任何类型,这case
可能是任何表达.
不能将对象初始化程序语法与'readonly'字段/ private set
autoprops一起使用.一般来说,我希望语言帮助制作不可变类型.
使用{}
的命名空间和类和方法和属性/索引块和多语句块和数组的初始化.当它们相距甚远或不匹配时,很难弄清楚你在哪里.
我讨厌写作(from x in y ... select).Z()
.我不想回退到方法调用语法,因为查询语法缺少某些东西.
我想要一个do
关于查询语法的子句,就像foreach
.但那不是一个真正的问题.
我真的到了这里.我认为C#太棒了,而且很难找到很多被打破的东西.
Mat*_*ger 26
PHP
Bil*_*ard 25
C(好吧,这不是我的最爱,但还没有完成.)
编辑:如果我使用更多的库代码(就像我使用套接字,但那些特别糟糕),我可能会想出更多,但我已经觉得我在欺骗选择C.这么多语言只存在C的好部分,取而代之的是它有点像打死马.
Dav*_*ley 24
Common Lisp:
a p*_*erd 24
BrainF*CK
你的亮点是你图灵完成了吗?我可以在Perl正则表达式中做更多的事情!
缺少物体.来吧,人们!就像,你好 ......
没有网络库.我想要的只是刮一个网页,GOSH.
没有一流的功能.恭喜你 - 你得与你的Java朋友同情.
一个无限的磁带存储,没有别的.这非常自命不凡,我们不妨写Lisp.
Bol*_*ait 23
JavaScript的
oko*_*man 20
PHP:
不过是PHP 的(脚本)语言.;-)
Asr*_*n29 18
VB6
Ori*_*rds 18
Ruby是我最喜欢的语言,这是我不喜欢的:
Too*_*the 17
德尔福:
And*_*ech 16
JavaScript的
每个脚本都在一个全局"命名空间"中执行......在使用来自不同来源的脚本时,您必须注意这一点
如果使用了变量但尚未预先定义,则将其视为全局变量
浏览器供应商按照自己的意愿制定标准,为使用这种美丽语言的开发人员编写代码应该比它应该更难
区分大小写 - 考虑到没有合适的IDE来开发具有编译时检查的js
解决方法(如使用hasOwnProperty
方法)执行一些,否则操作简单.
wno*_*ise 15
哈斯克尔:
($)
可以改变运算符的相关性以使某些表达式更漂亮.其中大多数都没有达到仇恨的程度,并且有人试图为这些中的每一个修复或构建固体解决方法.
编辑:关于第5点有一些混乱.特别是有些人似乎认为我的意思是参数的顺序,我不这样做.而不是解释我的意思,我只是将人们指向以下链接,http://hackage.haskell.org/trac/haskell-prime/wiki/ChangeDollarAssociativity,它表达得很好.
Ste*_*ont 13
短暂聊天
Bla*_*ppo 13
我知道我迟到了,但仇恨是永恒的!
Java的
Phi*_*Lho 12
我喜欢这种语言,但有些事情让我困扰多年!
Sti*_*ack 11
VB.NET
AndAlso
/ OrElse
和And
/ Or
似乎倒退了.也许他们应该被转换.When
只能用于异常捕获.When
对某些其他事情做一个有条件的能力会很好.Not <obj> Is Nothing
.是的,这已经得到了补救IsNot
,但由于某种原因,我看到Not Is
过于频繁使用.(对于那些把英语作为第二语言的开发者来说,我更频繁地看到它,从这个角度来看它是否更有意义?)()
on ToString()
和大多数功能.(导致草率的编码习惯)_
打破一条线时必须要做.UpperBound
由容量完成的,而不是由容量完成的."Dim arr(2)as String"实际上将包含3个元素.=
是一个比较和赋值运算符.jfs*_*jfs 11
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不兼容.
jam*_*att 10
目标Caml
非并发垃圾收集器. 我可以整天编写多线程程序,但它们一次只能获得我的八个核心之一.这让我很伤心.
没有类型类(或他们的道德等价物). 有Furuse-san的GCaml,但它是A)不如类型类好,而B)不在INRIA发行版中.
非常需要可可桥. 认真.如果我用基于DNA的生命形式的实际接口编写更多代码,那么我可能会分解并自己编写这个该死的东西.为什么没有其他人这样做呢?
教友是可恶的. 说真的,模块应该是一流的价值观.应该只有一种功能.在你激怒我之前,请阅读Montagu和Rémy.
应该使用LLVM作为其后端. 我是谁必须谋杀才能让OCaml为我愚蠢的小ARM6核心编译?
所以,是的,我有一些问题.我仍然喜欢这种语言.这真是太棒了.
VBA(包括MS Office IDE):
1)不良文档
2)差错误消息
3)阵列操作例程不足
4)不得不重复DIM语句的类型
5)不会打印彩色(必须购买第三方插件)
我自己的前5名"我真的很讨厌c ++":
[5]自动生成构造函数,析构函数和赋值运算符.伙计,每当我不在课堂上宣布某些东西时,这意味着我不需要它,而不是我忘记它.你,编译器,听到我吗?!
[4]模板语法.哦,每当我决定从类体中提取定义时,我真的需要输入所有这些"<"和">"吗?
[3]字符串.Jeez,我厌倦了"const char*",我必须处理NULL情况,我必须浪费O(N)来获取它的长度,我必须为concat操作分配一个缓冲区.
[2]宏观处理.每当我不明白,我的编译器发生了什么,我就开始寻找一个宏.
[1]运算符重载.我看到代码"A + B*C",我不能说出这段代码是什么,直到我看到A,B和C的实际类型.
Delphi(又名Object Pascal),我将谈论本机版本,而不是.NET.
try except finally end;
对象创建过于明确:
var obj: TMyObject;
...
obj := TMyObject.Create;
try
...
finally
obj.Free;
end;
Run Code Online (Sandbox Code Playgroud)而是像
auto obj: TMyObject; // compiler adds the default constructor call and the destructor call in a try/finally block.
Run Code Online (Sandbox Code Playgroud)
i.ToString
而不是IntToStr(i)
.LUA:
global
关键字,反之亦然.if (type(var) == "string") then stuff() end
是一种痛苦.PHP:
$function($arg);
但这不算数.C/C++:
C
snprintf
.sprintf
使用它创建格式字符串太困难了,然后使用它以sprintf
安全的方式再次创建字符串.HAS_NO_SIDE_EFFECTS
不同的地方.为什么我不能只是抓住函数,切换编译器类型,然后通过宏调用将它插入正确的位置?C++
for(map<string, int>::const_iterator it = mymap.begin(); it != mymap.end(); ++it)
.foo(bar, &baz)
可以修改,哪些不可修改.我的语言是Java.以下是我讨厌的事情:
5.)缺少指针
4.)异常捕获
3.)布尔类型
2.)BigDecimal类型
1.)C#fanboys和Java fanboys
Boolean
可以为null.我发现这违反直觉.
BigDecimal
是一个图书馆,而不是语言功能.我有烦恼BigDecimal
和Exception
追赶主要源于写作已通过了一堆箍跳得到实际完成工作的测试类.我应该澄清我对这些事感到恼火,我不打算游说改变.
蟒蛇:
Groovy中/ Grails的
小智 6
JavaScript的
函数对象语法:
f = new Function( "foo", "bar", "return foo+bar;" );
Run Code Online (Sandbox Code Playgroud)
(它需要n个参数,第一个n-1是函数的参数,然后nth是实际函数,以字符串形式.这只是愚蠢.)
函数参数可以重复.
f = new Function( "foo", "foo", "return foo;" );
Run Code Online (Sandbox Code Playgroud)
最后一次重复是唯一使用过的重复:
f( "bye", "hi" ) // returns "hi"
f( "hi" ) // returns undefined
Run Code Online (Sandbox Code Playgroud)E4X应该死了.我的用户总是抱怨它不会按照他们的想法运作.让我们面对现实吧,当你需要一个页面和一半的伪代码作为一个setter时,是时候重新思考一下了.
stdin/stdout/stderr(和文件!)的标准概念会很好.
null!=未定义
必须处理它们是令人恼火的.有时候它很有用,但是大多数语言都设法用一个人来li.
蟒蛇
__init__
sys.modules[__name__]
)ActionScript/AS3
否则它实际上是一种很好的语言 - 比JavaScript更好,与流行的看法相反,比PHP好几百万倍.
C#
它是一种很棒的语言,尤其是LINQ,但与C++相比,泛型支持很差.它有很大的潜力,但目前的实现仅对强类型集合和类似的琐碎事物有用.它失败的一些例子:
static T Parse(string s)
往常会有用的东西.(TheRealType)(object)value
IList<string>
无法转换为IList<object>
,即使string[]
可以转换为object[]
.(不过,微软可能会在C#4.0中解决此问题.)蟒蛇.
虽然已经提到了python处理范围的奇怪方式,但我认为最糟糕的结果是这是有效的:
import random
def myFunction():
if random.choice(True, False):
myString = "blah blah blah"
print myString
Run Code Online (Sandbox Code Playgroud)
也就是说,if块内部与函数的其余部分具有相同的范围,这意味着变量声明可以在condional分支内发生,并且可以在它们之外访问.大多数语言会阻止你这样做,或者至少为你提供某种严格的模式.
此函数有时会成功,有时会抛出异常.虽然这是一个人为的例子,但这可能会导致一些微妙的问题.
哈斯克尔:
head
,tail
也可以调用error
并启动你IO
.fail
来自Monad
- 带回来MonadZero
.Num
班- (+)
本来应该AdditiveGroup
或相似.Monad
不是Applicative
.Perl 5的更多内容,从创建了大量Perl模块的人的角度出发,特别是在Moose上工作.
重载和绑定变量的可怕破碎.这两个功能都是尝试允许透明扩展内置类型的尝试失败.
它们都以各种方式失败,并要求像我这样的模块作者要么实现可怕的黑客来支持它们,要么说"永远不要将重载的对象传递给foo()方法".这两种选择都不可接受.
缺少适当的钩子进入编译过程和元模型.如果Perl核心允许我们通过一个允许我们挂钩到元模型(包,类等)的合理API来影响编译过程,那么Moose,特别是角色使用可以变得更加安全
语言中缺少命名参数.相反,每个人都重新改造.它很烦人.
同样,缺少可选类型.我不想要静态语言,但是指定类型和约束的能力,特别是函数/方法参数,将是很好的.Perl 6做对了.类型是可选的,但非常丰富,内置和用户定义类型之间没有根本区别.
向后兼容警察.这更像是一个文化问题.由于Perl 5对向后兼容性的强烈承诺,因此上述许多问题永远无法解决.因此,即使要添加某些东西,有效地取代当前的束缚和重载球,这些功能也永远不会被删除.当然,向后兼容性也是Perl 5最大的优势之一.
奖金仇恨:Perl的内置异常机制是一个笑话.异常可能是一个字符串或对象这一事实会导致异常繁琐的异常代码,而语言语法中缺少一个问题就是疣上的疣.
C++
库中的不一致与char*和std :: string有关.所有C++库都应该使用std :: strings.
字符不是相对于iostream的字节.我做了很多面向字节的工作.具有"字节"类型和"字符"类型将显着地使其更简单.这也将允许更容易扩展到Unicode.
位操作在值上应该很容易.我应该能够访问和设置值的第n位而无需播放和/或跳舞.
缺乏GUI的标准化界面.这就是微软真正能够很好地利用C#定位的地方.OS制造商提供的标准接口绑定对我的工作来说非常有用.
F#
类型推断是有限的.
它只向前传播.
F#不会尝试根据使用的方法和属性推断对象类型:当它没有线索时,您将获得"查找不确定对象类型"错误.
一个不能混合浮点数和整数:1 + 2.3是类型错误.
为了定义monad或计算表达式,必须创建一个构建器对象有点尴尬.在Haskell或Scala中,您可以直接在monadic对象上定义monad操作.
虽然首选#light语法,但缩进规则有时不是很直观或变得麻烦.
PHP
例如:
你必须输入:
<?php
if($x == NULL)
{
?>
<p><?= $x . ' is null' ?></p>
<?php
}
?>
Run Code Online (Sandbox Code Playgroud)
(不知道为什么SO再次将#5改为#1但是无论如何)
C:
Lisp的:
小智 5
我的母语......虽然它听起来比克林贡语更美,但这是一个语法地狱......
蟒蛇:
您通常在文件末尾有程序的入口点.(因为如果它调用模块中定义的任何函数,它必须在源中的那些函数之后发生.)我讨厌当你不得不花时间寻找程序的入口点时,所以我总是有一个简单的main.py
文件:
def main():
...
if __name__ == '__main__':
main()
Run Code Online (Sandbox Code Playgroud)引发异常时,只能由主线程捕获.或类似的东西.
析构函数是没用的,因为用Python编写它们可能会破坏垃圾收集IIRC.
我从未弄清楚相对导入在Python 2中是如何工作的.
我想在标准库中看到更多的集合.例如:链表,线程安全集合,......
Perl 5从最烦人到最少.
1.)向后兼容警察.是的backcompat是一种力量,但Perl 5太过分了.现在我们甚至没有用我们的语言获得新功能而无需明确启用它们.我更喜欢反向,如果一个新功能导致问题让我禁用它或强制执行旧的行为.例如perl 5.10添加say
我宁愿拥有no feature 'say'
如果我有自己的say
实现而不是必须放use feature 'say';
或use 5.010;
如果5.8工作但5.10没有.我宁愿不得不use 5.008;
限制我的代码只使用可用的功能,如果没有use version;
定义则包括5.8,那么它应该默认为你正在运行的任何版本,并建议不要限制它,除非你必须这样做.
2.)过多的锅炉板.
#!/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;
Run Code Online (Sandbox Code Playgroud)
现在你可以开始编码.由于#1,这不会改变.当然有这些东西的快捷方式,use common::sense;
或者use modern::perl;
会缩短上述内容,你可能需要一些略有不同的模块或pragma.但由于#1,我们永远无法将其减少到.
#!/usr/bin/perl
package Package::Name 0.01;
sub somesub ( $param1, $param2 ) {
}
Run Code Online (Sandbox Code Playgroud)
一些模块正在帮助解决这个问题,5.0.12中有新的软件包版本,虽然我认为它use 5.012;
首先需要,Method::Signatures
但允许使用该语法,但它永远不会完全解决(用语言).
3.)变量选择不佳
啜食一个文件
#!/usr/bin/perl
use strict;
use warnings;
open my $fh, "< foo" or die $!;
local $/; # enable localized slurp mode
my $content = <$fh>;
close $fh;
Run Code Online (Sandbox Code Playgroud)
wtf是$!
和$/
?重写要清晰易读.
#!/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;
Run Code Online (Sandbox Code Playgroud)
并且不要忘记,'-no_match_vars'
如果你不想受到性能影响,必须在那里.
怎么'没有直接创建匿名标量的方法?
#!/usr/bin/perl
my $scalar_ref = \do{ my $anon_scalar };
Run Code Online (Sandbox Code Playgroud)
难道他们不能想出什么?
#!/usr/bin/perl
my $scalar_ref = <>;
Run Code Online (Sandbox Code Playgroud)
哦,如何perl线程不友好,因为所有变量(包括特殊变量)默认是全局的.至少现在你可以使用my $_;
词法范围,并local
在其他范围内使用.
4.)非常难看的语法
MooseX :: Declare是一个更好的语法.我也希望 - >替换为.(个人喜好并不重要)
5.)太多的TIMTOWTDI或太多的最佳实践似乎你必须阅读3-5本书才能弄清楚你应该做的事情.
6.)之前(不再适用).不合理的发布.5.10.0具有功能5.10.1具有没有设置时间的功能直到下一个版本.现在它是每季度更新的功能发布.
7.)象牙塔透视.社区问题,似乎是大量想要进入高门槛的开发者,并认为可以不尊重地对待n00bs(或者真的是不同意他们的人).
8.)疯狂版本数字/字符串 Perl有浮点版本号,它们很难看.哦,开发人员不知道并非所有下游都以相同的方式处理版本比较.不是真正的语言问题
0.012 # simple
5.012001 # semantic
4.101900 # time based + version (for multiple versions in a day)
0.035_002 # prerelease
Run Code Online (Sandbox Code Playgroud)
perl中的所有有效版本...我们不能像...那样使用...
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
Run Code Online (Sandbox Code Playgroud)
加成
9.)升级后没有明显的方法可以重新安装所有XS模块
Python(3.1)
T if C else F
条件语句的奇怪的无序语法.bytes
文字看起来太像str
文字了.我们应该有类似的东西x'414243'
而不是b'ABC'
.str
在某些平台上是UTF-16,在其他平台上是UTF-32.(虽然至少它比2.x字符串有所改进.)numpy.array
.