VS Code : Pylance, Jedi, Tabnine 간 상관관계?

적당히 기능에만 만족하며 쓰면 되지만, 얘들이 뭘 하는 애들인지 좀 정확하게(나름대로) 알고 싶었다.
‘나름대로’를 붙인 이유는, 아직 확실히 알진 못하기에..

나만 이런게 궁금하진 않을터, 찾아보니 관련 글이 있긴 했는데.. 이 글은 Pylance 와 Intellicode 의 차이점을 설명하고 있었고, 이어지는 글타래에서 Pylance 와 JediLSP 의 다른점에 대해 질문을 하는 내용까지 나와있다. 답은 22년 3월 현재 아직 없다.

여기서 또 한가지 의문. Language Server 란 또 뭔가?? Language Server 와 Language Server Protocol 이란 개념이 따로 존재하는데, 둘이 같은 듯도 하고, 또 아닌 듯도 하고. 엄밀하게 말하자면 아니어야 할 듯 한데, 그냥 섞여 쓰이는 모양이다.

일단, Language Server Protocol 은 위키피디아에 등재돼 있으므로, 내용을 살펴볼 수 있었다. 내용을 요약하면 이렇다.

IDE/Editor 들에서 각각 독자로 제공하던 여러 편의 기능(Code completion, refactoring, 기타 등등..)을, 환경에 구애받지 않고 여러 곳에서 쓰일 수 있도록 만든 서비스. (이게 이해가 되나?? 내가 쓴 말이지만..)

Jedi 를 예로 설명해보자.

  • Jedi – Autocompletion, static analysis and refactoring library for Python
  • Jedi Language Server – Language Server for Jedi

그리고, Wikipedia 에 있는 글을 그대로 옮겨와보자.

The Language Server Protocol allows for decoupling language services from the editor so that the services may be contained within a general purpose language server. Any editor can inherit sophisticated support for many different languages by making use of existing language servers.

Wikipedia

미루어 짐작하면, Jedi 는 Language Server(Service) 가 되고, jedi-language-server 는 Language Server 라기 보다는 Language Server Protocol 이 된다. 그렇지만, JLS Github 에는 JLS 가 ‘A Language Server for the latest version(s) of Jedi.’ 라고 쓰여있다.
헷갈려..

어찌됐든, Language Server Protocol 은, Jedi 와 같은 특정 기능을 해주는 프로그램과, 실제 개발환경(IDE/Editor)을 연결해주는 역할을 한다고 보면 되겠다. 이렇게 됨으로써, VS Code 용 Jedi, Sublime Text 용 Jedi 등등이 따로 존재하지 않아도, Jedi 는 홀로 존재할 수 있고, 이를 연결시켜주는 LSP 와 연동만 되면 마치 전용 기능처럼 잘 돌아갈 수 있도록 설계된 개념… 이라고 난 이해하련다. (더 생각하다간 두어달치 짜증이 밀려올 듯하여..)
이 개념은 VS code 를 위해 탄생했지만, 지금은 표준(Open Standard 라고 표현돼 있음)으로 자리 잡아가는 모양이다.


여기까진 이론인데..

과연, VS Code/Codium 에선 이 개념을 어떻게 쓰고 있는건지??
Pylance 는 LSP 규격을 따르는 Language Server 다.

Pylance is a new language server for Python, which uses the Language Server Protocol to communicate with VS Code.

그리고 Pylance 는, Code/Codium 의 Python:Language Server 설정에서 Pylance/Jedi 중 고를 수 있게끔 돼 있으므로, 여기서 Jedi 도 결국 ‘서버’라는 사실을 알 수 있게 된다.
여기까진 이해가 되는데..

Jedi 는 그럼 Code/Codium 과 어떻게 통신을 하나? 또, Jedi 를 사용하기 위해선 Python 용 Jedi 를 설치해야 하나?
이 문제들의 답은 이 글 아래에 있다.

여기서, Black 은 어떤 방식을 쓰는지 알아보자.
Python Format 확인 도구인 Black 을 VS Code 에서 사용하려면, 먼저 Black 을 설치해야만 한다. 만약 Black 이 없다면, VS Code 는 알아서 설치작업을 대행(?)해준다. (이때 pip 을 사용한다.)

