Q 편집 기술자

Q 편집 기술자 (Q edit descriptor)

일부 구형 Fortran 컴파일러가 제공하던 Q 편집 기술자(edit descriptor)는 입력 레코드에 남은 문자 수를 정수 변수로 옮겨 주는 기능이었어요. gfortran에는 직접 대응하는 기술자가 없으니, 표준을 지키는 코드로 같은 동작을 흉내 내는 방법을 살펴봐요.

출처: Q edit descriptor (The GNU Fortran Compiler)

본문

일부 Fortran 컴파일러는 Q 편집 기술자를 제공하는데, 이 기술자는 입력 레코드 안에 남아 있는 문자 개수를 정수 변수로 옮겨 줘요.

Q 편집 기술자의 직접적인 대체 기술자는 gfortran에 없어요. 이 기능을 표준을 준수하는 코드로 어떻게 재현할지는 원래 코드의 의도가 무엇이냐에 따라 달라져요.

Q를 대체하는 방법으로는, 줄 전체를 문자 변수로 읽고 나서 LEN_TRIM으로 남은 비공백 문자 수를 세는 방법이 있어요. 또 다른 방법으로는 형식화된 스트림(formatted stream)을 이용해서, Q 기술자가 나타난 위치까지 데이터를 읽고, INQUIRE로 파일 위치를 얻은 다음, 다음 NEW_LINE까지의 문자 수를 세고, 앞서 표시해 둔 위치부터 다시 읽기 시작하는 방법이 있어요.

Q 기술자가 왜 존재했는지 배경을 보면 이해가 쉬워요. 형식화 입력(formatted input)을 다룰 때 "이 입력 줄에 아직 얼마나 많은 문자가 남아 있는지"를 알아야 하는 상황이 있는데, 예전 컴파일러들은 Q 기술자로 그 값을 정수 변수에 넘겨 주는 방식을 택했어요. 문제는 이 기술자가 표준에 없는 확장이라 gfortran을 포함해 모든 컴파일러가 지원하지 않는다는 점이에요.

그래서 gfortran을 쓰면 Q 기술자를 직접 못 쓰니, 표준 함수만으로 같은 목적을 달성해야 해요. 위에서 든 두 방법이 대표적인데, 어느 쪽을 고를지는 원래 코드가 Q의 값을 어떻게 활용하느냐에 따라 갈려요. 만들어 둔 코드가 "남은 데이터를 얼마나 더 읽을지"를 결정하는 데 쓴다면 첫 번째 방법(전체 줄을 읽고 LEN_TRIM으로 남은 비공백 수 세기)이 단순하고, "정확히 어느 지점에서부터 다시 읽을지"가 중요하다면 두 번째 방법(스트림 + INQUIRE로 위치 추적)이 더 정확해요.

다만 두 방법 모두 코드를 더 복잡하게 만들고, 특히 바이너리나 레코드 구조가 다양한 입력에서는 미묘한 차이가 생길 수 있어요. 원래 코드가 의존하던 정확한 의미를 파악한 뒤, 그 의미를 그대로 재현할 수 있는 방법을 고르는 게 중요해요.

더 알아보기