تکمیل کد هوشمند

ویژگی تکمیل کد آگاه از متن، در محیط‌های برنامه‌نویسی

تکمیل کد یک ویژگی تکمیل خودکار در بسیاری از محیط‌های یکپارچه توسعه [الف] است که با تصحیح اشتباهات تایپی رایج و پیشنهاد خطوط کد، فرایند کدنویسی را سرعت می‌بخشد. این قابلیت معمولاً در میانه کلیدزنی از طریق پنجره‌های بازشو (یا پاپ‌آپ) فعال می شود و به ارائه با پاسخ به پرسش‌هایی درباره پارامترهای توابع و راهنمایی در مورد خطاهای نحوی می‌پردازد. نرم‌افزارهای مدرن تکمیل کد عموماً از سیستم‌های هوش مصنوعی مولد برای پیش‌بینی خطوط کد استفاده می‌کنند. تکمیل کد و ابزارهای مرتبط، نقش مستندسازی و رفع ابهام در نام‌های متغیر، تابع و متد را ایفا می‌کنند و از تحلیل ایستا کمک می‌گیرند.[۱]

این قابلیت در بسیاری از محیط‌های برنامه‌نویسی دیده می‌شود.[۲][۳] یکی از پیاده‌سازی‌های این مفهوم، IntelliSense در ویژوال استودیو کد است. این اصطلاح در ابتدا به‌صورت «picklist» جا افتاده بود که به معنی «فهرست انتخابی» است و برخی پیاده‌سازی‌ها همچنان از این نام استفاده می‌کنند.[۴]

مروری کلی

ویرایش

تکمیل کد هوشمند[ب]، مشابه سایر سیستم‌های تکمیل خودکار، روشی راحت برای دسترسی به توضیحات توابع – به‌ویژه فهرست پارامترهای آن‌ها – به‌شمار می‌رود. این قابلیت با کاهش میزان تایپ و همچنین رفع نیاز به حفظ کردن نام‌ها، سرعت توسعه نرم‌افزار را بالا می‌برد. بعلاوه باعث می‌شود برنامه‌نویس کمتر به مستندات خارجی مراجعه کند. زیرا با توجه به موقعیت کاربر در کد و همچنین حوزه فعال[پ]، مستنداتِ تعاملی برای بسیاری از نمادها (یعنی متغیرها و توابع) بصورت پویا در قالب ابزارهای راهنما[ت] ظاهر می‌شود.[۵]

تکمیل کد هوشمند از یک پایگاه داده درون‌حافظه‌ای که به‌صورت خودکار ساخته می‌شود استفاده می‌کند. در این پایگاه، کلاس‌ها، نام متغیرها و سایر ساختارهایی که در کد تعریف یا ارجاع داده شده‌اند، نگه‌داری می‌شوند. پیاده‌سازی «کلاسیک» IntelliSense با شناسایی «کاراکترهای نشانه» (مانند نقطه یا سایر جداکننده‌های زبانی بسته به زبان) کار می‌کند. وقتی کاربر یکی از این کاراکترهای نشانه را بلافاصله پس از نام یک شی (که دارای اعضای در دسترس مانند متغیرها یا توابع درونی است) تایپ می‌کند، IntelliSense پیشنهادهای خود را در یک کادر بازشو به نمایش می‌گذارد. کاربر می‌تواند با فشردن کلیدهای تکمیل‌کننده عبارت[ث] (مانند Tab ↹ یا ↵ Enter) یا نشانه‌های خاص زبان (مانند نقطه‌ویرگول در ++C) پیشنهاد داده شده را بپذیرد یا اینکه به تایپ ادامه دهد. به‌مرور زمان، IntelliSense تشخیص می‌دهد که کاربر به احتمال زیاد به کدام متغیر یا تابع نیاز دارد. علاوه بر این، IntelliSense توضیح کوتاهی از یک تابع را در پنجرهٔ بازشو نشان می‌دهد – که این توضیح به میزان مستندات موجود در کد منبع تابع بستگی دارد.

