디시인사이드 갤러리

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

갤러리 본문 영역

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

나르시갤로그로 이동합니다. 2025.09.30 22:53:06
조회 60 추천 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 - -
2893947 ㅋㅋ ㅆㅇㅆ 좆밥 새끼 프갤러(210.217) 10.04 61 4
2893945 캬 씨발 좆지리는거 나왔다 ㅋㅋ [3] ㅆㅇㅆ(124.216) 10.04 104 0
2893943 난 제미나이 울트라라서 딥 싱크랑 딥 리서치 쓰는데 [1] 프갤러(125.184) 10.04 47 0
2893941 좆밥 새끼들은 ai 가져도 한계가 좆밥에서 못벗어남 프갤러(210.217) 10.04 50 1
2893938 AI로 작업하기전에 AI에 롤을 부여해봐 [3] 프갤러(125.184) 10.04 68 0
2893937 테크레이더에서도 그랬잖아 AI개발할땐 가드레일이 필수라고 ㅆㅇㅆ(124.216) 10.04 42 0
2893936 AI 쓸떄 그냥 핵심에는 안쓰고 덜중요한부분에서만 쓰면됨 [9] ㅆㅇㅆ(124.216) 10.04 68 0
2893935 잘모르는거 AI개발할때는 실개발하기전에 계속 정리하고 [2] 프갤러(125.184) 10.04 45 0
2893934 근데 AI들이랑 대화하다보면 후빨 조지지 않냐? [4] ㅆㅇㅆ(124.216) 10.04 80 0
2893933 오늘도 일나간다..ㅇㅅㅇ 헤르 미온느갤로그로 이동합니다. 10.04 31 0
2893932 현시대는 토발즈도 1찍 짱깨편인 무서운 시대이다ㅋㅋ번식 더 해줘라 이기 [1] 타이밍뒷.통수한방(1.213) 10.04 38 0
2893931 필연적으로 폼제출이나 결제드가면 서버액션 [2] ㅆㅇㅆ찡갤로그로 이동합니다. 10.04 45 0
2893930 프로젝트 리액트 19랑 next15로 마이그레이션했다 [6] ㅆㅇㅆ찡갤로그로 이동합니다. 10.04 76 0
2893929 다 시골내려갔나? 글이 없네..ㅇㅅㅇ [2] 헤르 미온느갤로그로 이동합니다. 10.04 49 0
2893928 하고 싶으면 하는건데 대충 기웃거리려면 하지말라는거지 프갤러(125.184) 10.04 60 0
2893927 막걸리 어제 밤에 한병 반 마셨더니 ㅇㅇ(110.70) 10.04 38 0
2893925 카스 이젠 짱깨맥주? ♥냥덩이♥갤로그로 이동합니다. 10.04 43 0
2893924 불법주차 영포티 참교육 가즈아~ ♥냥덩이♥갤로그로 이동합니다. 10.04 49 0
2893923 수술 범죄의 수법과 배경 [1] ㅇㅇ(211.216) 10.04 35 0
2893912 어느 카페 ㅇㅅㅇ 헤르 미온느갤로그로 이동합니다. 10.04 40 0
2893910 태연 ㅇㅅㅇ 헤르 미온느갤로그로 이동합니다. 10.04 38 0
2893909 하루 한 번 헤르미온느 찬양 헤르 미온느갤로그로 이동합니다. 10.04 54 0
2893906 나는 이해가 안가는게 왜 지가 하고 싶은걸 남한테 하지말라 듣고있냐 [1] ㅆㅇㅆ(124.216) 10.04 59 0
2893900 33 고졸 비전공 개발자 하지마? [3] 프갤러(122.199) 10.04 158 0
2893861 개발자분들은 [2] 프갤러(211.204) 10.04 76 0
2893835 타직종인데 개발자로 테크트리 다시타고싶습니다 [13] 프갤러(115.21) 10.04 130 0
2893834 이번 체인소맨 영화 재밌게 봤으면 발레리나를 봐보셈... ㅇㅇ(223.39) 10.04 52 0
2893830 신입한테요구하는거 죤나많네 시발새끼들 [1] 프갤러(211.235) 10.04 93 0
2893827 34살에 빚이천만원있음.. [4] ㅇㅇ(175.197) 10.04 117 0
2893826 이번 추석명절 유흥 반값에 가는법 꿀팁 ㅇㅇ(118.235) 10.04 49 0
2893825 4050이 나라를 살린다 [2] 야옹아저씨갤로그로 이동합니다. 10.04 76 1
2893821 막걸리 한 병 깠다 [4] ㅇㅇ(121.168) 10.03 69 0
2893818 ❤✨☀⭐⚡☘⛩나님 시작합니당⛩☘⚡⭐☀✨❤ [1] ♥덩냥이♥갤로그로 이동합니다. 10.03 84 0
2893816 나님 내년 1분기까지 노워킹 온리조깅으로 30km 도전 [2] ♥냥덩이♥갤로그로 이동합니다. 10.03 73 0
2893813 현시대는 토발즈도 1찍 짱깨편인 무서운 시대이다ㅋㅋ번식 더 해줘라 이기 타이밍뒷.통수한방(1.213) 10.03 34 0
2893809 지듣노 ㅁㅌㅊ? [3] 노력갤로그로 이동합니다. 10.03 71 1
2893808 인생은 운이다 [2] ㅇㅇ(121.168) 10.03 72 1
2893807 걷기 싫어하는 나님의 습성도 리죄명 짱깨 무비자 입국에서 비롯됐다 [3] ♥냥덩이♥갤로그로 이동합니다. 10.03 68 0
2893805 ㄸㄸㄹ ♥냥덩이♥갤로그로 이동합니다. 10.03 43 0
2893801 rtos 리스트 하드웨어 잘되는 순서로 정렬 발명도둑잡기(118.216) 10.03 69 0
2893799 ■요즘 Si 신입 대세포폴이 뭐에요? [4] ㅇㅇ갤로그로 이동합니다. 10.03 97 0
2893795 ❤✨☀⭐⚡☘⛩나님 시작합니당⛩☘⚡⭐☀✨❤ ♥냥덩이♥갤로그로 이동합니다. 10.03 62 0
2893794 저녁 아직 안 먹었는데 [1] 발명도둑잡기(118.216) 10.03 71 0
2893793 노오오력 하면 된단다 발명도둑잡기(118.216) 10.03 49 0
2893791 엠마 왓슨이 범죄의 아이콘이 된 이유 발명도둑잡기(118.216) 10.03 59 0
2893789 Wolfenstein3D on 8bit consoles 발명도둑잡기(118.216) 10.03 47 0
2893786 공부에 다른방도 없는듯... 그냥 매일 계속 꾸준히 하는것밖에 없음 ㅇㅇ(223.39) 10.03 51 1
2893782 차단해도 댓글 계속 달리는거 ㄹㅇ 짜증남 ㅆㅇㅆ(124.216) 10.03 58 1
2893778 ㅆㅇㅆ 접밥 비린내나는 새기가 먼 gpt를 이겨 ㅋㅋ 프갤러(210.217) 10.03 108 8
2893777 내가 느끼는게 아무리 날고 기어도 구현을 지피티 못이기겠음 [2] ㅆㅇㅆ(124.216) 10.03 105 0
뉴스 ‘둘째 임신’ 이시영 안타까운 근황…분만 위험 커지는 ‘이 병’ 진단 디시트렌드 10.05
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2