관리언어는 정말 느린가?

말씀하신 런타임이라는 개념은 Go의 런타임 뿐 아니라 다른 관리 언어들의 런타임들을 통칭하는 개념같군요.

2개의 좋아요

런타임은 "관리코드를 컴파일하고 실행하는 프로세스"를 통칭하는 개념이 맞습니다.
C#에서는 CLR이라는 이름으로, Java 에서는 JVM 이라는 이름을 가지고 있죠.

이 두 진영에서 런타임 자체는 네이티브 코드입니다.
즉 OS 별로 (같은 기능을 하는) 네이티브 코드가 존재하는 것이죠.

Go 는 이와는 달리, OS 별 컴파일러가 존재하죠.
C#, Java 의 런타임이라는 개념을 라이브러리로 제공해서, 메모리 안정성과 보안 문제를 해결하고 있는 것이죠.

3개의 좋아요

관리언어란 단어의 출처는 잘 모르겠는데

관리코드란 용어는 MS가 만든게 맞는거 같군요.

2개의 좋아요

Go가 C# 대비 빠르다고 여겨지는건 네이티브 바이너리를 생성하는 컴파일 언어이고 이게 기본이기 때문입니다. Go로 컴파일한 네이티브 바이너리를 실행할때는 VM 같은 별도의 런타임 환경이 필요 없죠. 반면 C# 하면 닷넷을 먼저 생각하지 NativeAOT를 먼저 생각하지 않죠.

1개의 좋아요

온라인 게임 서버의 경우 가장 고성능을 요구하는 장르가 MMORPG 입니다. 이미 몇년전부터 MMORPG 게임 서버를 C# 으로 만들고 있습니다. 이미 서비스 중인 유명 게임들도 있습니다. 이제 성능 이야기는 별 의미 없을 것 같습니다. 자신과 팀이 어떤 언어를 잘 다룰 수 있냐가 선택 사항일 것 같습니다

3개의 좋아요

프라우드넷이 C#으로 개발해서 C++로 포팅 되었습니다.
고성능서버에 GC는 독약입니다.
디스코드 서버도 Go로 개발해서 Rust로 선회했다고 합니다.

1개의 좋아요

인식이 그럴 수 있겠네요.

디스코드도 Go로 했었군요.
현재 Rust인 것은 아티클을 보고 알고 있습니다 ㅎㅎ

네 말씀하신 취지와 의도는 잘 알고 있습니다.

윗분들의 의견대로 Go는 제가 GC만 가지고 관리언어라고 잘못 비교했던 것 같고, .NET도 NativeAOT가 있으니 괜찮을 것 같습니다.

다만 Rust는 성능이 좀 다를 거라고 생각이 드는 부분이 있어서, 일반적이고 대부분의 경우라면 .NET이 큰 문제는 없겠지만 게임서버 이상의 대용량 처리가 필요한 서비스가 있다면 Rust 같은 것을 생각하지 .NET을 먼저 생각하지는 않을 것 같고 저도 또한 그정도 .NET은 해본적이 없는지라, 막연하게 궁금한 것이 있었습니다.

저도 .NET을 좋아하고 어그로를 끌려는 것은 아니며 .NET도 트레이드오프로서 매력과 장점을 가지고 있다고 생각합니다.

하지만 진짜로 완전히 미세한 성능까지 생각해야하는 분야에서 종사하시는 분들은 Rust말고 다른걸 생각을 잘 안하시는 것 같아서 좀 궁금했던 게 있었습니다 ㅎㅎ

2개의 좋아요

Rust를 학습으로 조금 깊게 들어가본적은 있지만 저도 실제 사용은 하지 않아서 자세히 안다고 할 수 없지만 Rust는 이 언어의 특징 때문에 기존 방식으로 프로그래밍하기 무척 어려웠습니다. 간단한 예제 코드는 쉽게 만들 수 있지만 규모 있는 프로그램을 만들 때는 특유의 메모리 관리 방식 때문에 컴파일 자체가 안되는 경우가 자주 발생합니다.

저는 Rust는 C 언어를 사용하는 사람은 좀 쉽게 적응할 수 있겠지만 C++을 했던 사람에게는 무척 불편한 언어라고 생각합니다. Rust를 사용할 때는 OOP는 안하겠다고 생각해야지 이 방식을 추구하면 무척 힘들어지더군요.

.NET도 NativeAOT을 사용하면 초기 실행 때 빠르게 실행되고, 메모리를 절약할 수 있을 뿐이지 실행속도는 별로 차이나지 않거나 혹은 더 느린 경우도 있습니다.
.NET이 실행하면서 나름 최적화하는 코드를 만드는데 AOT를 하면 이것이 안되니까요. AOT는 클라이언트 프로그램 만들 때는 괜찮을지 모르겠지만 서버 개발에는 큰 도움은 되지 않을 것으로 생각합니다

2개의 좋아요

이것은 Rust의 러닝커브…라고 생각합니다. 모든 언어에 있는 러닝커브이나…Rust가 좀 더 어려운 수준에 속한다고 생각합니다. 제가 접한 모든 개발자들이 Rust는 하나같이 입모아서 처음시작이 어려웠다고 했었기도 했었습니다.

마치 언어라는 게 처음엔 for if로만 개발하다가 심화적으로, 현대적으로 개발이 시작되면서 고급 키워드, 기능을 사용하는 것과 달리, Rust는 싹다 처음부터 다 알고 들어가야한다고 좀 느낌이 왔었습니다.

하지만 이 부분만 지나고 나면 괜찮다고 주변 러스타시안 분들이 격려해주시더라구요 ㅎㅎ

오…그랬군요. NativeAOT에 대한 새로운 관점 감사드립니다!

Rust에 관한 의견에 정확하게 동의 합니다.
Rust의 강점을 설명하기 위해 메모리 관리가 마치 쉬운것처럼 설명하는 글이 많은데요. 실제 해 보면 전혀 다르죠.
강력한것은 맞지만 쉽지는 않은… 거기다 관리 방식 자체도 기존 언어들과 많이 다르다보니 러닝커브가 급격하게 상승하죠.

그래서 제가 내린 결론는 그냥 C++로 최신 표준을 적용해서 개발하자 입니다.
거기다 코어 가이드라인도 준수하고요.

개인적으로 메모리 관리에 한정하자면 std::vector, std::span(gsl::span), std::array
reinterpret_cast 사용 자제(타겟을 생성 후 복사 하든가? 사용할거면 꼼꼼하게)
거기에 algorithm헤더 사용. 컨테이너에서 삭제 시 신경 좀 쓰는 정도?
정도면 뻑날일 없다고 봅니다… (장담까지는 무리가 있겠네요)

3개의 좋아요