태그 보관물: compilation

compilation

초보 프로그래머는 컴파일러 오류 용어가 부족하여 좌절했습니다. 모든 용어를 이해하지

저의 가족 친구가 (C 언어로) 프로그램을 배우면서 약간의 도움을 요청했습니다. 우리가 이야기하는 동안, 그는 자신의 컴파일러 (GCC)가 오류를 만들 때 그에게주는 오류 메시지를 이해하는데 어려움을 겪는 것에 대해 좌절감을 표현했습니다. 그는 사용 된 모든 용어를 이해하지 못하며 때로는 자신의 이해를 초월하는 조합입니다. 그는 “컴파일러 문서에 오류 메시지에 대한 자세한 설명이 포함되어 있지 않은 이유는 무엇입니까?” -나는 그에게 좋은 대답이 없었습니다.

저 자신보다 숙련 된 프로그래머로서이 상황에서는 매우 드물지만 그러한 드물게 발생합니다. 이전에는 경험하지 못한 이국적인 오류 메시지입니다. 나는 검색 엔진에서 오류 메시지를 찾는 데 성공했지만 분명히 그에게 항상 효과가있는 것은 아닙니다. 특히 그가 발견 한 오류가 더 흔하고 여러 가지 다른 경우에 발생하기 때문에 특히 개인적인.

그렇다면 초보자 프로그래머는 어떻게 컴파일러 오류 메시지를 이해해야 하는가? 구체적으로 C와 GCC의 조합으로?



답변

몇 가지 유용한 기술 :

  • -Wall및을 켭니다 -Werror. 더 많은 오류 메시지를 작성하기 위해 오류 메시지를 해독하는 데 어려움을 겪는 경우 반 직관적 인 것처럼 보일 수 있지만 일반적으로 경고를 이해하고 문제의 실제 원인에 더 가깝게 경고를 이해하면 이해하기 어려운 오류가 발생할 수 있습니다. .
  • 목록에서 첫 번째 오류를 수정하십시오. 종종 오류가 서로 합성되어 나중에 오류 메시지가 실제로 실제 오류가 아닙니다. 하나를 수정하고 다시 컴파일하십시오. 경험이 많을수록 여러 개의 오류 메시지를 수정하는 데 도움이됩니다.
  • 최신 컴파일러 버전을 사용하십시오. C는 매우 안정적인 언어입니다. 따라서 최신 컴파일러에서 개선 된 부분은 언어 기능을 추가하는 것이 아니라 더 나은 오류 메시지를 포함하여 개발자 환경을 개선하는 것입니다. 대부분의 널리 사용되는 리눅스 배포판이 매우 기본적으로 GCC의 이전 버전을.
  • 점진적으로 프로그램하십시오. 컴파일하기 전에 많은 코드를 작성하려고 시도하지 마십시오. 여전히 컴파일 할 수있는 가장 짧은 양을 쓰십시오. 마지막으로 깔끔하게 컴파일 한 후 한 줄만 변경 한 경우 실제 문제가있는 줄을 알아내는 것이 훨씬 쉽습니다.
  • 단위 테스트를 작성하십시오. 컴파일 오류를 수정할 때 리팩토링 변경 사항을 명확히 할 수 있습니다.

답변

친구는 용어집이 필요하지 않습니다. 용어집은 그를 도울 수 없습니다. 그가 필요로하는 것은 컴파일러 오류가 발생할 때해야 할 일에 대한 더 나은 직관입니다.

C 컴파일러 오류는 C # 컴파일러 오류와 같이 직관적이지 않습니다. 많은 이유로 C의 “금속에 근접한”특성과 관련이 있습니다. C에서 컴파일러 오류를 해결하는 것은 패턴 일치 연습이 아닙니다. receive는 실제 문제와 아무 관련이 없습니다. 오류 메시지가 일반적으로 정확한 코드 위치 및 문제에 매핑되는 C # 또는 Java와 달리 C의 오류는 많고 멀리 있습니다.

이에 대한 예는 “세미콜론 예상”또는 파서가 무언가 (반드시 세미콜론 일 필요는 없음)에 걸린 것을 나타내는 많은 구문 오류입니다. 또는 “예기치 않은 사전 선언”과 같은 오류입니다. 오류는 .h 파일 중 하나에서 대문자를 잘못 사용했음을 의미하지만 .h 파일을 문제의 원인으로 가리키는 것은 아닙니다.

친구의 전략은 이것을 오류 및 솔루션 목록과 일치시키는 것이어서는 안됩니다. 실제 문제가 무엇인지 파악할 수있을 정도로 C 언어의 구문과 사양을 잘 이해해야합니다 .


답변

언급 할 가치가있는 관련 기술은 두 번째 컴파일러를 사용하는 것입니다. 예를 들어 Clang은 더 나은 오류 메시지에 투자했지만 오류를 표현하는 다른 방법은 깨달을 수 있습니다.

이것은 특히 가장 복잡한 유형의 오류에 해당됩니다. 예를 들어, 초보자에게 드문 일이 아닌 두 개의 유사한 구성을 혼합하면 컴파일러는 일반적으로 올바른 오류 메시지를 생성하는 데 문제가 있습니다. 컴파일러가 실제로 구문 B를 계획했을 때 구문 A의 잘못된 사용법에 대한 오류 메시지를 표시하면 혼동을 일으킬 수 있습니다. 두 번째 컴파일러는 의도 한 B를 유추 할 수 있습니다.


답변

누군가가 얼마 전에 Wikibooks에서 GCC 오류 용어를 시도 했지만 결코 이륙하지 않았고 업데이트되지 않은 것처럼 보입니다.

