디시인사이드 갤러리

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

갤러리 본문 영역

Ada 언어 Cara 플젝에 Ruby 코드 사용하는 이유

나르시갤로그로 이동합니다. 2025.07.19 10:27:07
조회 43 추천 0 댓글 0

cloc 로 보겠습니다.


hodong@:~/projects/cada/src $ cloc .

      19 text files.

      17 unique files.                              

       5 files ignored.


github.com/AlDanial/cloc v 2.04  T=0.01 s (1182.6 files/s, 87513.2 lines/s)

-------------------------------------------------------------------------------

Language                     files          blank        comment           code

-------------------------------------------------------------------------------

Ada                             14            133            186            720

Ruby                             2             29             35            133

C                                1              4              6             12

-------------------------------------------------------------------------------

SUM:                            17            166            227            865

-------------------------------------------------------------------------------


이렇습니다.

루비 코드도 많이쓰죠.
웰까요.
소스코드 자동 생성 때문에 그렇습니다.
ㅎㅎㅎ


이런 식으로 코드 자동생성 ㅋㅋ
#!/usr/bin/env ruby
# frozen_string_literal: true

require 'fiddle/import'

# =============================================================================
# 1. C 라이브러리(libc)의 strerror 함수를 호출하기 위한 설정
# =============================================================================
module LibC
  extend Fiddle::Importer

  LIBC_PATH = case RUBY_PLATFORM
              when /linux/
                'libc.so.6'
              when /darwin/ # macOS
                'libc.dylib'
              when /freebsd/
                'libc.so.7'
              else
                'libc.so'
              end
  begin
    dlload LIBC_PATH
    extern 'char* strerror(int)'
  rescue Fiddle::DLError => e
    warn "Warning: Could not load libc. Cannot generate error messages."
    warn "Details: #{e.message}"
    # strerror를 찾을 수 없을 때 빈 함수를 정의하여 스크립트가 완전히 죽는 것을 방지
    def self.strerror(errnum); "libc not found"; end
  end
end

