适用于动态语言的IDE-您可以获得多远?


56

我发现令人沮丧的是,动态语言应提供的开发速度如何因缺少IDE所能提供给您的静态对象的补全和其他资产而大大受到损害。

这不仅是减少打字量,还在于浏览API时获得的工作效率提高和无穷乐趣,而无需经常引用未与编辑器集成的文档。

到目前为止,所有IDE +动态语言组合-公平地说还不是很多-我尝试过:

  • 越野车
  • 毫无头绪/过于狂热(如显示所有可能的完成)
  • 或者根本不像Eclipse + Java那样完整。

我知道动态代码分析不是一件容易的事。但是人们不禁会怀疑- 这一段代码真的很难找出来吗?

所以我的问题是:

是否有任何特定的IDE(或更少的一体式安装程序)实现了对动态语言的完全出色的支持,还是这还是一个“未解决”的问题?


30
+1与Visual Studio + C#/ C ++相比,我尝试过的每个PHP IDE都太可怕了。
马捷Zábský

5
不确定总体问题,但您可能想看看JetBrains IDE。他们的方法是“我们已经有了一个出色的IDE,让它在$ LANGUAGE下工作”。您尝试使用的IDE的问题可能是采用以下方法来代替的:“ $ LANGUAGE没有IDE,应该有人创建一个”。
millimoose 2012年

2
我发现IDEA确实很棒,特别是对于处理Java和与项目相关的任务。但是对于JavaScript,它似乎无法识别命名空间或其包含的对象中定义的“方法”。
vemv 2012年

IntelliJ IDEA或任何JetBrains语言特定的IDE。
sylvanaar 2012年

1
@FrustratedWithFormsDesigner我用过Komodo。它具有比我见过的任何其他RoR IDE更好的自动完成功能...但是我见过的很少有Ruby IDE甚至尝试实现自动完成功能。也就是说,总比没有好
Earlz 2012年

Answers:


21

Smalltalk是一种高度动态的语言,它一直具有出色的IDE,其中很少有自动重构,SUnit(所有* Unit框架的祖父母),“谁发送此消息?”,“谁实现此方法?”之类的东西。等是开创性的。因此,是的,IDE确实可以支持动态语言,直到最近,其水平远远超过静态类型的语言。

S. Lott说:“动态语言不能具有与静态语言相同的代码完成方式。这基本上是不可能的。”

从理论上绝对的意义上说“基本上不可能”?当然。从实际意义上讲?并不是的。有很多方法可以动态地推断动态语言的类型(k-CFARoelTyper),在运行时(PICs)以及其他方法,例如使用程序员的最新历史记录- “程序历史记录如何改善代码完成率”

当然,Pharo和Squeak社区对其代码完成工具非常满意。


3
向我+1。尽管这些天在Java世界中工作,但我仍然想起您与我所知道的任何其他语言相比,Smalltalk的生产率更高。毫无疑问,IDE和代码在图像中的集成一直保持代码始终处于活动状态(Smalltalkers会理解我的意思)。随着Pharo和Seaside为许多人认为的“已有语言”注入了新的生命,就像Eclipse作为IDE一样,我越来越多地去研究Smalltalk。Smalltalk出色的命名约定无疑有助于预测性的代码完成。
阿莫斯·卡彭特

16

您从IDE所知的几乎所有东西都是首先在Smalltak中开发的,这是一种动态语言。其他所有内容都只是复制它们。很明显,所有这些功能都可以在动态语言中实现。

今天,动态语言落后于静态语言。但为什么?

直到最近,人们还是普遍认为静态类型优于动态类型。在这一点上,许多编码人员最近改变了主意。没有针对动态类型语言的IDE的关注。

我认为IDE的功能在动态类型语言中不太有用。使用Java或Objective-C时,我认为IDE是帮助我使用该语言所必需的,但动态语言却并非如此。

使用静态语言可以轻松完成某些任务。找出表达式的类型很简单。用动态语言执行相同操作需要整个程序分析或在运行时记录类型。由于很多IDE围绕类型展开,因此确实有效果。


2
在Squeak和Pharo中,RoelTyper通过查看发送给它的消息在推断某种类型方面做得相当好。否则,Shivers&Might的k-CFA提供了可调整的类型推断,从某种意义上来说,您可以权衡成本与准确性。
Frank Shearar 2012年

