Rustで自作言語とコンパイラを作るために必要な知識と実装手法を初心者向けに簡単に説明することを試みました。パーサコンビネータやLLVM関連のライブラリを利用し、Rustで自作言語やコンパイラ作りをやっていきます。
この記事は NTTコムウェア AdventCalendar 2023 5日目の記事です。 自己紹介&動機 高鶴と申します。NTTコムウェア コーポレート革新本部で、プログラム設計~コーディング~ユニットテストにかかわる技術の社内標準化をやっております。 プログラムの静的な解析で早期にバグを発見・修正することで、後工程でのバグ対処コスト削減(ウォーターフォール開発の場合)や、技術的負債の早期解消(アジャイル開発の場合)を目指す、というのが私のチームの仕事の大きな一部となっています。 静的な解析で早期にバグを発見するツールには、オープンソースでも商用でも様々なものがあります。しかし、ソフトウェアの品質をより抜本的に良くしていこうと思うと、「プログラミング言語を何とかする」というところを考えたくなってきます。 Rustであれば、そのような期待に応えてくれるのではないかと期待し、調査・検証を始めま
Liam Tung (Special to ZDNET.com) 翻訳校正: 村上雅章 野崎裕子 2020-08-13 07:30 システムプログラミング言語「Rust」の開発者らは、この言語がLinuxカーネルの開発で利用されるようになる道を模索している。 元Intelのエンジニアで、Rust言語プロジェクトのリードを務めるJosh Triplett氏は、慎重に取り組む限り、そしてLinuxカーネルの生みの親であるLinus Torvalds氏の機嫌を損ねない限り、「カーネル開発にRustを取り入れていく道を探りたい」と考えていると述べた。 Triplett氏は、「Linux Plumbers Conference 2020」でLinuxカーネルツリー内でのRustサポートに関するセッションの開催を提案するという、Linuxカーネルメーリングリストのスレッドの中で、「カーネル内にRust
GNU Assembler互換(サブセット)のアセンブラをGo言語でフルスクラッチで作ってみました。 開発22日目で自作Goコンパイラ(をセルフホストしたときに出力される20万行のアセンブリ)をアセンブルすることに成功しました。 どうやって作ったかというと、小さいコードを GNU Assembler (以下 as) に食わせて出力されたバイナリを観察する、を繰り返して中のロジックを推定し再現しました。as の実装は見ていません。(一瞬見たけど巨大すぎて何もわからなかった) アセンブラ自作は、やってみるとコンパイラ自作よりだいぶ簡単でハマりポイントも少ないので、学習テーマとしてはおすすめです。2箇所ほど難所(命令エンコーディングのルールを理解するのと、ジャンプ命令の最適化)がありましたがそれ以外はさくさく楽しく作れました。 作ってみた結果、アセンブリ言語の理解が深まったのはもちろんのこと、E
国分崇志(@k0kubun)と申します。プログラミング言語Rubyのコミッターとして活動しています。2019年からシリコンバレーで働いており、2022年からShopifyという会社でRubyのJust-In-Time(以下、JIT)コンパイラをフルタイムで開発しています。 長い間趣味でやっていたコンパイラの開発を仕事にしたのは、現職が初めてでした。この記事では、趣味を仕事に変えた経緯や、どのようにして業務経験のない分野にキャリアチェンジしたのかを紹介します。 仕事で分散システム、趣味でコンパイラを書くキャリア 楽しく稼げる仕事を求めてたどり着いたRubyエンジニア 研究で分散システムと言語処理系の両方に興味を持つ 分散ミドルウェアを仕事で、JITコンパイラを趣味のOSS活動で やっぱりコンパイラを仕事にした複合的なきっかけ 働きながら大学院に通い、コンパイラが一番好きなことに気付いた コン
この記事は言語実装 Advent Calendar 2022の23日目の記事です。 導入 2021年、私は llrl という自作プログラミング言語のセルフホスティングに取り組みました。 セルフホスティングには成功し、生成された処理系の実行ファイルのバイナリが完全一致するところまで辿り着きましたが、この言語処理系のバックエンドは「LLVMを使う」で終わっていたので、バックエンドの実装にもっと目を向けたいと思いました。そこで2022年は、この言語処理系に 新たにx86_64を直接ターゲットとするバックエンドを追加し、LLVMを用いずにセルフホスティングできるようにしました。 本記事はこの取り組みの振り返りとなります。 自作プログラミング言語の特徴とバックエンドの要件 llrlには大きな特徴が2つあります。 Hindley-Milnerベースの型推論による静的型付け (+型クラス) Lisp-l
Go Conference Tokyo 2019 Autumnでの発表資料です。
こんにちは、21Bのseasonです。この記事はtraP夏のブログリレー3日目の記事です。 自作Cコンパイラでセルフホスト達成しました。 リポジトリ: https://github.com/season1618/c-compiler/tree/main 自作Cコンパイラでセルフホスト達成しました!!!!!!🎉🎉🎉https://t.co/8fLIAJWksQ pic.twitter.com/2fgH5sKoZ0 — season (@season1618) July 27, 2022 実際にどうやって作るかを書くと長くなるので、ここでは経緯とか完成までの流れとかを書こうと思います。一応開発メモは以下に上げておきました。 開発メモ: https://github.com/season1618/note/blob/main/cs/c-compiler/index.md 経緯 大学の講義で
The Rust team is happy to announce a new version of Rust, 1.61.0. Rust is a programming language empowering everyone to build reliable and efficient software. If you have a previous version of Rust installed via rustup, you can get 1.61.0 with: $ rustup update stable If you don't have it already, you can get rustup from the appropriate page on our website, and check out the detailed release notes
The Rust team is happy to announce a new version of Rust, 1.60.0. Rust is a programming language empowering everyone to build reliable and efficient software. If you have a previous version of Rust installed via rustup, you can get 1.60.0 with: $ rustup update stable If you don't have it already, you can get rustup from the appropriate page on our website, and check out the detailed release notes
本連載のバックナンバー #1: 環境構築 #2: 概要と方針 #3: 大枠づくり #4: 電卓づくり #5: ファイルの分割と単体テスト はじめに 本記事は、 Rust 言語と LLVM を用いてプログラミング言語のコンパイラを作成するチュートリアルの連載第二回です。 前回の記事 では、コンパイラ作成のための環境構築を行いました。 前回の投稿から一ヶ月たってしまい1、そろそろ第二回を投稿しないとまずいかなーという気がしてきたので、今後必要となる用語等の簡単な説明や、本連載で作成するコンパイラの方針について取り急ぎ投稿します。 今回から読み始めた方は、前回の記事を参照して環境構築をおこなうか、 FROM alpine:edge RUN apk add --no-cache llvm8-dev llvm8-static zlib-static libxml2-dev gcc g++ cargo
本連載のバックナンバー #1: 環境構築 #2: 概要と方針 #3: 大枠づくり #4: 電卓づくり #5: ファイルの分割と単体テスト はじめに 普段はお仕事で Kotlin や Java と戯れていますが、実は Rust や C++ が好きな @_53a と申します。 所属会社が技術ブログ代わりの Qiita Organizationを作った、かつ投稿内容は自由ということを聞いたので、私の方からは普段趣味でやっている言語実装の、ほんの触りの部分だけでも記事にして紹介できればと思っています。 本連載では Rust 言語でプログラミング言語のコンパイラを実装することを最終目的とし、本記事ではその初回として環境構築を行います。 本記事では、 Rust 言語に興味がある LLVM の使い方に興味がある プログラミング言語を作ることに興味がある といった読者層を想定し、持っているスキルとして 趣
The Rust team is happy to announce a new version of Rust, 1.57.0. Rust is a programming language empowering everyone to build reliable and efficient software. If you have a previous version of Rust installed via rustup, getting Rust 1.57.0 is as easy as: $ rustup update stable If you don't have it already, you can get rustup from the appropriate page on our website, and check out the detailed rele
Ruby開発チームは、新たなJITコンパイラであるYJITを実験的に搭載したRuby 3.1プレビュー1を公開しました。 Ruby言語は以前から実行速度の向上を重要な改善項目として挙げており、Ruby 2.6では「MJIT」と呼ばれるJITコンパイラを搭載、昨年リリースされたRuby 3.0では目標としていたRuby 2の3倍の性能を達成しています。 参考:Ruby 3.0正式版リリース。「Ruby 2の3倍速」到達、型の記述、スレッドセーフな並列処理など新機能 一方でMJITはその機構上、Railsの大規模アプリケーションなどでの性能向上に十分な効果が発揮できていないとの評価もありました。 今回Ruby 3.1プレビューでマージされたのは、ECサイト構築サービスで知られるShopifyが開発を進めてきた「YJIT」と呼ばれるJITコンパイラです。 YJITは現在のところ20%から40%程
Rustは「学習コストが高い?」「関数型プログラミング言語?」 と思っていた私が、実際にRustに触れてみて得られた知見をまとめました。 プログラミング言語の多くの課題を解決してくれる言語 Rustは「安全性」「速度」「並列性」を考慮して設計されています。 言語セマンティクスを強く定義し(Ownershipやlifetime 後述)、ネットワークコネクションなどのリソース管理全般に関するバグを、コンパイル時に発見してくれることで実現しているといえます。 最初はコンパイルが厳しくて「書いたコードはあってるはず...」 と、陥るほどに暗黙的な印象を感じます。コンパイルの厳格さは、人間が間違えないようにするために、静的に解析できる情報をなるべく多く与え、機械的に検証するためだと考えます。 ひと言でまとめると「コンパイルへの押し付け」です。 安全性に重きをおきながら、zero cost abstr
春の入門祭り🌸の第6弾です はじめにこんにちは、TIG/DXチームの栗田です。もともと宇宙物理を専攻しており、前職では製鉄メーカーでプラントエンジニアをしていました。 最近ではもっぱら工場IoT案件で制御系システムとクラウドをつなぐようなことをしていますが、その前は組み込みマイコンで制御系開発をしていました(人工衛星時代の話)。 IT業界で働き始めると、ソースコードを書いてそれを実行してシステムを動かす、ということを行うことになりますが、その裏で頑張ってくれているのがコンパイラです。普段プログラムを書いていても、「コンパイラ使ったことあるけどその中身までは。。。」「普段Pythonとかで特に意識したことない。」な方もいると思います。 そこで今回は春の入門祭りということで、自分でコンパイラを作ります。ただしコンパイラはコンパイラでも、イチから全部作るのはなかなか大変なので、公開されているコ
半年前から低レイヤーに関する勉強をしている。 その中で読んだ技術書の感想、そしておすすめの読む順番をここにまとめてみる。 OS 30日でできる! OS自作入門 おすすめ度:80(満点100) 一言:自作OSの初心者向け 自作OSでまず初めに候補に挙がるのがこの本。2006年に出版された本ではあるが、OSの根幹を理解するにはとても良い。最初からアセンブリでメモリ操作をがっつり書くため、アセンブリの経験やレジスタ周りの知識が無いと挫折してしまうかも知れない。そこを乗り越えれば楽しくOSを実装していける。 コンピュータシステムの理論と実装 ―モダンなコンピュータの作り方 おすすめ度:95 一言:一からOSを作って学べる本格的な指南書 論理回路と呼ばれるレベルからメモリやCPUを作っていき、アセンブリ言語やアセンブラの開発、そして独自言語とそのコンパイラ、OSまで開発する。CPUなど各要点の考え方
この章では、 C 言語を対象に、 C のソースコードがどのような過程を経てコンパイルされ、実行されるようになるか見ていきます。 利用する言語処理系は、gcc (GNU C Compiler 改め GNU Compiler Collections)です。 この回は、皆さんに情報に触れてもらうのが主旨ですから、 練習問題などはありません。 内容も、詳しい話は全部忘れてもらってもかまいません。 とはいえ、単にファイルを眺めるだけでなく、すこしは実際にコンパイラを動かして試したりして、 馴染んでおいてください。 内容的には、知っている人なら知っているといった話ですから。 C 言語が実行ファイルになるまでの基本的な流れは、授業の方でもならったように C 言語ソースコード (with マクロ) ↓ マクロ展開 C 言語 (マクロ展開済) ↓ コンパイル アセンブリコード ↓ アセンブル オブジェクトコ
なんでこんなのを書いているのか Nimを趣味で使っているのですが、「Nim?なにそれ?」みたいな話を何度もするのが疲れたのでURL投げつければ済むようにしたいからです。 F#を知ってほしいに敬意を。 ※Nim使いの人もマサカリ(というかアドバイス)とかあればください。 ※Nimの概説が面倒なときに参照先として使ってください。 ※medyさんの記事Nimを知ってほしい2022もオススメです。 Nimとは, なぜNimなのか ざっくりと説明すると、 静的型付けで型安全な上にPythonっぽい構文でコード量も少なく済む「効率的、表現力豊か、エレガント」なプログラミング言語です。 コンパイラが優秀すぎて、勝手に最適化して実行バイナリのサイズを小さくしてくれるし速い。 誤解を恐れずに表現するなら「Pythonの皮を被ったC/C++」。 詳細はWikipedia読んだほうがいいです。引用(https:
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く