在谈论编程语言时,Magic的定义是什么?

时间:2009-02-28 17:07:14

标签: language-design

“魔法”这个词在“X语言太多魔法”或“平台Y通常避免魔法”等语境中被抛到了很多地方。然而,似乎这个词的定义很差,人们在看到它时就会知道。例如,Java被认为包含很少的魔力,但它的垃圾收集器隐藏了很多程序员。如果魔术只是意味着隐藏细节的抽象,那么为什么它被认为是一件坏事,因为没有人再用汇编语言编写大型程序了?如果魔法意味着什么更多,那么它意味着什么?

13 个答案:

答案 0 :(得分:10)

“任何足够先进的技术都与魔术无法区分”--Arthur C. Clarke。

实际上并不是那么 - 魔术被用于复杂和隐藏而不是高级(虽然可能是设计师认为它们是先进的),例如在程序调用之前需要特定状态的系统(COM线程模型)以及'automagic '类型转换(VB变体,Javascript ==,Java自动装箱)。

一旦系统隐藏了程序员的细节,它们就不再可以预测,它们就会变得神奇。你不得不用你不理解的语言重复调用,因为它在过去有正确的效果。那是不好的魔法或伏都教。

还有很好的魔力 - http://aggregate.org/MAGIC/

答案 1 :(得分:8)

当你忽视它/你不知道它是如何工作时,有些东西是神奇的。

答案 2 :(得分:4)

在微软,这往往会以两种方式使用

1)以消极的方式(可能是最常见的用法)。例如,有人可能会说以下“我不明白;首先你会重构API,接下来你将保留旧的API,并在它们之间有一层执行魔术的层?”

暗示魔法成分太复杂,太不确定或太“某事”。

另一个消极背景是当天真地定义某些东西时:这通常发生在有人认为对复杂问题有简单解决方案时,因为他们没有意识到问题确实很复杂。 Raymond Chen's blog充满了这些例子。

2)“魔术”一词的使用频率较低。但它确实发生了。有用地引用执行复杂任务的东西。对我来说,NTFS就是那种魔力。 NTFS真的非常成熟,并且在一些非常简单的API背后隐藏了很多复杂性。编译器也可以通过这种方式被视为“神奇” - 您是否真的理解C ++编译器的工作原理?我没有 - 我只相信他们这样做。

答案 3 :(得分:4)

魔术与你的理解非常相关。

在我开始用Java编写之前,我写了大量的C和C ++。我不得不分配和释放我的所有记忆。一旦我开始出现内存泄漏,这并不是很有趣。一旦我开始用Java编写,我就知道(基本上)幕后发生的事情,以便制作我的所有实例对象。因此,对我而言,它并没有接近那么多魔法(我已经完成了分配,但它实际上如何存储对象并知道何时释放它们对我来说更“神奇”),因为对于那些刚开始使用Java的人来说(从来没有人手动处理内存。)

另一个例子是ORM。我在项目的早期编译了我自己的临时对象关系映射结构,直到我有时间真正理解Hibernate或类似的东西。我不得不写一些像ResultSet映射器,Lazy Loading和一些基本的缓存。现在,当我回过头来用更成熟的Hibernate或JPA映射实体替换这些东西时,我仍然会对正在发生的事情有一个基本的了解。如果您从未使用过JBDC或类似的东西,那么您真正知道的是数据从数据库到对象再返回。

每个人在职业生涯中都会处理一定程度的魔法。我们无法知道一切。魔法真的可以与抽象同义。当它变得“太神奇”时,抽象开始掩盖你需要能够控制的东西。前几天的一个例子是,在JSF程序中,我不知道如何启动JSF上下文。 JSF只是在您第一次导航到JSF页面时执行此操作。我需要从常规servlet启动上下文。我最终不得不制作一个虚拟的JSF页面来处理它。我只是没有时间在这个项目中学习JSF上下文管理的“魔力”。

答案 4 :(得分:3)

Magic与其他语境具有相同的含义:具有隐藏复杂性和逻辑性的东西。这并不总是坏事,但对于程序员来说(对于非技术人员来说,这是魔术师)。当你(可以)知道它的外观是如何工作的时候,魔法并不神奇。

例如,魔术常数:具有隐藏含义的常量。

当我们谈论在某些混淆代码中出现的“黑魔法”时,我们的意思是在我们不理解的代码中发生了某些事情;或者说没有写入的东西会发生,但对代码阅读器是隐藏的。

