펄, 파이선, 루비 등의 스크립트 언어 중에 하나 정도는 알아 두는게 편할 것 같다는 생각에 이번 달에는 루비를 공부하고 있다. 책의 절반을 쭉 읽어 나가면서 코드는 한번도 작성한 적이 없었지만 언어가 간결해서 그런지 몰라도 쉽게 원하는 코드를 작성할 수 있었다.

지금 진행하고 있는 프로젝트는 코볼 컴파일러의 개발인데, 컴파일러가 생성한 코드가 정확한가를 확인하는 가장 쉬운 방법은 기존의 컴파일러가 생성한 코드와 수행 결과(stdout)을 비교하는 것.

지금까지는 급한 마음에 두 실행파일을 번갈아 실행하며 눈으로 수행결과를 비교했는데, "실용주의 프로그래머"를 보면 테스트를 포함한 프로젝트 빌드의 전과정을 자동으로 수행할 수 있도록 할 것을 강조하고 있다.

그리하여 고즈넉한 저녁에 잠깐의 짬과 약간의 용기를 내어 처음으로 루비를 사용해 간단한 test harness를 작성해 보았다.

name_list = [
    'intrinsic_math_func',
    'intrinsic_char_func',
    'intrinsic_case_func',
    'intrinsic_value_func',
    'intrinsic_divide_func',
    'intrinsic_numval',
    'intrinsic_annuity'
]

test_cnt = 0
succ_cnt = 0
fail_cnt = 0

# TODO
# compare execution time
name_list.each do |name|

    test_cnt += 1

    mf_exec = "./" + name + ".cob32"
    tmax_exec = "./" + name + ".gcobol"

    mf_stdout = `#{mf_exec}`
    tmax_stdout = `#{tmax_exec}`

    print "[#{test_cnt}] #{mf_exec} vs #{tmax_exec}"
    if (mf_stdout == tmax_stdout)
        puts " ...success"
        succ_cnt += 1
    else
        puts " ...fail"
        fail_cnt += 1
        puts "[#{mf_exec}]"
        puts mf_stdout
        puts "[#{tmax_exec}]"
        puts tmax_stdout
    end
    puts
end

puts
puts "Total : #{test_cnt}"
puts "Success : #{succ_cnt}"
puts "Fail : #{fail_cnt}"
puts

컴파일러가 생성한 코드의 수행시간 역시 컴파일러를 평가하는데 중요한 이슈이므로, 두가지 컴파일러가 생성한 코드의 수행시간을 자동으로 비교해 주는 프로그램을 루비로 간단히 작성하는 것도 큰 의미가 있을 것 같다. 사용하기 쉬운 루비 언어를 조금 더 연습해서 프로젝트의 여기저기에 잘 활용한다면 생산성을 향상 시킬 수 있을 것이다.

+ Recent posts