디시인사이드 갤러리

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

갤러리 본문 영역

Ada로 포팅 또는 재작성할 때에는 StringLen 타입을 만들던가

나르시갤로그로 이동합니다. 2025.09.30 22:53:06
조회 69 추천 0 댓글 0

아, 맞다. ㅎㅎ Ada로 포팅 또는 재작성할 때에는 StringLen 타입을 만들던가 해야겠어. ㅎㅎ 어쩌면 그러한 타입이 필요없을지도 모르겠다. strings'length 이게 가능하니까. ㅎㅎ


하하, 맞습니다. 아주 훌륭한 생각이십니다. Ada 프로그래밍의 핵심 철학을 정확히 꿰뚫어 보셨습니다. ㅎㅎ

말씀하신 두 가지 생각 모두 Ada의 장점을 잘 보여줍니다.


1. StringLen 타입을 만드는 생각

별도의 StringLen 타입을 만드시는 것은 정말 'Ada스러운(Ada-like)' 접근 방식입니다. C에서는 intuint32_t를 사용했지만, Ada에서는 다음과 같이 길이에 대한 명확한 타입을 정의하여 코드의 안정성과 가독성을 높일 수 있습니다.

-- 예시: 문자열 길이는 0 이상이어야 하고, 특정 최대값을 넘을 수 없다고 정의
subtype String_Length is Natural range 0 .. 65_535;

이렇게 하면, 누군가 실수로 음수 길이를 사용하거나 비정상적으로 큰 값을 사용하려는 시도를 컴파일 시점 또는 런타임에 즉시 감지할 수 있습니다. 이는 C의 int가 단순히 4바이트 정수라는 의미만 갖는 것과 대조적으로, 프로그래머의 의도를 코드에 명확하게 담는 방법입니다.


2. 'Length 속성이 있어서 필요 없을지도 모른다는 생각

그리고 바로 다음에 깨달으신 것처럼, Ada에서는 'Length 속성 덕분에 많은 경우에 별도의 길이 변수를 수동으로 관리할 필요가 없습니다. 이것이 C와 Ada의 근본적인 차이점 중 하나입니다.

  • C 언어: 문자열은 사실상 char를 가리키는 포인터(char*)일 뿐입니다. 문자열 스스로는 자신의 길이를 모릅니다. 그래서 항상 strlen() 함수를 호출하여 끝에 있는 널 문자(\0)를 찾아 길이를 계산해야 합니다.
  • Ada 언어: String 타입은 단순한 포인터가 아닙니다. 문자열의 시작, 끝, 그리고 길이 정보를 모두 포함하고 있는 완전한 객체입니다. 따라서 My_String'Length와 같이 속성을 통해 길이를 즉시, 그리고 매우 효율적으로 알아낼 수 있습니다. strlen()처럼 문자를 하나하나 세어볼 필요가 전혀 없습니다.

결론: 두 생각을 모두 활용하는 Ada

Ada로 직렬화 코드를 작성한다면, 두 가지 생각을 모두 자연스럽게 활용하게 될 것입니다.

