只改变IDE是不够的
jopen 12年前
互联网上各种 IDE 新创意不绝于耳,感兴趣的朋友可以看看 Bret Victor 的 <a href="/misc/goto?guid=4958332264443232778" rel="nofollow" target="_blank">视频演示</a>。Chris Granger 在推介 <a href="/misc/goto?guid=4958339347060917679" rel="nofollow" target="_blank">自己 IDE</a> 的相关概念方面相当成功。Josh Marinacci <a href="/misc/goto?guid=4958339347857175276" rel="nofollow" target="_blank">探讨了</a>IDE 改进的一些可能性。(译注:还有一篇相关文章: <a href="/misc/goto?guid=4958339348648297881" rel="nofollow" target="_blank">即时C#</a>)我在 IDE 开发领域已经工作了十几个年头,对于这些声音我的感情非常复杂。一方面,为人们展示 IDE 可能提供的新功能并将他们从麻木中唤醒是一件好事。然而另一方面,我也担心人们会把这些新创意和新功能应用到现有的编程语言上。我不认为“只要给 Java 或 JavaScript 加上一个完美的 IDE 世界就变得更加美好”,我担心这样只会带来失望和悲观。 <p> 代码同步执行是一个具有启发性的功能:用实际执行结果作为代码的注释,在编辑代码的同时可以看到语义变化,连调试代码都不需要了!过去 30 年间,这个超酷的功能被人不断提起。长久以来,代码同步执行功能始终没能摆脱演示阶段(包括我自己的工作),很多棘手的基本问题尚未解决。可变状态要怎么处理?(参考 <a href="/misc/goto?guid=4958339349438896673" rel="nofollow" target="_blank">Circa</a>)I/O 要怎么处理?非确定性和异步要怎么处理?只有阶乘函数或之类的代码可以同步执行,那么这个功能便无法应用到实际编程工作中。一般说来,你还是需要编辑无效代码并利用传统的调试器来检查代码的执行情况。所以,一个复杂的 IDE 已经提供了你所需要的所有功能。为什么还要画蛇添足呢?</p> <p> 很多花哨的代码可视化方案同样因为折衷而被否决。数以百计研究查询和可视化代码的论文被发表。对于精心挑选的示例代码,它们都表现出色,但还是不能很好地应对现实的代码。那么,为什么还要设计用途有限却如此复杂的功能呢?要实现通用的代码可视化非常难,在不允许修改语言本身以提供帮助的时候时尤其如此。</p> <p> IDE 最根本的问题在于,它们受制于编程语言的语法和语义。我们的编程语言都是为文本编辑器设计的,也就难怪我们的 IDE 看上去像是浓妆艳抹的写字板。同样的,我们的编程语言都被设计成命令式语义,尽管与硬件配合很高效但却不支持静态可视化。如果为旧语言直接设计一个全新的 IDE 就可以魔术般地改变语法和语义,这就是一种奇迹。然而我不相信奇迹会发生。</p> <p> (译者注:命令式语义:命令式编程语言,例如C#,Java 或C++。语言特征在于,代码除了体现出想要解决的问题,还要关心机器是如何处理的,例如会在代码里写 for 循环,if 语句等等。)</p> <p> 语言和 IDE 彼此息息相关,牵一发而动全身。这也就是我 3 年前开始搁置 IDE 的工作转而关注语言设计的原因。摆脱命令式语义的束缚是工作的目标之一。另一个目标是去除源代码文件(同样也需要摆脱 AST——抽象语法树,它承载了所有文本编码信息但不具备可读性)。这项工作极其困难而且孤独,甚至没有人愿意谈论这些疯狂的想法。<strong>尽管如此,我始终坚信只要采用汇编语言的后代编程,就不可能摆脱由文本编辑器发展出来的开发工具。</strong></p> <p> 英文原文: <a href="/misc/goto?guid=4958339350233450142" rel="nofollow" target="_blank">Jonathan Edwards</a> 编译:<a href="/misc/goto?guid=4958185140659301754" target="_blank">伯乐</a>在线 – <a href="/misc/goto?guid=4958339351777826475" target="_blank">唐尤华</a></p>