2011-03-16 2 views
0

동적 라이브러리를 호출하여 C 코드로 C를 pragma 코드로 변환하여 C 언어로 OpenMP와 같은 (#pragma statements) 확장을 만들어야합니다. 단순히 pragma를 확장하는 것이 아니며 배열 선형화, 새 변수 선언 등을 수행하는 데에도 필요합니다. 그래서 소스 - 투 - 소스 도구를 찾고 있습니다.OpenMP와 유사한 언어 컴파일러

나는 TXL, JetBrains MPS, Meta-Environment, Stratego/XT, Rose, DMS의 단서를 발견했다. 아무도 그들 사이의 차이점, 장점과 단점을 설명해 주시겠습니까? 나는 어떤 충고에 대해서도 기뻐할 것입니다.

답변

2

나는 뒤에있는 사람 DMS입니다. 내 대답이 편향된 것을 알 수 있습니다.

이러한 도구는 모두 소스에서 소스로 변환의 기본 사항을 공유합니다. 그들은 여러 가지 형태의 문법을 통해 도구에 정의 할 수있는 몇 가지 소스 언어를 파싱하고, 나무를 만들고, 나무를 탐색/검사/수정하는 코드를 작성한 다음 트리를 텍스트 문자열로 미리 미리 인쇄합니다. 컴파일 가능한 코드 일종의 의도.

  • JetBrains MPS : 이에 대한 지식이 거의 없습니다. I 을 생각하면 나무 위로 올라 가기위한 절차 코드를 작성해야합니다. 이것은 나무를 다루는 고전적인 컴파일러 기술입니다. OpenMP 프리미티브는 말할 것도없고, 상자에서 C를 파싱 할 수 있다고는 생각지 않습니다. 제대로 작동하려면 많은 노력이 필요합니다.

  • 메타 환경 : 나는이 도구에 대해 아무것도 모른다. 높은 확률 베팅 : C를 구문 분석하지 않습니다.

  • TXL : 이것은 패턴 일치 및 코드 인스턴스화 언어를 사용하며 트리를 통한 기능을 사용하여 구현됩니다. 이 함수는 패턴 매칭을 통해 하위 트리를 선택 및 재귀 적으로 호출하고, 호출 된 함수의 트리 결과를 큰 트리로 어셈블하여 궁극적으로 최종 트리를 생성합니다. 패턴은 소스 구문 패턴을 사용하여 작성되므로 상당히 쉽게 작성할 수 있습니다. TXL이 명백한 방법으로하지 않는 것은 나중에 사용할 코드 생성 작업을 위해 코드 분석을 수행하는 것입니다. 이를 수행하는 방법이 있습니다. 하나의 기능 단계에서 분석을 포함하는 보조 트리를 작성한 다음 결과를 생성하는 다른 기능 단계를 수행하십시오. 이것은 명백하게 일반적인 TXL 기술입니다. TXL은 아마도 사용 가능한 C 파서를 가지고있을 것이지만, 아마도 사전 처리 된 C 코드에서만 작동합니다; 엄청난 문제없이 OpenMP 구문을 처리 할 수 ​​있습니다. 식별자의 의미를 찾아 볼 수있게 해주는 편리한 기호 표가 있습니다. 흥미로운 방식으로 C를 변환하려는 경우에 필요합니다.

  • Stratego/XT :이 도구는 소스에서 소스 재 작성을 "전략", 즉 재 작성이 성공적으로 적용되거나 실패 할 때 도구가 트리를 위아래로 움직일 수있게하는 시퀀싱 작업과 결합하여 작동합니다. 이 전략 체계는 나무의 한 지점에서 수집 된 정보를 멀리 떨어진 다른 지점으로 옮길 수있게합니다. TXL과 마찬가지로 전처리 된 C 코드에 대한 파서를 찾을 수있을 것이라고 확신합니다. TXL과 마찬가지로, 나는 심볼 테이블이나 다른 코드에 대한 깊은 분석을 얻지 못했다고 생각합니다.

  • 로즈 :이 도구는 EDG의 프런트 엔드를 사용하여 C 및 C++ 코드를 사전 처리/구문 분석하고 AST를 작성합니다. 나는 EDG 프론트 엔드가 심볼 테이블을 구축한다고 생각한다. "OpenMP와 같은"프리미티브를 추가하기 위해 파서의 사용자 정의 버전을 만들고 싶습니다. 나는 당신이 EDG 프론트 엔드가 당신을 해킹 할 소스 형태로 이용할 수 있다고 생각하지 않기 때문에 당신이 로즈와 함께 할 수 있다고 생각하지 않는다. 하체 구성품은 C++입니다. 절차상의 방문자를 작성하여 코드를 오르고 새로운 트리 노드를 만들 수 있습니다. 그것은 소스 패턴을 다루기위한 비밀 스럽지만 실행 가능한 체계를 가지고 있습니다 : 그것들을 유효하고 작은 "메인"C++ 프로그램으로 변환하고, C++ 파서로 전달하고, 메인 프로그램 쉘을 제거한 후에 결과 트리를 돌려줍니다.Rose는 LLNL에서 과학 코드를 작성하는 데 사용되며, 사용자가 필요로하는 것과 거의 유사 할 수 있습니다. 파서가 OpenMP를 처리하지 않는다면 놀랄 것입니다. OpenMP는 커뮤니티에서 중요한 관심 기술이기 때문입니다. Rose는 또한 약간의 제어 및 데이터 흐름 분석을 제공하지만 나는 얼마나 정교한 지 알지 못합니다. 그것은 로즈를 나머지 팩들과 돋보이게합니다.

  • DMS :이 도구는 임의의 프로그래밍 언어를 조작하도록 설계되었습니다. 분석, 사전 인쇄, 기호 테이블 구성, 제어 흐름 및 데이터 흐름 분석은 물론 지역 및 전역의 지점 간 분석을 제공합니다. DMS에는 전 처리기, 구문 분석 및 기호 테이블 구성이 완료된 C front endC++ front end이 있습니다. C 프런트 엔드는 완벽한 플로우 분석을 구현했습니다 (위의 모든 것). C++ 프론트 엔드는 아직 흐름 분석이 없지만 우리는 그것에 대해 연구 중입니다. 모든 DMS 프런트 엔드는 사용자 정의 할 수 있도록 소스 형식으로 사용할 수 있습니다 (예 : 사용자 정의 OpenMP 확장 추가). DMS는 19,000 개의 컴파일 유닛을 갖춘 C 시스템의 글로벌 분석뿐만 아니라 그 시스템에서 C API를 추출하고 추출하는 데에도 사용되어 왔습니다. 이것은 거대한 C++ 소스 코드 기반을 재구성하는 데 사용되었습니다. 그것은 산업 강도 도구입니다. Rose는이 시점에서 C++ 변환에 다소 좋을 수 있습니다. DMS는 다양한 언어, 분석 및 변환을위한 지원 메커니즘의 범위, 그리고 적용된 다양한 작업에 대해 Rose IMHO보다 훨씬 뛰어납니다.

위의 대부분을 포함하여 detailed comparison of a variety of parsing/transformation tools 개를 볼 수 있습니다.