Slide 1

Slide 1 text

INTRODUCTION TO PERL 6 NATIVE CALL 2016-07-29 @Kichijoji.pm GitHub: @yowcow Twitter: @beaconsco

Slide 2

Slide 2 text

WHO I AM My name is Yoko Oyama Have GitHub @yowcow Work for Marketing Applications, Inc.

Slide 3

Slide 3 text

Recently created Perl 6 modules: D i g e s t : : M u r m u r H a s h 3 Murmurhash3 hashing for Perl 6 Uses native call! A l g o r i t h m : : B l o o m F i l t e r A bloom lter implementation with murmurhash3 hashing

Slide 4

Slide 4 text

THINGS TO BE DISCUSSED Perl 6 Native library call Compiling and building a native library Types in native call Pitfalls Creating a module with native call Why C now?

Slide 5

Slide 5 text

PERL 6

Slide 6

Slide 6 text

Perl 6 -- Many new features greatly advance our tradition of expressive and feature-rich programming http://perl6.org/

Slide 7

Slide 7 text

CHARACTERISTICS Object-oriented programming including generics, roles and multiple dispatch Functional programming primitives, lazy and eager list evaluation, junctions, autothreading and hyperoperators (vector operators) Parallelism, concurrency, and asynchrony including multi-core support De nable grammars for pattern matching and generalized string processing Optional and gradual typing

Slide 8

Slide 8 text

INSTALLATION http://perl6.org/downloads/ or through https://github.com/tadzik/rakudobrew

Slide 9

Slide 9 text

u s e v 6 ; u s e T e s t ; c l a s s M y C l a s s { o u r s u b a d d - a l l ( * @ n u m b e r s ) r e t u r n s I n t { [ + ] @ n u m b e r s ; } } m y I n t $ n u m b e r = 1 ; i s M y C l a s s : : a d d - a l l ( $ n u m b e r , 2 , 3 ) , 6 , ' 1 + 2 + 3 i s 6 ' ; d o n e - t e s t i n g ;

Slide 10

Slide 10 text

NATIVE LIBRARY CALL

Slide 11

Slide 11 text

Native libraries are -- -- platform-speci c library les, including . d l l , . s o Something reusable, and compiled down into platform- speci c machine code. Ref: http://www.ibm.com/support/knowledgecenter/SSAW57_8.0.0/com.ibm.websphere.nd.doc/info/ae/ae/tc

Slide 12

Slide 12 text

In Perl 6, we can call C library through N a t i v e C a l l . https://docs.perl6.org/language/nativecall

Slide 13

Slide 13 text

libhoge.c # i n c l u d e < s t d i n t . h > u i n t 3 2 _ t a d d _ u i n t 3 2 ( u i n t 3 2 _ t a , u i n t 3 2 _ t b ) { r e t u r n a + b ; } MyHoge.pm6 u s e v 6 ; u s e N a t i v e C a l l ; u n i t m o d u l e M y H o g e ; o u r s u b a d d ( u i n t 3 2 , u i n t 3 2 ) r e t u r n s u i n t 3 2 i s n a t i v e ( ' . / l i b h o g e . s o ' ) i s s y m b o l ( ' a d d _ u i n t 3 2 ' ) { * }

Slide 14

Slide 14 text

COMPILING AND BUILDING A NATIVE LIBRARY

Slide 15

Slide 15 text

CREATE A SHARED OBJECT WITH GCC Compile C code into object le g c c - O 2 - f P I C - c l i b h o g e . c - o l i b h o g e . o Link object into executable le g c c - O 2 - f P I C - s h a r e d l i b h o g e . o - o l i b h o g e . s o

Slide 16

Slide 16 text

GCC OPTIONS IN USE - O 2 : Optimize - f P I C : Create "Position Independent Code" - c : No linking - o : Output le - s h a r e d : Create shared object

Slide 17

Slide 17 text

