Indeksowanie kodu#
Wstęp#
Spośród wszystkich dostępnych wariantów nawigacji po kodzie najbardziej wyspecjalizowane są systemy indeksujące kod źródłowy #(source code tagging/indexing system). Są to narzędzia analizujące kod źródłowy i oznaczające pewne kluczowe jego elementy za pomocą tagów (lub też stosujące inną formę indeksacji), które na potrzeby późniejszego przetwarzania zwykle umieszcza się w jakimś indeksie (np. pliku lub bazie danych). W zależności od danego języka i przyjętego rozwiązania indeksowane mogą być funkcje, zmienne, stałe, klasy, referencje, deklaracje, makra, nazwy symboli, komentarze, itd. Następnie indeks taki można szybko przeszukiwać, a zwracane wyniki mogą posłużyć do nawigacji po kodzie w konkretnym już edytorze tekstu (np. dzięki wtyczkom z wygodnym GUI).
Z uwagi na sposób analizowania kodu źródłowego wszystkie systemy indeksowania można podzielić na dwie główne grupy:
- Systemy operujące wprost na tekście - gdzie wszystko odbywa się na zasadzie przeszukiwania tekstu za pomocą wyrażeń regularnych lub poprzez odpowiednie jego sparsowanie. Ze względu na prostotę, szybkość działania i późniejszą elastyczność jest to najczęściej spotykane rozwiązanie, ale ma ono sporo ograniczeń i nie może wyrazić wszystkich powiązań w kodzie. Najpopularniejszy w tej kategorii z pewnością będzie Ctags i późniejsze jego usprawnienia w postaci Exuberant Ctags czy Universal Ctags.
Systemy typu klient-serwer - gdzie wszystko odbywa się na zasadzie komunikacji między edytorem tekstu (klientem) a oprogramowaniem właściwym dla danego języka (serwerem). Chyba najpopularniejszy rozwiązaniem tego typu będzie microsoftowy protokół Language Server Protocol (LSP) używany do komunikacji między klientem a serwerem oraz format Language Server Index Format (LSIF, wymawiane jako "else if") będący efektem indeksacji po stronie serwera. Istnieje sporo gotowych serwerów językowych i klientów dla różnych edytorów tekstowych zgodnych z LSP/LSIF. Serwery językowe oprócz nawigacji po kodzie oferują także jego refaktoryzację, formatowanie, dokumentowanie, świetne autouzupełnianie czy podpowiadanie definicji po najechaniu kursorem myszy na dane polecenie, i wiele więcej.
Oczywiście istnieją także inne rozwiązania przynależące do tej grupy, gdzie indeksowanie wspierane jest np. poprzez rzeczywistą interpretację czy kompilację kodu. Przykładem może być rtags, który wykorzystuje Clang (WikiEN, WikiPL) dla LLVM (WikiEN, WikiPL). Indeksowanie oparte na kompilacji cechować się może bardzo wolnym działaniem, szczególnie w dużych projektach, ale za to jest w stanie zidentyfikować bardziej wyrafinowane powiązania w kodzie.
Wydzielenie odpowiedzialności za rozwój usług językowych od edytorów tekstowych, w których są one wykorzystywane, wydaje się być słusznym kierunkiem. Pozwala to twórcom języków i twórcom edytorów tekstowych skupić się na ich specjalności. To dość nowy pomysł, ale zdążył już zyskać uznanie wśród szerokiego grona odbiorców, a jego dalsza adaptacja na większą skalę nie powinna zająć zbyt wiele czasu.
Obecnie mamy też dostęp do uniwersalnych narzędzi działających w różnych systemach operacyjnych, które pozwalają wybrać dowolny system indeksowania kodu źródłowego (pod warunkiem, że będą one ze sobą zgodne), jak w przypadku bardzo popularnego GNU Global (patrz "Using rtags ang gtags for coding Ruby").
W programie Notepad++ nie ma żadnego wbudowanego mechanizmu indeksowania kodu, ale przy użyciu wtyczek utworzono front-end dla kilku rozwiązań z grupy pierwszej. Obsługa LSP/LSIF to wciąż pieśń przyszłości (bug 4440, dyskusja na forum), dlatego też dalsze opisy dotyczyć będą tylko tych systemów indeksowania kodu, które możemy wypróbować bezpośrednio w programie NPP. W przypadku pozostałych rozwiązań należy poszukać dodatkowych informacji na własną rękę. Oto kilka przydatnych materiałów:
- "Source code reading related sites" - świetny wykaz różnych materiałów związanych z indeksowaniem kodu źródłowego.
- "Comparison with Similar Tools" - porównanie kilku systemów indeksowania kodu źródłowego (LXR, ctags, cscope, ViewVC, GNU GLOBAL, OpenGrok, Woboq).
- "Tags and LSPs where do I start?" - podstawowe informacje na temat indeksowania kodu opartego na tagach lub protokole LSP.
- "Is there any use for ctags if i use an LSP client?" - dyskusja na temat indeksowania kodu opartego na tagach lub protokole LSP.
- "GNU GLOBAL source code tagging system" - dyskusja na temat najpopularniejszych systemów indeksowania kodu źródłowego.
- "Language Server Protocol Tutorial: From VSCode to Vim" - ciekawy poradnik z przykładowym serwerem językowym opartym na Node.js i klientem w edytorach VS Code, Sublime Text 3 i Vim.
- OpenGrok (GitHub, WikiEN) - system indeksowania kodu źródłowego napisany w Javie i obsługujący różne języki/formaty, włącznie z historią tworzoną przez różne systemy kontroli wersji.
- Cscope (SourceForge, WikiEN) - system indeksowania kodu źródłowego dla języka C oraz z pewnymi ograniczeniami także dla języków C++ i Java.