본문 바로가기

GPT

새로운 프로그래밍 언어 Mojo! ChatGPT로 알아보자 (feat. Web Browsing)

반응형

새로운 프로그래밍 언어 Mojo! ChatGPT로 알아보자 (feat. Web Browsing)

유튜브를 보다가 새로운 프로그래밍 언어인 Mojo에 대해서 살짝 알게 되었다.
Python의 성능을 극대화한 언어라는데... Python에 관심이 있는 나에게는 흥미롭게 느껴졌다.
그러다 문득 ChatGPT의 Web Browsing이 생각났는데, 이 기능을 사용해서 한번 Mojo에 대해 간단하게 알아보는 시간을 가져보려 한다.
Question
Mojo 프로그래밍 언어에 대해서 가르쳐줘
Answer
Mojo는 새로운 프로그래밍 언어로, AI 개발자를 위해 설계되었습니다.
Python의 사용성과 C의 성능을 결합하여 AI 하드웨어의 프로그래밍 가능성을 극대화하고 AI 모델의 확장성을 향상시킵니다. Mojo는 Python 구문과 시스템 프로그래밍 및 메타프로그래밍의 장점을 결합하여 연구와 생산 사이의 간극을 메웁니다.
이를 통해 사용자는 C보다 빠른 이식 가능한 코드를 작성하고 Python 생태계와 원활하게 상호 작용할 수 있습니다.
Mojo는 모든 것을 한 언어로 작성할 수 있게 해주며, Python을 작성하거나 하드웨어 수준까지 세부 조정할 수 있습니다.
이는 C++ 또는 CUDA를 필요로 하지 않고 다양한 저수준 AI 하드웨어를 프로그래밍할 수 있게 합니다.

성능 측면에서는 Python의 성능을 극대화하고, 하드웨어의 전체 파워를 이용할 수 있습니다. 이는 여러 코어, 벡터 유닛, 그리고 특이한 가속기 유닛을 포함한 것으로, 세계에서 가장 진보된 컴파일러와 이기종 런타임을 이용할 수 있습니다. 이를 통해 C++와 CUDA와 동등한 성능을 복잡성 없이 달성할 수 있습니다.

Python 생태계 전체에 접근할 수 있으며, Python 생태계와 진정한 상호 운용성을 경험할 수 있습니다. 이를 통해 임의의 라이브러리들, 예를 들어 Numpy와 Matplotlib, 그리고 사용자의 맞춤 코드를 Mojo와 원활하게 섞어 사용할 수 있습니다.

또한, 모델과 Modular 스택을 쉽게 확장할 수 있습니다. 이는 사전 및 사후 처리 작업으로 모델을 쉽게 확장하거나, 사용자 정의 작업으로 작업을 대체하는 것을 포함합니다. 커널 퓨전, 그래프 재작성, 모양 함수 등을 활용할 수 있습니다.
요즘 같은 AI 시대에 AI 하드웨어의 성능을 더 올릴 수 있게 해준다니
심지어 Python 문법을 그대로 사용할 수 있다니! 상당히 관심이 생기는 언어이다.
그럼 Mojo와 Python의 차이점도 간단하게 한번 알아보자.
let은 불변값을, var은 가변값을 나타낸다.
def your_function(a, b):
    let c = a  // 'c'는 이제 불변.
    c = b  // 오류: 'c'는 불변.

    if c != b:
        var c = b  // 'c'는 이제 변경 가능.
        stuff()
또한 let과 var 선언은 타입을 지정할 수 있다.
def your_function():
    let x: SI8 = 42
    let y: SI64 = 17

    let z: SI8
    if x != 0:
        z = 1
    else:
        z = foo()
    use(z)
참고로, SI8은 8비트, SI64는 64비트의 부호 있는 정수를 나타낸다.

let과 var라니 JavaScript가 생각난다.
불변성을 가지는 let의 경우에는 오류 방지하는 데 도움이 되며, var 같은 가변성 변수는 동적인 데이터를 처리하거나 상태를 변경해야 하는 경우 유용하다.
JavaScript에서도 const/let을 구분해서 사용하면 선언한 변수의 사용처를 파악하기에 용이한데,
Mojo에서도 타입 안전성, 가독성, 오류 방지를 높이는데 도움이 많이 될 것으로 생각된다.


