SPVM

  Static Perl Virtual Machine. Fast calculation & Easy C/C++ Binding
  
  See SPVM document
  
  https://metacpan.org/pod/SPVM

DEVELOPERS NOTE
  
  TESTS
    
    Do tests
    
      perl Makefile.PL
      make
      make test
    
    Cleanup
    
      make clean
      
    Create distribution
      
      perl Makefile.PL
      rm MANIFEST
      make manifest
      make disttest
      make dist
    
    Unit tests
    
      make && perl -Mblib t/default/convert.t

  SOLE TESTS

    Create exe file by spvmcc command
      
      yacc/bison.sh && perl Makefile.PL && make && perl -Mblib blib/script/spvmcc -B solo/spvm_build -I solo/lib -o solo/myexe TestCase && solo/myexe foo bar
      
    SPVM solo test command

       # Normal run
       yacc/bison.sh && perl Makefile.PL && make && perl solo/solo_Makefile.PL && make -f solo/Makefile && ./solo/main foo bar

       # Debug run - Print AST, package information, operaion codes
       yacc/bison.sh && perl Makefile.PL --OPTIMIZE="-O0 -g" --DEFINE=SPVM_DEBUG_DUMP --DEFINE=SPVM_DEBUG_OBJECT_COUNT && make && perl solo/solo_Makefile.PL  --OPTIMIZE="-O0 -g" --DEFINE=SPVM_DEBUG_DUMP --DEFINE=SPVM_DEBUG_OBJECT_COUNT && make -f solo/Makefile && ./solo/main foo bar

       # Debug run - Only syntax check, don't use core library
       yacc/bison.sh && perl Makefile.PL --OPTIMIZE="-O0 -g" --DEFINE=SPVM_DONT_USE_CORE_LIB && make && perl solo/solo_Makefile.PL  --OPTIMIZE="-O0 -g" --DEFINE=SPVM_DONT_USE_CORE_LIB && make -f solo/Makefile && ./solo/main foo bar

       # Debug run - Print yacc result
       yacc/bison.sh && perl Makefile.PL --OPTIMIZE="-O0 -g" --DEFINE=SPVM_DEBUG_YACC --DEFINE=SPVM_DONT_USE_CORE_LIB && make && perl solo/solo_Makefile.PL  --OPTIMIZE="-O0 -g" --DEFINE=SPVM_DEBUG_YACC --DEFINE=SPVM_DONT_USE_CORE_LIB && make -f solo/Makefile && ./solo/main foo bar

    See batcktrace of core dump

      gdb solo/main core.*

    What is solo test command?

      solo test is used for debgug.
      
      SPVM is compiled to dynamic link library by -O3 option.
      
      this is difficult to debug because debug information is removed and it is not simple machine code.
      
      If you use the above solo test commands, you can create
      
        solo/main
      
      "solo/main" can execute SPVM module by the following way.
      
        ./solo/main

    See core dump

      If you use Debug run, you can see core dump and back trace by gdb command

        gdb spvm core.*
        
        bt
  
  EXE TESTS
    
    SPVM can create exe file.
    
      perl Makefile.PL
      make && perl -Mblib -- blib/script/spvmcc -I t/default/lib TestCase::MyExe
      env LD_LIBRARY_PATH=spvm_build/work/exe spvm_build/work/exe/TestCase__MyExe
 
      gdb spvm_build/work/exe/MyExe core.*
    
    Debug mode
    
      perl Makefile.PL --OPTIMIZE="-O0 -g" --DEFINE=SPVM_DEBUG_DUMP && \
      make && perl -Mblib -- blib/script/spvmcc -I t/default/lib -B spvm_build/work/exe -n MyExe TestCase::MyExe && \
      gcc -o spvm_build/work/exe/MyExe spvm_build/work/exe/libmy_main.so && \
      spvm_build/work/exe/MyExe
  
  EXTERNAL LIBRARY
    
    For unicode processing, utf8proc is used. SPVM utf8proc is replaced utf8proc to spvm_utf8proc, UTF8PROC to SPVM_UTF8PROC
    
    utf8proc
    https://github.com/JuliaStrings/utf8proc
    
  PORTABILITY NOTE
  
    Compiler type, version and working is various in different environments. 
    Main compiler targets is gcc and clang.
    Main OS targets is Linux/Unix, Windows, macOS.
    To keep maxmam portability, I have the following rule.
  
    - don't use realloc.
    - don't use global variables
    - don't use inline keyword
    - use -std=c99
    - use fgetc instead of getc for FreeBSD compile error
  
  CODING GUIDE LINE
    - use int8_t, int16_t, int32_t, int64_t instead of byte, short, int, long, _Bool.
    - char is used for only character.
    - char[] is used for only string.
    - constant value is defined by enum { } syntax.
    - constant name is ,for example, SPVM_TYPE_C_FLAG_REF.
      all character is upper case or under score. need _C_ between package name and constant base name
    - fix all warnings before CPAN release

COPYRIGHT & LICENSE

  This software is released under the MIT License, see LICENSE.txt.
