디시인사이드 갤러리

갤러리 이슈박스, 최근방문 갤러리

갤러리 본문 영역

부록 B: 동일 안전성 목표 하의 코드 비교 - Rust vs. Ada/

루비갤로그로 이동합니다. 2025.07.03 19:19:59
조회 38 추천 0 댓글 2

llm이 써 준 부록이다..

더 나은 예제가 있는지 찾아봐야겠어.



부록 B: 동일 안전성 목표 하의 코드 비교 - Rust vs. Ada/SPARK


이 부록은 본문 5장에서 철학적 차원으로 다룬 ‘의도 중심’과 ‘규칙 중심’의 설계 방식이, 실제 코드에서는 어떻게 구현되는지 구체적으로 비교 분석합니다.


이를 위해, ‘정수 오버플로 방지’라는 동일한 안전성 목표를 설정하고, 각 언어가 이 문제를 해결하는 접근 방식과 그 과정에서 개발자가 겪는 경험이 어떻게 다른지 독자 여러분께서 직접 판단하실 수 있도록 구성했습니다.


비교 과제: 32비트 정수 배열의 합계를 오버플로 없이 안전하게 계산하기


우리의 목표는 32비트 정수(i32)로 이루어진 배열의 합을 구하는 함수를 만드는 것입니다. 이 과정에서 합계가 32비트 정수의 최댓값을 넘어 발생하는 ‘정수 오버플로(Integer Overflow)’를 반드시 방지하거나, 안전하게 처리해야 합니다.


접근법 1: 러스트 (Rust) - ‘실패 관리’를 통한 안전성


러스트의 접근 방식은 연산이 실패할 수 있음을 인정하고, 그 실패 가능성을 타입 시스템으로 명시하여 호출자가 반드시 처리하도록 강제하는 것입니다.


// [src/main.rs]


// 오버플로가 발생하면 'None'을 반환하여, 실패를 명시적으로 알립니다.

fn checked_sum(slice: &[i32]) -> Option<i32> {

    let mut total: i32 = 0;

    for &item in slice {

        // total에 item을 더한 값이 i32의 범위를 넘으면 None을 반환하고 함수를 즉시 종료합니다.

        // 이것이 러스트 방식의 '실패 처리'입니다.

        total = total.checked_add(item)?;

    }

    Some(total)

}


fn main() {

    let numbers_ok = vec![1_000_000_000, 1_000_000_000];

    let numbers_overflow = vec![2_000_000_000, 2_000_000_000];


    // 성공 사례 처리

    if let Some(result) = checked_sum(&numbers_ok) {

        println!("[OK] The sum is: {}", result);

    } else {

        println!("[OK] The sum overflowed!");

    }


    // 실패 사례 처리

    if let Some(result) = checked_sum(&numbers_overflow) {

        println!("[Overflow] The sum is: {}", result);

    } else {

        println!("[Overflow] The sum overflowed!");

    }

}


실행 결과:


[OK] The sum is: 2000000000

[Overflow] The sum overflowed!


러스트 방식 분석


핵심 철학: 실패 관리(Failure Management). 오버플로는 발생할 수 있는 ‘실패’이며, Option<T> 타입을 통해 이 실패 가능성을 호출자에게 명확히 전달합니다.


개발자 사고 과정: 개발자는 “이 연산은 실패할 수 있으니, 실패를 알려주는 checked_add 함수를 써야겠다”고 생각합니다. 컴파일러는 ? 연산자와 Option 타입을 통해, 그 실패를 호출자가 if let 등으로 처리하도록 강제합니다.


어려움: 개발자는 러스트의 소유권 규칙과 Option/Result로 대표되는 에러 처리 패러다임에 익숙해져야 합니다. 즉, 컴파일러의 ‘규칙’에 적응하는 것이 주된 허들입니다.


안전성의 기본값: 릴리즈 모드에서는 성능을 위해 오버플로를 허용(wrapping)하는 것이 기본값입니다. 안전은 checked_add처럼 **‘선택(Opt-in)’**해야 합니다.


접근법 2: Ada/SPARK - ‘설계 기반 실패 방지’를 통한 안전성


Ada/SPARK의 접근 방식은 설계 단계에서부터 실패 가능성 자체를 원천적으로 제거하여, 런타임에 오류가 발생할 여지를 남기지 않는 것입니다.


-- [my_math.ads - 명세 파일]

package My_Math with SPARK_Mode is


   type Integer_Array is array (Integer range <>) of Integer;


   -- 합계가 32비트 정수(Integer) 범위를 넘을 수 있음을 '의도'하고

   -- 반환 타입을 64비트 정수인 Long_Long_Integer로 명시적으로 설계합니다.

   function Sum (Arr : Integer_Array) return Long_Long_Integer;


end My_Math;



-- [my_math.adb - 구현 파일]