این قابلیت همچنین در زبان‌هایی که از برنامه‌نویسی شیءگرا پشتیبانی می‌کنند، به برنامه‌نویس اجازه می‌دهد یک تابع را از میان چندین تابع جلوبار[ج] انتخاب کند. برخی نرم‌افزارهای ویرایش کد، با بهره‌گیری از پروتکل سرور زبان[چ] این تکمیل کد هوشمند را ارائه می‌دهند.

تاریخچه

ویرایش

تحقیقات پیرامون تکمیل کد هوشمند در سال ۱۹۵۷ و با غلط‌گیرهای املایی تصاویر بیت‌مپ تهیه شده از روی دست‌خط پیوسته[ح] و و همچنین استفاده در جست‌وجوی رکوردها در پایگاه‌های داده با وجود ورودی نادرست (با غلظ املایی) آغاز شد. در سال ۱۹۶۱، لز ارنست که سرپرستی این تحقیقات نوظهور را بر عهده داشت، لازم دید که نخستین غلط‌گیر املایی را طراحی کند که به فهرستی از ۱۰٬۰۰۰ واژهٔ قابل قبول دسترسی داشت.[۶] رالف گورین، دانشجوی تحصیلات تکمیلی زیر نظر ارنست، نخستین برنامه غلط‌گیر واقعی را به‌صورت یک نرم‌افزار (نه صرفاً پژوهش) برای متون عمومی انگلیسی نوشت. در فوریه ۱۹۷۱، برنامه SPELL برای رایانه DEC PDP-10 در آزمایشگاه هوش مصنوعی دانشگاه استنفورد[خ] منتشر شد.[۷] گورین برای افزایش سرعت این برنامه آنرا به زبان اسمبلی نوشته بود. روش کار این برنامه، جست‌وجوی فهرست واژگان برای پیدا کردن حالت‌های صحیح ممکن (که فقط در یک حرف یا جابه‌جایی دو حرف کنار هم تفاوت داشتند) و نمایش نتایج به کاربر بود. همان‌طور که بیشتر برنامه‌های SAIL عمومی بودند، او نیز SPELL را در دسترس عموم قرار داد و به سرعت از طریق آرپانت در سراسر جهان پراکنده شد.[۸] برنامه SPELL و الگوریتم‌ها و ساختار داده‌های آن الهام‌بخش ابزار یونیکسی Ispell بودند.

پشتیبانی در ویرایشگرها و محیط‌های توسعه

ویرایش

ویژوال استودیو

ویرایش

IntelliSense نام پیاده‌سازی شرکت مایکروسافت برای تکمیل کد است که بیشتر در ویژوال استودیوی شناخته می‌شود. اولین بار در سال ۱۹۹۶،[۹] با عرضه نسخه پیش‌نمونه‌ای برای ویژوال بیسیک 5.0 که عملاً پیش‌درآمدی برای این زبان بود، به یکی از محصولات اصلی از مایکروسافت تبدیل شد.[۱۰] در ابتدا، محیط ویژوال بیسیک بستری برای آزمایش این فناوری بود؛ اما IntelliSense در همان بازه زمانی ویژوال استودیو 97 به ویژوال فاکس‌پرو و ویژوال سی پلاس‌پلاس[۱۱] نیز اضافه شد (یک نسخه پس از مشاهدهٔ اولیه در ویژوال بیسیک). از آن‌جا که IntelliSense بر پایهٔ قابلیت‌های درونی COM[د] شکل گرفته بود، در نسخه‌های ویژوال بیسیک بسیار کامل‌تر از نسخه‌های 5.0 و 6.0 (در ترتیب نام‌گذاری ۹۷ و ۹۸) ویژوال سی پلاس‌پلاس بودند که کاملاً بر COM تکیه نداشتند. این کاستی‌ها (که از زمان عرضهٔ نسخهٔ ۹۷ با انتقاد بسیاری از توسعه‌دهندگان C++ روبه‌رو بود) تا حد زیادی در محصولات .NET برطرف شد. برای مثال، یکی از قابلیت‌های پرتقاضا که پیش از .NET وجود نداشت، پشتیبانی از الگو[ذ] بود که اکنون به‌طور کامل پیاده‌سازی شده است.[۱۲]

