Found an issue with the book? Report it on Github.

패키지 정의(Package Definitions)

패키지 정의(Package Definitions)

기본 문법(Basic Syntax)

이 장에서 배운 것처럼 package 는 정의(다른 패키지의 정의 포함)를 구성할 수 있게 해주는 모델리카 엔터티입니다. package 의 구문 정의는 다음과 같으며, 다른 모델리카 정의와 공통점이 많습니다.

package PackageName "Description of package"
  // A package can contain other definitions or variables with the
  // constant qualifier.
end PackageName;

패키지 정의에는 encapsulated 한정자가 붙을 수 있습니다. (이부분은 모델리카의 룩업 규칙(Lookup Rules) 를 검토할 때 더 자세히 논의할 것입니다.)

그리고, 패키지는 중첩될 수도 있는데, 를 들면 아래와 같습니다.

package OuterPackage "A package that wraps a nested package"
  // Anything contained in OuterPackage
  package NestedPackage "A nested package"
    // Things defined inside NestedPackage
  end NestedPackage;
end OuterPackage;

사실 패키지 중첩은 매우 일반적이며 복잡한 분류법을 나타낼 수 있게 하는 방법입니다.

디렉토리 저장소(Directory Storage)

모델리카 정의의 전체 라이브러리를 일련의 중첩된 패키지로 단일 파일에 빌드할 수 있지만 이는 적어도 두 가지 이유로 바람직하지 않습니다.첫 번째는 필요한 들여쓰기의 길이가 길어지기 때문에, 결과 파일을 읽기가 매우 어렵다는 것입니다.두 번째는 버전을 관리하는 관점에서 병합시의 충돌을 피하는 데 도움이 되도록 작은 파일로 나누는 것이 훨씬 더 낫다는 것입니다.

하나의 파일에 저장하기(Stored in a Single File)

모델리카 소스 코드를 파일 시스템에 매핑할 수 있는 여러 가지 방법이 있습니다.가장 간단한 방법은 모든 것을 파일에 저장하는 것이며, 이 파일의 접미사는 .mo 입니다.단일 모델 정의, 깊이가 있는 중첩된 패키지 계층 또는 그 사이의 항목을 이 파일에 포함할 수 있습니다.

디렉토리로 저장하기(Stored as a Directory)

이미 논의한 것처럼 모든 것을 하나의 파일에 저장하는 것은 일반적으로 좋은 생각이 아닙니다. 이에 대한 대안은 모델리카 정의를 디렉터리 구조에 매핑하는 것입니다. 패키지와 동일한 이름 으로 디렉터리를 생성하여 패키지를 디렉터리 구조로 저장할 수 있습니다. 그런 다음 해당 디렉토리 안에 패키지 정의를 저장하는 package.mo 라는 파일을 생성해야 합니다. 하지만 중첩된 정의는 여기에 저장하지 않습니다. 중첩된 정의는 단일 파일(위에서 설명한 대로) 또는 패키지를 나타내는 디렉토리 (이 단락에서 설명한 대로)로 저장할 수 있습니다. 다음 다이어그램을 통해 샘플 디렉토리 레이아웃을 시각화 해보겠습니다.:

/RootPackage               # Top-level package stored as a directory
  package.mo               # Indicates this directory is a package
  NestedPackageAsFile.mo   # Definitions stored in one file
  /NestedPackageAsDir      # Nested package stored as a directory
    package.mo             # Indicates this directory is a package

RootPackage 라는 패키지와 관련된 package.mo 파일은 다음과 같습니다.

within;
package RootPackage
  // only annotations can be stored in a package.mo
end RootPackage;

여기에서 주목해야 할 두 가지 중요한 사항이 있습니다. 첫째, within 절이 있어야 하지만 비어 있어야 합니다. 이를 통해서 이 패키지가 다른 패키지에 포함되어 있지 않음을 나타냅니다.또한 NestedPackageAsFileNestedPackageAsDir 정의가 존재하지 않습니다(존재할 수도 없습니다).이들은 package.mo 파일 외부에 저장되어야 합니다.

유사하게, NestedPackageAsDir 패키지와 관련된 package.mo 파일은 다음과 같습니다:

within RootPackage;
package NestedPackageAsDir
  // only annotations can be stored in a package.mo
end NestedPackageAsDir;

다시 말하지만, 이 패키지에는 정의가 포함되지 않고 주석만 포함되어야 합니다. within 절은 NestedPackageAsDirRootPackage 패키지에 속한다는 사실을 반영하게 되는데, 그래서 이전의 파일과 약간 다릅니다.

마지막으로 NestedPackageAsFile.mo 파일은 다음과 같습니다.

within RootPackage;
package NestedPackageAsFile
  // The following can be stored here including:
  //  * constants
  //  * nested definitions
  //  * annotations
end NestedPackageAsFile;

within 절은 NestedPackageAsDir 패키지 정의와 동일하지만 이 패키지를 단일 파일로 저장하므로 상수, 모델, 패키지, 함수, 도 여기에서 허용됩니다.

디렉토러 정렬(Ordering for Directories)

모든 정의가 단일 파일 내에 저장될 때 파일에 나타나는 순서는 (예: 패키지 브라우저에서)시각화될 때 나타나야 하는 순서를 나타냅니다. 그러나 파일 시스템에 저장될 때 묵시적인 순서는 없습니다.이러한 이유로 package.mo 파일과 함께 선택적으로 package.order 파일을 포함하여 순서를 지정할 수 있습니다.이 파일은 단순히 한 줄에 하나씩 작성된 엔터티의 이름 목록입니다.예를 들어, 이 샘플 패키지 구조에 순서를 지정하려는 경우 파일 시스템은 다음과 같이 채워집니다.:

