펄, 파이선, 루비 등의 스크립트 언어 중에 하나 정도는 알아 두는게 편할 것 같다는 생각에 이번 달에는 루비를 공부하고 있다. 책의 절반을 쭉 읽어 나가면서 코드는 한번도 작성한 적이 없었지만 언어가 간결해서 그런지 몰라도 쉽게 원하는 코드를 작성할 수 있었다.
지금 진행하고 있는 프로젝트는 코볼 컴파일러의 개발인데, 컴파일러가 생성한 코드가 정확한가를 확인하는 가장 쉬운 방법은 기존의 컴파일러가 생성한 코드와 수행 결과(stdout)을 비교하는 것.
지금까지는 급한 마음에 두 실행파일을 번갈아 실행하며 눈으로 수행결과를 비교했는데, “실용주의 프로그래머”를 보면 테스트를 포함한 프로젝트 빌드의 전과정을 자동으로 수행할 수 있도록 할 것을 강조하고 있다.
그리하여 고즈넉한 저녁에 잠깐의 짬과 약간의 용기를 내어 처음으로 루비를 사용해 간단한 test harness를 작성해 보았다.
‘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
컴파일러가 생성한 코드의 수행시간 역시 컴파일러를 평가하는데 중요한 이슈이므로, 두가지 컴파일러가 생성한 코드의 수행시간을 자동으로 비교해 주는 프로그램을 루비로 간단히 작성하는 것도 큰 의미가 있을 것 같다. 사용하기 쉬운 루비 언어를 조금 더 연습해서 프로젝트의 여기저기에 잘 활용한다면 생산성을 향상 시킬 수 있을 것이다.