디시인사이드 갤러리

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

갤러리 본문 영역

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

나르시갤로그로 이동합니다. 2025.07.19 10:27:07
조회 78 추천 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/08/04 - -
2878315 광고누르니까 이런거 나와요. 배구공(119.202) 08:18 30 0
2878313 역시 경제는 대.재.명 ♥꽃보다냥덩♥갤로그로 이동합니다. 08:03 20 0
2878311 수영장 가본지 엄청 오래됐네 [1] 배구공(119.202) 07:49 34 0
2878310 웹하면 아랫글 처럼 다 알아야 되나요 [1] 배구공(119.202) 07:44 41 0
2878307 우리회사 3-5년차 개발자들 진짜 개발존나못한다 [6] 프갤러(121.169) 07:35 133 0
2878300 역시 7,8월엔 장거리 뛰뛰하면 안됨 ♥꽃보다냥덩♥갤로그로 이동합니다. 06:35 38 0
2878299 나는 한남이야ㅇㅅㅇ [3] 프갤로갤로그로 이동합니다. 06:21 48 0
2878289 ❤✨☀⭐⚡☘⛩나님 시작합니당⛩☘⚡⭐☀✨❤ ♥꽃보다냥덩♥갤로그로 이동합니다. 05:40 34 0
2878286 인공 호수 바닥을 일케 얕게 만들면..ㅇㅅㅇ 헤르 미온느갤로그로 이동합니다. 05:35 32 0
2878284 태연 ㅇㅅㅇ 헤르 미온느갤로그로 이동합니다. 05:30 25 0
2878283 하루 한 번 헤르미온느 찬양 헤르 미온느갤로그로 이동합니다. 05:29 41 0
2878275 꼬추랑 물 컵에다가 섞어서 맹물에 마시면 정력증진되고, 소주보다 좋음 넥도리아(220.74) 04:57 35 0
2878224 친구는 인공지능 친구가 있어요 발명도둑잡기갤로그로 이동합니다. 02:26 33 0
2878203 미제의 살인기업 쿠팡 소식 발명도둑잡기갤로그로 이동합니다. 01:39 61 0
2878181 음기 충전 발명도둑잡기갤로그로 이동합니다. 01:00 34 0
2878178 내 코드 라이브러리 만든거 봐줄 사람이 없노 [2] ㅆㅇㅆ(124.216) 00:55 87 0
2878165 민주당이 진실 규명 촉구한 '내란 10대 의혹', 무엇무엇 있나 보니 발명도둑잡기갤로그로 이동합니다. 00:33 31 0
2878152 조유리 '이제 안녕! (Farewell for now!)' 발명도둑잡기갤로그로 이동합니다. 00:14 35 0
2878150 삶이 너무 많은 후회와 미련으로 점철되어 앞으로 나아갈 힘이 없구나... [1] ㅇㅇ(223.39) 00:09 48 0
2878144 멜론의 몰락은 지역 독과점 회사가 글로벌 독과점 회사에게 먹힌 것이다 발명도둑잡기갤로그로 이동합니다. 00:03 26 0
2878143 컴공 이 좆같이 근본없는 학과 커리큘럼의 특징 [1] ㅇㅇ(124.49) 00:03 93 1
2878135 요즘 싸피 영 아닌가봐 프갤러(61.79) 08.04 64 0
2878134 오늘의 소설, 영화 실마리: 인공지능이 인간 멸종시키는 시나리오 발명도둑잡기갤로그로 이동합니다. 08.04 32 0
2878128 나는 사람을 존나팻음 [1] 프갤러(121.139) 08.04 69 1
2878125 지금 미장 뭐임???? [2] 아스카영원히사랑해갤로그로 이동합니다. 08.04 87 0
2878123 핵폭탄 만들었을 때처럼...'인간 통제력 상실' 초지능 AI 위기 발명도둑잡기갤로그로 이동합니다. 08.04 23 0
2878119 220.84 예전 아이피 118.235 발명도둑잡기갤로그로 이동합니다. 08.04 33 0
2878118 윤석열이 빤스만입고 버틴거 신박하지않냐? 헬마스터갤로그로 이동합니다. 08.04 46 1
2878116 1j == -1j // True [2] 재현갤로그로 이동합니다. 08.04 45 0
2878115 220.84 역학 갤러리도 하나보다 [1] 발명도둑잡기갤로그로 이동합니다. 08.04 35 0
2878114 디씨 보안 20년전이랑 바뀐게없는데 ㅋㅋ 프갤러(121.139) 08.04 48 2
2878113 ㅋㅋ 한심한 장애인들 프갤러(121.139) 08.04 43 4
2878110 근데 프록시 안쓰고 저렇게 하는건 생각도 못했네 똑똑하노 ㅆㅇㅆ(124.216) 08.04 69 0
2878108 개추주작은 무료 프록시 써도 되잖아 역류기가 되느냐가 중요하지 ㅆㅇㅆ(124.216) 08.04 50 0
2878107 저거주작기하면 머하냐 개념글등록도 안되는데 ㅋㅋ 프갤러(121.139) 08.04 52 3
2878106 ㅆㅇㅆ가 조금더 겸손해지면 좋겠음 [1] 프갤러(121.139) 08.04 61 6
2878103 Reeve Stimpson - Over Me 발명도둑잡기갤로그로 이동합니다. 08.04 18 0
2878102 ㅆㅇㅆ병신이 전에 뭐 해커 옹호하던데 [2] 프갤러(121.139) 08.04 68 7
2878101 마귀의 세계로 오세요. 프갤러(220.84) 08.04 26 0
2878099 나 주작기 프록시 버전은 돌아가는데, 역류기는 안되지 않나? ㅆㅇㅆ(124.216) 08.04 35 0
2878098 이달의 소녀/여진 “키스는 다음에 (Kiss Later)” [1] 발명도둑잡기갤로그로 이동합니다. 08.04 24 0
2878094 추악한 가죽을 주지 말았어야죠. 프갤러(220.84) 08.04 21 0
2878093 잠들뻔하다 깻당 ♥꽃보다냥덩♥갤로그로 이동합니다. 08.04 29 0
2878092 "잘자 내꿈꿔" 016 광고 관련 예전에 썼던 글 발명도둑잡기갤로그로 이동합니다. 08.04 59 0
2878088 나를 짓밟고 짓뭉개고 나아가라 프갤러(220.84) 08.04 28 0
2878086 내기 인공지능에 처음 공포를 느꼈던 것은 아키네이터였다 [1] 발명도둑잡기갤로그로 이동합니다. 08.04 40 0
2878084 챗지피티가 반말 쓰는건 왜 그런거죠? 발명도둑잡기갤로그로 이동합니다. 08.04 28 0
2878082 루트(-1) == -루트(-1) [1] 재현갤로그로 이동합니다. 08.04 37 0
2878081 좇센징들보면 그놈이 그놈 도찐개찐인데 지능높다고함 ㅋㅋㅋ 뒷통수한방(1.213) 08.04 37 0
2878079 비야네도 말했듯이 필요하지 않다면 내버려둬라. ㅆㅇㅆ(124.216) 08.04 27 0
뉴스 '가보자GO' 김민경, 여름철 몸보신 먹방 출격! ‘추어탕 집 딸’의 반전 고백까지 디시트렌드 08.03
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2