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

---

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

비동기(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

   
```

2. **프로젝트 초기화**

   
```
bash

   par new my_project

   cd my_project

   
```

3. **첫 번째 프로그램 작성**

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

   
```
bash

   par run

   
```

   로 실행해 보세요.

4. **문서와 커뮤니티 활용**

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

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

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

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

---

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

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

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

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

---

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