IntelliSense با یکپارچه شدن در محیط مایکروسافت ویژوال استودیو – که نخستین‌بار در سال ۲۰۰۱ منتشر شد – وارد مرحله جدیدی از توسعه شد. این نسخه از توانایی‌های قدرتمندتر درون‌کاوی و مستندسازی کد در .NET بهره می‌گیرد. در حال حاضر IntelliSense در ویرایشگرهای ویژوال استودیو برای سی پلاس‌پلاس، سی شارپ، جی شارپ، ویژوال بیسیک، اکس‌ام‌ال، اچ‌تی‌ام‌ال و XSLT و دیگر زبان‌ها پشتیبانی می‌شود. از ویژوال استودیو ۲۰۰۵ به بعد، IntelliSense به‌صورت پیش‌فرض وقتی کاربر شروع به تایپ می‌کند، فعال می‌شود و دیگر نیازی به وارد کردن کاراکترهای ویژه نیست (البته می‌توان این رفتار را غیرفعال کرد). محیط توسعه یکپارچه می‌تواند موضوعات فراتر از آنچه توسعه‌دهنده در حال تایپ است را حدس بزند، تا حدی که ساختارهای بسیار ابتدایی زبان مانند for و while را نیز در فهرست پیشنهاد قرار می‌دهد. در سال ۲۰۱۷ مایکروسافت IntelliCode[۱۳] را معرفی کرد که با استفاده از یادگیری ماشین تشخیص می‌دهد کدام ویژگی یا کتابخانه در هر لحظه احتمالاً مدنظر کاربر است. انتظار می‌رود این ابزار که ابتدا فقط برای C# در دسترس بود، در نسخه‌های آینده ویژوال استودیو به‌صورت پیش‌فرض گنجانده شود. ویژوال استودیو ۲۰۲۲ شامل قابلیت‌های هوش مصنوعی نظیر گیت‌هاب کوپایلوت است که می‌تواند بر اساس وضعیت زمینه و موقعیت کدهای اطراف، مجموعه کاملی از کد را به‌طور خودکار پیشنهاد دهد.

سایر محصولات مایکروسافت که از IntelliSense بهره می‌گیرند عبارت‌اند از مایکروسافت اکسپرشن وب، مایکروسافت فرانت‌پیج، مایکروسافت اسمال بیسیک، محیط‌های ویژوال بیسیک برای برنامه‌ها در مجموعه محصولات مایکروسافت آفیس، ویژوال استودیو کد و بسیاری دیگر. استودیو مدیریت مایکروسافت اس‌کیوال سرور 2008 نیز برای دستورهای SQL دارای ویژگی تکمیل خودکار است.

اکلیپس

ویرایش

محیط توسعهٔ اکلیپس نیز ابزارهای تکمیل کد دارد که همراه خود برنامه ارائه می‌شوند.[۱۴][۱۵] این ابزار برای کدنویسی به زبان‌های جاوا، سی++ و جاوااسکریپت بکار می‌رود. پروژه Code Recommenders در اکلیپس در گذشته ویژگی تکمیل کد هوشمند بسیار قدرتمندی داشت، اما به دلیل کمبود منابع، در نسخه 2018–12 اکلیپس کنار گذاشته شد و در ژوئیه ۲۰۱۹ بایگانی گردید.[۱۶][۱۷][۱۸]

ویم (Vim)

ویرایش

Vim Intellisense[۱۹] سیستم تکمیل کد پیشرفته‌ای برای ویرایشگر Vim است.

نمونه

ویرایش

فرض کنید یک برنامه سی++ در ویژوال استودیو در حال ویرایش است و کلاسی با نام Foo دارد که دارای چند تابع عضو است:

 class Foo {
  public:
    void bar();
    void foo_bar(char c, int n);
};

وقتی برنامه‌نویس این کلاس را استفاده می‌کند، برای نمونه:

 Foo foo; 
foo.

