디시인사이드 갤러리

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

갤러리 본문 영역

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

나르시갤로그로 이동합니다. 2025.07.19 10:27:07
조회 63 추천 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 - -
2875345 멸공 ! ❤+ [1] ♥팬티스타킹냥덩♥갤로그로 이동합니다. 18:39 16 0
2875343 mysql 질문문무누문무눔 [3] 프갤러(163.152) 18:35 22 0
2875341 진짜 프로그래밍이 제일 독학하기 편하지 않냐? 말이 안됨 [6] ㅆㅇㅆ(124.216) 18:34 47 0
2875340 실무하다보니 네트워크 미들웨어 좇나 쓸모없음 뒷통수한방(1.213) 18:34 21 0
2875338 ai 이새끼들하고 정치적이야기 한국에대해서 이야기하면 존나 찢재명같더라 뒷통수한방(1.213) 18:30 16 0
2875331 앱히키 씨발년아 보고 있는 거 안다. 근황 보고해라 프갤러(222.108) 18:14 16 0
2875329 실무하다보니 느끼는데 그냥 네트워크 구조나 미들웨어 지식이 더중요한거같다 [1] ㅇㅇ(211.234) 18:13 32 0
2875327 공수처 검찰청 경찰청 국제수사 과학수사 포랜식수사 기무사 국정원 존재이유 뒷통수한방(1.213) 18:10 12 0
2875323 2찢명 이 극좌새끼 때문에 대한민국 망하는거 확정 이민 준비나 해라 [1] ♥팬티스타킹냥덩♥갤로그로 이동합니다. 18:03 21 0
2875322 진짜 도로롱 Vs 가짜 도로롱 ♥팬티스타킹냥덩♥갤로그로 이동합니다. 18:00 26 0
2875317 마소 아주르 아키텍쳐보면서 RAG 만들고 있는데 ㅆㅇㅆ(124.216) 17:50 18 0
2875314 하루에 6만원씯 비트코인 매입중 [2] 초코냥갤로그로 이동합니다. 17:47 27 0
2875313 나님 맘마❤+ ♥팬티스타킹냥덩♥갤로그로 이동합니다. 17:45 13 0
2875306 근데 진짜 신기하지 않냐? 마소 아주르 아키텍쳐 센터 드가면 ㅆㅇㅆ(124.216) 17:32 26 0
2875291 야널 일찍 자야징 [2] ♥팬티스타킹냥덩♥갤로그로 이동합니다. 17:07 26 0
2875290 내가 느끼는게 특갤을 보면 AI에 대한 잘못된 믿음이 전파되는거같음. ㅆㅇㅆ(124.216) 17:04 37 0
2875289 날더워가 피곤한둣 ♥팬티스타킹냥덩♥갤로그로 이동합니다. 17:02 16 0
2875288 ㅋㅋ 프갤 넥도리아,ㅆㅇㅆ,냥덩 이런장애인들 밖에 안남았네 [1] 프갤러(121.139) 17:01 33 0
2875286 에어컨 쐬다 나오면 따뚯행 ♥팬티스타킹냥덩♥갤로그로 이동합니다. 16:59 18 0
2875282 나 귀멸의 칼날 오니 심정 이해가 감 [2] ㅆㅇㅆ(124.216) 16:53 29 0
2875280 존나 더워서 콩국수 먹으러 옴 [3] 아스카영원히사랑해갤로그로 이동합니다. 16:52 40 0
2875275 [참고물] 시스템 데이터베이스로 보는 컴퓨팅 로직.. [3] +abcd3421갤로그로 이동합니다. 16:44 30 0
2875270 프갤은 취직한 애들 위주로 있긴한데 여기보다는 블라나 OKKY가 [4] ㅆㅇㅆ(124.216) 16:36 61 0
2875268 퍼블출신이 개발배워서 바꾸는거 노답임? [7] ㅇㅇ(211.234) 16:32 70 0
2875265 내일이면 버전업 가능할까요 나르시갤로그로 이동합니다. 16:32 14 0
2875262 왜이렇게 좆밥이 맨날 여기와서 뭐라도 되는척하지? 프갤러(121.139) 16:27 38 2
2875260 난 좀 이해가 안가는게 걍 전에 기초도 쳐몰라서 털린 새끼가 ㅆㅇㅆ(124.216) 16:26 45 0
2875258 댓다는 꼬라지보면 좆밥병신인데 왜 자꾸 차단했다는데 댓글다는거지 ㅆㅇㅆ(124.216) 16:22 26 0
2875251 누가 나님 냥덩이 만진거야? [1] ♥팬티스타킹냥덩♥갤로그로 이동합니다. 16:13 29 0
2875250 근데 공부할수록 코딩 테스트에 집착할수록 회사 부품되지 않냐 [4] ㅆㅇㅆ(124.216) 16:05 81 1
2875249 코테 보는게 낫지 않나? 코딩 자신 없어? [1] 프갤러(110.8) 15:51 40 0
2875248 고양이의 만행..ㅇㅅㅇ [1] 헤르 미온느갤로그로 이동합니다. 15:41 21 0
2875247 이 당시에 유튜브가 있었다면 강남스타일이랑 삐까 ♥팬티스타킹냥덩♥갤로그로 이동합니다. 15:21 16 0
2875246 나가볼까냥... [1] 넥도리아(119.195) 15:20 27 0
2875245 언리얼은 상속 기반 계층 오버라이드라 더럽게 쓰기힘든데 ㅆㅇㅆ(124.216) 15:18 25 0
2875244 뚫훍쏭⭐+ ♥팬티스타킹냥덩♥갤로그로 이동합니다. 15:16 19 0
2875243 지금 프로그래밍 언어 공부하면 [2] 성용인품(119.202) 14:44 55 0
2875240 옵시디언 결제하면 동기화 잘 되냐 오뜨치즈맛갤로그로 이동합니다. 14:37 23 0
2875236 1년 내내 선선한 가을날씨 국가 지역 리스트 [1] ♥팬티스타킹냥덩♥갤로그로 이동합니다. 14:26 28 0
2875235 오늘 미친 수준으로 덥네 [2] 프갤러(121.129) 14:24 53 2
2875234 디시클리너유명재한테 프갤러(211.119) 14:21 18 0
2875233 헬조선이 유독 코딩테스트 많이 보는 거임? [1] 프갤러(110.13) 14:18 40 0
2875232 차라리 여름에는 덜덥고 겨울에 무지하게 추웠으면 류류(203.234) 14:15 24 0
2875230 햐 이런 날씨에 고졸들 상하차 야가다 시켜야되는데 ㅇㅅㅇ 류류(118.235) 14:07 24 1
2875229 날씨 지옥인데 ㅇㅅㅇ 류류(118.235) 14:04 18 1
2875228 밑에 깃이야기나와서 말인데 울회사는 원래 svn쓰는데 어떤놈이 깃이 최신 ㅇㅇ(211.234) 14:03 22 0
2875227 내 방 34.8도 발명도둑잡기(118.216) 13:58 14 0
2875226 JVM이 망할 일은 없겠다 프갤러(125.179) 13:49 52 0
2875223 프로그래밍 독학으로 잘해지고싶은데 [7] 프갤러(133.114) 13:43 56 0
2875222 혹시 추천해주실수있나요? [1] 프갤러(121.185) 13:35 47 0
뉴스 '좀비딸' 조정석 "6세 딸 위해 목숨도 걸 수 있어요"[인터뷰] 디시트렌드 07.25
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2