헌데, Jedi 는 이런게 없다. Jedi 문서에서도, 그냥 VS Code 용 Python Extension 만 설치하면 된다고 한다. 하여 또 삽질을 해보니.. 이건 문서에 말한 그대로, Python Extension 에 포함돼 있었다.

~/.vscode-oss/extensions/ms-python.python-2022.2.1924087327/pythonFiles/lib/jedilsp

이 위치에 자리잡고 있다.
어라.. 근데 좀 이상하다. Jedi 가 아니고, Jedilsp 다. 그 안에 들어가보면..

$ ll
total 168K
drwxr-xr-x 1 userx userx   40 2022-03-10 15:48 bin
drwxr-xr-x 1 userx userx   72 2022-03-10 15:48 docstring_to_markdown
drwxr-xr-x 1 userx userx  140 2022-03-10 15:48 importlib_metadata
drwxr-xr-x 1 userx userx  298 2022-03-10 15:48 jedi
drwxr-xr-x 1 userx userx  276 2022-03-10 15:48 jedi_language_server
drwxr-xr-x 1 userx userx  246 2022-03-10 15:48 parso
drwxr-xr-x 1 userx userx  610 2022-03-10 15:48 pydantic
drwxr-xr-x 1 userx userx  282 2022-03-10 15:48 pygls
drwxr-xr-x 1 userx userx  118 2022-03-10 15:48 typeguard
drwxr-xr-x 1 userx userx  120 2022-03-10 15:48 __pycache__
-rw-r--r-- 1 userx userx  18K 2022-03-10 15:48 README.md
-rw-r--r-- 1 userx userx  45K 2022-03-10 15:48 dataclasses.py
-rw-r--r-- 1 userx userx  86K 2022-03-10 15:48 typing_extensions.py
-rw-r--r-- 1 userx userx 8.3K 2022-03-10 15:48 zipp.py

이렇게, jedi 와 jedi language server 가 모두 설치돼 있음을 확인해볼 수 있다. Jedi/Jedilsp 모두 22.03 현재 최신판(0.18.1/0.35.1)이 제공되고 있다.

마지막으로, github 에 올라온 글을 보자면, log 에 Starting Jedi language server 라는 문구가 포함돼야 한다는 말과, Jedi 는 곧 사용중지될 것이란 얘기도 있다. 이게 21년 글인데, 22년 현재 Jedi 는 사라지고 Jedi LSP 가 사용되고 있다고 볼 수 있겠다. 로그 위치는 다음과 같다.

~/.config/VSCodium/logs/20220319T000948/exthost1/output_logging_20220319T000950/1-Python.log

아.. 그냥 쓰면 될 걸, 왜 이리 복잡하게 생각을 하는건지. 이러니 사는게 이 모양 이 꼴이지.

어찌됐든, 결론은 나왔다.

2022년 3월 현재, VS Code 의 Jedi 는 JediLSP 를 통해 구현되며, Python Extension 에 포함돼 있으므로 따로 설치할 필요는 없다.
Pylance 는 결국 Jedi 와 같은 역할을 하는데, MS 작품이다.


자.. 그리고 마지막. Tabnine 은 무슨 역할?

Pylance/Jedi 에도 코드 완성(Code Completion) 기능이 있다. 이미 입력한 코드를 재입력할 때, 원하는 문구를 모두 넣지 않아도 일부만으로 완성할 수 있게 해주는 기능인데, 타자 수도 줄여주지만, 오타를 없애서 프로그래밍 오류를 막는데도 큰 도움이 된다.

백문이 불여일견.

fresh_fruits = {
    'apple': 10,
    'banana': 8,
    'lemon': 5,
    'orange': 13,
    'raspberry': 21,
    'blueberry': 55,
}

이런 코드가 있다고 할 때, 여기서 이런 명령을 넣고 싶다고 해보자.

fresh_fruits.get('apple')

Jedi/Pylance 모두, fresh_fruits.get 까지는 자동 완성이 된다. 그러나, ‘apple’ 까지는 불가능한데, Tabnine 은 여기까지 가능하게 해준다.

즉, Code Completion 을 보다 더 강력하게 지원한다고 생각하면 되겠다.

** 뱀다리

글 쓰느라 공부는 많이 했네..

Author: 아무도안

안녕하세요. 글 남겨주셔서 고맙습니다.