13
I think that the features for IDEs are less useful in dynamically typed languages-好笑,我想正好相反。由于这么多动态语言不需要您事先声明变量,因此拼写变量是一个严重的问题……良好的IDE可以缓解这种问题。同时,其余的主要功能-语法着色,重构工具,调试功能-在所有语言中都同样有用。
BlueRaja-Danny Pflughoeft 2012年

2
@Winston:那么,您从来没有用多人的非声明性语言来完成过一个项目:)当语言区分大小写时,这尤其令人讨厌。个人经验的示例:“工作指令”一词有时被拼写为一个单词(“工作指令”),因此在创建变量时,有些人会写,有些人workOrder会写workorder。这是Python> _ <中的两个独立变量
BlueRaja-Danny Pflughoeft 2012年

1
相反,@ BlueRaja-DannyPflughoeft,我已经用多个人在Python中完成了项目。当您说出问题所在时:由于引用了一个不存在的变量而导致运行并得到异常,代码由于无法将数据存储在错误的位置而无法通过初始测试,或者导致无法检测的错误导致错误代码转义到生产环境?
温斯顿·埃韦特

2
“在这一点上,许多编码员最近改变了主意。” 为什么是这样?
Pubby 2012年

10

我遇到了python的问题。我希望用vim作为编辑器,但这意味着我没有IDE环境。因此,我使用vim插件开发了自己的插件。目前,我认为我实际上拥有比过去使用过的任何IDE更好的开发环境。

我的设置托管在github上,随时查看一下并喜欢您想要的东西。有关插件的快速概述:

  • 病原
  • python-mode,用于绳索,pyflakes和pydoc集成
  • vimpdb用于python调试器
  • 项目中的文件列表
  • 标签列表,用于标签跳转
  • 选项卡完成的超级表
  • 片段摘要
  • 集成外壳的征服条件,可以是命令提示符,bash,python或ipython

还有其他一些东西,但是它具有更流行的IDE所具有的所有功能。不用花我一毛钱,我就可以充分利用vim的全部功能。拆分,移动命令,寄存器,跳转,能够使用键盘运行我的整个开发环境...


4

是否有任何特定的IDE(或更少的多合一设置)实现了对动态语言的完全出色的支持,

考虑到您的评估很难理解(“非常出色”?“毫无头绪/过度热情”?),是否有任何IDE可以符合隐含标准值得怀疑。

简单地与Eclipse + Java进行比较是愚蠢的,因为动态语言不是Java。

还是这仍然是“未解决”的问题?

不完全的。

这可能是无法解决的。您的要求(“缺少完工和其他资产”)使得变得更加精确。

动态语言不能具有与静态语言相同的代码完成类型。基本上是不可能的。

一些IDE可以很好地进行猜测。例如,Eclipse具有用于动态语言的插件。


3

我认为Steve Yegge的演讲仍然有意义。简而言之,大约有一半的Java脚本思想(intelliJ IDEA),但是动态语言通常在追赶,不是因为制作这些工具(或实际上是语言)在本质上更难,而是静态语言所有的关注第一。


实际上,Yegge的演示文稿是我提出问题的根本原因:如果存在启发式技术和其他描述的技术,那么所有出色的实现都在哪里?在IntelliJ上:查看我在原始帖子中留下的评论(如果我错了,请告诉我)
vemv 2012年

2014 -还是敌不过最佳静态的IDE
小室

3

我整天都在使用javascript / php和ruby进行Web应用程序编程,而我为此找到的最好的IDE是Aptana。它具有所有这三种语言(和python)的代码完成功能,它可以拾取我的本地变量,最重要的是,当使用html和css时,它可以拾取html中的id以供css / javascript使用,并拾取功能我在做快速又肮脏的事情并编写内联javascript时的名称(我知道不好,但有时对概念证明很有用)。它内置了rake任务,并内置了对git和命令行控制台的支持。我花了一些时间起床,但是一旦我发现,我几乎没有在编码时离开过我的IDE,这为我节省了很多时间。


为什么对我的经验“完全出色的经验”实现的关于IDE内部动态类型语言开发的答案投反对票。手术要求什么?
瑞安

2

我发现Wing IDE对Python的支持非常出色。它在代码完成方面做得很好,并且其调试器的功能与非动态C#的Visual Studio一样强大。

我可以证明它不是越野车,缓慢或无知的。我从未使用过Eclipse,因此我对此一无所知,但我认为更大的问题是:为动态语言开发完整的,可提高生产率的IDE是否存在一些固有的障碍。鉴于我在Python和Wing方面的经验,我倾向于说事实并非如此。但是,这当然更加困难。


2

