Go言語における実行ファイルの生成について


Go言語で、標準入力から文字列を受け取り、その文字列を標準出力に出力する実行ファイルを生成するプログラムを作る、といったようなことは可能でしょうか？  
また、可能ならばどのような方法ありますか？

Go言語で簡単なコンパイラを作ってみたいと思っているのですが、プログラムから動的に実行ファイルを生成する方法がよくわかりません。  
よろしくお願いします。

> 6/24 8:48 コメントで指摘頂いた点を修正しました。




> Go言語で簡単なコンパイラを作ってみたいと思っているのですが、プログラムから動的に実行ファイルを生成する方法がよくわかりません。
>
>
> [コメント引用](https://ja.stackoverflow.com/questions/11681/#comment10862_11681)：Linux上でネイティブ動作するものを考えています。

Go言語でコンパイラを作ることは可能です。Linux上でネイティブ動作する実行ファイルを直接生成したいならば、まずは[ELF(Executable and
Linkable
Format)](https://ja.wikipedia.org/wiki/Executable_and_Linkable_Format)ヘッダを出力し、つづいて対象アーキテクチャに応じた機械語コード列を出力することになります。

>
> [コメント引用](https://ja.stackoverflow.com/questions/11681/#comment10862_11681)：Goで実行ファイル形式のバイナリファイルを出力する方法は、byteを1つずつ手作業で指定して出力するしかないのでしょうか。

はい。実行ファイル形式のbyteを出力していくことは、（広義の）コンパイラにおける主要機能そのものです。

とはいえ実際のコンパイラ・ツールチェインでは、単一プログラムで全ての処理を担当するのではなく、その処理フェーズに応じて役割分担を行うのが一般的です。

  * ソースコードからの 字句解析、構文解析、意味解析 あたりまではフロントエンド部と呼ばれます。抽象構文木はこれらの過程の出力となります。
  * 続く コード最適化、コード生成 あたりがバックエンド部と呼ばれます。コード生成部では、対象アーキテクチャ専用のものがそれぞれ必要となります。

バックエンド部を自作する場合は、少なくとも、対象CPUアーキテクチャでアセンブラ・プログラミングが出来る程度の知識は必須です。そこまで自作するのが困難ならば、[LLVMの中間表現(IR)](http://llvm.org/)などの既存のコンパイラ・インフラストラクチャ活用をおすすめします。

