더 높은 수준의 언어를 읽을 수있는 C ++로 컴파일 할 수 있습니까? [닫은]


12

C ++은 여러면에서 훌륭한 언어이지만 특히 IDE없이 작성하는 것이 번거 롭습니다. VIM 사용자로서, S-Expressions 및 가능하게는 Lisp와 유사한 매크로를 사용하여 C ++를 작성할 수있게 해주는 동일한 수준의 언어에 액세스 할 수 있다면 매우 흥미로울 것입니다. 다시 반복하여.

나는 프리 노드에 대해 물었고 ECL과 Bigloo와 같은 컴파일러로 Lisp-> C를 컴파일하는 것과 같은 몇 가지 아이디어를 테스트했지만 특히 깨끗한 C 코드를 생성하는 것은 없었습니다.

이 문제에 대한 작품이 있습니까?


3
매크로가있는 lisp로 코드를 작성하여 C ++이되고 원하는 기능을 깔끔하게 정리하기는 쉽지 않습니다 .LISP 매크로를 사용하여 간단한 구문에서보다 복잡한 C ++로 확장하십시오. 더 나은 방법은 LISP로 코드를 작성하는 것입니다. :)
Jimmy Hoffa

2
(아마도 더 간단한) C ++-> 어셈블리가 읽을 수없는 (의견) 어셈블리를 생성 할 때 Lisp-> C ++ 번역이 깨끗한 C ++ 코드를 생성 할 것으로 기대하십니까? 어쨌든 편집의 대상은 누구입니까?

1
어쨌든 나는 누군가가 이미 확장하고자하는 것을 확장하기 위해 매크로를 이미 작성했다고 확신하지는 못하지만, 매크로는 놀랍게도 쓰기가 간단하기 때문에 처리 방법을 나열하기 때문에 작성하는 데 어려움이 없어야합니다. 매크로 확장기에서주의를 기울여야 할 때 구분하는 단일 s- 표현식 내에서 모두 목록을 인쇄하면 C ++ 코드가 확장됩니다.
Jimmy Hoffa

2
나는 Lisp가 C ++에서 어려운 것들을 할 수 있다는 것에 동의한다. 그런 일을해야합니까? 그런 다음 C ++에서 수행하기가 어렵 기 때문에 자동 또는 수동으로 C ++로 가져 오는 방법에 관계없이 예쁘지 않습니다. 내 제안 : Lisp가 할 수있는 어려운 일이 실제로 필요하지 않다면 Lisp를 사용하지 마십시오. C ++을 잘 활용하십시오. 그러한 것들을 사용해야하지만 C ++로 코딩 해야하는 경우 C ++에서 수행하는 방법을 찾으십시오. 그것이이 사업에서 성인과 어린이를 분리시키는 것입니다.
Mike Dunlavey

3
C 코드를 생성하는 컴파일러가있는 여러 언어가 있으므로 C와 같은 C ++ 코드 인 경우에도 이것이 왜 실현 가능하지 않은지 알 수 없습니다. 귀하의 질문이 "C ++에서 사용 가능한 모든 기능을 사용하여 표준적이고 모범적 인 C ++ 코드를 얻을 수 있습니까?"라면 조금 어려울 수 있습니다.
Robert Harvey

답변:


13

높은 수준의 언어를 낮은 수준의 언어로 컴파일하는 것은 케이크입니다. 수많은 사례가 있습니다. 많은 접선을 가지지 않고 C로 컴파일 된 초기 C ++ 컴파일러를 가리킬 수 있습니다.

그러나 믹스에 "깨끗한" "읽기"를 던지기 시작하면 상황이 매우 어려워집니다. 깨끗하고 읽을 수있는 코드 는 작성중인 내용 의 의미의도 를 나타냅니다. 컴퓨터는 의미를 해석하고 만드는 데 악명이 높습니다. int_147보다 이름 이 지정된 변수로 끝날 가능성이 큽니다 input_buffer_length. 물론, 이 프로젝트 를 실제로 만들고 싶다면 Lisp를 읽기 쉬운 C ++로 변환하는 대규모 AI 프로젝트에 참여할 수는 있지만 Common Lisp 컴파일러는 자신이하는 일을 꽤 잘합니다. .

