κeenです。お久しぶりですね。表題のとおり入社報告です。 最近はあまり入社エントリとかみなくなって悲しいですね。私もあんまり書く気なかったんですが知り合いへの連絡に便利なので残しておきます。 9/1付で入社し、コンパイラチームに配属されました。初日はアセンブラの仕様書渡されました。他にも社内ドキュメントを大量に渡されてそれ読んでるだけで1週間経ちそうです。 知り合いやTwitterでの相互フォローの方とか多いと思うのでよろしくお願いします。
κeenです。お久しぶりですね。表題のとおり入社報告です。 最近はあまり入社エントリとかみなくなって悲しいですね。私もあんまり書く気なかったんですが知り合いへの連絡に便利なので残しておきます。 9/1付で入社し、コンパイラチームに配属されました。初日はアセンブラの仕様書渡されました。他にも社内ドキュメントを大量に渡されてそれ読んでるだけで1週間経ちそうです。 知り合いやTwitterでの相互フォローの方とか多いと思うのでよろしくお願いします。
error[E0010]: allocations are not allowed in constants --> const.rs:1:23 | 1 | const VEC: Vec<i32> = vec![1]; | ^^^^^^^ allocation not allowed in constants | = note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info) この制限された static や const の右辺に書くときの文脈を const文脈 と呼びます。 この他には配列初期化構文 [init; size] の size の部分やその型 [Type; Size] の Size 、あとはC-like列挙型の判別子の設定に書ける式も
κeenです。コンパイル時に定数を処理する最適化技法あるじゃないですか。あれの名称がイマイチはっきりしないのでモヤモヤするなーという記事です。 技法 コンパイル時に定数を処理する最適化技法は色々あるんですがそれらを包括した名称だったり個別の名称だったりがごっちゃになってるのがはっきりしない要因です。 ここでは個別の技法を7つ挙げておきます。 技法A 定数と分かっている変数を定数におきかえるやつ 例 A = 100; B = A + 10; ↓ A = 100; B = 100 + 10; 技法B 変数から変数への代入を削除し、代入先の変数への参照を代入元の変数への参照に置き換えるやつ 例 A = 100; B = A; C = B + 10; A = 100; C = A + 10; 技法C 条件分岐の条件が定数の場合に条件なしジャンプにするやつ 例 if (true) { do_some
κeenです。最近JEITAのソフトウェアエンジニアリング技術ワークショップ2020に参加したんですが、そこで五十嵐先生、柴田さん、Matzとパネルティスカッションをしました。その議論が面白かったので個人的に話を広げようと思います。 年末年始休暇に書き始めたんですが体調を崩したりと色々あって執筆に時間がかかってしまいました。 時間を置いて文章を書き足していったので継ぎ接ぎ感のある文体になってるかもしれませんがご容赦下さい。 というのを踏まえて以下をお読み下さい。 いくつか議題があったのですが、ここで拾うのは一番最後の「プログラミング言語の未来はどうなるか」という話題です。 アーカイブが1月末まで残るようです。もうあと数日しかありませんが間に合うかたはご覧下さい。 そのとき各人の回答を要約すると以下でした。 五十嵐先生:DSLを簡単に作れる言語というのが重要。それとプログラム検証、プログラム
κeenです。個人的によく設計したなと思っているRustのEntry APIについて紹介します。 標準ライブラリのHashMapの操作を無駄なく書きたい人におすすめ。 Entry APIとは HashMap のEntry APIというのは私が勝手に呼んでる名前ですが、 HashMap::entry を起点にして使えるメソッド群のことを指しています。 これは「HashMap に に対応する値があればそれにXXし、なければYYする」をするときに使います。 例えば HashMap<String, Vec<String>> にキーに対応する値(Vec<String>)があれば新たな文字列をpushし、なければ空 Vec を作って新たに文字列をpushするという操作をしてみましょう。 素直に HashMap::get_mut とパターンマッチを使って書くとこうなりますね。 // 準備 let mut
κeenです。 ここ半年くらいTwitter上でプログラミングに入門してる人、入門してエンジニアとして働きはじめたばかりの人を観察していました。 そろそろ潮時かなと思ったので観察結果を報告します。 観察結果をまとめようと思ったのは、どっかのタイミングで書こうと思っていたところに丁度いい記事が目に入ったからです。 プログラミングスクールに通わず、プログラミングを学ぶ方法 プログラミングをともに学ぶ仲間をTwitterで探すのはやめておこう(追記) 私が初心者を観測していて、これらの記事と概ね同じ意見に至ったので補足説明として記事を書きます。 観察に至るまで 結果を書く前に、どういう経緯で観察をはじめてどうやって観察対象を集めたかを記しておきたいと思います。 モチベーション だいたいこの2ツイートに要約されます。 小耳に挟んだ話なので眉唾ものなんですがXSSとかSQLインジェクションみたいな古
κeenです。「強めに型をつける」シリーズです。 いつか書こうと思って後回しにしてたら全然書かなかったので寝れない夜に筆をとります。 特にスクリプト言語を使ってた人にありがちな「なんでも文字列」について。 スクリプト言語だと文字列の扱いが簡単ですし、操作する関数も色々あるのでついつい何にでも文字列を使ってしまいがちです。 例えば状態をあらわすのに文字列を使ったりしてませんか? // "朝", "昼", "夜"で時間帯を表わす fn hello(period: &str) -> &str { // 文字列にパターンマッチできる。便利! match period { "朝" => "おはようございます", "昼" => "こんにちは", "夜" => "こんばんは", // Rustがエラーを出すのでそれ以外の場合も処理しておく _ => unreachable!(), } } あるいは、構造
κeenです。 先日の記事で言及した最小限のELFが需要ありそうだったので解説してみます。 コンパイラを作るときの参考にしてみて下さい ELFはExecutable and Linkable Formatを表わし、Linuxなどで標準の実行可能ファイルのフォーマットとなっています。 なんらかの形でこのファイルを生成するのがコンパイラの最終目標となります。 一般にはアセンブラまで吐いて外部のアセンブラやリンカにELFファイルの生成を任せることが多いのですが、自作するなら最後までやりたいという人向けにとっかかりになる最小限のELFファイルを解説します。 まずはこのファイルを生成するのを目指して、後から色々追加していけばインクリメンタルにできるよね、という訳です。 一部、「どうしてかは分からないけどこうしたら動く」みたいな箇所もあるので詳しい人がいたら教えて下さい。 全体構成 プログラムそのもの
κeenです。今朝、エイプリルフールのネタ記事を書いたのでそのタネ明かしをします。タネとはいっても、ほぼ手書きなんですけどね。 WhitespaceはEdwin BradyとChris Morrisにより2003年4月1日に発表された言語です。 この言語自体エイプリルフールのジョークなんですね。 公式ページはあるのですが、繋がらないのでWebArchiveとかからアクセスして下さい。 特徴としては空白文字、タブ文字、改行文字だけで構成されているのでパッと見では何も書いてないようになる点があります。 いわゆるesoteric languageです。 今回の私のエイプリルフールのジョークは、Whitespaceを知らない人には「正直者にしか見えないコードですか?」、Whitespaceを知ってる人には「Whitespace!?んなもん書ける書けるわけないだろ!あ、そうか今日はエイプリルフールか
κeenです。 GitHub Pagesからこんにちは。 私はこのGitHub Pagesのブログの他にGitLab Pagesのブログも持ってるんですが、それが使いやすいので宣伝します。 GitLab Pagesを使うと Markdownでブログがかける Markdownのまま git push で記事の公開ができる コンテンツの管理が(GitHub Pagesより)楽 サイトでHTMLやJavaScriptが使い放題 になります。 JavaScriptが自由に使えるということは私のようにreveal.jsなどのスライドエンジンを使ってMarkdownでスライドを書いて公開することもできます。 ブログに自由度が欲しいという方におすすめです。 GitHub PagesとGitLab Pages GitHub PagesとGitLab Pagesはだいたい似たようなことができます。 ユーザの
# 安全なシステムプログラミング言語Rustへの招待 ---------------------- [IIJ Labセミナー](https://iijlab-seminars.connpass.com/event/152079/) === # About Me --------- ![κeenのアイコン](/images/kappa.png) * κeen * [@blackenedgold](https://twitter.com/blackenedgold) * Github: [KeenS](https://github.com/KeenS) * GitLab: [blackenedgold](https://gitlab.com/blackenedgold) * [Idein Inc.](https://idein.jp/)のエンジニア + 2年半くらい仕事でRustを書いている
κeenです。実践Rust入門 言語仕様から開発手法まで(技術評論社)を書いた(3人で共著)のでどういう本なのか解説します。 5/8発売です。電子版もありますよ。Gihyo Digital PublishingだとPDFが手に入るので人気らしいです。 See Also 書籍『実践Rust入門』の詳細な目次です 目指したもの Rustの入門書といえば公式ドキュメントのThe Book、TRPLなどと呼ばれるThe Rust Programming Languageやその有志による和訳が一番に挙がるでしょう。 それ以外にもオライリーよりProgramming Rustやその和訳版も出ています。 どちらもRustについてよく書かれており、本書の購入を検討されている方は上記2冊との違いが気になるかと思います。 本書の大きな特徴は以下の2点です。 Rust 2018 Editionに対応している 実
文系でプログラマーになったけど色々失敗して3年半で会社を辞めた話|denkigai|noteという記事を読みました。 この記事に書かれていることが私の身にも覚えがあります。特に私と同い年の方のようなので自分に重ねてしまうところもあります。 ですが多少似たところはあってもやっぱり他人なので全然違う体験もしています。そういう体験を書いてみようと思います。もし該当記事を読んで絶望した人がいるなら別の例もあるよということで参考にしてください。 私は「パソコンの中身が知りたい。多分プログラミングとかいうやつを勉強したら分かる気がする。」くらいのモチベーションでプログラミングをはじめました。 ゴールがあやふやですし、結局のところ「プログラミングをする」が目標になってるので迷子になるのは必至ですね。実際そういう時期がありました。 そんな私でも今はプログラマとして生きています。以下に、私が遭遇した課題とそ
# イマドキと言われる言語機能について ---------------------- [第60回プログラミングシンポジウム](http://www.ipsj.or.jp/prosym/60/60program.html) === # About Me --------- ![κeenのアイコン](/images/kappa.png) * κeen * [@blackenedgold](https://twitter.com/blackenedgold) * Github: [KeenS](https://github.com/KeenS) * [Idein Inc.](https://idein.jp/)のエンジニア + 情報科学の教育は受けていない純粋なエンジニア * 実際に仕事で使った(ている)のはJava, Scala, Rust === # 最近っぽい言語 ------------
κeenです。遅刻してしまいましたがこのエントリーは 言語実装 Advent Calendar 2018 1日目の記事です。 最近私の観測範囲内でJITが流行っているのですが一口にJITと言っても色々あるよなーと思ったので私がJITについて知っていることをグダクダ話します。 このブログでも何度がJITや周辺技術について取り上げてますが話の流れがスムーズになるので最初から説明していきます。 2018-12-03: 加筆修正しました。差分はこちら JITって? Just in Time(コンパイル)のことで、日本語にすると「間に合ってコンパイル」になりますかね。 インタプリタの高速化テクニックの1つです。 最初はインタプリタのようにコードをコンパイルせずプロセスが起動しますが、メソッドを実行するまでにはメソッドをコンパイルして、ネイティブコードで実行する方式です。 本来ならJITはこのような意
κeenです。言語処理系勉強会 Vol.1 に参加してきました。そこでの@omochimetaruさんのSwiftのGenericsとProtocolの実装の話が面白かったので少し感想を。 Javaのジェネリクスは型消去で実装されており、全てのジェネリクスを1関数でまかなえます。一方で統一的に扱うために参照型しかジェネリクスに使えず、プリミティブの取り回しに苦労します。 C++のテンプレートやRustのジェネリクスは型毎に実装を作るのでどんな型でも扱えますし、高速です。代わりに関数の数が増えてバイナリサイズが大きくなりがちです。 Swiftはその中間ようなアプローチを取っていました。 Swiftのジェネリクスの話を要約すると、 ジェネリクス関数には値型も全て参照になって渡される。ただし型のメタデータ(Metatype)を渡してゴニョゴニョして失われた型情報(Value Witness Ta
κeenです。こういう流れがあったので移植しました。 keenさんが「2028年、Rust でイケてる web application framework はこれだ!」みたいな記事を書くとと "余力" が生まれるかもしれません…!! — FUJI Goro (@__gfx__) 2018年8月28日 まずISUCONを知らない方に雑に説明しておくと、意図的に遅く作られたWebアプリケーションが与えられるので7時間くらいでどれくらい高速化できるかを競うコンテストです。 このお題のWebアプリケーションが参加者や流行りに合わせて複数言語で提供されるのですが、今年はRustが来そうだということで参加者の肩慣らしのために過去問を移植しましたというお話。 ひとまずソースコードは こちら 手元でベンチマークをしてみた限り、Pythonの2倍くらいは速いもののGoには劣るようでした。これの考察については
κeenです。久しぶりのブログですね。 LLイベントに行ってきたらパッケージマネージャの話がありました。 その懇親会でcargoについて振られたんですがタイミングがなくて喋れなかったのでブログに書いておきます。 ざっくりまとめると パッケージマネージャ/ビルドツールに要求される要件を卒なくこなしている 面倒を見る範囲が広く、要はワンストップソリューションだから便利 コンパイラと同じ母体が開発してるのでグダグダがない じゃないかなと思います。あとバイナリなのでキビキビ動く。 因みにcargoが便利という声の中にはcrates.ioで欲しいパッケージを探しやすいだとかみんな割とセマンティックバージョニングを守るので理不尽にビルドがコケたりしないなどもあると思います。 1に関しては最近のよくあるベストプラクティスを全部やったらこうなったって感じですね。 セマンティックバージョニングで依存関係を管
# Rustこれまでとこれから ---------------------- [Learn Languages 2018 in ODC (LL2018) ](https://llevent.connpass.com/event/95443/) === # About Me --------- ![κeenのアイコン](/images/kappa.png) * κeen * [ちゅーんさんだよー](https://shindanmaker.com/789932) * [@blackenedgold](https://twitter.com/blackenedgold) * Github: [KeenS](https://github.com/KeenS) * [Idein Inc.](https://idein.jp/)のエンジニア + Rustで開発してるよ * Lisp, ML, Rus
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く