在谈论编程语言时,Magic的定义是什么? 您所在的位置:网站首页 程序员说的魔法是什么意思 在谈论编程语言时,Magic的定义是什么?

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

2024-05-08 23:16| 来源: 网络整理| 查看: 265

在"语言X魔法太多"或"平台Y通常会避免魔法"之类的上下文中,"魔术"一词在这里泛滥了。 但是,该术语的定义似乎不太明确,人们在看到该术语时就会知道。 例如,据说Java包含很少的魔术,但是Java的垃圾回收器对程序员来说隐藏了很多。 如果魔术仅仅意味着隐藏细节的抽象,那么为什么又没有人用汇编语言编写大型程序,为什么它被认为是一件坏事呢? 如果魔术意味着更多,那意味着什么?

"任何先进的技术都无法与魔术区分开" – Arthur C. Clarke。

实际上并不完全是-魔术用于复杂,隐藏而不是高级(尽管设计人员认为它们是高级的),例如在过程调用之前需要特定状态的系统(COM线程模型)以及"自动"类型转换(VB变体,Javascript ==,Java自动装箱)。

一旦系统向程序员隐藏了不再可预测的细节,它们就会变成魔术。您不得不以一种您不懂的语言来重复调用,因为在过去它会产生正确的效果。那是坏魔术,也就是伏都教。

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

相关讨论 哦,如果有人在引用:格雷戈里·本福德(Gregory Benford)说,任何可区分魔术的技术都不够先进。

当您忽略它时,某些东西是神奇的/您不知道它是如何工作的。

相关讨论 "忽略时"位非常重要-使用魔术可以避免定义尚未(正在考虑)或在其他地方详细说明且与当前讨论等无关的内容。

魔术与您的理解息息相关。

在开始用Java编写之前,我写了很多C和C ++。我必须分配和释放所有内存。一旦我开始出现内存泄漏,这并没有什么乐趣。当我开始用Java编写代码时,我(基本上)知道了幕后发生的一切,以便制作我的所有实例对象。因此,对我而言,这对魔术师来说不是那么神奇(我已经完成了分配,但是它如何实际存储对象并知道何时取消分配对象对我来说更像是"魔术") (谁不必手动处理内存。)

另一个示例是ORM。我在一个项目的初期就滚动了自己的临时对象关系映射结构,直到我有时间真正掌握并学习Hibernate或类似的东西。我不得不编写诸如ResultSet映射器,延迟加载和一些基本的缓存之类的东西。现在,当我回过头来用更成熟的Hibernate或JPA映射的实体替换这些内容时,我仍然对发生的事情有基本的了解。如果您从未使用过JBDC或类似的工具,那么您真正要知道的是数据从数据库到对象再返回。

每个人在职业生涯中都会面对一定程度的魔术。我们不能一无所知。魔术确实可以与抽象同义。当它变得"太神奇了"时,抽象就开始掩盖您需要控制的事物。前一天的一个示例是,在JSF程序中,我不知道如何启动JSF上下文。第一次导航到JSF页面时,JSF就是这样做的。我需要从常规servlet开始上下文。我最终不得不制作一个虚拟JSF页面来处理它。我只是没有时间在这个项目中学习JSF上下文管理的"魔术"。

在Microsoft,这通常有两种使用方式

1)以负面的方式(可能是最常见的用法)。例如,有人可能会说以下"我听不懂;首先您将重构API,接下来将保留旧的API并在它们之间具有执行魔术的层?"

这意味着魔术成分太复杂,太不确定或太"物"。

另一个负面的上下文是天真地定义了某些东西:当某人认为对复杂问题有简单的解决方案时,通常会发生这种情况,因为他们没有意识到问题确实很复杂。雷蒙·陈(Raymond Chen)的博客中充斥着这些例子。

2)很少积极地使用术语"魔术"。但这确实发生了。有用的是指执行仅适用于复杂任务的事物。对我而言,NTFS就是这种魔力。 NTFS确实非常成熟,并且在一些非常简单的API之后隐藏了很多复杂性。编译器也可以通过这种方式被视为"魔术"-您真的深入了解C ++编译器的工作原理吗?我不会-我只是相信他们会这么做。

例如,Ruby on Rails是Magic。

