パスワードを忘れた? アカウント作成
16318 story

OpenBSD が PCC をソースツリーに投入 47

ストーリー by GetSet
gccに慣れきった目にはかなり新鮮かも知れない 部門より

tamo 曰く、

OpenBSD (4.2 の予約受付中) がPCC をソースツリーに入れました。(コミットログ)
OpenBSD は以前から GCC の最適化重視路線に反発を強めていたため、 NetBSD の i386 ユーザスペースをビルド可能 になった Anders Magnusson 版 PCC に飛び付いたようです。 まだバグや未実装機能がありますが、コンパイル速度 (出力コードの速度ではなく) が GCC の数倍ということで、 もしデフォルト cc に採用されれば、開発時間の有効利用につながりそうです。また、GCC とは違うエラーチェックにより、 既にコード品質の改善に役立っています。
なお、PCC と言えば 4.3BSD 時代には "The Compiler" だったようで、 ちょっとした歴史のあるコンパイラです。 言語依存部分と非依存部分が分離されているため、他言語への拡張も可能のようです。

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
  • 本音は…? (スコア:3, 興味深い)

    by Anonymous Coward on 2007年09月17日 20時42分 (#1220665)
    GPLv3から逃げたくて、GNU品を出来る限り撤去していこうとしてるだけじゃないのかなぁ
  • 関連コメント (スコア:3, 参考になる)

    by Anonymous Coward on 2007年09月17日 21時54分 (#1220689)
    PCC復活 [srad.jp] - NetBSD/pdp10 [srad.jp]
    そこに転載されてるメーリングリストのログその1 [netbsd.org]と その2 [netbsd.org]も、 Anders Magnusson 氏のものです。

    pkgsrc にも入ってます [netbsd.org]。

  • by Anonymous Coward on 2007年09月18日 2時11分 (#1220758)
    コンパイル時間と開発時間の相関関係はほとんど無いんじゃないかな?

    コンパイル時間が問題になるのは、何度もコンパイルする人だけだと思うんですよね。
    そういう人はちょっと書き換えてコンパイル。またちょっと書き換えてコンパイルと
    やってます。

    開発時間が短い人は、プログラムをきちんと考えて作っています。ちょっと書き換えて
    コンパイルとかやってません。

    私は開発時間が短い人間ではないのですが、手が不自由な方を知っているのですが、
    その方は、上記のような何度もコンパイルという作業をやってなくて、きちんと考
    えて作られているようでして、一般の健常者の方より開発時間が断然速いです。
    • by Anonymous Coward on 2007年09月18日 3時22分 (#1220772)
      コードの移植性が上がることでは?
      # 真っ先に採用したのがNetBSDの人たちというのもそのセンでしょ
      # コンパイルが速いのは「オマケの長所」というか

      もともと、移植性と最適化はトレードオフなところがあるから、選択肢が広がったのは単純にプラスだと思う。
      親コメント
    • by Anonymous Coward on 2007年09月18日 5時22分 (#1220782)
      問題はコンパイル時間に開発時間が大きく律速されるか否かなわけで、
      ビルドなんかバックグラウンドで常に回してて自動的にテストスィート動かしてるプロジェクトなら
      コンパイルの間ぼーっとしているなんてことはないし、そうではなくてあなたの言うようにコンパイルと
      編集を繰り返すスタイルの開発ならコンパイル回数を減らすように条件反射的なデバッグをやめて
      熟考しながらコードを書けばいいのです。

      その事実に健常者と肢体不自由者との差なんてないのでは?
      人差し指だけでぱちぱちキーボードを打つというスタイルの人もいるし、
      タッチタイピングの速度と関連付けて議論するのは不毛では?
      親コメント
    • by Anonymous Coward on 2007年09月18日 11時37分 (#1220874)
      OpenBSD や NetBSD だと、変なアーキテクチャにも色々移植されてる訳で、
      その中には最新の i386 なんかより圧倒的に遅いものもザラにあって、そういう
      奴でユーザランドやports/pkgsrc パッケージをセルフコンパイルさせるとなると
      コンパイル時間が問題になってきますね

      カーネルやデバドラなんかだと、コンパイルして差し替えてリブートしてみて、
      あいや、また駄目か、とかやってるのはふつーだし
      親コメント
    • 言ってることは有る意味正しいけど、カーネル開発だからな。
      ナイトリービルドとか有るじゃん。
      業務アプリみたいな事言ってるんじゃねーよ
  • by t-nissie (8647) on 2007年09月18日 6時23分 (#1220791) ホームページ 日記
    http://www.ludd.ltu.se/~ragge/pcc/ から pcc-current.tgz を取ってきて
    ./configure && make したら、途中で止まっちゃった。
    gcc 4.3.0 がいけないのかな。

    $ flex --version
    flex 2.5.33
    $ gcc --version
    gcc (GCC) 4.3.0 20070904 (experimental)
    Copyright (C) 2007 Free Software Foundation, Inc.
    This is free software; see the source for copying conditions. There is NO
    warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

    $ make
        :
    flex scanner.l
    gcc -g -O2 -DCPP_DEBUG -Wall -Wmissing-prototypes -Wstrict-prototypes -Werror -c -o scanner.o lex.yy.c
    cc1: warnings being treated as errors
    lex.yy.c:2127: error: no previous prototype for ‘yyget_lineno’
    lex.yy.c:2170: error: no previous prototype for ‘yyset_lineno’

    f77もあるみたいね。

    --
    love && peace && free_software
    t-nissie
    • それだけなら CFLAGS か CPPFLAGS から -Werror を取ればいけそうです。
      GCC4 は型宣言に厳しいっすね。

      親コメント
      • ありがとうございます。なんとかコンパイルはできました。わからないことだらけですが。

        $ tar zxf pcc-current.tgz
        $ cd pcc-0.9.8
        $ rm -rf `find . -type d -name CVS`
        $ emacs cc/cpp/Makefile.in cc/ccom/Makefile.in os/linux/ccconfig.h   # 下のように編集
        $ ./configure --prefix=/usr/local/pcc
        $ make
        $ make -n install
        $ su
        # mkdir -p /usr/local/pcc/bin
        # mkdir -p /usr/local/pcc/libexec
        # make install

        PCCの作者より上手にMakefileを書いたり、autotoolsを使う自信はあるぞ。。。
        f77はコンパイルされないみたい。

        $ cat hello.c
        /* hello.c */
        int main(void)
        {
                printf("Hello World!\n");
                return 0;
        }
        $ /usr/local/pcc/bin/pcc hello.c
        $ ./a.out
        Hello World!
        $

        #include <stdio.h> は付けるとダメ

        $ diff -u cc/cpp/Makefile.in~ cc/cpp/Makefile.in
        --- cc/cpp/Makefile.in~ 2007-01-02 14:49:40.000000000 -0500
        +++ cc/cpp/Makefile.in  2007-09-17 20:57:43.000000000 -0400
        @@ -2,7 +2,7 @@
        #
        # Makefile.in for cpp
        #
        -XFL=-DCPP_DEBUG -Wall -Wmissing-prototypes -Wstrict-prototypes -Werror
        +XFL=-DCPP_DEBUG -Wall -Wstrict-prototypes -Werror

        prefix = @prefix@
        exec_prefix = @exec_prefix@

        $ diff -u cc/ccom/Makefile.in~ cc/ccom/Makefile.in
        --- cc/ccom/Makefile.in~        2005-05-14 10:08:01.000000000 -0400
        +++ cc/ccom/Makefile.in 2007-09-17 20:57:24.000000000 -0400
        @@ -3,7 +3,7 @@
        # Makefile.in for ccom
        #
        XFL=-DPCC_DEBUG -DGCC_COMPAT \
        -       -Wall -Wmissing-prototypes -Wstrict-prototypes -Werror
        +       -Wall -Wstrict-prototypes

        CC = @CC@
        CFLAGS = @CFLAGS@ $(XFL) -I. -I${MIPDIR} -I$(MDIR) -Dmach_${TARGMACH} \

        $ diff -u os/linux/ccconfig.h~ os/linux/ccconfig.h
        --- os/linux/ccconfig.h~        2007-03-10 03:14:44.000000000 -0500
        +++ os/linux/ccconfig.h 2007-09-17 21:29:56.000000000 -0400
        @@ -32,12 +32,12 @@
          */

        /* common cpp predefines */
        -#define        CPPADD  { "-D__linux__", "-D__ELF__", "-I" INCLUDEDIR "/pcc", NULL, }
        +#define        CPPADD  { "-D__linux__", "-D__ELF__", "-I" INCLUDEDIR "/usr/lib/gcc/i686-pc-linux-gnu/4.3.0/include", NULL, }   ???必要???
        #define        DYNLINKER { "-dynamic-linker", "/lib/ld-linux.so.2", NULL }
        #define CRT0FILE "/usr/lib/crt1.o"
        -#define STARTFILES { "/usr/lib/crti.o", "/usr/lib/gcc/i586-suse-linux/4.1.0/crtbegin.o", NULL }
        +#define STARTFILES { "/usr/lib/crti.o", "/usr/lib/gcc/i686-pc-linux-gnu/4.3.0/crtbegin.o", NULL }
        #define        LIBCLIBS { "-lc", "-lgcc_s", NULL }
        -#define        ENDFILES { "/usr/lib/gcc/i586-suse-linux/4.1.0/crtend.o", "/usr/lib/crtn.o", NULL }
        +#define        ENDFILES { "/usr/lib/gcc/i686-pc-linux-gnu/4.3.0/crtend.o", "/usr/lib/crtn.o", NULL }
        #define STARTLABEL "_start"

        #if defined(mach_x86)
        --
        love && peace && free_software
        t-nissie
        親コメント
        • by taka2 (14791) on 2007年09月18日 14時47分 (#1220935) ホームページ 日記
          pcc のコンパイルって一回きりなんでしょうか?

          gcc をコンパイルするときって、元々あるコンパイラを信用していないというか
          stage1: 古いコンパイラで gcc をコンパイル→gccバイナリそのものは古いコンパイラが出力してるので、あてにしたくない
          stage2: stage1で出来たgccで、gccをコンパイル→古いコンパイラが出したgccの出力なので、もしかしたらバグってるかも
          stage3: stage2で出来たgccで、gccをコンパイル→stage2とstage3の出力を比較してバイナリが一致していれば安心
          って流れで、「gccで自身をセルフコンパイル」しますよね。「cc は最適化がとろいし、たまにバグってるので当てにしたくない」って感じでしたっけ。

          今時のgccは最適化を強くすると挙動が怪しいとかよく聞きますし、最適化無しのgccは結構遅いコードを吐き出しますから、
          gccの最適化無しでpccを作った後、pccで最適化オプションつけてpcc自身をセルフコンパイルぐらいはしてもいいんじゃないかなとか思ってしまいます。
          親コメント
          • Linuxの/usr/includeなどに入っているヘッダファイルがpccにとっては不正らしく、
            ふつうのプログラムもうまくコンパイルできません。どっかからヘッダファイル
            ひとそろいをダウンロードしてくるのでしょうか。

            os/linux/ccconfig.hのCPPADDは
            #define CPPADD { "-D__linux__", "-D__ELF__", "-I" INCLUDEDIR "/pcc", NULL, }
            だと、-I$PREFIX/include/pcc になるみたいです。

            --
            love && peace && free_software
            t-nissie
            親コメント
          • > って流れで、「gccで自身をセルフコンパイル」しますよね。「cc は最適化がとろいし、たまにバグってるので当てにしたくない」って感じでしたっけ。

            「ドッグフードを食べる」的な意味合いもあるかもしれません。あと、問題が起きたときに、原因を絞ることができそう。

            それに、「自分自身をコンパイルできるようになる」のは漢のロマンですし。
  • by goji (949) on 2007年09月18日 9時17分 (#1220815) ホームページ 日記
    初期の版を動かしてみることを勧める。
    そして出てきたアセンブリも読んでみる。
    自分の使っているアーキテクチャに合わせて改造して、出力されたコードを動かしてみる。
    ベンチマークを走らせて、ピープホールのオプチマイズを追加してみたり。
    gccなどは読むのもいじるのも大変ですからね。 半年くらい楽しめる。(人によっては一生?)
  • The Compiler? (スコア:2, 参考になる)

    by saitoh (10803) on 2007年09月18日 11時40分 (#1220875)
    たれ込み文には 4.3BSDと書いてあるし,リンク先のwikipediaには4.3BSD-Renoと書いてある.

    でも,4.2BSDにはすでにpccが載ってたのは記憶している. Unix Programmer's Manual, 7th editionにすでにpccが載ってるんだから,UNIX V7以降ずっと4.3BSD-renoまで使われてたんじゃないのかなぁ.

    • Re:The Compiler? (スコア:2, 興味深い)

      by Anonymous Coward on 2007年09月18日 13時20分 (#1220911)

      日本語版 [wikipedia.org]では

      異なるアーキテクチャ用のコードを出力することが容易なコンパイラの先駆けであり、1980 年代初期には多くの C コンパイラが pcc をもとにしていた [2]。 1990 年の 4.3BSD-Reno に含まれてから、4.4BSD で GNU C コンパイラに取って代わられるまで、長く標準コンパイラとして君臨していた。
      となっている文章が、Wikipedia英語版 [wikipedia.org]では
      It was very influential at its time as one of the first compilers that could easily be adapted to output code for different computer architectures.In the beginning of the 1980s, the majority of C compilers were based on pcc [4], and the compiler had a long life span, shipping with 4.3BSD-Reno in 1990 until the GNU C compiler replaced it in 4.4BSD.
      と、文の区切りが変わってる。

      後半部分は「主要なCコンパイラのベースとなっていた1980年代初期から1990年リリースの4.3BSD-Reno(が、GCCが標準になった4.4BSDに置き換わる)までの長い間」と訳さなくちゃいけないんじゃないのかな。

      親コメント
  • 末端には (スコア:1, 興味深い)

    by Anonymous Coward on 2007年09月17日 19時51分 (#1220643)
    いわゆるデスクトップ用途で使っているような末端ユーザーにとっては最適化されたバイナリのほうがよいのかな、と思ってしまうのですが、どうなんでしょ。

    #BSD使ってないのでAC
    • Re:末端には (スコア:4, 興味深い)

      by Anonymous Coward on 2007年09月17日 20時27分 (#1220656)
      > 末端ユーザーにとっては最適化されたバイナリのほうがよい

      その GCC の最適化が時々バグっていたりして怖いよね、というのがセキュリティ命な OpenBSD の立場なんでしょう。
      親コメント
    • Re:末端には (スコア:1, すばらしい洞察)

      by Anonymous Coward on 2007年09月17日 20時21分 (#1220655)
      そう思う人は gcc なりでコンパイルすればよいだけでは。
      タレコミで言及されてるのは開発者のメリットですし。
      親コメント
      • by Anonymous Coward on 2007年09月18日 16時07分 (#1220952)
        「バイナリパッケージしか使わない」ユーザーや「コンパイルはたまにするけどmakeコマンド打ち込むだけ」なユーザーが「ソフトの実行速度が遅くなったら嫌だな」とか「リンクで問題が出たら嫌だな」などと考えるのは自然といえば自然だね。
        # ぐぐってみたら、ICCがGCCアプリとのリンクを公式サポートしたのが2003年末 [xlsoft.com]らしい。
        親コメント
    • by Anonymous Coward
      PCCで開発を進めて、さいごにGCCで固めるという使い方はできないものか。
      • by Anonymous Coward
        非互換性についてレポートしていただけると、完全にひとばしら~になれます。先着∞名さま

        安全な使い方だと思うのですが、手間の問題は最大の障壁?
typodupeerror

アレゲはアレゲ以上のなにものでもなさげ -- アレゲ研究家

読み込み中...