[FORTRAN] 왜 행의 첫 문자는 공백으로 시작하는가?

문연수·2023년 2월 24일
0

FORTRAN

목록 보기
1/1
post-thumbnail
      program hello_world
        write (*, *) "hello, world!"
      end

 위 코드는 hello, world! 라는 짧은 문자열을 출력하는 아주 간단한 포트란 코드이다. 그런데 이 프로그램의 실행 결과가 좀 특이하다.

 여기에서 whitespace 는 온갖 공백 문자를 특수 문자로 변경해주는 프로그램이다. 이는 아래와 같이 정의되어 있다:

# SP  ' '  0x20 = · U+00B7 Middle Dot
# TAB '\t' 0x09 = → U+FFEB Halfwidth Rightwards Arrow
# CR  '\r' 0x0D = § U+00A7 Section Sign (⏎ U+23CE also works fine)
# LF  '\n' 0x0A = ¶ U+00B6 Pilcrow Sign (was "Paragraph Sign")
alias whitespace="sed 's/ /·/g;s/\t/→/g;s/\r/§/g;s/$/¶/g'"

 따라서 위 실행 결과에서 확인할 수 있는 사실은 해당 코드가 단순히 hello, world! 만을 출력하는 것이 아닌 행의 첫 문자에 공백을 끼워넣었음을 확인할 수 있다.

 왜 이런 공백 문자가 끼워져 들어갔는지에 답하기 위해선, 우리는 캐리지 컨트롤 문자 (Carriage Control Character) 에 대해, 그리고 이를 사용하는 라인 프린터 (Line printer) 에 대해 알아볼 필요가 있다.

1. 라인 프린터 (Line printer)

 맨먼스 미신(프레더릭 브룩스 저; 강중빈 옮김)에서는 라인 프린터를 다음과 같이 설명한다.

 디스플레이 장치가 본격적으로 발달하기 전까지 컴퓨터가 계산 결과를 내보내는 방식은 인쇄기, 즉 프린터였다. 초기에 널리 쓰인 것은 라인 프린터(line printer)로, 해머 같은 것이 잉크 리본에 충격을 가하면서 한 행(line)을 한 번에 인쇄하는 방식이었다. 인쇄 품질이 그리 좋지 않았지만, 분당 2000행이 넘는 속도로 출력물을 찍어낼 수 있었다.

 책에도 위 영상에서 등장한 IBM 1403 의 삽화가 있다. 한마디로 위 영상에서 나온 저 거대한 깡통이 과거의 출력 장치였다는 뜻이다. 이러한 출력 장치는 지금의 출력 장치와 다르게 조금 특별한 규칙을 가지고 있었다. 바로 행의 시작에 캐리지 컨트롤 문자 가 존재했다는 것이다.

2. ASA 캐리지 컨트롤 문자

 ASA 제어 문자(ASA carriage control characters) 는 라인 프린터를 통해 용지의 이동을 제어하기 위해 사용되는 단순 인쇄 명령 문자이다. 이 명령들은 출력할 각 문자 줄의 첫 열에 특수 문자로 표현하며, 줄이 인쇄되기 전에 용지가 어떻게 앞당겨지는지에 영향을 미친다.

 많은 라인 프린터에서 첫 번째 문자는 대부분 캐리지 컨트롤 문자였기 때문에 이들은 대부분 특별하게 취급되었다. 그래서 일부 프로그래밍 언어(PL/I, COBOL 등) 에서는 1열의 문자를 따로 처리하는 기능 등을 지원했다. FORTRAN 또한 이러한 1열 문자에 대한 지원을 제공한다.

3. 캐리지 컨트롤 문자에 대한 FORTRAN 의 지원

 위에서 보인 예제의 첫 공백 문자는 FORTRAN 이 가지는 특별한 규칙 때문이다:

 In general, each record starts with a blank space. For a print file, that blank is not printed. See "Printing Files" for details. @

FORTRAN 에서 이러한 규칙을 가지는 이유가 바로 앞전에 설명한 라인 프린터의 캐리지 컨트롤 문자 때문이다. 캐리지 컨트롤 문자 자리에 이상한 문자가 오는 것을 막기 위해 일부러 1열의 첫 문자를 공백으로 취급하는 것이다.

Reference

[Web] https://stackoverflow.com/questions/3296237/are-fortran-control-characters-carriage-control-still-implemented-in-compilers
[Web] https://stackoverflow.com/questions/10627626/why-does-fortran-output-have-a-leading-space
[Web] https://ko.wikipedia.org/wiki/ASA_ASA_캐리지_제어_문자
[Web] https://en.wikipedia.org/wiki/ASA_carriage_control_characters
[Web] https://stackoverflow.com/questions/10627626/why-does-fortran-output-have-a-leading-space
[Web] https://docs.oracle.com/cd/E19957-01/805-4939/6j4m0vnc5/index.html

profile
2000.11.30

0개의 댓글