범용 인텔리센스의 새로운 완전한 구현
SQL 및 C#용 범용 Intellisense 지원 에디터(가능하다면 등)를 작성하고 싶습니다.이것을 C#에서 덮어쓰기 또는 확장 WPF richTextBox 타입의 컨트롤로 하고 싶습니다.이용 가능한 프로젝트의 예는 많이 있으며, 제 자신의 기본 버전을 구현하고 있습니다.하지만 실제로 제가 접한 대부분의 예는 그저 기본입니다.
코드 예는 다음과 같습니다.
그러나 Intellissense Query Commander SQL Editor By Mikael Hael Hakanson을 사용한 SQL Editor의 훌륭한 예를 찾았습니다.Microsoft 에서는, 커맨드 키워드의 XML 라이브러리를 사용할 필요가 있습니다만, 여기서 질문하겠습니다.Microsoft는 인텔리센스(As-you-type Intellisense)를 어떻게 (상세하게) 구현하고 있습니까?또, 같은 표준의 독자적인 인텔리센스를 작성하는 것은 얼마나 어려운 것일까요?
편집 A: 1년이 지난 지금, 나는 주로 나 자신의 「즐기기」를 위해서, 기본적인 인텔리센스를 가지는 독자적인 에디터 컨트롤을 개발해 왔습니다.자유롭게 이용할 수 있는 목록을 다시 제공하려고 합니다.자체 개발에 도움이 된 NET 프로젝트는 개봉 즉시 무료로 사용할 수 있습니다.
편집 B: 질문이 제기된 지 15개월 후, 저는 여전히 새로운 개선된 편집자를 찾고 있습니다.이거 좋은데...
- 로슬린패드 멋있다!
편집 C: 질문으로부터 2년 이상 경과한 시점에서, WPF 를 사용하고 있는 프로젝트와 Avalon Edit 를 사용하고 있는 프로젝트를 발견했습니다.
NRecactory를 사용한 Avalon Edit의 Code Completion.이 프로젝트는 매우 훌륭하고 NRefactory를 사용하여 인텔리센스를 완전히 구현했습니다.
ScriptCS ScriptCS를 사용하면 간단한 텍스트 에디터로 C#을 쉽게 쓰고 실행할 수 있습니다.
Microsoft 에서는, 「As-you-type Intellissense」를 어떻게 (상세하게) 실장하고 있습니까?
자세한 것은 얼마든지 설명할 수 있습니다만, 간단한 설명 이외에는 시간이 없습니다.로슬린에서 어떻게 하는지 설명해줄게
첫째, 편집이 정확하게 이루어지기 때문에 편집 내용을 효율적으로 나타낼 수 있는 데이터 구조를 사용하여 토큰 스트림의 불변 모델을 구축합니다.
영속적인 재사용을 효율적으로 하기 위한 중요한 통찰력은 토큰의 문자 길이를 나타내는 것이지 편집 버퍼 내의 문자 위치는 나타내는 것이 아닙니다.파일 끝에 있는 토큰은 편집할 때마다 위치가 변경되지만 토큰 길이는 변경되지 않습니다.대용량의 파일을 효율적으로 처리하려면 반드시 전체 리렉스 횟수를 최소화해야 합니다.
삽입 및 삭제를 처리할 수 있는 불변의 모델이 있으면 파일 전체를 매번 다시 검색하지 않고 불변의 토큰 스트림을 구축할 수 있습니다.그러면 문법적인 분석을 위해서도 같은 작업을 수행해야 합니다.이것은 실제로 상당히 어려운 문제이다.저는 당신이 아직 파서 이론에 중점을 두고 컴퓨터 공학 학사 또는 대학원 학위를 취득할 것을 권장합니다.이 알고리즘의 특정 부분을 설계하기 위해 파서 이론에 관한 논문을 작성한 박사들의 도움을 받았습니다.
그런 다음 C#을 분석할 수 있는 문법 분석기를 구축합니다.올바른 C#이 아닌 파손된 C#을 분석해야 합니다.IntelliSense는 프로그램이 컴파일되지 않은 상태에서 동작해야 합니다.우선 오류 복구 특성이 양호한 문법을 수정하는 것부터 시작합니다.
자, 이제 대부분의 경우 편집된 영역만 빼고 효율적으로 문법 분석을 수행할 수 있는 파서가 있습니다. 즉, 키 입력 간에 작업을 수행할 수 있습니다.말씀드리는 것을 잊었습니다만, 물론 이러한 모든 분석을 실행하는 동안 UI 스레드를 차단하지 않는 메커니즘을 생각해 낼 필요가 있습니다.C#5의 새로운 "비동기/대기" 기능이 도움이 될 것입니다.(개인 경험으로 알 수 있습니다.작업이나 취소 토큰의 확산에 주의해 주세요.부주의하면 취소된 작업이 수만 건이나 보류 중인 상태가 될 수 있으며, 이는 빠르지 않습니다.)
이제 문법적인 분석을 얻었으니 의미 분석기를 구축해야 합니다.IntelliSense만 하기 때문에 특별히 정교한 시맨틱아나라이저일 필요는 없습니다.(시맨틱아나라이저에서는 올바른 프로그램에서 코드를 생성하기 위한 분석과 잘못된 프로그램에서 오류를 수정하기 위한 분석을 수행해야 합니다.)물론 고장난 프로그램에 대한 의미분석을 잘 해야 하기 때문에 복잡성이 상당히 높아집니다.
우선 "최상위" 시멘틱아나라이저를 구축하여 선언된 소스 코드 타입의 상태를 편집에서 편집까지 유지할 수 있는 불변의 모델을 사용하는 것이 좋습니다.최상위 수준 분석기는 문이나 식 이외의 모든 항목(타입 선언, 지시어, 네임스페이스, 메서드 선언, 컨스트럭터, 소멸자 등)을 처리합니다.컴파일러가 메타데이터를 생성할 때 프로그램의 "모양"을 구성하는 요소입니다.
메타데이터!메타데이터를 잊어버렸어요.메타데이터 리더가 필요합니다.라이브러리의 유형을 참조하는 식에서 IntelliSense를 생성할 수 있어야 합니다.CCI 라이브러리를 Reflection이 아닌 메타데이터 리더로 사용할 것을 권장합니다.IntelliSense만 하기 때문에 메타데이터 라이터는 필요 없습니다.
일단 최상위 시멘틱아나라이저만 있으면 스테이트먼트 내의 표현 유형을 분석하는 스테이트먼트 앤 익스프레션 시멘틱아나라이저를 작성할 수 있습니다.이름 검색 및 오버로드 해결 알고리즘에 특히 주의하십시오.메서드 유형 추론은 특히 LINQ 쿼리 내에서 까다로워집니다.
인텔리센스 엔진은 모든 기능을 갖추면 간단합니다.현재 커서 위치에서 표현식의 유형을 계산하여 드롭다운을 적절하게 표시하기만 하면 됩니다.
같은 규격의 저만의 것을 만드는 것이 얼마나 어려울까요?
글쎄요, 10명이라고 하는 팀이 있는데, 처음부터 끝까지 다 끝내려면 아마 5년 정도 걸릴 겁니다.하지만 인텔리센스 엔진뿐만이 아닙니다.그건 아마 작업의 40%에 불과할 겁니다.아, 그러고 보니 그 사람들 중 절반은 VB를 하고 있더군요하지만 이 사람들은 평균적으로 5년에서 10년 정도의 경험을 가지고 있기 때문에 이런 일을 해본 적이 없는 사람들보다 더 빨리 일을 할 수 있습니다.
예를 들어, 키 입력 사이에 큰 프로그램을 적절히 분석할 수 있는 C#용 Roslyn 품질의 IntelliSense 엔진을 구축하려면 약 10~20년의 풀타임 작업이 필요합니다.
박사학위 따위부터 따야 한다면 더 오래 걸릴 거야
아니면 그냥 로슬린을 쓰셔도 됩니다. 그게 목적이니까요.아마 몇 시간 정도 걸리겠지만, 직접 하는 재미는 없어요.그리고 재미있어요!
프리뷰 릴리스는, 다음의 URL 에서 다운로드할 수 있습니다.
http://www.microsoft.com/download/en/details.aspx?id=27746
이 분야는 일반적으로 Microsoft가 뛰어난 성과를 내는 분야입니다.Microsoft 개발자 툴은 정말 훌륭합니다.또, 개발 툴의 판매나 Windows의 판매에 있어서, 최고의 인텔리센스를 가지는 것에 의해서, 확실히 상업적 이점이 있습니다.따라서 Microsoft는 Eric이 매우 상세하게 답변한 자원을 투입하는 것이 타당합니다.그래도 몇 가지 짚고 넘어갈 가치가 있다고 생각합니다.
고객은, Microsoft 의 실장에 의해서 제공되는 모든 기능을 실제로 필요로 하지 않는 경우가 있습니다.Microsoft 솔루션은, 고객/유저에게 제공할 필요가 있는 기능에 관해서, 매우 과잉 설계되어 있는 경우가 있습니다.실제로 Visual Studio와 경쟁하기 위한 범용 코딩 환경을 구현하지 않는 한, 문제를 단순하게 하거나 Microsoft가 할 수 없다고 생각하는 솔루션을 타협할 수 있는 사용 방법이 있을 수 있습니다.마이크로소프트는 이미 수백 밀리초 단위로 측정된 응답 시간을 단축하기 위해 리소스를 소비할 가능성이 높습니다.그건 네가 할 필요가 없는 일일 수도 있어.Microsoft는 코드 분석을 위해 다른 사용자가 사용할 수 있는 API를 제공하는 데 시간을 할애하고 있습니다.그건 당신 계획의 일부가 아닐 거예요.기능의 우선 순위를 정하고, 당신과 고객의 「충분히 좋은」기능을 결정해, 그것을 실장하는 코스트를 견적합니다.
Microsoft 에서는, 실제로는 실장할 수 없는 명백한 요건의 실장에 드는 코스트에 가세해, 팀워크를 실시하지 않는 경우는 명확하지 않은 코스트도 부담하고 있습니다.팀과 관련된 엄청난 통신 비용이 있습니다.실제로 5명의 똑똑한 사람이 솔루션을 만드는 데 걸리는 시간은 한 명의 똑똑한 사람이 동등한 솔루션을 만드는 데 걸리는 시간보다 훨씬 쉽습니다.Microsoft의 채용 관행과 조직 구조에는 이러한 시나리오가 발생할 가능성이 높은 측면이 있습니다.자아를 가진 똑똑한 사람들을 많이 고용하고 그들 모두가 의사결정을 할 수 있도록 하면 비용 500%로 5% 더 나은 솔루션을 얻을 수 있습니다.이 5% 더 나은 솔루션은 마이크로소프트에게는 이익이 될 수 있지만, 소규모 기업에게는 치명적일 수 있습니다.
1인용 솔루션에서 5인용 솔루션으로 전환하면 비용이 증가하지만 이는 팀 내 개발 비용일 뿐입니다.Microsoft에는 설계, 개발 및 테스트(대략)를 전담하는 별도의 팀이 있습니다.이러한 경계를 넘어서는 동료 간의 프로젝트 관련 커뮤니케이션은 각 분야 내에서보다 마찰이 큽니다.이로 인해 개인 간 커뮤니케이션 비용이 증가할 뿐만 아니라 팀 규모도 커집니다.게다가 12명으로 구성된 단일 팀이 아니라 5명으로 구성된 3개 팀이 되기 때문에 커뮤니케이션 비용이 3배 상승합니다.마이크로소프트가 부담하기로 선택한 비용이 증가하더라도 다른 회사에도 비슷한 비용이 발생하지 않을 수 있습니다.
여기서의 요점은, Microsoft 를 비효율적인 기업이라고 하는 것은 아닙니다.제 요점은 Microsoft가 채용부터 팀 구성, 그리고 Microsoft 이외의 기업에는 적용되지 않는 수익성과 리스크에 관한 가정으로부터 시작하는 설계와 구현에 이르기까지 모든 것에 대해 Microsoft가 많은 결정을 내린다는 것입니다.
인텔리센스한 것에 관해서는, 그 문제에 대해 다양한 생각을 가지고 있다.Microsoft는, 인텔리센스 뿐만이 아니라, 코드 네비게이션, 리팩터링, 및 코드 분석의 다양한 용도를 타겟으로 하는, 매우 범용적이고 재사용 가능한 솔루션을 개발하고 있습니다.개발자가 많은 것을 입력하지 않고도 쉽게 코드를 입력할 수 있도록 하는 것이 유일한 목표라면 동일한 방식으로 작업을 수행할 필요가 없습니다.이 기능을 타겟으로 하는 것은 수년간의 노력이 들지 않으며 API를 제공하는 것뿐만 아니라 실제로 UI도 제어할 수 있다면 다양한 크리에이티브 작업을 수행할 수 있습니다.
언급URL : https://stackoverflow.com/questions/9556026/a-new-and-full-implementation-of-generic-intellisense
'source' 카테고리의 다른 글
식별자가 "인 앱 ID를 사용할 수 없습니다.다른 문자열을 입력하십시오. (0) | 2023.04.11 |
---|---|
Linux 스크립트의 터미널에서 사용자 입력 숨기기 (0) | 2023.04.11 |
목록에서 어떻게 추가할 수 있을까요? (0) | 2023.04.11 |
에서 JSON Web Service를 호출하는 가장 좋은 방법입니다.NET 콘솔 (0) | 2023.04.06 |
스프링 부트 - 개발 중에 @Cacheable을 비활성화하려면 어떻게 해야 합니까? (0) | 2023.04.06 |