Shotnest · 라이브러리
실행 동등성을 가정하지 않고 코드 비교하기
Shotnest 텍스트 도구로 두 코드 조각을 비교하고, if (count > 0)과 if (count >= 0)이 왜 여전히 토큰의 0.778을 공유하는지 알아봅니다.
비교 도구가 코드를 다루는 방식
비교 도구는 두 입력을 소문자로 바꾸고, Shotnest가 검색에 쓰는 것과 같은 문자 정규화(악센트 제거, 전각 문자를 반각으로 변환)를 적용한 뒤, 연속된 공백을 모두 한 칸으로 줄이고 공백 기준으로 나눕니다. 결과로 보여 주는 것은 두 텍스트가 공유하는 서로 다른 토큰의 비율과 한쪽에만 있는 토큰입니다. 들여쓰기, 줄바꿈, 대소문자는 이 단계 전에 사라지는데, 산문에는 편리하지만 코드에는 위험합니다.
아무것도 실행되지 않습니다. 페이지는 붙여 넣은 코드 조각을 일반 텍스트로 다루고 마크업으로 바꾸지 않은 채 결과를 표시하므로, 숫자는 동작이 아니라 문자를 설명합니다.
두 코드 조각 준비하기
- 각 코드 조각을 중괄호와 연산자까지 캡처된 그대로 붙여 넣으세요.
- ‘정확히 같음’ 줄을 먼저 읽으세요. 대소문자와 공백을 유지하는 검사는 이것뿐입니다.
- 그다음 ‘정규화 후 같음’과 겹침 값을 별개의 사실로 읽으세요.
- 첫 번째에만 있는 토큰 목록과 두 번째에만 있는 토큰 목록을 여세요. 연산자와 붙어 있는 구두점은 대개 그곳에 나타납니다.
- 들여쓰기가 의미를 갖는 언어의 들여쓰기처럼 토큰 목록이 보여 줄 수 없는 것은 스크린샷으로 돌아가 확인하세요.
연산자 하나만 바뀐 두 코드 조각
첫 번째 텍스트는 세 줄에 걸쳐 쓴 “if (count > 0) { return count; }”입니다. 두 번째 텍스트는 같은 문장을 한 줄로 쓰고 > 대신 >=를 넣은 것입니다. 정규화하면 줄바꿈이 사라지므로 다른 토큰은 >와 >=뿐입니다. 서로 다른 토큰 아홉 개 중 일곱 개를 공유하므로 7 ÷ 9가 됩니다.
- 정확히 같음
- 아니요
- 정규화 후 같음
- 아니요
- 토큰 겹침
- 0.7777777777777778
- 첫 번째 텍스트에만 있음
- >
- 두 번째 텍스트에만 있음
- >=
두 번째 쌍은 반대쪽 위험을 보여 줍니다. “const Total = 1;”과 “const total = 1;”은 정규화 후 같고 겹침도 1로 나오지만, 많은 언어에서 Total과 total은 서로 다른 이름입니다.
코드 텍스트로 하기 쉬운 실수
- 겹침이 1에 가깝다는 것을 두 함수가 똑같이 동작한다는 증거로 받아들이는 것.
- 정확히 같음 줄을 건너뛰어 식별자의 대소문자 변경을 놓치는 것.
- 라이브 텍스트로 복사하면서 괄호가 빠지거나 두 열이 합쳐진 코드 조각을 비교하는 것.
- 도구가 바뀐 비교 연산자를 바뀐 단어보다 중요하게 표시해 줄 거라고 기대하는 것.
비교가 멈추는 곳
토큰 겹침은 텍스트 척도입니다. 순서, 반복된 토큰, 공백을 무시하므로 코드가 컴파일되는지, 같은 값을 반환하는지는 알려 줄 수 없습니다. Shotnest 앱에서는 코드처럼 시작하는 줄(import, def, return 등)이 세 줄 이상인 코드 스크린샷이 코드 선반에 들어갑니다. 이 선반은 다시 찾기 위한 곳이며, 실행은 직접 관리하는 환경에서 할 일입니다.