在某些情况下,你会以积极的方式谈论魔术:当你没有看到真正的复杂性时,简单地理解如何使用东西。 例如,一些非常复杂的代码可以隐藏在一个简单易用的接口类中。这看起来很神奇,因为它简单易用。 这是很好的魔术(但很少见)。

答案 5 :(得分:3)

例如,Ruby on Rails就是魔术。

在基本层面,特别是在天真地接近时,你的极简主义代码和数据库之间有一层厚厚的层,然后Magic Happens,你得到了crud功能以及所有其他功能。

有些人可以忍受这种非常高水平的体验,但最终你会开始遇到障碍,你需要了解“技巧”的“秘密”,所以你可以更好地操纵它。 / p>

语言本身没有很多魔法(好吧,也许是Prolog - 它的核心有点神奇),但是现代的框架和中间件可以充满它。

坦率地说,只要你遇到一个系统或组件做了“令人惊奇的事情”并且你想知道“他们怎么做”,那就太神奇了。

答案 6 :(得分:2)

有趣的是:术语magic与正式编程语言相关联,这是计算机科学的理论基础之一。在Morgan的书“规范编程”中,我们有魔术的定义:

w:[true, false]

这种表示法的形式如下:

w:[P, Q]

表示一个程序,当在P为真的状态下执行时,将在Q为真的状态下终止,同时仅更改w中的变量。 / p>

在这种情况下,“魔术”是一个不可行的程序,它可以将程序从任何状态(因为true总是true)变成一个不可能的程序(因为{{1永远不会是false)。

更简单的计划是:

true

该程序始终终止,但不保证特定结果。这可以通过简单的w:[true, true] 来实现。

显然,当人们谈论skip计划时,这个技术定义被滥用,因为这应该是一个可证明是不可行的程序。尽管如此,这个术语仍然是通俗的,因为很高兴能够想象当我们不知道或者理解某些东西是如何工作的时候,在幕后发生了一些神奇的事情。

答案 7 :(得分:1)

当你不理解它时,你称之为“魔法”。

人们习惯在中年时被焚烧,当他们在做/知道/说些什么的时候,其余的人都不会理解。他们被指责做“魔术”。

当你不理解它的作用时,你会将代码/框架/语言称为“魔法”。称之为“神奇”的东西比花时间去理解它更容易。

魔法不存在!

而不是称之为“神奇”的东西,让你的手弄脏并理解那件事正在做什么......或称之为“(你的)知识的未开发部分。”

答案 8 :(得分:1)

行话文件附录中的经典魔术故事。

http://catb.org/jargon/html/magic-story.html

去读它。

答案 9 :(得分:0)

For Java

  • GC - 恕我直言不是魔术,就像有一个房子清洁工
  • 自动装箱 - 魔法 - 将物品隐形变形为其他东西

答案 10 :(得分:0)

未知行为经常被称为 magic 。有些事情没有明显的原因发生。

但是有一些未知的国王:

  • 开发方缺乏关于工作原理的知识。 (例如GC,它不是神奇的,只有太少的开发人员真的很难找到并理解它的基础)

  • 未定义的行为 magic ,窗帘后面发生的事情并没有关于它们实际工作方式的公众知识。这是编程的真正魔力。

例如Rails,它不是魔术,而Ruby并不是魔术,但对于一些人来说,如果他们从不打扰理解内部(这是公共知识和可用的),它肯定会如此。

答案 11 :(得分:0)

我使用术语“黑魔法”的一个上下文是字节码操作(在Java中) - 在运行时转换程序代码,以便它执行与普通代码不同的操作。通常,字节码操作非常有用,但是用它来拍摄自己也很容易。

许多框架和中间件使用AOP和字节码操作来实现横切关注点。这减少了程序员的工作量,但在某些情况下,它可能会使系统的行为变得难以调试。并且很容易在字节码转换中留下一些微妙的错误。

我自己做了一些字节码操作,所以基本上我知道字节码指令是如何改变的,从这个意义上讲它对我来说并不“神奇”,我不明白它是如何工作的。但我仍然把它称为“魔术”,因为它改变了代码正常工作的方式,并且在被更改的类的源代码中不可见。

答案 12 :(得分:0)

有关黑魔法的一些不错的例子,请查看perl源代码中的文档; - )