「software_development」カテゴリーアーカイブ

マスク形のウェアラブル機器というのは作れないだろうか?

ウェアラブル機器として、自然に身につけて、他人に警戒されないようなものというのはどういうのがいいのだろうか?

メガネ形というかサングラス形というのは結構いいような気がする。
あと、帽子とかヘッドホン形とか。

花粉症が流行っていてマスクをして外を歩いている人が多いので、マスクの中に機器を埋め込んだマスク形ウェアラブル機器というのは大丈夫そうな気がする。
マスク形ビデオカメラとか。
こういうカメラを使って作れないかと考えてる。

他には、マイクとスピーカーを埋め込んだマスク形翻訳機とかマスク形ボイスチェンジャーとか。
呼気をチェックするヘルスケア系のデバイスとか。

LLVM-IR(LLVM中間コード)用コンパイラの作り方 その9

前回の続き

PRINT文の実装について。

10 PRINT A+1
みたいなPRINT (数式)という構文のみを実装する。

本当は文字列の表示にも対応させたいのだけど、文字変数とか文字定数を実装しないといけないので、結構な手間になる。
手抜きの為に、数式のみ実装することにした。
続きを読む →

LLVM-IR(LLVM中間コード)用コンパイラの作り方 その8

前回の続き

前回、IF文の分ができたので、繰り返しのFOR~NEXT文の実装について

IF文では、ざっくり書くと
(1)数式左辺の値を計算するコード
(2)数式右辺の値を計算するコード
(3)2つの値を比較して結果をBool値で得るコード (条件式の示す値)
(4)条件式の示す値(Bool値)が真ならば THENの部分のラベルにジャンプ
(5)偽ならば ELSEの部分にジャンプ
(6)THEN部分のコードとENDIFへのジャンプ
(7)ELSE部分のコードとENDIFへのジャンプ
(8)ENDIFのラベル
というコードが生成される。

FOR~NEXT文についてもほとんど同様だ。
続きを読む →

LLVM-IR(LLVM中間コード)用コンパイラの作り方 その7

前回の続き

前回、GOTO文の分ができたので、条件分岐のIF文の実装について

IF B=1 THEN A=2
というTinyBasicのソースをコード生成の仕方を説明する。

まず、
比較演算子(=)について、左辺と右辺のコードを生成する。

	%1 = load i32* %_V1, align 4
	store i32 %11, i32* %acc
	%2 = load i32* %acc, align 4
	store i32 1 , i32* %acc, align 4
	%3 = load i32* %acc, align 4

として、変数Bの中身をレジスタ的な使い捨て変数の%2に取り出し、即値の1を%3に入れる。

そして、icmp命令で比較を行う。

	%4 = icmp eq i32 %2, %3

比較した結果はBool値で%4に入る。
続きを読む →

Nagoya ComCamp 2016 powered by MVPsに行ってきた

Nagoya ComCamp 2016 powered by MVPsという勉強会に行ってきた。
去年も行ったのだった。(→ MicrosoftのMVP Community Camp 2015 名古屋に行ってきた)
今年は、会場はNSCではなく、別の場所だ。NSCのランディ-さんの勉強会もずっと開催されていないが、どうしてしまったのだろうか?
20160220_101016
内容は、
・Windows 10の魅力と真価
・JavaScript で作る! UWP アプリ
・OSSとオープンイノベーション
・2016年初頭のWebフロントエンド技術おさらい – Edgeもあるよ –
・.NET Core5から概観する、.NETのOSSへの取り組み
・Azure Machine Learning実践入門
とLTだった。
続きを読む →

LLVM-IR(LLVM中間コード)用コンパイラの作り方 その6

前回の続き

先週は、TinyBasicの変数の定義とか代入文のLLVM-IRコード生成部分を説明した。
今週は、行番号とかGOTO文などを説明する。

行番号については、コード生成は簡単だ。
LLVM-IRアセンブラでは、他のアセンブリ言語と同様にラベル定義ができるので、行番号の数字を含んだラベルを生成すればよい。
行番号が10なら「_L10」、
行番号が20なら「_L20」、
とか。
続きを読む →

LLVM-IR(LLVM中間コード)用コンパイラの作り方 その5

前回の続き

Tiny Basicの代入文「A=A+10」のコード生成で、
(1)変数Aを定義、ゼロで初期化
(2)変数Aのメモリをレジスタ1に取り出す
(3)定数10をレジスタ2に入れる
(4)レジスタ1とレジスタ2を加算し、結果をレジスタ1に入れる
(5)レジスタ1の内容を変数Aのメモリに書き込む
というのを、実際にLLVM-IR中間コードアセンブラで書いてみる。
続きを読む →

LLVM-IR(LLVM中間コード)用コンパイラの作り方 その4

前回の続き

前回の構文の処理で、「命令」と書いていた部分を細かく書く。

構文として、
 命令 = 代入文 または
 命令 = PRINT命令 + 数式 または
 命令 = GOTO命令 + 行番号
などと、定義する。
他にも命令文は増えるのだけど、今は省略。

そして、代入文は
 代入文 = 変数 + 「=」 + 数式
 数式 = 項 + 演算子 + 数式 または 数式 = 項
 項 = 単項演算子 + 項 または
 項 = 「(」 + 数式 + 「)」 または
 項 = 変数 または
 項 = 定数
というように定義する。
続きを読む →

LLVM-IR(LLVM中間コード)用コンパイラの作り方 その3

前回の続き

yaccで作成した構文解析ソフトを加工して「骨組み(スケルトン)に肉付け」する形でコンパイラを作っていく。

例えば、文法の一部の、
 行 = 行番号 + 命令群
 命令群 = 命令 + 「:」 + 命令群 または 命令群 = 命令
と言う部分について、
構文を定義したyaccソースコード部分に追加で、その構文に対してどのような処理をするのかを書くことが出来る。

しかし、解釈した構文の処理は、コンパイラが出力すべき命令語の順番になっていない。
上記の例の場合には大きく順番が狂うことはないが、数式の処理の部分だと演算子の優先順位や括弧の処理で大きく順番が狂う。

これを解決するには”構文木”という二分木のツリー構造を使う。
続きを読む →