2017-01-01から1年間の記事一覧

SSHのホスト鍵設定

ホスト鍵とは SSHの鍵はデジタル署名用の秘密鍵であり、本人確認に使われる。いわゆるid_rsaは、ユーザー側の本人確認のために使われる。 一方、SSHサーバー側も専用の秘密鍵を所有している。これは /etc/ssh/ssh_host_{dsa,ecdsa,ed25519,rsa}_key のような…

再帰的余代数について

最近、再帰的余代数という概念について少し勉強したので、証明をまとめてPDFにした。 github.com 動機など細かいところには触れられていないが、以下のことが証明されている。 終再帰的余代数 = 始代数 Setでは、再帰的ならば整礎

WSL+Xming環境整備

WSLとXmingを組み合わせていい感じに環境整備できてきたので記録をとる。 WSLとXmingについて WSLはWindows上でLinuxのプロセスを実行する機能である。互換性は完全ではないが、多くのソフトウェアが動くようになっている。ただし、そのままではGUIは動かな…

古いRubyをビルドする

動機 現時点でRubyの最新版は2.4, サポートされているのは2.2までで、2.1以前はメンテナンス対象外である。そのような古いバージョンを動かすのは決してよいことではない。 しかし実のところ、現在でも多くのWindowsマシンで、Ruby1.8.1とRuby1.9.2p0が動作…

Rust-proofを使ってみる

概要: Rust-proofはElectrolysisと同様にRustプログラムから検証条件を抽出するが、LeanではなくSMTソルバであるZ3向けの検証条件を出力する。こちらも開発が放棄されているように見えるが現在もビルド可能である。 準備 テスト用リポジトリを準備する $ car…

Electrolysisを使ってみた

概要: ElectrolysisはRustの検証条件をLEANに出力するプロジェクトである。これを使ってみた。 Electrolysisとは Electrolysis (electrolysis: 電解) はSebastian Ullrich氏の修士研究で開発されたプロジェクトで、Rustプログラムの正当性や計算量に関する検…

Rust組込みトレイトのコヒーレンス

以下のトレイトは通常のコヒーレンス規則に加えて、特別なコヒーレンス規則が適用される。 Sized, Unsize Sized, Unsize の手動実装を与えることはできない。 Fn, FnMut, FnOnce Fn, FnMut, FnOnce の手動実装は安定版では禁止されており、 #![feature(unbox…

Rustにおける再帰的/余再帰的なトレイト選択/トレイト履行

Rustでは以下のようなプログラムはコンパイルエラーになる。 struct List<X>(Option<Box<(X, List<X>)>>); // 通常は X: Clone を仮定するが、あえて Option<Box<(X, List<X>)>>: Clone としてみる impl<X> Clone for List<X> where Option<Box<(X, List<X>)>>: Clone { fn clone(&self) -> Self { List(self.0.clone()</box<(x,></x></x></box<(x,></box<(x,></x>…

RustのRFC一覧 (~1552)

概要: RustのRFCの一覧を作ろうとしたが、あまりに多いのでとりあえず1552までで公開することにした。なお、単に全てのRFCを列挙したいならばここを見ればよい。 このRFCはRustのコミュニティーが管理しているものであり、 “RFC” の元祖であるIETF RFCとは関…

Rustのコヒーレンス

概要: Rustの impl が定義できる型にはコヒーレンスと呼ばれる制限がある。これについて説明する。なお、この記事では特殊化がない前提で説明する。 コヒーレンス初心者のための概説 以下のように impl が重複していたり、自分のところ以外の型の impl を定…

RustのRFC一覧 (~1240)

概要: RustのRFCの一覧を作ろうとしたが、あまりに多いのでとりあえず1240までで公開することにした。なお、単に全てのRFCを列挙したいならばここを見ればよい。 このRFCはRustのコミュニティーが管理しているものであり、 “RFC” の元祖であるIETF RFCとは関…

RustBelt試行中: get_x の一般化

