26 1월 2024
C#에서 C++ 코드 번역기의 설계 및 개발은 CodePorting에서 독립적으로 수행되었습니다. 이 작업은 여러 가지 조사, 다양한 접근 방식 적용 및 메모리 모델 및 기타 측면에서 다양한 테스트를 필요로 했습니다. 결국 두 가지 솔루션을 선택했습니다. 그 중 하나는 현재 Aspose 제품의 C++ 릴리스에 사용되고 있습니다.
이제 코드 번역기에서 사용하는 기술을 설명할 차례입니다. 번역기는 C#으로 작성된 콘솔 응용 프로그램으로, 일반적인 시퀀스(예: 번역-컴파일-테스트)를 수행하는 스크립트에 쉽게 통합됩니다. 또한 버튼을 클릭하여 동일한 작업을 수행할 수 있는 GUI 구성 요소도 있습니다.
구문 분석은 구식 버전의 번역기에서 NRefactory 라이브러리를 사용하며 새 버전에서는 Roslyn을 사용합니다.
번역기는 정보 수집 및 C++ 코드 출력을 위해 여러 AST 트리 탐색을 수행합니다. C++ 코드에는 AST 표현이 생성되지 않으며 대신 순수 텍스트 형식으로 출력 코드를 처리합니다.
번역기를 미세 조정하기 위해 추가 정보가 필요한 경우가 많습니다. 이 정보는 옵션과 속성을 통해 전달됩니다. 옵션은 전체 프로젝트에 적용되며 일반적으로 코드를 구문 분석할 때 사용되는 클래스 내보내기 매크로 이름이나 C# 조건 기호를 지정하는 데 사용됩니다. 속성은 유형 및 엔터티에 적용되며 특정 정보를 제공합니다. 예를 들어 번역된 코드에서 어떤 클래스 멤버가 const
또는 mutable
한정자를 필요로 하는지 또는 어떤 엔터티를 번역에서 제외해야 하는지를 표시합니다.
C# 클래스와 구조는 C++ 클래스로 변환됩니다. 멤버 및 소스 코드는 가장 유사한 형태로 변환됩니다. 제네릭 유형 및 메서드는 C++ 템플릿으로 매핑됩니다. C# 참조는 스마트 포인터(공유 또는 약한 참조)로 번역됩니다. 참조 클래스는 라이브러리에서 정의됩니다. 코드 번역기의 기타 내부 세부 정보는 별도의 기사에서 설명됩니다.
따라서 C#에서 C++로 번역된 프로젝트는 .NET 라이브러리 대신 저희 라이브러리에 의존합니다:
C#에서 C++로 번역기 Library와 번역된 프로젝트를 구축하기 위해 Cmake을 사용합니다. 현재는 VS 2017 및 2019(Windows), GCC 및 Clang(Linux) 컴파일러를 지원하고 있습니다.
이미 언급했듯이, 대부분의 .NET 구현은 다음과 같은 타사 라이브러리 위에 얇은 어댑터로 구성됩니다:
번역기와 라이브러리는 많은 테스트로 검증되었습니다. 라이브러리 테스트는 GoogleTest 프레임워크를 사용하고, 번역기 테스트는 주로 NUnit/xUnit로 작성되며 다음과 같은 여러 범주로 나뉩니다:
버전 관리 시스템으로 GitLab을 사용하고, CI에는 Jenkins를 사용합니다. 번역된 제품은 NuGet 패키지 및 다운로드 가능한 아카이브로 제공됩니다.
이 프로젝트를 진행하면서 다양한 문제에 직면했습니다. 일부는 예상했던 것이고, 다른 일부는 그 과정에서 발견되었습니다:
Object
유형에 대한 대체가 없으며 대부분의 라이브러리 클래스에 RTTI가 없습니다. 이로 인해 .NET 유형을 STL 유형으로 매핑하는 것이 불가능합니다.yield
).그럼에도 불구하고 코드 번역기 프로젝트는 기술적인 관점에서 매우 흥미로우며, 학문적인 복잡성으로 인해 우리는 항상 새로운 것을 배우게 됩니다.
코드 번역기 프로젝트를 진행하면서 우리는 코드 번역이라는 흥미로운 학문적인 과제를 해결하는 시스템을 성공적으로 구현했습니다. 우리는 Aspose 라이브러리의 월간 릴리스를 해당 언어로 작동하지 않아야 할 언어로 조직했습니다.
코드 번역기에 관한 더 많은 기사를 게시할 계획입니다. 다음 기사에서는 구체적인 C# 구조가 C++ 구조로 어떻게 매핑되는지를 포함하여 변환 프로세스를 자세히 설명합니다. 다른 기사에서는 메모리 관리 모델에 대해 이야기할 것입니다.
질문에 답하기 위해 최선을 다하겠습니다. 독자들이 코드 번역기 개발의 다른 측면에 관심이 있다면 더 많은 기사를 작성하는 것도 고려해 볼 수 있습니다.