go2bfという、Go言語(のサブセット)のソースコードをBrainfuckにコンパイルするコンパイラを作りました。 Goで書かれたソースコードをBrainfuckにコンパイルし、組み込みのインタプリタで実行できます。 Brainfuckはたった8つの命令しか持たないプログラミング言語です。 go2bfは、Go言語の制御構文、関数、再帰、配列、構造体、ポインタといった機能をBrainfuckにコンパイルし、内蔵しているインタープリタで実行します。 github.com Brainfuckの難しさの本質は、ランダムアクセスがないことにあります。 配列アクセスのように、実行時に決定するメモリー位置の値を読み取る仕組みも自分で作らないといけません。 この制約のもとで、配列はもちろん、関数呼び出しのスタックフレームを実現する必要があります。 スタックはガード、値、ゼロの三つのセルを一つのメモリーの
mattn 大学卒業後、ソフトウェアハウスやSIerなどでソフトウェア開発に携わる。vi派生のテキストエディタVimの日本語化やプラグイン、Go言語などでOSS(オープンソースソフトウェア)の開発・コミュニティ運営に参加し、2019年からGoogle Developers Expert。2021〜2023年 GitHub Stars。著書に『みんなのGo言語』(2016年、2019年に改訂2版、技術評論社、共著)、『Go 言語プログラミングエッセンス』(2023年、2025年に改訂新版、技術評論社、単著)がある。関西在住。 X:@mattn_jp GitHub プログラミング言語の学習において、チュートリアルや書籍で基本文法を押さえたあと、「手を動かして何かを作る」というのはよくあるステップです。しかし、基礎を終えたばかりのエンジニアにとって「何をつくればその言語の特性を深く理解できるのか
はじめに 過去に Vercel に Go サーバーを無料でデプロイできるという記事を書きました。 待望(?) の新シリーズです。 ついに新たなサービスを見つけました。 WebAssembly(Wasm) コンポーネントを使用した Spin というフレームワークがデプロイできる Fermyon Cloud です! 今回は Spin というフレームワークを使って Fermyon Cloud に Go サーバーをデプロイするまでの流れを簡単にご紹介します。 ちなみに、「Wasm を使えば」と記載していますが Wasm の知識はほぼ不要です。 Go が書ければ問題ないです。 Wasm とは Mozilla にドキュメントがあるので以下をご参考いただければと思います。 また、最近 syumai さんが Go の WebAssembly に関して解説くださっていたのでこちらをご参考いただくのもよいかと
古いGoのコードが腐ったという話を聞いて、状況はよく分かりませんが、そんなことは基本ないので安心して欲しいという話を書きます。 2行まとめ 一般的なアプリケーション(cgoやHTTPやgoroutineの細かい挙動に依存していない限り)であればGoは古いコードでも動くはず ただし依存先のコードが消えていたり、非互換な変更が入っていたら動かなくなるので、動かしたいならvendorディレクトリ以下にソースコードを入れて完全固定するべき Goは非常に互換性が高い言語 Goはversion 1のリリース以降、互換性を維持しており、コードが動かなくなることは基本的にありません。 実はGo 1.22で初めて非互換な変更(forループの変数を毎回生成する変更)が入りましたが、これにより問題が出るのは、もともとバグがあったコードである可能性が極めて高いです(少なくともGoogle社内で見つかった非互換なコ
こんにちは、チェシャ猫です。 今回、技術書典 16 にて、新刊『モデル検査器をつくる〜Goで実装して学ぶ形式手法〜』を頒布します。 techbookfest.org どんな本? ただツールを使うだけの形式手法から、君の手でつくる形式手法へ。Go 言語でモデル検査器を実装しながら学ぼう! 書名の通り、Go でモデル検査器を実装する本です。Pramo 言語と名づけた本書オリジナルのモデリング言語を定義し、その可視化器と検査器を作成します。 Pramo 言語は、ある種のマルチスレッドをサポートするプログラミング言語であり、Go の埋め込み DSL として記述されます。例えば有名な「食事する哲学者」は以下のように実装されます。 func badPhilosopher(name procName, right, left lockName, hold varName) process { retur
はじめに 弊社にはGoで作ったシステムが存在しますが、作られてから数年が経過して、メンテナンスも十分にできていない状況でした。 そこで、このシステムをリファクタリングして生産性を上げようという結論になりました。 リファクタリングにあたり、Goのままで行くのか、弊社でよく使われているRubyで行くのかを検討してみましたので、その過程を紹介したいと思います。 Rubyでリプレイスしようと思った理由 Goで動いてて言語やライブラリのバージョンアップなどメンテナンスがされてない部分はありますが、 そこを解消すればGoのままで行った方が良いのでは?と思うかもしれません。 しかし、あえてRubyでリプレイスしようと思うに至ったのは以下の点があります。 Rubyの方が開発速度があがりそう Goのリファクタリングをするのに時間がかかりそう Goのリファクタリングと機能追加でコード修正箇所が被るとスケジュー
背景 Ubieでは以下の記事にあるように、一昨年から新しく始めるプロジェクトにはGoとTypeScriptを積極的に採用しています。私は本来プロダクトセキュリティが主な専門領域なのですが、公私ともに普段からGoでツールやサービスの開発をしているため、社内のGo言語の普及をサポートしたりプロダクト開発に参加したりしています。 Go言語で開発したことがある方はご存知かと思いますが、Goは標準パッケージで提供されているエラーハンドリングは最低限の機能しか提供されていません。これは、CLIツールなどではエラーの内容が簡潔に表せてよいのですが、サーバサイドアプリケーションのようにエラーにまつわる情報を詳細に残してあとから調査に利用する、という場面では不向きです。特に本番環境でしか再現しないようなエラーの場合は、いかに関連情報を残せているかが、問題の解決に大きく影響します。 先日も話題になっていました
概要 あるサンプルコードのベンチマークを測定したところ、期待していたよりも18倍速い結果が出力されました。バイナリを調査してみると、メモリ読み出しの命令が1つ増えるだけでこの性能差が生じていました。さらに調査を進めると、ARMアーキテクチャは連続したメモリへの書き込みを1つにマージし、実行を省略する可能性があることがわかりました。そのため、一般的なベンチマークのように複数回の測定結果を平均化するやり方では、正しい速度を測定できていませんでした。 「パフォーマンスを解釈するのにアーキテクチャの理解が不可欠だった事例」として面白かったのでこの記事を書いてみました。Go言語で説明しますが、言語に依存しない話だと思います。 得られた教訓 バイナリを見ても説明できない性能差は、アーキテクチャの理解によって説明できることがある マイクロベンチマークは、何を計測しているのかを理解した上で実施する必要があ
goversion: 1.17.1 goos: darwin goarch: amd64 cpu: Intel(R) Core(TM) i9-9880H CPU @ 2.30GHz BenchmarkEncoder_Generic_Sonic-16 32393 ns/op 402.40 MB/s 11965 B/op 4 allocs/op BenchmarkEncoder_Generic_Sonic_Fast-16 21668 ns/op 601.57 MB/s 10940 B/op 4 allocs/op BenchmarkEncoder_Generic_JsonIter-16 42168 ns/op 309.12 MB/s 14345 B/op 115 allocs/op BenchmarkEncoder_Generic_GoJson-16 65189 ns/op 199.96 MB
// Tac is a small, simple Go program that is an example WASM module for Tarmac. This program will accept a Tarmac // server request, log it, and echo back the payload in reverse. package main import ( "fmt" "github.com/tarmac-project/tarmac/pkg/sdk" ) var tarmac *sdk.Tarmac func main() { var err error // Initialize the Tarmac SDK tarmac, err = sdk.New(sdk.Config{Handler: Handler}) if err != nil {
オンラインイベントで聞かれて、ツイッターにつぶやいたら思った以上に反響があったので、もう少し詳細に書いてみます。 思ったより反響があったまとめ信頼できる暗号ライブラリがある自分が TypeScript より Go のほうが書けるGo の Wasm バイナリサイズを気にする必要がないWebCrypto にない暗号が必要自社の WebRTC SFU において End to End Encryption (E2EE) をブラウザ上で実現するためにはいくつかの壁がありました。 一つは WebCrypto が提供していない暗号を利用したいというものです。 今回 E2EE を実装するにあたり採用した Signal プロトコルでは公開鍵暗号に Curve25519 を採用しています。残念ながら WebCrypto では Curve25519 に対応していません。この時点で「暗号ライブラリをどこからもって
攻撃者は、新種のマルウェアの作成に「風変わりな」プログラミング言語を使うことが増えている。これには、新しくてあまり一般的ではない言語を使うと攻撃の検出を回避し、分析を妨げる効果があるという前提がある。 関連記事 Go言語に注力するDynatrace JavaやPHPからの移行も簡単、改めてGo言語がオススメな理由 関数型言語「Erlang」のススメ──なぜCやJavaではダメなのか? Microsoftがプログラミング言語「Rust」への支援を強化 「Rust」はなぜクラウドネイティブ開発者の間で大人気なのか? BlackBerryのリサーチおよびインテリジェンスチームは、一般的ではない言語のサイバー犯罪分野での利用に注目している。 「マルウェアの作成者は、新しい技術を活用するためにスキルと行動を適応させ、変化する能力で知られている」と話すのは、BlackBerryのエリック・ミラム氏(脅
はじめに がんばって書いた書籍が低評価で少々しょんぼりしているあんどうです。まぁ、つい力が入りすぎて袋小路に思い切り突っ込んだ結果抜けられなくなることってあるよね。あるある。そんなわけで今日はできるだけ力を入れずテンション低めにサクッと行きます。 で、GoのWASM。大道の真ん中をまっすぐに歩まれているみなさんはWASMするときはRustかいっそC/C++をemscriptenでってことになると思いますが、私はしょせん路傍の石の下で低評価が目に入らないように丸まっているダンゴムシ。せっかくだからオレはこのGoでWASMを選ぶぜって感じなんですが、ぶっちゃけあれ、めんどくさいすよね。 あ、ちなみに今回の話は「このめんどくささをまるっと解決!」みたいな気持ちのいい話ではなくて、ただただ「めんどくさいよね」っていうだけの話です。あーめんどくさい。 Rustの場合 まず比較のためにRustの例をあ
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く