Python処理系入門 〜"1 + 1" で学ぶ処理系解読の基礎〜

この記事は CAMPHOR- Advent Calendar 2018 4日目の記事です.

1. はじめに

プログラミング言語 Python は汎用の動的型付き言語で,機械学習や Web 開発を中心に幅広く使われています.特にここ数年の Python 人気は凄まじいものがあり,某大学生協の本屋では,プログラミング系の平積みコーナーが一面Python 関連書籍で埋め尽くされています.所属しているコミュニティの関係でプログラミング初心者の学生にもよく会うのですが,第一言語Python という方が非常に多く,まさに猫も杓子も Python といった状況です.

そんなわけで,人々がこぞって Python でプログラムを書いているわけですが,「Python 自体がプログラムである」という事実に目を向けたことのある人は非常に少ないと思います.みなさんが Python のプログラムを書いて実行する時,実際には,処理系(インタプリタ)と呼ばれるプログラムが起動し,みなさんが書いたプログラムを読み込んで実行しています.みなさんが日々入力している python というコマンドもまた,処理系というプログラムなのです.

最も主要な Python の処理系(つまり Pythonソースコードを読み込んで実行するプログラム)はC言語で書かれた CPython で,「Pythonをインストールする」と言った時は,大抵この CPython をコンパイルしてできた実行ファイルをインストールしています.CPython はオープンソースソフトウェアで,誰でもソースコードを閲覧したり開発に参加することができます.CPython のソースコードPython の振る舞いをより深く知るのにはうってつけの資料で,CPython の開発に携わっていなくとも,サービスのボトルネック発見といった課題のためにC言語で書かれたソースコードを読む破目になる人もいることでしょう.

しかしこの CPython,ソースコードが膨大で,最初は読むべき場所を探し当てるのが非常に難しいです.CPython のデータ構造や実行の全体像といった内容については有志の解説記事がそれなりに存在しますが,コードの読み方にまで踏み込んだ情報はなかなか存在せず,とっかかりを見つけるのがとても大変です.

この記事は,そうした厳しい状況を少しでも改善することを目的とした,CPython 入門者のためのハンドブックです.「CPython を改造して 1 + 1 = 3 にする」というお題を通して,CPython の基礎知識から,CPython のコードの読み方まで解説します.次の2章では,CPython に関する最低限(本記事を理解するのに必要なだけ)の知識を説明します.3章では,「CPython を改造して 1 + 1 = 3にする」というお題を通して,実際のソースコードを追いかけてみます.ここでは,ただ変更箇所を示すのではなく,どのように変更箇所を探し当てるのかという部分に焦点を当てて解説します.4章では,3章のコードリーディングからエッセンスを抽出し,CPython のソースコードを自力で読んで行くための一般的な知見を説明します.5章でさらに掘り下げていくための資料をいくつか紹介し,6章でまとめとします.CPython の構造体や実行方法についてぼんやり知っているという人は,2章を飛ばして3章から読んでも良いでしょう.

続きを読む

漸進的型付けの未来を考える

この記事はCAMPHOR- Advent Calendar 2017 11日目の記事です.

アブストラクト

漸進的型付けは,ひとつの言語の中で静的型付けと動的型付けをスムーズに組み合わせるための技術です. よく知られた特徴は any 型を使った静的型付けで, TypeScript や Python といったプログラミング言語には既に実装されています. しかし,理論と実際のプログラミング言語の間には大きなギャップが存在します. 特に,漸進的型付けの理論で提案されているキャストを用いた動的型検査が実装されていないために, 静的型付けの恩恵を十分に得られていないという問題があります. この記事では,まず漸進的型付けの理論をコード例を用いて紹介し, 現状の漸進的型付き言語が抱える問題を解説します. そのあとで,漸進的型付き言語が目指すべき目標を理論的視点から論じます. それらの目標は,静的型付けを行うこと,キャストを用いた動的型検査を行うこと, 動的型検査を効率よく行うこと,型情報に基づいて最適化を行うことの4段階に分類することができます. 未だ実現されてないこれらの目標を論じることで, 多くの人に漸進的型付けの未来を考えてもらうのが本記事の目的です.

続きを読む

TypeScriptでChrome拡張を書くテンプレートリポジトリを作った

去年の7月からお世話になっている京都のIT系学生コミュニティCAMPHOR- にて,『漸進的型付けを語る会』という素晴らしい催しがありまして,そこでTypeScriptの概要を発表しました.イベント自体については,そのうち公式ブログ http://blog.camph.net/ にレポート記事が上がりますので,興味のある方は見てみてください.

今回の調査に乗じて,拙作のHoogleSwitcherをTypeScriptで書きなおしたのですが,ビルド環境が割と良い感じになったのでテンプレートにして公開しました!このまま使えなくとも,各種設定ファイルくらいは参考になると思うので良しなに使ってください.以下では関係ツールを黙々と紹介します.

github.com

gulp

JS界隈ではおなじみのビルドツール.他の様々なビルドツールAPIをストリームとして組み合わせて処理を記述します.学習コストは高めですが強力なツールです.今回のテンプレートでは主に以下の操作を記述しています.

  • gulp watch
  • gulp test
    • ビルド(型検査)とLint
  • gulp pack
    • ビルドして公開用のzipファイルを生成する

webpack

