{"id":28689,"date":"2020-04-17T15:34:56","date_gmt":"2020-04-17T19:34:56","guid":{"rendered":"https:\/\/mjtsai.com\/blog\/?p=28689"},"modified":"2020-04-17T15:34:56","modified_gmt":"2020-04-17T19:34:56","slug":"iwork-10-in-webassembly","status":"publish","type":"post","link":"https:\/\/mjtsai.com\/blog\/2020\/04\/17\/iwork-10-in-webassembly\/","title":{"rendered":"iWork 10 in WebAssembly"},"content":{"rendered":"<p><a href=\"https:\/\/twitter.com\/lrz\/status\/1250453967957561344\">Laurent Sansonetti<\/a> (via <a href=\"https:\/\/twitter.com\/steipete\/status\/1250529937066508289\">Peter Steinberger<\/a>):<\/p>\n<blockquote cite=\"https:\/\/twitter.com\/lrz\/status\/1250453967957561344\"><p>Just a few days ago, <a href=\"https:\/\/www.apple.com\/iwork\/\">iWork<\/a> 10.0 shipped with iCloud apps that now include features extracted from the native codebase (C++\/ObjC), using WebAssembly!<\/p><p>I wrote a dedicated toolchain for the team, based on LLVM and its WebAssembly backend. It includes a custom compiler\/linker, ObjC runtime, some Foundation layer, and a TypeScript bridge.<\/p><p>If you&rsquo;re curious, <a href=\"https:\/\/support.apple.com\/guide\/keynote-icloud\/combine-shapes-gil65736b7d8\/icloud\">this feature<\/a> is written in WebAssembly (article mentions Keynote but it works on Pages and Numbers too!)<\/p><\/blockquote>\n<p>Here&rsquo;s what some of the code <a href=\"https:\/\/twitter.com\/egormerkushev\/status\/1250692389255237633\">looks like<\/a>.<\/p>\n\n<p>Previously:<\/p>\n<ul>\n<li><a href=\"https:\/\/mjtsai.com\/blog\/2008\/12\/08\/on-leaky-abstractions-and-objective-j\/\">On Leaky Abstractions and Objective-J<\/a><\/li>\n<li><a href=\"https:\/\/mjtsai.com\/blog\/2008\/09\/04\/cappuccino-and-objective-j\/\">Cappuccino and Objective-J<\/a><\/li>\n<\/ul>","protected":false},"excerpt":{"rendered":"<p>Laurent Sansonetti (via Peter Steinberger): Just a few days ago, iWork 10.0 shipped with iCloud apps that now include features extracted from the native codebase (C++\/ObjC), using WebAssembly!I wrote a dedicated toolchain for the team, based on LLVM and its WebAssembly backend. It includes a custom compiler\/linker, ObjC runtime, some Foundation layer, and a TypeScript [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"apple_news_api_created_at":"2020-04-17T19:34:59Z","apple_news_api_id":"f13e8a60-7536-44e4-afbd-803c97df7016","apple_news_api_modified_at":"2020-04-17T19:34:59Z","apple_news_api_revision":"AAAAAAAAAAD\/\/\/\/\/\/\/\/\/\/w==","apple_news_api_share_url":"https:\/\/apple.news\/A8T6KYHU2ROSvvYA8l99wFg","apple_news_coverimage":0,"apple_news_coverimage_caption":"","apple_news_is_hidden":false,"apple_news_is_paid":false,"apple_news_is_preview":false,"apple_news_is_sponsored":false,"apple_news_maturity_rating":"","apple_news_metadata":"\"\"","apple_news_pullquote":"","apple_news_pullquote_position":"","apple_news_slug":"","apple_news_sections":"\"\"","apple_news_suppress_video_url":false,"apple_news_use_image_component":false,"footnotes":""},"categories":[2],"tags":[326,471,346,473,241,54,472,96,1231],"class_list":["post-28689","post","type-post","status-publish","format-standard","hentry","category-technology","tag-c-plus-plus","tag-iwork","tag-javascript","tag-keynote","tag-numbers","tag-objective-c","tag-pages","tag-web","tag-webassembly"],"apple_news_notices":[],"_links":{"self":[{"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/posts\/28689","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/comments?post=28689"}],"version-history":[{"count":1,"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/posts\/28689\/revisions"}],"predecessor-version":[{"id":28690,"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/posts\/28689\/revisions\/28690"}],"wp:attachment":[{"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/media?parent=28689"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/categories?post=28689"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/tags?post=28689"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}