日記
数学とかの本を読むのはいいんだけれど、数式書くのが面倒くさい。 MathmaticaのStudent版を買ってしまおうか…
インターネットが復活した
引っ越しして、インターネットが利用可能になりました!!
この半月がとても長く感じられる…
そういえば、回線はフレッツで契約したのだけれど、インターネットに接続する時に、CTUという物を設定しなきゃ行けない。 このCTUの設定はctu.fletsnet.comでアクセスできる。
当然どこかで名前解決をしている訳なのだけれども、プロバイダの設定をする前なので、 外部のDNSに問い合わせが出来るはずがない。 ローカルファイルにもそんなドメインは載ってないだろうと思う。 ということは、CTUが名前解決をしてるんじゃないのかな?
しかし、そうすると、どうやって名前の解決先を自分に指定してるんだろうか? よくわからん。
英語が読めないから、LLVM Programmer's Manualの一部をまとめてみた
英語がすらすら読めないので、LLVM 3.3の、Programmer's Manualの一部を訳してまとめた。 …いや、ほとんどの部分が、ただの訳だ… まとめた、もとい訳した部分は、The Type class and Derived Typesの部分。
LLVMのコアクラス
- 定義:
include/llvm
- 宣言:
lib/VMCore
LLVMのコアクラスは、プログラムの検査・変形を扱うクラス
Typeクラスとその派生クラス
Type
は、すべての「LLVM IRにおける型」を表すクラスの親クラス
Vlaue
系のクラスは、対応するType
系のクラスを持つ
Type
クラスは派生クラスとしてしかインスタンス化されない。
プリミティブ型のVoidType
、LabelType
、FloatType
、DoubleType
には、隠蔽されている子クラスがある。
これらのクラスには自分の型を識別するメソッドのほかに有用なメソッドが存在しない為に、隠蔽されている。
ほかの型は全てDerivedType
のサブクラスである。
各Type系クラスには名前がつけられているが、必須という訳ではない。
各Type系のクラスにはいづれかの時点で、生成されたインスタンスが必ず一つ存在する。
こうすることで、このインスタンスのアドレスの一致が型の一致と同値となる。
型が等しい ⇔ 型に対応するType系クラスのインスタンスのアドレスが等しい
重要なメソッド(Public)
bool isIntegerTy() const
: 整数型を表すオブジェクトなら、true
を返す。bool isFloatingeterPointTy()
: 5つある浮動小数点数型を表すオブジェクトなら、true
を返す。bool isSized()
: その型について、サイズが既知であればtrue
を返す。 抽象的なType系のクラスや、label
、voidといいった型には、サイズが定義されていない。
重要なDerivedType系クラス
IntegerType
指定されたビット幅を持つ整数の型を表す、DerivedType
クラスのサブクラス。
指定できるビット幅は、IntegerType::MIN_INT_BITS
(1)から、IntegerType::MAX_INT_BITS
(800万ぐらい)までの間。
static const IntegerType* get(unsigned NumBits)
: 指定されたビット幅を持つIntegerType
インスタンスへのアドレスを返す。unsigned getBitWidth() const
: そのIntegerType
のビット幅を返す。
SequentialType
ArrayType
、PointerType
、VectorType
から継承される。
const Type* getElementType() const
: 要素の型を返す。
ArrayType*
SequentialType
のサブクラス。配列型のインターフェースを提供する。
unsigned getNumElements() const
: 要素の数を返す
PointetType
SequentialType
のサブクラス。
LLVM IRにおけるPointer
型を表す。
VectorType
SequentialType
のサブクラス。
ArrayType
とよく似ているけれども、ArrayType
はFirstClassな型ではない一方、こちらはFirstClassな型である点が異なる。
StructType
struct
型を表すためのDerivedType
のサブクラス。
FunctionType
関数型を表すためのDerivedType
のサブクラス。
bool isVarArg() const
: 可変長引数を持つ関数であった場合にtrueを返す。const Type* getReturnType() const
: 返り値似ついて、その型を表現するオブジェクトへのアドレスを返す。const Type* getParamType(unsigned i)
:i
番目の引数について、その型を表わすオブジェクトへのアドレスをを返す。const unsigned getNumPrams() const
: 形式上の引数の数を返す。(可変長のときはどうなるの?)
ちゃんと部屋の環境が整ったら、ニコ生でもやりながら、Helpful Hints for Common Operationsを全部訳そうと思った…
論理学の分野
Wikipediaを見て、これ以降に学ぶ必要があるだろう論理学の分野についてまとめた。
様相論理
~でなければならない、~でありうる、~べきである、といった、 可能性や必然性に関わる命題を扱う論理
時相論理
時間との関連で問題を理解し表現するための規則と表記法の体系。 様相論理に基づいた時相論理を特に時制論理(Tense Logic)と呼ぶことがある。
量子論理
量子力学に基づく論理体系。量子力学で理論的に観測可能な事項の命題がしたがる非古典論理。 2値論理(または、真偽に「観測していない」を含む3値論理 by ハンス・ライヘンバッハ)であるが、 分配率が必ずしも成り立たないことを要求する。
ファジィ論理
真偽値として1〜0の実数を扱う論理。 応用は多岐にわたる。
直観論理
真偽値が「完備ハインディング代数」をとる論理。 古典論理は、直観論理の特別な場合と見ることが出来る。 ここで真偽値を0〜1の実数と考えれば、ファジィ論理、線形代数とすれば量子論理となる。
関数マクロの代わりはinline関数を使うんだね
C++では、定数マクロの代わりにconstを使おう!ってのがあるけれど、じゃあ関数マクロの方はどうするのかと思ったら、inline関数を使おうってのがあるんだね…
定数マクロの代わりにインライン関数を使えば、想定外の動きをしたり、コードが読みにくくなるのを防げるかもしれない。 問題は、インライン関数には型チェックがあるのが面倒臭い。テンプレート関数使えばいいじゃんって話なんだが…。
あと、コンパイル時に値が決定出来るようなものであれば、C++11のconstexprという機能が使えるらしい。 なんでも、式の値をコンパイル時定数として扱えるんだとか。 ただ、なんか黒魔術っぽい。 コンパイル時にパーサー動かすとか何それコワイ