最令人费解的编程语言?[关闭]


45

合理的通用编程语言中,您发现哪一种最容易弯曲?

我一直在听很多编程播客,并花一些时间来学习一些新语言,这些新语言被认为是即将到来且很重要的。我不一定要谈论BrainFuck,但是您认为哪种语言会挑战通用的编程范例?

对我来说,我在1990年代进行了一些功能和逻辑编程(例如Prolog),所以我不能说我在那找到了什么特别的东西。

我还远未成为专家,但即使到今天,对我来说,最令人吃惊的编程语言是Perl。并不是因为“ Hello World”很难实现,而是因为词汇上的灵活性如此之大,以至于某些最难的解决方案可以用诗般的方式分解,以至于我不得不走出航站楼以清醒头脑。我并不是说我可能会出售商业软件实现,只是有一个明显的原因使Perl声名远播。只需看看其中的基本书籍清单即可。

那么,什么是能促进您更好的编程和实践的思维语言


难道只是弯腰而已吗?

4
空格重要的任何语言!
mootinator 2011年

@mootinator-但是,只要您的文本编辑器不会给您带来痛苦,使用Python确实很有趣。
rjzii 2011年

1
@Thorbjorn有人要添加INTERCAL吗?与那个大爸爸相比,APL是一个初中项目。
马克C

Perl是最困难的。我今年12岁,可以轻松编程Perl。
动态

Answers:


73

杀伤人员地雷

这种语言非常强大且非常简洁,伤害您的大脑。

对于初学者来说,在没有自定义键盘的情况下使用技巧很棘手,或者至少要使用键盘覆盖来显示其使用的所有晦涩符号。

APL键盘

然后,该语言属于基于矢量/数组的范例,并且专门研究复杂的线性代数。原始版本甚至没有循环结构,通过将相当不寻常的数组运算符链接在一起就可以完成任何事情。

  • strip_tags()有人吗 (从维基百科借来的)

strip_tags()ala APL


18
+1显示键盘
tcrosley 2011年

5
@tcrosley:如果您有真实的朋友
那就太好了

4
而且,如果还不够灵活,那么就有一些操作员需要使用Backspace / overstrike键。例如,矩阵求逆是方形框(在L键上方)被一个分隔符(在键盘图像右上角的backarrow键旁边的框)所击中。
Tangurena 2011年

2
我回闪到1980年代初,当时我使用APL进行高级统计回归分析时,人们仍然使用它吗?不寒而栗。
HLGEM 2011年

2
我曾经做过很多APL-它仍然对我怀旧...我当时很喜欢它。
quick_now 2011年

56

哈斯克尔。它非常接近纯粹的功能,这是大多数人不习惯的。要求很高,一旦您知道自己在做什么,但在此之前感到沮丧,这将很有帮助;具有相当隐晦的,高度象征性的语法,一旦您知道它就很好,但是在此之前是不透明的...列表在继续。

另外,以一种对我来说看起来不错的方式格式化这些东西根本是不可能的。


7
我也会说Haskell,但不是因为它含糊不清。虽然可能很难理解,但令人费解的是关于其背后的理论。Monad和Arrows仍然是我尚未征服的领域:)
Matthieu M.

11
为什么“非常接近纯功能”?它纯粹是功能。
dan_waterworth 2011年

4
我想引述自己的意见,并补充说Haskell会如何改变您的想法:“ Haskell阻止您将东西推到地毯下,强迫您明确处理程序的结构,并且它教您一种描述这些结构的语言:类型的语言。了解类型,尤其是Haskell这样的丰富类型,将使您成为使用任何语言的更好的程序员。” 程序员
.stackexchange.com / questions / 28950 /…

14
Haskell是一种纯函数式编程语言。您在Haskell中编写的代码纯粹是功能性的(只要您不使用unsafePerformIO等)。IO-Monad纯粹是功能性的,如果您不这么认为,您将不了解如何使用monads以纯粹的功能性方式对控制流进行建模。将您的程序视为IO操作的购物清单,其中购物清单只是纯数据结构,没有副作用,而语言运行时是执行副作用的购物者。
Waquo

