메아리 저널

공백 기반 문법1에 대해서. 공백 기반 문법은 좋아하는 사람도 많고 싫어하는 사람도 많은 프로그래밍 언어 동네의 신흥 종교이다. 좋아하는 사람들은 이미 멀쩡한 코딩 규칙에서는 들여쓰기를 하고 있으니까 이를 강제하는 것이 언어의 사용성에서나 실수를 방지하는데 유용하다는 입장이고, 싫어하는 사람들은 보이지도 않는 공백을 검증하기 어려우며 탭과 공백이 섞여서 생기는 문제라거나 접근성 문제 등에서도 들여쓰기를 강제하는 이득이 적다는 입장이다.

나는 공백 기반 문법은 의도는 좋았으나 잘못된 위치에서 푼 결과라고 본다. 문법 자체에서 실수를 유발하기 좋은 경우를 제외하면 (goto fail; 같은 것이 대표적인 예일 것이다), 코딩 규칙은 문법에 강제하는 게 아니라 문법 해석이 종료된 뒤 추가 확인을 거치는 게 올바르다. 사실 이렇게 말하면 공백 기반 문법과 뭐가 다르냐는 질문이 나올 수 있는데, 공백 기반 문법은 공백 없이는 해석이 불가능하기 때문에 문제가 되는 것이지 공백이라는 요소가 문제가 되는 건 아니다. 이런 면에서는 공백 기반 문법 대신 코딩 규칙을 강제하는 다른 툴을 도입한 Go 같은 언어의 접근이 더 올바르다. Go는 중괄호 기반 문법이라서 한 줄로 쭉 써도 되긴 하지만, 코딩 규칙은 go fmt를 통해 거의 강제로 강제하고 있기 때문에 설령 공백이 사라져도 기본적으로는 사후에 복구해서 원 의도를 파악할 수 있다.

같은 논리는 공백 기반 문법 말고도 개행 문자가 의미를 가지는 언어에도 일정 부분 적용할 수 있다. 횡축 공백보다는 드물지만 개행 문자도 날아가는 일은 종종 있기 때문에… 여기에도 몇 가지 접근이 있는데, 자바스크립트처럼 문장 구분자가 따로 있는데 개행 문자도 쓸 수 있도록 하는 게 하나, 어지간한 많은 언어처럼 개행 문자가 곧 문장 구분자인 게 하나, 그리고 루아처럼 아예 문장 구분자 같은 게 없는 경우가 하나(…). 이 또한 나는 자바스크립트의 접근을 선호하는 편이긴 한데, 차이점은 공백 기반 문법과는 달리 개행 문자를 문장 구분용으로 쓰는 걸 싫어하는 사람은 많이 없어서 이 미묘한 차이를 설득시키긴 쉽지 않다. 아무래도, 호불호가 많이 갈리는 문제일수록 역설적으로 좀 더 강력하게 의견을 밀고 나가도 되는 면이 크다.


  1. 사실 공백 기반 문법은 다시 크게 두 가지로 나뉘는데, 파이썬이 대중화시킨 들여쓰기 강제화와, 하스켈이 대중화(?)시킨 레이아웃에 민감한 문법이 있다. 전자는 들여쓰기를 하기만 하면 그 양은 상관 없지만, 후자는 그 양 또한 중요한 역할을 하기 때문에 구현 면에서나 사용 면에서나 다소 차이가 있다. 하지만 둘 다 공백이 문법의 중요한 요소라는 점에서는 크게 다르진 않으므로 여기에서는 그냥 묶어서 서술. ↩︎


노트들

  1. arachneng posted this
텀블러를 씁니다.