在基本级别上,尤其是天真地采用这种方法时,您的极简代码和数据库之间会有一个很大的厚层,然后出现了Magic Happens,您将获得原始功能以及所有其他功能。

有些人可以接受非常高水平的经验,但是最终您将开始遇到需要了解"技巧"的"秘密"的障碍,因此您可以更好地操纵它。

语言本身并没有太多魔力(嗯,也许是Prolog -它的核心有点魔力),但是现代框架和中间件可能充满了魔力。

坦白说,任何时候遇到"做某事令人惊奇"的系统或组件,而又想知道"他们如何做到这一点",那都是不可思议的。

魔术与其他上下文具有相同的含义:具有隐藏的复杂性和逻辑性的事物。这并不总是坏的,但是对于程序员(非技术人员的魔术师)来说却是这样。当您知道外观如何运作时,魔术不是魔术。

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

当我们谈论混淆代码中出现的"黑魔法"时,是指该代码中发生了一些我们不理解的事情。或者发生了一些非书面的但被代码读取器隐藏的事情。

在某些情况下,您会以积极的方式谈论魔术:当您看不到简单易懂的事物的真正复杂性时。 例如,一些非常复杂的代码可以隐藏在一个很小且易于使用的接口类中。这看起来很神奇,因为它使用简单的方法即可完成复杂的工作。 那是好魔术(但很少见)。

相关讨论 在回溯的过程中,"黑魔法"只是一段非常紧密的机器代码。 同样,使用不常见或未记录的接口。 简而言之,展示了系统体系结构的丰富技能和知识。 ...通过编写可能会随着系统体系结构的将来更改而中断的紧密代码,这时不良的维护程序员也将无法弄清楚该紧密代码应该做什么。 凉!

有趣的是:术语magic与形式化的编程语言链接,后者是计算机科学的理论基础之一。在Morgan的《规范编程》一书中,我们对魔术有以下定义:

1w:[true, false]

该符号的形式为:

1w:[P, Q]

表示在P为true的状态下执行时,将在Q为true的状态下终止,同时仅更改w中的变量的程序。

因此,在这种情况下,"魔术"是一个不可行的程序,它可以使程序从任何状态(因为true始终是true)进入不可能的状态(因为false永远不能是true) 。

一个更简单的程序是:

1w:[true, true]

该程序始终会终止,但不能保证任何特定结果。这可以通过简单的skip来实现。

显然,当人们谈论magic程序时,此技术定义已被滥用,因为这应该意味着一个被证明是不可行的程序。尽管如此,该术语仍然是通俗易懂的,因为可以想象当我们不知道或不了解某事物的工作原理时,在幕后发生了一些神奇的事情。

术语表附录中的经典魔术故事。

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

去读吧。

当您不了解某些内容时,便称其为"魔术"。

人们过去常常在中世纪去做/知道/说些其他人无法理解的话时被烧死。他们被指控做"魔术"。

当您不了解代码/框架/语言的功能时,便称其为"魔术"。称某些事情为"魔术"要比花时间去理解它容易。

魔术不存在!

与其将某些事情称为"魔术",不如动手弄弄那东西在做什么……或者称其为"(您的)知识的未开发部分"。

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

我使用术语"黑魔法"的一种情况是字节码操作(在Java中)-在运行时转换程序代码,以使其执行与普通代码不同的操作。通常,字节码操作非常有用,但是使用它进行射击也很容易。

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

我自己做了一些字节码操作,因此基本上我知道如何更改字节码指令,从某种意义上说,这对我来说不是"魔术",我不知道它是如何工作的。但是我仍然称其为"魔术",因为它改变了代码正常工作的方式,并且在所更改的类的源代码中不可见。

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

但是有一些未知的国王:

开发人员方面缺乏有关如何工作的知识。 (例如,GC并不是魔术,只有很少的开发人员实际上不愿意去了解并理解它的基础)

不确定的行为魔术,发生在幕后的事件,并且没有关于其实际工作方式的公众知识。这是编程中的真正魔力。

例如,Rails并不是魔术,而Ruby也不是魔术,但是对于某些人来说,如果他们从来不愿意去理解内部结构(这是公共知识并且可以使用的话),那么看起来肯定是这样。

对于Java

GC-恕我直言,这不是魔术,就像拥有房屋清洁剂一样 自动装箱-魔术-将事物无形地转化为其他东西


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有