RustBeltの examples/get_x.v をいじってみた。 From iris.proofmode Require Import tactics. From lrust.typing Require Import typing. Set Default Proof Using "Type". Section get_x. Context `{typeG Σ}. Definition get_x : val := funrec: <> ["p"]…

RustのRFC一覧 (~0900)

概要: RustのRFCの一覧を作ろうとしたが、あまりに多いのでとりあえず0900までで公開することにした。なお、単に全てのRFCを列挙したいならばここを見ればよい。 このRFCはRustのコミュニティーが管理しているものであり、 “RFC” の元祖であるIETF RFCとは関…

RustBeltのビルド (Windows)

概要: Coqと高階分離論理を用いたRustの検証プロジェクトであるRustBeltの論文とCoqの証明ファイルが公開されたので、とりあえずビルドしてみた。 RustBeltはopamを使うと簡単にビルドできるようだが、ここではWindowsでビルドしてみた。 環境 64bit Windows…

RustのRFC一覧 (~0500)

概要: RustのRFCの一覧を作ろうとしたが、あまりに多いのでとりあえず0500までで公開することにした。なお、単に全てのRFCを列挙したいならばここを見ればよい。 このRFCはRustのコミュニティーが管理しているものであり、 “RFC” の元祖であるIETF RFCとは関…

RustのRFC一覧 (~0200)

この記事は古いのでこちらをご覧ください 概要: RustのRFCの一覧を作ろうとしたが、あまりに多いのでとりあえず0200までで公開することにした。なお、単に全てのRFCを列挙したいならばここを見ればよい。 このRFCはRustのコミュニティーが管理しているもので…

Rustのトレイト選択

概要: トレイト選択とは、トレイト制約の解決方法を検索するコンパイラの処理であり、型推論にもコード生成にも使われる重要な部品である。本記事ではトレイト選択の動作の詳細について解説する。 トレイト選択とは トレイト選択 (selection) とは、トレイト…

Rustにおける左辺値選好と可変性調停

概要: Rustのミュータビリティー推論に使われる左辺値選好と可変性調停について説明する。 左辺値選好 Rustの型推論では、期待型のほかに、左辺値選好 (lvalue preference) という状態もトップダウンに渡される。 LvaluePreferenceは以下のどちらかの値をと…

Rustのバイト列リテラルの型

Rustのリテラルの型検査は check_lit にある。これによると、文字列リテラルの型は &'static str である一方、バイト列リテラルの型は &'static [u8] ではなく、 &'static [u8; N] である。 そのため、以下のようなコードがコンパイルできる。 fn main() { l…

Rust unsize期待型とキャスト期待型

Rustの期待型は以下のようなデータ構造になっている。 #[derive(Copy, Clone, Debug)] pub enum Expectation<'tcx> { NoExpectation, ExpectHasType(Ty<'tcx>), ExpectCastableToType(Ty<'tcx>), ExpectRvalueLikeUnsized(Ty<'tcx>), } このように4つのコン…

Rust 関数呼び出しの期待型の伝搬

以前の記事で説明したように、Rustでは型強制や整数リテラルなどの特殊な型推論をシームレスに行うために期待型という概念を導入している。 この期待型はトップダウンに伝搬されるが、先ほどの記事で挙げた例 fn main() { let x : Box<[_]> = Box::new([1, 2…

Rustにおける演算子の型推論の特殊ルール

概要: 原則として x + y は ::std::ops::Add(x, y) の構文糖衣であるが、型推論で特別扱いされる。 演算子の脱糖 演算子の脱糖は型推論の後、HIRからMIRへの変換のタイミングで行われる。原則として x + y は ::std::ops::Add(x, y) の構文糖衣である。これ…

Rust パターンマッチの変数束縛とコンストラクタ/定数の区別

パターンマッチを持つ言語では、変数束縛とコンストラクタ/定数が構文上曖昧である場合がある。Rustでは以下の規則に従っている。 以下のように、構文的にパスであるとわかる場合は、常にコンストラクタ/定数とみなす。 :: を含んでいる場合。 (::A, self::A…

Rustで use std; が必要なときとエラーになるときがあるのは何故か

Rustでは use std; や use rand; のようなインポートが必要な場合と、逆に書くとエラーになる場合がある。 簡単に言うと トップレベルモジュールでは、書くとエラーになる(既にある名前と衝突する)。それ以外の場所では、必要な場合がある。 これは名前をロ…

Rustでunsafeが必要な操作

Rustでは unsafe の表明を行わない限り未定義動作が発生しない。コンパイラや言語仕様のミスにより未定義動作が発生しうる場合には優先的に修正される。(なお、整数オーバーフローのように特定条件下でエラーになるものであっても、正しくunwind/abortできる…

Rustコンパイラのコンパイルの流れ

Rustコンパイラは同梱のrustbuildというツールでビルドされる。これはRustとPython2で書かれている。 README.md にも説明が書かれているが、ここで改めて説明をしてみる。 ./x.py は src/bootstrap/bootstrap.py にリンクされている。これは次のような動作を…

Rustコンパイラの自前ビルド

コンパイラの動作を調べるにあたって、いちいちmasterをビルドするのは不便なので、安定版の自前ビルドを作成することにした。 $ wget https://static.rust-lang.org/dist/rustc-1.18.0-src.tar.gz $ tar xvf rustc-1.18.0-src.tar.gz $ cd rustc-1.18.0-src…

RustでOptionやResultの配列ができてしまったときの一般的なテク4つ

Vec<Result<_>> ではなく Result<Vec<_>> を得る collect() 関数を使うと、 Vec<Result<_>> を得ることもできるし、 Result<Vec<_>> を得ることもできる。変換先の型を明示することで区別する。 fn main() { // 全てSomeならSome(配列)を返し、どれかがNoneなら全体もNoneになる assert_eq!([So</vec<_></result<_></vec<_></result<_>…

Rust パターンマッチの網羅性

Rustのパターンマッチは網羅性が検査され、網羅的でない場合はコンパイルエラーになる。網羅性は以下のように検証される。 型の分類 パターンマッチの網羅性をするときには、全ての型がADTのように扱われる。つまり、有限個の引数をとるコンストラクタが有限…

Rustのmatchにおけるカンマの省略

Rustの match の腕はカンマで区切られるが、これが省略できる場合が2つある。 末尾のカンマ => { .. } の直後のカンマ fn main() { match Some(1) { Some(x) => { } // => { .. } の直後にはカンマは省略可能 None => () // 末尾のカンマは省略可能 } } この…