더 나은 구문으로 C로 변환하는 언어가 있습니까? [닫은]


19

CoffeeScript는 Ruby에서 영감을 얻은 깔끔한 구문으로 JavaScript로 변환하는 언어입니다. C로 변환하는 비슷한 언어가있어 성능 저하없이 더 읽기 쉬운 코드를 사용할 수 있습니까? 이와 같은 것이 존재하지 않는다면 그것을 만들지 않는 좋은 이유가 있습니까?


10
그러나 "C로 컴파일"은 "원래 C 프로그램만큼 빠름"과 동의어 가 아닙니다 . 무언가가 C로 컴파일 될 때, 보통 사람이 C로 쓰는 것과는 다른 (또는 완전히) 다른 코드를 생성 할 수 있습니다. 보통 손으로 쓰는 것보다 훨씬 느리거나 때로는 더 빠를 수 있습니다.
Jerry Coffin

4
이 답변에 대해 내가 싫어하는 것은 Vala와 같이 완전히 다른 언어를 제안한다는 것입니다. CoffeeScript에 대한 것은 Javascript이지만 다른 구문을 사용한다는 것입니다.
Falken 교수는 Monica를 지원합니다.

2
파스칼 또는 포트란 ?

5
"트랜스 컴파일"(단어)이 죽었 으면 좋겠다. "컴파일"및 "컴파일러"입니다. 출력 언어가 x86이 아니기 때문에 새로운 단어가 필요하지 않습니다 (그렇다고 생각하면 컴파일러를 이해하지 못합니다).
Leushenko

2
transpile 이라는 단어 는 코드가 동일한 의미론을 가진 다른 언어의 소스 코드로 코드를 변환하는 것을 의미합니다 (또는 최근에 의미를 갖게 됨 ) . 일반적으로 동등한 문장에 대한 명령문 (소스 맵도 작성 가능). 트랜스 파일러가 컴파일러와 다른 작업을 수행한다고 주장하는 사람은 없습니다. 변환기는 특정 유형의 컴파일러입니다.
Carl Smith

답변:


23

CoffeeScript는 매우 간단한 이유로 JavaScript로 컴파일하고 JavaScript는 사실상 클라이언트 측 언어이며 브라우저 공급 업체가 CoffeeScript를 기본적으로 지원할 것으로 예상되는 경우 부당한 이유가 될 수 있습니다.

거의 모든 플랫폼과 풍부한 C 라이브러리를위한 C 컴파일러가 있기 때문에 매우 유사한 방식으로 C 번역가에게 고급 언어의 주요 요점은 즉각적인 이식성입니다. 예를 들어 Vala 는 다음과 같이 설계되었습니다 .

  1. 에 대한 컴파일러 될 G 객체 ,
  2. 머신의 C 컴파일러를 통해 네이티브 실행 파일을 빌드하고,
  3. 참조 카운팅 자동화
  4. 그놈 C 프로그래머는 여전히 접근 가능

그놈은 전통적으로 C 중심의 프로젝트이며 GObject는 C로 작성되었으므로 Vala는 친숙한 성격 (및 구문)에 관계없이 기계 코드로 컴파일하면 그놈 개발자들 사이에서 많은 사랑을 얻지 못할 것입니다. 모든 사람이 구문을 좋아하는 것 같지 않은데 , 다른 언어 인 Genie 가 그것을 향상시키기 위해 만들어 졌다는 점입니다 .

C ++ 예제의 경우 Facebook 은 PHP에서 C ++ 로의 번역기 인 HipHop을 개발했습니다 . 그들은 모든 PHP 코드를 교체하고 엔지니어를 다시 훈련시킬 필요없이 (또는 최악의 경우) CPU 사용과 같은 매우 특정한 문제를 해결하려고했습니다. 이것은 Facebook 확장 성 문제가 독특하고 PHP 확장이 C 및 C ++로 작성되므로 중간 C ++ 코드에 다시 액세스하는 것이 유용 할 수 있으므로 훨씬 더 구체적인 예입니다.

따라서 중급 언어에서 다른 언어로 번역하는 것은 중간 코드에 액세스해야 할 때 주로 좋습니다. CoffeeScript의 경우 광범위한 브라우저 채택으로 인해 JavaScript 코드가 필요하며 기존 코드베이스로 인해 Vala, Genie 및 HipHop에 필요합니다. 분명히 중간 코드에 액세스 할 수 있으면 필요할 때 더 최적화 할 수 있습니다.

