Mais conteúdo relacionado
Semelhante a TruffleSqueakの紹介 (20)
Mais de Masashi Umezawa (20)
TruffleSqueakの紹介
- 3. Truffle Frameworkとは?
● GraalVMで提供される言語実装フレームワーク
○ https://www.graalvm.org/graalvm-as-a-platform/language-implementation-framework/
○ JavaScript, Ruby, Python, R などをサポート
○ LLVM IR, WebAssemblyもサポート
■ C, C++, Rust, Go
○ ASTインタプリタ
■ 実行時情報を基にツリーを最適化
■ JITコンパイルされる
○ Polyglot APIを提供
Context context = Context.create();
context.eval("js","print('Hello, JavaScript!');");
java
- 4. GraalVMのインストール
● Community Editionを入手
○ 現在Java 11ベースのものが安定版
○ GitHubのreleasesから
■ https://github.com/graalvm/graalvm-ce-builds/releases/tag/vm-21.1.0
○ アーカイブを適当なディレクトリに展開
○ 環境変数 GRAALVM_HOME を設定
○ $GRAALVM_HOME/bin以下にPATHを通す
● gu (GraalVM Updater) コマンドが使えるようになる
- 6. TruffleSqueakのインストール (1)
● GitHubから各プラットフォーム用のjarを取得
○ https://github.com/hpi-swa/trufflesqueak/releases
○ GraalVMとバージョンを合わせること
● JDK11ベースの場合
○ Linux
■ trufflesqueak-installable-java11-linux-amd64-21.1.0.jar
○ Mac
■ trufflesqueak-installable-java11-darwin-amd64-21.1.0.jar
○ Windows
■ trufflesqueak-installable-java11-windows-amd64-21.1.0.jar
- 7. TruffleSqueakのインストール (2)
● guコマンドでインストール
$ gu install -L trufflesqueak-installable-java11-linux-amd64-21.1.0.jar
● gu list で確認
ComponentId Version Component name Stability Origin
---------------------------------------------------------------------------------------------------------------------------------
graalvm 21.1.0 GraalVM Core -
js 21.1.0 Graal.js Supported
smalltalk 21.1.0 TruffleSqueak Experimental
- 13. evalの利用
● 言語を切り替えなくともevalで各言語の実行が可能
Polyglot eval: 'js' string: 'Math.random()'. "=> 0.06826435251134522"
Polyglot eval: 'ruby' string: 'Random.new.rand'. "=> 0.6788512960113738"
Polyglot.eval('smalltalk', 'Random new next'); //=> 0.5022477628512514
Polyglot.eval('smalltalk', 'Random new next') #=> 0.8651843420677447
● 他言語からSmalltalkの実行も可能
○ JavaScript workspaceで
○ Ruby workspaceで
- 14. Polyglot Proxy
● evalの結果返ってくるForeignObjectにさらに
メッセージ送信できる
● 引数も渡せる
(Polyglot eval: 'js' string: 'Math') random.
(Polyglot eval: 'ruby' string: 'Random') new rand.
Smalltalk
(Polyglot eval: 'js' string: '[1,2,3]') join: '-'. "=> '1-2-3'"
(Polyglot eval: 'js' string: 'Math') max: (1+2*3) and: (Polyglot eval: 'js' string: '1+2*3').
"=> 9"
((Polyglot eval: 'js' string: '[1,2,3]') concat: (Polyglot eval: 'ruby' string: '[4,5]')) asArray.
"=> #(1 2 3 4 5)"
Smalltalk
- 16. Dictionaryをやりとりしてみる
Polyglot export: 'stDict' value: {'Smalltalk'->1. 'JS'->2} asDictionary. Smalltalk
(Polyglot import: 'jsObj') inspect.
let stDict = Polyglot.import("stDict");
stDict.size(); //2
stDict.values(); //#(1 2)
let jsObj = {};
stDict.keysAndValuesDo((key, value)=>{
jsObj[key] = value**2;
})
JSON.stringify(jsObj); //'{"Smalltalk":1,"JS":4}'
Polyglot.export("jsObj", jsObj);
stDict.inspect();
JavaScript
Smalltalk
- 18. Interopクラスの利用
● Proxyを使う通常の書き方
(Java type: 'java.lang.System') out println: 'Hello from Squeak'
Smalltalk
● Interopクラスから低レベルなPolyglot APIの呼び出しが可能
(Polyglot primitiveGetScope: 'java') inspect. Smalltalk
(Interop readMember: self member: 'java.lang.System') inspect.
Smalltalk
Interop invokeMember: self out
member: 'println/(Ljava/lang/String;)V'
arguments: #('Hello from TruffleSqueak!')
Smalltalk
● Inspectorから...
● Inspectorから...
- 25. 3: Smalltalkで文字列に変換
bindings at: 'stArray' put: (bindings at:'rbAdded') asArray.
bindings at: 'stString' put: (bindings at: 'stArray') asByteArray
asString. "=>'ABCDEFGHIJ'"
Smalltalk
● asCollectionでRubyのArrayを
Smalltalkの配列に変換している
● #[65 66 67 68 69 70 71 72 73
74 75] が文字列となって
'ABCDEFGHIJ'
- 26. PolyglotNotebookのより高度な例
● "Some Smalltalk with Fabio Niephaus
- Fun with TruffleSqueak on GraalVM"
○ https://www.youtube.com/watch?v=MVblV_ruG28
○ https://gist.github.com/fniephaus/311155612be669061382685bf51b0b68
● 上記Gistに載っているNotebookのサンプルコードを実行してみる
○ conference-contributors-v3-no-text.ipynbをload
- 27. 1: nokogiriでスクレイピング
require "nokogiri"; require "open-uri"
url = "https://2021.programming-conference.org/people-index"
doc = Nokogiri::HTML(URI.open(url))
bindings["rows"] = doc.css("#results-table .row").map{ | row |
row.css(".pers-affiliation,.pers-country").map(&:content)}
bindings["rows"].size
Ruby
- 29. 3: ggplot2で視覚化
%ggplot2
values <- data.frame(contributors = bindings["countries"])
data <- aggregate(x = values, by = list(countries =
values$contributors), FUN = length)
print(ggplot(data, aes(x = reorder(countries, +contributors),
contributors)) +
geom_bar(stat = "identity") + xlab("") + ylab("") + coord_flip() +
geom_hline(aes(yintercept = mean(contributors))))
R
- 31. 注: 依存パッケージは入れておく
$ gem install rouge nokogiri
$ R -e 'install.packages("ggplot2")'
$ $GRAALVM_HOME/languages/python/lib-python/
$ curl -s -L https://bit.ly/38Ru3Fk | tar xzv
$ mv pycountry-20.7.3/src/pycountry ./3/
$ rm -r pycountry-20.7.3/