시스템 프로그래밍: C와 C++은 대체될 수 있을까?

taypark·2020년 8월 31일
0
post-thumbnail

저수준 언어 - C와 C++를 대체할 수 있을까?

저수준 언어란 사람보다 기계에 좀 더 친화적이라는 말로 해석될 수 있다. 이는 프로그래밍언어와 컴파일러를 먼저 알 필요가 있다.

사전지식

  • 프로그래밍 언어

프로그래밍 언어는 컴퓨터와 대화할 수 있게 해주는 도구다. 하지만 프로그래밍 언어로는 컴퓨터와 대화를 할 수 없다. 한국인과 미국인이 있는데 각자 자기의 언어만 사용할 수 있다고 가정하면, 그 중간에 통역사가 필요하다. 그것을 우리는 특성에따라 컴파일러 혹은 인터프리터라고 한다.

  • 컴파일러

기계는 단순하다. 그래서 전압이 있다, 없다만 파악할 수 있고 이는 0과 1로 표현될 수 있다. 컴파일러와 인터프리터는 우리가 알아볼 수 있는 언어로 작성한 것을 기계가 읽을 수 있는 기계어로 번역한다. 이를 컴파일이라 한다.

컴파일러는 단순히 기계어로 번역해주는 작업만 하는것은 아니지만, 나머지 내용은 넘어가도록 하자.

  • 특정 프로그래밍 언어의 특성

