맨위로가기

소스 대 소스 컴파일러

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의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. 주요 트랜스컴파일러 예시

다음은 소스 대 소스 컴파일러(트랜스컴파일러)의 주요 예시이다.

트랜스컴파일러 목록
이름소스 언어대상 언어비고
BabelES6+ (JS)ES5구형 브라우저와의 호환성을 위해 사용된다.
[https://www.cerberus-x.com/community/portal/ Cerberus X]CerberusJavaScript, Java, C++, C#
CfrontC++C초기 C++ 컴파일러이다.
ClojureScriptClojureJavaScript웹 브라우저에서 실행하기 위해 사용된다.
[https://dafny.org Dafny]DafnyC#, JS, Java, C++, Go, Python
[https://dart.dev/tools/dart2js Dart]DartJavaScript
h5C#JavaScript
HaxeHaxeActionScript 3, JavaScript, Java, C++, C#, PHP, Python, Lua
HipHop for PHP (HPHPc)PHPC++성능 향상을 위해 사용되었다.
J2ObjCJavaObjective-C
JSweetJavaTypeScript
MaiaMaiaVerilog
[https://code.google.com/archive/p/naca/ NACA]COBOL, JavaCOBOL, Java
[https://github.com/thepowersgang/mrustc mrustc]RustC공식 rust 컴파일러(rustc)를 부트스트랩할 수 있는 실험적 컴파일러
[https://nim-lang.org/ Nim]NimC, C++, Objective-C, JavaScript
[https://rescript-lang.org/ ReScript]OCamlJavaScript
SwiftifyObjective-CSwift
ValaC
[https://fable.io/ Fable]F#JavaScript
[https://fable.io/Fable.Python/ Fable Python]F#Python



변환 소스 언어변환 대상 언어비고
BASICCBaCon을 사용한다[9]
BCX영어C
CJavaScriptEmscripten

4. 코드 이식

트랜스컴파일러는 개발자가 기존 코드베이스를 다른 언어로 전환할 때 유용하게 사용된다. 전체 소프트웨어를 수동으로 다시 작성하는 것보다 트랜스컴파일러를 사용하는 것이 더 효율적일 수 있다. 트랜스컴파일러의 품질에 따라 코드가 제대로 작동하기 위해 수동 개입이 필요할 수도 있고 그렇지 않을 수도 있다.

코드베이스 포팅에 사용되는 모든 트랜스컴파일러는 가독성 및 플랫폼 규칙 측면에서 최대 코드 품질을 달성해야 할 경우 출력 소스 코드의 수동 조정을 예상한다.

도구소스 언어대상 언어비고
EmscriptenLLVM 바이트코드자바스크립트C/C++ 코드베이스를 브라우저에서 실행할 수 있게 한다.
c2goCGo1.5 릴리스 전에는 Go 컴파일러가 C로 작성되었다. 컴파일러 코드베이스를 C에서 Go로 자동 변환하기 위해 자동 번역기가 개발되었다. Go 1.5부터 "컴파일러와 런타임은 이제 C 없이 Go와 어셈블러로 구현되었습니다".
C2RustC러스트C2Rust는 C 코드를 입력으로 받아 unsafe 러스트 코드를 출력하여 원래 코드베이스와의 호환성을 유지한다. 이 프로세스에는 여러 가지 문서화된 제한 사항이 있으며, 결과 코드를 안전하고 관용적인 러스트 코드로 변환하는 것은 번역 후 수동 작업이지만, 이를 위한 자동화된 도구가 있다.
Ocsigen의 Js_of_ocamlOCaml자바스크립트
J2Eif자바에펠결과 에펠 코드는 자바 프로그램과 유사한 클래스 및 구조를 갖지만 에펠 구문과 규칙을 따른다.
C2EifC에펠결과 에펠 코드는 가능한 한 깔끔하게 클래스 및 구조를 갖는다. 이 도구는 완전하며 제대로 번역할 수 없는 경우 C 및 어셈블리 코드를 포함하는 데 의존한다.
Skip스위프트코틀린Skip은 SwiftUI를 사용하는 Swift iOS 앱 또는 라이브러리를 Jetpack Compose를 사용하여 Android용 동등한 네이티브 Kotlin 코드로 트랜스파일하는 Xcode 플러그인이다.
런타임 변환기PHP자바런타임 변환기는 PHP 소스 코드를 자바 소스 코드로 변환하는 자동 도구이다. PHP 표준 라이브러리 및 확장 함수 호출을 위해 JNI를 사용하여 PHP 언어의 특정 기능과 PHP 바이너리 자체를 호출할 수 있는 자바 런타임 라이브러리가 있다.


4. 1. 코드 이식 도구 예시

도구소스 언어대상 언어비고
2to3 스크립트파이썬 2파이썬 32to3는 번역 프로세스를 자동화하기 위해 최선을 다하지만, 추가적인 수동 수정이 필요한 경우가 많다.
구글 웹 툴킷특정 API를 사용하는 자바 프로그램자바스크립트자바 코드는 일반적인 자바 코드에 비해 약간 제한적이다.
SwiftifyObjective-C스위프트Swiftify는 Objective-C에서 Swift로의 온라인 소스 간 변환 도구이다. 이는 iOS 코드베이스의 전부 또는 일부를 Swift로 마이그레이션하는 개발자를 지원한다. 변환은 주로 Objective-C와 Swift 간의 구문 변환을 목표로 하며, Apple이 Swift와 Objective-C 런타임 간의 호환성을 보장하기 위해 노력했기 때문에 도움이 된다.


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
[2] 웹사이트 Transparent Compilation http://martinfowler.[...] 2013-02-12
[3] 웹사이트 Semantic patching with Coccinelle https://lwn.net/Arti[...] lwn.net 2009-01-20
[4] 웹사이트 HTML5 Epic Citadel http://www.unrealeng[...] 2016-10-20
[5] 간행물 XLT86 - 8080 to 8086 Assembly Language Translator - User's Guide http://www.s100compu[...] Digital Research Inc, Pacific Grove 1981
[6] 간행물 86-DOS - Disk Operating System for the 8086. User's manual, version 0.3 - Preliminary http://www.patersont[...] Seattle Computer Products, Seattle 1980
[7] 웹사이트 Microsoft DOS V1.1 and V2.0: Z80 to 8086 Translator version 2.21 /msdos/v11source/TRANS.ASM http://www.computerh[...] Computer History Museum, マイクロソフト 2013-12-19
[8] 웹사이트 List of languages that compile to JS https://github.com/j[...] 2014-12-15
[9] 웹사이트 BaCon - A free BAsic CONverter for Unix, BSD and MacOSX http://www.basic-con[...] Basic-converter.org
[10] 웹사이트 Script# by nikhilk http://scriptsharp.c[...] Scriptsharp.com
[11] 웹사이트 Smart Mobile Studio http://smartmobilest[...] SmartMobileStudio.com
[12] 웹사이트 Babel · The compiler for writing next generation JavaScript https://babeljs.io/
[13] 웹사이트 Traceur is a JavaScript.next-to-JavaScript-of-today compiler https://github.com/g[...]
[14] 웹사이트 j2objc - Java to iOS Objective-C translation tool and runtime. http://j2objc.org/ j2objc.org 2014-02-13
[15] 웹사이트 java2c-transcompiler - A simple source-to-source from Java to C - Google Project Hosting https://code.google.[...]
[16] 웹사이트 IntelLabs/julia https://github.com/I[...] 2016-10-20
[17] 웹사이트 Google Groups https://groups.googl[...] 2016-10-20
[18] 웹사이트 MoonScript, a language that compiles to Lua http://moonscript.or[...] 2016-09-21
[19] 웹사이트 Shed Skin, An experimental (restricted-Python)-to-C++ compiler https://code.google.[...] 2014-10-01
[20] 웹사이트 Sass: Syntactically Awesome Style Sheets http://sass-lang.com[...] Sass-lang.com
[21] 웹사이트 Xtend, modernized Java http://www.eclipse.o[...] Eclipse project 2014-10-01
[22] 웹사이트 Js_of_ocaml http://ocsigen.org/j[...] 2014-10-08
[23] 웹사이트 J2Eif Research Page - Chair of Software Engineering http://se.inf.ethz.c[...] Se.inf.ethz.ch
[24] 웹사이트 C2Eif Research Page - Chair of Software Engineering http://se.inf.ethz.c[...] Se.inf.ethz.ch
[25] 웹사이트 Objective-C to Swift Converter | Swiftify https://swiftify.com[...] 2021-04-23
[26] 웹인용 Types of compilers http://www.compilers[...] compilers.net 1997–2005
[27] 웹인용 Transparent Compilation http://martinfowler.[...] 2013-02-12
[28] 웹인용 Source Map Revision 3 Proposal https://docs.google.[...] 2011-02-11
[29] 웹인용 Introduction to JavaScript Source Maps http://www.html5rock[...] html5rocks.com 2012-03-21
[30] 웹인용 HTML5 Epic Citadel http://www.unrealeng[...]



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com