Notice
Recent Posts
Recent Comments
Link
«   2024/06   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30
Tags
more
Archives
Today
Total
관리 메뉴

Visual Studio

Language Server 본문

Computer Engineering

Language Server

emacser 2024. 1. 16. 23:04

개요

Language Server 방식을 사용하기 이전에는 IDE에서 인텔리센스 플러그인을 구현하기 위해 Parser, Type checker 등

인텔리센스에 필요한 기능을 IDE 플러그인 기능이 지원하는 언어로 새로 작성해야 했습니다.

Language Server는 이러한 작업을 없애고 IDE에 종속적이지 않은 표준화된 인텔리센스 구현을 위해 제안된 방식입니다.

예를 들어, Language Server에 현재 작업중인 문서와 커서의 위치, 액션(자동완성, 정의로 이동 등)을 보내면, Response로 인텔리센스 데이터를 받을 수 있습니다.

이 방식을 사용하면 IDE에서 사용하는 플러그인을 구현할 때 Language Server에 Request를 보내고 인텔리센스 데이터를 받아와 화면에 출력하는 코드만 작성하면 됩니다.

Language Server Protocol (LSP)

아래는 Visual Studio Code와 Language Server가 통신하는 과정을 나타낸 모식도입니다.

IDE에서 문서를 열었을 때

플러그인은 Language Server에 유저가 문서를 열었음을 알리고, 이를 받은 서버는 해당 문서를 메모리에 적재하고 IDE에서 편집한 내용과 동기화를 시작합니다.

IDE에서 문서를 편집할 때

IDE가 서버에 문서의 변경점을 전달하면, Language Server는 이를 이용해 메모리에 적재된 문서를 업데이트하고 의미 분석을 수행합니다. 분석한 결과를 바탕으로 검색된 오류와 경고를 에디터에 전송합니다.

IDE에서 "정의로 이동"을 수행할 때

IDE는 서버로 문서의 URL, 커서의 위치를 Request에 담아 전송합니다. 서버는 Response에 정의가 담겨있는 문서의 URL과 위치를 담아 IDE로 전송합니다.

IDE에서 문서를 닫을 때

문서를 열 때와 마찬가지로 Langugae Server에 문서를 닫았음을 알립니다. 문서는 더이상 Language Server의 메모리에 존재하지 않게 됩니다.

LSP Data Example

아래 JSON은 Language Server와 IDE가 주고 받는 Request/Response의 예시입니다.

Request

{
    "jsonrpc": "2.0",
    "id" : 1,
    "method": "textDocument/definition",
    "params": {
        "textDocument": {
            "uri": "file:///p%3A/mseng/VSCode/Playgrounds/cpp/use.cpp"
        },
        "position": {
            "line": 3,
            "character": 12
        }
    }
}

Response

{
    "jsonrpc": "2.0",
    "id": 1,
    "result": {
        "uri": "file:///p%3A/mseng/VSCode/Playgrounds/cpp/provide.cpp",
        "range": {
            "start": {
                "line": 0,
                "character": 4
            },
            "end": {
                "line": 0,
                "character": 11
            }
        }
    }
}

참고자료

https://microsoft.github.io/language-server-protocol/

https://learn.microsoft.com/ko-kr/visualstudio/extensibility/language-server-protocol?view=vs-2022

https://neurowhai.tistory.com/306

https://langserver.org