COBOLAssist: Analyzing and Fixing Compilation Errors for LLM-Powered COBOL Code Generation
이 논문은 LLM 이 생성한 COBOL 코드의 컴파일 오류를 분석하고, 컴파일 피드백을 기반으로 한 반복적 수정 프레임워크인 'COBOLAssist'를 제안하여 GPT-4o 등 주요 모델의 컴파일 성공률을 29.5%~41.8% 에서 64.38%~95.89% 로 획기적으로 개선하는 효과를 입증했습니다.
원저자:Anh T. V. Dau, Shin Hwei Tan, Jinqiu Yang, Nghi D. Q. Bui, Anh Tuan Nguyen
세상에는 은행, 보험, 정부 시스템 등 아주 중요한 일을 처리하는 COBOL이라는 오래된 컴퓨터 언어로 만들어진 프로그램들이 수백억 줄이나 돌아갑니다. 마치 1950 년대에 지어진 거대한 낡은 빌딩 같은 것이죠.
하지만 문제는 이 빌딩을 수리할 줄 아는 **전문 기술자 (개발자)**가 점점 사라지고 있다는 점입니다. 젊은이들은 이 낡은 언어를 배우기 싫어하고, 기존 기술자들은 은퇴합니다.
🤖 인공지능의 등장과 함정
그래서 연구자들은 "인공지능 (AI) 이 대신 코드를 짜주면 어떨까?"라고 생각했습니다. 하지만 AI 가 COBOL 코드를 작성하면 매우 엉망진창이 됩니다.
비유: AI 는 최신 언어 (Python 등) 는 잘 하지만, 낡은 COBOL 언어의 엄격한 규칙을 잘 모릅니다. 마치 현대식 건축가에게 1950 년식 목조 주택 설계도를 그리라고 시켰을 때, 벽을 너무 높게 짓거나 문이 없는 방을 만들어 버리는 것과 비슷합니다.
결과: AI 가 만든 코드는 컴퓨터가 실행조차 못 하는 (컴파일 오류) 경우가 70% 이상이나 됩니다.
🔍 연구 1: AI 가 주로 어떤 실수를 할까? (RQ1)
연구팀은 AI 가 만든 코드를 분석해서 실수 유형을 세 가지로 분류했습니다.
불완전한 코드 (Incomplete Code): 문장이 중간에 끊기거나, '끝'을 나타내는 표시를 안 하는 실수입니다. (예: "문장을 끝내세요"라는 말 없이 갑자기 다음 문장으로 넘어가는 것)
문법 오류 (Syntax Errors): COBOL 의 딱딱한 규칙을 어긴 것입니다. (예: COBOL 에서는 특정 명령어를 특정 순서로만 써야 하는데, AI 가 순서를 뒤섞음)
형식 관련 오류 (Type-related Errors): 숫자 자리에 글자를 넣거나, 데이터 크기가 맞지 않는 실수입니다.
재미있는 발견: 인간 개발자는 잘 안 하는 실수 (예: 내장 함수를 잘못 쓰는 것) 를 AI 가 유독 많이 저지릅니다. AI 는 COBOL 의 '구조'를 이해하는 데 아직 약점이 있습니다.
🛠️ 해결책: 'COBOLAssist' (코볼어시스트)
이제 이 문제를 해결하기 위해 연구팀이 개발한 **'COBOLAssist'**라는 도구를 소개합니다.
비유: 이 도구는 AI 를 위한 '엄격한 감수자 (편집자)' 역할을 합니다.
AI 가 코드를 작성하면, 감수자가 (컴파일러) "여기 문법이 틀렸어요, 41 줄에 오류가 있어요"라고 피드백을 줍니다.
AI 는 그 피드백을 보고 코드를 수정합니다.
다시 감수자가 확인하고, 고칠 게 있으면 또 피드백을 줍니다.
이 과정을 수차례 반복하면 AI 는 점점 더 정확한 코드를 만들어냅니다.
📈 결과: 얼마나 효과가 있을까? (RQ2)
이 방법을 적용한 결과는 놀라웠습니다.
성공률 급상승: AI 가 처음에 코드를 작성했을 때 실행 가능한 비율은 40% 정도였는데, COBOLAssist 를 쓰면 95% 이상으로 뛔어 올랐습니다.
비유: 처음에 100 명 중 40 명만 건물을 제대로 지었는데, 감수자가 도와주니 100 명 중 95 명이 완벽하게 지은 셈입니다.
기능성 향상: 단순히 문법만 고친 게 아니라, 실제로 작동하는 프로그램 (Pass@1) 도 2 배 이상 늘어났습니다.
🧐 남은 과제 (RQ3)
하지만 완벽하지는 않습니다.
남은 문제: AI 는 간단한 문법 오류는 잘 고치지만, 복잡한 논리 구조나 의미가 통하지 않는 오류는 여전히 고치기 힘들어합니다.
비유: 벽돌을 바르게 쌓는 것은 잘하지만, "왜 이 방은 창문이 없어야 하는지" 같은 건축의 철학이나 맥락을 이해하는 데는 아직 한계가 있습니다.
💡 결론: 왜 이 연구가 중요한가?
이 논문은 **"AI 가 낡은 시스템을 고칠 수 있지만, 그 자체로는 부족하고 인간의 피드백 (컴파일러 오류 메시지) 이 필요하다"**는 것을 증명했습니다.
의미: 앞으로 은행이나 정부 같은 곳에서 COBOL 시스템을 유지보수할 때, AI 를 그냥 믿고 맡기는 게 아니라, AI 가 실수하면 바로 고쳐주는 '자동 수정 시스템'을 함께 쓰면 훨씬 효율적으로 낡은 시스템을 현대화할 수 있다는 희망을 보여줍니다.
한 줄 요약:
인공지능이 낡은 언어 (COBOL) 로 코드를 짤 때 자주 실수하지만, 컴퓨터가 알려주는 '오류 메시지'를 반복해서 보여주면 AI 가 스스로 고쳐서 거의 완벽하게 만든다는 것을 발견했습니다!
1. 연구 배경 및 문제 정의 (Problem)
레거시 시스템의 중요성: COBOL 은 1950 년대 이후 은행, 보험, 정부 시스템 등 전 세계 핵심 비즈니스 인프라의 근간을 이루고 있습니다. 현재 약 2,200 억 줄의 COBOL 코드가 사용 중이며, 매년 15 억 줄이 추가 작성되고 있습니다.
유지보수의 어려움: 숙련된 COBOL 개발자의 감소와 문서화 부족으로 인해 레거시 시스템 유지보수가 점점 더 어려워지고 있습니다.
LLM 의 한계: 최근 대규모 언어 모델 (LLM) 을 활용한 코드 생성 기술이 발전했으나, COBOL 은 저자원 (low-resource) 언어로 공개된 학습 데이터가 부족합니다. 이로 인해 LLM 은 COBOL 의 엄격한 문법과 구조적 규칙을 제대로 이해하지 못해 컴파일 오류 (Compilation Errors) 가 빈번하게 발생합니다.
연구 격차: 기존 연구는 Python, Rust 등 현대 언어의 LLM 생성 코드 오류 수정에 집중했으나, COBOL 의 컴파일 오류를 분석하고 자동으로 수정하는 연구는 부재했습니다.
2. 방법론 (Methodology)
이 연구는 크게 COBOL 컴파일 오류 분류 체계 구축과 COBOLAssist 프레임워크 제안 두 단계로 진행되었습니다.
2.1 COBOL 컴파일 오류 분류 (Error Categorization)
데이터 수집: COBOLEval 벤치마크 (146 개 태스크) 를 기반으로 GPT-4o, GPT-4o-mini, mAInframer-34B 등 3 개의 LLM 으로 생성된 876 개의 COBOL 프로그램을 수집했습니다.
컴파일 및 분석: GnuCOBOL 컴파일러를 사용하여 980 개의 컴파일 오류를 추출하고, 2 명의 전문가 (연구자 및 COBOL 개발자) 가 오류를 분류했습니다.
3 가지 주요 오류 범주 도출:
불완전한 코드 오류 (Incomplete Code Errors): 블록 종료 부재 (예: END-IF 누락), 문장 종료 부재 (점 . 누락) 등.
구문 오류 (Syntax Errors):
프로그램 구조 오용 (예: LINKAGE SECTION 중복 선언).
예약어 오용.
내장 함수 오용: COBOL 고유의 함수 호출 형식 (예: FUNCTION MOD) 을 다른 언어처럼 잘못 사용.
정의되지 않은 객체 참조.
변수 오용 (범위 및 타입 불일치).
타입 관련 오류 (Type-related Errors): 데이터 타입 불일치 (예: 문자열을 숫자 필드에 할당).
2.2 COBOLAssist 프레임워크
개념: 컴파일러 피드백을 활용한 반복적 자기 디버깅 (Iterative Self-Debugging) 접근법입니다.
작동 원리:
LLM 이 자연어 프롬프트를 기반으로 초기 COBOL 코드를 생성합니다.
생성된 코드를 컴파일하여 오류 메시지를 확인합니다.
컴파일러 오류 로그를 LLM 에게 다시 입력하여 (프롬프트), 오류를 수정한 코드를 생성하도록 요청합니다.
수정된 코드를 다시 컴파일하고, 프로그램이 성공적으로 컴파일되거나 최대 반복 횟수 (실험에서는 3 회) 에 도달할 때까지 이 과정을 반복합니다.
프롬프트 전략: LLM 을 "경험 많은 COBOL 소프트웨어 엔지니어"로 설정하고, 오류 로그와 원본 코드를 명확히 구분하여 입력합니다.
3. 주요 기여 (Key Contributions)
최초의 실증 연구: LLM 이 생성한 COBOL 코드의 컴파일 오류 유형을 체계적으로 분류하고, 인간이 작성한 코드 (Litecky, 1974) 와의 차이점을 분석했습니다.
COBOLAssist 제안: 컴파일러 피드백을 활용한 자동 수정 프레임워크를 개발하여 LLM 의 COBOL 코드 정확도를 향상시켰습니다.
광범위한 평가: 5 개의 LLM (GPT 시리즈 및 mAInframer) 을 대상으로 146 개의 COBOL 태스크에 대한 평가를 수행하여 기술의 유효성을 입증했습니다.
해결되지 않은 오류 분석: 자동 수정이 어려운 오류 유형 (심층적인 의미론적 오해, 복잡한 구조적 불일치) 을 식별하여 향후 연구 방향을 제시했습니다.
4. 실험 결과 (Results)
4.1 오류 분석 (RQ1)
구조적 오류의 우세: LLM 생성 코드에서 프로그램 구조 오용 (35.1%) 이 가장 큰 오류 원인이었으며, 이는 인간 작성 코드 (19.8%) 보다 약 2 배 높았습니다.
LLM 고유의 오류: 인간 코드에는 없던 내장 함수 오용 (17.2%) 과 블록 종료 부재 (5.6%) 가 LLM 에서만 발견되었습니다. 이는 LLM 이 COBOL 의 구조적 의미와 문법적 관례를 완전히 이해하지 못함을 시사합니다.
4.2 COBOLAssist 의 효과 (RQ2)
컴파일 성공률 (CSR) 향상:
GPT-4o: 41.8% → 95.89% 로 급증.
GPT-4o-mini: 29.5% → 64.38% 향상.
mAInframer-34B: 74.66% → 97.94% (최고 성공률 기록).
GPT-4: 31.91% → 55.17% 향상.
기능적 정확도 (Pass@1) 향상:
GPT-4: 9.1 → 22.6 (약 2.5 배 증가).
GPT-4o: 16.4 → 29.45 로 크게 개선.
효율성: 평균 1.5 회 이내의 반복으로 대부분의 오류를 수정했으며, mAInframer-34B 는 85.56% 의 오류 감소율을 보였습니다.
한계: mAInframer-34B 는 컴파일 성공률은 높았으나 (97.94%), 기능적 정확도 (Pass@1: 11.67) 는 GPT-4o (29.45) 보다 낮아, 문법적 정합성과 논리적 정확성 간의 간극이 존재함을 보여줍니다.
4.3 해결되지 않은 오류 (RQ3)
수정된 오류: 데이터 타입 불일치, 정의되지 않은 객체 참조 등 컴파일러 로그가 명확한 오류는 LLM 이 효과적으로 수정했습니다.
남은 오류:프로그램 구조 오용, 내장 함수 오용, 블록 종료 부재 등은 여전히 해결이 어렵습니다. 이는 중첩된 제어 구조의 맥락적 이해와 긴 코드 블록에 걸친 일관성 유지가 LLM 에게 여전히 어렵기 때문입니다.
5. 의의 및 결론 (Significance)
레거시 현대화의 실용적 경로: COBOLAssist 는 LLM 을 활용한 레거시 시스템 유지보수 및 현대화에 대한 실용적인 자동 디버깅 경로를 제시합니다.
LLM 의 한계와 기회: LLM 은 COBOL 의 복잡한 구조적 규칙을 완전히 이해하지 못하지만, 컴파일러 피드백을 통한 반복적 학습을 통해 문법적 오류를 대폭 줄일 수 있음을 입증했습니다.
향후 연구 방향: 단순한 프롬프트 엔지니어링을 넘어, 추상 구문 트리 (AST) 와 같은 프로그램 분석 기법을 결합한 구문 인식 (Syntax-aware) 접근법과 심층 의미론적 이해를 높이는 하이브리드 AI-인간 디버깅의 필요성을 강조합니다.
이 연구는 COBOL 과 같은 레거시 언어에서 LLM 의 활용 가능성을 확장하고, 자동화된 코드 생성 및 수정 기술의 신뢰성을 높이는 중요한 이정표가 됩니다.