더 높은 수준의 언어를 읽을 수있는 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.