package body My_Math with SPARK_Mode is


   function Sum (Arr : Integer_Array) return Long_Long_Integer is

      -- 계산 과정에서 오버플로가 발생하지 않도록

      -- 누적 변수(Total) 역시 64비트 정수 타입을 사용합니다.

      Total : Long_Long_Integer := 0;

   begin

      for I in Arr'Range loop

         Total := Total + Long_Long_Integer(Arr(I));

      end loop;

      return Total;

   end Sum;


end My_Math;


증명 결과: SPARK의 정적 분석 도구(GNATprove)는 이 코드를 분석한 후, 어떤 입력에 대해서도 런타임 오류(오버플로 포함)가 절대 발생하지 않음을 수학적으로 증명하고 “Proved” 메시지를 출력합니다.


Ada/SPARK 방식 분석


핵심 철학: 설계 기반 실패 방지(Failure Prevention by Design). 32비트 정수들의 합은 32비트를 넘을 수 있다는 사실을 인지하고, 64비트라는 더 큰 그릇을 준비하여 오버플로가 ‘물리적으로 불가능한’ 코드를 설계합니다.


개발자 사고 과정: 개발자는 “결괏값이 이 범위를 넘을 수 있으니, 더 큰 타입을 써야겠다”는 ‘의도’를 코드(타입 선언)로 직접 표현합니다. SPARK 도구는 개발자의 의도가 타당하며, 그 결과 런타임 오류가 발생하지 않음을 증명해주는 역할을 합니다.


어려움: 개발자는 코딩에 앞서 문제의 속성(값의 범위 등)을 먼저 분석하고, 그것을 해결할 수 있는 올바른 타입과 로직을 사전에 설계해야 합니다. 즉, 개발자의 ‘의도’를 명확히 정의하는 것이 주된 허들입니다.


안전성의 기본값: 일반적인 Ada 코드는 기본적으로 모든 연산에서 오버플로를 검사하는 ‘런타임 체크 코드’를 자동으로 삽입하고, 오류 발생 시 복구 가능한 예외(Constraint_Error)를 발생시킵니다. SPARK는 이 런타임 체크가 필요 없을 정도로 코드가 완벽함을 증명하여, 개발자가 안심하고 런타임 체크를 비활성화하여 최고의 성능을 얻을 수 있도록 보장하는 역할을 합니다.


결론: 두 방식의 비교

구분러스트 (Rust)Ada/SPARK
핵심 철학실패 관리 (Failure Management)설계 기반 실패 방지 (Failure Prevention by Design)
개발자 사고 과정규칙 준수 (컴파일러의 에러 처리 규칙)의도 명세 (문제 해결을 위한 사전 설계)
안전성 확보 주체컴파일러의 자동화된 강제개발자의 설계 + 도구의 수학적 증명
주요 어려움언어의 고유한 패러다임(소유권, Option)에 대한 적응문제에 대한 형식적이고 논리적인 사전 분석 및 설계
안전성의 기본값성능 우선 (안전은 Opt-in)안전 우선 (성능 최적화는 Opt-out)

추천 비추천

0

고정닉 0

0

댓글 영역

전체 댓글 0
본문 보기

하단 갤러리 리스트 영역

왼쪽 컨텐츠 영역

갤러리 리스트 영역