프로그래밍 언어는 수백가지의 종류와 각각의 용도가 있다. 기억나는 용도는 다음과 같다.

    시스템 프로그래밍, 임베디드 시스템, 환경 구축, 기술 언어, 모바일 프로그래밍, 웹 프로그래밍, ....

      여기서는 앞의 2개를, 시스템 프로그래밍임베디드 시스템을 개발하는 C/C++에 대해 주로 다룬다.

      다시 본론으로 돌아가서, 저수준 언어는 조금 더 기계어와 가깝다는 뜻으로 해석이 된다. 즉 기계의 특정 부분을 조작하여 정보를 바꾸거나 연산을 시키는 등 기계적으로 좀 더 세부적인 컨트롤이 가능하다는 말이다. 그리고 이것이 가능한 언어가 대표적으로 기계어로 컴파일하는 C, C++, JVM위에서 바이트코드로 변환하여 실행하는 Java 정도이다.


      C, C++: 지루한 언어?

      C는 UNIX를 작성하기 위해 데니스 리치가 고안한 언어이다. 이는 아직까지, 특히 시스템이나 임베디드 프로그래밍에 널리 사용된다. 그래서 인터넷 레퍼런스와 책이 굉장히 많다. 전체 개발자 중 시스템 프로그래밍이나 임베디드를 사용하는 사람의 수가 적지만 오랫동안 쌓여온 지식이 존재한다.

      하지만 때로는 루즈한 언어이기도 하다. 다음의 이유 때문이다.

      • 언어 자체가 오래되었다.(1972년, 1983년)
      • 최근까지 계속해서 표준작업이 이어지고 있으로 굉장히 복잡하다. (C18, C++17이 최신판이며 C++은 C++20를 논의중이다.)
      • 특히 C++이 자유도가 높은 만큼 배워야할 양이 많고 방대하다.

      그래도 C와 C++

      아직까지 하드웨어 관련 고수준 언어는 C와 C++을 대적할 수 있는 언어가 많지 않다. 메모리 이슈를 잘 처리한다면 C와 C++만큼 퍼포먼스가 좋은 언어는 없다고들 말한다. 방대한 커뮤니티와 레퍼런스, 또한 C++의 경우 C++20에서 비동기 프로그래밍 지원, 컴파일 속도 향상을 위한 소스파일 모듈화, 구조화된 바인딩 등 모던 프로그래밍에서 중요한 요소들을 계속해서 추가하고있다.그래서 더 복잡해지고 있다.

      새로운 언어 Rust: 강력하고 모던한 언어

      웹 브라우저 파이어폭스를 개발하는 모질라 재단은 2015년에 Rust라는 언어를 정식으로 릴리즈했다.(발표는 2010년에 했다.) 다음과 같은 특징을 갖는다.

      • 컴파일 언어
      • 동시성 프로그래밍
      • 병렬 프로그래밍
      • C/C++과 유사한 퍼포먼스
      • 빠른 빌드
      • 소유권(Ownership): Rust의 모든 값은 값이 대입된 변수나 구조체 필드, 넘겨받은 함수 인자 등의 이름에 귀속된다.
      • 강력한 메모리 관리 컴파일: C/C++처럼 코드를 기계어로 만들면서 컴파일 오류를 잡아 문제가 있으면 컴파일 되지 않는다. 즉 메모리 오류는 컴파일타임에 잡아낸다. 이는 소유권이라는 개념을 통해 구현된다.
      • 높은 호환성: 퍼포먼스가 필요한 곳에 다른 언어 대신 사용될 수 있다. 이는 Rust Cpython을 사용한 예이다. https://developers.redhat.com/blog/2017/11/16/speed-python-using-rust/ 를 참조하면 된다.
      • 패키지 매니저가 존재한다: Cargo라고 한다. 즉 커뮤니티 및 프레임워크, 라이브러리가 커지는 속도가 빠르다.
      • 웹 어셈블리(WASM)에서 지원: Rust를 발표한 모질라 공식 자료 2가지: https://developer.mozilla.org/ko/docs/WebAssembly/Conceptshttps://developer.mozilla.org/ko/docs/WebAssembly/Rust_to_wasm 를 참조하면된다.

      러스트는 아래의 큼직한 프로젝트에서 사용된다.

      Cloudflare(CDN서비스와 DNS서비스를 제공하는 세계적 기업), AWS Lambda, npm(node package manager), libra(페이스북의 암호화폐), Servo(모질라의 병렬 웹프라우저 엔진. 삼성과 통합개발 중) ... 참고로 Cloudflare와 npm은
      C를 Rust로 대체했다.

      그리고 memory safety로 인해 이러한 곳에서 사용될 수 있다. 즉 절대로 실패해선 안되는 곳들에서 사용된다.

      과학계산, 금융거래, 자동차 에어백이나 비행기 산소호흡기같은 안전관련 등...


      단점도 존재한다.

      • 언어 명세의 복잡성: C/C++을 대체할 수준으로 언어를 명세화하다보니 언어 자체가 어려워지고있음.하지만 C++은 너무....
      • 독보적인 memory safety능력이 있지만 C++도 제대로 작성했다면 문제가 발생할 확률은 낮다.

      결론

      C/C++은 검증된 언어이다. 다른언어들의 장점을 흡수하여 명세서가 추가되고 있고, 모던 프로그래밍을 위한 C++의 노력도 찾아볼 수 있다.단 C lang 5의 것을 지금 추가할 뿐이다. 무엇보다도 여태까지 사용해왔고 앞으로도 사용될 것이라는 점에서 믿을만하다.

      하지만 Rust는 모던 개발스트림에서 태어났고, 개발되고있다. 적지 않은 프로젝트, memory safety, 빌드타임, 동시성과 병렬성, 그리고 패키지 매니저에 강력한 퍼포먼스까지 갖추었다. 개발자 커뮤니티인 스택 오버플로우에서 파이썬과 자바스크립트를 제치고 83.5퍼센트의로 "개발자에게 가장 사랑받는 언어" 1위를 차지, 구글 트렌드나 각종 랭킹 사이트에서 수치가 증가하고 있는 점을 고려하면 미래가 밝은 언어라고 할 수 있다.

      참고자료

      https://www.youtube.com/watch?v=S-01KjUJ3_Q

      https://www.reddit.com/r/rust/comments/bya8k6/programming_with_rust_vs_c_c/

      https://namu.wiki/w/Rust

      http://www.ciokorea.com/news/112731

      https://github.com/rust-lang/rust-bindgen

profile
인생은 하드코어하게

0개의 댓글