더 나은 Compiler Diagnostics 설계 — Klar 구축에서 얻은 교훈
발행: (2026년 1월 20일 오전 01:51 GMT+9)
3 min read
원문: Dev.to
Source: Dev.to
저는 Klar(이전 명칭 Klang)라는 작은 실험용 언어를 만들고 있습니다. 이는 명시적 의미론, 엄격한 진단, 그리고 다중 언어 도구 체인을 탐구하기 위한 것입니다. 이 언어는 실제 서비스용이 아니라 디자인 연습이지만, 진행하면서 한 가지 구체적인 문제에 집착하게 되었습니다: 컴파일러 오류를 실제로 유용하게 만드는 요소는 무엇인가?
예시 진단 (사용자가 보는 내용)
[K:E217] UnresolvedSymbol
ERROR (SEMANTIC)
at undefinedVariableExceptionTest.kl:10:12
8 | }
9 |
10 | println(total);
| ^
Cause:
The variable 'total' does not exist
Fix:
Remove it or create it
이를 생성한 소스 (.kl)
@Use("java")
public void main(){
integer count = 10;
integer iterator = 0;
while (iterator < count){
iterator = iterator + 1;
}
println(total);
return null;
}
설계 노트 (간략)
- 진단은 데이터 중심으로 구조화됩니다(오류 코드 + 메타데이터) 그리고 읽기 쉬운 텍스트로 렌더링됩니다.
- 레이아웃: 짧은 요약 → 정확한 위치(
file:line:col+ 캐럿) → 인간 친화적 설명 → 실행 가능한 수정. - 장난스럽거나 친근한 표현을 피하고, 명확성과 예측 가능성을 우선시합니다.
- 제안은 보수적으로 제공해야 합니다—예를 들어, “X를 의미하셨나요?”는 신뢰도가 충분히 높을 때만 제시합니다.
커뮤니티에 묻는 질문
- 진단을 평가할 때 가장 중요한 요소는 무엇인가요: 정밀도, 간결함, 혹은 실행 가능한 수정?
- 한 줄 요약을 먼저 보여주는 방식(그 뒤에 상세)과 읽기 쉬운 하나의 문단 중 어느 쪽을 선호하시나요?
- 일관되게 사용자를 혼란스럽게 만드는 진단 패턴을 보신 적이 있나요?
저는 특히 진단이 노이즈와 도움 사이에서 어떻게 균형을 맞추는지에 관심이 있습니다. 더 많은 예시(타입 불일치, 반환 누락, 매직 넘버 경고 등)를 보고 싶으시면, 댓글에 붙여넣겠습니다.
— ~K’ (Klar를 개발 중)