그러나 일반적으로 말해서 결과 코드를 사용하지 않은 경우 C 또는 다른 언어로 번역되는 언어를 작성하는 것은 좋은 생각이 아닙니다. C에 대처할 수 없다면 다른 언어를 선택하십시오. 우연히도 Bjarne Stroustrup (CFront)이 작성한 최초의 C ++ 컴파일러는 Classes to C 변환기를 사용하는 C 였지만, 주로 새로운 언어로 C를 Classes 로 부트 스트랩 할 수 없었기 때문 입니다.


3
님도 있습니다.
noɥʇʎԀʎzɐɹƆ

스위프트는 C로 컴파일 할 수 있습니다.
Quazi Irfan

9

나는 Yannis Rizos 가 그의 다른 위대한 대답에서하지 않은 몇 가지 사항을 다룰 것입니다.

예, 많은 언어가 존재합니다. C는 컴파일러 백엔드의 일반적인 목표입니다. LLVM의 경우 그다지 중요하지 않지만 매우 이식성이 뛰어나고 최적화되어 있기 때문입니다.

내가 아는 몇 가지 구현은 다음과 같습니다.

  • C ++ (적어도 초기에는)
  • GHC Haskell (주 코드 생성기는 C--이지만)
  • Gambit / Chicken / Bigloo Scheme
  • ECL (공통 리스프)
  • 발라 & 지니

오리지널 C 프로그램만큼 빠름

아니요, C를 중간 언어로 사용한다고해서 속도에 도달하지는 않습니다. C가 빠른 이유는 다른 언어와는 다른 코드 작성 방법 때문입니다. 휴대용 어셈블리 일뿐 특별하지는 않습니다.


1
C는 집회에서 멀리 떨어져 있습니다.
Sarge Borsch

1
어떤 사람들은 C를 "고수준 어셈블러"라고 생각합니다. 그것은 기계에 아주 가깝지만 물론 많은 opcode는 아닙니다.
dstromberg

6

Rock 은 C99 소스를 생성 하는 ooc 컴파일러입니다. OOC-LANG은 객체, 일류 기능, 핑크 유니콘과 프로그래밍 언어입니다. OOC는 동적 언어이며 지금까지 멀리 산책. 더 뚱뚱하고 느린 c 코드를 생성합니다. 귀하의 요구 사항에 맞게 수정해야합니다. 그러나 좋은 출발점입니다.


4

ValaGenie 는 모두 C 로 컴파일되는 언어입니다. haxe 는 C ++로 컴파일하지만 이것이 원하는 것이 확실하지 않습니다.


2
이러한 각 리소스에 대해 조금 더 설명해 주시겠습니까? 그리고 질문에 대답하는 데 왜 이러한 리소스를 추천하십니까? "링크 전용 답변" 은 Stack Exchange에서 그리 환영받지 않습니다
gnat

4

OCaml은 바이트 코드, 네이티브 코드로 컴파일 하거나 직접 해석하거나 C로 컴파일 할 수 있습니다 .


1
무엇을하는지 더 자세히 설명해 주시겠습니까? 그리고 질문에 대한 답변으로 추천하는 이유는 무엇입니까? "링크 전용 답변" 은 Stack Exchange에서 환영받지 못합니다
gnat

3
내 답변이 "링크 전용 답변"인 방법을 알 수 없습니다. 실제로 링크를 제거해도 여전히 유효한 답변입니다. 문제는 "X를하는 언어가 있습니까?"이고 제 대답은 "language Y does X"입니다. 이 의견은 Bilijk의 답변에도 적용됩니다.
barjak

3
  • Bjarne Stroustrop의 원래 C ++ 컴파일러 인 "cfront"는 C ++를 C로 컴파일 한 다음 선택적으로 C 컴파일러를 실행하여 개체 코드를 생성합니다. C ++은 "이론적이지 않은"것처럼 얻을 수 있습니다 :-)
  • 유닉스 "yacc"와 GNU "Bison"컴파일러-컴파일러는 입력 언어를 C로 변환합니다. 많은 정교한 시스템이이 언어로 작성되었습니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.