编程语言特性有利于重构?

什么是编程语言便于(简化)广泛的自动化源代码分析和重新设计(改造)工具发展的共同特征/属性?

我主要是想在编程语言的功能,使其更容易开发静态分析和重构工具方面(即比较的Java与C ++,其中前者具有重构更好的支持)。

换句话说,这将是明确地旨在提供用于自动静态分析和重构从一开始就支持​​的编程语言,什么特性会是优选功能?

例如,对于阿达,还有的ASIS:

阿达语义接口规范(ASIS)是一个分层,开放式架构提供独立于供应商访问阿达图书馆环境。 它允许Ada的程序和库的静态分析。 ASIS,阿达语义接口规范,是一个图书馆,让应用程序能够访问的Ada的编译单元的完整的语法和语义结构。 这个库通常由需要上阿达​​程序执行某种静态分析的工具。

ASIS信息:ASIS提供一种标准方法为工具来提取的,最好由Ada编译或其他源代码分析收集到的数据。 它使用ASIS工具是自己写在阿达,并能支持ASIS Ada编译之间很容易移植。 使用ASIS,开发者可以产生强大的代码分析工具与便携高度。 他们还可以节省可观的费用实现了提取源程序语义信息的算法。 例如,ASIS工具已经存在生成的源代码度量,检查程序是否符合编码风格或限制,使交叉引用,并在全球分析进行验证和核实程序。

另见,ASIS常见问题

你能想到的,提供了一个类似的全面的,完整的接口来实现与源代码,专门为分析/转换的目的工作的其他编程语言?

我想具体的实现技术,以提供低级别挂钩,例如核心库功能,提供了一种方法来检查在运行时AST或ASG。

--------------解决方案-------------

最大的必须是静态类型。 这样的工具有更多的见识到了什么代码正在做什么。 没有它重构成为许多倍的困难。

反思内置的语言/类型系统。 这使得静态分析和重构更痛苦。

这就是为什么Java和.NET工具是如此普遍和漂亮的一部分。 这提供了在理解的源代码快速和可靠,这有助于与源代码的静态分析depdencies方面好得多的功能的工具。

此外,你可以做你的编译代码的分析,以及能力。

这是事实,该特定的编程语言可以使分析变得更容易。 如果你想在easist对语言进行分析,选择一个纯粹的功能之一。

但是,没有人在实践方案,纯功能汉语语言。 (Haskell的人要跳起来,当他们看到这一点,但严重的是,Haskell是使用极为罕见)。

是什么让一个编程语言分析的是基础架构,旨在支持分析 。 阿达的ASIS以上,是一个很好的例子。 不要混淆了ASIS是为阿达写的,或者是写在阿达的事实; 怎样才算是有人要认真分析ADA和投资倾力打造艾达分析机械。

我认为,正确的解决方法是建立一般分析的基础设施和整个汉语语言很多的期限平均摊销。 虽然我们在这,我们应该建立总体改造基础设施,也因为一旦你有一个分析,你会想用它来实现变革。 (看医生不确诊结束,他们与固化结束)。 而且我敢打赌,我的职业生涯就可以了。

其结果是发动机,我认为理想的分析,重构,流程再造等:在DMS软件工程工具包。 见http://www.semdesigns.com/Products/DMS/DMSToolkit.html

它具有通用的解析,建树,以漂亮的,树的操作,源到源改写,属性语法评估,控制和数据流分析。 它有一个号码的C和C ++广泛使用方言,用于Java,C#,COBOL和PHP和甚至为Verilog和VHDL的生产质量前端(许多其它汉语语言太,但并不完全在该水平)。

为了让你的效用一定意义上,它被用来转换JOVIAL代号为B-2轰炸机的为C ......没有我们曾经看过的源代码。 见http://www.semdesigns.com/Products/Services/NorthropGrummanB2.html

现在,假设一个人的分析基础,什么语言功能的帮助?

静态类型有助于通过限制集合可能值的变量可以取的,但仅通过添加一个有限单参数谓词,例如,“X是整数”。 认为有助于代码更是断言,因为它们捕获谓词有多个参数,往往无法通过检查代码中找到(如,问题或域的具体信息,如“X> Y + 3”)的分析基础设施(坦白地说,读代码的程序员)可以理想地利用这种额外的事实优势,提供更有效的分析。

