IT

시맨틱 차이 유틸리티

lottoking 2020. 8. 15. 09:28
반응형

시맨틱 차이 유틸리티 [닫힘]


시맨틱 차이 / 병합 유틸리티의 좋은 예를 고합니다. 소스 코드 파일을 비교하는 고려 패러다임은 줄과 문자를 비교하는 방식으로 작동합니다. 파일을 사용할 때 실제로 코드 구조 를 사용 하는 유틸리티 (모든 언어)가 ?

예를 들어, 기존의 diff 프로그램은 "125 행의 문자 2에서 차이가 발견되었습니다. 파일 x에 무효가 포함되어 있고 여기서 파일 y에 불이 포함되어 있습니다"를보고합니다. 특수 도구는 "void에서 bool로 변경된 doSomething () 메소드의 반환 유형"을보고해야합니다.

유형의 의미 정보는 실제로 사용자가 코드를 사용할 때 있고 거기에있는 프로그램 도구의 목표가 있다고 주장합니다. 사용 가능한 도구에 대한 이에 대한 예가?


우리는이 시나리오를 정확하게 처리 할 수있는 도구를 개발했습니다. http://www.semanticmerge.com 확인

텍스트 기반 알고리즘을 사용하지 않고 코드 구조를 기반으로 병합 (및 diff) 기본적으로 강력한 리팩터링과 다음과 같은 경우를 처리 할 수 ​​있습니다. 또한 아래에서 볼 수 차이점과 병합 충돌을 모두 할 수 있습니다.

여기에 이미지 설명 입력

그리고 이동되는 텍스트 블록과 혼동되는 대신 먼저 구문 분석하기 때문에 메서드 별 (사실 요소별로) 충돌을 표시 할 수 있습니다. 이전과 같은 케이스는 해결해야 할 수동 충돌도 없습니다.

여기에 이미지 설명 입력

언어 인식 병합 도구이며 마침내이 질문에 답할 수있게되어 정말 좋았습니다 :-)


Eclipse 는 오랫동안이 기능을 가지고 있습니다. "구조 비교"라고하는데 아주 좋습니다. 다음은 Java 용 샘플 스크린 샷과 XML 파일 용 스크린 샷입니다.

(상단 창에있는 메소드의 빼기 및 더하기 아이콘에 유의하십시오.)

Eclipse의 Java 구조 비교기 Eclipse의 XML 구조 비교기


"의미 적 비교"를 잘 수행하려면 언어의 구문 트리를 비교하고 기호의 의미를 고려해야합니다. 정말 좋은 의미 차이는 언어 의미를 이해하고 한 코드 블록이 다른 코드 블록과 기능면에서 동등하다는 것을 깨달을 것입니다. 여기까지 가려면 정리 증명자가 필요하며, 매우 귀엽지 만 현재 실제 도구에는 실용적이지 않습니다.

이에 대한 실행 가능한 근사치는 단순히 구문 트리를 비교하고 삽입, 삭제, 이동 또는 변경된 구조 측면에서 변경 사항을보고하는 것입니다. "의미 적 비교"에 다소 가까워지면 코드 블록에서 식별자가 일관되게 변경 될 때보고 할 수 있습니다.

위의 근사를 수행하는 여러 언어에서 작동하는 구문 트리 기반 비교 엔진에 대해서는 http://www.semanticdesigns.com/Products/SmartDifferencer/index.html참조하십시오 .

2010 년 1 월 편집 : C ++, C #, Java, PHP 및 COBOL에 사용할 수있는 버전. 웹 사이트는 이들 대부분에 대한 구체적인 예를 보여줍니다.

2010 년 5 월 편집 : Python 및 JavaScript가 추가되었습니다.

2010 년 10 월 편집 : EGL이 추가되었습니다.

2010 년 11 월 편집 : VB6, VBScript, VB.net 추가


당신이 모색하는 것은 "나무 차이"입니다. 이것은 단순히 두 개의 플랫 시퀀스를 비교하는 단순한 라인 중심의 텍스트 차이보다 잘하기가 훨씬 더 어렵다는 것이 밝혀졌습니다.

" 세분화 된 XML 구조 비교 접근 방식 "은 부분적으로 다음과 같이 결론을 내립니다.

우리의 이론적 연구와 실험적 평가는 제안 된 방법이 동일한 시간 복잡도 (O (N ^ 2))를 가지 면서 기존 대안에 비해 향상된 구조적 유사성 결과를 산출한다는 것을 보여주었습니다.

(강조 광산)

실제로 트리 차이에 대한 더 많은 예제를 찾고 있다면 XML에 초점을 맞추는 것이 좋습니다. XML이 그 분야에서 실질적인 발전을 주도하고 있기 때문입니다.


내 프로젝트를위한 뻔뻔한 플러그 :

HTML Tree Diff는 파이썬으로 작성된 xml 및 html 문서의 구조 인식 비교를 수행합니다.

http://pypi.python.org/pypi/html-tree-diff/0.1.0


이에 대한 해결책은 언어 단위입니다. 즉, 코드를 트리로 파싱하고 언어 별 플러그인에 대한 의미 비교를 연기하는 플러그인 아키텍처로 설계되지 않는 한 여러 언어를 지원하기가 매우 어려울 것입니다. 이러한 도구를 사용하는 데 관심이있는 언어는 무엇입니까? 개인적으로 나는 C #을 좋아합니다.

C #의 경우 Reflector에 대한 어셈블리 diff 추가 기능이 있지만 C #이 아닌 IL에서만 diff를 수행합니다.

여기 [zip] 에서 diff 추가 기능을 다운로드 하거나 여기 에서 codeplex 사이트의 프로젝트로 이동할 수 있습니다 .


Zynamics라는 회사는 이진 수준의 의미 차이 도구를 제공합니다. REIL이라는 메타 어셈블리 언어를 사용하여 2 개의 바이너리 버전에 대한 그래프 이론적 분석을 수행하고 두 버전의 차이점을 설명하기 위해 색상 그래프를 생성합니다. 가격은 확실하지 않지만 무료인지는 모르겠습니다.


http://prettydiff.com/

Pretty Diff는 각 입력을 최소화하여 주석과 불필요한 공백을 다음 diff 알고리즘 이전에 코드를 아름답게 만듭니다. 나는 어쨌든 이것보다 더 많은 코드 의미가 될 생각할 수 없다. 그리고 JavaScript는 브라우저에서 직접 실행됩니다.

참고 URL : https://stackoverflow.com/questions/523307/semantic-diff-utilities

반응형