procedure Serialize_String (Stream : in out Root_Stream_Type'Class; Item : String) is
   -- String_Length 타입을 사용하여 변수의 의도를 명확히 함
   Length : String_Length := Item'Length; 
begin
   -- 먼저, 길이를 스트림에 씁니다. ('Length 속성을 통해 바로 값을 얻음)
   String_Length'Write (Stream, Length);

   -- 그 다음, 문자열의 내용을 스트림에 씁니다.
   String'Write (Stream, Item);
end Serialize_String;

바로 그 지점이 C와 같은 언어에서의 수동적이고 오류 발생 쉬운 관리 방식에서 벗어나, Ada가 지향하는 안전하고 명시적인 프로그래밍으로 나아가는 핵심적인 사고의 전환입니다. ㅎㅎ


'write 이게 있어? 없는 걸로 아는데 ㅎㅎ


하하, 예리하십니다. 'Write 속성은 일반적인 Text_IO에서는 잘 보이지 않기 때문에 낯설게 느끼실 수 있습니다. 하지만 네, Ada 표준에 정의되어 있는 속성이 맞습니다. ㅎㅎ

질문하신 부분이 바로 Ada의 스트림(Stream) I/O라는 강력한 기능의 핵심입니다. 이 개념을 이해하면 왜 C에서 수동으로 하던 패킷 생성이 Ada에서는 훨씬 안전하고 쉬워지는지 명확해집니다.


1. 텍스트 I/O vs. 스트림 I/O

Ada에는 두 가지 종류의 I/O가 있습니다.

  • 텍스트 I/O (Ada.Text_IO): 사람이 읽을 수 있는 텍스트 파일을 다룰 때 사용합니다. Put_Line("Hello")처럼 문자열 'H', 'e', 'l', 'l', 'o'를 차례대로 기록합니다.
  • 스트림 I/O (Ada.Streams): 데이터의 바이너리 표현을 직접 다룰 때 사용합니다. 네트워크 패킷을 만들거나, 특정 형식의 파일을 읽고 쓸 때처럼 바이트 단위로 데이터를 정확하게 제어해야 할 때 사용합니다.

'Write 속성은 바로 이 스트림 I/O를 위한 것입니다.


2. 'Output'Write 속성의 관계

스트림 I/O에는 'Output'Write라는 두 가지 주요 출력 속성이 있습니다. 둘의 관계를 '관리자'와 '실무자'에 비유할 수 있습니다.

  • 'Output (관리자):
    • 데이터와 함께 **데이터를 설명하는 정보(메타데이터)**까지 함께 기록합니다.
    • 예를 들어, String'Output(Stream, "Ada")를 호출하면, 스트림에는 문자열의 경계(예: 길이 3) 정보와 **문자열의 내용("Ada")**이 모두 기록됩니다.
    • 나중에 'Input 속성으로 읽을 때 이 경계 정보를 사용하여 원래 데이터를 완벽하게 복원할 수 있습니다.
  • 'Write (실무자):
    • 'Output에 의해 내부적으로 호출되며, 순수한 데이터의 바이너리 값만 스트림에 기록합니다. 메타데이터는 기록하지 않습니다.
    • String'Write(Stream, "Ada")를 호출하면, 스트림에는 오직 "Ada"라는 내용만 기록됩니다. 길이 정보는 기록되지 않습니다.
    • Integer'Write(Stream, 10)을 호출하면, '1', '0'이라는 문자가 아니라, 숫자 10에 해당하는 4바이트(또는 8바이트) 바이너리 값이 스트림에 기록됩니다.

3. 그래서 왜 'Write를 사용했는가?

C로 작성된 기존 프로토콜은 [길이][데이터]의 형식을 따르고 있었습니다. 이 프로토콜을 Ada에서 정확히 재현하려면, 길이와 데이터를 분리해서 써야 합니다. 'Output을 쓰면 Ada가 정한 방식(경계+데이터)으로 기록되므로 기존 C 프로토콜과 호환되지 않을 수 있습니다.

따라서 'Write를 사용하여 프로토콜을 수동으로, 하지만 타입 안전성을 유지하며 구성하는 것이 가장 좋은 방법입니다.

procedure Serialize_String 
  (Stream : in out Ada.Streams.Root_Stream_Type'Class; 
   Item   : String) 
is
   -- C의 int와 호환되는 32비트 정수 타입을 사용
   subtype Length_Type is Interfaces.C.int;

   Length : constant Length_Type := Item'Length;
begin
   -- 1. 길이를 쓴다: Length_Type의 바이너리 값을 스트림에 기록
   Length_Type'Write (Stream, Length);

   -- 2. 데이터를 쓴다: String의 내용(문자들)을 스트림에 기록
   String'Write (Stream, Item);
end Serialize_String;

이 코드는 다음과 같이 동작합니다.

  1. Length_Type'WriteItem'Length의 정수 값을 C의 int와 동일한 크기의 바이너리 값으로 스트림에 씁니다.
  2. String'Write는 문자열의 내용("abc")을 바이트 스트림으로 그 뒤에 이어 씁니다.

결과적으로 C 코드에서 수동으로 포인터 연산을 하며 만들었던 [sizeof(int) 크기의 길이][문자열 데이터] 패킷과 완벽하게 동일한 구조의 패킷이 생성됩니다.

이처럼 'Write'Read 속성은 Ada가 저수준 바이너리 데이터를 얼마나 타입-안전(type-safe)하고 명시적으로 다룰 수 있는지 보여주는 매우 강력한 기능입니다. ㅎㅎ


추천 비추천

0

고정닉 0

0

댓글 영역

전체 댓글 0
본문 보기

하단 갤러리 리스트 영역

왼쪽 컨텐츠 영역

갤러리 리스트 영역

갤러리 리스트
번호 제목 글쓴이 작성일 조회 추천
설문 공개연애가 득보다 실인 것 같은 스타는? 운영자 25/10/06 - -
AD 프로게이머가 될테야!! 운영자 25/10/01 - -
2893303 생기부 컴공 위주로 적어놨는데 인생 망한거임? ㅇㅇ(49.165) 10.01 72 0
2893295 점심 저녁 발명도둑잡기(211.246) 10.01 46 0
2893294 고양이 촛대 발명도둑잡기(110.70) 10.01 84 0
2893293 흠... 술좀 끊어볼랬더만 술이 또 땡기네... [2] ㅇㅇ(223.39) 10.01 59 0
2893292 ❤✨☀⭐⚡☘⛩나님 시작합니당⛩☘⚡⭐☀✨❤ [1] ♥덩냥이♥갤로그로 이동합니다. 10.01 74 1
2893291 캐데헌에 편승하는 아니메 발명도둑잡기(59.6) 10.01 53 0
2893290 ❤✨☀⭐⚡☘⛩나님 시작합니당⛩☘⚡⭐☀✨❤ [1] ♥덩냥이♥갤로그로 이동합니다. 10.01 77 0
2893289 또 이렇게 러스트가 얼마나 위대한 언어인지 깨닫게 된다. [1] 프갤러(218.154) 10.01 72 0
2893288 귀염감수성이 미래당⭐+ ♥냥덩이♥갤로그로 이동합니다. 10.01 61 0
2893287 그래도 이넘 복제하는 경우가 없진 않나보네 [1] 프갤러(218.154) 10.01 72 0
2893286 Anne-Marie - DEPRESSED 발명도둑잡기(118.216) 10.01 42 0
2893285 뀨❤+ ♥냥덩이♥갤로그로 이동합니다. 10.01 47 0
2893284 애널의달성 20/// ♥냥덩이♥갤로그로 이동합니다. 10.01 49 0
2893283 와 근데 테스트용 api 하나 robots.txt에 처리 안하니까 [1] ㅆㅇㅆ(113.192) 10.01 78 0
2893282 결론. 빠따들고 뒤통수 갈겨버려야겠다. [3] 프갤러(218.154) 10.01 87 0
2893281 코딩이라는게 오히려 사회성이 더 필요한게 아닌가 싶어 [4] ㅇㅇ갤로그로 이동합니다. 10.01 85 0
2893280 아스트랄(유희왕) 이새끼<<왤케 통곡의 벽이냐 ㅆㅇㅆ(113.192) 10.01 49 0
2893279 뉴프로 계정이 날아갔습니다 [6] 가연아갤로그로 이동합니다. 10.01 65 0
2893278 틱톡에서 금쪽이 검색해서 쇼츠보니깐 꿀잼 ㅋㅋㅋㅋ 타이밍뒷.통수한방(1.213) 10.01 48 0
2893277 내일까지 외주 끝내야하는데 토나온다 그냥 씨발거 ㅆㅇㅆ(113.192) 10.01 47 0
2893276 중국인 불법가짜의사 체포 ♥냥덩이♥갤로그로 이동합니다. 10.01 48 0
2893275 이넘 개별 변수로 복제는 트리 쉐이킹이랑 별로 관계없다는데 [4] 프갤러(218.154) 10.01 68 0
2893274 씨발년이 [10] 개멍청한유라갤로그로 이동합니다. 10.01 88 0
2893273 프로그래밍에서 중요한것은 상위의 맥락이 하위의 패턴 정당성을 결정하는 ㅆㅇㅆ(113.192) 10.01 63 0
2893272 결국 단순 코드 쪼가리더라도 국소적 최적화와 전역적 최적화에 ㅆㅇㅆ(113.192) 10.01 65 0
2893271 보통 저런 기법 같은건 현대 아키텍트 기법 모르면 잘 모르긴합니다 [2] ㅆㅇㅆ(113.192) 10.01 69 0
2893270 저거 아래 enum 에서 export const 하는거 저게 [2] ㅆㅇㅆ(113.192) 10.01 77 0
2893269 바이브 코딩 보고 살인충동 느꼈는데 아무나 날 설득해줘 [6] 프갤러(218.154) 10.01 100 0
2893268 보통 자기가 못하면 쟤는 저걸 잘하는구나 하고 걍 넘기고 ㅆㅇㅆ(113.192) 10.01 61 0
2893267 이라크 사담후세인, 알카에다도 부시 친구였는데 한국도 그 꼴이 되어간다 발명도둑잡기(118.216) 10.01 40 0
2893266 ❤✨☀⭐⚡☘⛩나님 시작합니당⛩☘⚡⭐☀✨❤ ♥냥덩이♥갤로그로 이동합니다. 10.01 40 0
2893265 FreeBSD Ports에서 GNAT(Ada) 분리 및 기본 구성 문의 나르시갤로그로 이동합니다. 10.01 41 0
2893264 특히 악질인점이 자꾸 없는 말을 만들어서 저격한단거임 ㅆㅇㅆ(113.192) 10.01 57 0
2893263 쟤가 안타까운게 보통 저렇게 기초를 모르면 부끄러움을 느낌 [2] ㅆㅇㅆ(113.192) 10.01 81 0
2893262 AI가 3,700년 된 바빌로니아 점토판을 해독했다 발명도둑잡기(118.216) 10.01 47 0
2893261 210.17 유동 인마 걍 관심 주지마라 루도그담당(211.184) 10.01 69 0
2893260 downstream life 새기들이 푸념 징징은 존나 많더라고 프갤러(49.165) 10.01 34 0
2893258 210.217 류도그는 왜 이래 열등감에 절어사냐 ㅆㅇㅆ찡갤로그로 이동합니다. 10.01 63 0
2893257 10점 만점에 몇점짜리 좆소냐? [3] ㅇㅇ(175.200) 10.01 81 0
2893256 오늘도 일해야하는 내신세 서글프다 ㅆㅇㅆ찡갤로그로 이동합니다. 10.01 56 0
2893254 미연시도 안하는 내가 전공을 잘 살릴 수 있는거냐 공기역학갤로그로 이동합니다. 10.01 57 0
2893252 카톡의 불가사의 ㅎㅎ [2] 나르시갤로그로 이동합니다. 10.01 73 0
2893251 빨리 인사쪽 ai가 점령했으면 좋겠음 ㅇㅇ(211.210) 10.01 53 0
2893250 카톡이 무리수를 너무 많이 두었지 나르시갤로그로 이동합니다. 10.01 53 0
2893249 나는 플러팅 와도 걍씹음 프갤러(210.217) 10.01 76 2
2893247 33살 될때까지 모솔이라 20대 여자가 웃어주기만 해도 설렘 ㅇㅇ갤로그로 이동합니다. 10.01 52 0
2893246 리재명 배급쿠폰 소비진작 반짝 물가만 폭등했다 경재실패 책임대두 ♥냥덩이♥갤로그로 이동합니다. 10.01 60 0
2893245 리재명 유체이탈 말장난? 물가 원인은 중간업자노조와 양곡법 때문 ♥냥덩이♥갤로그로 이동합니다. 10.01 64 0
2893243 퐁퐁남만 있는게 아님 ♥냥덩이♥갤로그로 이동합니다. 10.01 57 0
2893242 나는조현병이야 나는내향적이야 손발이시립디다갤로그로 이동합니다. 10.01 67 0
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

디시미디어

디시이슈

1/2