디시인사이드 갤러리

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

갤러리 본문 영역

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

루비갤로그로 이동합니다. 2025.07.03 19:19:59
조회 49 추천 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 - -
2869727 러스트 글 자꾸 올릴거야 [1] 루비갤로그로 이동합니다. 07.04 49 0
2869726 ai 없으니까 검토 시간 진짜 [1] 루비갤로그로 이동합니다. 07.04 71 0
2869725 ㅆㅇㅆ 뭘 그걸로 겁먹냐 ㅋㅋ [2] 루비갤로그로 이동합니다. 07.04 74 2
2869724 코테를 영어로 보면 갑질인가? 프갤러(110.13) 07.04 122 0
2869723 가슴이 답답해 미칠 것 같다. 하루의 적막에 숨이 막혀온다. [1] ㅇㅇ(223.38) 07.04 69 0
2869722 26살 초봉 3300 [1] 프갤러(116.33) 07.04 70 0
2869720 vtable hook 때문에 다렉 api도 보는 중 루도그담당(58.239) 07.04 41 0
2869718 냥덩안마방❤ Open the Bozi~⭐ [2] ♥냥덩이♥갤로그로 이동합니다. 07.04 68 0
2869716 ai로 코딩 처음해보는 전업 개발잔데 [1] 프갤러(27.35) 07.04 88 0
2869715 아 넵 루비훌륭한거 알겠으니까 프갤러(118.37) 07.04 45 0
2869714 ㅆㅇㅆ 왜 취업 안 하는지가 제일 궁금함 [4] ㅇㅇ(121.162) 07.04 95 0
2869713 ㅆㅇㅆ이 제일 신기함 [10] 아스카영원히사랑해갤로그로 이동합니다. 07.04 125 1
2869712 나는조현병이야 나는내향적이야 [2] 손발이시립디다갤로그로 이동합니다. 07.04 31 0
2869711 개발자냐 계발자냐? 자기개발이냐 자기계발이냐? [3] ㅇㅇ(183.100) 07.04 57 0
2869709 tdd도 가짜 코딩 [2] 프갤러(223.33) 07.04 61 0
2869708 나님 일찍 주무셧다운 새벽 4시 기상⭐+ [1] ♥냥덩이♥갤로그로 이동합니다. 07.04 35 0
2869706 국민의힘 차단사유 김정숙 문재인 책 언급했다가 [1] 넥도리아(175.196) 07.04 50 0
2869704 나님 지진대비 밤 새기 대작전⭐+ ♥냥덩이♥갤로그로 이동합니다. 07.04 25 1
2869703 좀 억울한게 너네는 회사 다니잖아. 난 여기 아니면 하루종일 [7] ㅆㅇㅆ(124.216) 07.04 84 0
2869701 너네 요즘 TDD 만든 켄트 백이 바이브 코딩에 빠진거 아냐 [3] ㅆㅇㅆ(124.216) 07.04 79 0
2869700 이거 공유좀 중요함 배터리 국민의힘에 갈거 넥도리아(175.196) 07.04 41 0
2869698 프갤 조현병자 한명 심하다고 생각하는게 뭐냐면 [13] ㅆㅇㅆ(124.216) 07.04 140 0
2869697 영피프티는 싸피를 무슨 굽삐삐로 아네 [9] 아스카영원히사랑해갤로그로 이동합니다. 07.04 80 0
2869696 26살 졸업생 [6] 프갤러(220.65) 07.04 61 0
2869695 씨발 뚱남 육수 [3] 개멍청한유라갤로그로 이동합니다. 07.04 48 0
2869693 국비학원 다닐까? [5] 프갤러(175.121) 07.04 161 0
2869691 눈쟁이 잇섭 조코딩 이런애들은 왜 ceo만나는걸 자랑하고다니는거임?? [2] 타이밍뒷통수한방(1.213) 07.04 71 0
2869690 중국 블로그 글이랑 내 작업해야하는데 이번 의뢰 너무 오래걸리노 [1] ㅆㅇㅆ(124.216) 07.04 34 0
2869689 방금 할거없어서 윈도우10 업그레이드할뻔한거 참았다 타이밍뒷통수한방(1.213) 07.04 26 0
2869688 이게 무슨 뜻이야..? 뉴비 프로그래머 살려줘 [5] supersns갤로그로 이동합니다. 07.04 73 0
2869686 뀨? ♥냥덩이♥갤로그로 이동합니다. 07.04 24 0
2869685 나님 천국이에양..⭐+ ♥냥덩이♥갤로그로 이동합니다. 07.04 31 0
2869683 프로그래머스 vs 리트코드 [1] 프갤러(110.13) 07.04 34 0
2869682 깼다. 콜드브루 언제 사지..., 텀블러할인되나... 넥도리아(175.196) 07.04 24 0
2869680 ❤✨☀⭐나님 시작합니당⭐☀✨❤ [3] ♥냥덩이♥갤로그로 이동합니다. 07.04 41 0
2869679 토르로 내파일에 있는 이미지 업로드해도 ㄱㅊ? [1] 프갤러(59.14) 07.04 37 0
2869678 너무 억울하다 클라가 api설치를 못한 초보라서 [4] ㅆㅇㅆ찡갤로그로 이동합니다. 07.04 77 0
2869677 클라실행 안되서 시간더달라고 빌어놓고 ㅇㅇ(211.235) 07.04 43 2
2869676 머리가 너무 복잡하다. 그냥 다 놓고 싶다. [2] ㅇㅇ(223.38) 07.04 73 0
2869675 solid 원칙 소프트웨어 공학 배울땐 그정도로 중요한가 했었는데 [2] ㅇㅇ(118.235) 07.04 68 2
2869674 러스트 언어에 관련된 논의 중 혁신이라는 단어의 의미를 둘러싼 논쟁 루비갤로그로 이동합니다. 07.04 28 0
2869673 임베디드 입문했는데 ㅇㅇ(118.235) 07.04 46 0
2869672 러스트: 1.5. 생태계: 카고(Cargo)와 크레이트(Crates.io 루비갤로그로 이동합니다. 07.04 39 0
2869671 러스트 까는 이유 [1] 프갤러(61.75) 07.04 49 0
2869670 러스트: 1.4. 강력한 타입 시스템과 패턴 매칭 [1] 루비갤로그로 이동합니다. 07.04 46 0
2869669 이거 괜찮은편임? [4] 뜌땨땨땨갤로그로 이동합니다. 07.04 72 0
2869668 웹개발 입문자인데 flask 괜찮나요? [1] 프갤러(14.52) 07.04 55 0
2869667 형님들 어플 관련 오류 도와주십쇼 ㅠㅠ [3] 단팥빵갤로그로 이동합니다. 07.04 46 0
2869665 해선 틱사이즈이거 변동값이냐? ㅆㅇㅆ(124.216) 07.04 31 0
2869664 야 근데 디시 크롤링 하려고 켰는데 디시에 캡챠 추가됐노 [1] ㅆㅇㅆ(124.216) 07.04 54 0
뉴스 ‘소이현♥’ 인교진, 당뇨 초기 진단…“주범은 ‘이 음식’이었다” 디시트렌드 07.04
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2