“오류”섹션은 “경고”섹션보다 훨씬 더 나옵니다. G ++을 목표로 한 것처럼 보이지만 여전히 친구에게 유용한 정보가있을 수 있습니다.


답변

위의 답변 외에도 대부분의 컴파일러 에는 포괄적 인 오류 용어 가 없습니다 . 메시지 자체가 자주 변경되므로 유지 관리해야 할 작업이 많으며 많은 것들이 있습니다.

용어집을 대체하는 가장 좋은 방법은 인터넷에 대한 액세스입니다. 컴파일러가 이해하지 못하는 오류를 생성 할 때마다 가장 먼저 오류가 발생하여 혼동 될 가능성이 거의 없습니다. 정확한 메시지에 대한 빠른 Google은 종종 읽기 쉬운 형식으로 많은 정보를 제공하기에 충분하며, 종종 자신과 매우 유사한 예제 코드가 있습니다.

그 외에도 언어와 컴파일러에 대한 시간과 친숙 함 만 있으면됩니다. 그, 그리고 칼 Bielefeldt에 의해 주어진 좋은 조언 .


답변

C 표준은 다른 프로그래밍 언어와 다른 방식으로 “lvalue”및 “object”와 같은 여러 용어를 사용하며 컴파일러 메시지는 종종 이러한 용어로 작성됩니다. 용어의 사용은 본 표준의 일부에서 일관성이 없지만, C를 배우고 자하는 사람은 C89, C99 및 / 또는 C11 표준의 초안과 이에 대한 근거 문서를 살펴 봐야합니다. “C99 초안”또는 “C89 이론적 근거”와 같은 검색은 꽤 잘 작동하지만 예상 한 문서를 확보해야 할 수도 있습니다. 대부분의 컴파일러는 C99 표준을 지원하지만 C89 표준과 어떻게 다른지 아는 것이 유용 할 수 있으며 C89 이론적 근거는 이후 버전에서는 그렇지 않은 역사적 배경을 제공 할 수 있습니다.


답변

아무도 명백한 대답을하지 않았으며 실제로 가장 자주 사용되는 것으로 의심됩니다. 오류 메시지를 읽지 마십시오.

대부분의 오류 메시지의 가치의 대부분은 단순히 그와 같은 줄에 문제가 있다는 것입니다. 대부분의 경우 줄 번호를보고 해당 줄로 이동합니다. 그 시점의 오류 메시지에 대한 나의 “읽기”는 일반적으로 탈지가 아니라 내 눈이 지나가는 것입니다. 회선에서 또는 근처에서 무엇이 잘못되었는지 즉시 명확하지 않으면 실제로 메시지를 읽습니다. 이 워크 플로우는 오류나 오류를 강조하는 IDE 또는 툴링을 사용하는 것이 훨씬 좋으며, 작은 변화 만 고려하는 Karl Bielefeldt의 제안을 자동으로 수행합니다.

물론 오류 메시지가 항상 적절한 줄을 가리키는 것은 아니지만 종종 적절한 근본 원인을 가리 키지 않기 때문에 오류 메시지를 완전히 이해하더라도 도움이되지 않습니다. 적절한 회선을 찾는 데있어 어떤 오류 메시지가 더 안정적인지에 대한 아이디어를 얻는 데 시간이 오래 걸리지 않습니다.

한편으로, 초보자가 만들 수있는 대부분의 오류 는 컴파일러의 도움 없이도 숙련 된 프로그래머에게 고통 스럽습니다 . 반면에, 그들은 초보자에게 너무 명확하지 않을 것입니다 (많은 사람들이 명백 할지라도 대부분의 실수는 바보 같은 실수입니다). 이 시점에서 나는 Robert Harvey에 전적으로 동의한다. 초보자는 단순히 언어에 더 익숙해 져야한다. 이것을 피할 수는 없습니다. 익숙하지 않은 개념을 참조하거나 놀라운 것처럼 보이는 컴파일러 오류는 언어에 대한 지식을 심화시키기위한 프롬프트로 보여야합니다. 컴파일러가 불평하지만 코드가 왜 틀린지 알 수없는 경우에도 마찬가지입니다.

다시 한 번 컴파일러 오류를 활용하기위한 더 나은 전략이 필요하다는 Robert Harvey에 동의합니다. 위의 몇 가지 측면을 설명했으며 Robert Harvey의 답변은 다른 측면을 제공합니다. 친구가 그러한 “용어집”으로 무엇을하기를 원하는지는 명확하지 않으며, 그러한 “용어집”이 실제로 친구에게 큰 도움이되지 않을 것입니다. 컴파일러 메시지는 확실히 언어 1 의 개념을 소개하는 장소 가 아니며 “용어집”은 그다지 나은 곳이 아닙니다. 오류 메시지의 의미를 명확하게 설명하더라도 문제 를 해결 하는 방법을 알려주지는 않습니다 .

1 Elm 및 Dhall (및 아마도 라켓)과 같은 몇 가지 언어와 “초보자 중심”언어 구현은이 작업을 시도합니다. 이러한 맥락에서, 다른 구현을 사용하려는 MSalters의 조언은 직접적인 관련이 있습니다. 나는 개인적으로 그런 것들을 타협하지 않으며 올바른 문제를 목표로하지 않습니다. 이것은 더 나은 오류 메시지를 만드는 방법이 없다는 것을 말하는 것이 아니라 나에게 컴파일러의 신념과 그 신념의 기초를 더 명확하게 만드는 데 중점을 둡니다.