IDL을 사용하시는 유저들이라면 아마 IDL의 설치 디렉토리 내에 있는 lib 디렉토리의 존재를 많이들 아실 겁니다. 설치에 있어서 디폴트 설정을 따랐을 경우 윈도우즈 10용 및 Mac OS용 IDL 8.7을 기준으로 하면 이 디렉토리의 위치는 다음과 같습니다.
C:\Program Files\Harris\IDL87\lib (윈도우즈 10)
/Applications/harris/idl87/lib (Mac OS)
실제로 이 디렉토리의 내부를 보신 분들은 아시겠지만, 이 안에는 상당수의 .pro 파일들 및 하위 디렉토리들이 있습니다. 제가 사용하는 윈도우즈 10용 IDL 8.7의 lib 디렉토리를 일부만 들여다보면 대략 다음과 같습니다.
그런데 오늘 굳이 이 lib 디렉토리에 관한 얘기를 꺼내는 이유는, 제 개인적인 IDL 사용 경험에 비추어볼 때 lib 디렉토리와 관련하여 유저 여러분들께 강하게 권장하고 싶은 부분이 있어서입니다. 결론부터 간단히 정리한다면 다음과 같습니다.
IDL의 lib 디렉토리는 처음 IDL이 설치되었을 당시의 상태를 그대로 유지하는 것이 좋다! 즉 절대로 건드리지 않을 것을 강력하게 권장한다!
즉 IDL의 lib 디렉토리는 가급적이면 건드리지 않는 것이 좋다는 의미입니다. 더 구체적으로 얘기한다면, lib 디렉토리에 다른 외부 파일들을 카피한다든지 아니면 lib 디렉토리에 원래 있던 파일을 삭제하거나 다른 파일로 대체한다든지 하는 행위들을 가급적이면(제 심정으로는 절대로) 하지 않을 것을 권장한다는 의미입니다. 만약 lib 디렉토리의 내용을 훼손할(저는 이렇게 표현하고 싶습니다) 경우에는 굉장히 큰 혼란이 초래될 수 있고, 그로 인한 피해는 고스란히 유저 본인 또는 타 유저들에게까지 번질 가능성도 있습니다. 왜 그런가에 대하여 설명을 좀 드리고자 합니다.
제가 예전에 IDL의 명령들 중에는 IDL 내부에 심어져있는(embedded) 기능들도 있고 IDL 코드의 형태로 제공되는 기능들도 있다는 것을 관련 게시물을 통하여 소개한 바 있습니다. IDL 내부에 심어져있다는 것은 IDL의 제작사인 Harris의 개발자들이 C++ 소스의 형태로 IDL에 내장시킨 경우입니다. 이러한 코드들은 IDL의 제작자만 볼 수 있고 일반 유저들은 볼 방법이 없습니다. 그래서 IDL 워크벤치 상에서 전자에 해당되는(embedded) 명령들은 파란색으로 표시되고, 후자에 해당되는(IDL 코드 파일로 제공되는) 명령들은 초록색으로 표시된다는 것도 언급을 하였습니다. 특히 초록색으로 표시되는 기능들에 해당되는 IDL 코드들이 저장되어 있는 곳이 바로 lib 디렉토리라는 사실도 이 게시물에 함께 언급을 한 바 있습니다.
그래서 정리해 본다면, lib 디렉토리 및 그 하위 디렉토리 내에 존재하는 .pro 파일들은 모두 IDL이 기본적으로(디폴트로) 제공하는 기능들에 해당되는 IDL 코드 파일들입니다. 물론 IDL이 기본적으로 제공하는 모든 기능들이 이와 같이 .pro 파일의 형태로 제공되는 것은 아닙니다. 어떤 기능들은 IDL 자체에 심어져있는(embedded) 형태로 제공되기도 합니다. 하지만 적어도 IDL 코드의 형태로 제공되는 기본 기능들에 해당되는 .pro 파일들은 모두 lib 디렉토리 내에 저장되어 있습니다. 그리고 IDL이 실행되면 이 lib 디렉토리 내에 있는 .pro 파일들은 무조건 자동적으로 컴파일이 되어서 바로 사용 가능한 상태로 대기하게 됩니다. 예를 들면 제가 최근에 올렸던 게시물에서 소개했던 JULDAY 함수의 경우도 그 기능은 소스코드인 julday.pro의 형태로 제공되며 이 파일은 당연히 lib 디렉토리 내에 있습니다.
그런데 lib 디렉토리 내에 있는 .pro 파일들은 IDL이 시작되면 무조건 자동적으로 컴파일이 되고 언제든지 바로 사용 가능한 준비 상태가 된다는 장점 때문에, 이 lib 디렉토리에 외부 코드들을 카피해두고 사용하는 경우가 종종(제가 알기로는 꽤 많이) 있는 것으로 알고 있습니다. 예를 들어 제가 유저로서 my_calc.pro라는 프로그램을 만들어서 제 개인 디렉토리(C:\SWLee라고 합시다)에 넣어두었을 경우, 이 프로그램을 사용하려면 원래는 IDL에서 해당 디렉토리로 이동한 다음 코드 파일을 컴파일을 따로 하고 실행해야 합니다. 그런데 이 my_calc.pro 파일을 lib 디렉토리에 넣어둔다면, 매번 찾아가서 컴파일 및 실행을 할 필요가 없습니다. IDL이 실행되자마자 알아서 컴파일을 해주고 준비 상태로 해두기 때문에, 유저 입장에서는 IDL에서 언제든지 my_calc 명령을 바로 사용할 수 있게 됩니다.
이러한 '편의성' 때문에 다른 외부 프로그램 파일들을 lib 디렉토리에 이것저것 한꺼번에 넣어두고 사용하고 싶은 충동이 느껴지는 것은 충분히 이해가 가긴 합니다. 저도 예전에 초짜였던 시절에는 이렇게 했던 적도 있습니다. 그런데 지금 나름 경험이 쌓인 입장에서 감히 말씀드리자면, 여러분들은 제발 이렇게는 하지 않으셨으면 합니다. 이럴 경우에 닥치게 되는 큰 문제들이 꽤 있습니다. 먼저 IDL이 기본적으로 제공하는 코드 파일들과 사용자가 임의로 카피해넣은 코드 파일들의 구분이 매우 힘들어진다는 것입니다. 게다가 외부에서 가져온 코드 파일의 이름이 원래 lib 디렉토리 내에 있던 것과 중복되어서 혹시라도 그냥 덮어써버리는 경우에는 더 큰 문제가 됩니다. 이와 같은 혼란스러운 상황이 오게 된다면, IDL이 원래 제공하는 기능과 새로 카피해서 넣어둔 파일들의 기능이 서로 뒤섞이게 되고, 혹시라도 IDL을 사용하면서 문제가 발생했을 때 그 원인을 파악하는데 있어서 엄청난 난관에 봉착하게 될 수도 있습니다.
실제로 유저들 중에 이러한 상황에서 발생한 문제에 관하여 저에게 질문을 하셨는데, 알고보니 lib 디렉토리에 임의로 카피해넣은 외부 프로그램으로 인한 문제였던 경우도 있었습니다. 그런데 외부에서 가져온 코드 파일으로 인한 문제는 제 3자가 원인을 파악하고 해결해주기는 대단히 어렵습니다. 원칙적으로는 그 코드의 원저자가 나서줘야 문제점을 제대로 파악할 수 있을 것입니다. 또 다른 문제는 여러 유저들 사이의 협업이 필요한 경우입니다. 만약 A라는 유저는 lib 디렉토리에 외부 파일들을 많이 넣어둔 상태로 작업을 하는데, 유저 A가 만든 프로그램이 은연중에 lib 디렉토리에 있는 외부 프로그램들을 많이 이용하도록 설계되었을 경우, 이 프로그램을 다른 B라는 유저에게 준다면 유저 B는 그 프로그램을 제대로 사용하지 못할 가능성이 큽니다. 유저 B의 IDL의 lib 디렉토리는 유저 A와는 다를 가능성이 크기 때문입니다. 이러한 혼란을 깨닫고 유저 A가 필요한 서브 프로그램들을 lib 디렉토리에서 찾아서 함께 넘겨줄 수는 있겠지만, 그 내역을 파악하는데 있어서 불필요한 시간이 낭비될 수도 있고, 유저 B 입장에서는 자신의 lib 디렉토리 환경을 굳이 유저 A와 맞추고 싶지 않을 수도 있습니다.
이런 경우들 이외에도 여러가지 다양한 혼란 상황들이 발생할 수 있습니다. 따라서 IDL에서 바로바로 쓸 수 있다는 장점에 현혹되기 보다는, 그런 편의성의 이면에 숨겨진 잠재적 혼란의 가능성을 사전에 차단하는 것이 더 좋습니다. 만약에 외부에서 가져온 프로그램인데 IDL에서 바로바로 사용 가능하도록 하고 싶다면, 제가 역시 예전에 소개했던 관련 게시물의 내용을 참조하셔서 외부 라이브러리를 별도의 경로로 설정해두는 방식을 사용하면 됩니다. 이렇게 하면, 외부에서 가져온 프로그램들과 IDL이 기본적으로 제공하는 프로그램들을 모두 IDL에서 즉각적으로 사용할 수 있으면서도, 해당 코드 파일들을 물리적으로 서로 완벽하게 분리해두는 것이 가능합니다. 그러면 관리에 있어서도 훨씬 편하고 혹시나 문제점이 발생할 경우에도 원인을 파악하기가 더 수월해집니다.
사실 오늘 제가 하는 얘기와 비슷한 내용을 제가 약 1년반 전에 다른 게시물에서도 언급했던 바 있긴 합니다. 그럼에도 불구하고 굳이 이렇게 또 올리는 것은 IDL 유저 여러분께서 혹시나 겪게 될 수도 있는 혼란스러운 상황을 미리 차단할 수 있었으면 좋겠다는 제 바램으로 인한 것임을 이해해주셨으면 합니다. 실제로 이러한 문제로 인하여 불필요한 시간과 노력이 낭비되는 경우를 저도 가끔 봅니다. 굉장히 안타깝지만 막상 도와드리기도 상당히 난감한 경우이기도 합니다. 이러한 혼란을 해결하는데 소비되어야 하는 노력과 시간은 별로 보람되지도 않습니다. 그냥 악몽같은 시간 낭비로 기억될 뿐일 것입니다.
어쨌든 오늘 얘기는 이 정도로 마칩니다. 볼만한 그림도 없는 지루한 내용 봐주셔서 감사합니다.
'IDL > Miscellaneous' 카테고리의 다른 글
| IDL 이모저모 (2020. 06. 08) (0) | 2020.06.08 |
|---|---|
| IDL 이모저모 (2020. 04. 29) (0) | 2020.04.29 |
| IDL User Group의 Q&A 게시판의 이용에 관하여 (내용 업데이트) (0) | 2019.08.19 |
| !color 시스템 변수로부터 컬러값 정보의 추출 및 활용 (0) | 2019.01.23 |
| "IDL에는 pwd 명령이 없나요?" (0) | 2018.04.12 |