به محض این‌که کاربر نقطه را پس از foo وارد کند، IntelliSense به‌صورت خودکار تمام توابع عضو در دسترس (مثلاً bar() و foo_bar()) و همچنین خواص (attributes) عضو در دسترس را فهرست می‌کند (اعضای خصوصی و محافظت‌شده با علامت قفل در کار آنها مشخص می‌شوند). کاربر می‌تواند با کمک کلیدهای جهت و فشردن کلید تکمیل، هنگامی که تابع عضو موردنظر انتخاب شد، گزینه انتخابی را تایید کند. اگر مستنداتی در کد منبع برای تابع وجود داشته باشد، IntelliSense توضیح مختصری از آن را نمایش می‌دهد.

IntelliSense پا را فراتر گذاشته و حین وارد کردن پارامترها در یک کادر بازشو، پارامترهای موردنیاز را هم نشان می‌دهد. وقتی کاربر نام یک متغیر را تایپ می‌کند، این قابلیت حین تایپ، پیشنهادهایی برای تکمیل نام متغیر ارائه می‌دهد. IntelliSense حین این فرایند، پارامتر کنونی را برجسته کرده و به نمایش ادامه می‌دهد.

کاربر می‌تواند با فشردن Ctrl+J یا Ctrl+Space بدون نیاز به بافت کنونی هم کادر پیشنهادی IntelliSense را وادار به نمایش کند. در ویژوال استودیو، این پنجره کل مدل شیء دامنه برنامه را که برای توسعه‌دهنده در دسترس است، نشان می‌دهد.

یادداشت‌ها

ویرایش
  1. integrated development environment (IDE)
  2. Intelligent code completion
  3. active scope
  4. Tooltip
  5. statement-completion character
  6. overloaded functions
  7. Language Server Protocol (LSP)
  8. Cursive writing
  9. Stanford University's Artificial Intelligence Laboratory (SAIL)
  10. Component Object Model
  11. Template

منابع

ویرایش
  1. Robbes, Romain; Lanza, Michele (2008). "How Program History Can Improve Code Completion". 2008 23rd IEEE/ACM International Conference on Automated Software Engineering. pp. 317–326. doi:10.1109/ASE.2008.42. ISBN 978-1-4244-2187-9. S2CID 2093640.
  2. FAQ - CodeBlocks. Wiki.codeblocks.org (2014-02-01). Retrieved on 2014-04-04.
  3. Qt Documentation - Completing Code. Retrieved on 2015-07-07.
  4. Using Dynamic Apex to retrieve Picklist Values | Developer Force Blog. Blogs.developerforce.com (2008-12-09). Retrieved on 2014-04-04.
  5. Murach. C# 2005. p. 56.
  6. Earnest, Les. "The First Three Spelling Checkers" (PDF). Stanford University. Archived from the original (PDF) on 22 October 2012. Retrieved 10 October 2011.
  7. Peterson, James (December 1980). Computer Programs for Detecting and Correcting Spelling Errors (PDF). Retrieved 2011-02-18.
  8. Earnest, Les. Visible Legacies for Y3K (PDF). Archived from the original (PDF) on 20 July 2011. Retrieved 2011-02-18.
  9. "Microsoft KB Archive/165524 - BetaArchive Wiki". www.betaarchive.com. Retrieved 2023-11-19.
  10. "Microsoft Introduces Visual Basic 5.0, Control Creation Edition". Stories (به انگلیسی). 1996-10-28. Retrieved 2023-11-19.
  11. "Microsoft Introduces Visual C++ 6.0". Stories (به انگلیسی). 1998-06-29. Retrieved 2023-11-19.
  12. Using IntelliSense. Msdn.microsoft.com. Retrieved on 2014-04-04.
  13. Visual Studio IntelliCode
  14. "Eclipse Corner Article: Unleashing the Power of Refactoring". {{cite web}}: Text "the Eclipse Foundation" ignored (help)
  15. "Technologies". IBM.
  16. 542689 - Don't include Code Recommenders for 2018-12
  17. cross-project-issues-dev Withdrawing Code Recommenders from SimRel
  18. Archived Projects | The Eclipse Foundation
  19. Vim Intellisense. Insenvim.sourceforge.net. Retrieved on 2014-04-04.