Lisp에서 C ++을 생성하는 것보다 더 중요한 것은 이것의 유용성입니다. 생성 된 C ++를 읽을 수있게하려면 어떤 용도로 사용됩니까? Lisp이 소스 코드 인 경우 중간 표현은 관련이 없습니다. 원래 Lisp를 이해하지 못하는 프로그래머에게 C ++을 넘겨 주려면 다른 문제가 생겼습니다. 생성 된 C ++를 수정하려고하면 어떻게됩니까? C ++로 Lisp로 명확하게 번역되지 않는 것을 작성하면 어떻게됩니까?

우리가 그것을 해결했다고 가정 해 봅시다. 10 년 후, 우리는 수억 달러의 DoD 보조금을 타서 Lisp를 관용적 C ++로 바꿀 수있는 거대하고 복잡한 (완벽한) 언어 번역 엔진을 구축했습니다. 사람들에게 새로운 프로그래밍 언어를 가르치거나 두 언어를 연결할 수있는 새로운 컴파일러를 개발함으로써 더 나은 성과를 얻지 못한 것은 실제로 무엇을 얻었습니까?

아 맞다 당신의 상사는 당신이 C ++를 작성하기를 원하지만 당신은 그렇지 않을 것입니다. 이력서를 업데이트하고 새로운 직업을 찾으십시오.