갤러리 리스트
번호 제목 글쓴이 작성일 조회 추천
설문 현역으로 군대 안 간게 의아한 스타는? 운영자 25/06/30 - -
AD 휴대폰 바꿀까? 특가 구매 찬스! 운영자 25/07/02 - -
2869601 러스트 극성 지지자들의 '발작' 포인트: 짧고 강하게 짚어보기 루비갤로그로 이동합니다. 07.04 35 0
2869600 난 군대있을때 배구공(119.202) 07.04 44 0
2869599 나훈아 씨가 말한 슈퍼스타의 조건. 팬들만 미치게 해서는 부족하다. 프갤러(223.54) 07.04 26 0
2869598 나는 러스트를 욕한적 없고 커널이 동적링킹한다는 말도 한 적이 없다. [22] 루비갤로그로 이동합니다. 07.04 83 4
2869597 러스트 까들은 자신의 열등한 지능을 숨기려 llm 츠쿠요미로 도망쳤지만 프갤러(223.33) 07.04 23 1
2869596 러스트 1. 베어메탈 임베에서도 문제, 2. 리눅스 임베에서도 문제 루비갤로그로 이동합니다. 07.04 25 0
2869595 러스트하면 눈을 뒤집고 욕하는 놈들의 심리 프갤러(223.33) 07.04 30 0
2869594 이게 이전 버전 임베디드 관련 문서다. 루비갤로그로 이동합니다. 07.04 44 1
2869593 선생님들 조언좀 부탁드립니다 ㅇㅇ갤로그로 이동합니다. 07.04 41 0
2869592 러빠와 ㅆㅇㅆ이 허위사실 유포하는 거지 루비갤로그로 이동합니다. 07.04 48 5
2869591 서울에 가보니까 [2] 배구공(119.202) 07.04 64 0
2869590 임베디드 관련 내가 초기에 주장했던 글에 오류 없음 루비갤로그로 이동합니다. 07.04 39 2
2869589 소름돋는 홍콩과 같은 길을 가는 공산한국 [1] ♥냥덩이♥갤로그로 이동합니다. 07.04 29 0
2869588 짱깨,북괴 핵 발사시 서울 상황 ♥냥덩이♥갤로그로 이동합니다. 07.04 32 0
2869586 중요) 모두 봐라. 그리고 이걸 모두에게 말하라. 나라의 중대사다. 근구수왕갤로그로 이동합니다. 07.04 34 0
2869585 나라가 어쩌고 저쩌고 하기 전에 먼저 해야할 것 프갤러(110.8) 07.04 22 0
2869583 나라가 나한테 잘못한 것 넥도리아(175.196) 07.04 28 0
2869581 한번시작한 프로젝트는 하기싫어져도 끝까지 하는게 좋냐? [1] 프갤러(106.102) 07.04 31 0
2869580 커널모듈이 동적링크로 로딩되서 커널 바이너리 크기가 줄어드나요? 프갤러(110.8) 07.04 26 1
2869574 나님 기분 ㄱㅆㅅㅌㅊ !!! ♥냥덩이♥갤로그로 이동합니다. 07.04 20 0
2869570 청년기본소득 줄까? [1] 넥도리아(175.196) 07.04 41 0
2869566 루비가 훌륭한건 알겠음 프갤러(118.37) 07.04 50 1
2869562 디시를 어떻게해야 닉만으로 부대를 알지? [9] ㅇㅇ(211.227) 07.04 64 0
2869560 Bob Dylan on The Fugs – CIA Man 발명도둑잡기(118.216) 07.04 17 0
2869558 저사람은 아침에도 점심에도 저녁에도 새벽에도있네 [1] ㅇㅇ(211.227) 07.04 53 1
2869556 군대 이야기 참 생각하면 좆같은게 동생 죽는거 군대때문에 못봄 [2] ㅆㅇㅆ(124.216) 07.04 102 0
2869554 이게 루비가 초기에 주장했던 임베디드를 다들 루비글을 안읽으니 ㅆㅇㅆ(124.216) 07.04 45 0
2869552 ㅆㅇㅆ아 군대에서처럼 살지 마라 [13] 프갤러(156.146) 07.04 116 3
2869550 펌쟁이가 임베떡밥있길래 글 써봄 [3] 프갤러(39.120) 07.04 60 0
2869549 20분 전쯤 내 갤럭시 S20 유튜브가 재생이 시작 안되서 발명도둑잡기(118.216) 07.04 74 0
2869548 3차원 시간 가설 사실이면 노벨상이고 혁명 발명도둑잡기(118.216) 07.04 24 0
2869547 제 방 책들 정리중입니다. 넥도리아(175.196) 07.04 45 0
2869545 민생지원금이 25만원인데 오른 집값은 2억5천 정도 발명도둑잡기(118.216) 07.04 26 0
2869543 오늘의 소설, 영화 실마리: 한국 언론에 침투한 각국의 스파이들 발명도둑잡기(118.216) 07.04 28 0
2869541 스카이데일리 고 고동석 편집국장 관련 미디어오늘 기사 발명도둑잡기(118.216) 07.04 72 0
2869540 이 부트캠프 신청했는데 괜찮은가요? 프갤러(211.235) 07.04 142 0
2869539 개좆같다 이기 ㅋㅋㅋㅋㅋ [1] 루도그담당(58.239) 07.04 50 0
2869537 ios 가상머신 발명도둑잡기(118.216) 07.04 43 0
2869536 이걸 언제 다 읽고있냐 [2] 류도그담당(58.239) 07.04 66 0
2869535 APT 발명도둑잡기(118.216) 07.04 33 0
2869534 애초에 자본금이 개좆병신인데, 내가 자동매매해봤자 [3] ㅆㅇㅆ(124.216) 07.04 45 0
2869532 나 지금 목표가 이거거든? [4] ㅆㅇㅆ(124.216) 07.04 78 2
2869531 IDA 크랙 구해야하나 [2] 류도그담당(58.239) 07.04 60 0
2869529 비전공자, ㅈ문대, 복학생, 웹개발자 [8] 프갤러(93.152) 07.04 65 0
2869528 읽어도 읽어도 저 많은 천재들과 싸울 자신이 없다. [3] ㅆㅇㅆ(124.216) 07.04 63 0
2869527 프로그래밍 근데 할수록 자신감이 안 생긴다 ㅆㅇㅆ(124.216) 07.04 36 0
2869525 면접볼때마다 [3] 무관갤로그로 이동합니다. 07.04 53 0
2869524 CPP 코드 90%는 C++11 안전 기준 미달 맞음(논문있음) [1] ㅆㅇㅆ(124.216) 07.04 78 0
2869523 도로상태 훌륭 넥도리아(223.38) 07.04 24 0
2869522 동네 도로 환경 순찰 중 어머니폰으로 넥도리아(223.38) 07.04 24 0
뉴스 배우 김소진 부친상, 향년 73세 연예계 잇단 부고에 애도 물결... 박기웅·김정난도 부친 별세 디시트렌드 07.03
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2