채점 프로그램 작성의 시작

채점 프로그램을 작성하게 된 계기는 과거 클론 코딩으로 무엇을 할지 생각하다가 흔한 블로그, 게시판, SNS같은 주제는 흥미를 끌지 못해 백준과 같은 복잡하면서도 독보적인 서비스를 구현해보기 위함이 시작입니다. 채점 프로그램은 온라인 저지의 핵심이라고 할 수 있는데요. 이런 채점 프로그램은 정보도 별로 없고 오픈 소스도 별로 없기 때문에 어려움이 많았습니다. 그래서 성공적인 서비스를 진행하고 있는 백준에 질문을 남기고 답변을 받은 것이 채점 프로그램 작성의 시작이 되었습니다.

Untitled

왜 파이썬?

C, C++을 사용해본 경험은 알고리즘 문제 해결을 위한 경험뿐이기 때문에 시스템 호출을 바로 사용할 수 있는 C++을 이용한 구현에 어려움을 느낄 것이라고 생각했습니다. 반면 파이썬은 스크립트를 작성하는데 최적화가 되어 있다 생각하고 사용하는데 어렵지도 않기 때문에 파이썬을 사용하도록 결정하게 되었습니다. 그리고 파이썬도 시스템 함수를 대부분 지원하기 때문에 시스템 호출을 못하는 경우가 없을 것이라고 생각했습니다.

핵심 기능

  1. 자동 컴파일, 실행
  2. 표준 입출력 지정
  3. 메모리, 시간, 출력 제한
  4. 악의적인 코드 실행 방지
  5. 메모리, 실행 시간 측정
  6. 출력과 정답 비교

자동 컴파일, 실행

컴파일

컴파일은 저장된 명령어를 이용해서 컴파일을 하게 됩니다. 컴파일은 공인된 컴파일러를 사용하기 때문에 공인된 프로그램입니다. 따라서 별도의 처리를 하지 않고 subprocess를 이용해 바로 실행을 하게 됩니다.

def compile(execute_path: str, compile_command: str):
    try:
        compile_process = subprocess.Popen(
            compile_command, shell=True, cwd=execute_path, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
        compile_process.wait(30)
        return compile_process.returncode == 0
    except:
        return False

실행

채점 프로그램은 사용자가 작성한 코드를 직접 실행하는 것이기 때문에 어떤 코드를 실행할지 아무도 모릅니다. 그래서 사용자가 작성한 코드를 실행하는 과정에서 수많은 부가적인 기능들이 붙게 되는데 이러한 것을 쉽게 적용하기 위해서 fork를 사용하게 됩니다.

fork 명령 이후로는 자식 프로세스와 부모 프로세스가 각각의 역할에 맞게 다음 과정들을 수행하게 됩니다.