タグ

compilerに関するtsuwatchのブックマーク (17)

  • RubyKaigiでJITコンパイラの書き方について発表した - k0kubun's blog

    RubyKaigi 2023Ruby JIT Hacking Guideというタイトルで発表してきた。 speakerdeck.com JITコンパイラを書くチュートリアル 今回の発表ではJITコンパイラが書ける人間を増やすことをゴールにしていたが、 30分という短い発表枠内では雰囲気を知ってもらうことにフォーカスし、 実際に手を動かしたい人たちにはそれ用のチュートリアルを触ってもらう形を取った。 github.com JITコンパイラは実は初心者向き 独学でコンパイラの作り方を学ぶ人は、Cコンパイラなどを実装することが多いように思う。 C言語は実装対象として一見シンプルそうに見えて実は結構機能が多いので、C11をゴールに始めてもC89の範囲すら実装しきらないままエターなる人も多いのではないか。 そんな僕みたいな堕落した人間にお勧めなのがJITコンパイラ。 インタプリタと併走する特性上、

    RubyKaigiでJITコンパイラの書き方について発表した - k0kubun's blog
  • 低レイヤを知りたい人のための Cコンパイラ作成入門

    はじめに このオンラインブックは執筆中です。完成版ではありません。フィードバックフォーム このには一冊のに盛り込むにはやや欲張りな内容を詰め込みました。書では、C言語で書かれたソースコードをアセンブリ言語に変換するプログラム、つまりCコンパイラを作成します。コンパイラそのものもCを使って開発します。当面の目標はセルフホスト、すなわち自作コンパイラでそれ自身のソースコードをコンパイルできるようにすることです。 このでは、コンパイラの説明の難易度が急に上がりすぎないように、様々なトピックを書全体を通じて次第に掘り下げていくという形で説明することにしました。その理由は次のとおりです。 コンパイラは、構文解析、中間パス、コード生成といった複数のステージに概念的に分割することができます。よくある教科書的アプローチでは、それぞれのトピックについて章を立てて解説を行うことになりますが、そのよう

  • VMに手を加えずRubyを高速化するJITコンパイラ「YARV-MJIT」の話 - k0kubun's blog

    先日のRubyKaigi 2017のLTではLLVMベースのCRuby向けJITコンパイラLLRBの話をしました。 5分はちょっとJITの話をするには短かかったですね。 LLRBをふまえた、Cのコード生成への軌道修正 さて、上記の資料にある通り、CRubyのJITにおいてはメインの高速化対象が既に存在するCのコードになるため、 開発の早い段階でパフォーマンスにインパクトを持てるとすればLLVM Passの順番を変えるくらいで、 LLVM IRを直接生成しても最適化上のメリットがほとんどないのでその部分はMJIT と同じくCのコードを生成するように変更したい、という話をした*1。 で、LLRBはC拡張として作るべくちょっと不思議な努力をいろいろやっており、 それらの設計はやってみた結果(コアに直接変更を加えるのに比べ)デメリットの方が大きいと思ったので、 LLRBの失敗を全て生かしつつ、今回

    VMに手を加えずRubyを高速化するJITコンパイラ「YARV-MJIT」の話 - k0kubun's blog
  • 夏のインターン講義「1営業日で書くJavaScriptコンパイラ」の設計と実装 - クックパッド開発者ブログ

    今年、クックパッドでは夏のインターンと題して20名弱のインターンを受け入れました。 このインターンは前半と後半に大きく分かれており、 後半が社員に混じって業務をするいわゆる普通のインターンで、 前半は7日間にわたってプログラミング関連の講義を受けるという仕組みです。 わたし(青木)はその前半の過程において、「プログラミングパラダイム」という 1 日の講義を担当し、 JavaScriptの処理系を書くという、ツッコミどころの多い課題を実施しました。 稿では、その講義を開発する際に考慮したこと、特に難易度調整についてお話しします。 また講義のために開発したJavaScript処理系「JetSpider」についても軽くふれます。 ▼講義資料 Cookpad Summer Intern 2015 - Programming Paradigm from Minero Aoki JetSpiderコ

    夏のインターン講義「1営業日で書くJavaScriptコンパイラ」の設計と実装 - クックパッド開発者ブログ
  • Cookpad Summer Intern 2015 - Programming Paradigm

    https://www.microsoft.com/ja-jp/events/decode/2018/ de:code 2018 セッションID: AD19 日の第一人者が語る! C# の現状と今後への展望 「.NET Core 2.x 時代の C#」

    Cookpad Summer Intern 2015 - Programming Paradigm
  • トップページ - nothingcosmos wiki

    2016/05/04 LLVMのビルド方法 2014/04/08 OpenJDKのビルド方法 2014/02/23 作成したスライド 2014/02/22 JVM(HotSpot) VS. Dart VM 2014/02/16 RevisionLog32000台 DartVMのリビジョンログ 2014/01/11 RevisionLog31000台 2013/12/23 RevisionLog30000台 LLVMとの連携方法 2013/12/09 LLVMに関して LLVMのデバッグ方法 SSA形式 2013/11/10 RevisionLog29000台 2013/10/21 JITコンパイラ メニュー 自動並列化 ベクトル化 GCCに関して 2013/10/20 RevisionLog28000台 2013/09/28 RevisionLog27000台

  • コンパイラの構造を解説 | Shinta's Site

    はじめに 久しぶりに Aho氏, Sethi氏, Ullman氏の書いた Compilers(レッド・ドラゴン・ブック)という書籍を目にしたので、昔、コンパイラを作った時の事を思い出しながらコンパイラについてまとめてみました。 Translator (翻訳) Translatorとは、一つのプログラミング言語(Source Language: 原始言語)で書かれたプログラムを入力として取り、別の言語(Object Language or Target Language: 目的言語)のプログラムとしてつくり出すプログラムです。 原始言語が FORTRAN, C, Pascal などの高水準言語で、目的言語がアセンブリ言語や機械語といったような低水準言語である時、そのような Translator をコンパイラ(Compiler) と呼びます。また、原始言語がアセンブリ言語で目的言語が機械語であ

  • 関数型プログラミング言語の定義&実装の仕方の例 - Qiita

    前置き:何となく成り行きで何か書かないと心苦しいので、殴り書きレベル & 文才がなくてつまらない & 関数型言語の授業等を受けたことがある方にはものすごく当たり前の教科書的内容ですみませんが、取り急ぎ自分が容易に書けることを書きます。(この記事に直接の関係がある)質問があれば、(すぐに反応できない場合もあると思いますが)なるべく答えます。誤植などの指摘も助かります。 さて、プログラマならば誰しも一度は「オレオレ・オリジナル・プログラミング言語を作りたい」という欲求を抱きますよね。(抱きますよね?) そのとき、文字列レベルの文法(具象構文(concrete syntax)と言います)はわりと誰でも(?)考えられますが、それが木構造レベルでどういう風に表されて(抽象構文(abstract syntax)と言います)、どう動作するのか(操作的意味論(operational semantics)と

    関数型プログラミング言語の定義&実装の仕方の例 - Qiita
  • Ruby開発者・まつもとゆきひろ氏の新言語「Streem」のソースコードを読んでみよう! ~ 文法と構造を規定する「lex.l」と「parse.y」

    まつもとさん自身によるStreemについての解説は、今後日経Linuxで順次掲載されるようです。まつもとさんがStreemについて解説する内容は、おそらく、プログラミング言語設計に関する高レベルなものとなるのではないでしょうか。 記事はそれとは無関係に、2015年1月に公開されているStreemについての低レベルな解説、つまり現時点のStreemのソースファイル(の一部)の読み解き方を示します。具体的には、GitHubのStreemリポジトリにある「lex.l」と「parse.y」という2つのソースファイルについて解説します。 Streemのソースファイルは、https://github.com/matz/streemからダウンロードできます。画面右下にある[Download ZIP]ボタンをクリックしてください。 lex.lとparse.y ダウンロードしたStreemソースファイルの

    Ruby開発者・まつもとゆきひろ氏の新言語「Streem」のソースコードを読んでみよう! ~ 文法と構造を規定する「lex.l」と「parse.y」
  • [VM][JIT]Brainf*ckで学ぶスクリプト言語処理系高速化。インタプリタ→VMインタプリタ→JITコンパイラ。 - hogelogの日記

    スクリプト言語処理系を高速化したくてしたくてたまらない少年少女に届け。表題の通りスクリプト言語処理系の高速化について書きます。対象言語はBrainf*ckにします。Brainf*ckというのは Brainf*ck Brainfuck - Wikipedia というような言語です。要は処理系を実装するのが簡単なおもちゃ言語。おもちゃ言語ゆえに他のどんな実用的スクリプト言語処理系にも出てくるような基的な処理だけでできているので、Brainf*ck処理系の高速化で有用なテクニックは他の処理系でもうんたらかんたら。 じゃあまず叩き台になるような処理系を書いてみましょう。言語はC++です。JavaだのPythonだので高速な処理系を記述するテクニックやらなんやらというのもありますけども、まずはごく簡単にCPUやらメモリといったものと仲の良い言語で記述することで理解を深めましょう。当はC言語の方が

    [VM][JIT]Brainf*ckで学ぶスクリプト言語処理系高速化。インタプリタ→VMインタプリタ→JITコンパイラ。 - hogelogの日記
    tsuwatch
    tsuwatch 2015/01/07
    いいの見つけた
  • PHPを高速化するRecki-CTとは一体何なのか - hnwの日記

    @ircmaxellさん作の「Recki-CT」を試してみたので紹介します。作者によるブログ記事「ircmaxell's blog: Introducing Recki-CT」によれば処理によってはHHVMやHippy VMより速いらしいのですが、この記事だけでは詳細がよくわからずモヤモヤしていました。今回ソースコードまで確認してみて、前作のPHPPHPを超える変態作品だとわかりました(参照:「PHPPHPがド変態であることに今さら気づいた」)。 Recki-CTを試してみる Recki-CTの概要を説明すると、既存のPHP関数に型情報のアノテーションを記述して呼び出し方を少し変えることで、その関数をJITコンパイルしてネイティブコードとして実行するPHPライブラリです。JITコンパイルにはlibjitPHPバインディングであるJIT-Fuを利用しています。 では、さっそく試してみましょ

    PHPを高速化するRecki-CTとは一体何なのか - hnwの日記
    tsuwatch
    tsuwatch 2014/12/31
    へ、へんたいだー
  • yacc入門

    このページでは、yaccの実践的な入門講座を目指します。 YACC(Yet Another Compiler Compiler)は、コンパイラの開発を手助けしてくれるソフトウェアです。BNF(Backus-Naur Form)という形式で文法を記述すると、構文解析のためのプログラムを自動生成してくれます。つまり、YACCは構文解析の自動化ツールです。 YACCの入力は、YACC文法ファイル(拡張子は通常.y)で、この中にはBNFで書かれた構文ルールと、C言語で記述された各構文毎の処理(セマンティック・アクション)が書かれています。 YACCは、YACC文法ファイルを読みこみ、C言語のソースを出力します。 したがって、YACCを習得するためには、BNFの書き方と、C言語を知っていることが前提となります。 YACCの種類とインストール kmyaccについて bisonについて YACCを使って

  • Golangでインタプリタ作ってみた - Qiita

    突然ですが、先日行われた学生向けのコンテストにおいてGolang製インタプリタ(Copal)で参戦しました。 当日の発表では、Gopher君でなんとか笑いを取ることが出来たので、Gopher君に感謝です。 質疑応答で色々と言われるかなと覚悟してましたが、無難な質問で助かりましたw。 後ほどTwitterを少し拝見すると「Golangのラッピング」じゃない?と思われた方もいました。 はい、そのとおりです。 開発期間がアレなんで、現状が精一杯でGolangと差別化する機能を搭載できませんでした。 あと、テストコード・ベンチマークも1行も書いてないという出来なので、正直恥ずかしいです。 (想定はしていましたが、質疑応答でここらへん聞かれなくてよかった…。) さて、前置きはここまでにして、Golang歴半年+αの私が大学のテスト期間の空き時間を使って2,3週間ほどで作ってみたインタプリタをちょっと

    Golangでインタプリタ作ってみた - Qiita
  • 講義資料 - PukiWiki

    講義資料 † 注: 直したつもりではありますが去年からの更新のし忘れで,python.logos.ic.i.u-tokyo.ac.jp というサーバ名が,ときどき marten.logos.ic.i.u-tokyo.ac.jp となっていることが有るかもしれません(もうないつもり).marten はすべからく pythonと読み替えてください ここには、講義のスライドや配布資料がアップされます。 ↑ テストデータ, reference情報など † 10/30 mini-Python文法 grammar.txt 10/30 字句解析器テストデータ tokenizer_test.tar.gz 11/14 構文木ヘッダsyntree.h.txt 11/14 構文木Cソースの一部syntree.c.txt 11/14 構文解析木ヘッダparser.h.txt 11/14 構文解析木Cソース一部al

  • Goで言語処理系(の途中まで)を作ろう

    38. Ragelの書きかた # ---- Literal ---string = ("'" . (any - "'")* . "'") |('"' . (any - '"')* . '"'); integer = digit+; atom = (alpha (alpha | digit)* ); # ---- Operator ---operator = "+" | "-" | "*" | "/"; main := |* atom => { material := Ore{ Token: ATOM, Value: data[ts:te], } material.Research() ores = append(ores, material) }; String => { material := Ore{ Token: STRING, Value: data[ts:te], } mater

    Goで言語処理系(の途中まで)を作ろう
  • goyaccを使う - Qiita

    goにはコンパイラ以外にもいくつか便利なツールがついてきていて、goyaccもその一つだ。yaccはパーサージェネレータで、プログラミング言語みたいな言語を読み取るためのプログラムを生成してくれる。goyaccはそのGo言語バージョンとなっている。 この文章では、簡単な言語を処理するプログラムを作りながら、goyaccを用いた構文解析の方法について説明する。 プログラム全体はdraftcode/goyacc_sampleで参照できる。文章中では抜粋しか載せないので、足りない部分はこちらをみて補って欲しい。 生成する言語 実際に字句解析器や構文解析器を作りながら説明するため、簡単な計算機のようなものを作ることにしよう。作る言語は次のような構文を持つ言語だ。 字句解析器 字句解析器は、文字列としてのソースコードからトークン列としてのソースコードへ変換するプログラムだ。 プログラムのソースコード

    goyaccを使う - Qiita
  • プログラミング言語処理

    プログラミング言語処理 講義資料 一覧 全講義資料 pdf版(version 1.1, 108ページ)は、 こちら 言語処理系とは インタプリタとコンパイラ 言語処理系の基構成 例題:式の評価 BNFと構文木 解釈実行:インタプリター コンパイラとは ソースコード 字句解析の基礎:正規表現によるパターンマッチ 字句解析と正規表現 自動字句解析生成プログラム:lex 数式の構文解析:top-down parserの作り方 構文規則 top-down parser の作り方 構文解析の基礎 top-down parserとbottom-up parser 上向き構文解析と還元 演算子順位構文解析法 LR構文解析法 構文解析生成プログラムyacc tiny Cについて tiny Cの言語仕様 tiny Cの文法 ソースコード tiny C 処理系のデータ構造 構文木(AST)のデータ構造 AS

  • 1