소스 대 소스 컴파일러
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
소스 대 소스 컴파일러는 한 프로그래밍 언어의 소스 코드를 다른 프로그래밍 언어의 소스 코드로 변환하는 컴파일러의 일종이다. 초기에는 어셈블리 언어 간의 변환에 사용되었으며, 1980년대 초 최적화 컴파일러 기술이 도입되면서 더욱 발전했다. 현재는 다양한 프로그래밍 언어 구현 및 코드 이식에 활용되며, 트랜스컴파일러 파이프라인을 통해 재귀적 트랜스컴파일링을 수행하기도 한다.
더 읽어볼만한 페이지
- 소스 대 소스 컴파일러 - 스칼라 (프로그래밍 언어)
스칼라는 마틴 오더스키가 설계한 객체 지향 및 함수형 프로그래밍 언어이며, 자바 플랫폼에서 실행되고 자바 코드와 상호 운용이 가능하며, 아파치 스파크 등 다양한 곳에서 활용된다. - 소스 대 소스 컴파일러 - 타입스크립트
타입스크립트는 마이크로소프트에서 개발한 자바스크립트의 상위 집합으로, 정적 타입 지정, 타입 추론 등의 기능을 제공하여 코드의 안정성과 가독성을 높이는 언어이다. - 유틸리티 소프트웨어 종류 - 데이터 압축
데이터 압축은 디지털 데이터의 크기를 줄여 저장 공간을 절약하고 전송 속도를 향상시키는 기술로, 모르스 부호에서 시작하여 ZIP, JPEG, LZ77 등 다양한 방식으로 발전해 왔으며, 무손실 압축과 손실 압축으로 나뉘고 최근에는 인공지능 기술을 활용하여 효율성을 높여 다양한 분야에서 활용되고 있다. - 유틸리티 소프트웨어 종류 - 바이러스 검사 소프트웨어
바이러스 검사 소프트웨어는 악성 소프트웨어의 감염을 탐지, 제거 또는 차단하는 소프트웨어로, 다양한 기술을 사용하여 악성코드를 식별하고 시스템을 감시하며, V3, 노턴 안티바이러스, 알약 등 다양한 종류가 존재한다.
소스 대 소스 컴파일러 | |
---|---|
개요 | |
유형 | 컴파일러 |
종류 | 소스 코드 → 소스 코드 |
다른 이름 | 트랜스컴파일러 트랜스파일러 |
상세 정보 | |
목적 | 하나의 프로그래밍 언어로 작성된 소스 코드를 다른 언어의 동등한 소스 코드로 변환 |
사용 이유 | 다양한 플랫폼 지원 레거시 시스템과의 호환성 유지 새로운 프로그래밍 언어 기능 활용 가독성 향상 난독화 |
예시 | C에서 C++로 변환 자바에서 C#로 변환 파이썬에서 자바스크립트로 변환 CoffeeScript에서 자바스크립트로 변환 TypeScript에서 자바스크립트로 변환 C++에서 High Level Shading Language로 변환 |
장점 | 이식성 향상 성능 향상 코드 재사용성 증가 |
단점 | 변환 과정의 복잡성 디버깅 어려움 원래 코드의 의미론적 보존 문제 |
활용 예시 | |
웹 개발 | 웹 브라우저 호환성을 위해 ECMAScript 5 이전 코드로 변환 |
게임 개발 | 다른 셰이더 모델을 지원하기 위해 변환 |
크로스 플랫폼 개발 | OpenGL 코드를 Direct3D 코드로 변환 |
같이 보기 | |
관련 용어 | 컴파일러 크로스 컴파일러 컴파일러 생성기 트랜스코더 트랜스퓨터 |
2. 역사적 배경
트랜스컴파일러라는 개념은 컴퓨터 과학 초기부터 존재했지만, 1980년대에 들어서면서 본격적으로 주목받기 시작했다.
1981년 디지털 리서치는 인텔 8080용 .ASM 소스 코드를 인텔 8086용 .A86 소스 코드로 변환하는 XLT86을 개발했다. XLT86은 8080 레지스터를 사용한 전반적인 데이터 흐름 분석을 통해 출력 코드 크기를 최적화하고, CP/M-80과 프로그램을 CP/M-86과 으로 자동 이식할 수 있도록 지원했다.[5] XLT86은 PL/I-80로 작성되었으며, CP/M-80 환경뿐만 아니라 DEC VMS에서도 작동했다.[5]
1980년 팀 패터슨은 86-DOS의 일부로 TRANS.COM을 작성했다. TRANS.COM은 몇몇 Z80어셈블러 소스 코드를 8086용 .ASM 소스 코드로 변환했지만, 제어 코드, 레지스터, 모드의 하위 집합만 지원하여 수동 변환 및 수정이 필요했다. 또한 레지스터나 점프 최적화를 수행하지 않았다.[6][7]
2. 1. 초기 어셈블리 언어 번역기 (1970년대 후반 ~ 1980년대 초반)
인텔은 1978년에 8비트 프로세서인 8080용으로 작성된 소스 코드를 16비트 프로세서인 8086용 소스 코드로 변환하는 CONV86 (CONV-86 및 CONVERT 86으로도 불림)을 개발하여 소스 코드 호환성을 지원했다. 이 번역기는 ISIS-II 기반이었으며, 여러 단계의 변환을 지원했고, 8인치 플로피 디스크 드라이브가 장착된 MDS-800에서 2 MHz로 실행되었다.시애틀 컴퓨터 프로덕츠(SCP)는 8080 및 자일로그(Zilog) Z80 어셈블리 소스 코드를 8086 어셈블리 소스 코드로 변환하는 TRANS86.COM(이후 TRANS.COM)을 개발했다. 팀 패터슨이 1980년에 86-DOS를 개발하는 동안 작성한 이 유틸리티는 크로스 어셈블러(cross-assembler) ASM86 for CP/M-80과만 호환되는 형식이었지만, 연산 코드(opcode), 레지스터 및 모드의 하위 집합만 지원했으며, 변환 후에도 상당한 수동 수정 및 재작업이 필요했다. 또한, 단순한 음역(transliteration)만 수행했으며, 무작위 대입 단일 패스 번역기(single-pass translator)는 레지스터 및 점프 최적화를 수행하지 않았다.
SORCIM은 1980년에 TRANS86으로도 불린 8080에서 8086으로의 소스 코드 변환기를 제공하여 CP/M-80 응용 프로그램 코드를 MS-DOS로(ACT86과 호환되는 형식으로) 이식할 수 있게 했다. SCP 프로그램과 유사하게 명령어 단위로 번역되었으며, 조건 분기에 대한 약간의 최적화가 적용되었다.
2. 2. 최적화 컴파일러 기술 도입 (1980년대 초반)
디지털 리서치의 XLT86은 1981년에 출시된 프로그램으로, 최적화 컴파일러 기술을 소스 번역 과정에 도입한 초기 사례 중 하나이다. 게리 킬달이 작성한 XLT86은 인텔 8080 프로세서용 .ASM 소스 코드를 인텔 8086용 .A86 소스 코드로 변환했다. 이 프로그램은 전역 데이터 흐름 분석을 통해 코드 크기를 최적화하고, CP/M-80 및 MP/M-80 프로그램을 CP/M-86 및 MP/M-86 플랫폼으로 자동 포팅할 수 있도록 지원했다. XLT86 자체는 PL/I-80으로 작성되었으며, CP/M-80 플랫폼 및 DEC VAX/VMS에서도 사용할 수 있었다.2. 3. 기타 어셈블리 언어 번역기
2500 AD 소프트웨어는 Z80을 사용하는 CP/M-80 머신용 XASM 제품군과 Zilog ZEUS 및 Olivetti PCOS 시스템의 일부로 8080에서 8086으로의 소스 코드 변환기를 제공했다.1979년부터 Zilog는 PDS 8000 개발 시스템의 일부로 Z80에서 Z8000으로의 변환기를 제공했다. AMC와 2500 AD 소프트웨어도 Z80에서 Z8000으로의 변환기를 제공했다. 2500 AD 소프트웨어의 변환기는 TRANS로 명명되었으며 Z80 CP/M, CP/M-86, MS-DOS 및 PCOS에서 사용할 수 있었다.
3. 프로그래밍 언어 구현
많은 프로그래밍 언어가 트랜스컴파일러를 통해 구현되거나, 트랜스컴파일러를 주요 구현 방식으로 사용한다.
일부 프로그래밍 언어는 처음 구현될 때부터 트랜스컴파일러를 사용했으며, CoffeeScript처럼 여전히 트랜스컴파일러가 기본 구현인 경우도 있다. CoffeeScript 유지 관리자는 JavaScript로 컴파일되는 언어 목록을 제공한다.
3. 1. 주요 트랜스컴파일러 예시
다음은 소스 대 소스 컴파일러(트랜스컴파일러)의 주요 예시이다.이름 | 소스 언어 | 대상 언어 | 비고 |
---|---|---|---|
Babel | ES6+ (JS) | ES5 | 구형 브라우저와의 호환성을 위해 사용된다. |
[https://www.cerberus-x.com/community/portal/ Cerberus X] | Cerberus | JavaScript, Java, C++, C# | |
Cfront | C++ | C | 초기 C++ 컴파일러이다. |
ClojureScript | Clojure | JavaScript | 웹 브라우저에서 실행하기 위해 사용된다. |
[https://dafny.org Dafny] | Dafny | C#, JS, Java, C++, Go, Python | |
[https://dart.dev/tools/dart2js Dart] | Dart | JavaScript | |
h5 | C# | JavaScript | |
Haxe | Haxe | ActionScript 3, JavaScript, Java, C++, C#, PHP, Python, Lua | |
HipHop for PHP (HPHPc) | PHP | C++ | 성능 향상을 위해 사용되었다. |
J2ObjC | Java | Objective-C | |
JSweet | Java | TypeScript | |
Maia | Maia | Verilog | |
[https://code.google.com/archive/p/naca/ NACA] | COBOL, Java | COBOL, Java | |
[https://github.com/thepowersgang/mrustc mrustc] | Rust | C | 공식 rust 컴파일러(rustc)를 부트스트랩할 수 있는 실험적 컴파일러 |
[https://nim-lang.org/ Nim] | Nim | C, C++, Objective-C, JavaScript | |
[https://rescript-lang.org/ ReScript] | OCaml | JavaScript | |
Swiftify | Objective-C | Swift | |
Vala | C | ||
[https://fable.io/ Fable] | F# | JavaScript | |
[https://fable.io/Fable.Python/ Fable Python] | F# | Python |
변환 소스 언어 | 변환 대상 언어 | 비고 | ||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
BASIC | C | BaCon을 사용한다[9] | ||||||||||||||||||||||||||||||||||||||||||||||||||
BCX영어 | C | |||||||||||||||||||||||||||||||||||||||||||||||||||
C | JavaScript | Emscripten | ||||||||||||||||||||||||||||||||||||||||||||||||||
4. 코드 이식
트랜스컴파일러는 개발자가 기존 코드베이스를 다른 언어로 전환할 때 유용하게 사용된다. 전체 소프트웨어를 수동으로 다시 작성하는 것보다 트랜스컴파일러를 사용하는 것이 더 효율적일 수 있다. 트랜스컴파일러의 품질에 따라 코드가 제대로 작동하기 위해 수동 개입이 필요할 수도 있고 그렇지 않을 수도 있다.
4. 1. 코드 이식 도구 예시
5. 트랜스컴파일러 파이프라인
트랜스컴파일러 파이프라인은 재귀적 트랜스컴파일링을 통해 여러 기술 계층을 연결하고, 각 계층 간 변환 단계를 거쳐 기술을 반복적으로 변환하는 방식으로 구성된다. 이러한 파이프라인은 XSLT와 같은 범용 변환 도구를 사용하여 구축할 수 있다. 5. 1. 재귀적 트랜스컴파일링트랜스컴파일러 파이프라인은 ''재귀적 트랜스컴파일링''의 결과이다. 여러 계층의 기술을 연결하고 각 계층 사이에 트랜스컴파일 단계를 거치면 기술을 반복적으로 변환하여 분산된 언어 독립 사양을 효과적으로 생성할 수 있다.XSLT는 다양한 기술 간에 사용될 수 있는 범용 변환 도구로, 이러한 파생 코드 파이프라인을 만들 수 있다. '''재귀적 변환 컴파일'''(또는 '''재귀적 변환''')은 변환 컴파일의 개념을 재귀적으로 적용하여 변환 파이프라인을 생성하는 과정으로, (종종 단일 진실 공급원에서 시작하여) 한 기술을 다른 기술로 반복적으로 변환한다. 이 과정을 반복함으로써 A → B → C → D → E → F를 거쳐 다시 A(v2)로 변환할 수 있다. A → A(v2)의 파이프라인을 통해 일부 정보가 보존되며, 해당 정보는 (추상적인 수준에서) 각 구성 요소 A–F가 동의하는 사항을 보여준다. 변환 컴파일러 파이프라인이 생성하는 각기 다른 버전에서 해당 정보는 보존된다. 이는 다양한 모양과 크기를 가질 수 있지만, 위 파이프라인에서 여섯 번의 변환 컴파일을 거쳐 A(v2)로 돌아올 때 정보는 원래 상태로 돌아간다. A–F–A(v2)의 각 형식을 통한 변환에서 살아남는 이 정보는 (정의상) 파생 콘텐츠 또는 파생 코드이다. 재귀적 변환 컴파일은 변환 컴파일러가 개발을 용이하게 하고 원래 소스 코드의 디버깅을 위해 변환된 코드를 소스 코드에 최대한 가깝게 유지하거나, 변환된 코드가 소스 코드처럼 보이지 않도록 원래 코드의 구조를 크게 변경할 수 있다는 사실을 활용한다. 또한 변환 컴파일된 소스 코드를 원래 코드로 다시 매핑하는 디버깅 유틸리티도 있다. 예를 들어, 자바스크립트 소스 맵을 사용하면 웹 브라우저에서 실행되는 자바스크립트 코드를 자바스크립트 언어로 변환된 원래 소스에 매핑할 수 있다. 참조
[1]
웹사이트
Types of compilers
http://www.compilers[...]
compilers.net
1997–2005
|