이력서를 업데이트하고 다른 직업을 찾을 수 있기를 바랍니다. 불행히도 job = "student"및 boss = "professor"일 때는 그리 간단하지 않습니다. 그리고 불행히도, 나는 졸업장을 가져야합니다. 사실에 관계없이 나는 수업에 가지 않고 집에서 직접 배웁니다. 사실 나는 이미 업계에서 일하고 있으며 내가 아는 대부분의 졸업생보다 더 많은 돈을 벌고 있습니다. 그것이 작동하는 방식입니다. 슬프게도 행복하게도 C ++로 복잡한 것을 작성하면 교수님이 저를 합격 시키기로 동의했습니다. 이미 C ++을 알고 있습니다. 차라리 뭔가 다른를 (배울 수있는 기회를 줄 그래서,.. 호언 장담 제외하고, 좋은 답변 감사합니다
MaiaVictor에게

@ 독 카트 : C ++을 모른다고 생각합니다. 매개 변수에 메소드 또는 함수가 있는지 여부에 따라 특수 구현으로 템플리트를 작성할 수 있습니까? Boost.MPL을 사용하여 컴파일 타임 계산을 수행 했습니까? Boost.ForEach의 작동 방식을 알고 있습니까? C ++로해야한다면 고급 C ++을 배울 수있는 기회로 활용하십시오. 작업에 더 유용 할 것입니다.
Jan Hudec

1
그 슬픈 시절에 C ++로 작업했을 때 꽤 복잡한 템플릿을 만들었습니다. 예, Boost.ForEach를 많이 사용했지만 더 유용한 매크로를 많이 정의하는 것을 기억합니다. 어쨌든 나는 어렸을 때 재미있는 경험이 아니 었습니다. Lisp가 훨씬 더 견고하고 고통스럽지 않은 매크로 시스템을 제공 할 때 C ++이 전문가 기술을 필요로하는 메타 프로그래밍을 정확하게 수행 할 때 더 이상 배울 점이 없습니다.
MaiaVictor

3

짧은 대답, 현재 Lisp를 READABLE C ++로 변환하는 데 도움이되는 것은 없습니다. 물론 C ++ 또는 C로 무엇이든 변환 할 수 있지만 읽을 수있는 코드는 프로그램이 아니라 사람이 작성합니다. 물론 적절한 형식, 들여 쓰기, 멋진 클래스 이름으로 C ++ 코드를 출력 할 수도 있고 Lisp 클래스 객체에서 C ++ 클래스로 완벽하게 변환 할 수도 있습니다. 어쩌면 라이브러리 종속성을 올바르게 링크 할 수 있고 C 언어로 생성 한 것에 매우 가까운 바이너리를 컴파일 할 수 있습니다.하지만 C로 모든 것을 썼다면 궁극적으로 읽을 수있는 코드는 이해할 수없는 아름다움입니다. 적어도 아직까지는 아무도 읽을 수 없으며 처음에는 매우 주관적이며 한 개발자 그룹에서 읽을 수있는 것으로 간주 될 수있는 것은 다른 개발자에 의해 끔찍한 것으로 간주 될 수 있습니다.

C ++를 읽을 수있게하려면 Lisp가 아닌 C ++로 작성해야합니다. 또한 코드를 읽는 사람들이 가장 잘 이해할 수있는 방식에 따라 코딩 스타일을 변경할 수 있어야합니다. 책과 마찬가지로 프로그램은 특정 청중을 염두에두고 작성되며 잘 작성되면 아름답고 감동적이며, 그렇지 않으면 혼란스럽고 지루할 수 있습니다. 그리고 우리를 위해 아름다운 소설 소설을 작성하는 프로그램을 만들 수 없다면, 읽을 수있는 C ++로 변환 할 무언가를 생각 해낼 수 없을 것입니다.


당신이 "읽을 수있는"의미를 덮어 쓰고있는 것 같아요! 정말 아름답 지 않아도됩니다. 충분히 읽고 당신이 그것을 읽고 무슨 일이 일어나고 있는지 이해할 수 있습니다. JimmyHoffa가 의견에 제안한 것처럼 직접 번역을 위해 Lisp 매크로를 사용할 것입니다.
MaiaVictor

3

ViM은 C ++을위한 훌륭한 IDE입니다. 내가 지금까지 본 것 중 최고의 완성도를 보였지만 많은 헤더를 가져 가면 약간 느려 지지만 clang complete . 그리고 컴파일을 위해 어쨌든 모든 IDE가 부족하다는 것을 알았습니다. 어쨌든 CMake 또는 빌드로 빌드 시스템을 작성하게됩니다. 그리고 나는 lisp, 기간 동안 어떤 도움도 제공 하는 것을 보지 못했습니다 .

사실 C ++에는 lisp 스타일 매크로가 없지만 템플릿은 유형과 기능에 따라 다르게 구현할 수 있기 때문에 체계의 위생 매크로가 할 수있는 모든 것을 수행 할 수 있습니다. 사실, 가비지 수집기가 없기 때문에 클로저를 좀 더 지루하게 만들지 만 리소스 관리에 사용되는 RAII 관용구에는 고유 한 장점과 흥미로운 속성이 있습니다.

당신이 학생이라면, 당신은 정말로 모든 고급 C ++를 알고 있습니까? 알고리즘 라이브러리에서 인수 유형의 속성을 기반으로 대체 구현으로 템플릿을 작성하는 것보다 템플릿 메타 프로그래밍 (Boost.MPL 사용)을 사용하여 시간 계산을 컴파일하여 Boost가 어떻게 작동하는지 이해하는 데? 그렇지 않다면, 이것을 고급 C ++을 배울 수있는 기회로 삼는 것이 좋습니다. 학교 과제를 유지 관리 할 필요가 없으므로 언어를 가지고 놀면서 제작 코드에서 가독성에주의해야 할 기능의 가치를 확인할 수 있습니다.


그리고 마지막 직접 질문에 대답하기 위해 : C ++에는 관용구가 너무 많아서 관용 C ++을 생성 할 수있는 방법이 없습니다. 다른 관용구를 표현할 방법이 없기 때문입니다. C ++에서는 가비지 수집이 힙에 모든 것을 할당한다는 사실부터 시작하여 스택을 활용하는 것은 관용적입니다.


VIM에 동의하십시오. 그것은 C 개발을위한 장갑처럼 맞습니다. 저는 Vim 사용자이지만 Lisp의 경우 SLIME 및 Paredit과 함께 악의 모드에서 Emacs를 사용합니다. 기본 REPL 후크를 사용하여 vim에서 Lisping을 지원하지만 SLIME에 가깝지 않습니다.
mike30
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.