TEST NATIVE CALL FROM PERL 6 test.p6 u s e v 6 ; u s e M y H o g e ; u s e T e s t ; i s M y H o g e : : a d d ( 1 , 2 ) , 3 , ' 1 + 2 i s 3 ' ; d o n e - t e s t i n g ; Run test: p r o v e - e " p e r l 6 - I . " t e s t . p 6 t e s t . p 6 . . o k A l l t e s t s s u c c e s s f u l . F i l e s = 1 , T e s t s = 1 , 0 w a l l c l o c k s e c s ( 0 . 0 1 u s r 0 . 0 1 s y s + 0 . 4 6 c u s r 0 . 0 5 R e s u l t : P A S S

Slide 18

Slide 18 text

AUTOMATION WITH MAKEFILE Create a Make le like: . P H O N Y : t e s t c l e a n C F L A G S = - f P I C - O 2 a l l : l i b h o g e . s o l i b h o g e . s o : l i b h o g e . o $ ( C C ) $ ( C F L A G S ) - s h a r e d l i b h o g e . o - o $ @ l i b h o g e . o : l i b h o g e . c $ ( C C ) $ ( C F L A G S ) - c l i b h o g e . c - o $ @ t e s t : l i b h o g e . s o p r o v e - e " p e r l 6 - I . " t e s t . p 6 c l e a n : - r m l i b h o g e . o l i b h o g e . s o and do: m a k e & & m a k e t e s t & & m a k e c l e a n

Slide 19

Slide 19 text

TYPES IN NATIVE CALL

Slide 20

Slide 20 text

AVAILABLE TYPES Ref: https://docs.perl6.org/language/nativecall#Passing_and_Returning_Values

Slide 21

Slide 21 text

STATIC TYPING When using native call... Explicitly declare variable types Pass a variable as a speci c type into C library Interpret what C library returns as a speci c type

Slide 22

Slide 22 text

ARRAYS Use class C A r r a y [ t y p e ] for C array. i n t 3 2 _ t a d d _ a l l ( i n t 3 2 _ t n u m b e r s [ ] , u i n t 3 2 _ t s i z e ) { u i n t 3 2 _ t i ; i n t 3 2 _ t s u m = 0 ; f o r ( i = 0 ; i < s i z e ; i + + ) { s u m + = n u m b e r s [ i ] ; } r e t u r n s u m ; } s u b a d d - a l l ( C A r r a y [ i n t 3 2 ] , u i n t 3 2 ) r e t u r n s i n t 3 2 i s n a t i v e ( ' . / l i b h o g e . s o ' ) i s s y m b o l ( ' a d d _ a l l ' ) { * } m y @ n u m b e r s : = C A r r a y [ u i n t 3 2 ] . n e w ; @ n u m b e r s [ 0 ] = 1 ; @ n u m b e r s [ 1 ] = 2 ; @ n u m b e r s [ 3 ] = 3 ; i s a d d - a l l ( @ n u m b e r s , @ n u m b e r s . e l e m s ) , 6 ;

Slide 23

Slide 23 text

STRUCT t y p e d e f s t r u c t p e r s o n { u i n t 3 2 _ t i d ; c h a r * n a m e ; } P e r s o n ; P e r s o n * P e r s o n _ c r e a t e ( u i n t 3 2 _ t i d , c h a r * n a m e ) { P e r s o n * p = m a l l o c ( s i z e o f ( P e r s o n ) ) ; p - > i d = i d ; p - > n a m e = n a m e ; r e t u r n p ; }

Slide 24

Slide 24 text

Use type C S t r u c t for struct object. c l a s s P e r s o n r e p r ( ' C S t r u c t ' ) { h a s u i n t 3 2 $ . i d ; h a s S t r $ . n a m e ; s u b c r e a t e ( u i n t 3 2 , S t r ) r e t u r n P e r s o n i s n a t i v e ( . / l i b h o g e . s o ' ) i s s y m b o l ( ' P e r s o n _ c r e a t e ' ) { * } m e t h o d n e w ( I n t : $ i d , S t r : $ n a m e ) { c r e a t e ( $ i d , $ n a m e ) } } m y P e r s o n $ p = P e r s o n . n e w ( i d = > 1 2 3 , n a m e = > ' h o g e ' ) ; i s $ p . i d , 1 2 3 ; i s $ p . n a m e , ' h o g e ' ;

Slide 25

Slide 25 text

Memory is managed by Perl 6. When the last reference to a struct object goes away, GC will free the memory. Except when struct-based type is used. Object members are not in "containers" Assigning a value to a member will not work t y p e d e f s t r u c t l i n e { P o i n t * p 1 , P o i n t * p 2 } L i n e ; / / M u s t f r e e b y y o u r s e $ ! i d = 1 2 3 4 ; # C a n n o t a s s i g n t o a n i m m u t a b l e v a l u e

Slide 26

Slide 26 text

PITFALLS

Slide 27

Slide 27 text

USE BINDING : = FOR C-ARRAY Write either: m y @ a r r a y : = C A r r a y [ u i n t 3 2 ] . n e w ; or m y $ a r r a y = C A r r a y [ u i n t 3 2 ] . n e w ; and not m y @ a r r a y = C A r r a y [ u i n t 3 2 ] . n e w ; Ref https://docs.perl6.org/language/nativecall#Arrays

Slide 28

Slide 28 text

UNSIGNED INT BECOMES SIGNED IN C-ARRAY Type u i n t 3 2 works for scalar... # i n c l u d e < s t d i n t . h > u i n t 3 2 _ t b i g _ u i n t 3 2 ( ) { r e t u r n s U I N T 3 2 _ M A X ; } u s e v 6 ; u s e N a t i v e C a l l ; s u b b i g _ u i n t 3 2 ( ) r e t u r n u i n t 3 2 i s n a t i v e ( ' . . . ' ) { * } s a y b i g _ u i n t 3 2 ( ) ; # 4 2 9 4 9 6 7 2 9 5

Slide 29

Slide 29 text

But when it's CArray... v o i d b i g _ u i n t 3 2 _ a r r a y ( u i n t 3 2 _ t n u m b e r s [ ] ) { n u m b e r s [ 0 ] = U I N T 3 2 _ M A X ; } u s e N a t i v e C a l l ; s u b b i g _ u i n t 3 2 _ a r r a y ( C A r r a y [ u i n t 3 2 ] ) i s n a t i v e ( ' . . . ' ) { * } m y @ n u m : = C A r r a y [ u i n t 3 2 ] . n e w ; @ n u m [ 0 ] = 0 ; b i g _ u i n t 3 2 _ a r r a y ( @ n u m ) ; s a y @ n u m [ 0 ] ; # - 1

Slide 30

Slide 30 text

What I did in D i g e s t : : M u r m u r H a s h 3 ... c o n s t a n t U I N T 3 2 _ M A X = 4 2 9 4 9 6 7 2 9 5 ; o u r s u b f i x - s i g n - b i t ( I n t : D $ v - - > I n t ) { $ v . s i g n = = - 1 ? ? $ v + 1 + U I N T 3 2 _ M A X ! ! $ v ; }

Slide 31

Slide 31 text

CREATING A MODULE WITH NATIVE CALL

Slide 32

Slide 32 text

Install App::Mi6 LibraryMake and see https://github.com/skaji/perl6-librarymake-example

Slide 33

Slide 33 text

APP::MI6 Perl 5's Minilla-like module skelton generator, and builder Does basic M E T A 6 . j s o n management and build R E A D M E . m d from POD

Slide 34

Slide 34 text

LIBRARYMAKE Helps compiling and building a native library Generates a M a k e f i l e from a template M a k e f i l e . i n Derives appropriate native library extension . s o , . d l l , or . d y l i b for a platform

Slide 35

Slide 35 text

SEE ALSO Important information on module authoring Helpful tools when developing a module https://docs.perl6.org/language/modules#Distributing_Modu https://docs.perl6.org/language/modules-extra

Slide 36

Slide 36 text

OTHER USEFUL RESOURCES

Slide 37

Slide 37 text

LEARN C THE HARD WAY http://c.learncodethehardway.org/book/

Slide 38

Slide 38 text

K AND R BOOK The C Programming Language

Slide 39

Slide 39 text

WHY C NOW? C language is old. Today, "Go" and other languages are taking its position. But C still brings us a good opportunity to learn. How programs are compiled, linked, and ran How memory is allocated, used, and freed How to resolve realworld problems with primitive functions and libraries

Slide 40

Slide 40 text

WE ARE HIRING!!!1 "We" = Marketing Applications, Inc.

Slide 41

Slide 41 text

(LEAD) IOS DEVELOPER Location: Tokyo Mission: To develop iOS apps, and iOS SDKs In marketing research eld Our Environment: Have iOS app deployed to TW, SG, and ID Global teams in JP, US, CN, KR, PH, SG, US, and GB English communication opportunities Unlimited free beer o ered on every Wednesdays If interested, contact me anytime.

Slide 42

Slide 42 text

No content

Slide 43

Slide 43 text

END