智能代码补全

智能代码补全[1]是一种编程环境中,有上下文感知的的代码自动完成功能。它可以通过减少打字错误和其他常见错误,使编写应用的速度得到提升。智能代码补全通常在键入、查询函数参数以及与语法错误相关的查询提示时,会弹出自动完成窗口。智能代码补全和相关工具使用反射式编程产生变量名称、函数和方法的文档以及消除歧义。[2]
该功能出现在许多编程环境中。[3][4]其实现包括Atom中的 “autocomplete +”和Visual Studio Code中的 IntelliSense。该术语最初被命名为“选择列表”,一些实现仍然这样称呼它。[5]
概述
[编辑]与其他自动完成系统相似,智能代码补全可以便捷地访问函数的定义,尤其是参数列表。这项功能因为减少键盘输入和不需要记忆名称,加速了软件开发。它同时允许用户更少地查阅外部文档,由于许多在当前范围的符号的交互式文档会以提示框的形式动态显现。[6] 智能代码补全使用内存里的自动生成数据库,其中有类,变量名,和代码中定义或提及的其他概念。典型的智能感知功能的实现,靠的是检测“标记符”,例如句号(或者其他分隔符,由语言决定)。当用户输入有可访问成员(比如成员变量或函数)的实体,紧接输入此类字符时,立刻就弹出一个智能感知建议的弹窗。用户可以通过键入一个完成语句的符号(Tab ↹,↵ Enter,或者在C++中的分号)接受建议,也可以继续输入。久而久之,智能感知会决定用户最可能需要的变量或函数。智能感知还会凭借函数的源代码中的文档,在弹窗内显示函数的简介。 在支持面向对象编程的语言中,这项功能也让用户从一系列重载的函数中选择。一些代码编辑软件以语言服务器的方式提供智能代码补全功能。
历史
[编辑]智能代码补全技术的研究始于1957年,当时的研究包括用于识别位图图像中连笔手写文字的拼写检查程序,以及能够在数据库记录存在输入错误时仍然检索到相应记录的专用应用程序。1961年,主持这一新兴技术研究的莱斯·欧内斯特(Les Earnest)认为,有必要开发首个能够访问包含10,000个有效单词的词表的拼写检查程序。[7]
当时在欧内斯特指导下攻读研究生的拉尔夫·戈林(Ralph Gorin)开发了首个真正面向通用英语文本、以实际应用而非研究项目形式编写的拼写检查程序。该程序名为SPELL,运行于斯坦福大学人工智能实验室(SAIL)的DEC PDP-10计算机上,于1971年2月发布。[8]
为了提高运行速度,戈林使用汇编语言编写了该程序。SPELL通过搜索词表,寻找与输入单词仅相差一个字母或相邻字母顺序颠倒的可能正确拼写,并将候选结果呈现给用户。与SAIL的大多数程序一样,戈林将SPELL向公众开放。随后,该程序通过当时新兴的阿帕网迅速传播至世界各地,比个人计算机开始广泛普及早了约十年。[9] SPELL及其算法和数据结构也启发了UNIX平台上的Ispell程序。
编辑器与集成开发环境中的支持
[编辑]Visual Studio
[编辑]IntelliSense是微软开发的代码补全技术,以其在Visual Studio中的应用最为知名。1996年,微软在Visual Basic 5.0 Control Creation Edition中首次将该技术引入主流产品。这一版本实际上是Visual Basic 5.0的公开原型版本,其所采用的代码补全与语法检查技术建立在此前已有的多项技术概念之上。
最初,Visual Basic集成开发环境是IntelliSense技术的主要测试平台。随后,在Visual Studio 97开发期间,IntelliSense被引入Visual FoxPro和Visual C++,比其首次出现在Visual Basic中晚了一个版本。
由于IntelliSense建立在组件对象模型(COM)的自省能力之上,Visual Basic版本的IntelliSense在功能完整性和可靠性方面始终优于Visual C++ 5.0和6.0版本(分别对应Visual Studio 97和98)。后者并非完全基于COM,因此无法充分利用相关机制。自Visual Studio 97发布以来,这些缺陷一直受到许多Visual C++开发者的批评,而在.NET系列产品中已得到较大程度的改善。例如,早期.NET之前的版本缺乏对模板的支持,这是开发者最迫切希望增加的功能之一,而后续版本已完整实现这一功能。[10]
随着统一的Visual Studio .NET开发环境于2001年首次发布,IntelliSense进入了新的发展阶段。.NET框架提供了更强大的自省和代码文档功能,进一步增强了IntelliSense的能力。此后,Visual Studio编辑器中的IntelliSense逐步支持C++、C#、J#、Visual Basic、XML、HTML和XSLT等多种编程语言及标记语言。
从Visual Studio 2005开始,IntelliSense默认在用户开始输入时自动激活,不再需要输入特定的触发字符,不过用户仍可关闭这一功能。集成开发环境还能够根据开发者正在输入的内容推断更多上下文信息,甚至将for和while等基本语言结构纳入补全候选列表。
2017年,微软公布了IntelliCode。[11] 该技术利用机器学习,根据用户的每次按键推断最有可能使用的语言特性或程序库功能。IntelliCode最初仅以C#扩展的形式提供,当时预计将在未来的Visual Studio版本中成为内置功能。
Visual Studio 2022引入了人工智能功能,能够根据周围的代码上下文自动建议整行代码。
其他集成IntelliSense技术的微软产品包括Expression Web、FrontPage 2003、Small Basic、Microsoft Office中的Visual Basic for Applications集成开发环境、Visual Studio Code等。此外,SQL Server 2008 Management Studio也提供针对SQL语法的自动补全功能。
Eclipse
[编辑]Eclipse IDE内置了代码补全工具。[12][13]这些工具为Java、C++和JavaScript等编程语言的代码编写提供了支持。
Eclipse的Code Recommenders项目曾提供功能强大的智能代码补全功能,[14]但由于资源不足,该项目在Eclipse 2018-12版本中被移除,并于2019年7月正式归档。[15][16][17]
Vim
[编辑]Vim Intellisense[18]是专为Vim文本编辑器设计的高级代码补全系统。
示例
[编辑]假设开发者正在Visual Studio中编辑一个C++应用程序,其中定义了包含若干成员函数的Foo类:
class Foo {
public:
void bar();
void foo_bar(char c, int n);
};
当开发者在源代码中引用该类时,例如:
Foo foo;
foo.
当用户在foo后输入句点(.)时,IntelliSense便会自动列出所有可用的成员函数(即bar()和foo_bar())以及成员属性。对于私有成员和受保护成员,IntelliSense可以在其名称旁显示锁形图标,以标识其访问权限。用户随后可以使用方向键选择所需的成员,并在相应成员函数被高亮显示时输入补全字符,以完成选择。如果源代码文档中包含相关说明,IntelliSense还会显示该成员函数的简短描述。
IntelliSense还能够在用户填写函数参数时,通过另一个弹出窗口提示所需的参数。当用户输入变量名时,该功能也会根据已输入的字符提供变量名补全建议。在用户继续输入参数的过程中,IntelliSense会持续显示参数列表,并高亮标示当前正在填写的参数。
用户还可以通过Ctrl+J或Ctrl+Space快捷键,强制IntelliSense显示补全候选列表,而无需依赖当前代码上下文。在Visual Studio中,此操作会显示开发者可用的完整应用程序域对象模型。
参考来源
[编辑]- ^ Bruch, Marcel; Monperrus, Martin; Mezini, Mira. Learning from examples to improve code completion systems. Proceedings of the 7th joint meeting of the European software engineering conference and the ACM SIGSOFT symposium on the foundations of software engineering on European software engineering conference and foundations of software engineering symposium - ESEC/FSE '09 (PDF). 2009: 213 [2022-12-13]. ISBN 9781605580012. S2CID 18621745. doi:10.1145/1595696.1595728. (原始内容存档 (PDF)于2022-12-13).
- ^ Definition of autocomplete | Dictionary.com. www.dictionary.com. [2022-12-13]. (原始内容存档于2023-03-06) (英语).
- ^ FAQ - Code::Blocks. wiki.codeblocks.org. [2022-12-13]. (原始内容存档于2020-09-18).
- ^ Qt Documentation - Completing Code (页面存档备份,存于互联网档案馆). Retrieved on 2015-07-07.
- ^ Salesforce. Working with Picklists in Apex and Lightning Web Components. developer.salesforce.com. 2008-12-09 [2022-12-13]. (原始内容存档于2022-12-13) (美国英语).
- ^ Murach. C# 2005. : 56.
- ^ Earnest, Les. The First Three Spelling Checkers (PDF). Stanford University. [2011-10-10]. (原始内容 (PDF)存档于2012-10-22).
- ^ Peterson, James. Computer Programs for Detecting and Correcting Spelling Errors (PDF). December 1980 [2011-02-18]. (原始内容存档 (PDF)于2018-06-25).
- ^ Earnest, Les. Visible Legacies for Y3K (PDF). [2011-02-18]. (原始内容 (PDF)存档于2011-07-20).
- ^ Using IntelliSense (页面存档备份,存于互联网档案馆). Msdn.microsoft.com. Retrieved on 2014-04-04.
- ^ Visual Studio IntelliCode. [2022-12-13]. (原始内容存档于2023-04-08).
- ^ Eclipse Corner Article: Unleashing the Power of Refactoring | the Eclipse Foundation. [2022-12-13]. (原始内容存档于2023-04-15).
- ^ Technologies. [2022-12-13]. (原始内容存档于2017-07-08).
- ^ Eclipse Code Recommenders: It’s all about intelligent code completion (页面存档备份,存于互联网档案馆). Code-recommenders.blogspot.com (2010-05-03). Retrieved on 2014-04-04.
- ^ 542689 - Don't include Code Recommenders for 2018-12. [2022-12-13]. (原始内容存档于2022-12-13).
- ^ cross-project-issues-dev Withdrawing Code Recommenders from SimRel. [2022-12-13]. (原始内容存档于2022-12-13).
- ^ Archived Projects | The Eclipse Foundation. [2022-12-13]. (原始内容存档于2023-04-22).
- ^ Vim Intellisense (页面存档备份,存于互联网档案馆). Insenvim.sourceforge.net. Retrieved on 2014-04-04.
外部链接
[编辑]- Torre, Charles. Arjun Bijanki: Making Sense of VC Intellisense (Video). Channel9. Microsoft. 2008-01-24 [2022-12-13]. (原始内容存档于2008-06-02).
- Using IntelliSense. VS .NET 2003 2015. MSDN. [2022-12-13]. 原始内容存档于2008-10-12.
- IntelliSpeed Tutorial. Visual Prolog. [2022-12-13]. (原始内容 (Video)存档于2010-08-05).