「コンパイラ・スクリプトエンジン」相談室16
プログラミング言語処理系の開発に興味のある人達のスレッドです。 字句解析・構文解析から,データフロー解析,ループ並列化,データ分散,SSA変換, CPS変換,レジスタ割付,命令スケジューリング,ソフトウェアパイプライン, SIMD命令生成,VLIW向けクラスタリング,スクラッチメモリ向け最適化,リンク時最適化, JIT,動的バイナリ変換等の各種最適化,それにVM,GC,低消費電力化などなど。 意味論に関する話題も歓迎です。 Wikiのまとめページ http://www6.atwiki.jp/compilerandscriptengine/ 誰も立てないので立てた。 需要なければこのまま放置ということで。 というわけでCaperをRubyで使えるようにしなきゃいけない。。。 お手軽に言語作ってみますた なら バックエンドは インタプリタか JVM かLLVM のどれかになるべ あとは JSへのトランスレータか 意外に選択肢多いな jonigataさん、Rubyのサポートを追加しました。 JVM上で動く言語をガチで作ってる人ってバイトコードを直接出力するコンパイラ作ってるのかな。 JVM上で動くエンジン用のコードじゃなくて。 >>10 やっぱりですか。 ただ目標がゲームエンジンで将来的にスマホも視野に入れると直接バイトコードってのもどうかという気もします。 ただクッション入れると速度的にどうなんだろう、悩ましい。 >>15 サポートヨロっていわれてんじゃん、がんばれ >>13 俺は前に自作スクリプト→Javaソース→javassistでバイトコードに変換と やってたけど遂に完成させずに投げてしまったxp つかC並にJVM上で低レベルに動く言語が・・・ってどっかにありそうな気がする。 JVMのバイトコード吐くライブラリってもあるけど こっちはバイトコードの知識必須 言語仕様だけ考えて満足しようぜw どうせ中間言語に落とし込むんだしバイトコードくらい余裕だろ >>13 まず簡単なのを作って、次は作りなおせばいいじゃん。 マークスイープのようにGC以外のところでGCを考えずに済み 参照カウントみたいに最大停止時間が短いGCってある? 速度は問いません >>29 実装簡単なのだとCOPY GCかぬ? これに寿命を意識すると世代別GCに発展したのがある。 コレより先は実は最先端だったり >>31 コピーgcはやっぱメモリ効率がーんー 今のところ遅延マークスイープをなんとか使おうかと思うけどーなー 悩ましい。。。 >>32 EdenだけCopy GC,OLDに行ったらMarkSweepとか色んな掛け合わせもあるみたいだね mostly-concurrentマーク&スイープGCは? 1. ミューテータを止めてルートセットをマーク 2. ミューテータと並行に別スレッドでマーク 3. ミューテータを止めて再度ルートセット+残り全部をマーク 4. ミューテータと並行に別スレッドでスイープ ってやるやつ ライトバリアがいるからGC以外のところでGCを考えずには済まないけど (そのへんは世代別も一緒だが) 最大停止時間は短いと思うよ caperが改善されて大規模なパーサーでも 早く生成できるようになったようです。 あんまりでっかいの書かないんで今まで困った事ないのだが、吉報には違いなかったりするのでお礼を述べさせて貰います、ありがとう。 >>Thanks for ジョニガタさんとMZさん やること ★Ruby RaccとCaperの比較レビュー。 ★CaperでCSVパーサーの作成。 ★CaperでXMLパーサーの作成。 winXP visual studio 2010 expressで antlr4の導入できた方いらっしゃいませんでしょうか? バッチファイルみたいなのに定義ファイルかませば出せると思いきや、 JAVAしか出てこない。。。 英語よく読めない おめおめ 四則演算と簡単な制御構造が実装できると あとは応用だから 扱う型の種類が増えない限り楽に拡張できそうだね 演算子って四則演算以上のことやらすと必ずそいつが決めた優先順位に縛られて破綻するし 電卓ならLISPの(+ 1 2 3 4 5)みたいに演算子相当が無くてオペランド側をいくらでも増やせる構文の方が楽 LISPはLISPで解析器に都合の良い構文だと思う もちろんそういう意味で(作る側が)楽と言ってるんじゃないのは分かっているが もう少し使う人間のことも考えてやれと ……で行き着くのも例えばpythonだったりするのでそれはそれでうーん >>46 FORTHが一番解析器に優しいと思う、Lispは少なくとも関数に渡す引数の数は解析で判断できるけど、FORTHはそれすら捨ててる あとLispは支援するエディタがあれば書く事に戸惑いは殆どないよ。 読むのは適切なインデントがされていないと辛いのは本当だけどそれだってRubyやらCやらでインデント無しと変わらないと思う。 なお、Pythonはインデントが構文に含まれているのが嫌い(エディタで再フォーマットできない) ある海外のファンタジー小説で、異世界召喚されたプログラマが魔法でFORTHを実装して 最強魔導師になってた。 May the forth be with you. Lispは見た目的に「目にひっかからない」(関数もマクロもみんな同じようにしか見えない)のが問題なんだけど、 最近流行ってる(?)みたいに ( ) と [ ] を使い分けるとかすると、だいぶ感じが違うと思う。 >>52 Clojureが凄い良くできてる ()でリスト,[]でベクタ,{}でマップ、#{}でセットとリテラルの扱いが凄い綺麗 {} はすごくいいね。素の lisp だとほとんど使われない記号でもったいなかった。しかも数式とも合ってる。 ただ[] は好きになれないなぁ。個人的趣味だけど。 エラーメッセージを楽して、素晴らしく表示したいんですけど いい方法を教えてください。 人間が見てるのとコンパイラが解釈してるので大きくズレがある場合とか エラーメッセージ見てわからんことが多々ある xxの前にxxがあります/ありません系のエラーはウンザリ print " _人人 人人_ \n", "> 突然の死 < ", col, ",", row, " in ",filename,":", reason, "\n", "  ̄Y^Y^Y^Y ̄\n"; die; 楽して素晴らしい方向を考えた $ nmlc -run examples/lablgl/triangle.nml Fatal error: exception Failure(" _人人 人人_ > 突然の死 < parse error line 33  ̄Y^Y^Y^Y^Y ̄ ") って出るようにしてみた。 何のエラーか なぜ起こったか どうすれば良いか のうちどこまでエラー表示するか 表示しないものはマニュアルに書くか 統一しておくと良い 何のエラーか数字で提示 あとはknowledge baseで knowledge baseは迷宮 基本的には書いた人の頭のエラーだからな。 コンパイラ的には「チェンジ!チェンジ!この子変えて!!!」 だけでいい。 > 関西型プログラミング言語のひとつ Kyoto のコンパイラは,文法ミスのあるコードを与えると「ふうがわりなコードどすなぁ」とだけ返すので,何が間違っているかはこちらで推測する必要がある. >>64 > どうすれば良いか これは余計なお世話だわ コンパイル速ければ、エラーは1個で十分だったりするよなぁっとか。 大量に出すなら、一番先頭のエラーを一番下に出すと嬉しいとか。 最近のghcとかだと、関数名をタイポすると似た存在する関数名を示してくれる。外してる時もあるけど。 ああいう親切さをもっと充実させるのも方向性としてはありだと思う。 あらゆるコンパイルエラーがクラウドサーバに送られ続けて典型的なミスを蓄積し続ける、とかね。 大量のデータをまとめて整理した結果をどこかで見たけど よくあるスペルミス・インポート忘れ・宣言忘れが飛び抜けていて それ以外はごくわずかでどうでもいいという印象だった 中級者以上と入門者はつまずく所が全く違うから 後者のデータだけを集めれば「入門者に最適」な言語やツールが作れるかもしれない C言語は、研究結果;はあった方が良いみたいな話を聞いた事があるような気がする。 けど、最後だけ無しとかだったのかもしれないし、良く覚えてないなぁ。 今作ってる言語は必要な所だけ;を書くって作ってるのだけど。 初心者には難しいのかもしれないです。 気の利いたエディタサポートまで考えるなら改行をまたぐ構文を禁止すべき VBはそうなってる lispとかでマクロ展開したときに中でエラーが起こったら行と桁の表示は諦めるしかないのかな 前に作ったとき展開後も展開前の行を引き継ぐやり方をしてたけど >>78 トークンに文字列だけじゃなく、もとあった位置の情報も付けたら? >>76 どんな言語でも、ある程度本格的なプロダクトなら、たいてい、「やたら長くなるから改行を挟みたい式」と 「やたら短くて似たようなのが連続するから1行にまとめたい文」の両方が出てくるので、 どちらを強制するのも一長一短。 構文的には (a, b, c, d) と {a; b; c; d;} の、どちらも似たようなものだけど、機械的なコード生成では 後者のほうが以前は楽だった(最近は可変長配列みたいなオブジェクトに入れて、最後に joinとか、ライブラリが充実してる言語を使うのが普通なので、あまり差は無い)。 人間の作業としては、複数行にまたがるものでは前者のほうはちょっとめんどい。 (最後の行を削ったあとで、前の行の最後も削る必要があるので) {a, b, c} みたいに閉じカッコを行末に付けてしまえばそうでもないかもだが。 あとそもそもC言語の構文では ; の規則がちょっと変則的。 Lispマクロのデバッグはちょっと難しいよな。 backquoteのように構文上の構造を引き継ぐような奴ばかりならいいんだけど。 複雑なマクロでもたいていは展開系見れば何とかなるね。それでも動かないマクロがたまーにあって辛いけど。 自作のコンパイラなりなんなりはデバッグと最適化を考えたらなにも出来ない むしろ潔く投げ捨てる勢いと割り切りで走らないとダメっしょ 俺様考えたルールで動いた万歳終わりな感じ 四則演算と条件文、あとGOTOなりCALLなりがあれば立派 それ以上の高度化は努力しだいってことで それとも大人しくCommon Lispあたりを使って妥協するとか Lispだと関数を生成して実行できるんだよね 例えば入力画面の項目数とか要件とかを与えて関数の形で生成して実行な感じの 俺様コンパイラ、Lispコード生成するからコンパイルや実行デバッグはそちらでオネガイみたくw そこまで楽するなら構文をリードマクロで定義したほうが早そう xmlってスクリプト言語なの?データ構造なの? xmlを使ったスクリプト言語らしきモノもあるみたいだし、よーわからん >>83 C とかのソース吐いて、最適化よろしくね(はーと)でいいだろ >>85 データ構造だろ パーサ作るのが楽というか有りものが使えるからxxxxMLみたいに拡張して使われるんだろう >>85 プレーンテキストってスクリプト言語なの?データ構造なの? >>88 只の文字列だよ そこに意味を付けるのはまた別の事 シェルスクリプトとかみたいな意味でスクリプトではない。 XSLTとか、あとワドラー氏が冗談で提案していたと思うがXMLで表現するプログラミング言語と いうものもありうるけど、XML自体は単なるデータ構造でしかない。 XMLにロジックを書く者は呪われる。やめておいた方がいい。あれはデータ形式としても冗長すぎるし、良いところはない。 S式を使うといい。 閉じ括弧重ね書き文化は誰も止めなかったのかねえ)))))))))))))))))))) Cみたいな中括弧、改行、インデントを繰り返すのもイマイチ 整ってると思うがなあ switch, caseだけはアレだが switchとcaseは同じインデントにしてbreakだけ字下げだよね?ね? (,)は特別な意味持たせたいとかあるので難しいですね。 (a,)はタプルにしようか、タプルじゃないのかとか。(,a)はタプルとか。 Pythonの「1要素のタプル」はトリッキーだが面白いとは思った。 kなんとかの人が言ってるように、カッコなしでもそうなるのは罠だがw ここって正規表現エンジンの話もいいのかな nfaとdfaのハイブリッドエンジンを実装したいんだけど dfaの中にnfaがあったらどう処理するかとかどこまでdfaにしていいかとかさっぱり分からない 調べてもon-the-flyという単語ぐらいしか出てこなくて実装方法とかは見つからない 知ってる人いたら教えてほしい schemeの自作コンパイラ作成の過程で、cps変換につまづいています。 よくネット上で「簡単な処理で実現できる」という感じで書いてあるのを良く見るのですが、 実際にやろうとするとなかなかできません。 具体的に何をやったらいいのでしょうか? ちなみにlambdaでのcps変換はぎりぎり理解できてると思います。 Scheme使ってるならEoPLの最後のほうの章読んだらええで。 >>103 つ ドラゴンブック, lazy transiyiOn evaluation 古典実装だとoriginal egrep >>100 Lisp の (a) は (a . nil) だからちょっと違う。 >>101 構造体とかそういう別の名前を持ち出したりするとややこしくなるだけ。 >>106 ありがとう でも自分の望んでるのとは違うみたい >>108 この延長線上にある話だと理解できてないか、 SFA(semi-deterministic finite automata)を勘違いしてon-the-flyだと思っている。 前者ならGNU Rxを読めばいい。 >>109 多分後者かもしれない 自分の考えてるのは(X)*aときたら 1 ==(X)==> 1 1 ==a==> 2 というdfaを作って次のノードへの遷移条件が文字じゃなくてnfaなら それを優先して見てマッチしたらその先に行く方法を考えてた それならnfaとdfaをうまく組みあわせられると思って あとsfaは今初めて知った sfaとかon-the-flyは調べてもちゃんとした説明が出てこなくて困る あとnfaだけかdfaだけなら偶然持ってたドラゴンブックやネットの情報が十分にあって実装出来た ハイブリッドにする方法が分からなくて途方に暮れてる SFAでググったらランク上位の日本語の記述がこれだった http://www.slideshare.net/mobile/sinya8282/ss-12170832 役に立つかは知らないけどマッチングの並列実行だってさ DFAで出来ないこと、やると遅いことをNFAでやる。 DFAにならない正規表現の拡張や状態が爆発するn回繰り返しなど。 ということはjavaとphpとC#に対応したということか スレ立てるまでもない質問はここで 139匹目から来ました。 JavaCCで負の数と引き算を識別したいんですけど、どう定義したらいいでしょうか? 以下現状の一部抜粋(メソッド名についてはスルーしてください) void enzan3() : {} { enzan4()((<TASU>|<HIKU>)right=enzan4())* } void enzan4() : {} { enzan5()((<KAKERU>|<WARU>)enzan5())* } void enzan5() : {} { <MOZI>|[<HIKU>]<SUUZI>|"(" e=enzan3() ")" } >>117 そのスレの997以降のはやってないの? number=0..9 plus::=<expr> + <expr> minus::=<expr> - <expr> expr::=<number>|<plus>|<minus> な感じになるだろうし 単項のマイナスはexprにかからない形式で-が出てきた時だし間違いようがなさそうに思うんだけど あ。 そこの >単項演算子と二項演算子の区別 についてはまだ調べてないです。 調べてみます。 二項演算子+,-の間に二項演算子*,/を含む式があって、 その中にカッコか数字か変数呼び出しなどがあるように定義するのではないのですか? 例えば -1 1-2 -2*4 2/(-2+5) などの書き方が使えるようになるといいなとか考えています。 >>118 ::=って書き方は確かBNF記法でしたっけ? その書き方についてぜんぜん知らないのでそれも調べてみます。 みんなBNFとかやってるのか char配列にして解析してるから常に最後が';'だと楽なんだよね '{'で+1、'}'で-1、+-0の状態で';'がきたらその構文が完結する int a;, class {}; switch{}; void hey(){}; if(true){}; for(){}; べつに区切り文字が = だろうが : だろうが ::= だろうが BNF は BNF だ >>120 >みんなBNFとかやってるのか JavaCCの場合字句解析でトークン列に分解してくれて、 >>117 にあるようにそのトークンの並びを書いて構文解析の定義をします。 なのでBNF記法とは違った書き方になります。 >>121 >演算子の優先順位はどうしてんの? いい説明文が思い浮かばないので、 まずは例として1+2*3/4-5という式を構文木にしたものを以下にアップします。 http://fast-uploader.com/file/6973429321730/ こんなかんじのまとまりです。 演算子:/ 左辺:3(enzan5) 右辺:4(enzan5) → @(enzan4) 演算子:* 左辺:2(enzan5) 右辺:@(enzan4) → A(enzan4) 演算子:- 左辺:A(enzan4) 右辺:5(enzan5) → B(enzan4) 演算子:+ 左辺:1(enzan5) 右辺:B(enzan4) →C(enzan3) とりあえずenzan3の定義の先頭にマイナスの記号があるかもしれないという意味合いで 以下のようなコードに変えてみました。 void enzan3() : {} { [<HIKU>]enzan4() //★ ((<TASU>|<HIKU>)enzan4())* } void enzan4() : {} { enzan5() ((<KAKERU>|<WARU>)enzan5() } void enzan5() : {} { <MOZI>|<SUUZI>|"(" enzan3() ")" } <>:トークン |:左右のどちらかの構文(||やOr演算子のようなもの) []:省略可能構文 すると、以下のような警告が出ました。 Warning: Choice conflict in (...)* construct at line 608, column 9. Expansion nested within construct and expansion following construct have common prefixes, one of which is: <HIKU> Consider using a lookahead of 2 or more for nested expansion. 内容は選択の突出(Choice conflict)と言うもので、 私が作った構文の定義があいまいのようで 608行目(ここでは★を付けた行)の定義が他の定義とかぶっているらしく、 先頭に出てくる<HIKU>トークンが共通点らしいです。 そもそもの考え方が間違っているかもしれませんが、 それを抜きにしてもまずなぜこのような警告が出ているかわかりません。 一体なぜ出ているかわかる人いれば教えてださい。 >>120 java(というよりC)のforは()の内部に;が出てくるのが >>119 javaccの書き方と大差ないみたいよ この文脈でconflictは「衝突」と言う。 そのメッセージの通り、複数の定義で共通してるトークンがあるから、どっちの定義のほうだとして 解釈していいかわからないからエラーになる。 そのメッセージでは「Consider using a lookahead of 2 or more for nested expansion.」2個あるいはそれ以上の 先読みを使うことを検討してみろ、と言っているが、それに従ったところでうまくいくかどうかは わからんけどね。 >>123 >>121 は重要なヒント -(1+2)とか、1+(-2)とかにその定義で対応できる? たとえば★の行をenzan5に移してみるなり、演算子の優先順位を変えてやりなおすとか それとは関係ないけど、3*2/4って直感的には( (3 * 2) / 4 )になりそうだけどその構文木だと右から左なのね >>127 選択の衝突でしたね。 間違えて覚えました; かぶってるらしいからLOOKAHEADで先読みをしなくてはならないのはわかるのですが、 そのコードでどのパターンとどのパターンでかぶってるのかがわからなくて。 >>128 >-(1+2)とか、1+(-2)とかにその定義で対応できる? 1+(-2)のパターンは意識していましたが、-(1+2)のパターンは忘れてました。 きちんと考えなおしてきます。 >>130 試しに四則演算のみ行う言語をjavaccで作ってみたけど単行演算子程度ならLookAheadいらないよ いろいろ考えているうちに構文規則がおかしなことになってきました; とりあえず負の数やかっこを含む数式の構文木を一通り考えてみたつもりなんですけど、 以下のような感じであっているでしょうか? http://fast-uploader.com/file/6973521373227/ また、他に欠けているパターンはないでしょうか? >>133 あれは構文木と言うより抽象構文木というか内部構造と言うかそんなかんじのものですね; 負の数をどう計算するか考えてたらその式や数字に-1をかければいいかなと思って作ってました。 今度はきちんと抽象じゃない構文木を考えます。 はい。 とりあえず自分がわかっている範囲で -(1+2)*4 の解析木を作ってみました。 http://fast-uploader.com/file/6973604307310/ enzan番号という名前はやめてみました。 空欄部分は下位置調節のためや何を入れたらいいかわからない部分です。 構文規則作ってみましたが、選択の衝突が消えません。 tasuhikuのkakewaruをkakewaru2に変えると消えます。 kakewaruで呼んでるminusの[<HIKU>]がtasuhikuの<HIKU>と競合しているのかと思いましたが、 なぜなのかわかりません。 どこが間違っているでしょうか? 警告なのでとりあえず無視してjavacコンパイルして解析&実行させてみると、以下の式はきちんと実行できました。 1+2+3 -9-3 1+2*3/4-5 7+(-2) -6*2 -(1+2)*4 (-1+2)*4 -1+2*4 4-(-2/5) -(-(-39))/13 一応ある程度のパターンを網羅していると思います。 Warning: Choice conflict in (...)* construct at line 608, column 9. Expansion nested within construct and expansion following construct have common prefixes, one of which is: <HIKU> Consider using a lookahead of 2 or more for nested expansion. void tasuhiku(): {} { kakewaru() //608行目 ((<TASU>|<HIKU>)kakewaru2())* } void kakewaru(): {} { minus() ((<KAKERU>|<WARU>)sikikakko())* } void kakewaru2(): {} { sikikakko() ((<KAKERU>|<WARU>)sikikakko())* } void minus(): {} { [<HIKU>]sikikakko() } void sikikakko(): {} { ("(" tasuhiku() ")" |atai()) } void atai(): {} { <SUUZI> } >>136 文法作るのはものすごく難しいんだよ。 同じ文書を受理する複数の文法が存在し、複数の間で優劣がある。 しかも、優劣を機械的に評価することが難しい。 「こいつを使えば簡単にできる」というようなソフトウェア紹介を見かけると 思うけど、そんな魔法の杖みたいなソフトは無いから。 そういうこと言ってる人は、付属してきたサンプルを動かして簡単といってるだけ。 信じちゃだめだ。 構文解析器の生成系を自分で作れるようにならないと文法を作れないと思っていい。 少なくともその程度の理解は必要。 まずドラゴンブックを買ったらどうかと思うんだが。 まずドラゴンブックを買う。 実際に作ってみる。 この作ったものは実用にはならないよ。 テーブルが大きすぎるからね。 それでも作ることが重要。 その後に、市中に出回る生成系を使ってみたらどうだろう。 俺はこの順番が良いと思うよ。 中身の動作を知らないと使えないって、ツールとしては下等だけど、 今はまだその程度の世界なんだよ。 >>142 そこが勘違いなんだよ。 JavaCCを使うにはJavaCCを作れる程度の知識が必要。 だからドラゴンブックが必須。 ドラゴンブックは決して読みやすい書籍ではないよ。 どうとでもとれる表現がいくつもある。 読み解きながら理解する必要があるので、結局生成系を自分で一つ書き上げる必要がある。 「JavaCCを使えば知識がなくてもこんなに簡単」的なことを書く人は 実はJavaCCを使っていないんだよ。 そこに騙されてはいけない。 文法を作るには深い理解が必要なんだよ。 簡単にできる方法はない。 誰か別の人にやってもらえばいいんだよ。クラウドソーシングとかあるじゃん。 荒らされてるんじゃなくて話題がなさすぎるから一人が専有してるように見えるだけだろ? >>143 >「JavaCCを使えば知識がなくてもこんなに簡単」的なことを書く人は そこまで言われたことはないです。 一番最初は文字列を自分で解析するところからやろうとしてましたけど、 パーサジェネレータを知ってからわたしにとってはそっちの方が楽だと感じています。 ここで質問したこと以外でも詰まったりもしましたけども、 もし構文解析ツールを1から作っていたらきっとここまでたどり着くまでにもっと詰まっていると思います。 >>144 すいません。 実はこれ卒業研究なので・・・。 自分で作ってみたい→卒研のテーマに悪くないよね? な感じで決めてしまったテーマです。 >>145 連投とかしすぎましたかね・・・; >>146 まさか卒業研究の本体がなんの新規性もない構文解析なわけじゃないだろう。 それが本質的な部分じゃなければ人に手伝ってもらうのもありだよ。 もし、構文解析そのものが君の卒業研究なら…… 楽してでっち上げるという考えは即座に捨てて、143のいうようにちゃんと勉強して理解しな。 >>147 Javaの研究室ではありますけど、先生は構文解析などの経験はないそうなので・・・。 ゼミのときに負の数と引き算の問題も一応聞いてみたんですけど、 残念ながら大したアドバイスをもらえませんでした。 ちなみに、研究室ではネットワーク関連のことやってる人が多いです。 文法を作ることの難しさを理解できていないんだよ。 嘘ではなく、本当に難しい。 実用性は無くとも理論通りに動作する生成系を自分で作るのは絶対必要。 遠回りに見えるだろうけど、これが最短の道なんだよ。 「俺の考えた言語」の文法をきちんと作れるなら、生成系程度すぐ作れる。 その逆は無いよ。 何か考え違いをしてるんだと思う。 文法程度すぐ作れるけど、生成系を作るのは難しいと思っていそう。 まるっきり逆。 さらに言えば、理論通り動く生成系を作っても、それは実用性を持たない。 学習のために作るんだ。 実用には、既存の生成系を使うんだよ。 そういう順番が良い。 >>148 >>150 すいません・・・。 >>149 >>152 "こういうところが新しいです" と言える自信はありません・・・。 すいません。 一番の理由は"自分で作ってみたい"と思ったからです。 あと、先生に止められることもなかったですし。 構文解析が目的と言うよりは、半分ノリで付けてしまったテーマが 「初めでも使いやすい日本語で書けるプログラミング言語を作る」 なんてテーマです。 "日本語なら初めてでもとっつきやすいかな?"なんて安易な考えで 「初めてでも」なんてつけて付けてしまいました。 構文を考える上で自分で後悔してたりします; >>153 文法を考えるのも構文規則を作るのも楽なものではないと思ってます。 それよりも構文解析器を作るほうが難しそうと感じてしまっているのは事実です。 >>153 =154が優しく言ってくれてる あなたが本当に本気なら明日にでも図書館行って、ドラゴンブック借りるといいよ 難しいけど必ず価値はあるから 数学の知識もないのにアンチョコ片手にMathematica使えば何でもできると思ってるようなもんだな。まあ、無理。 >>156 プログラミングの棚にはなかったと思うんですけど、 とりあえず今日大学の図書館探してみます。 「ふつうのコンパイラをつくろう」の方は図書館にも置いてあったので。 ドラゴンブックは残念ながら大学の図書館にはありませんでしたが、 市内(他区)の図書館にはあるとのことなので取り寄せて読みます。 1万円ほどの本を買うには残念ながらお金がないもので・・・; 他に大学にあった以下のコンパイルの本び中でおすすめってありますか? コンパイラの基礎 / 徳田雄洋著 命令レベル並列処理 : プロセッサアーキテクチャとコンパイラ / 安藤秀樹著 コンパイラ入門 : 文法から設計・製作まで / 小田一博著 Cコンパイラ設計 : yacc/lexの応用 / A.T.シュライナー,H.G.フリードマン 著 ; 矢吹道郎 〔ほか〕訳 超並列処理コンパイラ / 村岡洋一著 コンパイラ / 疋田輝雄 著 DIANA入門/言語仕様/応用 : Adaコンパイラ実現のための中間言語 やさしいコンパイラの作り方 / 中西正和 共著 ; 大野義夫 共著 新言語作成の技法 : オリジナル・コンパイラ / 大貫広幸 著 N88日本語BASIC(86)コンパイラ活用法 : Personal computer MS-DOS版 / 肥田野登 著 コンパイラの技法 / 中田育男 著 コンパイラのうちとそと / 島内剛一ほか共著 コンパイラの設計と構築 / Arthur B.Pyster 著 ; 松尾正信 訳 コンパイラの技法 / F.R.A.ホップグッド著 ; 首藤勝, 関本彰次共訳 コンパイラ構成法 / 原田賢一著 コンパイラ : プログラム言語処理の基礎 / 井上謙蔵著 コンパイラ設計技法 : 理論と実践 / T. ピットマン, J. ピーターズ著 ; 今泉貴史訳 dBASE ・ PLUSコンパイラ & アセンブラ ゜ / 桑村幸雄,池端良一 著. -- 2版 コンパイラ・コンパイラ / 井上謙蔵著. -- 産業図書, 1970. Let's C(Ver3.0)プログラミングハンドブック : MS-DOS用Cコンパイラ / PMC研究所 編 やさしいコンパイラの作り方 / 中西正和,大野義夫 共著 Microsoft QuickC コンパイラ Ver.2.0 ランタイム ライブラリ リファレンス コンパイラ作成の技法 / David Gries著 ; 牛島和夫訳 コンパイラ / 中田育男著 文芸的なcobol+日本語ななでしこ? >>160 あるなら手にとって読んでみればいいのに アドバイスはできないすまん >>160 中田先生の本は良い本(というか国内で学者が書いてる数少ない本) 買うかどうかとは別に読んで損はしない。 先生は多忙なのか執筆が遅いので最新を追うとちょっと遅れるけど 中田本は結構いいね。でもドラゴンブックも読んどくべきだけどね。 ドラゴンブックに限らずあの手の堅い文章は頭に入りにくい >>162 > 先生は多忙なのか執筆が遅いので最新を追うとちょっと遅れるけど まだ執筆してるの? 最初に買った真っ白表紙のコンパイラなんて 30年以上前だったのに やさしいコンパイラの作り方と コンパイラのうちとそとは 読み物として面白い。 でもたぶん(今じゃ)なんの役にも立たないw >>166 2011年が最後かな 言語実装パターン ―コンパイラ技術によるテキスト処理から言語実装まで ってのをオライリーから共著で出してたはず でも一番読み応えあるのは1999年発行の コンパイラの構成と最適化 だと思う、この本はドラゴンブックと一緒に是非買うべきって言っても良い >>161 >文芸的なcobol+日本語ななでしこ? cobolやなでしこは使ったことないのでわかりませんが、 私は英語を用いた言語よりはわかりやすいと思います。 コメント文での説明が要らないかどうかは作るものによりますけど。 >あるなら手にとって読んでみればいいのに いろんな図書館に点々としてるそうで、 中にはどこにあるのかわからない図書館にある本だったりも・・・; ちなみに、上げた24冊のうち私の工学部の校舎にある図書館に絞ると3冊しかないそうです。 >>162 >>164 中田先生の本読んでみます。 ドラゴンブックの方も取り寄せが届いたら読みます。 >>167 面白いならその2冊も読んでみます。 >>167 > やさしいコンパイラの作り方と > コンパイラのうちとそとは > 読み物として面白い。 両方読んだ気がするが、内容覚えてないわ > でもたぶん(今じゃ)なんの役にも立たないw 色々な人を呼び込むと言うのも、重要な役目だと思う 誰か「漫画で読むコンパイラ」とか書かないかなぁ w まともにやる気あるなら、その中のどれでも一つ真剣に取り組めばいいよ。 迷うのはそれからでも遅くない CPUの創り方が萌えキャラで出る時代だから コンパイラ版が出る日も近いな >>168 共著じゃなくてAntlrの作者が書いた本の監訳だよ 正直ドラゴンブックって内容はともかく説明はとても優しいよね 洋書はIT系に限らず懇切丁寧な事が多いと思う 虎も仲間に入れてやってください サンプルがアレだが yaccの一実装書いてた人か。南無 https://web.archive.org/web/20080206191946/http ://d.hatena.ne.jp/kmori58/20060702/p3 kmyaccも有名だが、「LSI-Cの作者の一人」だった。 C++11の正規表現でCのスキャナーをスマートに書きたい。 しかし、コメントの扱いがややこしく、また、行番号の情報を取得する必要がある。 一行ごとに読み込むべきか、従来どおりトークンに切り分けて読み込むべきか。 全部をいっぺんに読み込んで'\n'でsplitする方法は実行時のメモリーと時間がかかると思う。 どういう戦略にすべきか? 改行に特別なトークンを割り当てて、すべてのトークンを読み 込んだ後でトークンに行番号をつけてから改行のトークンを取り除くという 方法についてはどう思いますか? マクロやインクルードは、プリプロセッサーがやってくれるよ 展開後の行番号の方がいらなくね? プリプロセッサ文てコンパイラ側でも処理するよね? #line とか SmalltalkのVM上にJavaVMを構築してんだけど、 VMの話もここで良いんだよね。 >>182 Cのスキャナって正規表現だけで表現できるんか?(構文解析しないで良いエディタのhilightingとかは大丈夫だけど) >>191 了解。 SmalltalkのVM上でDalvik VM用のclassも動かしたいんですが、 いちいちDalvik用のVMまで作るのがメンドイです。 Dalvik用のclass形式からJavaVM用のclass形式に変換するオススメのLibraryを教えて下さい。 Libraryの言語はSmalltalkに書き直しますので何でもいいです。 >>192 scannerってlexerの一部。 lexer=scanner+tokenizer >>193 JEBはDalvikのdecompilerだから、コンパイルすればJVMのbytecodeに出来る。 https://www.pnfsoftware.com/ C++で完結するって所に惹かれてboost::spiritを試してみたが…、これは死ねる。 共通部分式の除去のやり方がわかんねえ 定数伝播、四則演算も含む組み込み関数の畳み込み、使わない変数の除去、 ループ展開等を同じパスでやってるんだけど 共通部分式の除去とそれをやるのに必要な不変式の判定はまた別でやった方がいいのかな 不変式かどうかはループ最適化でも使えそうなんだけど混乱してきた >>198 ある計算式eについて、eの部分式を互いに参照するエントリーとして再帰的にテーブルに登録する。 登録するときにソートと重複チェックを行えば、テーブルは一意化できる。 テーブルの各エントリーの参照構造は、木構造のノードを成す。 >>198 式の属性に関する再帰方程式の近似解をニュートン法のように求めること、 これがデータフロー計算解法の本質と理解できてないんじゃない? ドラゴンブックのavailable, killedの説明の所読んでみれば? 同じパス内でループしながら収束するまで計算するのよ。 >>199 そのテーブルに式を入れるときその式が不変かどうかを判断する部分でわからなくなってくる >>200 ほとんど読んでないドラゴンブック見たら最適化部分についても書いてるな これ読むの辛いな 頑張って読んで出直すか 多分ちゃんと読んだ方がかえって早い。 共通部分式A,Bがあって、例えばBの方の除去をやると、 Bの到達性がAの到達性にも付与される。 このことは他の属性に影響を及ぼしうる。 よってもう一度計算をしないとより正確な属性を求められない。 以下ループ。 よって収束するまで繰り返すことになる。 変化がなくなるまで最適化処理を繰り返すのはわかった __declspecとか__attribute__などをパースできないと正確な構造体型のサイズ を求めることができない。しかしattribute周りの文法がメチャクチャやなあ。 次は"typed value"の扱いだな。定数にも型がある。型付きの値を 扱えなければ、正確な定数値を求めることはできない。 最適化なんてイラナイよね、何処まで処理系に依存する気なんだよw 初心者だがHSPって凄いね 自分でHSPみたいなの作ろうとすると途端につまづくw 内部でメッセージハンドルに登録していく言語だと思うんだけど こんなにwinを感じさせない文法でwinと親和性高く作れるとは ランタイムの機能の量で躓くならともかくあの文法でつまづくなら>>1 で概要把握して本読めば いただきジャンガリアンに辛酸をなめさせられたのだろうよ うーん初心者だから言い方わかんないんだけど コマンドプロンプトのスクリプトってコマンドに従って単に実行していくだけだよね でもwinだと実行されるのは素直に考えるとメッセージが来たとき cでウインアプリつくるときはメッセージ毎に処理を書くけど上から順に読むスクリプトは それはできないわけだからどう整合性取るのかなってことで悩んでた 結局メッセージ毎にリストがあってコマンドを読んだらそのリストに関数ポインタ名で追加、 メッセージ毎に呼ばれる関数はその種別のリストを上から順に実行していく こんな感じで作ったけどこれでいいのかな そりゃ文法じゃなくて実行モデルだな。 イベント駆動ってことでしょ。 「Cのコンパイラなら何日かかけて作っても良いが、C++は、一人で 作るのは嫌だ。文法をきちんとカバーするのに日数がかかりすぎるから」 と言われたよ。 javaに近い構文の言語をつくろうとしてるんだけど、 ようやくchar配列に変換したソースから関数の外側を構文解析できた。 山括弧<>、文字列リテラル、コメントに気をつけつつ、 なんとか関数の中を無視してクラス・変数・関数の名前や型名を取得して 関数の中身にとりかかるところ。 関数の中身は丸括弧()が難関になりそう。 AAAA bbbb = ((HHHH)cccc.dddd.eeee(ffff.gggg(), jjjj)).iiii(); bbbb.kkkk = -10/(8-3)-9/-3 >>217 最初はクラス名、メンバ変数、メンバ関数を全部調べてからじゃないと 関数の中身に取り掛かれないと思ってた。 でもクラス名・変数名・関数名に区別は不要で、記号をヒントに階層を分解して、 それから型名の存在の有無・整合性を調べるという風にフェーズを分けれそう。 でも()が演算の優先順位、型キャスト、メソッド...どれに使われているのか 区別できるかは不安。for文とかは最初に予約語が入るからやりやすそうだけど。 Person person = ((Factory)group.cache.getFactory(provider.getResource(), url)).create(); person.id = -10/(8-3)-9/-3; いまいち分からないけど、識別子の次にあったら関数呼び出しで それ以外は式とかでいけないの いけるか分からない。とりあえずやってみるってところ >>219 構文次第 てか、普通識別子に続くカッコを見て初めて関数/メソッドってわかるわけだし メソッドの中が上手くいかんというか何から始めたら良いのか分からん コンパイル速度が遅くなるけど、分解フェーズを何層にも分けて 何度もループで調べていけば良いのかな コンパイラの教科書の一冊でも読んで構文解析を勉強してみ C系のクソみたいな構文ルールをそのまま真似てどうすんの 自作なら作りやすいようにキーワード追加すればいいのよ キャスト式にキーワード付けなかったのは最大の誤りの一つ SSA形式からスタックマシンのコード生成の最適化みたいなのに参考になる文献ってないかな? >>224 そうだね。HaxeとかFlashからぱくって、C形式のキャストは無くしてみるわ int i = cast Integer ( 0.005f ); int i = 0.005f as Integer; 最終的に何を目指そうかしら 1)LLVMで動かす → 超難しそう 2)Luaのように組み込みスクリプトとして動かす → 重そう。メモリ管理は全部ウィークポインタで良いのかな (C/C++組み込みならnew&deleteするようなスクリプトでも良さそう) 3)JavaScriptなどに変換 → たぶん例外のバックトレースとかを変換するデバッグ環境が必須 コンパイラーの品質保証は、数学で証明する時代だ!!! Coqと数学でコンパイラーが作れる!!! http://compcert.inria.fr/compcert-C.html バイトコードインタプリタつくっているんだけど スタックマシンのコンパイラについて パラメータスタック(データスタック)はヒープ上におくべき? それともネイティブの領域におくべき? >>230 ネイティブスタックにデータも置くって事だよね? データスタックは分けておいた方がイロイロ楽だったので列挙 たしかこんなの GC使う様な実装の時の仕分け 実行パスがJITでコンパイルコードと非コンパイルVMコードの行ったり来たりするとき 例外のスタックトレース(これもJIT時のアレコレあり) チープマシンにVM仕込むときアセンブラで書くのが楽しい 最後はちげぇけど >>231 自分のVMは典型的なスタックマシンで パラメータスタック(データスタック)とコールスタックは別です。 そのうちデータスタックをヒープ内におくか アセンブリでかかれたほうのネイティブの領域におくかってことです。 ネイティブ領域においたほうが実際のアドレスとVM上でのアドレスの変換がないので 速度としては速いのですが 欠点としてバイトコードからスタックを参照することができません 焦点とてしてはそもそもバイトコードからスタックを参照することがあるのかということで、 基本的になければネイティブ領域におこうかとおもっています これまでつくった経験がないので設計としてどちらがよいかわからずお聞きしました >>232 > 焦点とてしてはそもそもバイトコードからスタックを参照することがあるのかということで、 バイトコードの設計は終わってるんじゃないのか? バイトコードの設計終わってりゃ参照の必要があるかどうかはわかってるだろうし、バイトコードの設計終わってないのに VM の構成考えてるならお前が終わってる 番兵の文字は utf-8でも16でも32でも-1でいいんですか? 動的型付けってLLVMだとどうやって実装するんだろ 構文解析+Cに変換して内部でgcc呼んでコンパイルするプログラムはコンパイラって呼んでいいの? >>238 変換したCコードを出すならトランスレーターだけどバイナリまで出すならコンパイラーでいいだろ 凄いこと発見したんだけれどもΛの記号は上の尖がったところがルートで 下の二つの棒が辺を表しているんだな 言語非依存の仮想マシンっていうアイデアがいまいち大成功していないように見えるのって なんか理由があるのかな。 落ちてたllvmスレを立て直した 【最速へ】LowLevelVirtualMachine 2【LLVM】 http://peace.2ch.net/test/read.cgi/tech/1439992758/ >>242 めちゃくちゃ成功してまんがな。LLVM,clang知らないの? >>244 実際に成功していても成功していないよ・う・に・見・え・るって話じゃないの? XCodeのコンパイラがllvm,clangだってのは開発者にしか見えないしclangの話だけ聞いているとgccが組み込み機のCPUに対応してたころみたいに派手に活躍してるとは感じられないって事じゃ無いの? たぶん外国には、CASL2のような仮想アセンブラを使う、 情報処理試験が無いのだろう 2人の大学生が作ったLLVMに、Appleが飛びついた。 それで、Lattner はAppleに就職した 良く言えば新世代の輝き 悪く言えば発展途上の不安定さ さらに組み込みで言えばカバー範囲の幅広さは犠牲にされがち 将来性でメシが食えるのはごく一部 マルチメソッドを効率よく実装するにはどのようにすればよいですか? OOPの最も基本的な機能です 引数によって、メソッドが切り替わります 多態といいます マルチメソッドはオーバーロードでは無いです 一般にオーバーロードは静的ですが、 マルチメソッドは動的です >>251 > 引数によって、メソッドが切り替わります はい? clojureのdefmultiみたいな奴じゃないの? 多重ディスパッチのニッチな要求に応えるものか それとも単純な動的バインディングだけの問題なのか マルチメソッドはC++相談室を検索すればなんなのかがわかる 中間言語の設計に関するノウハウとかアンチパターンとかが書かれた本誰か知ってる? LLVMとかP-codeとかJava VMとか、あるいはKnuthのMIX/MMIXみたいな機械語に近いレベルの言語を ソフトウェア実装すること前提に設計する場合について知りたい。 今言語設計してて、そろそろ構文解析できそうだから学んでおきたいんだけど。 最初はネイティブに落とした方がいいぞ 中間言語とか遠回りしてたらアホみたいだぞ そんな物他人に教わるくらいならおとなしく既存のを使っとけ 本として出して需要あるか?もしかしたらサーベイ論文なら探せばあるかも >>262 素直にコンパイル出来ない言語を設計してるので(clispのような)、snippetの表現をx86/amd64表記にする意義が薄いんですよね。 >>263 凝り性なもので。 >>264 一応ciniiは一通り眺めたけど、中間言語の設計に関する論文って無いんですよね。 素直に「中間言語」で調べると自然言語の翻訳に使う方が大量に引っかかってつらい…… >>265 動的型付け必須系? ならErlangの論文とか資料あさるといいかも >>266 swiftのように演算子をユーザー定義出来て、 c++のように同名異引数の関数を定義出来て、 Lispのように引数間のカンマが要らず、 Rubyのようにカッコを省ける そんな言語を設計中です。 それらの両立のために実行中に文法を書き換えて構文解析器を再構成するという手法を採ってるので、コンパイル出来ないんですよね…… clispのリードマクロを文脈依存に拡張したものだと言えば大体あってるかと。 ちょっとErlang関連の資料を見てみます。 >>267 列挙してあることはシンタックス上のことで全部コンパイル時に静的に解決出来そうに見えるけど無理なの? >>267 コンパイル時の都合だよね? VMの設計とはなんの関係もなさげなんだけど >>268 今考えてる言語では、演算子の扱いが関数を引数の場所に関して一般化した第一級オブジェクトなので 前置引数の個数や後置引数の個数は実行してみるまで分からないので コンパイル時の識別子を用いた構文解析は無理です。 前置演算子と一引数関数が別物って変だと思ったのでそうしました。 c++風に書くと、こんな感じのが通るイメージです。 g = [](a,b){return a - b;}; if (複雑な式) { f = [](a|b,c){return a + b + c;}; // (a|b)で前置引数としてa、後置引数としてbと示すものとする。 } else { f = [](a,b|c){return a + b + c;}; } // gは2引数演算子、fは3引数演算子。 // ここではgの優先順位はfより低いものとする(c++での表現方法が無いので)。 // カッコやカンマを省いてある場合、上の条件のどちらが走っても構文上は受理される。 // 複雑な式の結果によって、これはg(1, f(2, 3, 4))及びg(f(1, 2, 3), 4)のどちらにもなりうる。 cout << (g 1 2 f 3 4) << endl; >>269 そういうわけで一度に全部読み込んでコンパイルしてから実行するという事が出来ないので、 折角だからVMも設計しようと思った次第です。 ASTから中間言語に落とすとcontinuationの実装が楽になるので。 g 1 2 f 3 4は構文解析後にはどういうツリーになっているの? フラットなままで構文解析終えて実行時にまたプチ構文解析をするの? >>271 字句解析でばらばらにしてLL(1)でカッコの対応等について解いた背の低い木にして、その後実行時にLR(1)で式毎に再度解析するので > フラットなままで構文解析終えて実行時にまたプチ構文解析をするの? これであってます。 おもしろい事かんがえてるなー ElixirとかBEAM-VMとか参考になるんじゃねぇの? >>273 高信頼・並列分散に特化したVMのようにあちこちで言われてるみたいですね、ErlangのBEAM-VM. そう考えるとLLVMは解析容易性特化、JVMはVM自体の実装容易性特化といった所でしょうか。 VMを作るなら何かに特化させるべきなような気がしてきました。 演算子に限定する意味は何だろう cout << (g 1 2 f 3 4) << endl; こんなの一見して何してるのか判らないしいっそ構文ごと第一級にすればいい そもそも実行時に構文解析機まで走らせる重い処理系って必要なのかなあ クロージャじゃあかんのかね >>275 今作ってる実装だと構文はhead, body, precedence, directionをキーとするオブジェクトの配列になってるので 構文も第一級オブジェクトのインスタンスになっています。 説明不足ですんません。 コードは現在こんな感じ。もし読みたければどうぞ。 https://gist.github.com/pixie-grasper/d07388493204a5e370a2 debug-printが多かったりコメントが少なかったりしますが…… > そもそも実行時に構文解析機まで走らせる重い処理系って必要なのかなあ 必要性については私にはまだ分かりませんが、 私は昔レキシカルスコープもクロージャもポインタも継続もマクロも無い素晴らしく酷い言語(古いBASIC)で全てを考えていたので、 その経験から、どんな機能も使い慣れると必要になってくると思っています。 >>276 私馬鹿なもんで。 いいアイデアがあったら是非とも実現してくだされ。 >>275-276 俺にも意味があるようには見えないけど、俺の知らない用途があるのかもしれない とにかくわからないならスルーしとけよ >>277 絶対真似しないと約束するなら教えてもいいぞ >>279 じゃぁ真似せずに似たようなものを考えつくまで考え抜きます。 私馬鹿なので。 >>274 BEAMは引数のMatchで分ける処理がVMにあるんでそういう意味でオモシロイコト -> BEAM参考になるんじゃねぇのって話です >>281 調べてみました。 BEAMだと実行時にモジュール名、関数名、及び引数の数を指定して呼び出す関数を同定するんですね。 実引数の数がコンパイル時には分かるから命令語に引数の数を組み込めるのだと思いますが…… 今考えてる言語だと、実引数の数が自明じゃないので使いにくい気がします。 助言、ありがとうございます。 スクリプト型の言語って実行時にコンパイル(構文解析?)が発生するから、コンパイル型の言語より遅いのですよね。 では、アプリケーションの起動時にスクリプトを読み込んだ後のパフォーマンスは、スクリプト型もコンパイル型も大差ないのでしょうか? >>283 「スクリプト型の言語」やら「コンパイル」やらが何を意味してるのかにも依りますが、 よくある速度重視の構成だと、読み込み時に構文解析や意味解析、中間コード生成を終わらせて 実行時に中間コードを(1)実行可能バイナリに変換するパターンと、(2)仮想マシン上でエミュレートするパターンとの二通りがあります。 (1)の場合は変換処理そのものがそれなりに重く、 しかも高度な最適化を掛けるとそれ自体に時間が掛かってしまうので 最適化は殆ど掛けられずコンパイラ型言語の2〜3倍は遅くなりますし、 (2)の場合は1命令実行するのに命令を読み込んで比較してジャンプして、 とCPUがアナログ回路上で並列処理してる計算を逐次的に実行するのでかなり重くなります。 比較にならない スクリプトは柔軟性重視なので速度を出すためのチューニングは後回しにされる 起動時にある程度最適化できるものもあるが、 最適化のために数十秒〜数分かけたりもできない また実行直前にならないと決まらない内容も多く無駄になってしまう そもそもコンパイラ型で速度重視のソフトを作る場合は 開発者自身やライブラリがメモリレイアウトなど制御し効率を考慮したコードを書く(書ける) 自分でC言語っぽいスクリプト言語とかデータ形式作ってみたけど、どうだろ? ちなみにスクリプト言語はSC3_Compilerってのに入ってるが。 ttps://osdn.jp/users/mitubasa/pf/BuildContainer/files/ >>283 「スクリプト言語」の定義は難しいが、おおむね (1)(ユーザーから見て)明示的なコンパイルというフェーズを経ずに実行される (2)変数に型がない (3)実行時に行える処理の柔軟性が高い(例えば関数定義など) という特徴を持つ言語を指すことが多いだろう。RubyやPythonなど で、それぞれの特徴が、実行速度を遅くすることに貢献する。 (1)→ 最適化に時間を割けない (2)→ 実行時に、変数が指すオブジェクトの種類を調べる処理が毎回入る。 (3)→ これを実現するためにバイトコードインタプリタで実装されることが多く、遅くなる もちろん厳密な定義ではないので、あくまで「おおむね」という話。 Javascriptみたいな変態事例もあるし断定的なことは何も言えない 言葉の定義の論争は不毛 >>287 (一切実行せずに)サラッと眺めた感じだと 字句解析くらい生成系やライブラリ(flex++やboost::spirit等)に頼ってみたらどうかなってのはあるかな。 変数名としてnCount(整数,カウント)の代わりにixArg(添字,引数)を使うとか 細かいところは幾つかあるかも知れんけど、それなりに読みやすいと思うよ。 stdafx.cppって名前で使ってることは察したけど、VS使うんなら プロジェクト開くのに必要なファイル(.sln等)を入れるとか、 或いはMinGW/Cygwin/msys2なんかのUnix系ツールでさくっとビルドできるようにcmakeを書くとかしておくと 評価する人が増えると思うよ。 おれバカで不勉強だから知らなかったえけど、最近の処理系って状態コードのお持ち帰りをしてくれるんだね 手続きAを呼んだ直後にグローバルな状態変数に何がしかの情報が入ってる(何も起きなかったとか、フックして停止させるの推奨みたいな) 面白いな〜 データを加工して返すー>関数(関数内で処理のフローに関係する記述は禁止) 処理のフローに関係するー>手続き(状態コードを標準で返す) 複数個所使うで同じ様な処理をまとめるー>サブルーチン(スタックフレームの無いローカルな手続き) プログラムを組み上げるときの構造や構成に行儀のよい作法がないと プログラムのどの時点でどのデータがどの構成や状態にあるのか把握ができなくて発狂するww で、なんでも記述できる自由度の高い処理系ほど読解困難な発狂プログラムが出来上がると クロージャのことかな・・・ 最初Smalltalkやlispの環境のことかと思ったけど (PEEK/POKEで)なんでも記述できる自由度の高いBASIC言語はいかがですかー 文字通りステートコードの事じゃね? Unixが何十年も前に確立してるけど # make && make install なんか意味不明なこと書いてすいません ステートコードで正しいと思います。 バカ正直に戻り値だけと思い込んでいたので さっき、vs2013のc++起動して、構成プロパティでx64とアセンブラコードの出力に設定して c++の入門書を買うか悩むこと5分 lispの実装でググって15分 考えるのやめて現実逃避中orz 一番自由度の高いのはアセンブラ(当たり前だけど) ただし、全て自己責任(自由度が高い=自己責任ですよ〜) なんか、適当なスクリプト言語が作れないかなと >>299 「自由度」の定義は何?確かに「そのマシンで出来ることがなんでも記述できる」ならアセンブリほぼ一択だけど、 例えば「その言語のプリミティブと同等な機能を作れる」ならCommon Lispは自由度が高いし(マクロ最高!)、 或いは「その言語のプリミティブの機能を別な機能に変更出来る」ならTeXは自由度が高いよね(TeXの\endプリミティブが、なんとLaTeXでは違う機能に置き換わってる)。 例えば「その言語の文法を変えられる」って意味ならswiftやprologなんかは自由度が高い例になるだろうし、 仮にそれらの意味であればアセンブリ言語なんて自由度の欠片もない言語の一つになるよ。 適当なスクリプト言語が作りたいならHQ9+かbrainfuckか何かを作ればいいと思うよ という冗談はさておき、そのスクリプト言語で何をやりたいかによって色々変わってくるよね。 テキスト処理ならgrepやsed、awkやperlなんかは参考になるだろうし、 統計処理や数式処理なんかはRやmathematicaが有名所かな。 読みやすさ重視ならある意味ではCOBOLやBASICが、別な意味ではpythonやrubyが「読みやすさ」を重視した言語として有名だし とにかく簡単な文法にしたいならlispやpostscriptなんかが興味深い例ではある。 特殊用途向けの言語が作りたいか、汎用的な言語が作りたいか 汎用的な言語であれば手続き型か関数型か論理型か、関数や型はファーストクラスオブジェクトか、どんな文法か。 特殊用途向けの言語であればどんな用途で使うのか。 ノベルゲーム制作の補助向け(NScripter/吉里吉里等)なのか、文法記述用(regex/LR/PEG等)なのか、画像や構造を記述するもの(svg/postscript等)なのか。 >>300 丁寧な指摘ありがとうございます。 実際にVS2013をインストールしc++の入門を開いてブレイクポイントーデバッグーアセンブラの表示までたどりつきました 実際のアセンブラのコードを見て少し頭を抱えたしだいです int a,b,c; a=1; b=a/2*2; たったこれだけのコードのアセンブラ出力も、符号拡張命令後の処理の意味が汲み取れませんでした 取り合えず高度な目標はありません NanaTerryなるアイデアプロセッサを使ってみたらとても使い心地が良かったので これをシンプルな機能に絞って実装する、そんなプログラムやアイデアを綴るTEXTを扱うtoolを 作りだす為の仕様に絞って色々検討しています。 低機能なlispっぽいなにかになる予定 最近はcコンパイラの実装まで大学のカリキュラムにあると聞いたので凄く刺激を受けました 実際c++の入門などを読んでも言語の仕様に何等かの違和感があるのです こいつ覚えたての言葉を使いたいだけのワナビーだろ おそらくスレ違いなのにも気づいてないし相手すること無いぞ CでCを作るのと、アセンブラ使ってCコンパイラを作るのと、 どっちが良いかな? CでCを作る時間をCでXを作る時間に充てるのが良い >>1 デュエル・マスターズ Android版 ,i-OS版、公式 http://dm.takaratomy.co.jp/extra/dmapp/entrygate_ds/ デュエル・マスターズ対戦CGI ex https://web.archive.org/web/20150809154946/http ://www53.atwiki.jp/dmsuishinparty/pages/314.html デュエル・マスターズ(デュエマ)DM ONLINE 1.8a / VanGuard ONLINE 1.5a https://web.archive.org/web/20150809160254/http ://uhyohyohyo.sak ura.ne.jp/hsp.html ヴァンガード専用ネット対戦ツール【 VanGuard Online 】 https://web.archive.org/web/20150809155032/http ://kiimaa.jugem.jp/?eid=61 「カードファイト!!ヴァンガード」のネット対戦ができる公式オンラインゲーム「Cardfight!! Online」 2015年冬スタート https://web.archive.org/web/20150809153724/http ://supersolenoid.blog63.fc2.com/blog-entry-6886.html 遊戯王 Automatic Dueling System https://web.archive.org/web/20150809164855/http ://www3.atwiki.jp/ads-wiki/pages/20.html 遊戯王 デュエル・オンライン https://web.archive.org/web/20150809171527/http ://www31.atwiki.jp/vipdo/pages/15.html https://web.archive.org/web/20140628005202/http ://do.yugioh-portal.net/ WIXOSS WEBXOSS http://webxoss.com/about_en.html http://webxoss.com/DeckEditor/ BG(ボードゲーム)Engine https://web.archive.org/web/20151209080842/https ://bgengine.net/ https://web.archive.org/web/20151209172205/http ://14owl.hateblo.jp/entry/2015/12/09/011234 アプレンティス マジック:ザ・ギャザリング(MtG)オンライン化 http://homepage1.nifty.com/Q_Q/ap.html https://web.archive.org/web/20151202202725/http ://homepage1.nifty.com/Q_Q/ap.html 【 オンラインTCGエディター 】 >>1 ,>>306 デュエル・マスターズ的な非電源TCGの 《 オンライン化ツクール系ソフト 》 制作の企画。 例えば、ガチンコ・ジャッジを直ぐにでも導入できる機能を持っておりながら、 当面それを扱わず単純化させておいて、事後的に導入拡張する際に当該システムを ブロック構造の組み合わせで後付け挿入できるように予めシステム化してあるソフト(エディター)。 既存の非電源TCGを劣らずに再現できるならば大概のニーズに応えられる筈。 デュエマ、ヴァンガ、ウィクロス、ポケカ、デジモン、ゼクス、モンコレ、旧ガンダム・ウォー、ライブオン、ディメンション・ゼロ、シャーマン・キング、カードヒーローなど のシステムを完全再現できるように設計するけど、他に此のTCGの此のシステムは再現希望とか有ったら書いて。 マジック:ザ・ギャザリングの全システムを完全に再現するのは無理だから、此れだけは必用だ!って部分のみリクエストして。 WEB通信での対戦は、個vs個、多数乱戦、チームvsチーム、個vsチームを可能な仕様とする方針。 設計思想は 《 RPGツクール 》 が良いかな? 他に、優れたエディター有ったら挙げてみて。 個人や企業などのベンダーが提示する開発費(見積もり)で折り合えば、発注する。 ↓ エディター群から基本コンセプトを絞り込む(もちろんオリジナルで優れた新ネタが有れば導入する)。 ↓ 遊戯王OCGに関しては、タッグフォース、ADS、デュエルオンラインを発注先ベンダーに研究させる。 バトスピ、ヴァンガ、デュエマなど発売済みゲームソフトが存在してるTCGはベンダーに研究させる。 ↓ 各社TCGを再現するテストプレイ ⇒ 更に改良や修正。 ↓ 機能制限した下位版を制作しても原則として発売せず + 上位版デュエリ−グ用でサーバー稼動。 ↑ 下位版を仮に発売した場合の改造および商用利用には、別途で当社との契約が必要。 さ〜て、インド人ベンダーと日本人の翻訳兼PGを見つけよっと!ww http://wc2014.2ch.net/test/read.cgi/entrance2/1449623194/-18 >>304 BCPLとかCの生まれをもう一度考えてみると良いんじゃ無いかな? 凸記法で言語の生成を僕が読んだのはBit別冊の何かに書かれていたPlan言語の解説だったけど、ああいう記法って今は使わないのかな? ↑ある言語を生成するのに必要な言語処理系を凸と凹で組み合わせて表記してある奴なんだけど、アカデミックな世界でなんて言う方法かしらないのでこう書いてます。 乱数の発生のさせ方は、クロックを利用するものだけかな? 色々ありそうだけど、調べても良くはわからなかった。 時刻ではなく、プログラムを起動してから経過した時間を取得できます。それを種にする GetTickCount function システムが起動してから経過したミリ秒を取得 Retrieves the number of milliseconds that have elapsed since the system was started, up to 49.7 days. https://msdn.microsoft.com/en-us/library/windows/desktop/ms724408%28v=vs.85%29.aspx >>309 seedを何にするかって話? /dev/randomとか >>310 >>311 プログラムやシステムの起動直後に実行するコード、プログラムではほぼ似た値を使うことになってしまう。 >>309 ハードウェアのADコンバータ経由(アナログなノイズジェネレータからADコンバータで拾ってくる奴)で乱数作るとかもあるけど、計算機の乱数は種から一意に求められる様な物が一般的だよ で種(seed)の値に現在時刻をつかったり、ユーザの挙動(キー入力やマウスの位置)を素にしたりして見かけ上の乱数性を生成しているのが普通。 乱数表をあらかじめ組み込んでおいて、起動からの時間により、順繰り 読んで擬似的に乱数を発生させる方法はありかな? >>316 乱数表に見えるってだけで良いなら擬似乱数列使えばそれで済む話で わざわざ乱数表全体を組み込む意味がない 何でそんなに起動からの時間が好きなんだよw 女官じゃないぞ 大昔の光栄ゲーでは起動時に RETURN を叩いてもらってそのタイミングで乱数初期化してたw ユーザーのマウスの動きを、ミッキー単位で取得して乱数を...と 思ったら、プログラマはマウスを嫌がり、あまり使わないで tabキー多用する奴も多かったからな。別な手を考えた方が良いかな? なあ、今時のCPUはランダムデバイス持ってることくらいは知っとこうや 幾らくたばりかけてる爺でも なあ、全員が今時のリッチなCPUを使う訳じゃないことくらいは知っとこうや 幾らゆとりのアホでも CPUを明示して相談しなよ 知らんだけで乱数用のエントロピー生成命令持ってるかもしれんし IntelならOSがサポートしてなくてもIntel DNRG使えばいい リアルタイムで動画処理、画像認識、空間認識、音声認識その他諸々を全部やってのけるのって地味に凄いよな 時間あたりの消費エネルギーも、要求エネルギーが2000kcal〜4000kcal/dayとしてもおよそ100W〜200Wで非常に効率が良いし CPUで何でも出来るようになってしまったら、 マの出番はどんどん減ることになりそうだな。 大昔は、足し算と引き算は出来るのに、掛け算と割り算が出来ないのが 当たり前だったからな。30年くらい前のものだとな。 ランダムデバイスに頼るのが良いのか、迷ってしまいそうだな。 こういうのを読んでしまうと...。 ttp://cpplover.blogspot.jp/2013/07/blog-post_14.html ハードウェア乱数生成器は信頼できるか >>329 よくわからんけど生成された値を適当な鍵使って AES 暗号化するんじゃ駄目なの? OSを作る時の話になってるから適当な鍵をどこから持ってくるか熟慮しないといけない 一度に数十個の乱数を生成するコードを書き、重複チェックを忘れる俺は、 やはりマには向いていないのかもしれん。コード記述の時点で 重複することが頭から抜けていた。ついうっかり...。 >>329 自分の方が質が高いのを用意できるわけw 「ハードよりも、俺の方が正確に動く」と、 一度で良いから言ってみたい。 楽するためにプログラミングするのであるが 一向に楽にならず >>336 顧客が楽になっているだろw 裏でマが血のにじむような努力をしていることを、知る由もないからな。 70点じゃなくて55点で妥協すれば 費用が100分の1になるって教えてやれよ >>338 それは、「バグ入りソフトを出荷する可能性も高くなる」諸刃の剣では? 妥協するのは仕様でしょ 仕様で無理難題いうの辞めたら コストも下がるし品質も上がるみたいな けどスレ違いの話じゃね? 「妥協しないワガママな顧客」に、 「見積もりを二桁足して出したら、予想通り、注文が来なかった」 と言っていたな。最初から断る口実だったのかな。 >>338 66.66 点くらいで負かりませんか? >>342 それだと、100万円の費用を85万円に値引くのが限界では? C言語の呼び出し規約に関する文法に 詳しいサイトとかソースとかありますか? そこで言う呼び出し規約ってのは引数がスタックでどう配置されるかって話? C言語のABIは色々あるぞ 基本はcdeclかstdcallだけど スタック使わずレジスタでやりとりしたり 環境や処理系毎に異なる 上のcdeclとかstdcall辺りが関数の属性値として付くぐらいじゃないかと 文法的にはこれらは両立しないから複数書いたらエラーとかその程度でしょ それとgccの__attribute__())構文なんてのもある 括弧の中はもう何でもあり >>347 独自指定子、pragma指定、 FORTRANのライブラリ呼び出すのあったね 今はextern宣言か extern "C++"とか サポートされる種類は環境依存だし 構文は実装依存だから 規格では書いてない とりあえず wikipedia 見れば >>353 環境依存と実装依存ってどう使い分けてるんだ? >>354 実装であるgccはいろんな環境(プラットフォーム)で動いてる 構文はどの環境でも同じだが どんな呼び出し規約のライブラリがあるかは 環境ごとに違う 新しいコンパイラを作る際、わざわざ「手動でスタックを積み上げたり 開放したりする」命令は、あった方が良いのかな? メモリ節約や速度に直接、関係するなら言語仕様を作る段階で 考えるけどね。今のパソコンはスピードが速いから、不要といえば不要かも しれないが。 そのレベルならインラインアセンブラみたいな 抜け道を作るかどうかって話になるんじゃないの >>356 命令ってどういうこと? Cのallocaみたいなのを言ってるの 確保開放やらはSPレジスタをいじるでいいんじゃないかな・・・ SP変更時に無効なSP値だったらエラーにするとかその程度で コンパイラもよほど変な事しない限りpush/pop命令なんて使わんし >>356 言語自体の仕様にも依るんじゃないかな。 あと用途とか。 モノリシックカーネルのドライバ書くのに使いますーCとアセンブリの良いとこ取りですーってんなら 手動でスタック積んだり降ろしたりする命令も使うだろうけど いまいち用途がピンと来ない。 仮にllvm-irの使用を前提にするなら、ネイティブのスタック積んだり下ろしたりするのって意味あんの?っていう議論もありか? 言語仕様を練ってて シンプルな構文にシンプルな継続(のようなもの)を追加したら 全体的に美しさに欠ける感じになって悩んでる。 高級言語の側で、わざわざ、pushやpop命令を言語仕様に入れる必要は なかったか。メリットも予想ほどないみたいだな。 実行上で、スピードアップになるかと思っていたが。 メモリやキャッシュはレジスタよりずっと遅いからなぁ。 レジスタへのアクセスに対してL1キャッシュのアクセスには2〜3倍の時間が掛かるって言われてる。 つまり、レジスタ間mov命令に対してpush/popは1命令あたり2〜3倍遅いって事だ。 C言語のregister修飾子は知ってる?変数がレジスタに乗っかるようにする為の物なんだけど。 グラフ彩色で変数生存期間に対するレジスタの使用を最適化出来る事が知られる以前の産物だから、今は滅多に使われないけどね。 バイト列xからバイト列C(x)への変換器Cがあるとき、 Cの逆変換器C^(-1)を求める一般的な方法は何か? 変換器Cの変換の性質がbijectiveであるという条件をつけなければいけないのではないか。 変換器が可逆計算できるとは限らないから一般的な方法は無いだろ。 多少勉強すると、いまさらながら、Cがアセンブラにかなり近いレベルの 言語であることが、良くわかるな。 その分、マスターするのに時間もかかったが。 C言語をマスターしたって奴は絶対に信用しないことにしている >>371 「C言語をマスターしました」 という奴の化けの皮をはがすのは、意外に簡単だからな。 簡単な計算機プログラムを書かせるか、あるいは、ピタゴラスの定理の コードでも書かせるか。もっとも、そこで化けの皮がはがれるようなら、 とてもコンパイラの領域まで、進むことは出来ないだろうな。 コンパイラを書ける最低レベルに達しているかどうかの判定がしたければ 「入力された多項式を微分する関数書くならどう書く?」ってくらいは聞きたいけど。 C言語云々じゃなくてデータ構造とアルゴリズムの問題だけど、 Cでやるならポインタと再帰とラムダ算法について知ってなきゃ答えられない。 >>376 単純な多項式に限定していいなら再帰いらんでしょ 最終的に多項式に変換できる式と言うなら別だけど >>377 すまん 素で項数無限だったり微分不能な関数が入ってたりしないって意味で多項式って言っとったわ。 log(x^2+8*x)とかsin(kx+wt)とかも多項式(笑) 面接時「Cを三年ほど仕事で使っていました」 ↓ 採用後「誰だ。あいつを採用したのは!」 「最低、Cを仕事で三年間使っていること」 を条件に採用した会社で、こんなこともないわけではないからな。 本人の申告ほどあてにならないものはない。コンパイラ作成に到達する など、夢のまた夢。 他人の突っ込んだバグを直せるのが中級者 自分の突っ込んだバグを直せるのが上級者 それ以外は何の参考にもならない それ以外っつーとどんなバグも直せない奴か そりゃ確かに考慮に値しないな まあもともとCはコンパイラを書くには向いてないからな GADTとかある関数型言語で書くのが一番楽 あとコンパイラが糞になるのは大抵対象言語の糞文法と糞デザインのせい Rubyがなぜあんな巨大な糞なのかというと(お察しください 実用性を求められそれに応えるごとに汚れていくのさ ピュアでいられるのはお子様だからさ 残念だがルビーの文法とデザインが腐ってるのは初期からだw ∩___∩ ∩___∩ ♪ | ノ ⌒ ⌒ヽハッ __ _,, -ー ,, ハッ / ⌒ ⌒ 丶| / (●) (●) ハッ (/ "つ`..,: ハッ (●) (●) 丶 今、どんな気持ち? | ( _●_) ミ :/ MZうy ::::::i:. ミ (_●_ ) | ねぇ、どんな気持ち? ___ 彡 |∪| ミ :i ─::!,, ミ、 |∪| 、彡____ ヽ___ ヽノ、`\ ヽ.....::::::::: ::::ij(_::● / ヽノ ___/ / /ヽ < r " .r ミノ~. 〉 /\ 丶 / /  ̄ :|::| ::::| :::i ゚。  ̄♪ \ 丶 / / ♪ :|::| ::::| :::|: \ 丶 (_ ⌒丶... :` | ::::| :::|_: /⌒_) | /ヽ }. :.,' ::( :::} } ヘ / し )). ::i `.-‐" J´(( ソ トントン Darkなんちゃら… ソ トントン 優れた文法を手本とするには、どの言語が良いんだ? どれもこれも長所と短所があるし。 5色のうちからユーザーが好みのものを選べるのがいいんじゃないか 5色か Whitespace H9Q+ brainfuck Lazy K INTERCAL あたりの文法を参考に・・・・・・ フロントエンドとミドルエンドとバックエンドに分けてフロントエンドはユーザーが作れるようにしておけばいいんじゃないのか? >>388 言語仕様に「整合性がある」言語の事だが。 一長一短だからな。 でもテンプレートの奥深くみたいな訳の分からないエラーメッセージとか無しでな ミドルにエンドは無いと思うんだが、LLVMがそんな呼び方してるのはなんか意図があるんだろうか >>392 大概の言語仕様は無矛盾だと(=整合性があると)思うけど。 最強言語(キリッ でも標準ライブラリも効率的なデバッグの仕組みも考えたことすらありません そもそも文法がマトモにパーズできるようなものでないと 処理系がバグりまくる(C++やRubyの惨状を見よ) 静的型を用意するなら型理論に沿ったマトモな型システムでないと 処理系がバグりまくる(C++テンプレートやSwiftの惨状を見よ) オブジェクト指向と関数型の変な折衷をするとこれまた型が アレになって走査パスが増えて処理系が超遅くなる(Scalaの惨状を見よ) 人間が読めて、他のプログラムから容易に生成できて (これは文法が糞だと目も当てられない事になる)、 マトモな言語機能を持った言語以外を作るなと言いたい CやLispより退化してどうするんだ かなり昔の事だが、C++のANSI規格作成で、携わっていた委員の一人が、 C++の文法の一部を誤解して覚えていたことが発覚し、周りに苦笑された 事もあったらしいからな。 「言語仕様を作る側」の頭のレベルも念頭に置かないと。 それでなければ整合性には程遠い。 gccですら実装を見送る規格は止めてほしい CとC++の中間ぐらいの言語が欲しい プリプロセッサとテンプレートは採用で 名前空間付きC言語程度の言語つくってみようかしらん 特に目的はないけどこれなら作れそうくらいな動機で 前方宣言のことだよね? 名前空間のインターフェースみたいなのできたら面白いかも いや、多分、前方宣言じゃなく、前方参照のことだろう 前方参照でC++でもいまだにエラーとしてる理由って何だっけ 2パスを嫌ってる? でもC++って何パスもしてる気がするよね Java「クラスの外に宣言書けないようにすればいいのに」 3大OSで動くようにjavaでランタイム書こうと思うんだがポインタないのが不便だね C言語ソースに変換するほうが楽だと思うけどもう少し粘る LLVMの話はここでいいんだよな? LLVM+Clangを仮想Ubuntuでビルドしているが、かなり時間が掛かる。 三日間以上か。やはりC++コンパイラを仮想環境でビルドするのは無理があるのか。 実機なら数時間でビルドできるのだろうか。 >>410 仮装マシンの設定間違ってるだけじゃないの?(メモリ配分とかCPU割り当てとか、Networkドライブでコンパイルしちゃったとか) とりあえず関数の外側までパースしつつJVMのバイトコードを勉強してる helloworldするためのprintln()はどうやって作ればいいのだろう? >>413 JVM にはI/Oはない。 ネイティブコードのライブラリに投げる。 >>414 つまり最初にネイティブコードを呼ぶ仕組みが必要なのだろうか? 難しそうだし、暫定的に組み込み関数を標準APIとして用意するに留めたいなあ その組み込み関数=ネイティブコードのライブラリなんでは・・・ 何がしたいのか分からん JVM を呼ぶフロントエンドとグルーを作るだけなんでしょ 業務ソフト開発用のコンパイラと、ゲーム開発用のコンパイラは、 当然、分けて考えないとダメだよな? >>418 だめとは何が? 成果物によっては業務だと下手すると死人が出る ゲームだと下手するとクレームで会社が倒産する でもその成果物はコンパイラ以外にも色んな工程を経て作られたものだから 最終的にコンパイラが原因だったとしてもコンパイラやその開発者が追及を受ける謂れはない 例えばキミの作ったゴミコンパイラで死人が出たとして責任とれますか? 業務なら信頼性と生産性重視 ゲームなら実行時の性能重視 欲を言えばGPUのデバッグしやすければ勝つる つうか強みをわかりやすくバーンと出して後は選んでもらうだけだべ 30年以上前に出た、ゲームセンターにあるゲームは、 意外にバグを多く含んでいたんだよな。それを承知で、 みんな遊んでいたから。コンパイラのせいには出来ないだろうが。 初期のナムコ製品なんて、バグ発見と、それを悪用した点数稼ぎが やたら多かった。 支障のあるバグだけど修正困難なので放置されていた というのが正しい ゲーセンのインカムに影響するようなバグは回収されるはず 数年前にサ○ラ大戦のパチのバグで回収になって 50億の損害が出たとかあったな >>422 その頃のアーケードゲームはコンパイラつかってないだろ、8ビットでz80、良くて6809の時代でコンパイラはi8080向けの LSI-Cが出たか出ないかの時代だぞ >>423 サクラ大戦ってそんなに売上げあったん? 千円の物が百万個売れると10億なので ゲームの方も50億くらいはあるんじゃないの その昔、ナムコのゲーム開発部隊では、OSを作っていたのが二人いたそうだ。 苦心惨憺の末、ギャラガというゲームを作ったライトサイドプログラマー の大森田氏。一方、ダークサイドプログラマーとして名高い島岡弘氏。 今ではコンパイラ作りの情報はありふれているが、やはり、当時としては 相当凄かったらしく、一目置かれていたとか。 今だと、コンパイラ作るだけでは、誰も誉めてくれないからな。 中身を見るまでは、お褒めの言葉にも預かれない。 ヘイジャックども、英語の重要な技術文書をどんどん翻訳して WikiBookやGitHubに上げていこっぜ、ベイベー。 >>429 MSの技術解説部分も、昔は翻訳するのに制限がかかっていなかったか? そのためにVC++を使いこなすために英文マニュアルとの格闘に なって苦労したぜ。C++特有のわかりづらさと、英文マニュアルと、 初めて使う統合開発環境に戸惑い、ドえらく時間がかかった経験が...。 >>430 翻訳権ってMSDNにもあるんかいな。 いい加減、日本の著作権法にもフェアユースを 明記してほしいよな。 VC++のWindowsAPIの説明がわかりづらかったので、Delphiを使い始め たら、同じく日本語化がまったくされておらず、詳しい人に聞いたら、 「翻訳してはならない」と聞かされて唖然としたよw 今では、遠い昔の話だが。 「豊富なライブラリやツール群を用意した、高額のコンパイラ」と、 「格安のコンパイラだが、別売オプションのライブラリも用意しないと、 たいしたソフトは作れない」ものでは、商売上、どちらが賢いだろうか? 頭いい大学行くとコンパイラ理論とか習えたのかな? 独学してるけどさ、あらゆる犠牲を払わなきゃ理解、応用するまでいかなくない? コンパイラを自作するのは意味があるけど Cが引きずるクソ設計を知ったら二度とC/C++をつかわなくなるはず PascalのコードをCのコードに変換するプログラムを作れとかいう 何も考えずに出題されたとしか考えられない課題にはマジで困った まず、関数内関数とかCに無いですしお寿司 適当な名前付けてグローバルに放り出すとしても それだけではローカル変数のキャプチャが出来ないから どうすんだこれ?って感じで、まぁ引数で渡すしかないんだけど 課題提出までの時間も全然足りてないし、誰も出来なかった >>440 しかるべきところにぶち上げて資質を問うべき >>440 要するに p2c 作れってことだろ パクれとは言わんけどコード参考にすればいいだけ >>440 それ何日でやれと言われたんだ? 不可能では無いけど課題と言うにはレベル高すぎてビックリ 昔の事でよく覚えてないが、一か月ぐらいじゃなかったかね、良くわからんが 笑えるのが、そのソフトを作ること自体は前座でしかなく その後、作ったソフトを持ち寄って、レビューか何かをするのが本題の講義であって ソフトは皆で議論をする上での、ほんの話題のための「種」にすぎないってのがね よくあるじゃない、プロジェクトマネンジメントとかコードレビューとかの ちょっと実際のプロジェクトを模範した感じの、実戦風のワイワイガヤガヤ系の講義 あんな感じのやつだった これがコンパイラの講義の課題ならまだわかるんだけどねぇ どちらにせよ、プログラミング覚えたての学部生には酷な課題 二年生でC習って、三年生でいきなりこれ作れって、そりゃ無理ですって 普通にPascalのインタプリタ作るのだって、実力的にまだ厳しいのに そこからさらにCに変換しろだなんて いくつかのチームに分かれていて、チームごとに与えられる課題は違っていたんだけど 俺は最も簡単な課題が当たったから何でもなかったけど 関数内関数ってトランスレーター的には別に難しくないだろ 3日もあればできるんじゃね >>440 > マジで困った >>445 > 何でもなかったけど 痴呆症乙 誰も提出できなかったけど本題じゃないから授業は進んだってことだろ 大昔のMacはpascalでの開発を前提にしていたからな。 (Macツールボックスは、Pascalで呼び出しを前提にしていた) 途中からはCやC++用にツールは変貌していったが。 >>450 なつかしすぎるなぁ、light speed Cとか買ったとき「ああ、これでCで書ける」などと感動したわ C言語より動的型付け言語の方が先に広まってたって意外だなあ AppleのMPW。あるいはハイパーカード。 Think Cや、Code Warriorなど、一時は、Macで夢のようなソフト作りに あこがれた時期もあった。でも、遠い昔の話だ。 俺もアセンブラ→静的型→動的型の順で作られてきたと思ってたけど ジョブスの伝記漫画でウォズがアセンブラでBasic作る話があったような気がする 基本文字列だけでいいんだよ 型なんて文字列をどう解釈するかの話だよ もっとも愛着のあるコンパイラは、Quick BASICだった。 遠い昔の話。でも、凄く使いやすかったんだよな。 コンパイラの初心者本? 「Tiny BasicをCで書く」 出版社: ソシム (2016/4/22) ISBN-10: 4802610203 ISBN-13: 978-4802610209 関数の先頭にfunctionキーワードを付けるとして長すぎるから変えようと思うんだけど doとかjobではおかしいかなあ? >>460 fnじゃだめなん? Clojureだと(fn [arg] brabrabra)な感じ >>461 rustのfunc, iface, modとかもそうだけど省略形はいまいちだなと思う rubyにfor() do {}構文があるんだけど、それで関数やラムダ式の記号に do良さげかなと思うんだけどどうかな? コンパイラの醍醐味は式の展開だから、ここを自分で書ければあとはそれほど難しくないw 予約語テーブルに何を入れるかが難しい。 何でも詰め込みすぎると、肥大化しすぎたC++になってしまうし。 >>462 そうかなぁ? 一般名詞や動詞とかぶりそうも無い省略形ってコンピュータ言語には向いているとおもうのだ。 defunとかdefnとか 無名関数作るのにはUnicode圏が一般化した今ならλ一文字とか 略語もセンスがいるよな ところで、defunって何の略? どうでも良いけどλなんか変換しなきゃ出てこないし入力速度最悪だな >>469 > defunって何の略? DEfine FUNction じゃね? >>469 >>470 氏が書いているけどdefine functionの略だよ、common lispとかemacs lispとかでつかわれてる λ自体は”lambda”をテキストエディタ側で差し替えるとか一文字入力のマクロをバインドすればいいだけだと思うのだよね(IDE作り込みの一環) どっちかっつーとワタシの一押しは関数定義の宣言句に省略形を許せば良くない?ってだけなのでスレ違いではある。 letはconstの代わりに使う言語があるね 関数宣言にdoがないとなると色々と候補に悩んでしまうぜ job, fun, flow, verb, work, act(action) >>472 再代入を許さない言語だとletがconstと等価になるからじゃないのかな? >>460 関数宣言がfunction hoge(args)と言う形をとる事をやめて予約語(function)無しでも可能な感じはしないでもないのだけど文法に制限って起きうるかな? (Return型) function-name(Args....) とか function-name(Args):Return-Type 前者はCだし、後者はJScriptの宣言形式だけど、これじゃイヤな理由も思いつかない。 グローバル変数の定義とか外部変数定義とかのvar,static,externやら名前空間のnamespaceとかpackageとかimport等の特殊な予約語彙だけ文の開始から除外すれば後者の方法で関数は定義できると思うのだけど。 >>473 >予約語なくせば? 変数宣言でも関数宣言でも先頭に予約語が付いてIDEが色つけてくれた方が見やすいじゃない? もしくは関数宣言をすべて関数ポインタ(クロージャ?)のみにして、変数化してしまうか? var function-name = ->(args...){ ... } 基本的に、普通のブロックと、関数(クロージャ)との、区別をどうするかという問題が有るからね 普通のブロックは大体{ something }こんな感じだろうけど、これは呼び出しなしで即座に実行するのが普通 一方でクロージャは呼び出さない限りは実行されない 関数やクロージャなどを引数に取る関数が有ったとして func_name( { something } ); こんな感じに呼び出した場合、{ something }を実行した結果を関数に渡すのか { something }その物を関数に渡すのか、コンパイラはよくわからない func_nameの呼び出し引数の型がクロージャであることをコンパイラが分かっていたとしても { something }を実行した結果がクロージャになり、それを関数に渡すという可能性もあるのでコンパイラは判断できない そのため、明確にするためにfunc_name( function{ something } );のように 何か普通のブロックとクロージャを区別する文法が要るのだね そうこうしていると、Javascriptが出来上がる 結局function代替ワードが必要だと気付く ラムダ記号=>だと引数に使うときダサイもんね 新しいコンパイラを使うとき、「特有のクセのある」 のがグラフィック関数なんだよな。 個人的には、グラフィック関数も、ANSIで定めて欲しいくらい。 グラフィックなぁ b800:0000らへんを好き勝手に弄らせてくれるなら歓迎するのだわ # ネタが古いか 最近はいじっていないので、最新のツールはよくわからんが、 昔のツールでは、RGBの三原色を元に、すべてのグラフィックを 再現していたからなあ。今考えると、ずいぶん、原始的だった。 >>480 最新をよくわかってないのによく原始的だと解るね? シマノのギアの仕組みをよくわかってない俺にもギアのないママチャリは原始的だと思う 自転車に例えるなら車輪を回転させて走らせるのは原始的だったなぁって言ってるのが >>480 なんだけどね >>483 それはお前が勝手にそう思ってるだけ ギア付きのチャリより直結のチャリの方がより原始的なのはわかるだろ? >>484 ツールって言うのか何を示すのか、グラフィックっと言うものの範囲にもよる ディスプレイ表示機構に限定すれば RGB 以外のは見たことない グラフィックツールの話なら HSB とかの他のカラーモデルを扱えるものはあるし、プリンタは CMYK だし そもそもこのスレで長々引っ張る話でもないし >>485 RGBっていうコンピューターグラフィックス上で今でも最も基本的な部分を指して原始的って言ってるからギア云々は的外れって言ってんの グラフィック関数ってOpenGLとかそういうはなしじゃないのか・・・ >>488 だからそれってお前のちんけな知識で語ってるだけだろ w どういう風に対応付けるかなんて色々あるのに知識のない奴ってそれしか思い付かないから自分の考えが一番って思ってるんだよな 例えが悪いって言ってんのにどういう風に対応付けするかは色々って何言ってるのか解りませんわ。 >>492 > 例えが悪いって言ってんの お前かそう思ってるだけ って何回言えば理解するんだ? いや、お前こそが、そう思っているだけだろ 車輪の話は分かりやすかった どっちもどっち 下らんことでお山の大将になりたがるなよ 変な所を指摘したらお山の大将になりたがる猿呼ばわりか、めんどくせえスレだな エプソンのプリンターも当然、CMYKだが、 「純正を使わないと、すぐに故障する」 ような構造にしてあったよな? あれはハードの構造でそうしているのか。コードにも、純正な否かを 判断する部分を盛り込んでいるのかどうか。 エプソンに限らずプリンターは色の三原色持ってるのが当たり前 純正インク以外で壊れやすくなるのは単に質が悪いから プリンター本体は採算度外視でインクで儲けるビジネスモデルだったのに本体壊したら元も子もない プリンター本体も、五年もたって故障すれば、部品製造打ち切りで 修理不能で買わざるを得ないからな。キャノンはどうか知らんが、 エプソンはそうだった。とかいって、うちの勤め先の規模では、 プリンター市場に参入出来る資金力などない。 せいぜい、大手からおこぼれで仕事をもらい、コードをいじくるしか出来ない。 ずいぶん横道にそれているが、おまえらスクリプトつくってるのか? 誰がもこみちにそれているねん!! (´・ω・`)b >>502 スクリプト言語を利用してスクリプトを作っているという意味か? それとも自分でスクリプト言語の仕様決めて実装設計しているということか? >>505 後者の実装にスクリプト言語使っても問題はないんじゃなかろうか? 秀丸は、スクリプトを自作するときの参考になるのかね? 一応、役に立ったことは事実だが。 秀丸は、「作業の自動化スクリプト」を書くのに便利だからな。 その仕様を元にすれば、スクリプトを自作するのに役に立つのではないかと 思ったのだが。 「作業の自動化スクリプト」専用のスクリプトならgradleあたりが参考に良さそうだな ちなみに俺はantは好きだけどmavenは大嫌い まあ秀丸はテキスト処理に特化した 自動化スクリプトの参考にはなるかもね あれはスクリプトっていうよりマクロだけど しかし秀丸には、CやWindows APIの命令が、多数というか、 かなり含まれている感じだが。 そのまま車輪の再発明をしてしまうと 元の秀丸を使った方が便利だから 自作スクリプトを秀丸と差別化する必要はある そうか。秀丸に存在しない命令を考えなければならないな。 相変わらず手書きパーサー書いてるが、できるだけ1発でパースしつつ(LR法?) 外側から順に何度も段階分けながらパースする(LL法?)なコードも混じってる… 意味解析までたどり着くまでで力尽きそうw よほどの理由がないなら手書きなんかやめといた方が Bison GLR 使ってた時は不自由さがなくてよかった semantic predicate 機能は成熟しただろうか 手書きパーサー製作も残すは四則演算&関数呼び出しとなったが ツリーの形状はこんな感じで良いのだろうか? https://pastebin.mozilla.org/8868990 >>519 本よむところから始めるのはしんどいのでな・・・ 関数呼び出しだとこれでいけそう https://pastebin.mozilla.org/8868995 小さな計算でもツリーが深くなってnew()するノードの数がもりもり増えるけど 何かもっと良い方法あったら教えてちょ 手書きパーサなら 木構造にせずに操車場アルゴリズムかその亜種でLL(1)するのも手だぞ。 文法と文をそれぞれ入力したらテーブル作ってLR(1)するクラスを作るって手もあるけど 大真面目に書いてc++で500行〜1000行くらいにはなったと思う。 lexとyaccは、既存のものを使うべきか、自作すべきか、悩ましいね。 yaccは、やる気と暇があるなら どういう文法なら曖昧性が無いか、とか、shift/reduce conflictとdangling elseとは何か、とか いろんな事についてよく理解できるようになるって点で一度試しに書いてみる事をお勧めしたい 今までに俺が余暇でC実装した名の付いたアルゴリズムの内だとかなり難しい部類に入るけどな。 lexは文法全く固まってないなら使ったらどう?って程度じゃない? 割と簡単に使えるけど、同じくらいとは言わないものの簡単に自作できるし ASCII範囲の文字は簡単に指定できるけどUnicodeなんかに対応する為にカスタムコードを挟むなら普通に全部組んだほうが楽な事もあるし。 コンパイラを作るはずがコンパイラジェネレーター作りがメインになってしまう不思議 そして思うのだ コンパイラジェネレータを書くのに向いてる言語とは・・・・・・ >>523 そうだな。ここだけツリーにしないで、再帰関数で直接出力すれば良さそうだ バイトコードのテキストを読み込んだら バイトコードの1行と対の関係になる命令ノードを 行数だけ配列にして上から順に実行するイメージであってる? なんか構文木のまま実行するのと大して変わらない気がするけど メモリの節約とかどうなんだろう バイトコードのテキストってのが若干意味不明だが バイトコードならアセンブル(バイナリ化)しておかないか普通 a = b + c * d を二分木のASTで (st (ldptr local[0]) (add (ld local[1]) (mul (ld local[2]) (ld local[3])))) みたいに格納して、ポインタ1つあたり64 bits、ノード構造体のサイズが24 bytesと仮定して glibc mallocを使うことを仮定して全部で32 bytes * 7 = 224 bytesのヒープを消費する。 一方でレジスタ型VMを仮定して、簡単の為に1命令32 bits固定長とすると、例えば ldptr r0, local[0] / ld r1, local[1] / ld r2, local[2] / ld r3, local[3] / mul r4, r2, r3 / add r5, r1, r4 / st r0, r5 の7命令で与式が表現できるから、 配列の中身の長さが2^nに拡大されて予約される事を仮定すると4 bytes * 8 = 32 bytes これに配列の管理領域が2ワード16 bytes、 glibc mallocを使うことを仮定すると2箇所の領域の管理で2ワード16 bytes必要で 合計で64 bytesのヒープを消費する。 ただ、配列には配列の問題点と言うかでっかい領域を再確保するのが難しい事があるから 文単位ではリストや木を、式単位では配列を使うってのがインタプリタとしては良いんじゃないかなとは思う。 コンパイラ作りって、インタプリタよりも、10倍の労力がかかるよな。 この辺はlispやschemeで思索しながらやると楽なんだよ コード生成の方は関数型の基礎だけでもやってないとかえって遠回りに >>533 最終的になんで苦労してまで構文木をSchemeで生成するんだろう?っておもって結局そのままLispのMacroに化けるのである(割とマジで) Lisperが他の言語取得者のタメにDSLを組むことはあってもLisperはLispのママ扱う方がよかったりするのよね。 >>531 ありがたい。メモリが4倍くらい節約できるのね もしかしたら構文木のまま動かした方が動的ロードで 面白いことが簡単に実現できるんじゃないかと迷ってたけど(evalとか) パフォーマンスではバイトコードがかなり強力なのね >>531 >バイトコードならアセンブル(バイナリ化)しておかないか普通 たしかに普通は読み込み速度的にバイナリデータが望ましいのだけど、 手さぐりで試作するからメモ帳で読み書きできるテキスト形式でやってみるんだ lispインタプリタって一番簡単な実装(pure lisp?)だと何行くらいで実装できる? >>538 基本関数だけならものすごい小さいよ Lispが生まれた時代のマシンのメモリ量なんてアドレスのビット数が16以下だし。 行というかWin32で20KByteコアのそこそこ速いScheme処理系はCで作ったな 何行だったかは忘れたが数千行にはなる ライブラリやフレームワークにどこまで対応するかだと毎回思う 自作コンパイラでソフト作ろうとすると、やたらコアを吐くことに...。 >>542 selfビルド可能になれば普通じゃ無いの?>>core吐かせてバイナリ生成 匿名通信(Tor、i2p等)ができるファイル共有ソフトBitComet(ビットコメット)みたいな、 BitTorrentがオープンソースで開発されています 言語は何でも大丈夫だそうなので、P2P書きたい!って人居ませんか? Covenantの作者(Lyrise)がそういう人と話したいそうなので、よろしければツイートお願いします https://twitter.com/Lyrise_al ちなみにオイラはCovenantの完成が待ち遠しいプログラミングできないアスペルガーw The Covenant Project 概要 Covenantは、純粋P2Pのファイル共有ソフトです 目的 インターネットにおける権力による抑圧を排除することが最終的な目標です。 そのためにCovenantでは、中央に依存しない、高効率で検索能力の高いファイル共有の機能をユーザーに提供します 特徴 Covenant = Bittorrent + Abstract Network + DHT + (Search = WoT + PoW) 接続は抽象化されているので、I2P, Tor, TCP, Proxy, その他を利用可能です DHTにはKademlia + コネクションプールを使用します UPnPによってポートを解放することができますが、Port0でも利用可能です(接続数は少なくなります) 検索リクエスト、アップロード、ダウンロードなどのすべての通信はDHT的に分散され、特定のサーバーに依存しません 8 バイトコードのはずだったのに気づいたら 関数オブジェクトのツリーを作ってた なにやってんだ俺・・・ 自作ソフトの暴走はたまにあるが、自作コンパイラの暴走はヤバイよな。 それで別のソフトを作成した日には、最悪の結果が待つことに...。 function(機能)はrole(役割)にしよう flowとかprocと悩んだがroleが一番良いと思う 昔のC言語みたいに、floatとdoubleに分けるメリットは、 今の時代にはないよな? 役割っていうのは受動的な考え方であり縦割り行政的でありfunctionの適切な代替表現ではない roleは与えられた仕事をただこなすだけというイメージ このとき、与えられる対象、つまりデータやオブジェクトがあり 担当個所をroleするという感じ role ≒ class であり、role ≠ function 何にも縛られず自由なfunctionとroleでは思想が違う functionは立場や部署間を飛び越えて連携して機能するイメージ 胸熱であり、自分の仕事をこなすだけのroleなどと一緒にされては困る function( a, b, c, d ); a.role( b, c, d ); 例えば、日本は縦割り行政的であり、役人的であると言われ(role) 一方で、アメリカは横のつながりが強く、機能的だと言われる(function) このように、機能と役割は対立する概念として扱われている言葉であり、思想が違う 日本の映画やドラマなんかでよく 「それは自分の仕事じゃないのでやりません」とか 逆に「自分たちの管轄だから余所者は入ってくるな」とか 役割的発想は悪いことのように扱われるのが常 逆に主人公たちは部署間を飛び越えて機能的に行動すると決まっている もうちょっとプログラマ的喩えにしようぜ。 procedure=大域環境に対して参照と破壊をするもの function=環境を参照せず、戻り値は引数にのみ依存するもの closure=固有の環境を持ち、その環境に対して参照と破壊をするもの どれも意味が違う。 functionとroleはクラスとインスタンスくらい意味が違うと思う。 歯車でいえば 複数の歯車が上手く連携して動いている様を機能していると言うし 個々の歯車に着目してそれぞれが自分の仕事をしている様を役割をこなしているという 手続き的に時系列に沿って考えると 個々が役割を果たした結果、全体として機能がもたらされて、また別の大きな役割を担う・・・という風に 卵が先か鶏が先か、みたいなところがあって、双方の視点はどちらも重要で 同時に扱ていかなければならないわけだけど 区別して扱われる別の視点であり、function = roleとしてしまうのは単純にセンスないというか早合点 functionとroleの考え方の微妙な違いは非常に重要で 最初の出発点が違うことで資本主義と社会主義など、時としては戦争が起こる場合もある (つまりは、資本主義と社会主義は鶏が先か卵が先か、functionが先かroleがという思想の違い functionはまさに空気のようなもので、人と人をつないで機能させるお金を重視している roleはまさに人そのもの、その役割に主体を置いている) functionをroleと言ってしまうのは教養がないと言われても仕方がない 自分の思考が今何に着目していて何を考えているか把握しておかないと大変なことになる 頭がよくなりたければ囲碁が良い 囲碁は碁石そのものにも着目しなければならないし、碁石と碁石の境界にも着目しなければならない それぞれで見え方が全く変わってくるし、同時に考えなければならない 頭の体操に良い 「物」と「事」は別のものだけど、「物事」という言葉があるように同時に考えなければならないこともしばしば 関数ってそんなに抽象的な意味を持ってたのか インプット&アウトプット、リクエスト&レスポンスの手続きくらいに見てたよ 関数は二者以上の関係を表しており、二者以上の関係性が何か機能をもたらす というより、逆算して、機能をもたらせるように、二者以上の関係性を作るのがエンジニアの仕事 だから関数もfunctionだし、機能もfunctionという 電子部品だって、回路を組んで組み合わせなければ機能しない 「関」という字が示すように、関係性は何事においても常に重要で 数学や物理はすべて関係性を数式で表すことで成り立っている 「1」という数字が何か意味を持っているというよりは、「1」と他の数字との関係性が「1」自身の立場や性質を決めている 関係性は非常に高等で、目に見えないものであるが故、尊いものとされている というのも物事の関係性を紐解いたり、逆に利用できたり、機能的に考えることができる人は 当然、役割的思考も出来るものとされているから 役割的発想は馬鹿にでもできる アメリカが赤のことを悪とするのもこのためで、そいうった悪の思想から自分たちを守るために 右翼の人たちは「保守」と呼ばれる 赤の思想のほうが理解しやすく馬鹿でも少年でもわかり 簡単で広まりやすいので、自分たちの尊い考え方や社会を 守らなければ、占領されてしまうという恐怖感からある種過剰な防衛をしている 年を取れば自然と物事の関係性の重要さに気付くものだから基本保守になる そういったことを一通り分かったうえであえて福祉にも力を入れるというのが今の先進国のあり方 順番を誤ってはいけない 会社でいえば自分の役割しかしない人は指示待ち人間といわれ歓迎されない 一方で機能的に考える人は他者とのコミュニケーションを図り、関係を大事にし、目的を達成する努力をする 両方の考え方ができる人は機能的発想に加えて他者への配慮もするし、リーダー的 何事も一つの思想だけでどうにかしようとしないほうが良い 例えば「1」をオブジェクトとしてとらえるという、某言語のような考え方は全くする必要ない 数学の「1」にそのような意味はないし、全てをオブジェクトとして再認識して再構築する必要はなく マルチパラダイム言語で良い 1+2は単に1と2を足すという解釈でよく、1に+2というメッセージをどうのこうのという意味不明な再解釈はいらない 考え方を統一しようとする必要はなく、そういった偏った思想をしても良いことはない アメリカは自由自由いつも言ってるが、いったい何に対しての自由なのか、 どこを目指しているのかというと 自分が生まれながら背負ったroleから自由である、ということ この辺、人種差別の問題とか貧困の問題とかが出てくる 一方で、社会に対する自分の機能性のようなものは常に非常に重視される 要らなくなったらすぐに首を切られるし、厳しい とにかく機能機能機能機能、個人に対して厳しい、機能性のない人はいりません しかし、生まれ持ったroleからの自由はサポートしましょう その意味で、移民は受け入れる、ただし機能性のある人だけ >>553 ぼくの作ってるものは偽C言語でグローバル変数もあるから 定義的にはプロシージャが適切なんだろうな それでロールについてはもう少し考えてみるつもりだけど、 malloc()そのものがfunctionとして、malloc()を何につかうのかがroleなのかな けれど関数の多くはライブラリとかAPIではなく単なるサブルーチンのような気がして サブルーチンはロールだとも思うのよね 単に役割って意味なら、変数にだってそれぞれの役割があるよね。 最適化をサポートする機能を付けるのも、面倒だよね。 昔のVC++の売り文句が、「極限までの最適化」などとうたっていたが、 ビルドの時間も長すぎ、他の作業が中断...というオチ付きだったし。 神聖なるビルド専用マシンを他の作業に使うのがおかしい 現在だって動画のレンダリングする連中はそんな感じだろう ウチの勤め先には、ビルド専用マシンはなかったな。うらやましい。 GoogleにはGOMAって名前のビルド専用クラスタ(2〜300台くらい繋げた奴)があるってよ そして各チームは一台でも多くのマシンリソースを確保するため 他チームの保有区域への侵略に明け暮れているという >>565 クラウドサービス提供するぐらいだからマシンあまってんだろうなぁ 俺の予想では、Googleやマイクロソフトに太刀打ちできるIT企業って、 日本国内にはないような気がする。 社員か誰かが遊び半分みたいな感じで作り上げた「Googleパックマン」 には、参ってしまったからな。あれは凄かった。 >>568 日本どころか全世界でみてもAppleくらいしかいねぇよ DeNA/GREE ほほう dwango なかなか CookPad おもしろそうな DMM 話じゃないか 囲碁のSmart Go Formatというのをパースしたいのですが 読みやすいサンプルプログラムないですか。 RubyGemあんのか。 うまくいけば自分で書かなくてもイケるかも。 うちみたいに規模が小さいと、データセンターも活用するしか 手がないね。自前のデータセンターなど、夢のまた夢だ。 ビルド専用マシンがあるなら、テスト専用マシンもないとおかしいよね。 共にあるのがソフトハウスの標準なの? うちでは、とてもそこまでの予算をつけてもらえないのだが。 投資に見合うリターンがあれば普通は投資するだろう。 >>577 できたてほやほやの会社で開発が二人しか無い我が社なんかなんもないぞw awsをスポットで借りると割と安いビルド環境作れるからそういうの使ってるけど。 >>580 それじゃあ、資本金10万円の株式会社と、何ら変わらんだろww DOS全盛の時代の時は、「遊び半分で、コンパクトなコンパイラでも 作ってみようかな」 という気も起きたが、これだけ複雑怪奇なWindows全盛時代となっては、 もう手軽に手を出せるレベルじゃないよね。 遊びでコンパイラを作るなら、linux用なら、作れば誰か使って くれるかも...。 >>583 別にコンパクトなコンパイラのハードルは上がってないと思うが 無償でほぼフルセットの開発環境が入手できる今では意味が薄れた って言うのならわかるけど CとかJavaから呼び出す組み込みスクリプトなら需要ありそう javascriptトランスレータはHaxeがよくできてるけど作ってみたい >>356 Forth, Postscript「必要です」 言語仕様作成と、コンパイラ本体は自分で作り、 デバッガだけ外注して作ってもらうというズルはありえる? 高性能なツールにするには、かなり手間がかかると思うのだが。 デバッガってevalさえあれば簡単なものはできそうだが 高機能てなると難しいのかな その「高性能な」デバッガに何を求めてるかにも依るような。 不具合な動作が時々あるソフトで、たまたま高性能なデバッガに 分析させたら、ソースもないのに、分析されたソフト内部のソースを 画面に表示し、 「ヌル文字列を格納するための領域に、別の文字を格納し、領域を 破壊しています」 とか何とかメッセージを出した例まであるからな。 こういうデバッガは値段が高いだろ。 予約語テーブルに、どのくらい詰め込めば良いかが悩ましい。 あまり増やしすぎると、C++と同じ道をたどるだけだし。 てか、C++ って機能のわりに予約語は少ない方じゃね? 抽象関数に実装なし・マーカーとか、書けばわかりやすいのに、 func(){ } = 0 とか、意味不明なことをやって、キーワードを減らしている #include <PANAMA_PAPERS.Lib> main() { for(Datsuzei = 0; Datsuzei <= mugendai; Datsuzei++) } こんな予約語やライブラリがあれば、俺のお金も無限に増える はずなのに。消費税など、上げないでもらいたいよな。 お金が無限に増えたらジンバブエみたいになるぞ・・・・・・ ジンバブエってdoubleが桁あふれしたんだっけw? フリーのコンパイラって、信用できる? 遊び程度でソフト作るなら良いけど、フリーだとサポートも 期待できないし。 gccもclangもjavacもc#も信用ならんって分野ももしかしたらどこかにはあるのかもな gnuのように、ソースが公開されていてもやばい部分もあるのかな? 事故った時の補償の話なら先に契約で決めておくしかない どうしても必要なら補償付きのお高いメーカー製を使えばいい そこまで気にしないなら適当に人気のやつを選べばいい ただし最適化を強めにすると地雷を踏むリスクが高い ライブラリとかOSとかに比べればコンパイラ自身のバグは極めて少ない ただし最適化を強めにすると(ry 最適化有効にしてバグるのも大抵そのプログラムのバグだから >>605 有料でもサポートしてもらえる範囲は限られてる 今考えたら昔のN88BASICも、実は凄かったんだな。 コンパイラを作りの前の基礎教養として、価値があると思う。 知識が多いほうが有利だし。 グラフィックライブラリは、やたら予約語の文字数が長くてウンザリ した経験があるな。わかりやすくコンパクトな予約語で良いのに。 昔のBASICは名前空間みたいな整理はされてなくて ライブラリに相当する部分も予約語として扱ってたんだよ >>613 高々COLORとかPOINTでしょ? PHIGS辺りのサードパーティライブラリと勘違いしてないか それともCLSに比べたら長いって話? パラメーターがダラダラ長いっていうのなら分かるんだけどな タートルグラフィック以前の設計で カレントペンオブジェクトって概念がまだないから Amazon で「Flex & Bison」で検索したらこんなの出て来て驚いた。 http://amzn.asia/2GvBmZs >>606 実際コンパイラはソフトウェア検証の好対象 CakeMLとか ☆ 日本の、改憲を行いましょう。現在、衆議員と参議院の 両院で、改憲議員が3分の2を超えております。 『憲法改正国民投票法』、でググってみてください。国会の発議は すでに可能です。平和は勝ち取るものです。お願い致します。☆☆ 僕の知り合いの知り合いができたパソコン一台でお金持ちになれるやり方 役に立つかもしれません グーグルで検索するといいかも『ネットで稼ぐ方法 モニアレフヌノ』 RSQUI esprima/escodegenなんかでJS ASTを扱ってる人に質問。 ASTを舐めて変数の型を推論したものをノードに紐付けて記録しておきたいんだけど、JS ASTの場合 ASTの中にメタデータをぶら下げるのと外で持つのとどっちが一般的なんだろう? 中に持つ場合はどこにどういうプロパティ名でぶら下げるか、外の場合はノードの位置を特定する パスのようなものが必要になるけどそれをどうするか。 お前ら元気か? Prologおじさんが2003年頃からPrologの人気がなくなったとか言ってたんだが、2chのせいではないかと思ってきてみたぜ。 めっちゃ過疎ってるじゃないか。というか2chいつの間にか5chになってたんだな。 Prologは操作的意味論をそのまま書き下して言語作れるので良いぞw % e.pl e(I, I) :- integer(I). e(E1+E2, I) :- e(E1, I1), e(E2, I2), I is I1+I2. :- e(1+2+3+4,R),!,writeln(R). :- halt. というファイルを作って $ swipl e.pl 10 だ。こんな短く言語実装できる言語は他にないぜw Prologなら型システムを作るのもお手の物だ。 t(I,int):- integer(I). t(E1+E2,int):- t(E1,int), t(E2,int). :- t(1+2+3,T),!,writeln(T). :- halt. これだけ。Prologは関数というか述語のネストをできなくして 述語の引数は全てクォートとされた式のように扱われ、 変数がアンクォートな感じに書ける。 故にLispのS式より複雑な優先順位付きの演算子を使った式が扱えて便利だ。 ってことで、暇な奴がいたら使ってみて欲しいんダゼ。 じゃあなw Prolog興味あるけどCとかJavaとかPythonとかのメジャーどころと違って教科書みたいなアカデミックな本しか見つからないから並以下グラマの俺には無理 岩波のprologのプログラミング作法読んでみたら? 第5世代が成果をオープンソースに出来ていればなあ インタプリタの作り方 −言語設計/開発の基本と2つの方式による実装− - インプレスブックス ttps://book.impress.co.jp/books/1122101087 バックエンドの作り方はググれば解説が出てくるが “実用的な”バックエンドの作り方はさっぱりわからない RX用のバックエンドが欲しいんだがなー double a = 2.71828; というコードをコンパイルするときに、2進浮動小数点数に変換しないといけないと思います。 2進数浮動小数点数に丸めるときに、四捨五入(0捨1入)したり、一番近い2進浮動小数点数に変換したりといろいろな方法がありますが、その方式を決定するのもコンパイラの仕事ですか? 計算機イプシロンを ε_M とします。 2進浮動小数点数に丸めるときの方式として、四捨五入(0捨1入)が採用されているかどうかを確かめる方法として、 eps = 2^(-52) 1 + (1/2) * eps を計算させて、それが 1 + eps に等しいかどうかをみるという方法が数値解析の本で紹介されています。 1 + (1/2) * eps を計算するときに、丸めとかで変な浮動小数点数になって、この紹介されている方法が実行できないとかないですか? あと、 double a = 2.71828 * 3.141592; というコードがあったとき、 コンパイラは、 2.71828 を丸めた2進浮動小数点数と 3.141592 を丸めた2進浮動小数点数を掛けよという機械語に翻訳するんですか? それともこんな簡単な計算はコンパイラで予め行って、その結果を a に代入するという機械語を生成するんですか? double a = math.E + path.PI; はい あります はい 場合によります(最適化という追加処理) read.cgi ver 07.4.7 2024/03/31 Walang Kapalit ★ | Donguri System Team 5ちゃんねる