Delphi [10.4 시드니 신기능] 다시 태어난 '코드 인사이트'
2020.05.08 15:47
이 글은 David Millington의 엠바카데로 블로그 글을 번역(및 일부의역)한 것입니다.
10.4에서는 코드 완성(Code completion)를 포함한 여러 기능들이 업데이트됩니다. 10여년 만의 IDE에서 가장 중요한 변화 중 하나입니다.
코드 인사이트는 무엇인가요?
우선 배경부터 살펴보겠습니다. 코드 인사이트에 대해 잘 아시는 분들은 건너 뛰어도 됩니다...
코드 인사이트는 에디터의 IDE 생산성 기능들을 통칭하는 단어입니다. 다음과 같은 기능들을 제공합니다.
- 코드 완성: 입력하려는 항목을 예측하는 드롭다운 리스트박스. 식별자 뒤에 마침표(.)를 입력하거나
Ctrl+Space를 눌러 표시
- 파라미터 완성: 오버로드된 메소드의 서로다른 메소드 파라미터들을 표현하는 도움말.
Ctrl + Shift + Space를 눌러 표시
- 선언 찾기: 식별자를 마우스 오른쪽 버튼으로 누르고 “Find Declaration”을 클릭하면 해당 메소드, 변수, 타입 등이 정의된 위치로 이동합니다. 컨트롤 버튼을 누른 상태에서 마우스를 에디터 위로 이동하면 해당 식별자가 하이퍼링크로 전환되어 선언을 찾을 수 있으며, 이를 코드 브라우징이라고 합니다.
- 툴팁 인사이트: 변수 또는 타입 위에 마우스를 올리면 그에 대한 정보가 표시됩니다. 때로 이것은 XMLDoc을 포함하며, 헬프 인사이트로 알려져 있습니다.(우리는 우리의 문서에서 이름을 명확히 할 필요가 있습니다.)
- 오류 인사이트: 컴파일 전 오류가 있는 코드에 붉은 지그재그 선을 표시합니다. 이것은 많은 사람들이 빨간줄(red squlgglies)이라 칭하며, 오류는 스트럭쳐 뷰(Structure view)의 오류 노드에도 표시됩니다.
이 기능들은 델파이에서 다년간 사용되었습니다. IDE에서 코딩할 때 굉장히 중요한 이점입니다. 특히 코드 완성은 많은 타이핑을 줄여주고, 오류 인사이트는 컴파일 전에 코드가 정상 작동하는지를 확인할 수 있습니다.
클래식 코드 인사이트
언어가 성장하고 시간이 지나면서, 이 기능들은 우리가 원하는만큼 잘 작동하지 않았습니다. 처음 도입되었던 당시에는 최첨단이었지만, 현재는 개선이 필요합니다.
잘못된 오류에 대한 버그 리포트(즉, 실제로는 오류없이 완벽한 소스 코드이지만 에디터나 스트럭처 화면에 오류가 표시) 또는 IDE가 메인 스레드에서 작동하고 있어 자동 완성 목록을 표시하는 동안 키 입력에 응답하지 않는 경우 버그 리포트를 확인하는 것이 일반적입니다 (이 기능은 ESC키를 눌러 취소할 수 있습니다). 매우 큰 규모의 프로젝트에서 코드 완성 기능을 사용하는 경우, 데이터 계산을 위해 IDE에서 많은 메모리를 사용하기도 합니다. 코드 완성이나 오류 인사이트 기능은 서로 다른 코드 파서(parser)로 구현되어 있어 코드에 대한 이해가 서로 달랐습니다. 그리고 디버깅하는 동안에는 코드 인사이트가 비활성화되어 디버깅 중 코드를 작성하게 되면 생산성 향상을 얻을 수 없었습니다.
이러한 불편을 개선하기 위해 10.4에서는 다음과 같은 목표를 설정했습니다.
- 비동기 코드 인사이트 - 코드 인사이트는 다른 스레드 또는 다른 프로세스(또는 모두)에서 실행. 코드 작성 시 코드 인사이트가 백그라운드에서 동작시켜 IDE는 항상 응답
- IDE에서 코드 완성을 위한 잠재적인 메모리 사용량 감소 또는 완전히 제거(어디에서 실행되고 있는지 시각화)
- 오류 인사이트의 항상 올바른 결과 보장 - 컴파일러가 오류를 제시하고, 올바른 코드의 경우 오류를 표시하지 않음
- IDE에서는 델파이 소스 해석을 위해 단일 파서 사용 - IDE의 코드 인사이트(코드 완성, 오류 인사이트 등)는 델파이 코드에 대해 모두 동일하게 이해
- 최신 기술 사용을 위해 델파이 코드 툴링 방식 현대화
- 코드 완성 관련 여러개의 버그 수정
- 적어도 2개 이상의 코드 완성의 새로운 기능을 동시에 제공
이 모든 것이 델파이 10.4에서 제공됩니다.
어떻습니까? 대단하지요. 델파이 IDE 15년 만의 가장 크고 가장 좋은 변화 중 하나입니다.
(그리고 걱정마세요 - 필요하다면 클래식 코드 인사이트도 여전히 존재하며, 몇가지 새로운 버그를 해결해 돌아올겁니다.)
델파이 10.4의 코드 인사이트 기술
10.4에서는 위 코드 인사이트 기능을 ‘LSP 서버'를 이용해 구현합니다. 여러분들이 이 기술을 들어보셨을지 모르지만, LSP는 언어 서버 프로토콜(Language Server Protocol)을 뜻하며, 여러가지 언어에서 코드 인사이트와 같은 기능을 구현하기 위한 표준화된 방법입니다. IDE는 '언어 서버'와 통신합니다. 이것은 별도의 작은 앱(도우미 앱)에서 IDE에 표시되는 정보를 계산하고 생성합니다. 이 통신은 정의된 프로토콜, 즉 언어 서버 프로토콜을 사용해 수행됩니다.
즉, 이제 IDE는 프로젝트를 열거나 파일에 입력할 때 ‘언어 서버'와 대화하며, IDE는 주기적으로 ‘이 위치에서 완성된 결과는 무엇인가?’와 같은 질문을 합니다. ‘언어 서버'는 여러분의 코드를 추적하고, 질문에 대한 답과 도중에 발생한 오류에 대한 답을 IDE로 응답합니다.
‘언어 서버'는 컴파일러를 통해 LSP 결과를 제공합니다. 즉, IDE가 당신에게 보여주는 것은 ‘빨간줄' 오류를 포함해 컴파일러 자체에서 나오는 모든 데이터라는 것을 의미하는 것이죠.
이는 다음과 같은 의미가 있습니다:
- IDE와 ‘언어 서버'의 통신은 비동기로 진행되며, IDE에서는 별도의 스레드로 구현됩니다. IDE가 요청된 데이터에 대한 회신을 기다리는 동안 계속 타이핑하거나 파일을 닫거나 다른 프로젝트를 열수도 있습니다.
- ‘언어 서버' 작업은 별도의 프로세스에서 이뤄집니다. 이것은 결과를 계산하기 위해 모든 메모리 사용량이 더이상 IDE 자체에 있지 않음을 의미합니다. IDE는 더 많은 메모리 사용이 가능하며 ‘언어 서버'는 결과 제공만을 위한 전용 메모리 공간을 사용하게 됩니다.
- 이 작업은 많은 언어에 적용되는 현대적이고 표준화된 프로토콜을 사용합니다.
- 화면에서 보이는 것은 컴파일러에서 보는 것과 동일합니다. 코드가 컴파일되면 오류 인사이트가 표시되지 않고, 반대로 코드 또는 스트럭쳐 뷰에서 빨간줄이 보이면 코드가 컴파일되지 않는다는 것을 의미합니다.
- 디버깅하는 동안에도 코드 완성을 사용할 수 있습니다.
이것은 매우 좋은 효과를 얻을 수 있습니다.
설명은 충분합니다. 어떤 모습일지 직접 살펴보겠습니다.
최신 델파이 코드 인사이트
사실 글로만 실시간 응답을 표현하기 어렵습니다.스크린샷에서는 입력중인 윈도우즈 대기 커서가 보이지 않기 때문에, 상상을 가미해서 보시기 바랍니다.
우리가 10.4를 출시하면 상상하던 것들이 현실이 될것입니다.
디버깅 중인 코드 인사이트
첫번째 새로운 기능은 긴말이 필요없습니다. 바로 디버깅하는 동안에도 코드 인사이트를 사용할 수 있다는 것입니다.
앱 디버깅과 코드 입력을 동시에, 코드 완성까지하고 싶으시죠? 이제는 할 수 있습니다.
네, 화면의 빨간줄은 오류가 아닙니다. 디버깅 하는 동안 코드 수정 시에도 오류 인사이트와 코드 완성을 제공합니다.
코드 완성 결과
코드 완성 방식은 10.3.3과 동일하지만, 10.4에서 응답하는 결과가 다릅니다. 10.4에서는 코드 완성 결과를 과거보다 많이(풍부하고, 유용하게) 보여주도록 기능을 추가했습니다. 하지만, 10.3.3의 항목은 결과 목록의 최상단에 여전히 위치합니다.
다음은 10.3.3의 코드 완성으로, VCL TButton 인스턴스 뒤에 ‘act’를 입력합니다.
참고로 10.3.3은 매우 적은 결과를 보여주는데, 실제로 한개의 결과를 표시합니다. 클래식 코드 완성은 입력한 항목으로 시작되는 항목만 나열됩니다.
다음은 10.4에서의 같은 동작의 결과입니다.
10.4에서 코드 완성은 입력한 내용을 포함하는 모든 항목을 나열합니다. 이제 여러분이 필요한 항목을 더 쉽게 찾을 수 있습니다.
예를 들어, 컨트롤에 무슨무슨Rect라는 속성이 있지만, 정확히 기억하지 못한다고 가정합니다. 10.3.3에서는 구글에 검색하거나, 처음부터 찾아야 합니다. 하지만 10.4에서는 ‘rect’를 입력하면 다음과 같이 표시됩니다.
여러분은 코드 타이핑을 통해 여러분의 코드를 찾을수도 있습니다.
더 많은 결과를 얻는 것이 여러분이 추가하는 것이 아닐 수도 있습니다. 여러분의 습관에서 입력한 것으로 시작하는 항목만을 기대할 수도 있습니다. 기본적으로 10.3.3에서 익숙해진 동작에 맞추기 위해, 우리는 코드 완성 목록을 식별자로 시작하는 항목을 기준으로 정렬합니다. 즉, 목록은 10.3.3과 동일한 결과를 제공하고 해당 식별자가 포함된 항목을 추가한 것입니다. 만약 필요하지 않다면 그것을 사용하지 않으면 됩니다. 그것들은 10.3.3이 여러분들에게 보여줬던 항목들 뒤에 표시됩니다.
모든 결과를 함께 나열하는 다른 IDE와 같은 동작을 원하는 경우 설정할 수 있습니다. 현재는 레지스트리 키로 설정하지만 UI로도 제공할수도 있습니다. 즉, VSCode가 제공하는 것에 더 익숙하다면 여러분들도 그것과 같이 할 수 있습니다.
10.4에서도 입력한 것으로 시작하는 모든 항목을 가장 상단에 정렬합니다. 10.3.3도 이 기능을 제공하죠. 10.4에서도 기본적으로 이렇게 제공합니다. | 10.4에서는 입력한 단어가 포함된 모든 항목들을 범위별로 정렬해 모두 보여줍니다. 비주얼 스튜디오(Visual Studio)나 다른 IDE와 유사합니다. 기본적으로 이 기능은 꺼져있습니다. |
코드 완성 목록에서의 선택
코드 완성은 자동으로 목록에서 가장 적합한 항목을 선택합니다.(즉, 입력 또는 스페이스 또는 마침표(.)를 눌러 해당 항목을 선택하고 계속 코딩할 수 있습니다.)
- 입력한 것과 정확히 일치하는 항목
- 입력한 것으로 시작하는 항목 중 가장 짧은 식별자
- 입력한 내용이 들어있는 항목 중 가장 짧은 식별자
시작 우선순위 지정은 완료 목록이 자동으로 ‘SetParent’ 보다 ‘Parent’를 선택함을 의미합니다. 가장 짧은 항목을 선택하면 ‘ParentFont’ 보다 ‘Parent’를 선택하게 됩니다.(위 스크린샷 확인) 일반적으로, 우리는 이것이 여러분들이 타이핑할 가능성이 가장 높은 것으로 간주합니다. 물론 스크롤 또는 위/아래 화살표를 통해 원하는 항목을 선택할 수도 있습니다.
오류 인사이트
위의 스크린샷에는 입력 시 업데이트되는 실시간 오류 인사이트가 표시되며, 유효하지 않은 코드 ‘pare’에 빨간색으로 밑줄이 쳐져있습니다.(완성 목록에서 항목을 선택하면 밑줄이 없어집니다.) 오류 인사이트 결과는 컴파일러 자체에서 나오며, 컴파일러에서 보는 것과 정확히 일치합니다.
에디터 또는 스트럭처 뷰에는 더이상 잘못된 오류가 나타나지 않습니다. 화면에 보이는 오류 인사이트는 정확할것입니다.
멀티프로세스 아키텍처
기능상 중요하지는 않지만, 기술적으로 관심이 있을 수 있습니다.
앞서 LSP 서버가 별도의 프로세스로 실행된다고 언급했습니다. 이 프로세스는 코드 인사이트를 위한 전용 4GB 메모리 주소 공간을 포함해 많은 이점을 갖습니다. 윈도우즈 작업 관리자에서 실행 중인 10.4를 보면 여러델파이LSP 프로세스가 표시되는 걸 볼 수 있죠. 첫번째 것은 여러 에이전트들을 제어합니다. 그리고 코드 완성과 기타 결과들을 제공하는 에이전트가 있고, 오류 인사이트를 제공하는 에이전트도 있죠!
제가 아는 바로는, RAD스튜디오의 LSP 서버는 멀티프로세스 아키텍처를 사용하는 유일한 LSP 서버입니다.
품질
구현하는 동안, 과거 코드 완성에 영향을 미치는 많은 문제를 발견하고 수정했습니다.
다음 단계
새로운 코드 완성 기능은 10.3.3 이하 버전과는 다릅니다. 처음 사용하더라도 익숙하게 쓸 수 있도록 만들었습니다. 다른 곳에 적용된 기능들을 최대한 반영하고자 했습니다 - 예를 들어, 입력한 키워드로 시작하는 항목이 가장 상단에 표시되도록 하는 기능 등 -. 단 몇 분만에 너무 익숙해져서 10.3.3으로 돌아가고 싶지 않을 것입니다. 물론 다른 것들과 완전히 동일하지는 않습니다. 여러분이라면, 그 차이점을 발견할 수 있을 것입니다.
델파이 10.4의 새로운 코드 인사이트는 많은 문제를 해결하고, IDE 사용을 훨씬 더 즐겁고 좋은 환경으로 만들것입니다. 추가 결과 목록은 말할 것도 없이 매우 유용할 것입니다. 우리는 위에 작성한 목표에 따라 앞으로 나아가기 위해 꾸준히 노력할 것입니다. 10.4에서 우리와 베타 테스터들은 이러한 변화가 IDE에 큰 도움이 된다는 것을 알게되었습니다.
또한, 코드 완성을 통한 코드 탐색 기능과 디버깅 중 코드 인사이트 기능을 사용하는 두가지 새로운 기능도 추가했습니다.
이 기능에 대한 기대가 정말 큽니다. 비동기, 반응형 IDE, 현대식 프로토콜, 다른 언어 지원, 디버깅 중 코드 완성. 아주 훌륭합니다. 여러분들이 10.4를 받아 직접 확인해 보기까지 기다리기가 힘드네요.
❝ |
새로운 LSP 기반 코드 인사이트는 환상적입니다. — 닉 하지스, 베타 프리뷰 사용 |
10.4 무료 평가판으로 지금 경험해보세요! | [전체보기] 10.4 새기능들! |
댓글 2
-
sihwan
2020.05.22 12:58
-
험프리
2020.05.29 09:32
해당 내용은 델파이 10.4에만 적용되는 내용입니다.
C++빌더의 경우 새로운 Win64 C++ 디버거가 추가되었습니다.
C++빌더의 코드인사이트의 경우 (10.3 부터)일부 문제가 있는 것으로 알고 있습니다. 이 문제는 10.4에서 일부 개선되었으나 완벽하게 개선하지 못해 이번 버전에는 포함되지 않은 것 같습니다.(개인적으로 파악한바로는 10.4.1에서 해결할것이라 들었습니다. 조금만 기다려주세요.)
해결된 내역이 이전버전에 적용될지 여부는 해결이후 확인할 수 있을 것 같습니다.(하지만, 선례상 어렵지 않을까 개인적으로 생각합니다.)
저희도 되도록 이전 버전에도 적용될 수 있도록 노력해보겠습니다.
10.4 버젼 코드 인사이트 기능 향상이 델파이에만 적용되는 부분인가요? 현재 c++ 빌더 Rio 버젼의 코드인사이트 버그와는 무관한 것인지 알고 싶네요..
향후 빌더 코드인사이트 기능오류가 빌더 버젼이 올라가면서 수정이 된다면 서브스크립션이 없는 기존 고객은 오류 기능에 대한 부분을 그대로 안고 가야 하는지요?? 빌더의 코드인사이트 오류 기능은 너무 심각한 문제인데 서브스크립션이 있어야만 버그 패치가 된다면 이건 좀 너무한게 아닌가 하는 생각이 듭니다.