这种说法通常编码与特殊的关键字,例如“断言”,“前(条件”和“后(条件”的启发来自定理证明文献很好的理由。

但是,即使你没有断言在你的语言,他们很容易反正编码:只写一个,如果与含有断言拒绝的情况下,和身体做的事情称之为一个成语,表示不可能或违反语言语义(声明例如,DEREF一个明显空指针),如“如果(X> 0)失败();”

那么什么是真正需要的不是断言的语言 ,但程序员谁愿意写。 唉,这似乎是可悲的缺乏。

有语言交流“代码是数据”的范例。 例如每一行代码是用这种语言方面的仅仅是数据。 这使得重构是基本动作为基本数据操作。 而这种语言的名称是Lisp的。 ;)

认真说起来,“语言程序设计”和“语言机器”是两个不同的要求。 并有完善的语言分析可能是噩梦的程序员。 更有甚者,语言设计的一些分析可以不是编程语言的。 (上周我遇见了指针分析的语言,它没有文字表述,只有两个可执行语句)

又说:首先你要定义任务,然后解决它。 例如:如果任务是“我要编写安全的程序,比如我想确保我永远不会尝试混合组成和性质的操作数”,那么你需要用静态类型语言。 好吧,“我需要知道在运行时我可以用外部库做” - 反思是你的选择。 “我需要通用编程语言,用于交换,转换和分析” - 最有可能的,这是不是你真正想要的。

对于重构:自相似性

接受能力的代码移植无侵入修改或重新解释怪异。 例如:

  • 提取C ++的一个片段到一个新的程序,通过使用引用参数给它;修改访问的变量。
  • Python中,Javascript和Lua的方法真的只是具有'自我'参数功能。 *
  • 在任何数量的语言,一个函数,用于创建/填充一个结构可以是(或多或少平凡)转换为一个构造函数。

反例...

  • 红宝石(模块,类),方法的lambda块和原始块:语义的差异扑朔迷离,至少可以说。 (这是所有我觉得有资格肯定地说。)

对于(在我看来)完全不同的情况下自动首被搞砸的我少了很多肯定,但副作用自由,函数式编程语言提供的是真的吧。 (好了,怎么可能我们提供了我们其余的语言是一回事吗?)

* Python是几乎一样的。 (我忘了疑难杂症是什么。大概的东西,如果方法定义在类或嫁接,运行时用。)

我认为这仍然是一个很大的未开发的问题。 “的设计语言为工具”的概念似乎只已经进入了主流的边缘最近,但我认为这方面的研究是有超过二十年的历史。 我同意两个其他的答案,即“静态类型”和“自相似性”是一门语言的有用的属性,使重构的支持更容易。

IMO最重要的特性是语言完全确定和确定性。 例如,在C以下代码的行为没有定义由语言规范:

x++ = x++ + ++x;

如果代码的行为是不确定的,但还没有编译和一些事情,没有安全的方法来自动改变(即重构它)的,保留东西的方式。

下一个重要的特性是,它不允许访问变量(字段)超出其范围。 指针使其possibe如C语言来访问任何变量的值,只需通过“猜测”的地址。 在这样的语言中,存在这样的情况是不可能的,告诉在代码某个变量的值被读出和/或改变。 同样,没有安全的方法来自动重构一个程序, 可能会做这样的事情。

分类:重构 时间:2012-01-01 人气:0
分享到:

相关文章

  • 自动重构可能在动态语言? 2014-11-14

    也许我感到我的经验与动态语言(红宝石的NetBeans和Groovy于Eclipse)的限制,但在我看来,动态语言的特性使它不可能重构(重命名方法,类推起,拉下来,等自动). 是否有可能在任何动态语言(与任何IDE /工具)?我在红宝石,Python和Groovy的特别感兴趣,以及如何重构比较在所有的Java IDE的100%自动重构自动提供重构 . --------------解决方案------------- 由于自动重构发明于一个动态语言(Smalltalk的),我会说"是".

  • 重构 - 的UnitTest - 设计三元悖论的遗留代码 2013-05-29

    你如何解决,当你正在处理遗留代码这个问题 你处​​理是不是精心设计的课程,需要一些严重的设计变更 你处​​理大多是紧耦合类 你没有足够的单元测试做多重构 你不增加新的单元测试,因为设计是坏的,你要去无论如何改变 你不能很容易因为改变设计 紧耦合,没有足够的单元测试 -东西可真错了,因为它需要多个班级在同一时间,没有任何安全网的新设计. 从哪里开始? 你怎么攻击的问题呢? --------------解决方案------------- 鸡和蛋的问题. 如果它不能写,因为thight耦合的一些体面的

  • C#语言设计:一个事件的显式接口实现 2013-05-01

    关于C#语言设计的小问题:)) 如果我有一个这样的界面: interface IFoo { int Value { get; set; } } 这是可能的使用C#3.0自动实现属性显式实现这样的接口: sealed class Foo : IFoo { int IFoo.Value { get; set; } } 但是,如果我有在接口的事件: interface IFoo { event EventHandler Event; } 并试图采用现场般的事件明确地实现它: sealed class

  • C#语言设计的支柱 2012-05-21

    在这篇文章中(http://www.artima.com/intv/nonvirtualP.html)的Anders Hejlsberg为提到的版本是C#语言设计的支柱之一. 有谁知道什么是其他支柱? --------------解决方案------------- 我是指你的C#规范,该规范描述了走进语言进行程序设计的重要因素之一页. 一些报价,表明一些什么样的重要因素,并继续: 现代,面向对象和类型安全 - 马上熟悉C,C ++和Java程序员. - 现代软件设计日益依赖于软件组件的功能自包含

  • 语言会自动更改 2013-07-07

    在发送电子邮件,即使我的英语我写的语言更新到土耳其. 我如何禁用翻译Tıurkish? 在选择我的首选语言是英语和菜单是英文的,但即使在这个脚本一些字母被翻译成土耳其语. --------------解决方案------------- 嗨ahubelgin, 让我来帮你的关注. 您是否尝试清除浏览器的缓存? 如果没有,请点击此链接并据此选择浏览器. 如果您正在使用Internet Explorer 10,请点击此链接. 有时候,你可能会在查看或导航某些网站会遇到一些错误. 由于Web浏览器中存储

  • Word 2007中:澳大利亚语言和自动更正 2013-07-19

    我希望Word 2007使用澳大利亚字典有一个自动更正列表(如美国自动更正列表) 区域和语言设置都设置为澳大利亚语言. 这迫使Word 2007中使用的词典和自动更正澳大利亚语言(这是我想要什么) 然而,澳大利亚的自动更正只中有笑脸. 如果我改变所有的语言设置为英语(美国),我可以看到一个大的自动更正列表. 我知道他们都是不同的.acl文件但是如果我只想使用澳大利亚英语的设置我需要使用澳大利亚的.acl文件. 是否有Word 2007中的方式来默认生成的是澳大利亚的.acl文件,包含更多的则只是

  • 语言设计的固态讨论 - 协变和逆变的类型 2013-08-01

    通过讨论,我的意思是博客文章,书籍(最好)或类似. 背景 我对马丁Odersky的,莱克斯勺子和比尔阅读第二次Scala编程并以极大的惊喜我读过有关协变和逆变件. 我张贴这个问题的原因是这样的 - 作者开始以建筑类队列,并讨论如何,在这里,可以和不可以使用协方差. 每一步是前述步骤,但在最后一步中的一个被添加元素排队(正面)的合乎逻辑的结果: (elem : Apple) :: (queue[Orange]) 然而在Scala中是这样工作的,那结果是队列式水果​​. 这在我看来是错误的 - 如果

  • 如何在Java中关闭启用API设计来代替语言设计? 2015-02-26

    我可以看到一些倒闭,比如他们如何能有他们在简化现有的库,使一些未来的设计变得更简单,更高效的地方的好处. 然而,(http://www.javac.info/consensus-closures-jsr.html)在提案草案中提到的关键点之一是在2.5节,e点: (该规范将提高由语言) e)令未来的API设计来代替语言设计用于扩展Java平台. 我挣扎怎么看这种情况,想必语言设计就是这样 - 语言本身的设计,并且不能由API的Java,除非打开了各种使用闭包怪异的API修改的语言来代替(我很怀疑

  • 自动重构工具? 2013-02-20

    是否有会扫描你的代码,并建议执行哪个重构的基础上,重复的代码段,它发现了一个工具? 比方说,我在C#/ Java的特别感兴趣,但我打开其他语言的工具,以及. --------------解决方案------------- 我们使用TeamCity的有重复的发现者 我没有用它,但克隆医生可能会为你工作. 对于Java你有静态代码检查工具来搜索侵犯了一套选择规则,具有一定的覆盖码重复的规则. Checkstyle的有规则来查找重复的代码,并重复字符串. 另一种选择是PMD的复制/粘贴探测器 . 这些

  • 自动重构来的String.format 2012-02-01

    我在VS2008 C#项目,有很多看起来像这样的代码行: string s = "bla blab" + x + "bla bla bla" + y + .... ; 我想隐蔽这些字符串使用的String.format(...)一个字符串. 我目前使用的ReSharper的5.0,我可以重构的一行代码与点击. 问题是,我有更多的1000线这样的,我不想手动去了每一行. 有没有办法来自动做到这一点? 编辑:正如马克纠正我,我不真正需要做的,但我有另一个非常类似的问题:

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.342 (s). 10 q(s)