SlideShare a Scribd company logo
1 of 84
Download to read offline
JVM上で動く
Python処理系実装のススメ
yotchang4s
JJUG CCC 2017 Fall
2017/11/18
お前誰よ
❖ yotchang4s (よっちゃん)
➢ 澁谷 典明 (Yoshiaki Shibutani) https://twitter.com/yotcang4s
❖ Python歴
➢ 6ヵ月くらいの初心者
❖ 所属
➢ 株式会社エフ・コード
ギョームでScala書いてますフゥー
本日のゴール
Pythonの基礎知識を説明(かなり偏っている)
言語処理系実装の動機とモチベーションについて
Python処理系をどのように作り上げているのかを追体験
今後の展望
JVM上で動くPython処理系?
cafebabepy
https://github.com/yotchang4s/cafebabepy
cafebabepyとは?
JVM上で動くPython 3の処理系。
名前の由来は皆さんご存じの通り、Javaのクラスファイルのマジッ
クナンバーであるcafebabeから来ている。
開発開始からちょうど6ヵ月ほど。
yotchang4sが1人で作っている。
※まだまだ実装途中であり、Pythonが完全に
 動くわけではない。
開発の動機
1. PyCon JP 2017にCfPを出そう!
2. Jythonの近況を調査してそれを発表しよう!
3. えっ2015年から更新が止まっている。。。
4. Python 3にも対応していない。。。
5. ならば…
自分で作ればいい!肝心のCfPは落ちました
開発のモチベーション
Python初心者だからPythonわかんないです><
Python処理系作ったらPythonがわかるはず!
楽しい\(^o^)/
Pythonの特徴
ブロックはインデントで表現する。
誰が書いても同じようなコードになる。 ※異論は認める
The Zen of Pythonの思想。REPLで以下を実行すると見ることが出来る。
$ python
>>> import this
The Zen of Python, by Tim Peters
Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
…
Pythonの基礎知識(1/6)
● ブロックはインデントで表現
● クラス定義は「class」
● メソッド定義は「def」
● コンストラクタは「__init__」
Pythonの基礎知識(2/6)
● クラスの継承は
>>> class Dog(Animal):
と書く
● 多重継承が可能
メソッド解決順序(MRO)はC3アルゴリズ
ムに従うためダイヤモンド継承も可能
Pythonの基礎知識(3/6)
● メソッドの第一引数には自分自身のオブ
ジェクトが渡ってくる
● 慣習的に「self」という名前にする。
● Javaのthisキーワードは存在せず、明
示的に扱う
ようするにPythonのメソッドはオブジェク
トを束縛した関数なので
>>> Dog.say(animal)
とも書ける
Pythonの基礎知識(4/6)
● 変数に型が無い動的型付けである
(型アノテーションとtypingモジュールで
型を付けられるが割愛)
● 型や引数の数の違いによるメソッドの
オーバーロードはできない
Pythonの基礎知識(5/6)
● 全てはオブジェクト
● 関数もメソッドもオブジェクト
>>> say = Dog.say
>>> say(animal)
も可能
Pythonの基礎知識(6/6)
● __xxx__は特殊メソッドでありランタイム
やコード上で特別扱いされる。
● Callableという概念があり__call__があ
るオブジェクトは呼び出し可能。
● >>> animal = Dog("ポチ")
はDogの__call__を呼んでいる。
Dogの__call__ではオブジェクトの生成
や__init__の呼び出しが行われる。
● 意味的にはオブジェクトの生成も関数呼
び出しもメソッド呼び出しもすべて統一し
て扱える。
Pythonの特徴まとめ
● ブロックはインデントで表す
● 動的型付け
● シンプルな言語仕様
● 特殊メソッドによる統一的な操作
Pythonが動くざっくりとした仕組み
1. ソースコードを字句解析して字句のストリームを作る
2. 字句のストリームから構文解析をして抽象構文木(AST)を作る
3. 抽象構文木をevalする(単純なインタプリタ)
(CPythonだとバイトコードを生成してVMで動かす)
cafebabepyの歴史
ここからTwitterベースでcafebabepyの歴史を追体験してみます。
どのように考えてどのように実装をしていったのかを解説をいれながら説明していきま
す。キモの部分は詳細に説明していきますが、細かいところは
https://github.com/yotchang4s/cafebabepy
を参照。
cafebabepy開発の歴史(創世記)
2017年5月1日
全てはここから始まった。
cafebabepy開発の歴史(創世記)
2017年5月8日
Jythonの状況を知ってしまう。
cafebabepy開発の歴史(創世記)
2017年5月10日
やっていきを表明。
cafebabepy開発の歴史(創世記)
2017年5月12日
ANTLRを使い具象構文木が
作れるようになった。
具象構文木を作るには?(1/4)
cafebabepyはANTLR4を使って具象構文木を作っている。
ANTLR(http://www.antlr.org/)とはLL(*)構文解析を行うパーサジェネレータ。
ANTLRのGrammarファイルからJavaのパーサを作成する。
ANTLRのGrammarファイルはEBNFによく似ている。
PythonのドキュメントにEBNFに近い物があるのでほぼそのまま移植。
https://docs.python.jp/3/reference/grammar.html
具象構文木を作るには?(2/4)
Pythonの文法はLL(1)を保つように定められている。(PEP 3099参照)
LL(1)とは再帰下向き構文解析で、1個のトークンを先読みすれば
生成規則を決定することができる文法。カンタン!
具象構文木を作るには?(3/4)
cafebabepyのGrammarの一部分
file_input : ( NEWLINE | stmt )* EOF;
stmt: simple_stmt | compound_stmt;
simple_stmt
: small_stmt (SEMI_COLON small_stmt)* SEMI_COLON? NEWLINE;
...
スタート
改行とstmt(文)が0個以上ありEOFがある
文とは
simple_stmtかcompoud_stmt
のどちらか1つ
simple_stmtとは
small_stmtの次に「;」とsmall_stmtが0個以上あり、「;」が
0個または1個あり、改行がある
つまり「;」で区切ると1行に複数文を書ける
具象構文木を作るには?(4/4)
出来上がった具象構文木
コード
# test test
def test(a):
return 1
cafebabepy開発の歴史(創世記)
2017年5月13日
清水川さん(@shimizukawa)等々から
色々教えて貰うようになった。
MRO(メソッド解決順序)を知る。
mroをmiro...
cafebabepy開発の歴史(創世記)
2017年5月16日
段々全貌が見え始めて辛く楽しくなっ
てきたところ。
ランタイムをJavaで作り始めた。
Pythonのbuiltinsモジュールと_astモ
ジュールの作成を開始。
AST(抽象構文木)の作成はできてい
ない。
cafebabepyのランタイム(1/3)
PythonのランタイムはJavaで書いている。
Pythonのランタイム上にPythonの世界が構築されている。
Javaで書かれたPythonの疑似コードを読み込んでPythonの世界で動かせるようにして
いる。Javaの世界とPythonの世界を繋げている。
cafebabepyのランタイム(2/3)
builtinsモジュールのobjectクラ
スを定義している。
また、
__new__
__init__
__getattribute__
などの特殊メソッドを定義して
いる。
cafebabepyのランタイム(3/3)
@DefinePyType/@DefinePyModule/@DefinePyFunction
アノテーションによりPythonとJavaを結びつけている。
ランタイムのコアではJavaのリフレクションを使って
@DefinePyType/@DefinePyModuleアノテーションが付いているクラスを探し出して
Pythonの型のオブジェクト(後述)を作成し、ランタイムに登録する。
cafebabepy開発の歴史(創世記)
2017年5月17日
Javaでいうsuperキーワードは存
在せず代わりにsuperという名前
のクラスが存在することを知る。
Pythonにはちょくちょくこのような
ものが存在する。
cafebabepy開発の歴史(創世記)
2017年6月1日
Pythonistaに罠をしかけられる。
Twitterとかでつぶやいていると色ん
な人からアドバイスをもらえるぞ!
※PyPyとはPythonで作られた  
Python処理系
cafebabepy開発の歴史(創世記)
2017年6月3日
関数もオブジェクトであり変数を生やす
ことができることが判明。とても動的。
def hoge():
pass
hoge.huga = 1 ←変数を生やせる!
cafebabepy開発の歴史(創世記)
2017年6月13日
Pythonのクラスの多重継承を実
現するためにC3アルゴリズムにつ
いて実装を始める。
C3アルゴリズムとは?
Python2.3から導入されたMRO(Method Resolution Order)を決めるアルゴリズム。多
重継承をよしなにしてくれる。矛盾していたらエラー。
詳細は以下を参照。
https://www.python.org/download/releases/2.3/mro/
cafebabepy開発の歴史(創世記)
2017年6月16日
Pythonのselfとの戦い。
JavaにはthisがあるがPythonで
はメソッドで明示的にselfを受け取
るためPythonメソッドの呼び出し
方について迷走。
cafebabepy開発の歴史(創世記)
2017年6月17日
Javaで書かれたPython擬似コード
上で1+1をすると3になる。
1+2は5になる。
2つ目を2回足していたのが原因。
cafebabepy開発の歴史(創世記)
2017年6月19日
PyObjectインターフェースと型のオ
ブジェクト、オブジェクトの設計がほ
ぼ完了。
ここまでの1ヵ月ほぼPythonの言語
仕様の調査に時間をかけていた。
PyObjectとJavaの結びつき
PyObject
インタフェース
型のクラス/
モジュール
型のオブジェクト
(Pythonのクラス)
Pythonの世界
オブジェクト
Javaの世界
モジュールの
オブジェクト
(Pythonのモジュール)
Pythonは全てがオブジェクト。
Javaのクラス定義ではPythonの型のオブジェク
トとして扱いづらいのでJavaのオブジェクトを
Pythonのクラスとして扱っている。
全てのPythonのオブジェクトはJava側では
PyObjectとして統一的に扱っている。
cafebabepy開発の歴史(出エジプト記)
2017年6月19日
AST(抽象構文木)の作成、構築とイ
ンタプリタの作成を開始。
今まではJavaの疑似Pythonコードし
か実行できなかったがPythonのコー
ドを実行できるように実装を開始。
抽象構文木を作るには?(1/2)
具象構文木をVisitorパターンで巡って抽象構文木(AST)を作成する。
ANTLR側で構文ルールに従ったVisitorが作成されるので
visitXXXメソッドをオーバーライドする。
ASTはPythonの世界で構築している。ランタイムで各ASTクラスのオブジェクト
(PyObject)を作って後続に渡している。
PythonのASTはドキュメント化されている。
32.2.2. 抽象文法 (Abstract Grammar)
https://docs.python.jp/3/library/ast.html#abstract-grammar
抽象構文木を作るには?(2/2)
visitFile_inputの中でvisitStmtを呼び出し
ている。具象構文木のノードの最後までた
どり、戻り値でASTを返す。
具象構文木をvisitしていき、ASTを構築し
ていく。
Module(AST)
stmt(AST)
visitFile_input
Module(AST)
visitStmt
stmt(AST)
visitSimple_stmt visitCompound_stmt
visitXXX visitXXX
Expr(AST) ...
………
インタプリタの概要(1/3)
抽象構文木(AST)を実行するにあたってインタプリタを実装する。
evalを再帰的に呼び出すことで処理を実行する。
しかしこの方式は1行1行実行するので非常に遅い。ただ作るのは簡単なのでとっかか
りとしてインタプリタから始めると、処理系が動いている感覚がつかみやすくモチベーショ
ンを維持しやすい。
インタプリタの概要(2/3)
contextは実行しているブロック、
nodeはASTを指す。
PyObjectは必ずスコープを持つの
で、例えば変数への代入が発生し
たらcontextのスコープに変数を入
れる。
evalではASTの種類によって各
evalXXXメソッドを呼び出して結果
を戻り値とする。
インタプリタの概要(3/3)
BinOp(2項演算)のeval
leftのAST、rightのASTを取
得して更にevalを呼んでい
る。
evalしたleftとrightをASTの
種類によってaddしたりsub
したりしている。
このようにevalを再帰的に
呼び出してASTを評価して
いく。
cafebabepy開発の歴史(出エジプト記)
2017年6月21日
1+1が2になる。
一つのターニングポイント。
Pythonでは演算子があると特殊メ
ソッドを呼ぶ仕様になっている。つま
りintに__add__、__radd__などがあ
ればよく、evalの実装も各特殊メソッ
ドを呼ぶようにすればいい。
フィボナッチ数列の計算のための実
装を進めている。
cafebabepy開発の歴史(出エジプト記)
2017年6月22日
Pythonの比較はJavaと違い
1 < 2 < 3が許されることを知る。
Python処理系を実装することによっ
てPythonの仕様を知るという目的通
り。
cafebabepy開発の歴史(出エジプト記)
2017年6月23日
1 < 2 < 3がPythonで許されることが
わかったが実装するにはどうすれば
いいのかを思考。
1 < 2 && 2 < 3
になるように実装した。
言語処理系の実装はこういった
パズルのような側面もある。
cafebabepy開発の歴史(出エジプト記)
2017年6月24日
if elif else を実装。
プログラミング言語っぽくなってきた。
if elif else文のAST
if文の条件式
条件を満たした時に実行される文
条件を満たしていない時に実行される文
if文のASTは条件式、条件を満たした時に実
行される文の集合、満たしていない時に実行
される文の集合の3つを持つ。
elifはifのネストとして扱われる。
cafebabepy開発の歴史(出エジプト記)
2017年6月26日
つらいときもある。
cafebabepy開発の歴史(出エジプト記)
2017年6月30日
変数が扱えるようになった。
evalのcontextのスコープに変数を保
存する。
cafebabepy開発の歴史(出エジプト記)
2017年6月30日
関数呼び出しを実装。
print関数の呼び出しが可能になっ
た。print関数自体はJavaで書いてい
る。
スコープから「print」に紐付いた関数
オブジェクト(PyObject)を取得して
callを呼び出す。callの引数には「a +
1」をevalで評価し、その値を入れる。
cafebabepy開発の歴史(出エジプト記)
2017年6月30日
関数の定義を実装中。
関数の定義自体は単純で、context
に関数オブジェクト(Callableな
PyObject)を入れるだけ。
インタプリタなので関数オブジェクト
で関数本体のASTを保持する。
cafebabepy開発の歴史(出エジプト記)
2017年6月30日
1つの目標であるフィボナッチ数列の
計算ができるようになった。
これでプログラミング言語の処理系と
呼べるぐらいにはなった。
が、実は項が1つズレており、
if n > 2:
return fib(n - 1) + fib(n - 2)
が正解。
cafebabepy開発の歴史(民数記)
2017年7月5日
Pythonのアンパック代入を知る。
処理系がいい感じに代入してくれる。
ここではbが先頭、dが最後、cが真ん
中となっている。
これがのちに大誤算に…
cafebabepy開発の歴史(民数記)
2017年7月5日
アンパック代入の闇を見る。しかし
Pythonの仕様なので実装しないとい
けない。
cafebabepy開発の歴史(民数記)
2017年7月7日
アンパック代入の実装完了。
cafebabepy開発の歴史(民数記)
2017年7月7日
アンパック代入の闇っぽいものも動
く。
多重にアンパックをするために再帰
を繰り返して実装している。
しかし
Pythonista曰く「*」は普段使わない、
更にツイートにあるようなことは絶対
にしないしキモイとのこと…
何のために実装したのか
cafebabepy開発の歴史(民数記)
2017年7月8日
そんなこともありました(´・_・`)
cafebabepy開発の歴史(民数記)
2017年7月11日
リスト内包表記の実装を開始。
Pythonといったらリスト内包表記とい
う思いもあった。
CPythonで実行すると
[1, 2, 3, 4, 5, 6, 7, 8, 9]
が出来上がる。
cafebabepy開発の歴史(民数記)
2017年7月11日
リスト内包表記の構文ルールが思い
のほか複雑だった。
forを多重に書けてさらにフィルター
条件も複数かける。
cafebabepy開発の歴史(民数記)
2017年7月11日
リスト内包表記を実装。
多重forでも動いている。
フィルターも動いている。
ここら辺はif文等を実装した時のの応
用。まさにパズル。
cafebabepy開発の歴史(民数記)
2017年7月13日
リスト内包表記だけでfizzbuzzする
変態コードも動く。
fizzbuzz = [('fizzbuzz' if x % 15 ==
0 else ('fizz' if x % 3 == 0 else
('buzz' if x % 5 == 0 else x))) for x
in range(1, 101)]
for x in fizzbuzz:
print(x)
はい、意味わかりませんね!
cafebabepy開発の歴史(民数記)
2017年7月13日
for文が動いた。
Pythonのforはelseをつけることがで
きる。
cafebabepy開発の歴史(民数記)
2017年7月14日
Python mini Hack-a-thon夏山合宿
にて
REPL(Read Eval Print Loop)
の実装をした。
jlineを使って1行読み込んでパースし
てASTを作ってevalしているだけ。
cafebabepy開発の歴史(民数記)
2017年7月16日
1行ずつ処理する単純なREPLはで
きたが、複数行に渡る処理が実行で
きない。
>>> if 1 < 2:
. . . print(3) ここが複数行
. . .
3
>>>
cafebabepy開発の歴史(民数記)
2017年7月17日
REPLの第2プロンプトで迷走中。長
い道のりの始まり。
cafebabepy開発の歴史(民数記)
2017年7月19日
迷走している。
cafebabepy開発の歴史(民数記)
2017年7月20日
Lexer(字句解析器)まで戻った…
ここからひたすらLexerを自力で実装
している。あまりにも泥臭く単調な作
業。
構文ルールにそうような字句の羅列
を作り出す作業。
しばらく戦いは続く。
字句解析器から構文解析器へのストリーム
字句解析器
(Lexer)
if 1 == 1 : <NEWLINE>
<INDENT> print ( "hello" <DEDENT> <NEWLINE>
構文解析器
(Parser)
if 1 == 1:
print("hello")
)
ポイントは論理的な字句である<INDENT>と<DEDENT>。
Pythonでは字句解析でインデントの始まりと終わりを作る。
cafebabepy開発の歴史(民数記)
2017年7月23日
ふとParserを分ければいけるのでは
ないかと気づく。
入力があった場合、パースする。成功したらそのままASTを作成してevalする。
パスに失敗したら検証パースを行う。検証パースに成功したら第二プロンプトを表示し
て終了。検証パースにも失敗したら構文エラー。
検証パースではREPLを通すために条件を緩くしている。
通常Parser
single_input: NEWLINE | simple_stmt | compound_stmt NEWLINE;
suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT;
simple_stmt: small_stmt (SEMI_COLON small_stmt)* SEMI_COLON? NEWLINE;
検証Parser
single_input: NEWLINE | simple_stmt | compound_stmt NEWLINE? EOF;
suite: simple_stmt | NEWLINE (EOF | DEDENT+ EOF | INDENT stmt+ (DEDENT | EOF));
simple_stmt: small_stmt (SEMI_COLON small_stmt)* SEMI_COLON? (NEWLINE | EOF);
第二プロンプトに対応したREPLの仕組み(1/2)
第二プロンプトに対応したREPLの仕組み(2/2)
if 1 < 2: NEWLINE→通常NG 検証OK
INDENT print(3) NEWLINE→通常NG 検証OK
DEDENT NEWLINE→通常OK
cafebabepy開発の歴史(民数記)
2017年7月24日
第二プロンプト込みのREPLを実装し
た。
プログラミング言語処理系としての大
きな一歩。
確認もしやすい。
ターミナルで動かしてみる
cafebabepy開発の歴史(その後)
REPLの実装が処理系としての大きなターニングポイントで、その
後はクラスを実装したり色々ありますが、1つ1つ実装していくだけ
です。
以上が最低限の言語処理系を作るまでです。
動かしてみるかも?(デモ)
if 1 == 1:
print("hello")
動かした結果
今後の展望
● Python 3の文法を全て実装
● 速度改善
○ invokedynamic命令を使った高速化
○ リフレクションを極力少なく
● PythonのコードからJavaのコードを実行
● C拡張の実行
○ NumPyとかSciPyがJavaから呼べるとアツい。
○ JRubyで出来ていそうなので参考にできるか?
言語処理系の作成について見てきましたが、
ド素人でもここまで出来ます。
自分ならもっとうまく出来ると思ったりしたかと思います。
言語仕様から作るのも楽しいでしょうし、
既存の言語のJVM実装を作るのも楽しいでしょう。
さぁ言語処理系を作ってみよう!
ご静聴ありがとうございました。

More Related Content

What's hot

インフラエンジニアのためのcassandra入門
インフラエンジニアのためのcassandra入門インフラエンジニアのためのcassandra入門
インフラエンジニアのためのcassandra入門
Akihiro Kuwano
 
C16 45分でわかるPostgreSQLの仕組み by 山田努
C16 45分でわかるPostgreSQLの仕組み by 山田努C16 45分でわかるPostgreSQLの仕組み by 山田努
C16 45分でわかるPostgreSQLの仕組み by 山田努
Insight Technology, Inc.
 

What's hot (20)

Spring Boot on Kubernetes : Yahoo!ズバトク事例 #jjug_ccc
Spring Boot on Kubernetes : Yahoo!ズバトク事例 #jjug_cccSpring Boot on Kubernetes : Yahoo!ズバトク事例 #jjug_ccc
Spring Boot on Kubernetes : Yahoo!ズバトク事例 #jjug_ccc
 
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
 
ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計
 
Yahoo!ニュースにおけるBFFパフォーマンスチューニング事例
Yahoo!ニュースにおけるBFFパフォーマンスチューニング事例Yahoo!ニュースにおけるBFFパフォーマンスチューニング事例
Yahoo!ニュースにおけるBFFパフォーマンスチューニング事例
 
Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】
Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】
Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】
 
Ingressの概要とLoadBalancerとの比較
Ingressの概要とLoadBalancerとの比較Ingressの概要とLoadBalancerとの比較
Ingressの概要とLoadBalancerとの比較
 
Hadoopの概念と基本的知識
Hadoopの概念と基本的知識Hadoopの概念と基本的知識
Hadoopの概念と基本的知識
 
データ活用を加速するAWS分析サービスのご紹介
データ活用を加速するAWS分析サービスのご紹介データ活用を加速するAWS分析サービスのご紹介
データ活用を加速するAWS分析サービスのご紹介
 
root権限無しでKubernetesを動かす
root権限無しでKubernetesを動かす root権限無しでKubernetesを動かす
root権限無しでKubernetesを動かす
 
SQLアンチパターン - ジェイウォーク
SQLアンチパターン - ジェイウォークSQLアンチパターン - ジェイウォーク
SQLアンチパターン - ジェイウォーク
 
Dockerイメージの理解とコンテナのライフサイクル
Dockerイメージの理解とコンテナのライフサイクルDockerイメージの理解とコンテナのライフサイクル
Dockerイメージの理解とコンテナのライフサイクル
 
Linux女子部 systemd徹底入門
Linux女子部 systemd徹底入門Linux女子部 systemd徹底入門
Linux女子部 systemd徹底入門
 
インフラエンジニアのためのcassandra入門
インフラエンジニアのためのcassandra入門インフラエンジニアのためのcassandra入門
インフラエンジニアのためのcassandra入門
 
HA環境構築のベスト・プラクティス
HA環境構築のベスト・プラクティスHA環境構築のベスト・プラクティス
HA環境構築のベスト・プラクティス
 
コンテナの作り方「Dockerは裏方で何をしているのか?」
コンテナの作り方「Dockerは裏方で何をしているのか?」コンテナの作り方「Dockerは裏方で何をしているのか?」
コンテナの作り方「Dockerは裏方で何をしているのか?」
 
Dockerクイックツアー
DockerクイックツアーDockerクイックツアー
Dockerクイックツアー
 
コンテナセキュリティにおける権限制御(OCHaCafe5 #3 Kubernetes のセキュリティ 発表資料)
コンテナセキュリティにおける権限制御(OCHaCafe5 #3 Kubernetes のセキュリティ 発表資料)コンテナセキュリティにおける権限制御(OCHaCafe5 #3 Kubernetes のセキュリティ 発表資料)
コンテナセキュリティにおける権限制御(OCHaCafe5 #3 Kubernetes のセキュリティ 発表資料)
 
C16 45分でわかるPostgreSQLの仕組み by 山田努
C16 45分でわかるPostgreSQLの仕組み by 山田努C16 45分でわかるPostgreSQLの仕組み by 山田努
C16 45分でわかるPostgreSQLの仕組み by 山田努
 
AWSとオンプレミスを繋ぐときに知っておきたいルーティングの基礎知識(CCSI監修!)
AWSとオンプレミスを繋ぐときに知っておきたいルーティングの基礎知識(CCSI監修!)AWSとオンプレミスを繋ぐときに知っておきたいルーティングの基礎知識(CCSI監修!)
AWSとオンプレミスを繋ぐときに知っておきたいルーティングの基礎知識(CCSI監修!)
 
Spring Boot の Web アプリケーションを Docker に載せて AWS ECS で動かしている話
Spring Boot の Web アプリケーションを Docker に載せて AWS ECS で動かしている話Spring Boot の Web アプリケーションを Docker に載せて AWS ECS で動かしている話
Spring Boot の Web アプリケーションを Docker に載せて AWS ECS で動かしている話
 

Viewers also liked

ユニットテストのアサーション 流れるようなインターフェースのAssertJを添えて 入門者仕立て
ユニットテストのアサーション 流れるようなインターフェースのAssertJを添えて 入門者仕立てユニットテストのアサーション 流れるようなインターフェースのAssertJを添えて 入門者仕立て
ユニットテストのアサーション 流れるようなインターフェースのAssertJを添えて 入門者仕立て
Ryosuke Uchitate
 
マルチクラウドデータ連携Javaアプリケーションの作り方
マルチクラウドデータ連携Javaアプリケーションの作り方マルチクラウドデータ連携Javaアプリケーションの作り方
マルチクラウドデータ連携Javaアプリケーションの作り方
CData Software Japan
 

Viewers also liked (20)

Java SE 9の紹介: モジュール・システムを中心に
Java SE 9の紹介: モジュール・システムを中心にJava SE 9の紹介: モジュール・システムを中心に
Java SE 9の紹介: モジュール・システムを中心に
 
Java9を迎えた今こそ!Java本格(再)入門
Java9を迎えた今こそ!Java本格(再)入門Java9を迎えた今こそ!Java本格(再)入門
Java9を迎えた今こそ!Java本格(再)入門
 
ユニットテストのアサーション 流れるようなインターフェースのAssertJを添えて 入門者仕立て
ユニットテストのアサーション 流れるようなインターフェースのAssertJを添えて 入門者仕立てユニットテストのアサーション 流れるようなインターフェースのAssertJを添えて 入門者仕立て
ユニットテストのアサーション 流れるようなインターフェースのAssertJを添えて 入門者仕立て
 
劇的改善 Ci4時間から5分へ〜私がやった10のこと〜
劇的改善 Ci4時間から5分へ〜私がやった10のこと〜劇的改善 Ci4時間から5分へ〜私がやった10のこと〜
劇的改善 Ci4時間から5分へ〜私がやった10のこと〜
 
Spring Bootの本当の理解ポイント #jjug
Spring Bootの本当の理解ポイント #jjugSpring Bootの本当の理解ポイント #jjug
Spring Bootの本当の理解ポイント #jjug
 
JJUG初心者のためのJava/JJUG講座
JJUG初心者のためのJava/JJUG講座JJUG初心者のためのJava/JJUG講座
JJUG初心者のためのJava/JJUG講座
 
JEP280: Java 9 で文字列結合の処理が変わるぞ!準備はいいか!? #jjug_ccc
JEP280: Java 9 で文字列結合の処理が変わるぞ!準備はいいか!? #jjug_cccJEP280: Java 9 で文字列結合の処理が変わるぞ!準備はいいか!? #jjug_ccc
JEP280: Java 9 で文字列結合の処理が変わるぞ!準備はいいか!? #jjug_ccc
 
サンプルアプリケーションで学ぶApache Cassandraを使ったJavaアプリケーションの作り方
サンプルアプリケーションで学ぶApache Cassandraを使ったJavaアプリケーションの作り方サンプルアプリケーションで学ぶApache Cassandraを使ったJavaアプリケーションの作り方
サンプルアプリケーションで学ぶApache Cassandraを使ったJavaアプリケーションの作り方
 
Business Process Modeling in Goldman Sachs @ JJUG CCC Fall 2017
Business Process Modeling in Goldman Sachs @ JJUG CCC Fall 2017Business Process Modeling in Goldman Sachs @ JJUG CCC Fall 2017
Business Process Modeling in Goldman Sachs @ JJUG CCC Fall 2017
 
サーバサイド Kotlin
サーバサイド Kotlinサーバサイド Kotlin
サーバサイド Kotlin
 
Pythonが動く仕組み(の概要)
Pythonが動く仕組み(の概要)Pythonが動く仕組み(の概要)
Pythonが動く仕組み(の概要)
 
高速なソートアルゴリズムを書こう!!
高速なソートアルゴリズムを書こう!!高速なソートアルゴリズムを書こう!!
高速なソートアルゴリズムを書こう!!
 
Another compilation method in java - AOT (Ahead of Time) compilation
Another compilation method in java - AOT (Ahead of Time) compilationAnother compilation method in java - AOT (Ahead of Time) compilation
Another compilation method in java - AOT (Ahead of Time) compilation
 
Dockerで始める Java EE アプリケーション開発 for JJUG CCC 2017
Dockerで始める Java EE アプリケーション開発 for JJUG CCC 2017Dockerで始める Java EE アプリケーション開発 for JJUG CCC 2017
Dockerで始める Java EE アプリケーション開発 for JJUG CCC 2017
 
Selenide or Geb 〜あなたはその時どちらを使う〜
Selenide or Geb 〜あなたはその時どちらを使う〜Selenide or Geb 〜あなたはその時どちらを使う〜
Selenide or Geb 〜あなたはその時どちらを使う〜
 
Open Liberty: オープンソースになったWebSphere Liberty
Open Liberty: オープンソースになったWebSphere LibertyOpen Liberty: オープンソースになったWebSphere Liberty
Open Liberty: オープンソースになったWebSphere Liberty
 
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS   更新系と参照系で異なるORMを併用して上手くいった話DDD x CQRS   更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
 
マルチクラウドデータ連携Javaアプリケーションの作り方
マルチクラウドデータ連携Javaアプリケーションの作り方マルチクラウドデータ連携Javaアプリケーションの作り方
マルチクラウドデータ連携Javaアプリケーションの作り方
 
Javaアプリケーションの モダナイゼーションアプローチ
Javaアプリケーションの モダナイゼーションアプローチJavaアプリケーションの モダナイゼーションアプローチ
Javaアプリケーションの モダナイゼーションアプローチ
 
Polyglot on the JVM with Graal (English)
Polyglot on the JVM with Graal (English)Polyglot on the JVM with Graal (English)
Polyglot on the JVM with Graal (English)
 

Similar to JVM上で動くPython処理系実装のススメ

Serverspec at July Tech Festa 2013
Serverspec at July Tech Festa 2013Serverspec at July Tech Festa 2013
Serverspec at July Tech Festa 2013
Gosuke Miyashita
 
AWS Elastic Beanstalk のススメ
AWS Elastic Beanstalk のススメAWS Elastic Beanstalk のススメ
AWS Elastic Beanstalk のススメ
Taiji INOUE
 

Similar to JVM上で動くPython処理系実装のススメ (16)

Sphinxを用いたBiopythonチュートリアル翻訳
Sphinxを用いたBiopythonチュートリアル翻訳Sphinxを用いたBiopythonチュートリアル翻訳
Sphinxを用いたBiopythonチュートリアル翻訳
 
MS COCO Dataset Introduction
MS COCO Dataset IntroductionMS COCO Dataset Introduction
MS COCO Dataset Introduction
 
JJUG CCC 2017 Fall オレオレJVM言語を作ってみる
JJUG CCC 2017 Fall オレオレJVM言語を作ってみるJJUG CCC 2017 Fall オレオレJVM言語を作ってみる
JJUG CCC 2017 Fall オレオレJVM言語を作ってみる
 
Pythonの非同期処理を始める前に
Pythonの非同期処理を始める前にPythonの非同期処理を始める前に
Pythonの非同期処理を始める前に
 
DC/OS as PaaS : paasjp#36
DC/OS as PaaS : paasjp#36DC/OS as PaaS : paasjp#36
DC/OS as PaaS : paasjp#36
 
あなたの安心を高速に守る Container-based CI
あなたの安心を高速に守る Container-based CIあなたの安心を高速に守る Container-based CI
あなたの安心を高速に守る Container-based CI
 
初心から一週間で作ってみた Kinesis Client Library for Go
初心から一週間で作ってみた Kinesis Client Library for Go初心から一週間で作ってみた Kinesis Client Library for Go
初心から一週間で作ってみた Kinesis Client Library for Go
 
Serverspec at July Tech Festa 2013
Serverspec at July Tech Festa 2013Serverspec at July Tech Festa 2013
Serverspec at July Tech Festa 2013
 
OSS 資料管理システム kassis orange のご紹介
OSS 資料管理システム kassis orange のご紹介OSS 資料管理システム kassis orange のご紹介
OSS 資料管理システム kassis orange のご紹介
 
AWS Elastic Beanstalk のススメ
AWS Elastic Beanstalk のススメAWS Elastic Beanstalk のススメ
AWS Elastic Beanstalk のススメ
 
Serverspec at hbstudy #45
Serverspec at hbstudy #45Serverspec at hbstudy #45
Serverspec at hbstudy #45
 
some topic of ffmpeg
some topic of ffmpeg some topic of ffmpeg
some topic of ffmpeg
 
Closure CompilerのES6対応 あるいはES6時代のAltJS生存戦略
Closure CompilerのES6対応 あるいはES6時代のAltJS生存戦略Closure CompilerのES6対応 あるいはES6時代のAltJS生存戦略
Closure CompilerのES6対応 あるいはES6時代のAltJS生存戦略
 
Vimとctagsでコードリーディング 公開用
Vimとctagsでコードリーディング 公開用Vimとctagsでコードリーディング 公開用
Vimとctagsでコードリーディング 公開用
 
LLoT2016 Java Update
LLoT2016 Java UpdateLLoT2016 Java Update
LLoT2016 Java Update
 
ElephantJS
ElephantJSElephantJS
ElephantJS
 

JVM上で動くPython処理系実装のススメ