언어 문법 구조 비교
Python과 C 언어는 근본적인 설계 철학에서 차이를 보입니다. C는 명시적인 선언과 구분자를 요구하는 반면, Python은 들여쓰기 기반의 간결한 문법을 채택했습니다.
C 프로그램은 #include 전처리기 지시문으로 외부 라이브러리를 명시적으로 가져와야 합니다. stdio.h, stdlib.h 등의 표준 헤더가 필수적입니다. Python은 기본 입출력 기능을 내장하여 별도 import 없이 즉시 사용 가능합니다.
코드 블록 표현 방식도 상이합니다. C는 조건식을 소괄호 ()로 감싸고 실행 블록을 중괄호 {}로 구분합니다. Python은 콜론 :과 들여쓰기만으로 동일한 논리를 표현합니다.
함수 호출 방식의 차이
사용자 입력 처리 방식에서 두 언어는 접근법이 다릅니다. C의 scanf, getchar에 해당하는 단일 함수가 Python에는 존재하지 않습니다. 다만 input() 함수는 C의 gets()와 유사한 동작을 수행하여 변환 가능합니다.
출력 기능은 printf와 print가 거의 동일한 역할을 수행합니다. 형식 지정자 사용법만 약간 조정하면 호환성을 확보할 수 있습니다.
파일 처리 및 변환 로직
대용량 파일 처리를 위해 메모리 효율적인 접근 방식이 필요합니다. read()는 전체 내용을 한 번에 로드하고, readlines()는 모든 줄을 리스트로 저장합니다. 두 방식 모두 메모리 부담이 클 수 있어 readline()을 활용한 순차 처리가 바람직합니다.
with open("source.py", "r", encoding="utf-8") as py_source, \
open("output.c", "w") as c_target:
current_line = py_source.readline()
while current_line:
# 변환 로직 적용
processed = transform_line(current_line)
c_target.write(processed)
current_line = py_source.readline()
세미콜론 자동 삽입
Python은 줄바꿈이 문장 종료를 의미합니다. C는 세미콜론 ;이 필수 종결자입니다. 각 줄의 끝에 자동으로 구분자를 추가해야 합니다.
if current_line.endswith('\n'):
current_line = current_line.rstrip('\n') + ';\n'
주석 형식 변환
Python의 해시 기호 # 주석을 C의 슬래시 두 개 // 형식으로 치환합니다. 인라인 주석의 경우 코드와 구분이 필요합니다.
# 단일 라인 주석 처리
if '#' in current_line:
if current_line.strip().startswith('#'):
# 전체 라인이 주석인 경우
current_line = current_line.replace('#', '//', 1)
else:
# 코드 뒤에 주석이 있는 경우
parts = current_line.split('#', 1)
current_line = parts[0].rstrip() + '; //' + parts[1]
들여쓰기와 중괄호 매핑
Python의 4칸 공백 들여쓰기를 C의 중괄호 블록으로 변환하는 것이 핵 과제입니다. 들여쓰기 깊이 변화를 감지하여 적절한 위치에 블록 시작과 종료를 삽입합니다.
def convert_indentation(line_text, prev_depth, curr_depth):
brace_buffer = ""
indent_unit = " " # 4 spaces
if curr_depth > prev_depth:
# 블록 진입: 여는 중괄호 삽입
line_text = (prev_depth * indent_unit) + "{\n" + line_text
return line_text, curr_depth, brace_buffer
elif curr_depth < prev_depth:
# 블록 종료: 닫는 중괄호 누적
while prev_depth > curr_depth:
brace_buffer += ((prev_depth - 1) * indent_unit) + "}\n"
prev_depth -= 1
return brace_buffer + line_text, curr_depth, ""
return line_text, curr_depth, brace_buffer
이 외에도 자료형 선언, 예외 처리 구조, 리스트/딕셔너리 등의 고급 자료구조 매핑 등 추가적인 변환 규칙이 필요합니다. 정규 표현식과 구문 분석을 결합하여 보다 정교한 변환기를 구축할 수 있습니다.