他言語のコミュニティにSwiftで貢献する方法

171 Views

July 25, 26

スライド概要

この資料は、 Sapporo.swift #1 で発表した資料です。
https://japan-region-swift.connpass.com/event/393404/

profile-image

ソフトウェアエンジニア|Swift中心にモバイルアプリやウェブ開発をやっています。 ESP32や3Dプリンタ(Ender3 S1 Pro)を活用して、自宅の作業環境をカスタマイズ中。 シンプルで使いやすいものを作るのが理想。

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

ダウンロード

関連スライド

各ページのテキスト
1.

他言語のコミュニティにSwiftで貢献する方法 鈴木孝宏 (sussan0416), 2026-07-25, Sapporo.swift #1 1

2.

自己紹介 鈴木孝宏(sussan0416) 所属: 株式会社Helpfeel 役職: プロダクトエンジニア、Gyazo担当 北海道との関係 札幌が地元(〜2009, 2025〜) 公立はこだて未来大学出身(2009〜2015) iOSDC、LT登壇します(プロポーザル) 2

3.

函館といえば… エンジニアイベントがいろいろありました Hakodate.swift #1 行きたかったのですが、その日は札幌にいました。 RubyKaigi 2026 初参加、今日はここでの経験と絡めて話します。 NT函館2026mini デジタル系ものづくりイベント。行ってみたかった。 3

4.

今回の話題 から他の言語の関数を呼び出せる仕組みがあるらしい…! を呼び出せるのかを検証 RubyKaigi関連のイベントでLT Rubyistの背中を押す Swiftを通じた、他言語への貢献の可能性 Ruby Swift 4

5.

FFI FFI: Foreign Function Interface 他の言語の関数を呼び出す仕組み に準拠した関数を呼び出せる C ABI (Application Binary Interface) ※ ABI: コンパイル済みバイナリ同士が関数を呼び出すためのルールの一種。FFIでは主に C ABI が利用されます。 ※ FFIはRubyのほか、多くの言語で利用されています。 5

6.

じゃぁ、SwiftはC ABIで関数を公開できるのか 6

7.

できる! 7

8.

@c 属性 関数をC言語から呼び出し可能、列挙型をC言語で表現可能としてマークする方 法。 Swift 6.3から導入。SwiftとC言語のコードの統合が容易になる。 10年ほど、非公式の実験的な属性 @_cdecl が広く使われていた。 詳しい情報は、 Swift https://www.swift.org/blog/swift-6.3-released/#language-and-standard-library https://github.com/swiftlang/swift-evolution/blob/main/proposals/0495cdecl.md を知って初めて `@c` 属性を知りました…。 FFI 8

9.
[beta]
簡単な実装例
import Foundation
@c
public func swift_replace_ruby(_ input: UnsafePointer<CChar>)
-> UnsafeMutablePointer<CChar>
{
let str = String(cString: input)
let result = str.replacingOccurrences(of: "Ruby", with: "Swift")
return strdup(result)! // ⚠ARC効かなくなる
}
@c(swift_free)
public func swift_memory_free(_ ptr: UnsafeMutablePointer<CChar>?) {
free(ptr) // ⚠使い終わったらメモリ解放のために呼んでもらう
}

(Rubyに何か因縁があるわけではないです)

9

10.

コンパイルします。 $ swiftc -emit-library -o lib_replace_ruby.dylib ReplaceRuby.swift 10

11.

ができました。 dynamic library $ file lib_replace_ruby.dylib lib_replace_ruby.dylib: Mach-O 64-bit dynamically linked shared library arm64 参考: iOSDC Japan 2019: ライブラリのインポートとリンクの仕組み… / Kishikawa Katsumi 24:00〜 11

12.

公開されているシンボルも確認できます。 $ nm -gU lib_replace_ruby.dylib 0000000000000cd4 T _swift_free 00000000000009c0 T _swift_replace_ruby 12

13.

から呼ぶ例 Ruby require "ffi" module SwiftLib extend FFI::Library ffi_lib './lib_replace_ruby.dylib' attach_function :swift_free, [:pointer], :void class SwiftString < FFI::AutoPointer def self.release(ptr) SwiftLib.swift_free(ptr) end end attach_function :swift_replace_ruby, [:string], SwiftString end ptr = SwiftLib.swift_replace_ruby(ARGV[0]) puts ptr.read_string 側で公開したシンボルのattach処理と、使用を終えたインスタンスのメモリを解放する例 Swift 13

14.

$ ruby replace_ruby.rb "I like Ruby." I like Swift. からSwiftの関数を呼べた! Ruby (Rubyに何か因縁があるわけではないです) 14

15.

@c で使える型 公開する関数の引数・返り値の型は、Cで表現できる型のみ。 Int, UInt, Int8, Float, Double, Bool, etc. CChar, CInt, CUnsignedInt, CLong, CLongLong, etc. など(SE-0495を参照) 関数の中では、通常通り、Swiftの型を使える。 15

16.

活用の可能性 既存のSwiftコードの活用 他言語の実装の一部をSwift化 VisionやFoundation Modelsにアクセスしやすくする Swiftで、他言語の開発に貢献できる期待 16

17.

の関連イベントでLT RubyKaigi 終了後に、函館市電の車内でLTしました。 RubyKaigi https://smarthr.connpass.com/event/385269/ https://www.docswell.com/s/sussan0416/K7NG3W-2026-04-25-Tram-LT 17

18.

をきっかけに知識の環流が起きる LT の内容について、bashさんのブログ RubyからSwiftを呼び出すお話をきいてこれは実用的だ!と思い、帰って試しまし た。 LT https://retrospective.hatenadiary.com/entry/2026/05/02/114306 18

19.

の 実行をRubyで完結 Vision framework OCR さんのブログによると… Swiftで書いたCLIを外部プロセスとして呼び出す方式だった Rubyのプロセスで完結するようシンプルな構成にすることができた とのこと。 https://github.com/bash0C7/rb-vision-ocrmac として公開されています bash 余談: bashさん、iOSDCのルーキーズLTで登壇されるそうです(プロポーザル) (この話題ではなさそう) 19

20.

段階的なSwiftの導入ができている例では……!? 20

21.

他言語のコミュニティへ行くと… 自分がメインで使う技術以外のイベントに参加してみると、新しい発見や刺激を 受ける 広がった興味で得た知識を還元する、それがまたSwiftへ還元する… 好奇心のループ・知識のループが生まれる 21

22.

を通じた、他言語への貢献の可能性 Swift 他言語のコミュニティへ行く その言語が困っていること、欲しがっている機能を知る。 Swiftの得意分野と接続する Apple Framework、安全なネイティブ実装、既存Swift資産などを提供する。 @c で小さく公開する @c で境界を作り、相手の言語からFFIで呼べる形にする。 このような関わり方であれば、普段使っているSwiftを通して、他の言語のコミュニテ ィに貢献することができるかも…! 22