적당히 기능에만 만족하며 쓰면 되지만, 얘들이 뭘 하는 애들인지 좀 정확하게(나름대로) 알고 싶었다.
‘나름대로’를 붙인 이유는, 아직 확실히 알진 못하기에..
나만 이런게 궁금하진 않을터, 찾아보니 관련 글이 있긴 했는데.. 이 글은 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 을 보다 더 강력하게 지원한다고 생각하면 되겠다.
** 뱀다리
글 쓰느라 공부는 많이 했네..