struct 타입
Mojo는 MLIR과 LLVM을 기반으로 하며, 이를 통해 데이터 구조에 대한 더 나은 제어와 직접적인 데이터 필드 접근 등을 가능하게 한다.
struct는 Python의 class와 유사하며 메소드, 필드, 연산자 오버로딩, 메타프로그래밍을 위한 데코레이터 등을 지원한다.
struct는 값 타입이며, 값 복사, 소멸자 호출 등을 수행한다.
또한, struct의 인스턴스는 스택에 할당될 수 있습니다.
struct Student {
    name: str,
    age: SI32,
}

def main() {
    let kim = Student { name: "Minsu", age: 24 }
    print("{0} is in {1} years old", kim.name, kim.age)
}
  • MLIR (Multi-Level Intermediate Representation) : Google에서 개발한 컴파일러 인프라스트럭처 프레임워크로, 다양한 수준의 추상화를 지원하는 중간 표현 방식.
  • LLVM (Low Level Virtual Machine) : 컴파일러와 툴체인 기술을 위한 프로젝트이다. LLVM은 컴파일러의 여러 단계를 위한 중간 표현(IR)과 다양한 최적화를 제공하며, 여러 하드웨어 플랫폼에 대한 코드 생성도 지원한다.
이 코드는 Student이라는 struct를 정의하고, main 함수에서 이를 사용하여 Student 타입의 kim 객체를 생성하고, 그 정보를 출력한다. struct는 이름과 나이라는 두 개의 필드를 가지고 있다.

위 코드를 실행하면 "Minsu is 23 years old"라는 문장이 출력될 것이다.

필드의 이름과 타입을 콤마로 구분하여 나열하는 방식으로 struct를 정의하며, 각 필드는 콜론(:)을 사용해 타입을 지정한다.
struct의 인스턴스는 중괄호({})를 사용하여 생성하며, 각 필드의 이름과 값을 콜론(:)을 사용하여 지정한다.
Python의 class와 차이는 아래와 같다.
  • 메모리 관리: Python의 클래스 인스턴스는 동적으로 할당되고 참조에 의해 관리되는 반면, Mojo의 struct 인스턴스는 값 타입이며, 값 복사와 소멸자 호출 등을 수행한다. 또한, struct의 인스턴스는 스택에 할당될 수 있다.
  • 변경 가능성: Python의 클래스 인스턴스는 기본적으로 변경 가능한 속성을 가진다. 즉, 인스턴스 생성 후에도 속성 값을 변경할 수 있는 반면 Mojo의 struct는 불변성을 가질 수 있다. let 키워드를 사용하여 struct 인스턴스를 선언하면, 그 인스턴스는 변경할 수 없게 된다.
  • 성능: struct는 시스템 프로그래밍 언어에서 일반적으로 사용되는 타입으로, 데이터 구조에 대한 직접적인 제어와 더 나은 성능을 제공할 수 있다.
물론, Mojo 언어가 아직 개발 중이므로 이러한 특징들은 앞으로 변할 수 있다.
구체적인 사용법이나 기능에 대해서는 항상 최신의 공식 문서나 커뮤니티 리소스를 참조하는 것이 좋다.


함수
Mojo의 함수는 타입을 지정할 수 있으며, 반환 타입을 명시적으로 선언해야 한다.
def sum(a: SI32, b: SI32): SI32
    return a + b
sum 함수는 두 개의 SI32 타입(32비트 부호 있는 정수) 매개변수를 받고, SI32 타입의 결과를 반환한다고 선언되어 있다.
이와 같이 타입을 명시하는 것은 프로그램의 실행 시간 오류를 줄이고 코드의 가독성을 향상시킨다.
하지만 Python은 동적 타입 언어이므로 이와 같은 선언이 필요하지 않다.

Mojo는 기본적으로 C와 같은 언어와 비슷한 정적 타입 체계를 사용하며, 이는 Python의 동적 타입 체계와는 큰 차이가 있다.
이렇게 정적 타입 체계를 사용하면 컴파일 시간에 많은 오류를 잡아낼 수 있으며, 코드의 실행 속도를 향상시키고 코드의 가독성을 높이는 데 도움이 될 것이다.
ChatGPT의 Web Browsing을 사용해서 Mojo에 대해 간단하게 알아보는 시간을 가졌다.
지금은 오픈 소스가 아니라 직접 사용해 볼 수는 없어서 확실하게 알지는 못하지만,
익숙한 Python 문법을 사용하면서도 빠른 성능을 자랑한다고 하니 설레는 마음으로 기다려봐야겠다.
커피 한 잔으로
저를 응원해주세요!
반응형

loading