Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Go言語からCocoaを使ってみた
Search
matuyuji
August 09, 2014
Programming
140
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Go言語からCocoaを使ってみた
matuyuji
August 09, 2014
More Decks by matuyuji
See All by matuyuji
Emacs × Touch Bar
matuyuji
2
1.9k
ARKit + SceneKitでMinesweeperを作ってみた
matuyuji
1
850
Go + QtでiOS アプリ開発
matuyuji
0
440
@_specialized なお話し
matuyuji
0
540
Xcode Souce Code Extensionを使ってみた
matuyuji
0
470
Codebeatを 試してみた
matuyuji
0
850
React Nativeで UIコンポーネントをつくる
matuyuji
0
1.1k
React Nativeを使ってみた
matuyuji
0
1.5k
SwiftでLens
matuyuji
1
1.1k
Other Decks in Programming
See All in Programming
baseline으로 마이그레이션, 리팩토링 안전하게 맡기기
fornewid
1
950
そのデザイントークン、Flutterでも同じ見た目になりますか?
nakamizu
0
310
エージェントを使い続けるためのメタワーク / Meta-work for keeping using the agent
rkaga
6
2.2k
Будущее локальных LLM – Алексей Голобурдин, PythoNN
sobolevn
0
110
Moscow Python Meetup №112. Как поселить ИИ агентов в event driven архитектуре
moscowdjango
PRO
0
110
はじめてのPLATEAU
nokonoko1203
1
620
Kawaiicon: Kubernetes, it's no longer cool, but let's secure it anyway!
barnbarn
0
120
SFCで実現する病院・医療システムの動的組み立て式UI
koukimiura
1
170
あなたの await、OS まで届いてる? strace で覗く JavaScript の非同期
hasutosasaki
1
2.3k
우리의 Nitro Modules는 당신의 Turbo Modules보다 아름답다
l2hyunwoo
0
260
Rails初心者がパスキーを実装してみて大変だったこと
ktombow
0
150
複数ドメインを一つのアプリに統合するFlutterの設計と運用_FlutterKaigi2026登壇資料(須永高弘)
takahirosunaga
0
160
Featured
See All Featured
Exploring the relationship between traditional SERPs and Gen AI search
raygrieselhuber
PRO
4
4.4k
Introduction to Domain-Driven Design and Collaborative software design
baasie
1
1.1k
Visualization
eitanlees
153
17k
Building a Scalable Design System with Sketch
lauravandoore
464
34k
Code Review Best Practice
trishagee
74
20k
Balancing Empowerment & Direction
lara
6
1.4k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
232
55k
Why Mistakes Are the Best Teachers: Turning Failure into a Pathway for Growth
auna
0
350
The Impact of AI in SEO - AI Overviews June 2024 Edition
aleyda
6
1.3k
Navigating the moral maze — ethical principles for Al-driven product design
skipperchong
2
680
Visual Storytelling: How to be a Superhuman Communicator
reverentgeek
2
740
Bioeconomy Workshop: Dr. Julius Ecuru, Opportunities for a Bioeconomy in West Africa
akademiya2063
PRO
1
450
Transcript
(Pݴޠ͔Β$PDPB ΛͬͯΈͨ @matuyuji ! Cocoaษڧձؔ 2014.8.9
!NBUVZVKJ w TBGYEFWCMPHTQPUKQ w &NBDT͍ w 3FBDUJWF$PDPBؔ
(P͔Β$PDPBΛ͍͍ͨ
! func main() { app := cocoa.NSApplication_sharedApplication() win := cocoa.NSWindow_initWithContentRectStyleMaskBackingDefer(
cocoa.NSRect{0,0, 200,200}, NSTitledWindowMask, NSBackingStoreBuffered, false) win.CascadeTopLeftFromPoint(cocoa.NSPoint{20,20}) win.SetTitle(cocoa.NSString_initWithUTF8String("SomeApp")) win.MakeKeyAndOrderFront(nil) app.ActivateIgnoringOtherApps(true) ! fmt.Println(app, win) fmt.Println(app.GetClassName(), win.GetClassName()) ! app.Run(); } ͜ͷίʔυ͕ಈ͘Α͏ʹ͍ͨ͠ʂ
(P͔Β0CKFDUJWF$ ΛݺͿํ๏
$HP
$HP w (P͔Β$ݴޠίʔυΛݺͼग़͢Έ w ΘΓͱ͍ͮΒ͍
1BDLBHFz$z ! package main ! // #include <stdio.h> import "C"
! func main() { C.puts(C.CString("hello, world!")) } લͷίϝϯτ͕ ύοέʔδCͷͨΊͷ ίʔυʹͳΔ (Pจࣈྻˠ$จࣈྻ $ݴޠͷTUEJPIͷؔ
1BDLBHF$ )FMQFSGVODUJPO • func C.CString(string) *C.char (Pจࣈྻˠ$จࣈྻ • func C.GoString(*C.char)
string $จࣈྻˠ(Pจࣈྻ • func C.GoBytes(unsafe.Pointer, C.int) []byte $όΠτྻˠ(PόΠτྻ
! package main ! /* #include <stdio.h> ! char* hello()
{ return "hello, world!"; } */ import "C" ! func main() { C.puts(C.hello()) }
! package main ! /* int add(int x, int y)
{ return x + y; } */ import "C" import "fmt" ! func main() { fmt.Println(C.add(2, 3)) }
HPCVJMEYGPPHP foo.go foo.cgo1.go foo.cgo2.c Object Object Object cgo Binary 6l
6g clang pack _cgo_defun.c Object 6c ࣮ࡍͬͱෳࡶ‥
(PDPNNBOET 6a 8a 5a 6c 8c 5c 6g 8g 5g
6l 8l 5l assembler c compiler go compiler linker 6 (x86-64) 8 (x86-32) 5 (ARM) Plan 9 ༝དྷ ΞʔΩςΫνϟ πʔϧ
HPCVJMEYGPPHP foo.go foo.cgo1.go foo.cgo2.c Object Object Object cgo Binary 6l
6g clang pack _cgo_defun.c Object 6c
! void _cgo_2434c0b5a67e_Cfunc_add(void *v) { struct { int p0; int
p1; int r; char __pad12[4]; } __attribute__((__packed__)) *a = v; a->r = add(a->p0, a->p1); } ! int add(int x, int y) { return x + y; } ! void ɾ_Cfunc_add(struct{void *y[2];}p) { runtimeɾcgocall(_cgo_2434c0b5a67e_Cfunc_add, &p); } foo.cgo2.c _cgo_defun.c
HPCVJMEYGPPHP foo.go foo.cgo1.go foo.cgo2.c Object Object Object cgo Binary 6l
6g clang pack _cgo_defun.c Object 6c
! package main /* #cgo CFLAGS: -x objective-c #cgo LDFLAGS:
-framework Foundation #import <Cocoa/Cocoa.h> ! NSString* NSString_initWithUTF8String(char* text) { return [[NSString alloc] initWithUTF8String:text]; } ! const char* NSString_descripton(NSString* obj) { return [[obj description] UTF8String]; } */ import "C" import "fmt" ! func main() { str := C.NSString_initWithUTF8String(C.CString("foobar")) fmt.Println(C.GoString(C.NSString_descripton(str))) }
! package main /* #cgo CFLAGS: -x objective-c #cgo LDFLAGS:
-framework Cocoa #import <Cocoa/Cocoa.h> int StartApp(void) { [NSAutoreleasePool new]; [NSApplication sharedApplication]; [NSApp setActivationPolicy:NSApplicationActivationPolicyRegular]; id menubar = [[NSMenu new] autorelease]; id appMenuItem = [[NSMenuItem new] autorelease]; [menubar addItem:appMenuItem]; [NSApp setMainMenu:menubar]; id appMenu = [[NSMenu new] autorelease]; id appName = [[NSProcessInfo processInfo] processName]; id quitTitle = [@"Quit " stringByAppendingString:appName]; id quitMenuItem = [[[NSMenuItem alloc] initWithTitle:quitTitle action:@selector(terminate:) keyEquivalent:@“q"] autorelease]; [appMenu addItem:quitMenuItem]; [appMenuItem setSubmenu:appMenu]; id window = [[[NSWindow alloc] initWithContentRect:NSMakeRect(0, 0, 200, 200) styleMask:NSTitledWindowMask backing:NSBackingStoreBuffered defer:NO] autorelease]; [window cascadeTopLeftFromPoint:NSMakePoint(20,20)]; [window setTitle:appName]; [window makeKeyAndOrderFront:nil]; [NSApp activateIgnoringOtherApps:YES]; [NSApp run]; return 0; } */ import "C" ! func main() { C.StartApp() } LBWVFYBNQMFHP ˒
! func main() { app := cocoa.NSApplication_sharedApplication() win := cocoa.NSWindow_initWithContentRectStyleMaskBackingDefer(
cocoa.NSRect{0,0, 200,200}, NSTitledWindowMask, NSBackingStoreBuffered, false) win.CascadeTopLeftFromPoint(cocoa.NSPoint{20,20}) win.SetTitle(cocoa.NSString_initWithUTF8String("SomeApp")) win.MakeKeyAndOrderFront(nil) app.ActivateIgnoringOtherApps(true) ! fmt.Println(app, win) fmt.Println(app.GetClassName(), win.GetClassName()) ! app.Run(); }
TBGYDMBOHPCKDHP w $MBOH1ZUIPO#JOEJOHTΛར༻ w 0CKFDUJWF$ͷϔομ͔Β(PίʔυΛੜ python scripts/clang-objcgo.py import.h \ >
src/cocoa/import.go go build main ./main
$MBOH1ZUIPO#JOEJOHT w ιʔείʔυ͔Βநߏจ "45 Λੜ ! w 1ZUIPO͔Β؆୯ʹ͍͡ΕΔ w 4BGY$MBOHͷ1ZUIPOόΠϯσΟϯάͰ0CKFDUJWF$ͷ
ιʔείʔυΛύʔεͯ͠ΈΔ TBGYEFWCMPHTQPUKQ DMBOHQZUIPOPCKFDUJWFDIUNM python cindex-dump.py sample.h -c -m64 -ObjC DOMπϦʔΈ͍ͨͳͷ
translation_unit objc_interface_decl objc_property_decl objc_class_ref objc_instance_method_decl objc_instance_method_decl parm_decl objc_instance_method_decl parm_decl objc_class_ref
parm_decl sample.h foo hoge NSArray hoge setHoge: hoge barWithArray:limit: array NSArray limit @class NSArray; ! @interface Foo @property NSArray* hoge; - (int)barWithArray:(NSArray*)array limit:(int)limit; @end
ؔ࿈ϓϩδΣΫτ NLSBVU[PCKD ˒ PCKD@NTH4FOEͰ0CKFDUJWF$Λ͑ΔΑ͏ʹ͢Δ(PϥΠϒϥϦ NLSBVU[WBSJBEJD ˒
$ͷՄมҾͷؔΛݺΔΑ͏ʹͳΔ(PϥΠϒϥϦ 3JQ3JQDMBOH@DPNQMFUF ˒ WJNͷิϓϥάΠϯ DMBOHQZUIPOόΠϯσΟϯάར༻ TIJMHBQJSB0CK$SVTU ˒ 3VTUͰJ04ͷϥΠϒϥϦΛ࡞Δαϯϓϧ