/RootPackage               # Top-level package stored as a directory
  package.mo               # Indicates this directory is a package
  package.order            # Specifies an ordering for this package
  NestedPackageAsFile.mo   # Definitions stored in one file
  /NestedPackageAsDir      # Nested package stored as a directory
    package.mo             # Indicates this directory is a package
    package.order          # Specifies an ordering for this package

package.order 파일이 없는 경우 모델리카 시뮬레이션 소프트웨어는 단순히 패키지를 알파벳순으로 정렬할 것입니다. 그러나 RootPackage 내용을 알파벳 역순으로 정렬하려면 RootPackage 디렉토리의 package.order 파일은 다음과 같이 설정해야합니다.:

NestedPackageAsFile
NestedPackageAsDir

이것은 NestedPackageAsFileNestedPackageAsDir 앞에 와야 한다고 모델리카 시뮬레이션 소프트웨어에 지정하는 것입니다.

버전 명명(Versioning)

MODELICAPATH

대부분의 모델리카 시뮬레이션 소프트웨어를 사용하면 파일의 전체 경로 이름을 지정하거나 파일 선택 대화 상자를 사용하여 파일을 열 수 있습니다. 그러나 시뮬레이션 소프트웨어를 사용할 때마다 서로 다른 많은 파일을 찾아 로드하는 것은 지루한 작업입니다. 이러한 이유로 모델리카 사양(spec)에서는 시뮬레이션 소프트웨어가 자동으로 찾을 수 있는 소스 코드의 위치를 사용자가 원하는 것으로 지정하는 MODELICAPATH 라는 특수 환경 변수를 정의합니다.

MODELICAPATH 환경 변수는 검색할 디렉토리 목록을 포함해야 하는데, Windows에서 해당 목록은 ; 로 구분되어야 하며 Unix에서는 : 로 구분 합니다. 모델리카 컴파일러가 아직 로드되지 않은 패키지를 발견하면 MODELICAPATH 환경 변수에 나열된 디렉토리를 검색하여 일치하는 파일 또는 디렉토리를 찾습니다. 예를 들어, MODELICAPATH 가 다음과 같이 정의된 경우(Unix 규칙을 가정):

/home/mtiller/Dir1:/home/mtiller/Dir2

컴파일러가 MyLib 라는 패키지를 찾고 있었다고 하면, 먼저 /home/mtiller/Dir1 에서 MyLib.mo (단일 파일로 저장됨)라는 패키지를 찾거나 MyLib 이라는 패키지를 정의한 package.mo 파일을 포함하는 MyLib 이라는 이름의 디렉토리를 찾습니다. 그리고, 둘 다 찾을 수 없으면 /home/mtiller/Dir2 디렉토리를 (동일한 방법으로) 검색합니다.

modelica:// URLs

모델리카 패키지와 함께 비 모델리카 파일을 포함하는 것이 유용한 많은 경우가 있습니다. 이러한 비 모델리카 파일을 "리소스"라고 하며 데이터, 스크립트, 이미지 등이 포함됩니다.앞서서 모델리카 정의가 파일 시스템에 매핑되는 방법을 살펴보았으므로 리소스의 위치를 참조하기 위해 URL을 사용하는 매우 유용한 모델리카에 기능을 이제 소개하겠습니다.

예를 들어 외부 함수(External Functions) 에 대해 논의할 때 리소스의 위치를 지정하는 몇 가지 주석을 살펴 보았습니다.특히 IncludeDirectoryLibraryDirectory 주석은 모델리카 컴파일러가 각각 파일을 포함 하거나 라이브러리 파일을 찾아야 하는 위치를 지정했습니다. 그때 간단히 언급했듯이 이러한 주석의 기본값은 modelica://LibraryName/Resources 로 시작했습니다. 이러한 URL을 사용하면 파일 시스템에서 주어진 모델리카 정의와 관련된 리소스 위치를 지정할 수 있습니다. 앞에서 논의한 디렉토리에 일부 리소스 파일이 추가된 아래 구조를 보겠습니다.:

/RootPackage               # Top-level package stored as a directory
  package.mo               # Indicates this directory is a package
  package.order            # Specifies an ordering for this package
  NestedPackageAsFile.mo   # Definitions stored in one file
  /NestedPackageAsDir      # Nested package stored as a directory
    package.mo             # Indicates this directory is a package
    package.order          # Specifies an ordering for this package
    datafile.mat           # Data specific to this package
  /Resources               # Resources are stored here by convention
    logo.jpg               # An image file

NestedPackageAsDir 에 포함된 데이터가 필요한 모델이 있는 경우 다음 URL을 사용하여 참조할 수 있습니다:

modelica://RootPackage/NestedPackageAsDir/datafile.mat

이러한 URL은 modelica:// 로 시작합니다. 이는 참조되는 리소스가 다른 항목(예를 들어 네트워크를 통해 가져올 항목)이 아니고 모델리카 모델과 관련된 것 임을 나타내는 방법입니다. // 다음에는 모델리카 정의의 정규화된 이름(. 대신 / 로 구분)이 오는데, 모델리카 컴파일러는 이것을 해당 정의가 포함된 디렉토리의 이름으로 해석합니다. URL의 마지막 요소는 사용할 파일의 이름을 지정합니다.

다른 예로, Resources 패키지의 logo.jpg 파일을 참조하려면 다음 URL을 사용합니다:

modelica://RootPackage/Resources/logo.jpg

위의 예시와 같이 Resources 라는 중첩된 패키지에 라이브러리와 관련된 리소스를 저장하는 것이 일반인 사용법 입니다(따라서 IncludeDirectoryLibraryDirectory 의 기본값).