8
@Jon,我们同意:Haskell是一种语言,纯粹是功能性的,但它不是运行时系统。haskell程序的执行不纯,但是程序本身是纯净的。
dan_waterworth 2011年

30

前言。它与我初次接触它时使用的任何其他语言都非常不同。我喜欢它,所以我不讨厌语法或任何东西。


2
我走近Prolog的反向编程,希望已经知道我的答案,然后再进行编程,以获得问题:)
JE队列

1
@Xepoch:我想您可能就在那里,Prolog正在提出问题。使用的唯一正确的5GL语言之一。
2011年

总的来说,我认为Prolog是如此有趣并且功能异常强大,但是要想完全围绕切口放置(!)却很难。
2011年

+1 Prolog的,我有这样的使用Prolog的人工智能课程,只有唯一的计算机科学课程,我已经做得不好。
rjzii

Prolog并不是功能性编程语言。被Prolog破坏功能就像被Lisp破坏过程编程一样。
正确的意见

24

我会同意您在Perl上的观点。这是我见过的最丑陋的语法。他们说,即使是Perl开发人员也无法记住他们第二天写的内容。


2
Def在Perl上+1。我一直特别喜欢(我相信它们被称为)“隐含”变量。编写出色的只写代码。
GrandmasterB

2
每个人编写Perl的方式都如此不同,以至于他们可能会写不同的语言-您不必只学习Perl如何在其中拾取别人的代码,还必须学习该特定人如何使用它。
glenatron 2011年

3
ah这个答案和两个评论。编写良好的perl易于读写。新手撰写的Baby-perl很简单,即使冗长。唯一的“不可读” perl是有意混淆的,或者是脚本化了单行代码。
肖恩·麦克米伦

22

我不得不说福思。所有操作都是堆栈操作的表示法。纯形式没有局部变量可以使用。


10
FORTH是一种很棒的语言。在80年代初我第一次学习编程时,我有一个Atari 400,我的选择是BASIC,Assembly和FORTH。我广泛使用了这三者,但比其他任何人都多。我仍然有里奥·布罗迪(Leo Brodie)的超经典《开始》和《思考》。实际上,如果要求我在新的硬件系统上从头开始创建自托管语言,我会毫不犹豫地选择FORTH。
亚当·克罗斯兰

3
@Adam克罗斯兰:思考四是一个伟大的书,你可能有兴趣在这个环节:thinking-forth.sourceforge.net
Orbling

1
@Orbling:好主意也一样。不到10分钟前,我将PDF放在Kindle上。
亚当·克罗斯兰

1
@亚当·克罗斯兰:一个不错的地方。这本书通常对程序员有帮助,应该在对FORTH感兴趣或不感兴趣的人们的阅读清单上。
2011年

1
我完全同意。关于我们一般如何解决问题的想法有很多要说的。布罗迪是如此清醒的思想家和清晰的作家。他的作品对我来说是一种喜悦。
亚当·克罗斯兰

21

红宝石

这使我想自杀:

1.month.from.now()

(我可能有确切的语法错误,但是您明白了)。


23
我的天啊。谁曾想到这是个好主意?
EpsilonVector 2011年

8
思维的弯曲不在于阅读,而在于写作。产生这种废话是困难的,并且必须记住/查找所有内置函数/属性是荒谬的。
马修(Matthew)

55
只是我认为这看起来很棒,并且可能是学习Ruby的一个很好的理由吗?
2011年

9
太棒了,是的。但这是否意味着我可以从上个月开始算起3个月?不。至少,我不这么认为。如果我可以... RoR可以成为有史以来的第一种心灵感应语言。
morganpdx 2011年

