

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

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

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


CC BY-SA 3.0
2015-06-24T10:42:07.933
11681
2015-08-25T13:03:30.413
2015-06-24T23:45:41.343
8528
8528
question
go
Go言語における実行ファイルの生成について


文字通りに解釈すると下記でしょうか。

UPDATE: 2015-06-25 1:04  
`os.Args[1:]` を使った例を投稿していましたが、標準入力ではない、というご指摘をいただき、修正しました。

Go言語で標準入力から文字列を受け取り、その文字列を標準出力に出力する

[bufio - The Go Programming
Language](http://golang.org/pkg/bufio/#example_Scanner_lines) より転載

[code]

    package main
    
    import (
        "bufio"
        "fmt"
        "os"
    )
    
    func main() {
        scanner := bufio.NewScanner(os.Stdin)
        for scanner.Scan() {
            fmt.Println(scanner.Text()) // Println will add back the final '\n'
        }
        if err := scanner.Err(); err != nil {
            fmt.Fprintln(os.Stderr, "reading standard input:", err)
        }
    }
    
[/code]

実行ファイルを生成する

[code]

    $ go build echo.go
    $ echo Hello World | ./echo
    Hello World
    
    $ ./echo
    Hello World! // <- User input
    Hello World! // <- Response
    
[/code]


CC BY-SA 3.0
2015-06-24T13:31:32.183
11690
2015-06-24T16:11:57.510
2015-06-24T16:11:57.510
7471
7471
11681
answer


> 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/)などの既存のコンパイラ・インフラストラクチャ活用をおすすめします。


CC BY-SA 3.0
2015-08-25T13:03:30.413
14836
2015-08-25T13:03:30.413
2017-04-13T12:52:38.920
-1
49
11681
answer