最近注目を集めている(?)フロントコードのビルドツールです.browserifyと同系列のツールだと思えば大体合っているのではないでしょうか..tsファイルの変換を行うように設定し,gulpから使用しています.

typings

TypeScriptの型定義ファイルを管理するツールです.既存のライブラリを含めた型検査を行う場合に別で用意された型定義ファイルをダウンロードして読み込む必要があり,それらの一覧や設定を管理してくれます.

Wantedly SPRING INTERNSHIP 2016 に参加しました

3/2(水)〜3/4(金)の3日間,「Wantedly SPRING INTERNSHIP 2016」に参加しました.

www.wantedly.com

1日目

CEOの仲さんからプロジェクトを作るための心構えやノウハウを講義していただき,ZOOS(Wantedly Zero to One Objective Setting)という枠組みで新規事業をチームで考えていきました.アイディア出しに1時間,モック作成に3時間と非常に過密なスケジュールでしたが,各段階で仲さんのフィードバックをいただきながら新規事業を創出することに成功しました.実際に市場にインパクトを与えている経営者からのレビューは非常に鋭く,自分たちではたどり着けないところまで思考を引き上げていただきました.

2日目

2日目は打って変わってコーディング漬けの一日でした.実際に稼働しているWantedlyの新卒採用ページをReact.jsで置き換えることを目標に講義と演習を繰り返しました. まず最初に,HTML/CSSのレベルでトップページの一部を再現しました.制限時間は1時間,一番早かった人にはプレゼント(大嘘)というスピード感のある環境で,普段はあまり書かないCSSに一気に取り組めました.答え合わせのコーナーでは,Flexboxによる簡単なレスポンシブデザインなど比較的新しい技術についての説明もあり参考になりました. それが終わると次はReact.jsの講義・演習をしていただきました.Reactはそろそろ実践してみようと思ってチュートリアルを読んだりしていたので非常に興味を持って取り組めました.WantedlyでもReactを用いたSPAに切り替えていく流れがあるという話もこぼれ,積極的に新技術を採用するWantedlyのバイタリティを感じました. 合間に社員の方との昼食をはさみながら講義・演習を乗り越え,18時頃からはひたすら実装しました.メンターの方が「今夜は徹夜だね」とぼやいたのを半ば真に受けるくらい熱量のある場でとても刺激を受けました.

3日目

3日目は前日に引き続き黙々と実装を進めました.Reactのコンポーネント指向を感じながらも,CSS設計に失敗してしまい思ったように実装できずかなり苦しみましたが,最低限見せられるものを実装しました.ほとんどページを再現してアレンジまでしているチームもあり,インターン全体のレベルの高さを感じました. それが終わった後,「Demo Day」というWantedlyの取り組みを発表し合う会に参加させていただきました.真面目なビジネスの取り組みから社内のコーヒーサービスまでトピックは多岐にわたり,Wantedlyのビジネス的な面からアットホームな雰囲気までたっぷりと体感することが出来ました.

まとめ

3日間非常に忙しく,スタートアップらしい熱量を感じました.モダンなWebアーキテクチャやインフラを目指して常に変わろうとしているWantedlyの勢いも実感しました.3日間付きっきりで面倒を見てくださったみなさん,本当にありがとうございました.

Hoogle検索をラクにするChrome拡張を作りました!

YesodでWebサイトを書いているとき,Stackageでわざわざ特定のスナップショットのページに飛んでHoogle検索をするのがとても面倒だったので,検索ソースとなるスナップショットを簡単に選択・追加・削除できるようなChrome拡張を作りました.その名も HoogleSwitcher!

chrome.google.com

中身的には全くスゴイことはしていなくて,入力に応じてHackageやStackageのURLをちょっと変えてやってるだけなので超軽量です.

検索ソース(Hackage / LTS / Nightly)を選んでクエリを投げると良しなにタブが開きます. f:id:yu_i9:20160127215234p:plain

アイコンを右クリックすると出てくるオプションページでは検索ソースを追加したり削除したりできます. f:id:yu_i9:20160127215127p:plain

試しに lts-4.2 を追加してみると下のようになります. f:id:yu_i9:20160127215131p:plain

バグ報告とかコードレビューとかフィードバックとかお待ちしてます!

github.com

型クラスを含んだ型推論を概観する 〜Typing Haskell in Haskell より〜

この記事は CAMPHOR- Advent Calendar 18日目の記事です.

こんにちは @yu_i9 です.CAMPHOR- Advent Calendar には今年が初参加になります! 本記事では「Typing Haskell in Haskell (通称 thih)」から型クラスを含んだ型推論のエッセンスを紹介したいと思います. 多少専門的な内容ですが,なるべく多くの人に理解してもらえるように頑張ります.

論文のホームページは以下になります.論文本体とオリジナルの実装が利用できます.

Mark P Jones: Typing Haskell in Haskell

続きを読む

System F をHaskellとPythonで実装した

無事夏休みに突入して時間ができたので再びTaPLを読み始めました.半年触っていなくても進行,保存の証明が書けるあたり,春の自分はずいぶんしっかりと勉強していたようです.春は22章の型再構築まで読んでいたので,ひとまず23章のSystem Fから読んでサクッと実装しました.Pythonが書きたかったので,パーサーだけHaskellで書いてそれ以外をPythonで書くというよく分からない構成で実装していますが,いろいろと学びがあったのでそれを記していきます.

続きを読む