微软的Visual Studio是许多程序员使用的IDE,它支持IronRubyIronPython和F#。大多数人会认为Ruby和Python是一种动态编程语言,而F#则不是。

作为回应,F#是一种编程语言。

F#(发音为F Sharp)是一种针对.NET Framework的多范式编程语言,它包含功能性编程以及命令性和面向对象的编程学科。它是ML的一种变体,并且与OCaml的实现基本兼容。

尽管确切定义“动态语言”的确切定义尚待争论,但大多数人都同意JavaScript比C#更“动态”。根据维基百科:

动态语言的定义是模棱两可的,因为它试图在代码和数据之间以及编译和运行时之间进行区分,而这并不是通用的。虚拟机,即时编译以及某些系统上许多编程语言直接修改机器代码的能力使区分变得抽象。通常,关于语言是动态的断言更多地是关于动态功能易于使用的断言,而不是对语言功能的明确表述。

我不想在这里打开一罐蠕虫。有人会建议将F#更正确地描述为一种功能性语言,而不是一种动态语言,我不会对此予以例外。我相信可以说是各种.Net语言,F#通常被认为比C#或VB更适合于动态编程。

您可能想看看:什么使编程语言具有动态性?


4
您能解释一下“ F#是一种动态语言”是什么意思吗?它比C#更具动态性吗?
Arseni Mourzenko 2012年

1
其次,我不会认为F#是动态语言。哎呀,C#可能是(现在还不确定F#是否有现成的等效产品)“更加动态”的dynamic内置功能。但是,无论哪种方式,通常都不是动态键入的,而且也缺少与“动态语言”相关的大多数其他功能(更不用说文化了)。

2

静态类型语言和动态类型语言之间的主要区别在于,系统可以肯定地知道符号引用在编译时的含义。

这使得从编译器在编译时生成的信息中直接收集所需的信息变得非常容易,该信息是由编译器生成的(直接将其大部分时间移到“编辑”时)。

如果您有一个独立的方法签名,只是说该方法带有一个“事物”,那么编辑器将如何帮助您知道要发送的内容?它如何帮助建议使用事物的方法?

鸭式输入也无济于事-即使是最聪明的编辑器也无法告诉您,仅仅是因为您的对象具有.executeFooOp()方法,该代码可以对该对象执行代码“ .executeBarOp” (尽管它可以搜索其余的代码库并做出一些明智的猜测)。

但是,如果您知道它是签名中的“字符串”,则知道您可能会在该字符串上调用的所有方法,并且当该用户正在键入需要调用方法的方法时,可以建议该变量字符串作为参数。您甚至可以建议子类,如果您愿意的话,可以将其转换为子类。

除非您可以使用比典型编译器更加智能的功能对整个代码库进行完整扫描,否则动态类型语言将无法提供这些信息。


1
“静态类型语言和动态类型语言之间的主要区别在于,系统可以肯定地知道符号引用在编译时意味着什么。” –是的,但这不是必须的。如果IDE在运行时而不是在编译时工作,则它不需要在编译时知道此信息。在运行时,信息可用的,否则程序无法运行,甚至。
约尔格W¯¯米塔格

1
ide无法在运行时运行-更准确地说,一次只能在一个可能的分支上运行。运行时是有条件的,给定的符号可能意味着一次通过一件事,而另一次则意味着另一件事,因此,如果您的“编辑器”在“一次通过”中处于“运行中”(甚至是如何工作的??),它是如何实现的?从“另一个通行证”获取信息以完成文本?为此,如果您要编写要插入尚未编写的模块的库,该怎么办?
Bill K

@billk实际上,IDE在运行时运行良好。如果您先进行测试,则运行时将知道您所期望的对象。尝试一会儿聊天。
Stephan Eggermont 2015年

0

至少对于PHP,许多IDE都“理解”了类似的东西

/** @var $foo ClassA **/

如果您以标准化方式(在本例中为phpDocumentor)进行文档编写,IDE将充分利用它。


2
因此,您说的是,如果您键入静态编译语言要求您键入的所有内容,那么您可以找到与任何静态类型的语言都可以找到的相同信息-我想是的,但为什么不跳过额外的步骤并转到静态类型的语言?
Bill K

因为再次,至少php对简单类型做了一些自动转换。另外,由于这样做是一种动态语言,因此您可以决定在哪里指定类型。在进行敏捷开发时,您可能需要推迟决策,例如“我是否将类用作类型或接口?”
ACNB 2012年

@ACNB:大量的“静态”语言还允许自动转换和类型推断。例如,C ++,C#等。
Arafangion

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.