구문 강조
1. 개요
구문 강조는 텍스트, 특히 코드의 가독성을 높이기 위해 텍스트 편집기 등에서 사용되는 기능이다. 1980년대 초에 처음 등장했으며, 텍스트의 문법적 요소를 시각적으로 다르게 표현하여 오류를 쉽게 찾고 코드의 이해도를 높이는 데 기여한다. 구문 강조는 텍스트 편집기에서 널리 지원되며, 다양한 언어와 구문 요소에 맞춰 사용자 정의가 가능하다. 하지만 패턴 매칭 방식의 한계로 인해 부정확한 강조 표시가 발생할 수 있으며, 텍스트 전체를 이해하는 것을 방해할 수도 있다.
| 이름 | 구문 강조 (Syntax Highlighting) |
|---|---|
| 정의 | 텍스트 편집기, 통합 개발 환경, 웹 서비스 등에서 소스 코드, 마크업 언어 등의 텍스트를 가독성을 높이기 위해 색상 및 글꼴을 사용하여 시각적으로 구분하는 기능 |
| 목적 | 코드의 구조 파악, 오류 식별, 가독성 향상 |
| 기본 원리 | 텍스트 내의 단어 또는 구문의 종류 (키워드, 변수, 주석 등)를 분석하여 미리 정의된 규칙에 따라 색상, 글꼴 등을 적용 |
|---|---|
| 어휘 분석 (Lexical analysis) | 텍스트를 토큰이라고 하는 의미 있는 단위로 분할 |
| 구문 분석 (Syntax analysis) | 토큰의 순서를 확인하여 언어의 문법 규칙을 준수하는지 확인 |
| 강조 표시 | 토큰의 종류와 구문 분석 결과를 기반으로 색상, 글꼴, 스타일 적용 |
| 텍스트 편집기 및 IDE | EmEditor, Eclipse, Visual Studio Code 등 다양한 텍스트 편집기와 통합 개발 환경에서 코드 가독성을 높이는 데 사용 |
|---|---|
| 웹 기반 코드 뷰어 | GitHub, GitLab 등의 웹 서비스에서 소스 코드를 시각적으로 강조하여 보여주는 데 사용 |
| 터미널 에뮬레이터 | 특정 터미널 에뮬레이터는 구문 강조를 지원하여 명령줄 인터페이스에서의 가독성 향상 |
| 가독성 향상 | 코드를 더 쉽게 읽고 이해할 수 있도록 도움 |
|---|---|
| 오류 감소 | 구문 오류를 더 쉽게 식별하고 수정할 수 있도록 도움 |
| 생산성 향상 | 코드 작성 및 디버깅 시간을 단축 |
| 정규 표현식 | 텍스트 패턴을 일치시키는 데 사용되는 문자열 |
|---|---|
| 어휘 분석기 (Lexer) | 소스 코드를 토큰으로 분할 |
| 구문 분석기 (Parser) | 토큰 스트림을 기반으로 추상 구문 트리 (Abstract Syntax Tree, AST)를 생성 |
| 색상 팔레트 | 다양한 코드 요소에 적용할 색상 집합 |
| 렉싱 (Lexing) | 소스 코드를 토큰 시퀀스로 변환하는 프로세스 |
|---|---|
| 파싱 (Parsing) | 토큰 시퀀스를 기반으로 구문 트리를 구축하는 프로세스 |
| 컴파일러 (Compiler) | 소스 코드를 기계 코드로 변환하는 프로그램 |
| 인터프리터 (Interpreter) | 소스 코드를 한 줄씩 실행하는 프로그램 |
| 참고 자료 | MATLAB 입력 시 구문 검사 |
|---|---|
| 관련 링크 | EmEditor - 새로운 구문 파일 만들기 |
-
문서 편집기 기능 -
전문 검색
전문 검색은 문서 내 특정 단어나 구절을 찾는 정보 검색의 핵심 기술로, 인덱싱, 페이지랭크 알고리즘, 문자열 추출 방법, 문서 필터 기술, 질의 도구 개선 등을 통해 발전해왔으며, 웹 검색, 기업용 검색, 데스크톱 검색 등 다양한 분야에서 활용된다. -
문서 편집기 기능 -
맞춤법 검사기
맞춤법 검사기는 텍스트의 오타와 문법 오류를 검사하여 수정 제안을 제공하는 소프트웨어 도구이며, 1970년대에 처음 등장하여 기술 발전을 거쳐 현재 다양한 플랫폼에서 여러 언어를 지원한다. -
사용자 인터페이스 기술 -
작업 보기
작업 보기(Task View)는 윈도우 운영체제에서 창 전환을 용이하게 하는 창 관리 기능으로, 윈도우의 창 전환기, Flip 3D를 거쳐 발전해왔으며, Flip 3D의 단점을 보완하는 응용 프로그램도 존재한다. -
사용자 인터페이스 기술 -
모바일 앱
2. 역사
문법 강조의 개념은 구조 편집기의 개념과 상당 부분 겹친다. 최초의 코드 편집기 중 하나는 1969년 윌프레드 한센(Wilfred Hansen)이 개발한 에밀리(Emily)이다. 에밀리는 고급 언어 독립 코드 완성 기능을 제공했지만, 문법 강조 기능이 있는 현대의 편집기들과는 다르게 문법적으로 유효하지 않은 프로그램을 작성하는 것은 불가능했다.
1982년, 아니타 H. 클록과 얀 B. 초닥은 최초의 구문 강조 시스템에 대한 특허를 출원했다. 이 시스템은 1983년에 출시된 인텔리비전의 엔터테인먼트 컴퓨터 시스템(ECS) 주변 장치에 사용되었다. 이 시스템은 BASIC 프로그램의 다양한 요소를 강조 표시하며, 특히 어린이를 포함한 초보자가 코드를 쉽게 작성하도록 돕기 위해 구현되었다. 1985년 벤 슈나이더맨은 "의미를 제시하는 텍스트 문자열의 코드 규칙"을 제안하였다. 같은 해, 옥스퍼드 영어 사전의 전산화를 위해 VM 운영 체제용으로 작성된 라이브 파싱 편집기 (LEXX)는 컬러 구문 강조를 사용한 최초의 편집기 중 하나였다. 이 편집기의 라이브 파싱 기능은 사용자가 제공한 파서가 텍스트, 프로그램, 데이터 파일 등에 대해 편집기에 추가될 수 있도록 했다. 마이크로컴퓨터에서, MacPascal 1.0 (1985년 10월 10일)은 입력되는 대로 파스칼 구문을 인식하고 글꼴 변경(예: 키워드에 굵게)을 사용하여 단색 컴팩트 매킨토시에서 구문을 강조 표시했으며, 구조에 맞게 코드를 자동으로 들여쓰기했다.
3. 실용적 이점
구문 강조는 텍스트, 특히 여러 페이지에 걸쳐 있는 코드의 가독성과 문맥을 개선한다. 독자는 찾고 있는 내용에 따라 주석이나 코드의 큰 부분을 쉽게 무시할 수 있다. 구문 강조는 프로그래머가 프로그램에서 오류를 찾는 데 도움이 된다. 예를 들어, 대부분의 편집기는 문자열 리터럴을 다른 색상으로 강조 표시하여 구분 기호 누락을 쉽게 찾을 수 있게 해준다. 괄호 일치 기능을 통해 괄호가 빠졌는지 확인하거나 커서가 있는 괄호의 일치 항목을 찾아 다른 색상으로 강조 표시할 수도 있다.
PPIG 회의에서 발표된 한 연구에서는 구문 강조가 짧은 프로그램의 이해에 미치는 영향을 평가했는데, 구문 강조가 있을 때 프로그래머가 프로그램의 의미를 내면화하는 데 걸리는 시간을 유의미하게 줄이는 것으로 나타났다. 또한, 연구 중 아이 트래커에서 수집된 데이터에 따르면 구문 강조를 통해 프로그래머가 키워드와 같은 표준 구문 구성 요소에 덜 주의를 기울일 수 있었다.
하지만, 구문 강조로 인해 다음과 같은 단점도 존재한다는 지적도 있다.
* 훑어보기 쉬워져서 프로그래머가 코드 전체를 이해하려는 노력을 덜 하게 된다.
* 타이포그래피상의 이유로, 강조 표시된 코드가 실제로는 판독성이 떨어질 수 있다.
4. 텍스트 편집기 지원
일부 텍스트 편집기는 인쇄하거나 워드 프로세싱 및 기타 종류의 텍스트 서식 소프트웨어로 가져오기에 적합한 형식으로 색상 마크업을 내보낼 수 있다. 예를 들어, HTML, 컬러화된 LaTeX, PostScript 또는 RTF 버전의 구문 강조 표시로 내보낼 수 있다. 다른 애플리케이션에서 사용할 수 있지만 그 자체로 완전한 프로그램이 아닌 여러 구문 강조 라이브러리 또는 "엔진"이 있다. 예를 들어 PHP용 Generic Syntax Highlighter (GeSHi) 확장이 있다.
둘 이상의 언어를 지원하는 편집기의 경우, 사용자는 일반적으로 C, LaTeX, HTML과 같은 텍스트의 언어를 지정할 수 있으며, 텍스트 편집기는 파일 확장자를 기반으로 하거나 파일 내용을 스캔하여 자동으로 인식할 수 있다. 이 자동 언어 감지는 잠재적인 문제를 야기한다. 예를 들어, 사용자는 다음을 포함하는 문서를 편집할 수 있다.
* 둘 이상의 언어 (예: JavaScript 코드가 포함된 HTML 파일을 편집하는 경우)
* 인식되지 않는 언어 (예: 잘 알려지지 않거나 비교적 새로운 프로그래밍 언어의 소스 코드를 편집하는 경우)
* 파일 유형과 다른 언어 (예: 언어를 감지하기 위해 파일 확장자를 사용하는 편집기에서 확장자가 없는 파일의 소스 코드를 편집하는 경우)
이러한 경우 어떤 언어를 사용해야 할지 명확하지 않으며, 문서가 강조 표시되지 않거나 잘못 강조 표시될 수 있다.
5. 구문 요소
대부분의 구문 강조 편집기는 키워드, 주석, 제어 흐름 문, 변수 등 구문의 수십 가지 서로 다른 어휘 하위 요소에 대해 다양한 색상과 텍스트 스타일을 허용한다. 프로그래머는 코드를 읽기 어렵게 만들지 않으면서 최대한 많은 유용한 정보를 표시하기 위해 설정을 자주 사용자 정의한다.
일부 편집기는 "구문 장식" 기능을 제공하여 포인터 연산자를 실제 화살표 기호로, 주석의 텍스트 장식 단서(예: /기울임꼴/, *굵게*, 또는 _밑줄_)를 실제 기울임꼴, 굵게, 또는 밑줄로 표시하는 등 특정 구문 요소를 시각적으로 더 보기 좋은 방식으로 표현한다.
구문 강조는 텍스트, 특히 여러 페이지에 걸쳐 있는 코드의 가독성과 문맥을 개선하는 한 가지 전략이다. 독자는 찾고 있는 내용에 따라 주석이나 코드의 큰 부분을 쉽게 무시할 수 있다.
또한 구문 강조는 프로그래머가 프로그램에서 오류를 찾는 데 도움을 준다. 예를 들어, 대부분의 편집기는 문자열 리터럴을 다른 색상으로 강조 표시하므로, 텍스트의 대비되는 색상으로 인해 구분 기호 누락을 발견하기가 훨씬 쉽다. 괄호 일치는 많은 인기 있는 편집기에서 또 다른 중요한 기능으로, 괄호가 빠졌는지 쉽게 확인하거나 커서가 있는 괄호의 일치 항목을 다른 색상으로 강조 표시하여 찾을 수 있게 해준다.
PPIG 회의에서 발표된 한 연구에서는 구문 강조가 짧은 프로그램의 이해에 미치는 영향을 평가했는데, 구문 강조가 있을 때 프로그래머가 프로그램의 의미를 내면화하는 데 걸리는 시간을 유의미하게 줄이는 것으로 나타났다. 또한, 연구 중 아이 트래커에서 수집된 데이터에 따르면 구문 강조를 통해 프로그래머가 키워드와 같은 표준 구문 구성 요소에 덜 주의를 기울일 수 있었다.
5.1. 예제
아래는 C 코드 부분을 비교한 것이다.
| 표준 렌더링 | 문법 강조 |
|---|---|
아래는 문법이 강조된 C++ 코드 중 일부를 발췌한 것이다.
// Create "window_count" Window objects:
const auto window_count = int{10};
auto windows = std::array
for (auto i = int{0}; i < window_count; ++i) {
windows[i] = std::make_shared
}
다음은 코드 조각 C 언어 코드의 비교이다.
| 표준 렌더링 | 구문 강조 |
|---|---|
다음은 구문 강조된 또 다른 C++ 코드 조각이다.
// Create "window_count" Window objects:
const auto window_count = int{10};
auto windows = std::array
for (auto i = int{0}; i < window_count; ++i) {
windows[i] = std::make_shared
}
C++ 예제에서 편집기는 키워드
const, auto, int 및 for를 인식했다. 시작 부분의 주석도 작동하는 코드와 구별하기 위해 특정 방식으로 강조 표시된다.다음은 C++ 코드를 구문 강조한 것이다.
// Allocate all the windows
for (int i = 0; i < max; i++)
{
wins[i] = new Window();
}
이 예시에서는 소프트웨어가 키워드(예약어)로
for, int, new를, 변수명으로 i, wins, max를 판별하여 서로 다른 색으로 강조 표시한다. 첫 번째 줄의 주석도 코드 부분과 구별할 수 있도록 강조 표시된다.
6. 한계
일부 텍스트 편집기와 코드 서식 도구는 각 가능한 언어에 대한 파서를 구현하는 대신 패턴 매칭 휴리스틱 (예: 정규 표현식)을 사용하여 구문 강조를 수행한다. 이로 인해 부정확한 구문 강조 및 속도 저하가 발생할 수 있다. 텍스트 편집기가 이 문제를 해결하기 위해 사용하는 해결책은 보이는 영역만 파싱하는 것이며, 때로는 "동기화"를 위해 텍스트에서 제한된 수의 줄까지 뒤로 스캔하기도 한다.
편집기는 종종 코드가 완성되지 않았거나 잘못된 상태에서 코드를 표시하며, 엄격한 파서(컴파일러에서 사용되는 것과 같은)는 대부분의 경우 코드를 파싱하는 데 실패한다.
일부 최신 언어별 IDE (텍스트 편집기와 대조적으로)는 코드에 대한 매우 정확한 이해를 제공하는 전체 언어 파싱을 수행한다. 의미론적 강조는 지역 변수에 고유한 개별 색상을 제공하여 코드 이해도를 높일 수 있다. (KDevelop영어, Visual Studio영어, Xcode영어 등에서 사용) 사용자가 색맹을 가지고 있다면 사용자 인터페이스의 색상은 덜 유용할 수 있다.