문제

C로 작성된 Lua, NekoVM 및 Potion과 같은 그리 오래되지 않은 VM 언어를 발견했습니다.

많은 C++ 기능을 다시 구현하는 것처럼 보였습니다.

C++ 대신 C로 작성하면 이점이 있나요?

도움이 되었습니까?

해결책

나는 루아에 대해 뭔가를 알고 있어요.

  • Lua는 순수 ANSI 표준 C로 작성되었으며 오류나 경고 없이 모든 ANSI 플랫폼에서 컴파일됩니다.따라서 Lua는 전 세계 거의 모든 플랫폼에서 실행됩니다., 다음과 같은 것들을 포함하여 캐논 파워샷 카메라.C++를 이상한 작은 임베디드 플랫폼에서 실행하는 것은 훨씬 더 어렵습니다.

  • Lua는 고성능 VM이며 C는 메서드 호출(가상일 수도 있고 아닐 수도 있음)과 연산자 오버로드를 표현할 수 없기 때문에 C 코드의 성능을 예측하기가 더 쉽습니다. 코드만 봐도 알 수 있다.C++, 특히 템플릿 라이브러리를 사용하면 자신도 모르게 리소스를 태우는 것이 너무 쉽습니다.(VM뿐만 아니라 라이브러리를 포함하는 Lua의 전체 구현은 145K의 x86 개체 코드에 적합합니다.전체 언어는 Intel i7의 L2와 구형 칩의 L1에서 찾을 수 있는 작은 256K 캐시에도 적합합니다.자신이 무엇을 하고 있는지 정말로 알지 않는 한 이렇게 작은 것으로 컴파일되는 C++를 작성하는 것은 훨씬 어렵습니다.)

C로 VM을 작성해야 하는 두 가지 이유가 있습니다.

다른 팁

많은 C ++ 기능을 다시 구현하는 것처럼 보였습니다.

C보다 C ++에서 다형성을 구현하는 것이 더 쉽다고 제안하고 있습니까? 나는 당신이 크게 착각했다고 생각합니다.

C ++로 VM을 쓰면 C ++의 다형성 측면에서 다형성을 구현하지 않습니다. 기능 이름을 포인터에 맵핑하는 자신의 가상 테이블을 굴립니다.

사람들은 C에 익숙합니다. 나는 Cfront 1.0 이후 C ++를 작성했지만 내 프로젝트에 C를 쓸 가능성이 더 높다는 것을 인정해야합니다.

사물을 완전히 제어하려면 C가 조금 더 쉽습니다.

명백한 대답 중 하나는 상호 운용성입니다. 언어 X는 언어 y로 정의 된 함수를 호출해야 할 때마다 X 또는 Y가 C (언어 C, 즉)인지 확인해야합니다.

C ++는 ABI를 정의하지 않으므로 다른 언어에서 C ++ 코드를 호출하는 것은 휴대하기가 약간 까다 롭습니다. 그러나 C 코드를 호출하는 것은 거의 사소합니다. 즉, VM의 적어도 일부는 C로 작성되어야 할 것입니다. 그렇다면 왜 일관성을 유지하고 전체를 C에 쓰지 않습니까?

C의 또 다른 장점은 간단하다는 것입니다. 누구나 읽을 수 있으며 글을 쓰는 데 도움이되는 프로그래머가 많이 있습니다. C ++는 좋고 나쁘기 때문에 전문가 언어가 훨씬 더 많습니다. C ++에서 많은 인상적인 일을 할 수 있으며 많은 작업을 구할 수 있지만 실제로 능숙한 프로그래머도 적습니다.

C ++에서 "좋은"것이기는 훨씬 어렵고, 하나가 잘 될 때까지 많은 버그와 문제가 생길 것입니다. 이제 특히 많은 사람들과 대규모 프로젝트를 수행 할 때 그 중 하나가 충분하지 않을 가능성은 훨씬 더 크기 때문에 C로 프로젝트를 코딩하는 것은 종종 덜 위험합니다. 휴대 성 문제도 있습니다. C 코드는 C ++보다 컴파일러를 통해 포트가 훨씬 쉽습니다.

LUA는 또한 LISP에서 구현하기 쉬운 많은 기능을 가지고 있으므로 왜이를 기초로 취하지 않습니까? 요점은 C가 얇은 추상화 층만으로 영광스러운 어셈블러 코드에 지나지 않는다는 것입니다. 그것은 다소 세련된 빈 슬레이트와 같으며 더 높은 수준의 추상화를 구축 할 수 있습니다. C ++는 그런 건물입니다. LUA는 다른 건물이며 C ++ 추상화를 사용해야한다면 기존 C ++ 구조를 중심으로 의도를 구부려 야합니다. 빈 슬레이트에서 시작하여 원하는대로 자유롭게 구축 할 수 있습니다.

대부분의 경우 C의 코드는 C ++보다 훨씬 빠를 수 있습니다. 예를 들어 stdio.c 라이브러리의 대부분의 기능은 iOStream보다 빠릅니다. Scanf는 CIN보다 빠르며 Printf는 Cout 등보다 빠릅니다.

VMS는 고성능을 요구하므로 C 코드는 완벽하게 의미가 있지만 프로그램은 아마도 개발하는 데 더 오래 걸릴 것입니다.

C ++는 C에서 구현됩니다. 모든 사람이 C ++ 접근 방식을 따르고 있다고 생각합니다.

최신 C ++ 컴파일러가 개별 단계로 명시 적 C ++에서 C 번역을 건너 뛰거나 은폐하더라도 C ++ 언어는 기본 C 구현에서 비롯된 특이성을 가지고 있습니다.

두 가지 예.

  • 참고 문헌 외에도 포인터는 전적으로 C 때문입니다. 참고 문헌은 충분하며, 이것이 Java, Python 및 Ruby가 모두 작동하는 방식입니다.

  • 클래스는 런타임에 존재하는 일류 객체가 아닙니다. 클래스는 기본 C 코드의 속성 및 메소드 함수를 정의하는 방법 일뿐입니다. 클래스 객체는 Java, Python 및 Ruby에서 런타임에 존재하며 조작 할 수 있습니다.

부수적으로, 당신은 CLR (로터-성신)과 Java 소스를 조사해야하며 현대적이거나 좋은 C ++보다는 훨씬 더 C ++-A-C임을 알 수 있습니다. 따라서 그것은 평행을 지니고 있으며 장난감에 대한 추상화의 부작용이며 관리되는 언어로 군중에게 평균 성능을 높이게합니다.

또한 순진한 C ++ 사용의 함정을 피하는 데 도움이됩니다. 예외와 다른 모든 종류의 것들 (Bits at Boost Consulting의 Bits David가 시작되었습니다.

Python 통합은 또 다른 문제이며 예를 들어 부스트와 같은 지저분한 기록이 있습니다. 그러나 기본 데이터 유형 및 인터페이스/인터 로프 및 기계 추상화의 경우 C. Compiler 문제도 없으며 여전히 많은 것들을 부트 스트랩합니다. 당신이 그와 같이 영향력있는 것을 얻기 전에.

Stepanov는 STL을 못 박았을 때이 업적을 인식했고 Bjarne은 템플릿으로 그것을 못 박았습니다. 그 표현과 힘이 아니라 인기있는 관리 언어로 그것들을 적당히 화신하지 않기 때문에 항상 생각할 가치가있는 세 가지입니다. 20 년이 지난 후에는 C/C ++를 통해 놀랍고 여전히 여전히 부트 스트랩입니다. 선의의 유산 (그러나 나는 'Dark Age'C 코드 C1982-2000을 방어하지 않습니다. ).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top