Suche senden
Hochladen
Goで言語処理系(の途中まで)を作ろう
•
13 gefällt mir
•
4,789 views
Esehara Shigeo
Folgen
Technologie
Melden
Teilen
Melden
Teilen
1 von 79
Jetzt herunterladen
Downloaden Sie, um offline zu lesen
Empfohlen
静的解析を使った開発ツールの開発
静的解析を使った開発ツールの開発
Takuya Ueda
Goとテスト
Goとテスト
Takuya Ueda
Goでかんたんソースコードの静的解析
Goでかんたんソースコードの静的解析
Takuya Ueda
Goroutineと channelから はじめるgo言語
Goroutineと channelから はじめるgo言語
Takuya Ueda
Goroutineとchannelから始めるgo言語@初心者向けgolang勉強会2
Goroutineとchannelから始めるgo言語@初心者向けgolang勉強会2
Takuya Ueda
GAE/GoでWebアプリ開発入門
GAE/GoでWebアプリ開発入門
Takuya Ueda
Go静的解析ハンズオン
Go静的解析ハンズオン
Takuya Ueda
Go入門
Go入門
Takuya Ueda
Empfohlen
静的解析を使った開発ツールの開発
静的解析を使った開発ツールの開発
Takuya Ueda
Goとテスト
Goとテスト
Takuya Ueda
Goでかんたんソースコードの静的解析
Goでかんたんソースコードの静的解析
Takuya Ueda
Goroutineと channelから はじめるgo言語
Goroutineと channelから はじめるgo言語
Takuya Ueda
Goroutineとchannelから始めるgo言語@初心者向けgolang勉強会2
Goroutineとchannelから始めるgo言語@初心者向けgolang勉強会2
Takuya Ueda
GAE/GoでWebアプリ開発入門
GAE/GoでWebアプリ開発入門
Takuya Ueda
Go静的解析ハンズオン
Go静的解析ハンズオン
Takuya Ueda
Go入門
Go入門
Takuya Ueda
マスター・オブ・goパッケージ
マスター・オブ・goパッケージ
Takuya Ueda
Goにおける静的解析と製品開発への応用
Goにおける静的解析と製品開発への応用
Takuya Ueda
今日から始める Go言語 と appengine
今日から始める Go言語 と appengine
a know
Goroutineとchannelから始めるgo言語@初心者向けgolang勉強会
Goroutineとchannelから始めるgo言語@初心者向けgolang勉強会
Takuya Ueda
エキスパートGo
エキスパートGo
Takuya Ueda
20130824 Lightweight Language "Go" @LL matsuri
20130824 Lightweight Language "Go" @LL matsuri
Yoshifumi Yamaguchi
マスター・オブ・reflectパッケージ II
マスター・オブ・reflectパッケージ II
Takuya Ueda
メルカリ・ソウゾウでは どうGoを活用しているのか?
メルカリ・ソウゾウでは どうGoを活用しているのか?
Takuya Ueda
tse - Pythonによるテキスト整形ユーティリティ
tse - Pythonによるテキスト整形ユーティリティ
Atsuo Ishimoto
20130316 プログラミング言語Go
20130316 プログラミング言語Go
Yoshifumi Yamaguchi
Goでwebアプリを開発してみよう
Goでwebアプリを開発してみよう
Takuya Ueda
メルカリアッテの実務で使えた、GAE/Goの開発を効率的にする方法
メルカリアッテの実務で使えた、GAE/Goの開発を効率的にする方法
Takuya Ueda
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方
Yasutaka Kawamoto
Go1.8 for Google App Engine
Go1.8 for Google App Engine
Takuya Ueda
20130228 Goノススメ(BPStudy #66)
20130228 Goノススメ(BPStudy #66)
Yoshifumi Yamaguchi
マスター・オブ・Reflectパッケージ
マスター・オブ・Reflectパッケージ
Takuya Ueda
ヒカルのGo 資料 Webアプリケーションの作り方
ヒカルのGo 資料 Webアプリケーションの作り方
Yosuke Furukawa
今日から始めるGopher - スタートGo #0 @GDG名古屋
今日から始めるGopher - スタートGo #0 @GDG名古屋
Takuya Ueda
KMC Font Project 3 - FontForgeで欧文書体製作
KMC Font Project 3 - FontForgeで欧文書体製作
k maztani
Pynyumon03 LT
Pynyumon03 LT
drillan
おとなのテキストマイニング
おとなのテキストマイニング
Munenori Sugimura
F#+Erlangで簡単なシューティングゲームを作ってみている
F#+Erlangで簡単なシューティングゲームを作ってみている
pocketberserker
Weitere ähnliche Inhalte
Was ist angesagt?
マスター・オブ・goパッケージ
マスター・オブ・goパッケージ
Takuya Ueda
Goにおける静的解析と製品開発への応用
Goにおける静的解析と製品開発への応用
Takuya Ueda
今日から始める Go言語 と appengine
今日から始める Go言語 と appengine
a know
Goroutineとchannelから始めるgo言語@初心者向けgolang勉強会
Goroutineとchannelから始めるgo言語@初心者向けgolang勉強会
Takuya Ueda
エキスパートGo
エキスパートGo
Takuya Ueda
20130824 Lightweight Language "Go" @LL matsuri
20130824 Lightweight Language "Go" @LL matsuri
Yoshifumi Yamaguchi
マスター・オブ・reflectパッケージ II
マスター・オブ・reflectパッケージ II
Takuya Ueda
メルカリ・ソウゾウでは どうGoを活用しているのか?
メルカリ・ソウゾウでは どうGoを活用しているのか?
Takuya Ueda
tse - Pythonによるテキスト整形ユーティリティ
tse - Pythonによるテキスト整形ユーティリティ
Atsuo Ishimoto
20130316 プログラミング言語Go
20130316 プログラミング言語Go
Yoshifumi Yamaguchi
Goでwebアプリを開発してみよう
Goでwebアプリを開発してみよう
Takuya Ueda
メルカリアッテの実務で使えた、GAE/Goの開発を効率的にする方法
メルカリアッテの実務で使えた、GAE/Goの開発を効率的にする方法
Takuya Ueda
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方
Yasutaka Kawamoto
Go1.8 for Google App Engine
Go1.8 for Google App Engine
Takuya Ueda
20130228 Goノススメ(BPStudy #66)
20130228 Goノススメ(BPStudy #66)
Yoshifumi Yamaguchi
マスター・オブ・Reflectパッケージ
マスター・オブ・Reflectパッケージ
Takuya Ueda
ヒカルのGo 資料 Webアプリケーションの作り方
ヒカルのGo 資料 Webアプリケーションの作り方
Yosuke Furukawa
今日から始めるGopher - スタートGo #0 @GDG名古屋
今日から始めるGopher - スタートGo #0 @GDG名古屋
Takuya Ueda
KMC Font Project 3 - FontForgeで欧文書体製作
KMC Font Project 3 - FontForgeで欧文書体製作
k maztani
Pynyumon03 LT
Pynyumon03 LT
drillan
Was ist angesagt?
(20)
マスター・オブ・goパッケージ
マスター・オブ・goパッケージ
Goにおける静的解析と製品開発への応用
Goにおける静的解析と製品開発への応用
今日から始める Go言語 と appengine
今日から始める Go言語 と appengine
Goroutineとchannelから始めるgo言語@初心者向けgolang勉強会
Goroutineとchannelから始めるgo言語@初心者向けgolang勉強会
エキスパートGo
エキスパートGo
20130824 Lightweight Language "Go" @LL matsuri
20130824 Lightweight Language "Go" @LL matsuri
マスター・オブ・reflectパッケージ II
マスター・オブ・reflectパッケージ II
メルカリ・ソウゾウでは どうGoを活用しているのか?
メルカリ・ソウゾウでは どうGoを活用しているのか?
tse - Pythonによるテキスト整形ユーティリティ
tse - Pythonによるテキスト整形ユーティリティ
20130316 プログラミング言語Go
20130316 プログラミング言語Go
Goでwebアプリを開発してみよう
Goでwebアプリを開発してみよう
メルカリアッテの実務で使えた、GAE/Goの開発を効率的にする方法
メルカリアッテの実務で使えた、GAE/Goの開発を効率的にする方法
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方
Go1.8 for Google App Engine
Go1.8 for Google App Engine
20130228 Goノススメ(BPStudy #66)
20130228 Goノススメ(BPStudy #66)
マスター・オブ・Reflectパッケージ
マスター・オブ・Reflectパッケージ
ヒカルのGo 資料 Webアプリケーションの作り方
ヒカルのGo 資料 Webアプリケーションの作り方
今日から始めるGopher - スタートGo #0 @GDG名古屋
今日から始めるGopher - スタートGo #0 @GDG名古屋
KMC Font Project 3 - FontForgeで欧文書体製作
KMC Font Project 3 - FontForgeで欧文書体製作
Pynyumon03 LT
Pynyumon03 LT
Ähnlich wie Goで言語処理系(の途中まで)を作ろう
おとなのテキストマイニング
おとなのテキストマイニング
Munenori Sugimura
F#+Erlangで簡単なシューティングゲームを作ってみている
F#+Erlangで簡単なシューティングゲームを作ってみている
pocketberserker
これからの「言語」の話をしよう ―― 未来を生きるためのツール
これからの「言語」の話をしよう ―― 未来を生きるためのツール
Nobuhisa Koizumi
つくっておぼえる!仮想マシン〜直前で実装編〜
つくっておぼえる!仮想マシン〜直前で実装編〜
Eric Sartre
エディタの壁を越えるGoの開発ツールの文化と作成法
エディタの壁を越えるGoの開発ツールの文化と作成法
Takuya Ueda
Lombok ハンズオン
Lombok ハンズオン
Hiroto Yamakawa
objc2swift 〜 Objective-C から Swift への「コード&パラダイム」シフト
objc2swift 〜 Objective-C から Swift への「コード&パラダイム」シフト
Taketo Sano
Exgettextの話
Exgettextの話
k1complete
Scalaで学ぶ関数型超入門
Scalaで学ぶ関数型超入門
Yuichiro Takahashi
普通のプログラミング言語R
普通のプログラミング言語R
Shuyo Nakatani
Start!! Ruby
Start!! Ruby
mitim
ng-japan 2015 TypeScript+AngularJS 1.3
ng-japan 2015 TypeScript+AngularJS 1.3
Masahiro Wakame
Erlangご紹介 websocket編
Erlangご紹介 websocket編
Masatoshi Itoh
パーフェクト"Elixir情報収集"
パーフェクト"Elixir情報収集"
Keisuke Takahashi
言語処理系入門1
言語処理系入門1
Kenta Hattori
プログラミング言語 Ruby 2章 Rubyプログラムの構造と実行
プログラミング言語 Ruby 2章 Rubyプログラムの構造と実行
monglee
Introduction to Erlang/OTP
Introduction to Erlang/OTP
Masahiko Sakamoto
Lucene gosenの紹介 solr勉強会第7回
Lucene gosenの紹介 solr勉強会第7回
Jun Ohtani
OpeLa: セルフホストなOSと言語処理系を作るプロジェクト
OpeLa: セルフホストなOSと言語処理系を作るプロジェクト
uchan_nos
Pyconjp2014_implementations
Pyconjp2014_implementations
masahitojp
Ähnlich wie Goで言語処理系(の途中まで)を作ろう
(20)
おとなのテキストマイニング
おとなのテキストマイニング
F#+Erlangで簡単なシューティングゲームを作ってみている
F#+Erlangで簡単なシューティングゲームを作ってみている
これからの「言語」の話をしよう ―― 未来を生きるためのツール
これからの「言語」の話をしよう ―― 未来を生きるためのツール
つくっておぼえる!仮想マシン〜直前で実装編〜
つくっておぼえる!仮想マシン〜直前で実装編〜
エディタの壁を越えるGoの開発ツールの文化と作成法
エディタの壁を越えるGoの開発ツールの文化と作成法
Lombok ハンズオン
Lombok ハンズオン
objc2swift 〜 Objective-C から Swift への「コード&パラダイム」シフト
objc2swift 〜 Objective-C から Swift への「コード&パラダイム」シフト
Exgettextの話
Exgettextの話
Scalaで学ぶ関数型超入門
Scalaで学ぶ関数型超入門
普通のプログラミング言語R
普通のプログラミング言語R
Start!! Ruby
Start!! Ruby
ng-japan 2015 TypeScript+AngularJS 1.3
ng-japan 2015 TypeScript+AngularJS 1.3
Erlangご紹介 websocket編
Erlangご紹介 websocket編
パーフェクト"Elixir情報収集"
パーフェクト"Elixir情報収集"
言語処理系入門1
言語処理系入門1
プログラミング言語 Ruby 2章 Rubyプログラムの構造と実行
プログラミング言語 Ruby 2章 Rubyプログラムの構造と実行
Introduction to Erlang/OTP
Introduction to Erlang/OTP
Lucene gosenの紹介 solr勉強会第7回
Lucene gosenの紹介 solr勉強会第7回
OpeLa: セルフホストなOSと言語処理系を作るプロジェクト
OpeLa: セルフホストなOSと言語処理系を作るプロジェクト
Pyconjp2014_implementations
Pyconjp2014_implementations
Kürzlich hochgeladen
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
Toru Tamaki
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Yuma Ohgami
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdf
taisei2219
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey
Toru Tamaki
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet
Toru Tamaki
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システム
sugiuralab
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
Hiroki Ichikura
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
Ryo Sasaki
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
iPride Co., Ltd.
Kürzlich hochgeladen
(9)
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdf
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システム
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
Goで言語処理系(の途中まで)を作ろう
1.
Goでプログラミング言語 (の途中まで)を 作ろう esehara shigeo
2.
お前 誰だ
3.
esehara shigeo ただのWeb系プログラマー (Python使い)
4.
Webプログラマーに ありがちな中二病
5.
Lisp ※皆様がいるカンファレンスはGo Conです。安心してください。
6.
Lispが持つ病 1. 関数型言語カッコイイ! 2. 関数型言語の元祖といえばLisp!カッ コイイ!(括弧なだけに) 3.
コンピューターサイエンス、Artifact Intelligenceの分野でも活躍! Awesome! 4. Lispが使いこなせると構文木も自由自 在!
7.
Lispは もっとも美しい 言語 ※皆様がいるカンファレンスはGo Conです。安心してください。
8.
全ての言語は S式を 信じられない 人間によって作ら れる
9.
「Lispはエリート向けの言語」
10.
11.
LL系プログラマーに ありがちな中二病
12.
C言語 ※皆様がいるカンファレンスはGo Conです。安心してください。
13.
C言語が持つ病 1. 「Lightweight Languageって所詮富豪 プログラミングだよねー」 2.
「Lightweight Languageって所詮ポイ ンタとかメモリアドレスとか知らないんで しょ」 3. 「Lightweight Languageってコンパイル のこととか所詮わからないんでしょ」
14.
屈辱ッ!
15.
でもC言語は つらぽよ……
16.
そんな貴方の ための!!
17.
18.
Go ※皆様がいるカンファレンスはGo Conです。安心してください。
19.
前置きは ここまで
20.
そもそもプログラミング言語 処理ってなに?
21.
How to Create
Your Own Programming Language http://createyourproglang.com/
22.
“The book I
want to read.”
23.
プログラミング言語処理の流れ 『Create your own
language』より
24.
字句解析(Tokenize) とは?
25.
文字のカタマリ によって その文字が 何に属するのか を分析する
26.
例: Haskell 2010
Language Report literal -> integer | float | char | string digit -> ascDigit | uniDigit ascDigit -> 0 | 1 | … | 9 uniDigit -> any Unicode descimal decit decimal -> digit{digit} integer -> decimal
27.
Goで 字句解析器を作ろう
28.
packageに あるよ! > Tips: 困ったら公式のGoのpackageのソースを読みましょう
29.
go/scanner
30.
使える http://www.oki-osk.jp/esc/golang/lisp.html
31.
とはいえ、 このSourceを入れ替えて 使うのはつらいので
32.
自動 生成
33.
Ragel :: State
Machine Compiler
34.
Ragel compiles executable finite
state machines from regular languages. Ragel targets C, C++, ObjectiveC, C#, D, Java, Ruby, OCaml and Go.
35.
そして
36.
37.
Rust班も頑張ってる(まだ非公式)
38.
Ragelの書きかた # ---- Literal
---string = ("'" . (any - "'")* . "'") |('"' . (any - '"')* . '"'); integer = digit+; atom = (alpha (alpha | digit)* ); # ---- Operator ---operator = "+" | "-" | "*" | "/"; main := |* atom => { material := Ore{ Token: ATOM, Value: data[ts:te], } material.Research() ores = append(ores, material) }; String => { material := Ore{ Token: STRING, Value: data[ts:te], } material.Research() ores = append(ores, material) }; ….
39.
二つの流れ どの文字の規則を トークンとして定義するか? トークンをどのように 管理するか?
40.
文字の規則とトークン # ---- Literal
---string = ("'" . (any - "'")* . "'") |('"' . (any - '"')* . '"'); integer = digit+; atom = (alpha (alpha | digit)* ); # ---- Operator ---operator = "+" | "-" | "*" | "/";
41.
Ragelによる図式化
42.
トークンの処理 main := |* atom
=> { material := Ore{ Token: ATOM, Value: data[ts:te], } material.Research() ores = append(ores, material) };
43.
トークンの管理方法 type Ore struct
{ Token Token // int Name string }
44.
トークンの定義 const( //Special Token ILLEGAL Token
= iota EOF COMMENT begin_define_literal ATOM STRING INTEGER end_define_literal ……… ) 参考: go/token
45.
このように作った トークンの順序を 構文解析する
46.
Goで 構文解析器を作ろう
47.
toolに あるよ! >
48.
go tool yacc Yacc
is a version of yacc for Go. It is written in Go and generates parsers written in Go. (公式より)
49.
yaccとは? Yet Another Compiler Compiler
50.
go yaccの書きかた %type <val>
ATOM, STRING, OPERATOR, BINDER, DEFINE %type <val> ARG %type <val> action, Expression %type <values> StringExpression, AtomExpression %% %{ package casting import ( "fmt" ".. /miner" ) %} %union { tok int val interface{} values Val box Box } %token ATOM STRING %token ARG %token OPERATOR BINDER DEFINE %token ROUNDPAREN_O ROUNDPAREN_C action: ATOM { var v Value v = Box{Type: ATOM, Value: $1,} yylex.(*lex).NewBox(v) } | Expression { if val, ok := $1.(Val); ok { yylex.(*lex).root = val } } ...
51.
何してるの? トークンの順序を 解釈しやすいように再構築
52.
利用するトークンの定義 %token ATOM STRING %token
ARG %token OPERATOR %token BINDER DEFINE %token ROUNDPAREN_O ROUNDPAREN_C
53.
ここで一つ 問題が
54.
Ragelで宣言したトークンと go yaccで宣言したトークンは お互いどういう対応に なってるかを知らない
55.
対応させましょう var oretokens =
[...]int { miner.ATOM: ATOM, miner.STRING: STRING, miner.OPERATOR: OPERATOR, miner.BINDER: BINDER, miner.ROUNDPAREN_O: ROUNDPAREN_O, miner.ROUNDPAREN_C: ROUNDPAREN_C, } func toToken(ore miner.Ore) int { return oretokens[ore.Token] }
56.
もう一つ 問題が
57.
Go yaccで宣言したトークンが どのような型になってるべきか を教えてないといけない
58.
トークンの型定義 %union { tok int val
interface{} values Val box Box } %type <val> ATOM, STRING, OPERATOR, BINDER, DEFINE %type <val> ARG %type <val> action, Expression %type <values> StringExpression, AtomExpression
59.
あとは 抽象構文木を 作成しよう
60.
抽象構文木とは http://en.wikipedia.org/wiki/Abstract_syntax_tree
61.
抽象構文木 = Node = 配列の入れ子
62.
例
63.
Goで 抽象構文木を歩こう
64.
packageに あるよ! > Tips: 困ったら公式のGoのpackageのソースを読みましょう
65.
go/ast Package ast declares
the types used to represent syntax trees for Go packages. (公式より) ※実はPythonにも標準パッケージとしてあります
66.
ネタが尽 きました
67.
おまけ
68.
関数宣言の 管理
69.
関数宣言の管理とGlobal Environment http://www-inst.eecs.berkeley.edu/~cs61a/sp12/book/
70.
Global Environment は一つ
71.
シングルトン だ!
72.
トークンの型定義 type Env interface{} type
envs []Env var environment envs type EnvValue struct { Name string Val Env } func AccessEnv() *envs { return &environment }
73.
DEMO
74.
Go languageで大切なこと
75.
標準Package の ソースは 宝の山
76.
さしずめこんな感じ
77.
78.
ご清聴 ありがとう ございました
79.
https://github.com/ esehara/Perid
Jetzt herunterladen