2017-04-09 2 views
1

두 언어 모두 단일 프로그램/라이브러리가 여러 파일로 확장 될 수있는 방법이 있습니다. C 언어는 명시 적으로 작성된 헤더 파일을 사용하여 include 문을 사용하지만 Fortran에서는 컴파일러가 단일 모듈에서 인터페이스를 생성합니다. 어느 언어가 어떻게 소스 코드를 컴파일하는지 오해한다면 미리 용서 해주십시오.소스가 어떻게 서로 연결되고 함께 컴파일되는 지에 대한 Fortran과 c의 미묘한 차이점

c/C++ 프로그램에서 일반적으로 소스 코드를 포함하고있는 .c 파일과 코드에 대한 인터페이스가 들어있는 .h 파일을 만들어 다른 소스 파일이 소스에있는 파일을 예상 할 수있게 한 다음 라이브러리로 모두 함께 컴파일합니다 , 객체 파일 등을 포함 할 수 있습니다.

Fortran 프로그램 (90+)에서는 별도의 모듈에 코드를 넣을 수 있으며 각 모듈에 대한 헤더/인터페이스 파일을 명시 적으로 작성하는 대신 컴파일러에서 인터페이스를 생성하고 배치합니다 컴파일 된 오브젝트 파일 외에도 별도의 2 진 파일 (.mod 파일)로 변환 할 수 있습니다. 라이브러리, 오브젝트 파일 등을 만들려면 함께 컴파일/링크해야합니다.

왜 이러한 언어가 인터페이스를 컴파일하는 방식에는 미묘한 차이가 있습니까? 어느 언어의 오랜 역사에서 기인 한 단점입니까?

+0

포트란 표준은'.mod' 파일에 대해 아무 말도하지 않습니다. – francescalus

+2

다른 언어가 동일한 방법을 수행하기 위해 다른 접근 방식을 사용할 수 없다면 얼마나 많은 언어를 사용할 수 있습니까? – Dmitri

+2

네, 대부분 각 언어의 개발 기록의 유물입니다. 그리고 다른 언어 (예 : 자바)는 자신의 일을합니다. 두 개의 다른 언어가 여러 소스 파일에서 코드를 컴파일하고 연결하는 데 동일한 규칙을 사용한다고 기대할 이유가 없습니다. –

답변

4

C는 소리보다 훨씬 조직적입니다. "헤더"파일의 사용은 순전히 규약입니다. 전처리 기는 임의의 텍스트 포함을 허용하며 언어에 기본 제공되는 "인터페이스"및 "구현"의 원칙적인 구분이 없습니다.

사실 단순한 사실은 C 프로그램의 별도 번역 단위 연결을 확인하거나 "안전하지 않다"는 것입니다. 귀하의은 귀하가 실제로 연결하는 조각들이 서로 잘 어울리는 것을 책임집니다.

초기 C에서는 함수 선언이 암시 될 수 있었고 함수 인수는 전혀 검사되지 않았습니다. 따라서 코드에 foo(1, 2, 3) 콜을 붙이면 함수의 선언을 암시합니다 (int foo()). 인수는 최종 함수 정의에서 사용할 매개 변수와 일치해야합니다. 헤더는 유용한 파일을 만드는 C에서

두 가지 주요 특징은 선언함수 프로토 타입 있습니다. 사용하기 전에 함수의 명시 적 선언 (컴파일러가 경고 할 수있는 것)을 항상 요구하면, "헤더 파일"에 그 ​​선언을 제공 할 수 있으며, 링크가 더 적합 할 가능성이 더 큽니다. 함수 프로토 타입은 호출 사이트의 인수를 함수 정의의 매개 변수로 자동 수정하는 선언 개념의 확장입니다. 따라서 이러한 모든 기능을 사용하도록 선택한 경우에는 헤더 파일을 통해 함수 호출 인터페이스를 문서화 할 수 있습니다 . 그러나 모든 것이 순전히 대회입니다!

+0

실제로 C (C99 이후)는 사용하기 전에 함수 선언이 필요합니다. – Olaf

+0

@Olaf : 예, 그렇지만 여전히 'extern f();'처럼 로컬에서 선언을 수행 할 수 있습니다. [데모] (https : // wandbox.org/permlink/nZyH1HxbFhECggel) –

+0

'extern' 선언은 실제로 로컬이 아닙니다. 어쨌든, 프로토 타입이 아닌 선언자가 여전히 허용되는 것은 맞습니다. 그것은 C11에서 노후화 기능으로 만들어졌습니다 (C99에 이미 있는지는 확실하지 않습니다). IMO 또 다른 요지는,위원회를 너무 열성적으로 만들어서 언어를 더 안전하게 만드는 것입니다. 나는 그들이 C2x 에서조차 유산의 유산을 제거하지 않을 것이라고 확신한다. – Olaf

관련 문제