How to compile Ruby?

后端 未结 7 1923
青春惊慌失措
青春惊慌失措 2020-12-13 14:22

Is there a tool that can allow me to compile Ruby code so that it runs somewhat faster?

For example, I have heard that there is a tool for Python called \"pyc\" tha

7条回答
  •  醉梦人生
    2020-12-13 14:35

    The following "selfcontained" ruby test-case is based on the examples from this very thread, from the comment/answer of the user named illusionist.

    #!/usr/bin/env ruby
    #==========================================================================
    # This file is in public domain.
    # The code of this file is based on the code fragments at the
    # 2018_12_09 version of the:
    #
    #     https://stackoverflow.com/questions/5902334/how-to-compile-ruby
    #
    # This file has been tested with the ruby version
    #
    #     ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-linux]
    #
    #-----start--of--the--boilerplate------------------------------------------
    
    s_fp_home=ENV["HOME"].to_s
    s_fp_tmp=s_fp_home+"/tmp" # using /tmp can be a security risk
    s_fp_demofolder=s_fp_tmp+"/ruby_bytecode_usage_demo_01"
    
    def create_folder_if_needed(s_fp_in)
       if !Dir.exists? s_fp_in
          Dir.mkdir(s_fp_in)
          if !Dir.exists? s_fp_in
             raise(Exception.new("\n\n Folder creation failed.\n"+
             "GUID=='d6e409cb-e072-4441-9421-22630190c2e7'\n"))
          end # if
       end # if
    end # create_folder_if_needed
    create_folder_if_needed(s_fp_tmp)
    create_folder_if_needed(s_fp_demofolder)
    
    s_rand=""
    7.times{s_rand<<("_"+rand(100).to_s)}
    
    s_fp_bytecode=s_fp_demofolder+"/awesome_bytecode"+s_rand
    s_fp_src=s_fp_demofolder+"/x"+s_rand+".rb"
    
    if File.exists? s_fp_src
       raise(Exception.new("\n\n This file should not exist yet.\n"+
       " s_fp_src=="+s_fp_src+"\n"+
       "GUID=='43ab3d45-1324-47af-9441-22630190c2e7'\n"))
    end # if
    IO.write(s_fp_src,"puts('');puts('Greetings from bytecode!');puts('')")
    if !File.exists? s_fp_src
       raise(Exception.new("\n\n The file \n"+s_fp_src+"\n is missing.\n"+
       "GUID=='4aeb5e54-efe0-4111-a851-22630190c2e7'\n"))
    end # if
    
    
    #-----start--of--the--core--of--the--demo----------------------------------
    
    bytecode_out = RubyVM::InstructionSequence.compile_file(s_fp_src)
    IO.binwrite(s_fp_bytecode, bytecode_out.to_binary)
    
    bytecode_in = IO.binread(s_fp_bytecode)
    instruction_from_byte_code = RubyVM::InstructionSequence.load_from_binary(bytecode_in)
    instruction_from_byte_code.eval
    
    #==========================================================================
    

提交回复
热议问题