AI가 COBOL을 Java로 옮기며 버그까지 그대로 옮겼다? Locksmith Loop 검증법
AI migrated legacy COBOL programs to Java, bugs included
TL;DR Highlight
COBOL·Java를 같이 돌려 비교했더니 분기 커버리지 최대 거의 100%
Who Should Read
레거시 코드를 AI로 다른 언어로 마이그레이션하면서 결과가 원본과 같은지 검증할 방법이 필요한 백엔드 개발자
Core Mechanics
- 원본과 결과물을 같이 돌려 비교
- COBOL 원본과 AI가 만든 Java를 둘 다 목(mock)을 붙여 메인프레임 밖 일반 장비에서 실행한다.
- 같은 입력에 같은 출력이 나오는지 결정론적(매번 같은 결과) 비교로 확인한다.
- Witness Search로 분기 뚫기
- 에이전트가 입력 목 값을 바꿔 가며 프로그램의 분기를 하나씩 통과시킨다.
- 그다음 동작을 유지하는 변형(parity-preserving mutation)을 적용한다.
- 막힌 곳은 Locked Paragraph로 찾기
- 입력 탐색이 더 못 들어갈 때 분석기가 깊은 탐색을 막는 조건을 짚어 낸다.
- 이 조건이 Locked Paragraph이고, 이를 풀어 입력 탐색 한계를 넘는다.
- 사례 3개에서 커버리지 상승
- 오픈소스 2개와 사내 운영환경 유사 COBOL 1개, 430~4,114줄 규모로 실험했다.
- 오픈소스 2개는 거의 완전한 커버리지, 사내 프로그램은 분기 커버리지 91.90%였다.
- 채택된 테스트는 전부 일치
- 생성된 Java는 채택된 모든 테스트 케이스에서 COBOL 기준과 동일했다.
- 저자들은 결정론적 오라클(정답 판정기)로 에이전트 코딩 결과를 검증하는 새 접근이라고 주장한다.
Community Reactions
- COBOL이 언어보다 메인프레임 환경 전체라는 의견
- 99.99% 가동률과 CPU 무중단 교체 같은 환경은 언어 변환으로 대체되지 않는다는 주장이다.
- JCL, CICS, 정렬 처리, 메시징을 Java에서 어떻게 대체하느냐는 질문이 여러 번 나왔다.
- 테스트 규모가 너무 작다는 지적
- 가장 큰 사례가 4kloc인데 실제 운영 COBOL은 수천억 줄이라는 댓글이다.
- IRS만 해도 프로그램 약 160개, 평균 230kloc라는 수치가 언급됐다.
- 실제 코드에 LLM을 써 봤더니 전처리기를 몰라 지어냈다는 경험
- 특정 전처리기를 쓰는 운영 코드를 에이전트 없이 LLM에 넣었더니 동작을 그럴듯하게 꾸며 냈다는 경험이다.
- Gemini 2.5는 전처리기가 있다는 것조차 알아채지 못했다고 한다.
- GOTO 변환에서 새 버그가 생긴다는 예시
- COUNTER가 10으로 들어오면 COBOL은 11을 찍지만 while 변환은 아무것도 안 찍는다는 예시다.
- 비슷한 도구로 Mechanical Orchard 방식과 COBOL-Java 비교 도구 coboltwin이 소개됐다.
How to Apply
- 기존 코드와 새 코드를 같은 입력으로 비교하는 스크립트 만들기
- 오늘 마이그레이션 대상 함수 하나를 골라 원본과 새 구현을 같이 호출하는 하네스를 짠다.
- 입력 예시 20개를 넣고 출력이 완전히 같은지 diff로 확인한다.
- 외부 의존성은 목으로 바꿔 로컬에서 돌리기
- DB·메시징·파일 호출 지점을 JSON 입출력 목으로 교체한다.
- 양쪽이 같은 목 데이터를 읽게 해서 일반 장비에서 재현되게 한다.
- 커버리지 안 오르는 분기를 에이전트에게 분석시키기
- 커버리지 리포트에서 한 번도 안 지나간 분기를 뽑아 LLM에 준다.
- 어떤 조건이 막고 있는지 설명시키고 그 분기를 통과시킬 입력을 생성하게 한다.
- 통과 기준을 일치율로 정하기
- 두 구현이 출력이 다르면 실패로 간주하는 CI 단계를 추가한다.
- LLM이 만든 테스트는 원본에서 먼저 실행해 통과한 것만 채택한다.
Try It
# Claude 또는 ChatGPT에 붙여넣기 (논문 방법의 간이 버전: 분기 막힘 분석)
나는 레거시 코드를 새 언어로 마이그레이션 중이다. 아래 원본 코드와 커버리지 리포트를 줄 테니 다음을 해라.
[원본 코드]
{{원본 코드}}
[한 번도 실행되지 않은 분기]
{{미커버 분기 목록}}
[지시]
1. 각 미커버 분기마다 그 분기 진입을 막는 조건(Locked Paragraph에 해당)을 한 줄로 설명해라.
2. 그 조건을 통과시킬 입력 목 값을 JSON으로 만들어라.
3. 원본에서 기대 출력이 무엇일지 적어라. 모르면 모른다고 써라.
이어서 해 볼 것: 만든 입력을 원본과 새 구현에 모두 넣어 출력이 같은지 diff로 비교해 보자.Terminology
관련 논문
The Judge Can Debias Itself: LLM-as-a-Judge가 스스로 편향을 고치게 하는 법
심사 프롬프트에 편향 경고를 넣거나 스스로 비판시켰더니 21개 중 20개 조합에서 정확도가 올랐다
미국 노동시간의 90%는 AI 벤치마크가 제대로 다루지 못하는 일이다
벤치마크 29개를 직업 과제에 매핑했더니 노동시간 90%가 커버 밖
Postgres 19, AI 코드 리뷰가 버그를 너무 많이 찾아 출시 연기
LLM 코드 리뷰가 버그를 쏟아내 Postgres 19가 11월로 밀리고 기능 8~10개가 빠졌다
StarSkirmish Bench v0.2: LLM이 1시간 만에 짜는 StarCraft 봇 대결
LLM에게 1시간 동안 StarCraft 봇을 짜게 했더니 GPT-6 Astra가 1위
그럴듯한 설명 하나면 멀티모달 LLM 심사위원도 속는다 (JUPE 벤치마크)
정답은 그대로 두고 설명만 붙였더니 MLLM 심사위원의 오답 거절률이 12.7~13.8%p 떨어졌다
신경망은 이미 깔끔하다: polysemanticity의 원인 재해석
뉴런을 직접 들여다봤더니 대부분 한 가지 역할이 있었다는 주장
Linus Torvalds의 첫 LLM 보조 패치 시리즈
Linus가 LLM으로 folio 조회 패치 10개를 만들어 read() 벤치가 10배 빨라졌다