「コンパイラ・スクリ ..
545:デフォルトの名無しさん
04/02/29 21:42
allocaってどうやって実装してるの?
引数に渡す値って可変なんでしょ?
後付けでadd esp, nとかわかんの?
ソース嫁とかなしでおながいします。
サムイので
546:デフォルトの名無しさん
04/02/29 21:56
ソース嫁
547:デフォルトの名無しさん
04/02/29 22:07
サム・・・
548:デフォルトの名無しさん
04/02/29 22:11
gccだとbuiltin_allocaでinline風の処理。
549:デフォルトの名無しさん
04/02/29 22:25
どうやっても何もねーし
スタックポインタ動かす→そのアドレス返す、で終わりだろ
550:デフォルトの名無しさん
04/02/29 22:40
これだからソース嫁ない香具師は・・・・
551:デフォルトの名無しさん
04/02/29 22:54
>>545
allocaはコンパイラの組み込み関数です。
コンパイラの生成するコードが読み切れる―例えばauto変数の参照にはフレー
ムポインタのみを使い、SPは関数出口でsp <- fpのように設定して元に戻すま
で参照しない―なら、後付けで実装もできます。
でも最適化のレベルの高いコンパイラでは危険ですね。
552:デフォルトの名無しさん
04/03/01 20:45
ahhoca()
553:デフォルトの名無しさん
04/03/01 20:46
>>548
ahoca?
554:デフォルトの名無しさん
04/03/01 20:50
assoca!
555:デフォルトの名無しさん
04/03/01 20:55
>>554
asoccaじゃねーの?
556:デフォルトの名無しさん
04/03/01 23:05
alloca(n)を
sub esp, n
mov eax, esp
に展開してやればいいの?
最後に
mov esp, ebp
pop ebp
する関数なら大丈夫ってこと?
557:デフォルトの名無しさん
04/03/02 00:53
>>556
それだと危険だね。Win32だと単純にスタックポインタをいじるだけだと、
2ページ以上境界をまたいだ時に例外飛ぶよ。
他のOSは実験してないからしらん。
確か1ページずつ動かしてくコードになってたはず>_alloca()
隣のページを触った時に初めてメモリ確保するんだっけな?
558:デフォルトの名無しさん
04/03/02 18:56
>>557
え、ページなんて概念があったんですか。
ちなみに1ページって何バイトでしょうか?
その辺の情報で何か適当なWebリソースってありますでしょうか。
そういえば、自作の処理系でスタックから配列を確保すると、
16000バイト付近でおかしなことになるんですが、これも
ページと関係ありですか?
コンパイラ側でスタックサイズを確保するだけじゃだめなのか。
559:デフォルトの名無しさん
04/03/02 19:25
ごめん、ググったらx86の1ページは4kてわかりました。
今ためしにVC6で大きい配列確保するテストしてみたら、
ある大きさになったら密かに__chkstkっていうのを呼んでる。
ちょうど4kバイトを境に。
まいったなあこれ。
全く知らなかった。
560:デフォルトの名無しさん
04/03/02 19:37
つまり4kを超える固定配列をスタックに確保する場合は、
sub esp, 4096
の代わりに、
mov eax, 4096
call __chkstk
に書き換えなくてはいけないわけだ。
やだなあこれ・・
allocaだと+余分を計算しないといけない?
無条件で_chkstk呼べばいいのかな。
561:デフォルトの名無しさん
04/03/02 19:39
でもこれでスタック確保でおかしくなる原因がすっきりわかりました。
ありがとうございました。>557
562:558
04/03/03 02:41
いまどきのOSはスタックの割り当ては動的だからね。
最小限のサイズのみを割り当てて、スタックの次のページを
さわった瞬間にメモリ未割り当てのページフォルトが発生して、
そのタイミングで実際の仮想メモリを割り当てる実装になってる。
で、そのページフォルトを判定するのが隣接ページのみってこと。
フレーム割り当てのタイミングでサイズが決まってるのなら、
sub esp, 4096; sub esp, 4096; sub esp, 200
みたいな感じで展開しちゃってもいいと思うよ。
563:デフォルトの名無しさん
04/03/03 05:37
>>562
espの値を変えただけでは、ページを触ったことにはならないと思うが。
564:デフォルトの名無しさん
04/03/03 06:15
つーかさー、いい加減ソース見ろよ。
ページ処理をどーすればいいのかとかもわかるし。
565:デフォルトの名無しさん
04/03/03 07:36
>>558
ところで、自作の処理系ってアクティブ何とか?
566:デフォルトの名無しさん
04/03/03 12:21
やっぱりMacOSXみたいにスタックもallocしたほうが分り易いよな
567:デフォルトの名無しさん
04/03/03 18:12
>>562
名前557の間違いですか?
ちなみにCRTの_chkstkを呼ぶ様にして解決しました。
おかげで既知のバグがすべて潰せました。
>>564
557氏みたいなヒントがないとソースみてもわかんなかったよ。
>>565
アクティブ何とかの話はよくわかりませんが、
目標はネイティブ実行できるLISPっぽいCみたいな感です。
568:デフォルトの名無しさん
04/03/04 23:56
どーでもいいけど、
スタックとるahhocaって制限多すぎでない?
大きな自動変数は、普通process即氏けどな。
569:557
04/03/05 01:12
>>563
IA-32(+Win32?)の場合だとesp、ebpは明示的に参照しなくても
ポインタが指し示すだけでAccess Violation飛んだはず。
かなり前の記憶なんで確証ないけど・・・
>>568
用途が違う。大きなサイズが必要ならHeapを使えばいい。
関数が呼び出されるまで厳密なサイズはわからないが、
スタック食いつぶすほどのサイズにはなりえない場合とか、
シグナルハンドラから突如longjmp()されようが、絶対に
メモリリークしたくない場合などに使える。
570:デフォルトの名無しさん
04/03/05 19:07
>>569
> かなり前の記憶なんで確証ないけど・・・
明らかに記憶違い。
$ uname -ms
CYGWIN_NT-5.0 i686
$ cat a.c
#include <stdio.h>
static void *
badstack()
{
__asm__("mov %esp, %edx; sub $0x100000, %esp; mov %esp, %eax; mov %edx, %esp");
}
int main()
{
char *p = badstack();
printf("%p\n", p);
fflush(stdout);
printf("%x\n", *p);
return 0;
}
$ gcc a.c
$ ./a.exe
0x12ef18
Segmentation fault (core dumped)
571:デフォルトの名無しさん
04/03/05 19:40
>>570
linuxでもちょっと大きな奴渡すとすぐにsegfault!です
572:558
04/03/05 20:39
>>571
自分も最初そう思ったけど、
10分の1の0x10000にしても落ちたから違うと思う。
ポインタ変えただけじゃ駄目なんじゃないかな。
_chkstkのまわりくどいソースとあわせて考えると。
573:デフォルトの名無しさん
04/03/05 22:14
>>571
大小は関係ない。
> esp、ebpは明示的に参照しなくても
> ポインタが指し示すだけでAccess Violation飛んだはず。
というのは誤り。espを変更しただけでは落ちないで、参照したときに落ちる。
>>570のテスト内容ちゃんと見た?
574:デフォルトの名無しさん
04/03/05 22:46
>>570
つーかそれ関数すぐ戻ってるから、プログラム的に
スタックが有効かどうかというテストにはならんのでは?
badstack() {
char baduse[0x100000];
return baduse;
}
と同じことだし・・
575:デフォルトの名無しさん
04/03/05 23:15
あー勘違いした
576:デフォルトの名無しさん
04/03/05 23:17
なので、>>571が正解!
577:545
04/03/09 22:36
alloca実装でけたよ
疲れた
578:デフォルトの名無しさん
04/03/20 13:15
Windowsで使えるlexってないんでしょうか?
Cygwin上でうごかすのではなく、純粋にWindows用として。
579:デフォルトの名無しさん
04/03/20 13:33
URLリンク(sourceforge.net)
580:578
04/03/20 14:04
>579
ありがとう。
でも俺がいうのもなんだが甘やかしすぎでは。
581:デフォルトの名無しさん
04/03/20 18:02
>>580
何だそりゃw
582:デフォルトの名無しさん
04/03/20 19:30
>>578
こんなんもあるけどな
URLリンク(www.vector.co.jp)
583:デフォルトの名無しさん
04/03/20 20:18
579は鉄オタに優しいNHKみたいですね<あまやかしすぎ
584:デフォルトの名無しさん
04/03/20 21:46
おれはNHK料金払ってない
585:デフォルトの名無しさん
04/03/20 21:53
>>584
同じく、見てないし。
586:デフォルトの名無しさん
04/03/20 23:24
つーかNHKあまやかしすぎ
587:デフォルトの名無しさん
04/03/23 00:12
教育テレビで歌のお姉さんが胸もまれてたよ。
588:デフォルトの名無しさん
04/03/23 07:16
なんと。
589:デフォルトの名無しさん
04/04/07 19:36
yacc か bison のサンプル集みたいなサイトご存知ないですか?
ちょっと、書籍で勉強してるんですがサンプルが少なくて困ってます。
590:名無し@沢村
04/04/07 22:06
おまいらよ、超便利マシン語エディタ「Visual E++」ができたから見ちみれ!!
プログラム言語の歴史が変わった歴史的瞬間だ。
URLリンク(hp.vector.co.jp)
591:デフォルトの名無しさん
04/04/08 19:16
>>590
Windoze用かよ _| ̄|○
592:デフォルトの名無しさん
04/04/08 23:52
逆に聞くが、Windows用以外に何があるんだ?
593:デフォルトの名無しさん
04/04/10 01:45
>>592
(゚Д゚)ハァ?Macに決まってんだろ!
594:デフォルトの名無しさん
04/04/10 05:25
>>592
SPARCでSolarisかLinux。PPCでMac OS X用。
これだといじれるんだけどな。Windozeなんざ動く環境がないんで試す事すらできねぇ。
あ、StrongARMなLinuxZAURUSも有るか。
595:デフォルトの名無しさん
04/04/10 05:44
> Windoze
スペルは正しく書きましょう Windows :p
596:デフォルトの名無しさん
04/04/10 09:41
>>595
ネタだとは思うけど一応...
URLリンク(d.hatena.ne.jp)
597:デフォルトの名無しさん
04/04/10 10:37
ネタをネタで :D
598:デフォルトの名無しさん
04/04/11 11:00
最適化技法について分かりやすく説明してくれている HP ってありませんか?
599:デフォルトの名無しさん
04/04/11 19:46
yacc の勉強とかはみんなどこでやったんですか?
書籍は相当限られていると思うのですが。
600:デフォルトの名無しさん
04/04/11 21:34
yaccなんて1、2回使えばわかる気がするけど。
601:デフォルトの名無しさん
04/04/11 21:53
>>599
みんな、yacc のソースコードを必死に読んだんだよ。
そのために bison はオープンソースになっているんじゃないか。
お前も頑張れ。
因みに yacc のスキャナ自体も yacc で書かれているが
頑張れば何とかなる。
602:デフォルトの名無しさん
04/04/12 21:54
いやいや、yaccのサンプルはないの?
603:デフォルトの名無しさん
04/04/12 22:55
>>602 >>88見れ
604:名無し@沢村
04/04/12 23:12
ちんぽ
605:デフォルトの名無しさん
04/04/12 23:25
それで?
606:デフォルトの名無しさん
04/04/18 09:21
>>603
書籍はもってるらしいぞ。
607:デフォルトの名無しさん
04/04/23 00:13
gcc 3.4のC++パーサは手書きなんだと。
608:デフォルトの名無しさん
04/04/24 23:06
>>607
みんな手書きだろう?
口述パーサなんてあるか?
609:デフォルトの名無しさん
04/04/24 23:27
>>608
> みんな手書きだろう?
3.3.3まではyaccに生成させてたんだよ。
これは手書きとは言わんだろう?
610:
04/04/24 23:48
ところで、コンパイラの仕事ってどうやって
発生するの?
どんな会社がそういった仕事の最先端を行っているの?
なんとなく興味あります
わたしはしがない下請けなので
コンパイラ、と聞くとちょいと憧れますね
611:デフォルトの名無しさん
04/04/25 12:35
知ってるけど教えてあげない
612:デフォルトの名無しさん
04/04/26 19:19
>>609
なるほど、そういう意味ね!
613:デフォルトの名無しさん
04/04/26 19:25
>>529
ほほえましいな。レス番違うし。
614:デフォルトの名無しさん
04/04/26 19:36
>>613
615:デフォルトの名無しさん
04/04/27 04:59
ワロタ
616:デフォルトの名無しさん
04/04/27 23:10
じわじわ来るねw
617:デフォルトの名無しさん
04/05/08 09:26
すんません、Exceptionのthrowとcatchって、どうやって実装されてるんですか?
なんとなく、setjump()とlongjump()をつかうんだろうなーとは思うんですが、いまいち自信ないです。
どう実装してるのかを紹介したサイトなりがあれば教えていただけますか。
#「例外 実装」とかでぐぐってもそれらしいのは見つからない。
618:デフォルトの名無しさん
04/05/08 09:44
exception setjmp longjump でググってみてみれ。
URLリンク(www.google.co.jp)
619:618
04/05/08 10:24
longjmp だった。言い訳なんかするもんか・・・
620:デフォルトの名無しさん
04/05/08 11:06
How a C++ compiler implements exception handling
URLリンク(www.codeproject.com)
621:デフォルトの名無しさん
04/05/08 12:27
>>617
ちゃんとしたcontinuationがあれば、それを使って実装すればいい。
622:デフォルトの名無しさん
04/05/09 00:19
どういう意味だ?
623:!621
04/05/09 00:48
>>622
exception を実装する為に continuation を実装するというのも本末転倒な感じが
するけど。
URLリンク(www.shiro.dreamhost.com)
624:デフォルトの名無しさん
04/05/09 19:17
longjumpは制約が多すぎないか?
スクリプトレベルでうまく動かすためには、相当なサポートコードが必要に
なると思うが…
625:デフォルトの名無しさん
04/05/16 12:21
Rubyはlongjmp使ってなかったっけか。
626:デフォルトの名無しさん
04/05/17 05:33
自分も先読みが結構必要なときの
マッチしなかったときの処理にlongjmpを使ってるよ。
627:デフォルトの名無しさん
04/05/18 09:34
>>610
ARM,MIPS,SHとかの組み込み用アーキテクチャとかなら新規開発したあとコンパイラもそれにあわせて最適化とかが必要だから仕事があるんじゃない?
628:デフォルトの名無しさん
04/05/18 21:58
Schemeでいうcontinuationの機構を作りたいのですが、
setjmpとlongjmpの他に何が必要ですか?
スタックの内容を退避しなければ駄目ってのはなんとなくわかるのですが。
インアセ使わずにC言語だけでできるものでしょうか?
とりあえずi386以降で動けばいいです。
629:デフォルトの名無しさん
04/05/19 02:28
>>628
「スタックなぞ一切使わない」というのが王道です。
すなわち、関数呼出しはCALLでなく、JMPになります。
return addressは、「次の処理の関数」として表現し、引数として渡すのです。
通常スタックフレームに置かれる変数は、ヒープに置くことになります。
関数型言語スレ(総合スレは荒れてるので、HaskellかML)
で質問すると詳しい人が教えてくれるでしょう。
630:デフォルトの名無しさん
04/05/19 19:26
ういー、むづかしそうです。
SchemeのCPSてやつですね。
631:デフォルトの名無しさん
04/05/20 02:21
「スタックなぞ一切使わない」という方法は、ここでいう (4) の前者だよね。
URLリンク(lists.sourceforge.jp)
URLリンク(lists.sourceforge.jp)
632:デフォルトの名無しさん
04/05/21 02:19
>>630
やりたいこととは違うと思うけど、Schemeを普通のCにコンパイルする方法。
URLリンク(home.pipeline.com)
- 関数呼出しはCの関数呼出しとしてコンパイルされるが、CPSなのでreturnは決してしない
- スタック領域をヒープとして用いる
- スタックがあふれそうになったら、copying GCで新しいスタック領域に移し計算を続行する
- GCのスタックを走査する部分にはCPUに依存しないので、Cだけで書ける
昔Sigplan Noticesで読んで面白いと思った。
633:デフォルトの名無しさん
04/05/23 00:00
bison / yacc の使い方の質問です。
bison とか yacc って、みんな初めは電卓作りますよね。
3 + 5 (Return)
って入力すると「画面上に」8をprintfするやつ。
これ、画面上で8を返すんじゃなくて、
yyparseの返り値とかそういう感じで yyparse の呼び出し元に
8 を何とかして知らせる方法ないですか?
ただし、グローバル変数は使わないものとして。
634:デフォルトの名無しさん
04/05/23 15:40
>>633
/usr/lib/yaccpar とか /usr/share/bison/bison.simpleを書き換える。
bisonは
#define YYPARSE_PARAM foo
を定義しておくと、void *fooが引数として渡されるから、アクションでその中に
答を入れて返すようにすればいいのでは。
プログラム中からyyparseを複数回呼出す場合は、先読みバッファの再初期化に注意。
635:名無し@沢村
04/05/24 21:41
おまいらよ、おれはつい最近つーか、たったいまさっきtcl/tkつーコンパイラの存在を知ったよ。
いまDLしてるところで、まだ開けて見てないんだが、Webでの説明を見た限りじゃなんか良さげだった。
つーか、GUIに関しては、Visual C++よりもちゃんとしたGUIアプリが簡単につくれるとのことだ。
ただ計算的な処理には不向きということだが、そこは何かC言語で書いて追加できるとのことだ。
おれはちょっとこのtcl/tkを調べてみるが、ホントにGUIに関して良さげだったら、いま開発中の「Vicual E++」は、
このtcl/tkで書き直してもいいな。Visual C++じゃエディタの予約語の色づけとかチョー面倒だしな…
そして内部のメインの処理だけをC言語で書くようにすればいいからな…
それができそうかどうかをまず調べてみようと思う。
次に調べたいことは、おれが次につくりたい高級言語に、tcl/tkはオープンソースらしいから、パクレる部分があるかどうかということだ。
ともあれ、おれのコンパイラの開発は飛躍的に前進しそうだな。
おまいらよ、おれはtcl/tkいま知ったぞ。おまいらは、tcl/tk知らなかっただろう?
636:デフォルトの名無しさん
04/05/24 22:11
>>635
tcl/tkって「チックル・チーコ」って読むんだよね?
637:デフォルトの名無しさん
04/05/24 23:11
>>635
お前だけ。
638:名無し@沢村
04/05/24 23:49
Tcl/Tk、DLしたが、何やこれわぁ!?スクリプトやないか?
実行ファイル作成できんのか?HSP以下か?ゴミソフト!!!
639:デフォルトの名無しさん
04/05/25 00:46
セックル・チンコ
640:デフォルトの名無しさん
04/05/25 01:35
>>638
tclsh, wish という位だから、tcl/tk は一種のシェルだよ。
C から system() でシェルのコマンドを実行するのと似た様な感じで使える。
まぁ、もちっと面倒だけど。
俺も以前 tcl/tk からパクれる所が無いかなとソース眺めてみたけど、
C で実装されている部分は低レベルな所だけだったような。
641:デフォルトの名無しさん
04/05/25 10:49
TclつったらPerlと同じくらい歴史の長いスクリプトなんだが
アホは知らなかったのね。
642:デフォルトの名無しさん
04/05/25 10:54
>>641
言語で大事なのは歴史の長さよりも話者人口だよ。
歴史の短い Java をみんなが使うのはなぜだと思う?
Algol や Prolog が滅びたのは?
643:デフォルトの名無しさん
04/05/25 12:04
今頃Tcl持ち出してくるなんて100%ネタだと思ってたんですが。
釣りだよね?親切に説明してる640が気の毒だ。
644:デフォルトの名無しさん
04/05/25 13:29
>>642
Algolはともかく、Prologは滅びてはいないだろ。
Algolにしたって、形を変えてその思想は受け継がれているわけだし。
645:デフォルトの名無しさん
04/05/25 13:53
>>642
知名度の話をしてるんだが。なにが言語で大事なのは、だ。
かってに妄想してチンコ膨らましてんじゃねーよキモイ。
646:デフォルトの名無しさん
04/05/25 19:15
642じゃないけど、
妄 想 ま で 制 限 さ れ て た ま る か
妄想でチンコ膨らそうぜ
647:デフォルトの名無しさん
04/05/25 21:40
>>642
Tclはハード設計ツールの組込みスクリプト言語ではメジャーです。
(Tclはいやだけど、独自言語よりはましだよな)
もともとTclはアプリ組込み用だし。tclshもwishも組込みのサンプル
みたいなもんです。
648:デフォルトの名無しさん
04/05/25 22:13
でも結局、Tk のほうが Tcl よりも何倍もメジャー。
649:名無し@沢村
04/05/26 21:18
Starpack
Tcl/Tkでつくったスクリプトを実行ファイルに変換するツールだな。
が、わし英文読めんけん、このページのどっからDLしていいかわからんのよ。
このページの何行目の何という文字をクリックするとDLできるか、教えて〜♪
URLリンク(www.interq.or.jp)
650:デフォルトの名無しさん
04/05/26 21:45
沢村師ねよ
651:デフォルトの名無しさん
04/05/29 19:38
ここは沢村を呪うスレとなりました。
652:デフォルトの名無しさん
04/05/29 22:11
-=、 ̄`―''" |\ `'''―'''" | || |ヽ、_____,へ、
,...--、 `―‐ァ‐...::', \:::::::::::::::::::: | || |ヽ、___,ヘ、| ┌──┐ i´
,. ' ..::....`'''‐--‐''"~...:::::::::ヽ ` 、::::::::::::::::| || | ┌─┐ i´ | | │ |
-=ニ"_,...、-- ヾヽ、::::::::::::::::::::::::::::::::ヽ `、 `,::::::| || | | │ | | | .| |
`''‐-`ヽ.`''‐-..._:::::::〃:::l:::l`ヽ..ノヽヾ,: | || | | │ | | |____| |
,..-‐''''‐----'":::::::`ヽ、 /l:/|::::/l:::lヾ.‐'""' i| l | || | | │ | |.┌─‐┐┌┐.|
__,. ' ......:::::::::::::::::::::::::::::::::::: `''1 l! l::::i lヾ|,...-==l. l:| || | └─┘ | |ノ ,ヘ、 | | レ'
`ー--‐' ̄`> ....:::::::::::::::::ノ.._,...ヾ!ノ-':::/~ ノ i | || .| | ̄ ̄|ノ / /` .| |
,.. '" ...::::::::::::::::::::::::::ヽ< ̄`>'" `ー‐‐''"ノ..| || |ノ / / | |
-‐'"゛`''‐''" .......::::::::::::::::::::::::::::::::::::::{ `‐',ヘ | ,..、_ .| || / / | | /|
....__...:::::::::::::::::::::::::::::::::::::::::::::::::::::::!、 ! ,..-` ,. | || /./ .| | . / |
-"--- ....___,...--- ._::::::::::::::::::::`、 `‐' _ィ' V| || ._ _/./ . | └─'´ .,)
, '" ̄..::::::::::::::::::::::::::〉__,..w、ァ'"Vハノ | || `ー─‐'´ `ー──'´
,..--- ....__,. ' ....:::::::::::::::::::::::::::::::::::::::::Vi,..ハ---'" | ||
,. ' .....:::::::::::::::::::::::::::::::::::::::::::::::::::::::::'、. ― .| ||
-=-‐-‐'゛`''‐-.._ _,..-----==- .:::::::::::`ー.`--‐'",'| ||
653:デフォルトの名無しさん
04/05/30 08:43
沢村が全てを台無しにしたんだな。
654:デフォルトの名無しさん
04/06/02 01:19
マルチスレッドが良く分からない。マルチスレッドなコードを生成するのには
コンパイラ側で何かしてあげなくてはいけない事があるのでしょうか。
それともランタイム環境の問題なのかな。
655:デフォルトの名無しさん
04/06/02 03:04
tls(thread local storage)なんてのが言語仕様として定義されていればコンパイラはそれを意識する必要があります。
656:デフォルトの名無しさん
04/06/02 07:57
>>655
完全にライブラリレベルなのかなと思っていたのですが、そういう訳でもないんですね。
pthread ライブラリを wrap して、他のライブラリも MT-Safe に作れば良いのかと
思ってました。どうもありがとうございます。
657:デフォルトの名無しさん
04/06/09 22:05
インタープリタなんかではスレッド作るとそのスレッド専用の VM が起動する処理系が
あるみたい。コンパイルされる言語でも、スレッド毎にランタイム環境を作ってあげれ
ば良いのかな。
658:デフォルトの名無しさん
04/06/09 22:48
>>657
コンパイルされる言語の場合は、ホスト環境のpthreadライブラリを呼び出す様に
すればいいのでは?
今後主流になると思われるSMP環境を考えたら、複数のCPUを有効に使えるかも
659:デフォルトの名無しさん
04/06/10 00:20
>>658
pthread_create() が C の関数を引数に取るので、クロージャとかを渡したい場合に
何となく面倒じゃないかなと思ってました。変数部分は引数として渡してあげれば
問題無いような気がしてきました。
660:デフォルトの名無しさん
04/06/16 10:58
bison と flex を使っています。
flex では yylval をガンガン使っています。
bison で %pure_parser したら flex が吐き出す C コードのコンパイルで氏にました。
どうすれば %pure_parser しても yylval (と同じような機能) を flex で使えるでしょうか。
661:デフォルトの名無しさん
04/06/16 16:28
>>660
自己レス
URLリンク(www.timeparadocs.net)
これで解決しますた。
が、flex のファイルに yylval.hoge と書いていたのを yylval->hoge と書かないと逝けないようです。
662:デフォルトの名無しさん
04/06/17 23:22
boostのspiritっていじって遊ぶにはよいけど、
実際問題使えるものなのかな?
663:デフォルトの名無しさん
04/06/18 16:14
boost::spirit便乗質問なんですがパースした後
parse_infoのfullを調べるとエラーが発生したか確認できますが
エラーが発生した行番号を取得するにはどうやったら良いんでしょうか?
664:デフォルトの名無しさん
04/06/18 21:33
position_iterator(勘
665:デフォルトの名無しさん
04/06/19 22:30
うわ、みてみると確かにそれらしい気配が・・・
しかし、よく意味が分からない罠・・・
666:読まずにレス
04/06/22 00:47
JJTreeでJVM上で起動するスクリプトを書くのはアリですか?
667:デフォルトの名無しさん
04/06/22 10:17
だめ
668:デフォルトの名無しさん
04/06/23 23:35
このようなコンパイラ誰か作ってもらえません?
イメージ的にはVMを介さない.NETみたいな。
開発の形態はApacheみたいに元となるものがあって
ユーザーが拡張プラグインを自由に作って公開できるようなのがいいな。
・ネイティブコードを吐く
・OSは問わない
・VMなどを介さない
・メインとなる構文はあるが、ユーザーが自由に構文を追加・変更できる。
669:デフォルトの名無しさん
04/06/23 23:38
>>668
D言語でええやん
670:デフォルトの名無しさん
04/06/23 23:38
>>668
URLリンク(hp.vector.co.jp)
671:デフォルトの名無しさん
04/06/23 23:42
>>669
D言語って名前くらいは聞いたことあるんですけど、
>>668で書いたようなことを実現しているんでしょうか?
672:デフォルトの名無しさん
04/06/24 00:03
Lisp系を使えばいいんでないかとオモタ
673:デフォルトの名無しさん
04/06/24 00:15
>>668
このようなコンパイラ誰か作ってもらえません?
というクレクレな割に
> ・ネイティブコードを吐く
> ・OSは問わない
いきなりハードル高い
674:デフォルトの名無しさん
04/06/24 00:25
>>673
APIの類を使わなければ大丈夫
CPUは限定されるが
675:読まずにレス
04/06/24 00:36
ダメですか…orzガックリ こっそり作ることにします。
676:デフォルトの名無しさん
04/06/24 00:39
.NETだから、膨大なライブラリで動的な言語で言語非依存のバイナリインターフェイスを持ってないとダメだな
677:デフォルトの名無しさん
04/06/24 02:13
>>668
死ねボケ
678:デフォルトの名無しさん
04/06/24 02:20
>>677
お前が死ねカス
679:デフォルトの名無しさん
04/06/24 02:23
>>678
お前も死ねタコ
680:デフォルトの名無しさん
04/06/24 09:50
goto 677
681:デフォルトの名無しさん
04/06/24 09:58
nop
682:デフォルトの名無しさん
04/06/24 10:11
lea eax, dword ptr[eax]
683:673
04/06/24 13:10
>>674
> APIの類を使わなければ大丈夫
画面を含む一切の入出力ができなくなりますが
684:デフォルトの名無しさん
04/06/24 14:11
ブートから初めてVESAなり叩けば良い
685:デフォルトの名無しさん
04/06/24 21:45
>>668は実行可能ファイルとは一言もいってない訳だが。
686:デフォルトの名無しさん
04/06/25 00:58
このページ挙がってないのかな?
URLリンク(www.csg.is.titech.ac.jp)
687:デフォルトの名無しさん
04/06/26 03:09
gosub 687
688:デフォルトの名無しさん
04/06/27 04:13
>>683
>画面を含む一切の入出力ができなくなりますが
要求事項にないから、いいんじゃない?
689:デフォルトの名無しさん
04/06/27 05:13
>>683
GCC があるんだから自分の好きな言語のフロントエンドを書けばいいじゃん。
690:デフォルトの名無しさん
04/06/27 08:28
簡単に言ってくれるが、gcc難解すぎて弄る気にならん
691:デフォルトの名無しさん
04/06/27 10:36
>>689
GCCのフロントエンド書いたときあるの?
692:デフォルトの名無しさん
04/06/27 11:41
>>689
gcc使っても>>668の用件に合わせるのは難しいままだろ?
無知蒙昧な人?
693:デフォルトの名無しさん
04/06/27 17:10
>>689-692
GNU Common Lispでマクロをいじれば何とかなりそう。
694:デフォルトの名無しさん
04/06/27 17:10
URLリンク(www.cminusminus.org)
URLリンク(cs1.cs.nyu.edu)
URLリンク(llvm.cs.uiuc.edu)
URLリンク(gcc.gnu.org)
C--, MLRISC, LLVM, RTL...
色々在るけど、誰か使った事ある?
695:デフォルトの名無しさん
04/06/27 23:04
>>685
まあ、ここ見てる奴は「ネイティブコード」と書いてあるからそんな疑問は浮かばんわけだが。
696:デフォルトの名無しさん
04/06/28 00:10
ネイティブコードと、オブジェクト(実行可能)ファイルを混同して考えるのはお前くらいなものだが。
697:デフォルトの名無しさん
04/06/28 00:28
C--は使ったことあるよ。
結構面白いけど、関数型言語とか論理型言語とか、
実装研究がまだまだ行われている言語向けだなあ。
698:デフォルトの名無しさん
04/06/29 18:16
Common Lispのプリプロセッサ(マクロ)って
そんなに自由度が高いの?
699:デフォルトの名無しさん
04/06/29 20:58
>>698
自由度は高いよ。
マクロ定義とは実質的にLispコードを生成する関数だとか。
まあ、C++のtemplateもだけど自由度が高ければ高いほど解読しにくいわけで、
達人以外が使っても生産性が大して上がらない気もする。
700:デフォルトの名無しさん
04/06/29 22:39
Lispのマクロは
評価時に展開されるから
*プリ*プロセッサとは言わない
701:デフォルトの名無しさん
04/06/30 22:18
>>700
評価に先駆けて展開しといたり、
コンパイル時にも展開できるわけだが。
まあ話を平たくすると、いつでもできるわけだ。
702:700
04/06/30 23:25
>>701
Lispの評価器に関する知識が必要な話を
マクロ=プリプロセッサという世界のの人に
今説明しても混乱するだけかと
703:デフォルトの名無しさん
04/07/01 00:28
>>698
S式を二回評価すると思ってね。(おおざっぱ)
一回目でプログラムの生成、二回目で生成されたプログラムの実行。
LispはデータもプログラムもS式だから、
こういうのは機構的にもプログラミング的にも簡単。
一度遊んでみると良い。
704:デフォルトの名無しさん
04/07/01 12:02
C, C++だと
MYMACRO(a,b,c) { ... } // a,b,c,..は可変個引数
から
int a=0;
int b=1;
int c=2;
...
my_macro_end(a,b,c);
を生成するようなのは書けないでしょ? Lispのマクロはできます。
C++やJavaだとデザインパターンなどで似たようなコードをクラス毎にあちこち
で書かないといけない(が、C++のテンプレートでは表現できない)ことがある。
そういう場合にパラメータを与えて雛形からコードを生成するスクリプトをRuby
などで書くことを考えましょう。
Lispのマクロなら全部Lispだけでできます。
705:デフォルトの名無しさん
04/07/01 12:03
後はなんだろう。処理に必要なデータを静的に持っておきたいとしましょう。
例えば、isdigit()のために、その文字が数字かどうかを記録した1バイト文字
256個分のテーブル(文字が数字なら1、数字でなければ0)を定義したいとします。
そこで、
int isdigit_table[] = {
0, 0, 0, ...., 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, ...., 0
};
と書く代わりに
int isdigit_table[] = {
(eval-when-compile // コンパイル時に実行
int table[256];
char* digits="0123456789";
memset(table, 0, 256);
for (char* d=digits; *d!='\0'; d++)
table[*d] = 1;
return table;)
};
みたいなことを書けば、(eval-when-compile ...)で囲んだ処理をコンパイラが
実行して、その結果のテーブルとして同じ中身のisdigit_tableを定義できると
思ってください。
C++だとコンストラクタでもできますね(コンパイル時でなく実行時になりますが)。
要するに、C/C++のマクロ(cpp)が格段に高機能な言語になったとしましょう
(C自体では嬉しくないから、RubyとかPHPとか?)。その場合のC,C++に相当する本
体の言語がLispであり、ついでにcppの言語も同じLispになったと考えればいいです。
706:デフォルトの名無しさん
04/07/01 13:58
まあLispは面白い言語なので
SICPは読んで損がない本だと思うよ
707:デフォルトの名無しさん
04/07/01 23:20
まぁ、LISPやる奴で実用的なプログラム書ける奴見たこと無いんだけど?
708:デフォルトの名無しさん
04/07/01 23:36
>>707
emacsってそんなに使い物にならない環境なのか。なるほど。
やっぱvi?(違
709:デフォルトの名無しさん
04/07/01 23:38
xyzzyがWin emacsの筆頭?
710:デフォルトの名無しさん
04/07/01 23:58
>>704
C++でならTypeList or boost::mpl使えば書けそう。
まあ流石に100個も200個も可変長引数を渡されると無理だろうけど。
711:デフォルトの名無しさん
04/07/02 00:12
ECMAScriptを解析してくれて、しかも組み込み関数・オブジェクトを定義できるライブラリが欲しい
自作すると変数宣言と組み込み関数・オブジェクトのみになりそうだ
712:デフォルトの名無しさん
04/07/02 00:38
Schemeは括弧さえ折り合いつけば最高の言語の一つだ
713:デフォルトの名無しさん
04/07/02 14:23
>>711
クロスプラットフォームなら spidermonkey とか、
Windows だけでいいなら ActiveScript とか。
どちらでも簡単にできるよ。
714:デフォルトの名無しさん
04/07/02 17:21
>>709
>Win emacsの筆頭
Meadowの方が広く使われてます。
715:デフォルトの名無しさん
04/07/02 22:36
>>713
SpiderMonkeyはかなりよさげだね
しかし英語だらけで組み込めるのは当分先か・・w
716:デフォルトの名無しさん
04/07/03 10:17
>>704
そういうプリプロセサ書いて、差し替えれば済む話だと思うけど。
全部 C/C++ でできますよ。(藁
717:デフォルトの名無しさん
04/07/03 10:38
C/C++ではたしかpreprocessor commandsも規格の一部な罠。
718:デフォルトの名無しさん
04/07/03 11:22
プリプロセッサを差し替えるオプションなんてあるの?
Visual C++とgccを見たけど見つからなかった。
719:デフォルトの名無しさん
04/07/03 15:40
>>716 それじゃ「コンパイラ書けばできますよ」ってのと変わらないやん.
720:デフォルトの名無しさん
04/07/03 22:50
>>718
自分のプリプロセッサから、コンパイラ呼べばイイだけじゃない?
721:デフォルトの名無しさん
04/07/04 02:06
>>720
そりゃそうだ。でも差し替えるとは言わんな。下らないことをきいてしまった……。
722:デフォルトの名無しさん
04/07/04 09:28
差し換えるならspecファイルだろ。
723:デフォルトの名無しさん
04/07/04 11:46
>>718
GCC とかならソースあるんだから、適当に修正して実行ファイル入れ替えれば良いんじゃないのか ?
>>719
まあ、そりゃそうだけど、コンパイラ書くより多少難易度は低いだろ。
724:デフォルトの名無しさん
04/07/04 16:57
結局使い物にはならないと。
普通のアプリケーション書くのに特定のコンパイラのバージョンとそれへのパッ
チ込みで保守したくはねーなあ。
725:デフォルトの名無しさん
04/07/04 18:28
まあ、このスレ的にはコンパイラまで作ってしまえって事になるかな。
TinyC->.asm位だったら簡単だしね。
俺は#defineなどC言語準拠なプリプロセッサに
アセンブラ風の複数行マクロを使えるような物を作って、
言語ごとに微調整しているよ。
()を使わないバージョンなどね。
エラーを探知するために、##lineっていう
現在のコンパイル行をプリプロセッサ->コンパイラへ通知する命令をつくって、
デバックもしやすくしているよ。
726:デフォルトの名無しさん
04/07/04 21:39
>>724
て言うか、普通のアプリケーション書くのに >>704 みたいなことはあまり必要ないだろ。
マクロプロセサやプリプロセサが高機能だと色々おもしろいけど、実際のところ後の保守が大変だったりするからあまり使わん。
昔使った PL/I のプリプロセサは、IF 文は当然、FOR/WHILE の制御構造や PROCEDURE/FUNCTION なんかの手続き/関数定義までできた。
だから凝った定義を書けば、ソースを短く書けたけど、プリプロセサ文をデバッグする手間を考えたら素直にソースを手で展開した方が早かったよ。(藁
MASM なんかのマクロアセンブラでも同じような経験したことある人は多いと思うよ。
727:デフォルトの名無しさん
04/07/05 01:31
俺はわりとしょっちゅう欲しくなる方だな。
Lispのマクロで俺言語を作ることを考えると>>726も想像はできるけど。
>>726とは逆に最初書くときはベタに展開したソースを書くけど後から
保守性を考えてマクロでまとめることも。あまり凝ったことはしないけどさ。
cppに変数とifとfor eachだけでもあれば世の中もうちっと良かったろうに。
728:デフォルトの名無しさん
04/07/13 22:28
コンパイラとかの参考図書は、よくありますが
スクリプト言語の参考図書(定番)は、ごぞんじないですか?
729:デフォルトの名無しさん
04/07/13 22:52
各OS毎のリソースコンパイラの作り方に触れたサイトってありますか?
730:デフォルトの名無しさん
04/07/14 00:35
>>728
その二つに大きな違いはない。
731:デフォルトの名無しさん
04/07/14 01:11
>>728
コンピュータアーキテクチャの本じゃないか?
>>730
構文解析だけじゃなくて、実行機の話してるんじゃないの?
732:デフォルトの名無しさん
04/07/14 01:26
すいませんyacc/lex初心者の質問です。
WIN XPのコンソールから
GNUのFLEXとBISONとボーランドのBcc32でコンパイルしてるのですが
bisonとflexは通過するのですが
最後のCコンパイラのリンク時に"yyllocが定義されてない"というエラーが出てしまいます。
bison.simpleとbison.hairを見てもよくわからないので
なにがまずいのでしょうか?
733:デフォルトの名無しさん
04/07/14 01:39
>実行機
ってなんじゃらほい?
734:デフォルトの名無しさん
04/07/14 11:23
>>728
『インタプリタ進化論』なんかいいのでは。スクリプトに特化した内容ってわけでもないけど。
735:デフォルトの名無しさん
04/07/14 19:49
このスレでよく出てくるyaccやlexってのはソフトウェアなの?
それともライブラリの類?
で、実際にはどのようなことをするものなの?
736:デフォルトの名無しさん
04/07/14 20:00
>>735
URLリンク(www.linux.or.jp)
737:735
04/07/14 21:00
つまり、字句解析や構文解析をするソフトウェアね。
コンパイラにおけるそれらの処理を外部のソフトウェアに
頼ると言うのは有りかね?
738:デフォルトの名無しさん
04/07/14 21:02
>>737
何を言ってるの?
739:ほんたま
04/07/14 21:26
おみゃ〜らよ、おれのスリムドカンはある意味コンパイラよ。
スリムドカンはおれのページにあるから見ちみれ?
URLリンク(hp.vector.co.jp)
おみゃ〜らよ、おれはいまリソースエディタをつくってるのよ。
スリムドカンに装備させるためよ。
おみゃ〜らよ、コンパイラをつくるのはいいが、リソースエディタのないコンパイラはコンパイラとはいわんぞ!
自分じわかるかな?
740:デフォルトの名無しさん
04/07/15 00:53
>>737
字句解析や構文解析をするソースコードを生成してくれるソフト
これ以上は自分で調べてくれ
741:デフォルトの名無しさん
04/07/15 04:40
>>735
あなた、最高に頭悪そうですよ?
742:デフォルトの名無しさん
04/07/15 18:37
昔、OL進化論っていうのがあったなぁ〜
ちょっと思い出したw
743:デフォルトの名無しさん
04/07/15 19:34
インタプリタ進化論って、絶版じゃなかったっけ?
読みやすい本でいい本だと思うけど、
実行環境の話はそれほど無かったような気がします。
とはいっても、字句/構文/意味解析を作るより
実行環境を作るのって、力業でできますしそんなに難しくないと思いますよ。
744:デフォルトの名無しさん
04/07/15 23:56
My VMをレジスタマシンにするかスタックマシンにするか悩む
スタックマシンにすると決めた、するとbytecodeにするかwordcodeにするかまた悩む
スピードの為にwordcodeにするならそもそもレジスタマシンにするべきなのかと悩む
一向に前に進みましぇん
745:ほんたま
04/07/16 00:05
おみゃ〜らよ、おみゃ〜らさーん♪
おりはよ、「Slim de Can」を使ってやっとメインウィンドウにコントロールをつけるサンプルの作成に成功したぜ。わはは♪
「Slim de Can」ってすげ〜な〜、イベントドリブンプログラムが作成できるとこまでついに進化したよ。
おりはもう神だね♪どうよ?
URLリンク(hp.vector.co.jp)
746:デフォルトの名無しさん
04/07/16 01:05
全部作れ。
747:ほんたま
04/07/16 13:55
おみゃ〜らよ、おみゃ〜らさーん♪
おりはよ、「Slim de Can」を使ってあるボタンをクリックしたらある処理を行わせ、別のボタンをクリッしたら別の処理をおこなわせるプログラムの作成についに成功したよ。
つまり「Slim de Can」はすでにイブントドリブンプログラムがつくれる環境になっているということを自ら証明したという次第よ。
おい、「Slim de Can」はすでに簡単なゲームくらいはころっとつくれるぞ。誰かつくらんか?
「Slim de Can」ってすげ〜な〜。
おりはもう神だね♪どうよ?
URLリンク(hp.vector.co.jp)
748:デフォルトの名無しさん
04/07/16 22:00
コンパイラ作るならBNF記法(拡張)についての理解は必須ですか?
749:デフォルトの名無しさん
04/07/16 22:13
無くても作れるよ。あった方が楽だけど。
750:デフォルトの名無しさん
04/07/17 00:00
context free grammerについては「理解」という程大変なことはない気がする。
# オートマトンを理解するにはちっと勉強が必要になるが、
# それこそ知らなくても何とかなりそう
なおLL(1)文法と属性文法を学んでしまえばりっぱな「コンパイラ」が作れると思う。
# リンカとかアセンブラとかの知識は既習だとして
751:デフォルトの名無しさん
04/07/17 03:09
言語設計はともかく、コンパイラ設計となったら
フロントエンドよりバックエンドのが難しいというか
面白いと思うんだが、どうしてフロントエンドの話しか出ないんだろうか?
752:デフォルトの名無しさん
04/07/17 03:43
たぶん、そこまで行きつかない奴しかこのスレにいないから。
753:デフォルトの名無しさん
04/07/17 09:41
バック部のトピックス
・並列化(ループ,タスク.手続き間解析は必須)
・別名解析(フロー依存はまだ重い)
・SSA(冗長コピーをどう減らす? 別名の扱いも)
・コピー伝播(非常に重要.でも語ることは余りないか)
・部分冗長性削除(やりすぎると性能悪化することも.ライブレンジを考慮)
・CPS(手続き型ではやらんか)
・レジスタ割付け(PowerPCとかなら素直だが,制約のきついCPUだと面倒)
・ソフトウェアパイプライン(最内からやらない手法が最近発表されてた)
・命令スケジューリング(コンパイル時間爆発の主犯)
・SIMD命令やDSP命令の生成(上から下までからむので大変.パターンマッチしかない?)
754:デフォルトの名無しさん
04/07/17 18:50
本日、佐々政孝氏の「プログラミング言語処理系」という本買いました。
コンパイラについてちゃんと学んでいこうかと思います。
755:デフォルトの名無しさん
04/07/17 19:02
バック部はCにトランスレートする事で済ませちゃってるから、あんまやらないんだよな。
とはいっても、最近の仕事でそういうのをする必要もあったりして
書籍紹介とかやってもらえます?
756:デフォルトの名無しさん
04/07/17 19:07
そういや 21st Century Compilers 読んだ人いる?
757:デフォルトの名無しさん
04/07/17 19:57
あぁ、それね…。2005年11月15日に延びたみたい。_| ̄|○
URLリンク(www.aw-bc.com)
Copyright: 2006ってなってるからもっと延びるかも…
758:デフォルトの名無しさん
04/07/17 20:18
バックエンド「も」それなりに解説している本としては龍本はもちろんのこと、appel本や中田本がありますね。
龍本がバックエンド概要集だとすれば、
appel本が実践本、中田本が理論本といった感じでしょうか?
バックエンドオンリーな変り種としては
Robert Morgan: Building an Optimizing Compiler (ISBN 1-55558-179-X)
ってのがあります。こいつは本当にバックエンドしか書いていません。
759:デフォルトの名無しさん
04/07/17 20:21
いまだに龍本なの?
進歩ないね。
760:デフォルトの名無しさん
04/07/17 20:54
何でそんなに詳しいのに新たな言語を作ろうとしないの?
761:デフォルトの名無しさん
04/07/17 20:57
>>760
何でそんな労力割かなきゃならぬ?
762:デフォルトの名無しさん
04/07/17 21:05
>>757
がぁん。評判よければ夏休みにでも読もうと思ってたんだが。
763:デフォルトの名無しさん
04/07/17 21:17
目を通すだけで満足だから何も作らんのだろうな
764:デフォルトの名無しさん
04/07/17 21:21
バックエンドまで作りこんだ言語を書いても、それで食ってける人はごく少数だし。
理屈を理解して普段のプログラミングに生かせれば、それで良いかと。
765:デフォルトの名無しさん
04/07/17 21:36
>>761
本当はコンパイラの原理とかよく分かって無いんだよな?
次ページ最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
4976日前に更新/226 KB
担当:undef