"네임 스페이스"와 "모듈"의 용어를 오버로드하기로 선택한 것 같습니다. 그들이 당신의 정의에 맞지 않을 때 "간접적 인"것으로 보는 것은 놀라운 일이 아닙니다.
C #을 포함하여 네임 스페이스를 지원하는 대부분의 언어에서 네임 스페이스는 모듈이 아닙니다. 네임 스페이스는 이름을 지정하는 방법입니다. 모듈은 동작 범위를 지정하는 방법입니다.
일반적으로 .Net 런타임은 모듈에 대한 개념을 지원하지만 (암시 적으로 사용하는 것과 약간 다른 정의를 가짐) 거의 사용되지 않습니다. 나는 다른 언어로 작성된 모듈에서 단일 DLL을 작성할 수 있도록 SharpDevelop로 빌드 된 프로젝트에서만 사용되는 것을 보았습니다. 대신 동적으로 연결된 라이브러리를 사용하여 라이브러리를 빌드합니다.
C #에서 네임 스페이스는 모두 같은 바이너리에있는 한 "간접 레이어"없이 확인됩니다. 필요한 간접 지시는 많은 생각을 할 필요가없는 컴파일러와 링커의 책임입니다. 여러 종속성이있는 프로젝트 빌드를 시작하면 외부 라이브러리를 참조하십시오. 프로젝트가 외부 라이브러리 (DLL)를 참조하면 컴파일러가이를 찾습니다.
Scheme에서 외부 라이브러리를로드 해야하는 경우 (#%require (lib "mylib.ss"))
먼저 외우는 것처럼 먼저 외부 기능 인터페이스를 사용하거나 외부 함수 인터페이스를 사용해야합니다. 외부 바이너리를 사용하는 경우 외부 바이너리를 해결하는 작업량이 동일합니다. 대부분 라이브러리를 많이 사용했을 가능성이 높습니다.이를 기반으로하는 스키마 기반 심이 있지만 타사 라이브러리와 자체 통합을 작성해야하는 경우에는 "로드하기 위해 몇 가지 작업을 수행해야합니다" " 도서관.
Ruby에서 모듈, 네임 스페이스 및 파일 이름은 실제로 생각보다 훨씬 덜 연결되어 있습니다. LOAD_PATH는 일을 조금 복잡하게 만들고 모듈 선언은 어디에서나 가능합니다. C의 써드 파티 라이브러리는 여전히 (작은) 주름을 추가한다는 점을 제외하고는 아마도 Scheme에서 생각하는 방식으로 파이썬이 더 가까이 다가 가고 있습니다.
또한 Ruby, Python 및 Lisp와 같은 동적 유형 언어에는 일반적으로 정적 유형 언어와 "계약"에 대한 접근 방식이 없습니다. 동적으로 유형이 지정된 언어에서는 일반적으로 코드가 특정 메소드에 응답하는 일종의 "신사 동의"만 설정하고 클래스가 동일한 언어를 사용하는 것으로 보이는 경우 모두 좋습니다. 정적 형식 언어에는 컴파일 타임에 이러한 규칙을 적용하기위한 추가 메커니즘이 있습니다. C #에서 이러한 계약을 사용하면 이러한 인터페이스에 대한 최소한의 유용한 준수 보장을 제공 할 수 있습니다. 따라서 동일한 계약에 대해 컴파일하기 때문에 플러그인과 대체를 어느 정도의 공통성을 보장 할 수 있습니다. Ruby 또는 Scheme에서는 런타임시 작동하는 테스트를 작성하여 이러한 계약을 확인합니다.
메소드 호출에는 이중 디스패치가 필요하지 않으므로 이러한 컴파일 시간 보장으로 측정 가능한 성능 이점이 있습니다. Lisp, Ruby, JavaScript 또는 다른 곳에서 이러한 이점을 얻으려면 이제 특수 VM에서 적시에 정적으로 정적 컴파일 클래스를 작성하는 약간의 이국적인 메커니즘이 필요합니다.
C # 생태계가 여전히 상대적으로 미성숙 한 지원을하는 것 중 하나는 이진 종속성 관리입니다. Java는 몇 년 동안 Maven을 사용하여 모든 필수 종속성을 확인하는 반면 C #에는 여전히 전략적으로 파일을 적절한 장소에 미리 배치하는 상당히 원시적 인 MAKE와 유사한 접근 방식이 있습니다.