Mojo 1.0 베타
5 hours ago
3
- Mojo는 “Python처럼 쓰고, C++처럼 실행”하는 언어를 표방하며, 현재 안정 버전으로 1.0.0b1 (May 7) 을 제공함
- CPU부터 GPU까지 다양한 하드웨어에서 빠른 코드를 작성하되 특정 벤더에 종속되지 않는 것을 목표로 하며, 현대 AI 시스템을 위한 고성능 정적 타입 언어로 설계됨
- Python 상호운용을 네이티브로 지원해 기존 코드를 전부 다시 쓰지 않고 성능 병목만 Mojo로 옮길 수 있으며, Mojo 코드의 Python import와 Python 라이브러리 import를 모두 지원함
- 같은 언어로 GPU 커널을 작성할 수 있고, 런타임 코드와 같은 언어를 쓰는 컴파일 타임 메타프로그래밍으로 하드웨어별 최적화와 비용 없는 추상화를 제공하려 함
- Mojo 표준 라이브러리는 GitHub에서 완전 오픈소스로 공개되어 기여를 받고 있으며, Mojo 컴파일러는 2026년 오픈소스화를 계획함
버전과 시작 자료
- 현재 안정 버전은 1.0.0b1 (May 7), 최신 nightly는 May 9임
- Mojo는 Python의 직관적 문법, Rust의 메모리 안전성, Zig의 강력하고 직관적인 컴파일 타임 메타프로그래밍에서 영감을 받음
- 컴파일되는 정적 타입 언어로서 에이전트형 프로그래밍에도 적합함
- 생산성과 성능 중 하나를 고르는 대신 둘 다 제공하는 것을 목표로 하며, 단순하고 익숙한 프로그래밍 패턴으로 시작해 필요할 때 복잡도를 추가할 수 있음
- 시작 경로로 Install Now, Quickstart, Releases, Roadmap, GitHub가 제공됨
- Markdown으로 페이지를 보려면 URL에 .md를 붙일 수 있고, 전체 Mojo 문서 인덱스는 llms.txt에서 확인 가능함
GPU와 Python 상호운용
-
GPU 프로그래밍
- Mojo는 벤더별 라이브러리나 별도 컴파일 코드 없이 GPU 프로그래밍에 접근할 수 있게 만드는 것을 목표로 함
- CPU에 쓰는 동일한 언어로 고성능 GPU 커널을 작성할 수 있음
- 예시 커널 vector_add는 TileTensor를 받아 global_idx.x를 기준으로 result[i] = a[i] + b[i]를 수행함
def vector_add(
a: TileTensor[float_dtype, type_of(layout), element_size=1, ...],
b: TileTensor[float_dtype, type_of(layout), element_size=1, ...],
result: TileTensor[
mut=True, float_dtype, type_of(layout), element_size=1, ...
],
):
var i = global_idx.x
if i < layout.size():
result[i] = a[i] + b[i]
-
Python 상호운용
- Mojo는 Python과 네이티브로 상호운용되며, 기존 코드를 전부 다시 쓰지 않고 성능 병목을 제거할 수 있음
- 하나의 함수에서 시작해, 필요에 따라 성능이 중요한 코드를 Mojo로 옮기는 방식으로 확장할 수 있음
- Mojo 코드는 Python에 자연스럽게 import되고 배포용 패키지로 함께 묶일 수 있음
- 반대로 Mojo 코드 안에서 Python 생태계의 라이브러리를 import할 수도 있음
- 예시 함수 mojo_square_array는 PythonObject의 ctypes.data에서 포인터를 얻고, SIMD 폭을 컴파일 타임에 계산해 배열 원소를 제곱함
# SIMD-vectorized kernel squaring array elements in place.
def mojo_square_array(array_obj: PythonObject) raises:
comptime simd_width = simd_width_of[DType.int64]()
ptr = array_obj.ctypes.data.unsafe_get_as_pointer[DType.int64]()
def pow[width: Int](i: Int) unified {mut ptr}:
elem = ptr.load[width=width](i)
ptr.store[width=width](i, elem * elem)
vectorize[simd_width](len(array_obj), pow)
컴파일 타임 메타프로그래밍
- Mojo의 메타프로그래밍은 런타임 코드와 같은 언어를 사용해 성능을 극대화하는 직관적 시스템을 제공함
- 조건부 컴파일로 하드웨어별 최적화를 만들고, 컴파일 타임 평가로 메모리 안전성을 보장하며, 비용이 큰 런타임 분기를 제거할 수 있음
- 의도를 명확히 드러내면서 비용 없는 추상화를 제공하는 것이 목표임
- 예시 __eq__ 구현은 컴파일 타임 리플렉션으로 구조체 필드 이름과 타입을 얻고, 모든 필드가 Equatable을 만족하는지 검사한 뒤 필드별 equality를 수행함
# Generic struct equality using compile-time reflection.
@always_inline
def __eq__(self, other: Self) -> Bool:
comptime r = reflect[Self]()
comptime names = r.field_names()
comptime types = r.field_types()
comptime for i in range(names.size):
comptime T = types[i]
comptime assert conforms_to(T, Equatable), "All fields must be Equatable"
if trait_downcast[Equatable](
r.field_ref[i](self)
) != trait_downcast[Equatable](r.field_ref[i](other)):
return False
return True
로드맵과 오픈소스
- Mojo는 2022년 말에 시작됐고, 아직 해야 할 일이 많음
-
Phase 0
- 초기 기반 구축 단계
- 핵심 파서, 메모리 타입, 함수, 구조체, 초기화자, 인자 규약, 기타 언어 기반을 구현하는 단계임
-
Phase 1
- 현재 진행 중인 단계
- CPU, GPU, ASIC에서 고성능 커널을 작성하기 위한 강력하고 표현력 있는 언어로 만들고, 개발자가 Python을 매끄럽게 확장할 수 있게 하는 것이 목표임
-
Phase 2
- 시스템 애플리케이션 프로그래밍 단계
- 보장된 메모리 안전성 모델과 시스템 프로그래밍 개발자가 기대하는 더 많은 추상화 기능을 지원하도록 확장하는 단계임
-
Phase 3
- 동적 객체 지향 프로그래밍 단계
- Python 코드와의 호환성을 최대화하기 위해 클래스, 상속, 타입 없는 변수 같은 Python의 동적 기능을 더 많이 지원하는 단계임
- 자세한 내용은 Mojo roadmap에서 확인 가능함
- Mojo 표준 라이브러리는 GitHub에서 완전 오픈소스로 공개되어 있으며 기여를 받고 있음
- Mojo 컴파일러는 2026년에 오픈소스화할 계획임
- Mojo 전체를 오픈소스화하겠다는 방침이 있지만, 언어가 아직 매우 젊기 때문에 공통 비전을 가진 밀접한 엔지니어 그룹이 커뮤니티 주도 방식보다 더 빠르게 움직인다고 판단함
- 참여 경로로 developer community가 제공됨
학습 및 커뮤니티 자료
-
Homepage
-
Tech blog
- Mojo 1.0 베타