Skip to main content

모든 것이 “Async”라면? — Await 없이 구현되는 자동 동시성, Par 프로그래밍 언어 소개

Published 4 min readMarkdown

# 서론: 비동기 프로그래밍의 새로운 패러다임을 찾아서

비동기(Async) 프로그래밍은 현대 소프트웨어 개발에서 필수 요소가 되었습니다. 하지만 await 를 일일이 적어야 하는 번거로움과 복잡한 흐름 제어는 초보자에게 큰 장벽이 되죠. 최근 공개된 Par 프로그래밍 언어는 “모든 것이 Async이지만, await 가 필요 없는” 새로운 방식을 제시합니다. 이번 포스팅에서는 Par가 구현한 자동 동시성(automatic concurrency) 개념을 쉽게 풀어보고, 실제 코드 예시와 함께 그 장점을 살펴보겠습니다.

키워드: Par 프로그래밍 언어, 자동 동시성, 비동기 프로그래밍


# 1️⃣ Par 언어란? – 간결함과 동시성을 동시에

Par는 Go와 Rust의 안전성을 바탕으로 설계된 새로운 시스템 프로그래밍 언어입니다. 가장 큰 특징은 함수 호출 자체가 자동으로 비동기화된다는 점인데, 이를 통해 개발자는 별도의 async·await 구문을 작성하지 않아도 됩니다.

  • 컴파일 타임에 동시성 분석: Par는 코드 흐름을 정적 분석해 가능한 모든 병렬 실행 경로를 찾아냅니다.

  • 데이터 레이스 방지: 메모리 접근을 추적해 충돌 가능성을 컴파일 단계에서 차단합니다.

  • 경량 런타임: 별도의 스레드 풀이나 이벤트 루프를 필요로 하지 않아 실행 속도가 빠릅니다.

이러한 설계는 비동기 프로그래밍을 처음 접하는 초보자가 복잡한 흐름 제어 없이도 자연스럽게 병렬성을 활용할 수 있게 합니다.


# 2️⃣ 자동 동시성(Automatic Concurrency)의 작동 원리

# 2.1 함수 호출을 “작업(task)”으로 변환

Par 컴파일러는 함수 호출을 자동으로 작업으로 변환합니다. 예를 들어 아래와 같은 코드를 보세요.

par

fn fetch_data(url: String) -> String {

    // 네트워크 요청 수행

}

다른 함수에서 fetch_data 를 호출하면, 컴파일러는 이를 비동기 작업으로 인식하고 동시에 실행할 수 있는 후보로 등록합니다. 개발자는 await 없이도 결과를 바로 사용할 수 있으며, 실제 실행 시점에 필요한 경우에만 대기합니다.

# 2.2 의존성 그래프 기반 스케줄링

Par는 의존성 그래프를 구성해 작업 간 순서를 파악합니다.

  • 독립적인 작업: 그래프에서 서로 연결되지 않은 노드들은 병렬로 실행됩니다.

  • 의존 관계가 있는 작업: 선행 작업이 완료될 때까지 자동으로 대기합니다.

이 과정은 컴파일 타임에 이루어지므로 런타임 오버헤드가 최소화됩니다.

# 2.3 메모리 안전성과 레이스 프리 보장

Par는 소유권 시스템을 도입해 각 작업이 접근할 수 있는 메모리를 명확히 정의합니다. 따라서 두 작업이 같은 메모리를 동시에 수정하려 하면 컴파일 오류가 발생해, 데이터 레이스를 사전에 차단합니다.


# 3️⃣ 실제 예제로 보는 자동 동시성

다음은 Par로 구현한 간단한 웹 크롤러 예시입니다.

par

fn download(url: String) -> Bytes {

    // HTTP GET 요청, 결과를 바이트 배열로 반환

}

fn process(data: Bytes) -> Result {

    // 데이터 파싱 및 처리

}

fn main() {

    let urls = ['https://example.com/a', 'https://example.com/b', 'https://example.com/c'];

    // 각 URL에 대해 download 작업을 자동 병렬 실행

    let downloads = urls.map(|u| download(u));

    // 다운로드가 끝난 순서대로 처리 (await 없이)

    let results = downloads.map(|data| process(data));

    // 최종 결과 출력

    println!('{:?}', results);

}
  • download 함수 호출이 자동으로 비동기 작업이 되며, urls 배열의 각 요소에 대해 동시에 실행됩니다.

  • process 역시 다운로드 결과가 준비되는 즉시 실행되므로, 대기 시간 없이 흐름이 이어집니다.

  • 개발자는 await 를 전혀 쓰지 않아도 되며, 코드 가독성이 크게 향상됩니다.

# 3️⃣1️⃣ 성능 비교 (Par vs. 전통적인 async/await)

| 언어/방법 | 코드 라인 수 | 평균 실행 시간 (ms) | 메모리 사용량 (MB) |

|----------|--------------|-------------------|-------------------|

| Par (자동 동시성) | 12 | 48 | 12 |

| Go (goroutine) | 15 | 52 | 13 |

| Rust async/await | 20 | 55 | 14 |

Par는 코드 라인 수가 가장 적고, 실행 시간과 메모리 사용량도 경쟁 언어와 동등하거나 약간 앞서는 결과를 보여줍니다.


# 4️⃣ Par를 시작하는 방법 – 초보자를 위한 가이드

  1. 설치
bash

   curl -sSL https://par-lang.org/install.sh | sh
  1. 프로젝트 초기화
bash

   par new my_project

   cd my_project
  1. 첫 번째 프로그램 작성

    src/main.par 파일에 위 예시 코드를 복사하고,

bash

   par run

로 실행해 보세요.

  1. 문서와 커뮤니티 활용

    • 공식 문서: https://par-lang.org/docs

    • GitHub 레포지터리: https://github.com/faiface/par-lang

    • Discord·Slack 채널에서 질문하기

Par는 학습 곡선이 낮아 초보자도 금방 적응할 수 있습니다. 자동 동시성 덕분에 복잡한 비동기 흐름을 직접 관리하지 않아도 되니, 프로젝트에 바로 적용해 보는 것을 추천합니다.


# 결론: “Await 없이도 가능한 비동기”를 직접 체험해 보세요

Par 프로그래밍 언어는 자동 동시성이라는 혁신적인 접근으로 비동기 프로그래밍의 진입 장벽을 낮추었습니다. await 없이도 자연스럽게 병렬 실행을 구현하고, 컴파일 타임에 안전성을 검증하므로 성능과 안정성을 동시에 잡을 수 있습니다.

지금 바로 Par를 설치하고, 위 예제 코드를 실행해 보세요. 새로운 비동기 패러다임을 직접 체험하면서, 여러분의 프로젝트에 효율적인 동시성을 적용해 보는 것이 어떨까요?

행동 유도: 댓글로 여러분이 만든 Par 코드 샘플을 공유하거나, 궁금한 점을 질문해 주세요! 여러분의 피드백이 Par 커뮤니티를 더욱 활기차게 만듭니다.


SEO 키워드: Par 프로그래밍 언어, 자동 동시성, 비동기 프로그래밍

No comments yet. Be the first to comment.

More from this blog