en en ko ko ko ja en en zh en pt ko en ko ko nl ko nl ko ko ko ko ko ko ko nl ko ko ko ko ko ko ko nl ko ko ko nl ko ko nl ko ko nl ko ko ko ko ko ko ko ko zh en en en en pt fr en en kn en sv fr en en en en en es fr en en en fr ja en en en en en en en en en fi en hu pt hbs_lat ru en en en en pl ko ko ko ko ko ko ko zh en en pt en en en uz en en fr eo sv en en en es en en en en en en ja en it hu ja eo en de en ko ko en en
compiler Archives - How IT
왜 C ++가 컴파일러를 작성해야합니까? ++이 컴파일러를 작성하기에
왜 C ++이 컴파일러를 작성하기에 좋은 선택인지 궁금했습니다. 물론 많은 컴파일러가 C 또는 C ++로 작성되었지만 이번에는 C ++에 더 관심이 있기 때문에 C도이 목적에 적합합니다. 좋은 이유가 있습니까? 나는 인터넷에서 그것을 찾고 있었지만 좋은 이유를 찾을 수 없습니다.
C ++에는 두 가지 측면이 있습니다. 저수준 개발 측면을 가지고있어 코드 생성과 같은 저수준 일을하는 데 자연스러운 언어처럼 보입니다. 또한 높은 수준의 측면 (C는 그렇지 않음)을 사용하여 복잡한 응용 프로그램 (컴파일러와 같은)을 논리적 객체 지향 방식으로 구성하면서 성능을 계속 유지할 수 있습니다. 낮은 수준과 높은 수준의 측면을 모두 가지고 있기 때문에 낮은 수준의 기능이나 성능이 필요한 대규모 응용 프로그램에 적합합니다.
내 경험이 여기에 당신의 전제에 동의하지 않습니다. 사실, 고급 범용 언어의 경우 소스 언어 (컴파일되는 언어)와 동일한 언어로 컴파일러를 작성하는 것이 일반적 입니다. 예를 들면 다음과 같습니다.
Sun의 Java 컴파일러는 Java로 작성되었습니다
Mono의 C # 컴파일러는 C #으로 작성되었습니다.
스퀵의 스몰 토크 컴파일러는 스몰 토크로 작성되었습니다
… 그리고 더 많은
예외는 GCC, LLVM 또는 Polyglot과 같은 기존 컴파일러 프레임 워크 용으로 작성된 컴파일러 프론트 엔드이며 프레임 워크 언어로 작성된 컴파일러 또는 Yacc와 같은 기존 파서 생성기를 사용하는 컴파일러입니다. GCC, LLVM 및 Yacc는 C 및 C ++로 작성된 일반적이고 확립 된 도구이므로 컴파일러 작성자가이를 사용하도록 인센티브를 제공하므로 C 및 C ++가 컴파일러 구현 언어 배포에서 큰 비중을 차지하게됩니다.
무엇을 무엇으로 컴파일하려면? 컴파일러는 소스 코드를 한 언어 (원본 언어) 에서 다른 언어 (대상 언어)로 변환하는데, 이는 대상 언어의 저수준에 대해서는 아무 것도 나타내지 않습니다.
CoffeeScript 는 JavaScript로 컴파일되며, 컴파일러는 CoffeeScript로 작성됩니다.
Script #은 C #을 JavaScript로 컴파일합니다. 컴파일러는 C #을 잘 기억하고 있습니다.
컴파일러를 작성하기 위해 선택한 언어는 상황에 따라 다릅니다. 예를 들어, PHP에서 파생 된 언어를 기본 PHP 코드로 컴파일하는 프로젝트를 작업하면서 PHP와 C #을 혼합하여 컴파일러를 작성했습니다. 다른 사람은 Python, Java 및 PHP 또는 C ++을 약간의 JavaScript 또는 기타로 선택합니다.
C 또는 C ++는 컴파일러 관련 도구 (Telastyn의 답변 참조)를 지원하고이 두 언어를 사용하면 실제로 네이티브로 이동할 수 있기 때문에 널리 사용됩니다. 그러나 다른 언어를 선택하는 데 아무런 문제가 없습니다.
좀 더 괴상 하기 위해 컴파일러 자체를 작성하기 위해 소스 언어를 선택할 수 있습니다. CoffeeScript 컴파일러와 다른 많은 컴파일러에서 일어난 일입니다. IDE에도 인기가 있습니다. 첫 번째 Visual Studio 중 하나는 동일한 Visual Studio를 사용하여 빌드되었습니다.
나는 여기서 기본적인 전제에 의문을 갖는 경향이있다. C와 C ++는 컴파일러 작성에 완벽하게 작동하지만 다른 언어들도이 작업에 완벽하게 작동하는 것 같습니다.
약간은 컴파일하는 언어에 따라 다릅니다. 작고 간단한 언어의 경우 C와 Pascal이 잘 작동합니다. 크고 복잡한 것을 컴파일하려는 경우 컴파일러도 크고 복잡해집니다.이 경우 더 큰 프로그램을 구성하고 작업하기위한 C ++의 추가 기능은 분명히 유용합니다. 컴파일에는 그다지 구체적이지 않고 일반적으로 더 큰 프로그램에 유용한 기능입니다.
다른 요점도 언급 할 가치가 있다고 생각합니다. 초보자는 컴파일러가 주로 텍스트 조작을하는 것으로 생각하므로 Perl과 같은 것이 컴파일러 작성에 큰 도움이 될 것이라고 생각합니다. 실제로 컴파일의 흥미로운 부분은 대부분 AST를 빌드 한 후에 시작되지 않습니다. Perl이 완벽하게 잘 할 수 있다고 확신하지만 텍스트 조작 기능은 실제로 큰 이점을 제공하지는 않습니다 (텍스트 조작은 대부분 어휘 분석기에 있으며 C와 같은 것들에 대한 어휘 생성기는 RE를 지원합니다).
컴파일러는 모든 현대 언어로 구현 될 수 있습니다. 그러나 컴파일러의 가장 중요한 요구 사항 중 하나는 빠릅니다.
C ++은 여기에 분명한 장점이 있습니다. C ++의 최적화는 저렴하지 않습니다. 그러나이 언어의 낮은 수준의 특성으로 인해 다른 언어 (휴대용이 아닌 어셈블리 제외)보다 C ++ 코드를 수동으로 최적화 할 수 있습니다.
나는 그들의 사용에 대한 주요 동기가 C에서 Lex / Yacc / Bison 출력이 (주로) 있다고 생각합니다. 그것이 오랫동안 표준 이었으므로 추진력이 있습니다.
그것들이 특히 좋은 이유는 아닙니다 …
이 문제에 대한 경험이 있습니다. C 및 C ++로 컴파일러를 작성했습니다. C와 C ++의 주요 차이점은 C에 자동 방식으로 동적 메모리 관리 기능이 없다는 것입니다. C의 모든 메모리 관리는 명시 적으로 수행해야합니다. 컴파일러를 작성하면 문자열 처리 및 배열 관리가 많이 처리됩니다. C에서는 모든 문자열과 선언하는 모든 배열의 크기를 생각하고 해당 객체에 액세스 할 때 인덱스를 확인해야합니다 (코드를 안전하고 안정적으로 유지하려는 경우). C에서는 물론 동적 메모리 관리가 가능하지만 자동적 인 것은 없습니다. malloc () 및 free ()를 사용하여 명시 적으로 메모리를 할당하고 사용 가능하게하고 동적 오브젝트의 크기를 분리 된 변수로 유지하여 경계 외부로 액세스하지 않도록해야합니다.
C ++에서는 동일한 메커니즘을 사용할 수 있지만 명시 적으로 호출 할 필요가없는 생성자와 소멸자 내에 모든 메모리 관리를 캡슐화 할 수 있기 때문에 실제로 개발 시간이 효율적입니다. 따라서 컴파일러는 리소스를 할당하고 해제합니다. 클래스를 직접 만들면 동적 객체의 크기를 캡슐화 할 수 있으며 오버로드 연산자 []를 사용하여 경계 액세스를 위해 인덱스를 확인할 수 있습니다. 이러한 추상화는 코드를 더 깨끗하고 이해하기 쉽고 디버깅하며 개발 속도를 높여줍니다.
C로 컴파일러를 만들면 더 많은 시간이 걸립니다. C ++을 사용하면 짧은 시간 안에 프로젝트를 완료 할 수 있습니다. C와 C ++의 성능은 동일하지만 C ++에는 C와는 다른 많은 장점이 있습니다.
이 글은 Software 카테고리에 분류되었고 c++, compiler 태그가 있으며 소장 마님에 의해 2022-07-07에 작성되었습니다.
데스크탑 또는 폴더에서 파일에 대한 링크 만들기 탐색기)가 열려
CLI를 통해 WPA2- 엔터프라이즈 연결에 연결 (데스크탑 없음) 연결에 연결하는 데 필요한 설명을
dnsmasq 순환 루프 오류 어딘가에 구성이없는 것을
“연결 프로그램”목록을 제거 / 변경하려면 어떻게합니까? 하나를 제거하고
저는 관리자입니다. 업무 관계 및 프로그래머와의 의사 소통을 어떻게 개선 할 수 있습니까? [닫은] 5 년 동안 여러
Proudly powered by WordPress