Upgrade to Pro — share decks privately, control downloads, hide ads and more …

php_mecabをFFIで実装してみよう

 php_mecabをFFIで実装してみよう

PHPカンファレンス2022の発表資料です。
かつて自分がPHP MeCab Extensionを実装したときはC言語でバインディングを書くのが一般的な方法でした。
しかしPHP 7.4からはFFI (Foreign Function Interface) が導入され、C言語を書かなくてもC言語で書かれたライブラリが利用できるようになりました。
php_mecabをFFIを使って再実装する実例を元に、以下の解説をします。
・FFIの基本的な使い方
・メモリ管理
・FFIでできること
・FFIでできないこと

Ryusuke SEKIYAMA

September 25, 2022
Tweet

More Decks by Ryusuke SEKIYAMA

Other Decks in Programming

Transcript

  1. ؔࢁོհ ͖ͤ΍·ΓΎ͏͚͢ !STLZ w ͔ͭͯ$ݴޠͰ࣮૷ͨ͠ 
 QIQ@NFDBCΛ࡞͍ͬͯ·ͨ͠ w ࡢ೥݄ʹ3"#0 *ODʹస৬

    
 $BUMPHͷόοΫΤϯυ୲౰ w ͻ͞ͼ͞ʹ࢓ࣄͰ1)1Λ࢖ͬͯ 
 ͍·͢ 1)1 4ZNGPOZ  w ͣͬͱ࣮Ոʹݘ͕͍ͨͷͰݘ೿ w ೣ΋େ޷͖ 4PGUXBSF%FTJHOࢽͷදࢴྑ͍Ͱ͢Ͷ ࣗݾ঺հ Ωϟτϩά
  2. 1)1''* ΠϯτϩμΫγϣϯ w 1)1͔Βಋೖ w IUUQTXXXQIQOFU f  w $ݴޠͷ"1*Λ1VSF1)1ίʔυ͔Βݺͼग़ͤΔ

    w $ݴޠҎ֎ͷϥΠϒϥϦʹ͸ඇରԠ w 3VTU΍(P౳ɺ$ݴޠ޲͚ͷڞ༗ϥΠϒϥϦΛ 
 ࡞ΕΔݴޠͰ࡞ͬͨؔ਺͸0,
  3. 1)1''* ;FOEFYUFOTJPO"1* $ݴޠͰॻ͘1)1ػೳ֦ு ͱൺֱ ''* ;FOEFYUFOTJPO"1* ֎෦ϥΠϒϥϦͷར༻ Ͱ͖Δ Ͱ͖Δ 1)1ͦͷ΋ͷͷৼΔ෣͍มߋ

    Ͱ͖ͳ͍ Ͱ͖Δ $ݴޠͷ஌ࣝ ඞཁ ඞཁ Ϗϧυ༻πʔϧνΣʔϯ ίϯύΠϥɾϦϯΧ౳ ෆཁ ඞཁ 1)1ͷόʔδϣϯΞοϓରԠ ෆཁ ˞''*ʹഁյతͳมߋ͕ೖΒͳ͍ݶΓ͸ ඞཁ
  4. จࣈྻͷ഑ྻ w $ؔ਺ʹ౉͢จࣈྻͷ഑ྻ͸ࣗલͰ࡞Δඞཁ͋Γ w ӈͷྫͰ͸FFI::arrayType()Λ࢖ͬͯchar *ͷ࣍ݩ഑ྻΛ࡞੒ w 1)1ͷจࣈྻΛPXOFEͰͳ͍$%BUBʹม׵͠ ͯ഑ྻʹ٧ΊΔ w

    "SSBZ5ZQF͸ͦͷཁૉͷॴ༗ݖΛ࣋ͨͳ͍ ʢ࣋ͯͳ͍ʣͨΊ w 1)1Ͱ͸ීஈҙࣝ͠ͳ͍ψϧऴ୺Λ͖ͬͪΓͱ w 0XOFEͰͳ͍FFI::new()ͨ͠$%BUB͸ࣗ෼ ͰFFI::free()͢Δ ࣮ફ5JQT
  5. w ܕͷͳ͍FFI\CDataͷΦʔόʔϩʔυ͞ ΕͨϓϩύςΟʹܕΛ͚ͭΔ w int΍floatͷΑ͏ͳϓϦϛςΟϒܕ΍ɺ string˱char*͸҉໧తʹม׵͞ΕΔ w ߏ଄ମ΍഑ྻͷϝϯόͷchar*΁ͷ୅ೖ͸҉໧తʹ ม׵͞Εͳ͍౳ͷ੍໿΋͋Δ w

    surface()Ͱ͸ɺnode->surface͸ղ ੳݩͷจࣈྻͷઌ಄͔ΒϙΠϯλΛਐΊͨ ΋ͷͰɺޙΖʹ༨෼ͳ಺༰ΛؚΜͰ͍Δͷ Ͱඞཁͳ௕͚ͩ͞Λίϐʔ͍ͯ͠Δ ࣮ફ5JQT ߏ଄ମ͸ΫϥεͰϥοϓ
  6. ''* ࢖ͬͯΈͨײ૝ w ࢥͬͨΑΓ؆୯ʹ࢖͑ͨ w $ίʔυͷղੳ΍ܕม׵͕͔ͬ͠Γ࡞Γࠐ·Ε͍ͯΔ w Φʔφʔγοϓʹ͍ͭͯ΋ͪΌΜͱߟ͑ΒΕ͍ͯΔ w *%&ʹΑΔิ׬͕ޮ͔ͳ͍ͷ͸໘౗

    w 1)1ϚχϡΞϧͰ͸ڧΊͷܯࠂ͞Ε͍ͯΔ͕࣮ઓ౤ೖͯ͠Α͍ͱࢥ͏ w ग़དྷ߹͍ͷϥΠϒϥϦΛ࢖͏Ҏ֎ʹ΋ɺ1)1ʹෆ޲͖ͳߴ଎Խ͍ͨ͠ॲཧΛ3VTU΍ (P౳Ͱॻ͍ͯ$͔Β࢖͑ΔΑ͏ʹͯ͠ɺ''*ܦ༝Ͱݺͼग़͢ͷ͸ಛʹΞϦͩͱࢥ͏