15
什么是错的DateTime.Now.AddMonths(1);?这些功能很难使代码更具可读性。(我并不是说C#具有最佳语法。您可以将其转换为任何语言约定,并且仍然适用。)
ChaosPandion 2011年

18

脑干

可以诚实地写这种语言嘲笑的人甚至都不需要这样的线程。

Hello World(指针,左;解释,右):

+++++ +++++             initialize counter (cell #0) to 10
[                       use loop to set the next four cells to 70/100/30/10
    > +++++ ++              add  7 to cell #1
    > +++++ +++++           add 10 to cell #2 
    > +++                   add  3 to cell #3
    > +                     add  1 to cell #4
    <<<< -                  decrement counter (cell #0)
]                   
> ++ .                  print 'H'
> + .                   print 'e'
+++++ ++ .              print 'l'
.                       print 'l'
+++ .                   print 'o'
> ++ .                  print ' '
<< +++++ +++++ +++++ .  print 'W'
> .                     print 'o'
+++ .                   print 'r'
----- - .               print 'l'
----- --- .             print 'd'
> + .                   print '!'
> .                     print '\n'

2
还是空白?Brainfuck的所有弊端与隐形代码结合在一起。
罗伦·佩希特尔

17

Lisp是我最新的弯腰语言。

我已经带走了Haskell的monad和函数式编程,现在可以使用宏了。我只是进入CLOS,根本没有涉及条件系统。


我什至不喜欢Lisps(Clojure可能是个例外,但我仍然不敢下定决心),并给了+1。弯弯曲曲的部分肯定在那里,即使我不使用Lisp,我从Lisp中学到的东西也为我用其他语言所做的很多工作提供了信息。
只是我的正确观点,

14

腮腺炎

这是从弹出一个语言的时间,以时间在网上的故事,并具有在实际生产中使用的是存储重要的生命安全信息(即病历)的添加荣誉。但是,这也是欣赏简洁的语言,并且在生产代码中可能会出现以下功能(例如有关该主题的Wikipedia文章中的示例):

s A="String" F i=1:1:$L(A) W $c($S($A($E(A,i))<91:$A($E(A,i))-52#26+65,1:$A($E(A,i))-84#26+97))

哇,你不是在开玩笑吗?我没有睡过头,突然是4月1日?在我的病历附近,没有任何括号和美元符号的地方。
dan_waterworth 2011年

1
我的第一份编程工作是在一家专门从事MUMPS的公司中!可悲的是,我完成了大学的Web开发课程,因此他们把我带到了公司新组建的ASP团队中,而不是老手,但是MUMPS是我们在最初几周接受培训的语言。也许我有个幸运的逃生……
thesunneversets 2011年

1
有人在威斯康星州麦迪逊市发布了吗?维罗纳,真的吗?
汉斯·帕桑

1
我确实相信thedailywtf.com上有专门针对MUMPS的整个部分。看起来不像我想要触摸的语言。
Tyanna 2011年

1
我记得在学术界学习过M,并认为它作为一种特殊用途的语言很有趣。它所允许的简洁性就像是一种缩略的缩小。我天真地认为,生产代码几乎不会包含该语言的极端速记。我第一次也是唯一一次看到生产M代码库时,我的内心就紧缩了……看起来就像您的示例。哦,恐怖!
2011年

13

我会说Coq,或依赖类型理论的另一种实现。Haskell的类型系统相对而言不是很富有表现力。转向更具表现力的类型系统(例如,构造演算(CoC)),您可以做一些整洁的事情,例如语言中证明程序的属性,并将强不变性嵌入到可以静态检查的类型中。


2
与从属语言相比,任何从属类型系统/提供者/语言都可能比常规语言更令人困惑,因此+1。
2011年

1
程序的正式验证只是我刚开始的事情。它肯定使人弯曲,并在现实世界中变得越来越有用。+1
dan_waterworth 2011年

7

Objective-C的。公平地说,我只是对其进行了非常简短的研究,乍一看不喜欢该语法,以至于我放弃了它。

由于它是一种(相对)通用语言(主要用于Mac / iPhone / iPad开发),因此我相信一旦习惯了它,它实际上会相当不错。


2
好吧,它可能确实有点让人费解,但我喜欢它。如果您意识到[foo bar]只是语法糖objc_sendMsg(foo, "bar");,反过来查找功能指针(这是一个特殊的“条”,而不是通用条),这可能会有所帮助。您是否意识到它完全是鸭式的?
Per Johansson

Objective-C只是围绕运行时功能的巨大语法糖。一旦习惯了,[receiver doStuff:arg]它看起来就很像动态Java
toasted_flakes

6

我选择水星

Mercury向我展示了即使纯净的语言也可以进行I / O的工作,这使我心烦

这种工作方式是Mercury中的I / O功能采用“世界状态”值并返回新的“世界状态”值。因此,Mercury中的I / O功能改变了世界,因此保持了纯度。


3
+1“ ...汞改变了世界,因此保持了纯度。” -我不喜欢这样。;-)
2011年

我现在正在与Mercury一起努力学习曲线。到目前为止,这是一次值得的斗争。我很喜欢。
正确的意见

使我无法使用水银的唯一原因是它的字符串类型是NULL终止。
dan_waterworth 2011年

6

当然,它必须是Scheme。试图解释call-with-current-continuation总是会伤害我的大脑,但是一旦您理解了它,便可以做出令人难以置信的优雅解决方案。

是否想中途停止使用算法并将控制权交给其他人?当然!

是否想多次恢复相同的延续?当然!

是否要暂停执行算法,重新定义函数,然后以原始堆栈但已更新的全局状态恢复执行?没问题!并通过对全局状态的不同更改但相同的堆栈重新进入点来执行几次吗?先生,对您而言,任何事情!


+1大声笑+“先生,给你,什么!” 除了几乎成为Oliver!中一首歌的台词外,这也是一种语言的一种向往。
2011年

1
计划并不是唯一具有明确延续的语言。 例如,Haskell就很好地支持了它,并且弯弯曲曲地支持它。
正确的意见

4
在Haskell中,它可以说是更省事的,因为它(调用/ cc)是作为库而不是语言功能实现的。但这也许使它减少了烦恼。
Logan Capaldo

我认为这同时或多或少地影响了人们的思维。把这种矛盾放在我的脑海中,使我下意识。因此,最终,Haskell更加灵活。:)
我的正确观点是

Scheme(和Ruby!)延续的优点它们内置在语言中。Haskell基本上只是在普通的延续传递样式周围添加其monadic语法,您也可以在Scheme中完成。但是,在各处都内置有call / cc 而不需要将整个事物嵌入到monadic构造中绝对可以使许多构造弯曲的构造。
达里奥

4

我曾经使用过一个叫做TECO(文本编辑器和COmparator)的古老编辑器,它是一种非常强大的文本修改语言,具有各种宏功能。我记不清确切的名言,但要旨是“任何20个字符的随机集合几乎总是合法的TECO程序,并且将以根本上无法实现的方式更改您的文件(它是编辑器)。我记得写大约一页TECO代码中的Fortran到PL1转换器。


5
“与TECO一起玩的更有趣的游戏之一是在命令行中输入您的名字,然后尝试猜测它的作用。与TECO交谈时几乎所有可能的键入错误都可能会破坏您的程序,甚至更糟-在曾经工作的子程序中引入细微而神秘的错误。” 伙计,那些日子!
正确的意见

1
TECO也是EMACS的原始基地。EMACS最初只是TECO宏的集合!
加布

@Omega:有必要说出您指的是哪个TECO。DEC TECO(与TOPS-10或MIT TECO一起提供)是用MIDAS编写的。后一个TECO是EMACS的编写内容。这也是EMACS的扩展方式。我过去经常破解EMACS,而不是通过类。
约翰·桑德斯

我只用了DEC TECO。是的那些日子(能再恢复年轻)....
半人马座ω

1
让我记得在Vim命令模式下键入
-ron

3

组装一直是我最“介意的弯腰”,但我才刚刚开始。


更糟糕的是它取决于操作系统和硬件
Dave

怎么办呢?没有明确分组顺序的直接指令?还有什么吗
JE队列

好吧,特别是,我不喜欢程序流程看起来多么不清楚。快速阅读并不容易。
安托

2
啊,辛辛那提米拉克龙2200B:可变字长与JMP 地址的运行时修改相结合。它使LSD看起来很驯服。
彼得·罗威尔

3

Lisp。学习它是一系列小顿悟,每个顿悟都会完全改变您对解决编程问题的思考方式。


3

重装

它像Lisp一样围绕代码即数据的概念构建。该语言的拥护者很难解释其相对于该家族其他方法所具有的独特优势,并且通常耸耸肩说:“好吧,设计AmigaOS的人提出了它,包括了标准库,并且是微观的,一旦“获得”,就如同服用红色的Matrix药丸,而您再也不想回去了。”

它的麻烦部分是因为它很古怪,还没有准确定义哪些程序员是它的市场。但是部分原因是因为许多拥护它的人只是讨厌解释。:)

但是道格拉斯·克罗克福德(Douglas Crockford)曾经是粉丝,通过创建JSON汲取了一些灵感,并建议人们在2010年10月前对其进行研究:

“ Ted Neward在主持“编程语言的未来”小组方面做得非常出色。在小组结束时,Ted询问了小组成员他们应该学习哪些语言才能获得新的想法。清单包括Io (Bruce Tate),Rebol(Douglas Crockford),Forth and Factor(Alex Payne),Scheme and Assembler(Josh Bloch)和Clojure(Guy Steele)。”

资料来源:sauria.com

我认为对于任何希望扩展其对语言设计和可扩展性的看法的人来说,都值得一看。现在它是开源的(经过18年的专有开发),我过去惯常使用的免责声明不再适用了……值得一看!社区甚至脱离了他们专有的基于Rebol的消息传递程序,开始在Stack Overflow上聊天 (令我惊讶的是!)


1
我避免使用REBOL,因为它的唯一实际实现是非标准化,非开放式的软件,该软件会随其拥有的公司而改变。(Rebol 2 vs. Rebol 3 ...)如果它已经标准化或开放,我将再看看,但是直到那天,Rebol仍然不在我的工具带中。
正确的意见

1
@JUSTMYcorrectOPINION也许这一天又来了!Rebol 3 现在Apache2许可的软件。我们甚至在StackOverflow 的Rebol和Red聊天室中都有一个RebolBot,可以帮助我们演示语言。 Red是Rebol的另一个开源变体,作为混合编译版本,它显示出一些非常有趣的承诺。)
HostileFork 2013年

2

从长远来看,我会说很多人避免直接编写它,因此开发人员会发现SQL令人费解。我猜很多人只是不自然而然地思考场景。


SQL肯定会摆出思维,但这并不能帮助我编写更好的代码。
dan_waterworth 2011年

4
SQL对我和BASIC一样自然,对我而言。当您掌握了SQL中的完整数据处理时,令人惊讶的DB支持应用程序有多么容易。
JE队列

@dan_waterworth,我认为SQL可以通过向SQL中添加更多逻辑,而不是在应用程序中处理大多数条件和后续查询,来帮助您编写更小巧,更简洁的代码。
JE队列

@Xepoch,我认为,如果ORM的兴起使我们学到了什么,那就是人们不愿意使用SQL编写如果可以避免的话。他们宁愿用自己的语言写。
dan_waterworth 2011年

我猜想使用任何可以编写比您更好的代码的东西都是好事。
JeffO 2011年

2

Pure是基于术语重写的功能语言。我喜欢它,它既稀疏又富于表现力,尽管有点低估了。


+1功能性表示向量,是一种功能极为强大的语言。作为q的后代(这归功于APL),并从Haskell等人借来了很多吨。当然值得提及。
2011年

2

它可能不是最令人费解的方法,但是到目前为止,这对我来说是最难学习的(我认为Haskell汇编语言更容易!)

这就是HDL语言集,尤其是VHDL(和Verilog

克服每个“功能”同时运行这一事实非常困难,并且您无法避免转向完全并行化所有内容。当然,这只是编程语言的边界。


我做了一点VHDL。我有一个真正的顿悟时刻,当我突然意识到,当我添加代码时,实际上越来越多的硬件似乎将实现该代码,并且它们同时运行。就像真正无限地同时执行线程的多线程编程;也许可以访问EC2或map-reduce群集上的无限节点的人也会听到类似的嗡嗡声。(但是不久之后,我开始意识到在这些语言中实施任何非琐碎的事情并逃跑是多么的痛苦。)
2011年

1
作为电气工程师,我对同步性并没有太大的问题,实际上这是一种解放。至于实现的痛苦,那么uP可以很好地解决特定类别的问题,将问题转化为可以描述为算法的解决方案,该概念最初取自数学。固有的并行性问题是容易解决的问题之一,当时VHDL和FPGA派上了用场。

是的,如果您还不是程序员,并且曾经使用多个并行块工作,则VHDL很奇怪。
medivh

1

Tcl

我曾经开始学习它,但是当我学到足够多的知识后,我真的不喜欢它使我的大脑感觉的方式。这似乎可以弯曲。


1
我在1995年至1997年间做了很多Tcl编程,但没有特别的理由。1998年,当我开始寻找新工作时,整个湾区的每个招聘人员都试图让我参加工资低廉的高压VIGNETTE演出。我很快将其从简历中删除。我想给您一点辛苦的时间,因为我记得Tcl确实很容易,但我希望回顾一下,我已经学习了Python。
亚当·克罗斯兰

Tcl绝对是一种后天的品味。我个人认为该语言的设计是天才的-没有其他语言像Tcl一样适合我的大脑,但我知道我是少数。爱它或恨它,学习它要求您重新考虑语言应该如何工作。
布莱恩·奥克利

1

图灵机语言,很明显。它功能强大,可证明优于现有的所有其他编程语言,并且如果尝试使用它,一定会伤害您的大脑。


6
我不得不反对它的优越性。上级一词建议考虑主观问题。同样,如果我们在具有无限内存的计算机上运行C(这很公平,因为图灵机具有无限内存运行),它们的功率是相等的。
Winston Ewert

2
@温斯顿:图灵机的磁带不必是无限的。它只需要在两端各有一个磁带厂,即可根据需要制造其他磁带:)
Mike Dunlavey

根据定义,“可证明是优越的”是一个客观术语。这意味着可以在图灵机上实现任何语言,但是并不是每种语言都可以实现图灵机。当然,对于C之类的语言也是如此,它提供了无限的内存和无限的堆栈。
user12667 2011年

正如问题中已经提到的,BrainFuck几乎是图灵的机器语言。
Mchl 2011年

1
这表明图灵机更强大。问题在于,至少我会用这个词,声称语言优于也将考虑到易用性,可用性等
温斯顿·尤尔特

1

C

指针,内存管理和类型转换都需要很多思考,并且很容易出错。缺少诸如哈希表或列表之类的内置数据结构意味着您必须设计自己的数据库或找到第三方库并学习其API。


劳驾。C是一种汇编语言。当然没有这些东西。
彼得·罗威尔

2
汇编语言令人费解。
david4dev 2011年

-1

JESS(Java专家系统外壳)。CLIPS的这种改编嵌入Java环境中,是一种基于功能规则的专家系统语言。试图将实际的Java对象映射为事实并找到正确的问题以获取期望的结果是一个真正的挑战。如果您熟悉专家系统理论,那就没那么多了,但是当您来自纯粹的OOP思维方式时,它就不太适合。注意:CLIPS不是Lisp,但看起来像它。另一个弯腰。

一旦您走过了最初的学习曲线,它就会非常强大,而且很快就会得出答案。


Jess是CLIPS的现代版本,也可以作为您自己的应用程序的一种脚本/逻辑引擎嵌入。
Tangurena

好吧,我站得住了。haskel.com/corp/details/0,10294,CLI1_DIV139_ETI9759,00.html 然而,它需要从它被嵌入的语言非常不同的心态。
帐户berin Loritsch


-1

CIL

CIL,所有.NET程序都可以编译的通用中间语言,一种面向对象的程序集。尝试在其中编写或读取代码并将其构造与我已经知道的C#进行比较对我来说很有趣。这是了解更多.NET幕后功能的好方法。对于动态代码生成或使用Mono Cecil重写现有的已编译代码,它可能很有用。


2
还是字节码呢?
JE队列

如果您指的是Java字节码,那么我对它没有任何经验,因此我不推荐使用它作为弯腰。
svick

我不会真正比较Java字节码和CIL,因为Java字节码已经编译过,并且CIL将在运行时进行编译(.net的即时编译器)
basti 2012年

@chiffre在大多数情况下,Java字节码和CIL完全相同。在这两种情况下,您都有源代码(C#或Java)在“编译时”被编译成二进制中间语言(CIL或Java字节码),然后由JIT在“运行时”被编译成实际的机器代码。编译器。
svick
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.