프로그램을 고쳤는데도 예전 프로그램이 실행됩니다. FILE_WHICH 활용.

요즘 IDL의 FILE_WHICH 함수를 사용하거나 추천할 일이 많았습니다. 다음과 같은 질문을 몇 번 받았기 때문입니다.

“프로시저(함수)를 수정해서 분명히 저장을 했습니다. 그런데 나중에 보면 예전 프로그램이 자꾸 실행되는데요…”

먼저 검토해 보아야 하는 것은 컴파일을 했는지 확인하는 것입니다. IDL의 프로시저나 함수의 호출 절차가 이렇습니다.

  1. 호출한 프로시저(함수)가 컴파일되어 메모리에 적재되어 있는지 검색. 그럴 경우 메모리에 적재된 프로그램을 실행.
  2. 메모리에 적재된 해당 프로시저(함수)가 없을 경우, IDL PATH에서 같은 이름의 .pro 확장자(또는 .sav 확장자)를 가진 IDL 프로그램이 있는지 확인
    (IDL PATH에 있는 모든 파일 목록은 이미 IDL을 시작할 때 메모리에 적재해 놓음.)
  3.  2 단계에서 찾은 파일을 컴파일 하여 메모리에 적재 후 실행.

만일 수정 이전의 프로그램이 메모리에 적재되어 있다면, 아무리 소스코드를 수정해도 1단계에서 과거에 메모리에 올려진 프로그램을 실행하게 됩니다. IDL을 나갔다가 다시 들어오든지, 리셋을 하든지 아니면, 수정한 프로그램을 명시적으로 컴파일 해야 합니다. 같은 이름의 프로그램이 새로 컴파일 되면, 이전에 메모리에 올려진 프로그램을 덮어쓰게 되므로, 새 프로그램이 작동하게 될 것입니다. 여기까지는 반드시 알고 있어야 하는 흐름입니다.

그런데, 이와 상관 없이 IDL을 다시 시작하게 되면 과거의 프로그램이 실행되는 경우가 있습니다. 같은 맥락의 예로 다음과 같은 경우도 문의를 받은 적이 있습니다.

IDL Astronomy 라이브러리 버전 업에 따라서 새로운 라이브러리를 설치하고, 과거 버전의 라이브러리는 지웠습니다. 그런데도, 예전 버전으로 실행이 됩니다. 새 라이브러리가 적용되지 않습니다.

이런 경우, IDL PATH를 탐색하는 순서를 한번 의심해 볼만 합니다. 같은 이름의 프로그램이 경로상에 두 군데 이상 있는 거죠. A 경로와 B 경로가 모두 IDL PATH로 잡혀 있는데, A경로에도 readcol.pro 가 있고, B 경로에도 readcol.pro 가 있는 경우입니다. 혼란을 피하기 위해 이런 설정은 원천적으로 안하는 것이 맞습니다만, 바쁘게 살다보면 그럴 때도 있겠죠. IDL PATH에서 A경로가 먼저 등장한다면, IDL에서 readcol을 실행할 때 A경로의 readcol이 실행됩니다. B 경로의 readcol은 일부러 파일을 찾아서 컴파일해서 메모리에 적재해 놓지 않는한 실행되지 않습니다. 그런데, A 경로에 readcol.pro 가 있다는 사실을 파악하지 못한 채, B 경로의 readcol.pro를 최신 버전으로 덮어 쓰고, ‘업그레이드 완료!’ 라고 생각한다면…, 안타깝게도 사용자의 기대와 달리 IDL은 여전히 A 경로에 있는 구 버전의 readcol을 실행하게 됩니다. 컬럼 변수를 더 많이 지정할 수 있게 되어서 새 버전의 readcol을 설치했는데, 여전히 컬럼 수가 너무 많다고 에러를 낸다면… 속 터지죠. (생각보다 흔히 있는 일입니다. IDL Astronomy 라이브러리를 한달에 한번씩 업그레이드 하는 것도 아니거든요. 내 IDL의 PATH 설정과 Add-on 들의 설치 현황은 사실 꼼꼼히 기억하고 지내기 어렵습니다).

말이 길었는데, 이 때 간편히 시도해 볼만한 함수가 File_WHICH 입니다. 프로시저 readcol을 호출하면 어떤 파일이 검색되어 실행되는 것인가? 다음과 같이 실행해 보면 됩니다.

이 때 보이는 저 경로의 저 파일이 프로그래머가 수정하고 있거나, 새 버전으로 업그레이드한 프로그램인지 확인해 보세요. 엉뚱하게 다른 경로의 프로그램을 수정하고 있을 가능성이 다분합니다. file_which는 꼭 .pro 파일만 검색하는 것이 아닙니다. 나의 IDL PATH 설정 안에, 어떤 파일이든 검색이 가능합니다. 다만, 같은 이름의 파일이 여러개 있다면, 제일 먼저 등장하는 경로에 담긴 파일을 찾아줄 것이고, 그런 이름의 파일이 없다면, Null 문자열을 리턴합니다.

file_which.pro 는 IDL로 만들어진 프로그램으로 소스코드가 공개되어 있습니다. 거룩한 일을 수행하라고 만든 프로그램이 아닌 것은 분명합니다만, 유용하게 쓰일 때가 있습니다.

요약

  • 프로그램을 고쳤으면 컴파일까지 해야 고친 내용이 확실히 반영됩니다.
  • 같은 이름의 프로그램이 경로상에 중복되어 존재하는 것은 피하는 것이 상책입니다.
  • 어떤 파일이 호출되는지 확인하고자 할 때, FILE_WHICH 함수가 유용합니다.

관련글