[RUST언어] RUST 언어의 시작 (1) - RUST언어로 C/C++을 대체 할 수 있을까 ?
[ RUST 언어 개요 ]
Rust는 시스템 프로그래밍 언어로, Mozilla에서 개발된 오픈소스 언어입니다. Rust는 메모리 안전성과 고성능을 동시에 제공하기 위한 목적으로 만들어졌습니다.
Rust는 C와 같은 저수준 언어의 성능을 유지하면서도, 메모리 안전성을 보장하는데 중점을 둡니다. 이를 위해 Rust는 메모리 관리를 수동적으로 할 필요가 없으며, 자동으로 메모리 안전성을 보장합니다.
또한, Rust는 함수형 언어의 개념과 패턴 매칭 등의 기능도 지원하며, 매크로와 같은 강력한 코드 생성 기능도 제공합니다. 이러한 기능들은 Rust로 복잡한 시스템을 쉽게 구현할 수 있게 해주며, 유지보수성과 확장성도 높일 수 있습니다.
Rust는 다양한 분야에서 사용될 수 있습니다. 예를 들어, 시스템 프로그래밍, 웹 서버, 게임 개발, 블록체인, 데이터베이스, 컴파일러 등의 분야에서 활용될 수 있습니다. Rust는 안정적이며, 성능과 안전성을 동시에 보장합니다.
예시로 보는 C 와 Rust 언어 비교
(예시) C언어로 파일 읽고 쓰기
다음은 C언어로 작성된 `파일을 읽고 다른 파일로 읽은 내용을 저장`하는 소스입니다. 다음으로 Rust 로 유사하게 작성된 소스를 보면서 두 언어의 차이를 비교해 보고자 합니다. 마지막으로 Python 언어로 변환을 해 보았는데 아직 Rust은 익숙하지 않은 문법입니다. 다만 예외 처리가 좀더 함축적이어서 기존 언어의 소스보다 간결하게 보입니다.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int write_to_file(FILE *output_file, const char *message) {
int result = fputs(message, output_file);
if (result == EOF) {
return -1;
}
return 0;
}
int main() {
FILE *input_file = fopen("input.txt", "r");
if (input_file == NULL) {
perror("Error opening input file");
exit(EXIT_FAILURE);
}
FILE *output_file = fopen("output.txt", "w");
if (output_file == NULL) {
perror("Error opening output file");
exit(EXIT_FAILURE);
}
char *line = NULL;
size_t len = 0;
ssize_t read;
while ((read = getline(&line, &len, input_file)) != -1) {
if (write_to_file(output_file, line) != 0) {
perror("Error writing to output file");
exit(EXIT_FAILURE);
}
}
free(line);
fclose(input_file);
fclose(output_file);
exit(EXIT_SUCCESS);
}
(예시) Rust 언어로 파일 읽고 쓰기
- C언어와 마찬가지로 파일을 읽고 읽은 내용을 다시 파일로 저장하는 것을 함수로 구현하였습니다.
일부 특이한 내용들이라면 예외 처리에 대한 특수 기능들에서 차이가 있습니다.
# 라이브러리 모듈 Import
use std::fs::File;
use std::io::{BufRead, BufReader, Write};
# 함수 선언
fn write_to_file(output_file: &mut File, message: &str) -> std::io::Result<()> {
output_file.write_all(message.as_bytes())?;
Ok(())
}
fn main() -> std::io::Result<()> {
// 입력 파일 열기
let input_file = File::open("input.txt")?;
let input_reader = BufReader::new(input_file);
// 출력 파일 열기
let mut output_file = File::create("output.txt")?;
// 입력 파일에서 읽은 내용을 출력 파일에 쓰기
for line in input_reader.lines() {
let message = line?;
// (3) 함수 호출
write_to_file(&mut output_file, &message)?;
}
// 파일 닫기
Ok(())
}
(1) 모듈 Import : 라이브러리 참조 : use module_name
use module_name::{Symbol1, Symbol2}; 구문은 열거형으로 모듈내의 아이템을 한번에 불러올수 있습니다. Symbol1과 Symbol2 등의 모듈 내에 정의된 구조체, 열거형, 함수 등을 포함한 모듈 내의 아이템에 해당합니다.
* use std::io::{BufRead, BufReader, Write};
는 아래와 같이 반복적인 import 모듈을 열거형으로 작성한 것입니다.
use std::io::BufRead;
use std::io::BufReader;
use std::io::Write;
(2) 함수 선언 : fn my_function(arg1: i32, arg2: &str) ->
`fn write_to_file(output_file: &mut File, message: &str) -> std::io::Result<()> { ... }`
write_to_file 함수는 output_file이라는 &mut File 타입의 가변 참조와 message라는 &str 타입의 문자열 슬라이스를 인수로 받습니다.
- `&mut File` 타입은 파일을 열고 작성을 할 수 있는 가변 참조를 나타냅니다.
- `&str` 타입은 문자열 슬라이스를 나타내며, 이 경우 message 인수는 읽기 전용 참조로 전달됩니다.
- 결과값으로는 `std::io::Result<()>` 타입이 반환됩니다. Result 타입은 함수 결과가 성공 이면 `Ok(())`을 오류이면 발생된 에러를 반환 합니니다.
(3) 함수 호출
write_to_file(&mut output_file, &message)?; 코드는 output_file 파일에 message 문자열을 쓰는 함수인 write_to_file를 호출하고, 에러가 발생하지 않으면 다음 라인을 실행합니다.
- `&mut output_file` 는 File 타입의 mutable reference이고
- `&message`는 문자열 &str의 call by reference 모델 입니다.
- `?` 는 Rust의 error handling 문법 중 하나로, 함수 성공시 Ok(())를 반환하고, 에러 발생 시 에러를 반환하고 함수를 종료하는 Rust의 에러 처리 기능입니다.
(예시) Python 언어로 파일 읽고 쓰기
- 파이썬 언어로 변환해 보았는데 python 이 더 간결하고 친숙 하네요.
from typing import TextIO
import io
def write_to_file(output_file: TextIO, message: str) -> None:
output_file.write(message)
if __name__ == '__main__':
try:
# 입력 파일 열기
with open("input.txt", "r") as input_file:
# 출력 파일 열기
with open("output.txt", "w") as output_file:
# 입력 파일에서 읽은 내용을 출력 파일에 쓰기
for line in input_file:
message = line.strip()
write_to_file(output_file, message)
# 예외 처리
except IOError as e:
print("I/O error occurred: {}".format(e))
finally :
# 파일 닫기
input_file.close()
output_file.close()
C언어와 RUST 프로그램의 구조 비교
C언어로 작성한 일반적인 구조
// 모듈 임포트
#include <module_name.h>
// 상수 선언
const int MY_CONSTANT = 100;
// 타입 선언
struct MyStruct {
int field1;
std::string field2;
};
// 함수 정의
bool my_function(int arg1, const char* arg2) {
// 함수 본문
return true;
}
// 진입점 함수
int main() {
// 프로그램 시작
return 0;
}
RUST언어로 작성한 구조
// 모듈 임포트
use module_name::{Symbol1, Symbol2};
// 상수 선언
const MY_CONSTANT: i32 = 100;
// 타입 선언
struct MyStruct {
field1: i32,
field2: String,
}
// 함수 정의
fn my_function(arg1: i32, arg2: &str) -> bool {
// 함수 본문
true
}
// 진입점 함수
fn main() {
// 프로그램 시작
}
3. RUST 언어와 C언어 특징 비교
Rust와 C 언어는 모두 시스템 프로그래밍을 위해 만들어졌으며, 저수준 언어로서 성능이 중요합니다. 그러나 Rust와 C 언어는 몇 가지 차이점이 있습니다.
1. 메모리 관리의 안정성
- Rust는 안전성과 메모리 관리를 위해 컴파일러 수준에서 제공하는 메모리 안전성 검사와 소유권 시스템(Ownership)을 사용합니다. 따라서 Rust는 메모리 누수 및 다른 메모리 관련 오류를 방지하면서 안전하고 효율적인 코드를 작성할 수 있습니다. C/C++는 메모리 안전성 검사를 제공하지 않기 때문에 프로그래머가 메모리를 수동으로 할당하고 해제해야 합니다.
- 메모리 안전성 검사 :
Rust 컴파일러가 프로그램을 컴파일할 때 메모리 관리 오류를 방지하기 위해 자동으로 사용됩니다. 이 기능은 Rust가 다른 언어와 구별되는 가장 중요한 특징 중 하나입니다. Rust에서는 변수에 대한 참조가 유효한지 검사 "빌림 검사(borrow checking)"를 수행하여 코드의 안전성을 보장합니다.
- 소유권 시스템(Ownership):
Rust에서는 메모리 안전성 검사와 더불어 변수에 대한 소유권을 추적하고, 각 변수에 대한 소유권이 정확하게 관리되는지 검사합니다. Rust에서는 하나의 변수에 대한 소유권이 넘어가면, 해당 변수에 대한 변경이 불가능해지고, 대신 새로운 변수에 대한 소유권이 부여됩니다. Rust는 컴파일 시점에서 소유권 시스템을 통해서 메모리 사용의 규칙을 위반하는 것을 점검하여 위반되는 경우 컴파일이 되지 않습니다. 이를 통해서 Rust는 가비지 컬렉션 없이도 메모리의 안정성을 보장 할 수 있습니다.
소유권의 규칙
. Rust의 각 값에는 소유자가 있습니다.
. 한번에 한명의 소유자만 가능합니다.
. 소유자가 범위를 벗어나면 값은 삭제 합니다.
2. 문자열 처리
- Rust는 문자열 처리에 대한 안전한 방식을 제공합니다. Rust의 문자열은 UTF-8 인코딩을 사용하며, 이를 위해 문자열 처리를 위한 라이브러리가 제공됩니다. C 언어에서는 문자열 처리에 대한 기본 함수가 제공되지만, 보안 취약점이 발생할 수 있습니다.
문법
Rust는 C/C++와 다른 문법을 가지고 있습니다. 예를 들어, Rust에서는 함수 호출 시 괄호 안에 콤마로 구분된 인수 리스트를 사용합니다. C/C++에서는 인수를 괄호 안에 쉼표로 구분합니다. Rust에서는 세미콜론으로 구분된 문장을 사용하여 표현식과 문을 구분합니다. C/C++에서는 중괄호로 구분합니다.
성능
C/C++는 하드웨어와 밀접한 관련이 있어서 높은 성능을 발휘할 수 있습니다. Rust는 C/C++와 유사한 수준의 성능을 제공하지만, Rust는 안전성 및 메모리 관리 기능을 제공하는 것이 우선이기 때문에 일부 상황에서 C/C++보다 약간 느릴 수 있습니다.
생산성
Rust는 안전성 검사 및 소유권 시스템으로 인해 초기 개발 시간이 늘어날 수 있습니다. C/C++는 Rust보다 개발 시간이 짧을 수 있지만, 메모리 관리와 관련된 오류가 발생할 가능성이 높습니다. 따라서 C/C++는 초기 개발 속도가 빠르지만, 보안 및 안정성 측면에서 제약이 있을 수 있습니다.
- Rust는 C 언어보다 생산성이 높습니다. Rust는 안전한 메모리 관리와 코드 생성 기능 등을 제공하여 복잡한 시스템을 쉽게 구현할 수 있게 해줍니다. 이는 개발자의 생산성을 높이는 데 도움이 됩니다.
생태계
/C++는 거의 모든 운영 체제에서 지원되는 고전적인 언어로, 라이브러리와 도구가 풍부합니다. Rust는 비교적 새로운 언어이지만, 빠른 성장을 보이며 라이브러리와 도구가 지속적으로 발전하고 있습니다. Rust는 메모리 안전성 및 소유권 시스템으로 인해 좀 더 안전하고 신뢰할 수 있는 코드를 작성할 수 있도록 도와주는 라이브
3. 컴파일러
- Rust는 LLVM 기반의 컴파일러를 사용합니다. 이를 통해 최적화가 가능하며, C 언어와 같이 컴파일러 옵션을 사용하여 성능을 향상시킬 수 있습니다.
* LLVM(Low Level Virtual Machine의 약자)은 다목적 컴파일러 인프라입니다. LLVM은 프로그래밍 언어를 컴파일하는
기계어로의 변환을 담당하는 중간 표현(IR, Intermediate Representation)을 사용합니다.
C, C++, Rust, Swift, Ada, Fortran, Kotlin 등 다양한 언어로 작성된 소스 코드를 LLVM IR로 변환 할 수 있습니다.
4. 패턴 매칭
- Rust는 패턴 매칭을 지원합니다. 이는 C 언어에서는 구현되어 있지 않습니다. 패턴 매칭은 코드의 가독성과 유지보수성을 높이는데 도움이 됩니다.
이러한 차이점들은 Rust와 C 언어를 비교할 때 고려해야 할 요소입니다. Rust는 안전한 메모리 관리와 강력한 기능 등을 제공하며, C 언어는 성능과 호환성 등에 강점을 가지고 있습니다.
[RUST 언어가 향후 금융 시스템에서 채택 할 수 있을까요 ?]
최근 금융 시장에서도 클라우드 전환과 오래된 기존 시스템들을 개선해야 하는 과제가 있습니다. 기존 시스템은 주로 C언어를 근간으로 개발되어 있어서 개발자도 부족하고, 시스템도 점점 복잡해 지면서 유지보수나 새로운 업무도 어려워지고 있습니다. 전체시스템을 차세대 하기보다는 시간과 리소스가 많이 투여되기 때문에 부분적으로 Reverse Engineering을 통해서 프로그램을 개선해야 하는 상황입니다.
더욱이 오랫동안 사용해온 비즈니스 로직이나 커스트마이징된 자체 개발 프레임웍은 새로운 개발 환경으로 전환하는 데 더 큰 과제가 될 것으로 보입니다.
최근의 Java, Python, Node.js, PHP 등과 같은 대중화된 프로그램 으로 전환을 하려고 하지만 고속으로 작동되는 기존 C언어의 특성을 대체하는데 마땅한 방안을 찾기에는 경험과 신뢰가 부족한 상태입니다.
이러한 측면에서 C언어 와 유사하면서도 고속의 데이터 처리가 가능하고, 기존의 C언어 보다 메모리 관리의 효율성과 고 성능을 제공하는 점에서 RUST 언어는 새로운 변화가 필요한 금융시작의 출발점이 될 것으로 기대를 해봅니다.
다만 금융에서 사용하기 위해서는 단순한 언어의 숙련만 필요한 것이 아니라 기존의 업무를 이해하고 재설계를 하거나, 예전의 환경과 새로운 환경으로 전환 하기 위한 인력들의 양성이 더 시급한 과제가 될 것 같습니다.
그러나 아직 미숙한 시장 환경이라는 점이 미래의 대체가 될 것이라는 희망과 현실은 아직 차이가 있어 보입니다.
앞으로 학원에서 부터 많은 개발자들의 관심과 기술 인력 양성이 된다면 수 년 내에 새로운 변화를 이끌어 갈수 있다고 봅니다.
'Programming' 카테고리의 다른 글
[RUST언어] RUST 언어의 시작 (2) - 변수의 특성과 선언하기 (3) | 2023.05.16 |
---|---|
[python] Selenium - 웹페이지 링크로 페이지 이동 - find_element와 ExpectedConditions 응용 (2) | 2023.05.04 |
[python] Selenium 웹스크래핑- 웹페이지 객체 찾는 방법 정리 - find_element 와ExpectedConditions (2) | 2023.05.02 |
[python] Selenium 웹스크래핑 - 제목과 내용 수집하기 (2) | 2023.04.28 |
[Python] SQLAlchemy: ORM을 이용한 테이블 조회 활용 (5) - 응용 예시 (0) | 2023.04.11 |
[Python] SQLAlchemy : ORM 쿼리 결과 부분 조회 처리 (4) (1) | 2023.04.06 |
[Python] SQLAlchemy : ORM filter와 filter_by 사용법 비교(3) - filter_by (0) | 2023.04.06 |