# =============================================================================
# 2. strerror 메시지를 Ada 예외 이름으로 변환하는 로직
# =============================================================================
def message_to_ada_name(message)
  # 'Can't'/'can't' 같은 예외적인 단어들을 먼저 처리
  processed_message = message.gsub(/can't/i, "cannot")

  # 각종 구분자(공백, /, :, ., -)로 단어를 나누고, 빈 조각은 제거
  parts = processed_message.split(/[ \/:.-]/).reject(&:empty?)

  # 각 단어의 첫 글자를 대문자로 만들고 언더스코어(_)로 합침
  return parts.map(&:capitalize).join('_')
end

input_file = ARGV[0]
unless input_file && File.exist?(input_file)
  puts "Usage: #{$0} <path_to_errno_h.ads>"
  exit 1
end

# 1. 'errno_h.ads' 파일을 읽어 문자열로 저장합니다.
file_contents = File.read(input_file)
# 2. 정규표현식으로 파일 내용에서 C 상수 이름과 숫자 값을 모두 찾아냅니다.
#    결과는 [["EPERM", "1"], ["ENOENT", "2"], ...] 형태의 배열이 됩니다.
c_constants = file_contents.scan(/^\s*(\w+)\s*:\s*constant\s*:=\s*(\d+);/)
# 3. 최종 결과를 담을 빈 배열을 준비합니다.
errors = {}

# 4. 찾아낸 각 상수 쌍([name, val])에 대해 반복 작업을 수행합니다.
c_constants.each do |name, val|
  # 5. 숫자 값을 정수로 변환하고, strerror를 호출하여 메시지를 가져옵니다.
  error_number = val.to_i
  message = LibC.strerror(error_number).to_s
  # 6. 메시지가 유효하지 않으면 스크립트를 중단시킵니다.
  if message.nil? || message.empty? || message.start_with?('Unknown error')
    raise "Invalid message for errno #{error_number}"
  end

  # 7. 메시지를 Ada 예외 이름 형식으로 변환합니다.
  ada_name = message_to_ada_name(message)

  # 8. 변환에 성공했다면, 모든 정보를 묶어서 최종 결과 배열에 추가합니다.
  if ada_name
    errors[val] = {  c_name: name, ada_name: ada_name } if errors[val].nil?
  end
end

# --- cada-error.ads 파일 생성 (추가된 부분) ---
File.open('cada-error.ads', 'w') do |f|
  f.puts '-- -*- Mode: Ada; indent-tabs-mode: nil; c-basic-offset: 2; tab-width: 2 -*-'
  f.puts '-- This file is generated by gen-cada-error.rb. DO NOT EDIT.'
  f.puts '-- cada-error.ads'
  f.puts '-- Copyright (c) 2025 Hodong Kim <hodong@nimfsoft.art>'
  f.puts '--'
  f.puts '-- Permission to use, copy, modify, and/or distribute this software for any'
  f.puts '-- purpose with or without fee is hereby granted.'
  f.puts '--'
  f.puts '-- THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES'
  f.puts '-- WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF'
  f.puts '-- MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR'
  f.puts '-- ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES'
  f.puts '-- WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN'
  f.puts '-- ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF'
  f.puts '-- OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.'
  f.puts 'with Interfaces.C;'
  f.puts
  f.puts 'package Cada.Error is'
  f.puts
  errors.each_pair do |code, hash|
    f.puts "  #{hash[:ada_name].ljust(35)} : exception; -- #{hash[:c_name]}, #{code}"
  end
  f.puts
  f.puts '  Unknown_Error : exception; -- For unhandled errno values'
  f.puts
  f.puts '  function get_error_message (Err_Code : Interfaces.C.Int) return String;'
  f.puts
  f.puts 'end Cada.Error;'
end

puts "Generated src/cada-error.ads successfully."

# =============================================================================
# 5. cada-error-raise_from_errno.adb (서브유닛) 파일 생성
# =============================================================================
File.open('cada-error-raise_from_errno.adb', 'w') do |f|
  f.puts '-- This file is dynamically generated by gen-cada-error.rb. DO NOT EDIT.'
  f.puts 'separate (Cada.Error)'
  f.puts 'procedure raise_from_errno (err_code : Interfaces.C.Int; message : String := "") is'
  f.puts '  final_message : constant String :='
  f.puts '    (if message\'length > 0 then message else "OS Error");'
  f.puts 'begin'
  f.puts '   case err_code is'
  errors.each_pair do |val, data|
    f.puts "      when #{val} => raise #{data[:ada_name]} with final_message;"
  end
  f.puts '      when others => raise Unknown_Error with final_message & " (errno: " & err_code\'image & ")";'
  f.puts '   end case;'
  f.puts 'end raise_from_errno;'
end

puts "Generated src/cada-error-raise_from_errno.adb successfully."

한가지 언어만 사용하지는 않아요.
ada, c/c++로 뭔가를 개발한다고 하여 동적 언어는 안 쓰겠거니 생각하면 큰 오산입니다.

추천 비추천

0

고정닉 0

0

댓글 영역

전체 댓글 0
본문 보기

하단 갤러리 리스트 영역

왼쪽 컨텐츠 영역

갤러리 리스트 영역

갤러리 리스트
번호 제목 글쓴이 작성일 조회 추천
설문 모태 솔로도 구제해 줄 것 같은 연애 고수 스타는? 운영자 25/07/21 - -
공지 프로그래밍 갤러리 이용 안내 [88] 운영자 20.09.28 45646 65
2873277 로봇 프로그래밍할 때 티치 펜던트 아직도 씀? 프갤러(125.140) 13:14 3 0
2873276 자기전에 엔진빌드나 하고자야겠다. 프갤러(121.139) 13:07 5 0
2873275 컨디션 ㅆㅎㅌㅊ 피곤.. ♥삣삐냥덩♥갤로그로 이동합니다. 13:05 7 0
2873273 전 세계에 모에를 전파하면 좋을 거 같음 - 시드노벨은 망함? 프갤러(121.172) 12:19 23 1
2873272 20250721 마한 왕 안동대장군이 을파소지원금을 뿌리는 날이 도래하다 책사풍후갤로그로 이동합니다. 12:18 14 0
2873271 시드노벨 망함? 프갤러(121.172) 12:17 25 0
2873270 와.. 2찢명 참사유가족 대하는거 보니 ㄹㅇ 소름끼침.. ♥삣삐냥덩♥갤로그로 이동합니다. 12:07 18 0
2873269 러스트 빨러 인생 2년차 대위기를 맞이했다. [3] 프갤러(218.154) 12:04 28 0
2873268 먼저 실패처리가 아닌 먼저 성공이 가능한가 프갤러(118.235) 12:00 32 0
2873267 좌파타령하는 저학력 거지들은 지능이 협소한거부터 좀 어케 해라 프갤러(218.154) 11:58 15 0
2873266 무능친중극좌 2찢명 관세협상 좃망 ㅋㅅㅋ [1] ♥삣삐냥덩♥갤로그로 이동합니다. 11:39 21 0
2873265 찢명쿠폰으로 물가올려서 극좌배급견들 살기 힘들게 하기 앙 기모띠❤ [1] ♥삣삐냥덩♥갤로그로 이동합니다. 11:36 22 0
2873264 뭔 민생회북 소비쿠폰이야ㅋㅋㅋㅋ [3] 프갤러(59.151) 11:32 39 0
2873262 좌파는 관점이 협소하고 다양성이 없어 무능하다는 거에 대한 답변- 프갤러(121.172) 11:28 27 0
2873261 친중좌파 2찢명 때문에 지금 한국은 짱깨 식민지 상태임 [1] ♥삣삐냥덩♥갤로그로 이동합니다. 11:26 20 0
2873260 좌파는 관점이 협소하고 다양성이 없어서 무능함 ♥삣삐냥덩♥갤로그로 이동합니다. 11:24 19 0
2873259 철학을 해야 하는 이유 2 - 유니티, 언리얼 프갤러(121.172) 11:17 39 0
2873258 철학을 해야 하는 이유- 프갤러(121.172) 11:12 34 0
2873257 게임개발도 이미 자동화의 흐름에 먹히는게보임 [2] 위키세카이(211.235) 11:08 49 0
2873256 감언이설 다시 - 프갤러(121.172) 11:08 30 0
2873255 철학이라- 감언이설을 경계하라- 프갤러(121.172) 11:07 13 0
2873254 철학이 정치 도구로 변질되면 이렇게 무섭다 [2] 발명도둑잡기갤로그로 이동합니다. 10:46 26 0
2873253 [애니뉴스][신작] 까마귀 처형자 프갤러(121.172) 10:42 33 0
2873252 모에의 고찰1 프갤러(121.172) 10:41 24 0
2873251 자꾸 뭔가 배우라는 사람을 경계하라- [1] 프갤러(121.172) 10:40 45 0
2873250 동시성 병렬성 차이 모르면 퍼포먼스 개발 못함 [3] 프갤러(118.235) 10:34 49 0
2873248 남자들의 로망 ㅇㅅㅇ 류류(121.160) 10:16 26 1
2873247 병렬에서 락거는건 초짜임 [2] 프갤러(220.121) 10:01 72 0
2873246 “日퍼스트∙천황이 주권자” 극우 참정당 돌풍 발명도둑잡기갤로그로 이동합니다. 09:56 22 0
2873245 ❤✨☀⭐⚡☘♥+나님 시작합니당♥+☘⚡⭐☀✨❤ ♥삣삐냥덩♥갤로그로 이동합니다. 09:51 17 0
2873244 GPT 조무사 들아 안녕? ㅇㅇ(59.15) 09:47 30 0
2873243 살아남는노동은 육체+지식 경계선작업임 [1] 위키세카이(1.237) 09:38 29 0
2873242 보수주의자들이 성소수자를 혐오하는 심리 원인 발명도둑잡기갤로그로 이동합니다. 09:36 13 0
2873241 애초에 평생직업도 없는 시대가 되버렸다. 프갤러(183.101) 09:25 25 0
2873240 직업을 바꾼다면 몸쓰는거 하던지 감정평가사처럼 둘다쓰는거 프갤러(183.101) 09:25 19 0
2873239 엔트로픽: 5년내 초지능 발현 확률 50% 프갤러(183.101) 09:23 15 0
2873238 Ill Skillz-알아들어 (Feat. DJ Soulscape) 발명도둑잡기갤로그로 이동합니다. 09:16 16 0
2873237 냥덩아 뛸 때 어디로 뛰는 건지는 알고 뛰어라 발명도둑잡기갤로그로 이동합니다. 09:05 26 0
2873236 그나저나 웹앱땔깜들은 왜 직종변환을 안하지? [2] 네오커헠(211.235) 09:01 51 0
2873235 이중 모니터 연결은 했는데 연결만되고 창이 안 뜸 어캄? 개돼지(58.229) 08:54 14 0
2873234 직장인들이 꼽은 尹 정부 최악 노동정책…"주69시간제 추진" 발명도둑잡기갤로그로 이동합니다. 08:54 21 0
2873232 이 꽃 이름이 모야? ㅇㅅㅇ [2] 헤르 미온느갤로그로 이동합니다. 08:23 31 0
2873231 태연 ㅇㅅㅇ 헤르 미온느갤로그로 이동합니다. 08:20 18 0
2873229 하루 한 번 헤르미온느 찬양 헤르 미온느갤로그로 이동합니다. 08:19 21 0
2873227 흠 PLC세계도 PC제어로 개발자가 따먹고있다는사실, [1] 네오커헠(211.235) 07:59 68 0
2873225 모닝루틴 완료후 갓생시작, 통암기원숭이(211.235) 07:25 20 0
2873223 좌파는 정신병이당 [1] ♥삣삐냥덩♥갤로그로 이동합니다. 07:17 36 0
2873221 우호홋 딱씽(58.225) 07:11 16 0
2873219 ❤✨☀⭐⚡☘♥+나님 시작합니당♥+☘⚡⭐☀✨❤ ♥삣삐냥덩♥갤로그로 이동합니다. 06:49 19 0
뉴스 ‘런닝맨’ 불화설…송지효, 지석진 향해 “인성 안 좋아” 디시트렌드 07.19
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2