【超高速】C/C++に代わる低級言語を開発したい 4
1 :
デフォルトの名無しさん :
2010/04/23(金) 08:50:46 70年代、Cは生まれ、それから30余年、現代においてもなお、低レベルなシステム開発に広く使われている。
しかし、2010年の今、もしもCが発明されていなかったとして、低レベルなシステム開発のためのプログラミング言語を
新たに作るとしたら、Cとは違う言語になるだろう。少なくとも、全く同じにはならないはずだ。
そこで、このスレッドでは、
低レベルなシステム開発のためのプログラミング言語
を一から考えたい。
既存の言語を使って何かをすることが目的ではなく、新たなプログラミング言語を考えることが目的であるから、
「既存のXX言語を使えばいい。」という類の発言は無意味である。
「既存のYY言語のZZ機能は、WWと言う点で有用だから採用したい。」という発言は歓迎だ。
現代の一流のプログラミング言語研究者が、最先端の研究成果を盛り込んで、
一から低レベルなシステム開発のためのプログラミング言語を作るとしたら、どのような言語になるだろうか、
という観点で考えたい。
◆前スレ
【超高速】C/C++に代わる低級言語を開発したい 3
http://pc12.2ch.net/test/read.cgi/tech/1271086841/
スレタイからC++を除け
4て 盛り上がってたんだな
4 :
デフォルトの名無しさん :2010/04/23(金) 17:04:26
このスレッドは天才チンパンジー「アイちゃん」が 言語訓練のために立てたものです。 アイと研究員とのやり取りに利用するスレッドなので、 関係者以外は書きこまないで下さい。 京都大学霊長類研究所
5 :
デフォルトの名無しさん :2010/04/23(金) 22:56:07
422* 名前:デフォルトの名無しさん [sage] 投稿日:2010/03/22(月) 20:49:29 それならCにできないけど低級言語に欲しい機能を挙げてみようぜ。 ・Lispなみに弄くれるマクロ - テンプレート - 正規化された構文(S式とか) ・Forthなみに弄くれる駆動レコード - コルーチン - 強制インライン展開(レコードを新しく作らないルーチン) - 駆動レコードへのアクセス ・実行制御 - 高度な並列処理(トランザクションとか) - アトミック操作 - リアルタイム操作 こんなもんかね? 他にどんなの欲しい?
7 :
デフォルトの名無しさん :2010/04/23(金) 22:58:15
個人的には(構文だけではないけど) - ブロックを明示しやすくて文でクロージャ作れるし{}がいいと思う - オフサイドルールはコードはすっきりするけど賢いエディタ前提で深さがわかりにくい - Cよりシンプルな構文が望ましいが別にC系でいいんでは - 演算子の再定義はスパゲッティ化しやすいから不要 - マクロもインラインとか定数型などの別な方法で実現可能なので不要 - XMLなんかは外でやればいいんでは - 勝手にデータを付加しないASN.1とかCの構造体的なメモリイメージと直結したデータ構造 - 動的型付け、GCや動的メモリ管理は明示的に利用を限定出来るならいいかも - その他のシンタックスシュガーは適度にアリ
8 :
デフォルトの名無しさん :2010/04/23(金) 23:08:10
◆新言語の要件 v0.1◆ (1)ハードウェアを直接操作する低レベルの記述が可能 (2)プログラマーが勘違いしてプログラマーの意図と違う動作をしないように言語仕様が直感的で学習が容易 (3)最新のオサレ機能が使えてワクワクしながらプログラミング可能 ◆主な要望◆ ・デバドラ屋だって、オサレ言語で開発したい! ・プログラマーの言語仕様の学習不足によるヒューマンエラーを最小限にするために、できるだけ小さな言語仕様にしたい。 ・組込み屋だけど、関数型とダックタイピングしたい。 ・shared_ptrの構文糖が欲しいな ・低レベル記述性(絶対条件) > 構文の美しさ(読みやすさ、学習の容易さ) > 再利用性(抽象性) ・算術演算以外の演算子は後置 ・割込み、例外、非同期IOとかを統一扱えるイベント機能が欲しい。
>>8 >割込み、例外、非同期IOとかを統一扱えるイベント機能が欲しい。
ここで言う例外はCPU例外だよね。
C言語の代替案を考えるのだから、この言葉で混乱したくないので
以降、CPU例外は、「CPU例外」、プログラミングの例外処理は
「例外処理」と書こうではないか。
10 :
デフォルトの名無しさん :2010/04/23(金) 23:19:54
>>9 > ここで言う例外はCPU例外だよね。
いや、新言語の構文・実装はまだ明確ではないが、既存言語のtry-catchに相当するものだよ。つまり「例外処理」。
「CPU例外」は割込みに含まれる。
それらを統一的に扱うことを考える。チャレンジングな試みだ。
このスレッドは天才チンパンジー「アイちゃん」が 言語訓練のために立てたものです。 アイと研究員とのやり取りに利用するスレッドなので、 関係者以外は書きこまないで下さい。 京都大学霊長類研究所
話が進まんしマイルストーン設置しようぜ まずPart10までに例外に決着な
全部決まるのいつになんの
じゃあPart10からPart15までは「全部とは何か」を決めるからな
17 :
デフォルトの名無しさん :2010/04/24(土) 00:56:05
> (def (sum ar n) (fn long (ptr long) int) 仮引数と仮引数の型が隣接しないってどんだけクソ言語だよw
デストラクタ欲しいなぁ。 自動変数がスコープから外れるときに発動する仕掛けが欲しい。
もう、C/C++ でいいじゃん
>既存の言語を使って何かをすることが目的ではなく、新たなプログラミング言語を考えることが目的であるから、 >「既存のXX言語を使えばいい。」という類の発言は無意味である。
もう、D でいいじゃん
「ぼくのかんがえたさいきょうのげんごしよう」を妄想するスレ
25 :
デフォルトの名無しさん :2010/04/24(土) 11:36:57
>>5 > ・Lispなみに弄くれるマクロ
> - テンプレート
> - 正規化された構文(S式とか)
先ず、これが欲しい。
僕の考えた最強の言語しよう
GAME言語があるじゃん。
JavaのようにIDE前提で、 とことんリファクタリング機能とかで楽できる言語がいいよ。
JavaがIDE前提???
実質そうだろ。 エディタ(Emacs含む)で書く奴がいるが、そいつらは変態なだけだ。 Cやらはマクロでトークンの置換とかヘタにできちゃうから、 リファクタリングツールを作成しづらい。
自分と違う人を片っ端から変態扱いするのはどうかと思うよ
IDEのサポートが無いととても書けない糞言語っていう意味だろ、合ってるよ。
長ったらしい命名基準や秩序が有るのか疑わしいライブラリ枝の膨張がIDE必須にしてるよね。
IDEも活用できない糞人間
windowsのメモ帳で書く俺は神
36 :
デフォルトの名無しさん :2010/04/24(土) 13:37:36
EmacsまごうことなきIDEですが。
windowsならサjyラエディタ
38 :
デフォルトの名無しさん :2010/04/24(土) 13:38:42
Emacs上でコーディング・デバッギング・コンパイル・パッケージングすべてできますね。 これを統合開発環境と言わずして何をそういうのでしょう。
クがjyになってでござる
>>38 じゃあ、Checkstyleやらリファクタリングやらはどうなんだろう。
クラスの階層を出せるだろうか、JARの中もきちんと検索できるだろうか。
もはやJava開発って↑みたいな機能ぜーんぶ前提で
動いているよなあ。(少なくとも業務系は)
42 :
デフォルトの名無しさん :2010/04/24(土) 15:44:56
IDEなしでも気楽に書けて、IDEの支援があればますます書きやすくなる。 新言語はそんな言語にしたいです。
LLですね
>>41 emacsではelispが動いているんだぜ。
できないことなんかないだろ。
秀丸では秀丸マクロが動いているが?
47 :
デフォルトの名無しさん :2010/04/24(土) 16:04:40
参照のせいでC++の関数呼び出しは可読性が著しく低下した。 Cでは、引数がポインタ型でなければ関数からの出力にはなり得なかった。 C++では、参照型の仮引数があるため、ポインタ型ではない引数であっても関数からの出力にはなってしまう。 下手に機能を増やすと使いにくくなる典型的な例だ。
>>47 実用とか互換性とかにばかり気をとられていると、
すぐにそういう問題を無視しちゃうんだよね。
だから教育用低級言語として開発した方がすっきりした物が作れるんじゃないかな。
あれだろあれ、なでしこ
>>47 その代わり、参照なら出力がNULLでないことを保証できるんだけどね
NULLを脱参照するような真似をしなければ
53 :
デフォルトの名無しさん :2010/04/24(土) 17:09:51
>>52 じゃあ、全プログラマーに周知徹底してくれ。
使える機能であれば、必ず使う人間が出てくるものだ。
そういう機能があるということがそもそも問題なんだ。
ポインタ使ったらNULLチェックが必要になって それをさぼってバグが入り込んだり そもそもNULLが渡された際の挙動が定義しづらかったりで 別の所でバグの温床になるだけだろ
ポインタ以外でも値域のチェックはするだろ?
自由だけど不安定か、不自由だけど安定かの問題だよ 後者が良さそうに見えるけど、ユーザーの不満は増える。その例がTeX
57 :
デフォルトの名無しさん :2010/04/24(土) 17:19:03
TeXのどこが不自由なんだ
とりあえずC++をリファクタリングしろww
もうTeXじゃなくてオフィスの数式エディタで良いやって人が増えるくらい不自由
数式書きたいだけの低脳の話かwwwww
問題はそこじゃないだろ 治安でも同じことが言える、単なる一般論 一般人を低能と切って捨てるのに新しい言語を作りたいって? そんなのお前以外誰も使わないだろうな
無い文脈は読めない。
じゃあ一つだけ言うけど、数式書きたいだけの低脳の話ではない
話を戻すけど、
>>53 辺りの流れに対して
自由だけど不安定か、不自由だけど安定かの問題だよ
後者が良さそうに見えるけど、ユーザーの不満は増える。その例がTeX
68 :
デフォルトの名無しさん :2010/04/24(土) 17:56:26
TeXのどこが不自由なんだ
TeXへの批判も知らない低能が新言語なんて作れるわけないじゃん
70 :
デフォルトの名無しさん :2010/04/24(土) 18:06:27
>>25 この辺って、低級手続き型高水準言語のCと相性悪い、
と思うんだけど、もう少し詳しく説明して欲しい。
あんまり知らないんだよね、S式のメリットとか、
プログラミングパラダイスじゃなくて、パラダイムが
まるで違って、テレコテレコになりそうな気もするんだけど、
S式のメリット、Lisp並のマクロとかは、別レイヤーの
話のような気もするんだけどどうだろうか?
あれば便利なのは疑いようが無いんだけど、rubyとか
やっぱり、そういうレベルの言語の話ではないのだろうか?
と思うのですが。
それじゃあ、TeXへの批判を議論するところから初めてみようか。
>>70 > この辺って、低級手続き型高水準言語のCと相性悪い、
> と思うんだけど、もう少し詳しく説明して欲しい。
別にCを作るわけじゃないんだけど、Cとの相性の悪さを説明する意味あるの?
>>71 お前、何が問題なのか常に見えてないんだな
何が問題なんだ?
75 :
デフォルトの名無しさん :2010/04/24(土) 18:13:42
>>47 だよね、const参照をデフォルトにして、書き換えの場合、
variableキーワードを追加って言うのが、理想だったよね。
CとC++にそういうのが多すぎると思う。
必要最小限の拡張というポリシーが破綻してきてるので>>1
なんだと思う。
自由度
わざとか知らんが全角は確かに低能に見えるな
>>70 Cのマクロは貧弱すぎるってことじゃないの。
確かに、実行時の処理を抽象的にし過ぎると低級手続きの記述がしづらくなるかもれないけど
もう少しコンパイル時に処理はいろいろ便利に記述できてもいいと思う。
79 :
デフォルトの名無しさん :2010/04/24(土) 18:21:12
>>72 C的な言語との相性の悪さに同意いただいて何より、
であるとするならば、アセンブラとの相性の悪さ、
と言うか、Lisp言語の一行が、アセンブラで数百行にも
数千行にも展開されていくとなると、これはもう、
低級高水準言語じゃなくて、高級高水準言語だと思うので、
CやC++に代わる、という当初の目的よりは逸脱してると
考えるのです。
もろちん、もちろん、そんなことはない、マシンコードをよりよく
扱うためにこそ、S式なのだ、という見解もあるでしょう、ただ
私は勉強不足なのでおよそそのようには考えられないので、質問してる
訳です。質問の意図を汲んでいただき、お答え願えればと思います。
Lispのマクロは子供の木を生成するだけになってしまっているから 親の木も書き換えられたらどうだろう
81 :
デフォルトの名無しさん :2010/04/24(土) 18:23:24
>>78 それは言語では無くて、リファクタリングツールの設計ですな。。。
Cのマクロがリファクタリングツールなのか、という議論は不毛だと
思うのでご遠慮させていただきますが。
>>70 ,
>>79 俺は
>>25 じゃないから、もともと書いた奴が
どういう意図で書いたかは分からんが、
マジレスすると、
>>25 には「構文」「マクロ」
つまり、コンパイル時の問題について書いてあるだけで、
「実行時に」S式のような、GC必須の動的なリストや木構造を扱いたいとは
一言も書いてないだろ
コンパイル時の問題なんだから、コンパイラが吐くプログラムが
低級か高級かといった問題とは全然関係ないぞ
>>75 C++は踏み台だったのだよ・・・
後続言語では out が導入されたが、
当時はそういう発想はなかったんだろう
outも汚い CのようなN-in 1-outな言語とインタフェースするときにはあったほうがいいが 多値リターンがあれば本来out引数なんて要らない
関数単位の例外処理もキレイに書けるシナー
87 :
デフォルトの名無しさん :2010/04/24(土) 18:47:42
>>83 どうも日本語が通じないようで・・・
だからS式導入の低水準高級言語としてのメリットを聞いてるんですよ。
>>6 は高水準高級言語は素晴らしい、そのうえ定式化されてるので素晴らしい。
と読めるのですが?
>>87 ・パースしやすい
・Lispの強力なマクロが使える
こんなものだろ
あ、こんだけ言われても まだ「高水準言語」とか言ってるってことは全然理解して無いんだな 馬鹿だろ リンク先読んでも理解できないんだからな 構文はS式だけど、構文がS式なだけでCと同じobjを吐けるんだよ
最初からS式で表されていると たとえば、for文とかがどういう木を持っているか、 とかで悩まなくて済むんだよね
91 :
デフォルトの名無しさん :2010/04/24(土) 18:51:45
>>88 だ==========か============ら
>>79 なので、ルビーが使いやすい、Lispが好きとか
言われても、議論にならないんですよ。
特に
>>6 はキチガイの戯言で、C++、と、テンプレートの
無い世界の話ですね。今の環境でC++とテンプレートが
存在しないことを前提にC言語の拡張を書いても訴えても
無意味なんですよ。2000年以降、こういう頓珍漢な話をする
文系が増えて無茶苦茶ですよ。
全角って馬鹿だな、まで読んだ
>>85 多値リターンと引数からのリターンには差があって、
多値リターンは常に何らかの値を返す必要があり、
引数からのリターンは(エラー時など)場合によって値を返さなくても良い
全て参照型ならとりあえずnull返しゃいいだろうけど
値型(特に構造体とか)があるならこの差はパフォーマンスに影響する
全角叩きしかしてない奴はなんなんだよw
95 :
デフォルトの名無しさん :2010/04/24(土) 18:54:25
>>89 だから、それはS式言語で、C及びC++に代わる。
じゃないでしょって言ってるんだけど?
最大の特徴は読みにくいってこった マクロスパゲティは食いたくない
LINQみたいなクエリ言語用意しようぜ
>>93 多値の複雑な型は返す場所に直返せるから
効率も稼げるよ
最近ならレジスタ数多いから数個の単純型もあんま問題ないしね
マクロも本体と同じ構文を採用すればいい _PRE_hoge{}みたいにプリプロセスであることを明示できればいい
>>99 C++ベースで考えると戻り値最適化は初期化でしか使えない
代入だと既にあるオブジェクトを破棄する必要があるから
102 :
デフォルトの名無しさん :2010/04/24(土) 19:09:02
>>100 マクロは捨てたいと思う。リファクタリングツールとして、
別添えで考えたい。
マジでマジで、今のC言語の問題の多くは
マクロが存在してることに有ると思う。
ヘッダーファイルの読み込みは、必要だけど、それ以上のことは
やってくれるな、とか思う。
ヘッダも必要ないよ
>>101 俺の目線はc++はダメダメ
低級言語ならその場に明示されてない動作はしないのが望ましい
コンストラクタ、デストラクタはもっと高級な言語でやるべき
105 :
デフォルトの名無しさん :2010/04/24(土) 19:17:13
>>103 JAVAの人とよく喧嘩するんだけど、ヘッダーファイルは
実装を見せない、良い仕組みだと思うんだけど・・・
ただ、嫌う人の言い分もよく分かる気がするし。
実装を見せないと言いながら、クラス定義でprotectedな
メンバーも、ちゃっかり見せちゃうし。その辺整理すると、
記述があっちゃこっちゃしてウザイし、もうヘッダファイルいらね
と言うのもよく分かるのだが・・・
Javaみたいに無くても大丈夫、見せたくないときは別添えで、
ってのもありっちゃ有りなんだけど。
C/C++に代わるって言ってんだし コンストラクタ、デストラクタ、代入演算子とか 考えてしかるべきじゃないのか・・・
>>105 ヘッダみたいなものはコンパイラが自動で出力すべき
>>102 リファクタリングはOOPが前提
アセンブラやCレベルでは不可能
マクロがなければ必然的にポータビリティが失われる
お前の言ってる仮想言語はCの代替にはなりえない
>>105 基本的に1度書けば情報量として十分なものを
2度以上のインクルードにも耐えられるように、
かつ、なんども書かされる作業は苦行なだけ。
110 :
デフォルトの名無しさん :2010/04/24(土) 19:21:56
>>106 に賛成。
後、戻り値に関しては、参照渡しの不透明さ(何されるのか分からない)
って問題を文法で解決するべきという話だと思う。
111 :
デフォルトの名無しさん :2010/04/24(土) 19:25:14
>>107 それは良いかもね、foo.cをコンパイルしたときにfoo.hが出力されて、
foo関数を使う人は、foo.hをインクルードするって言う事にすれば
良いかも知れない。foo.hはコンパイラ以外書き換え不可と言うことに
すれば、とても幸せになれるように気がした。
>>108 ポータビリティに関してはDのversionを参考にするといいよ
>>110 構造体は代入演算子を定義できず、
代入は単純コピーのみとする、
という風にクラスと差別化すれば・・・
って、C/C++だとクラスも値型だよな
継続できるようにしてくれ。
イテレータいやっほーい
値型にもnullを作ればいいんじゃない nullの代入は、何も代入しない事と同じ扱いになる、とか
ただし、単純型は除く 構造体とクラスのみ
エラー処理を考えると 戻り値は正否を表す値1つの方が便利なので 引数から値を返す方法はどうしても必要だな 全部例外に置き換えるとパフォーマンスに影響するし
スレ的にはちょっとズレた話になるけど null大嫌い nullableであることが必要でない場合も参照型にはnullを突っ込めてしまうので 型安全性にとっては有害以外の何者でもない 関数型のMaybeやOptionが正解
4値論理を導入しようか
C/C++ベースだとクラスも値型だから問題ない
オープンソースだから実装を見せないなんて論外
ついでにこの言語で実装されたアプリはGPL適用されるっていう事にすればいいんじゃね
>>123 じゃあコンパイルしたら
License.txtが自動的に出てくるっていうことにしよう
マジで作る奴なんかいないだろうからどうでもいいが 2chのライセンスはGPLのようなライセンスとは非互換だからねと 一応言っておく
そんなことしたらバイオハザードマークつくわ
GPLとかいうゴミなんか気にしなくて良いよ
>>81 「リファクタリングツール」が何のことかよくわからないが、
コンパイル時に処理するC++のテンプレートはリファクタリングツールなの?
そうであるなら、別に言語に「リファクタリングツール」という機能が入っていてもいいんじゃないの。
129 :
デフォルトの名無しさん :2010/04/24(土) 20:01:54
例えば、文字列をEUC_JPから、UTF−8に変換する関数だと
convert Parameter("EUC_JP","UTF-8") Source(euc_buf) Result(utf_8_buf);
とか、
>>125 言語の仕様は、著作権保護の対象外。言語仕様の記述は著作権保護されるけども。
2chのライセンスと称するものが法的に有効だという言質をどっかで取ってからまた来てね
>>130 ん?
2chの投稿規約に同意しないと書きこめないだろ
その時点で法的に規約に同意した、契約が成立したと認められるはずだ
現実に、基本的に2ch本の印税はひろゆきに行くだろ?
勿論その部分は書き込んだ奴にも流れるようだけれども
ところでこの言語は何で実装されるの?
開発者の情熱
134 :
デフォルトの名無しさん :2010/04/24(土) 21:59:07
実装の話は言語仕様ができてからでいい。
多値返しの場合、デフォルトアクセス方法は欲しいよな。 cの配列みたいに先頭のデータと配列の先頭を同一視するみたいな。 >102 マクロは必須だろ。cのマクロは捨てだけど。 マクロはむしろユーザーカスタム可能なコンパイラとして考えるべき。LispとかForthとかそんな感じだよな。
if (return, a, b = foo()) { a.hoge(b); } あゝ、邪悪
138 :
デフォルトの名無しさん :2010/04/24(土) 23:29:18
多出力だと、その関数の型を決められないから、1出力にしたい。 それに合わせて、入力も1入力にしたい。 さらにプログラムの流れは基本的に左から右にしたい。 以上を総合して、こんな感じにしたい。{}はタプル型。 func({in1, in2}) -> {out1, out2, out3}; タプル型の型チェックはなんかうまくやる。
低レベル言語のスレだよな 頭がLLなヤツらばっか
低レベル言語でもオサレな機能を使いたいんだからしょうがないだろ
関数型言語やlispマクロとか タプルとかが美しいか? 美意識の違いだな
隣の芝生なので
LL(笑)
144 :
デフォルトの名無しさん :2010/04/25(日) 01:16:32
変に意識して(笑)とか言って使えないより、道具として軽く使えたほうが便利だと思うけどね。
LLなんて適当に使い分ければいい話 粗大ゴミのC++を置き換えれる言語を考えようや Cは神言語だから無理
おまえらにVSでサポートされるような言語を作れるのかな
作れるよ。
VSてなに
じゃあ、明日の朝までによろしく
Vitual Studioに決まってんだろど素人が
ゴミクズか
なんかGoogleが言語作ってなかったっけ?
154 :
デフォルトの名無しさん :2010/04/25(日) 02:10:46
変に意識して(笑)とか言って使えないより、道具として軽く使えた方が便利だと思うけどね。
155 :
デフォルトの名無しさん :2010/04/25(日) 02:21:33
変に意識して(笑)とか言って使えないより、道具として軽く使えた方が便利だと思うけどね。
>>153 おやおや自己紹介ですか?
いくら低能でも、己がそうであるという事実を主張することはできるようですね。
あ、言葉が難しすぎて理解できませんか。低能ですからね。
では低能であるあなたにも分かるように言わんとすることを言わんとば、あなはた馬鹿だと言うことです、
、か。早く仕事が見つかるといいですね。
>>156 すまん。痛いとこだよな
やっぱ恥ずかしいもんな
>>108 お前の知ってる設計技術がオブジェクト指向しか無いからそういうんだろう。
はぁ、基本を勉強したことが無い土方叩き上げの連中は知識の幅が狭くて困る。 学生でも土方みたいな考え方の奴がたまにいるから困る。 そういうヤツに限って自分はプログラミングスキルが高いと勘違いしているから困る。
今日は自己紹介が多いな
せめて何か新しいことを提案するなら大学院の博士課程を卒業してからにして欲しいものだ。 それ以外の奴でもたまに広い見識を持った奴はいるけど、ほとんどがそうでないのだから、 言われた通り手を動かすだけにして欲しい。
自分に足りないものを見つける能力がないと
>>161 みたいになってしまう
とりあえずD厨とVS脳とIDE厨と電波がいないと始まらない
IDE要否はライブラリの善し悪しだから言語の式記述能力とは別問題。 IDE使用前提のシーケンス言語でもいいけど
LISPでCのマクロを書けるのはいい。 だけどS式でCのプログラムは書きたくない。 で、どーしたらいいんだろう?
ファイルの拡張死は何がいい?
複雑なマクロはオナニー lispだからこそ生きるもんだ Cでもinlineとconst enumで大半が不要だろ
マクロ低機能化でよければ 代入だけでもC形式にすればだいぶ小奇麗になると思うよ
>>168 ある意味正しいけど
一人ないし少数精鋭で使うならオナニーでも結構使いでがあるんじゃないの
構文木が弄れるLispマクロなら、例えばCのswitchがいやなら
自分で構文を作れるし
fp = fopen(name, "r");
if (fp == NULL) エラー処理
else ...
みたいな決まりきった手続きを抽象化した構文を自分で作れる
演算子オーバーロードの弊害が言われる中でそんな自由度追加しようだなんて
もしかしてLispのマクロが「そういうもんだ」と知らずに議論してたのかw
隣の芝生なので
JavaだってLispで言うようなマクロがないわけじゃあない。 ただ言語仕様に組み込まれているだけ。 たとえば、文字列の連結や、Enumによるswitch。 7だとStringによるswitch。こいつらはコンパイル時に別のソースコードに置き換わる。 ある文法構造をもっと平易な文法構造に書き直すようなことはよくあること。 ユーザが勝手にマクロ作るのも許すが、 基本的には言語のライブラリとしていくつか構文を用意して それを使わせればいいんだろう。
#define BEGIN { #define END } #define FOREVER for (;;) BEGIN ああ、すばらしい
Cのマクロはトークンの解釈しかしないから その程度が限界
自由度を無造作に増やすと可読性が落ちることがなんでもっと問題視されないんだろうね。
>>178 それが嫌なら
Effective (これから作る言語名)
でもすぐに出版してマクロの使い方を啓蒙するしかないな
啓蒙なんて時間がかかるものは無駄。 言語仕様でシステムとして制限するほうが即効性高い。
あのね、庶民はバカがデフォだから啓蒙なんて意味がないんだよ。 だからバカでもチョンでも使える物じゃないとだめなんだよw
>>178 可読性は関係ない
不要なものをわざわざ作るのは無駄だが、既に作った後なら特に問題視されない
今のCで言えばコンパイラやCPUの互換性向上のために使う位か 後は定数のdefineをasmとCで共用できるのは便利 175みたいにコンパイラに組み込んでしまうのは全く別な議論だし 入れる際に相当揉むのに、安易に構文いじったりするためのマクロなんて全く不要
JavaもC++から学習要素を排除して受けた面があるな。
>>182 こういうやつがC++でオナニーしてるんだな
バカでもチョンでも使えて バカやチョンが書いたコードはバカやチョンが強引にプロジェクトマージしてきても深い深いpackage-nameの奥へ自動的に追い遣られる言語がイイね 言語機能かどうか知らんけど
名前の衝突が困る人間なんてそうはいないのになんであんなに重要視されるのか不思議で仕方ない。
カメラで顔チェックしてデブサやバカやチョンが書いたコードは自動で排除 かわいい女の子が書いてたら俺んとこにメールするようなコンパイラが欲しいね
今のCマクロでいうと#define中で#ifXXで条件コンパイルしたい使いたいときはあるな
Javaを仕事で使ったことないんだが、リリース版とデバッグコードどう共存させてるの?
>>185 オブジェクト指向でオナニーしてると言えばいいのに
OOを擁護しつつC++だけ廃止するのは無理だよ
Cプログラマーは関数を特別のものと見做さない Lispプログラマーは構文を特別のものと見做さない それだけの話だ
>>190 基本同居。実行時も同居。
if(LOG.isDebugEnabled()){
〜
}
ただし、finalなboolean定数にtrueかfalseを持たせて
if(IS_DEBUG){
〜
}
なんてやれば、if自体はその定数にしたがって消滅したりするようにできたりする。
あとは設定ファイルでデバッグ用のコードをAOPさせたりとかかな。
だけとつけただけで強くなれた気がした15の夜
言語仕様で消えるほうが安心感あるな。バグも生むけどw。
>>192 lispに構文らしい構文なんてないからな
Cプログラマが構文を特別なものと見做さないとどうなります? C言語を1次元のトークン配列から1パスで構文木を作るとパーサが大きくなる。 Lispはトークン配列を一度リストとして読み込みマクロ展開したあと 構文木を構築するというように2パスになっている。 トークンはリードマクロで変更可能だ。 通常のマクロはリストを操作するプログラムで読み込み時にS式のフィルタとして働く。
>>193 ひでえ
それじゃデバッグ用に大きなライブラリをリンクするようなケースには対応できないじゃん
まあjavaごときで速度だのサイズだのを気にするのが間違いなのか
人は両極端を好む マクロを全く使いたくないか、使うとしたら最強のマクロを使いたくなる
>>198 Javaだとクラス単位でロードするから
ライブラリのファイルサイズはともかく、メモリ単位では関係無し。
クラスローダーが文句言わない範囲のリンクをすればいい。
>>201 Eclipseはあんだけ機能持ってれば重くて当然かな。
ほかの言語で実装しても正直重さは五十歩百歩になりうる。
ある種、富豪的プログラミングっちゃ富豪的。
このスレだと低級言語だから富豪的なのは禁止かな。
VM前提の方がいろいろとやりやすい事が多いんだけど、
たぶん近代的なOSで走るアセンブラに落とす前提だろうから。
> たぶん近代的なOSで走るアセンブラに落とす前提だろうから。 別にCトランスレータでもいいんじゃないの 「ソフトウェア作法」のratfor的な
分かった。アセンブラなのにC#みたいにGUIアプリが作り易い。これな
>>203 Cトランスレータ…
まるでC++の再誕を見ているようだ。
>>202 >ほかの言語で実装しても正直重さは五十歩百歩になりうる
そんな絶対に証明不可能なことを言い切られても
GC系の言語でかかれたアプリは、基本的にWindows XPとは相性最悪 貧乏性のXPは何かとワーキングセットを最小化しようとするが 一方でGCは非局所的にヒープを舐めたがるので、 GCのためだけにページが出たり入ったり ウンザリするような事態が引き起こされる
>>198 そこでeppの登場ですよ。
eppを使えば、javaをS式として扱ってプリプロセッサを書ける。
これ最強。
結局S式が出てくんのはさー ごくシンプルなルールで、木を簡単に記述できるからなんだよな そんだけの話 XMLは冗長だしね
>>207 他のOSはどうなの?
使われないけど参照は残ってるものはswap行きだけどswapからの参照だけはメモリ上にもある
ようなOSってあるのかしら?
>>210 ある程度は似たような問題はあると思う
XPが特に酷いのは、ウィンドウを最小化しただけで
ワーキングセットを最小化するような仕様だからだよ
windows 7 とかなら実は、.netに対応して世代別GCに対応したMRUが搭載されてたりして
>>205 Objective Cもだな
C++が出始めた時勉強のために
プリプロセッサ作ったりしたが懐かしい
214 :
デフォルトの名無しさん :2010/04/25(日) 18:41:58
>>129 がガン無視されて寂しいんだけど、関数の引数を別けて定義するのは
良くないかな?
関数定義
int convert Parameter(char* source_code="EUC_JP",char*) ←Parameterはデフォルトを定義出来る
Source(char*)
Result(char*)
{
}
使う方。
convert Parameter("EUC_JP","UTF-8") Source(euc_buf) Result(utf_8_buf);
>>214 新しく作る言語からは糞長い名前付けをする文化を捨て去りたい。
source_codeとか長いからsrcとかsとかにしろよ
C系の悪習を更に悪化させた感じだな
functionを関数と訳すなよな 今更だが ファンクションで良かったんじゃね?
>>214 名前付き引数で、「Parameter」だけは予約語ってこと?
220 :
デフォルトの名無しさん :2010/04/25(日) 18:57:56
>>219 やっとまともな人が来てくれた。
「Parameter」「Source」「Result」が予約語。
オブジェクト指向の多態の時にコンパイラが分かりやすくて良いんじゃないか
と思うんだ。Source以外は、省略可能と言うことで。
その程度の機能のために予約語3つww
222 :
デフォルトの名無しさん :2010/04/25(日) 19:05:06
>>221 いやいや、大切なことなんだよ、大域最適化の障害になってるから。
この引数はなんの目的があって、関数に渡されているのか分からないから
触れない。ってコンパイラの負担になってる。
Result以外は、その関数で変更がないって事はとても重要。
見た目にも読みやすいし、最近のGUI系のあの、山のような引数
どれがなんなのか、分からないし。一々関数のリファレンスに当らなくても、
ソース読んでるだけある程度その関数の動きが読める方が良いと思うし。
可読性と、コンパイラの最適化に有効なので、記述時のタイプ量が増える事は
払えるコストだと思うのです。
>>222 それなら、各パラメータにユーザー定義の任意の属性を付けられて、
各属性にコンパイラに対する情報を載せられるようにしたい。
さすがにその3つを予約後にするのは下品だし、オサレじゃない。
前スレでCPU固有言語にこだわってたヤツか?
この下品さは、そうだろうね。。
226 :
デフォルトの名無しさん :2010/04/25(日) 19:14:08
>>224 そうそう。俺それ。
>>223 そう言う反論は宗教論争なので、もう少し違った感じで。
例えば、ParameterとSourceの関係が問題になるとか、
そっちの頭の良い異論が欲しい。
低レベルプログラミングからも コンパイラ作成からも遠そうだし オサレ系でもないし 内容からして高校生位。。か?
>>226 定義もされていない「俺予約語」について頭の良い議論ができるわけ無いだろ
>>214 このコードが何を意味してるのかわからないんだが
戻り値はchar*なの?intなの?
>>214 仮引数の名前がないし、何が何だかわからん。
>>227 こう言うのは意外におっさんだったりする。
いっそ関数名には.exeをつけて オプションには/をつけて結果には>でいんじゃね
Resultは多値を使って返したらすっきりすると思う。 パラメータとソースはうーん。たとえば、オブジェクト指向ならオブジェクトがソースで パラメータは関数の引数にしたらいいのかなと。ソースが複数ある場合はコンビネーションメソッドみたいなのがあって このオブジェクトとこのオブジェクトにメッセージをこのパラメータで送って渡すみたいにするとか。 char* (char* src_charset,char* dst_charset)::encode(char* src_string) { return translate(src); } 文字コードオブジェクト2つにエンコードメッセージをsrc_stringで渡すという具合に。 使い方は char *rc = ("euc-jp","utf-8").encode("eucmojiretu"); という具合
全く意味不明
.演算子が泣いてるぜ
>>222 ParameterとSourceの違いは?
まずカリー化とかとは違うのかな
カリー化をしってる奴があんなトンチキなことを書くとは思えん
ネタ振ってくれるなーw でもちょっとユンユンし過ぎじゃね 彼にカリーさんは辛口過ぎるし
新しい言語の前にちゃんとC系をマスターして、 lispとhaskellとsmalltalkあたりを勉強してはどうだろう
243 :
デフォルトの名無しさん :2010/04/25(日) 20:06:47
>>239 カリー化と違うんじゃなくて、カリー化しやすくするってことに
つながる訳ですよ。カリー化しやすくなってると、大域最適化に
強くなると。
後悔関数
カリー化で大域最適化に強くなるなんてどこの宗教だよ
カレー板でやれ
247 :
デフォルトの名無しさん :2010/04/25(日) 21:01:07
>>245 例えば、文字コンバートで言えば、ソースコードの全域にしたがって、
EUC_JP→UTF-8の変換しかやっていなければ、それ以外の文字コード変換を
さっくり削除して、それに必要な変換テーブルもさっくり削除出来てで、
もっと言えば、その他の文字コードで必要な呼び出しとかスタック積み上げ
とかも全面的に削除して、そもそもEUC_JPという引数も、定数に変更して。
と言うことが可能になっていくんだよ。
で、カリー化は?
>>220 ParameterとSourceの違いは?って聞いてるんだけど。
250 :
デフォルトの名無しさん :2010/04/25(日) 21:08:20
>>249 >>226 で自分でちゃんと書いてるので、それに
そういうべたな質問かぶせてくる馬鹿に答えるメリットはないんだよね。
>>250 いや、引数をParameterとSourceで分けて主張した意味が全く理解不能だったので、
何か深い哲学的な意味があるのかと思って気になったから聞いたんだけど。
252 :
デフォルトの名無しさん :2010/04/25(日) 21:18:27
>>250 バカアホ言う前に、自分がちゃんとした文章書いているのかを一度見直したほうがいいよ
253 :
デフォルトの名無しさん :2010/04/25(日) 21:19:41
>>252 馬鹿に伝わらないように書いてるので。
まぁ馬鹿がタカルんだけど(w
×伝わらない ○伝えられない
すげーなこのすれw
Cの不満点を解消しただけのalternative Cで十分なんじゃないの? レガシーフリーのごとく過去のしがらみを捨てられればそれでいいよ。
こういう言語どう? 男=1 女=0 という変換するだけでコンパイルが完了する言語
>>258 性器の形を模しているので差別ではありません
>>251 CPU固有言語だぞ。哲学とか。。
主張?につっこみどころ多すぎて
観戦させてもらうわ
>>262 1から全部読んでるけど何の関連性も見つかりません
264 :
デフォルトの名無しさん :2010/04/26(月) 00:45:31
自分の特殊な表現が他人に常に理解されるとは思わない方がいいよ。 人と話をするなら出来るだけ一般的な表現をした方が誤解を招かずにスムーズなコミュニケーションが出来て自分も気分がイイはず。
id欲しいな
>>264 ダネ
彼はたぶん自分が言っていることすら
どういう意味があるのか理解していないんだと思う。
脳内に言いたいことがはっきり論理的に出来上がっているなら、
それを書くのに何の抵抗も無いはずなんだけどな。
開発したいであって、開発するじゃないのはなぜ?
開発しないから
269 :
デフォルトの名無しさん :2010/04/26(月) 10:50:48
ではやはりあげておくべきですね。
id? Objective Cのか?
271 :
デフォルトの名無しさん :2010/04/26(月) 20:52:54
さすがにそのクソ言語に学ぶ所は無い
こういう糞言語を作ってはいかん、という点が学べるのでは
273 :
デフォルトの名無しさん :2010/04/26(月) 21:22:16
たしかに。 既にCがあるんだからそれをベースにちょっといじってオブジェクト指向を載せてみようなんて事をすると、こういう糞になるという見本だな。 やはり新言語は1からしっかりと考えるべきだな。
じゃあまずObjective Cの悪かった点を纏めて行こうか
文法がキモい
C++とObjective Cは、同時期に世間で認知されだしたが、後者はジョブズしか使わなかった。
でもObjective Cのシェアがここに来て急上昇 結局モバイルで使える言語が今後の覇権を握る その点についても考慮しなければならんぞ
>>277 C#だな。ジョブズはFlashよりも.NETが怖かったんだとおもう。
279 :
sage :2010/04/27(火) 00:13:40
Objective C の悪い点は[]で メッセージ という拡張が中途半端すぎるという点。 その点を改善してるのがたとえば Vala なんじゃないか。 go もそんなかんじだけどGCが必須なんだっけ? Objective C のよい点はGCを使わなくてもよいところにある。
まちがった
heap管理の遅さとそれを管理しきれなかったから、GCが出来たんじゃ
// 式 function Exp(l,op,r){this.l=l;this.op=op;this.r=r} Exp.prototype.toString = function() { return "["+this.l+",\""+this.op+"\","+this.r+"]" } var powers = {}// 戦闘力表 // 読み込み処理 function read(str) { var arr = str.split(/\s+/) // 文字列を配列にする // 戦闘処理 function battle(power) { var result = arr.shift()// とりあえずの結果を取得 while (powers[arr[0]] > power) {// きごうの力が強ければ勝ち抜く var name = arr.shift()// 名前取出し var nextpower = powers[name] // 次の戦いで使う力取得 var nextresult = battle(nextpower) // 次の戦いを行う result = new Exp(result, name, nextresult)// 式作成 } return result } return battle(0)// 力0で戦闘開始 } // 戦闘力登録 powers["+"] = 10 powers["*"] = 20 alert(read("1 + 2 * 3 + 2 * 3"))
簡単な下降型の演算子順位法のパーサを書いたので参考にしてください。 これをいろいろ拡張してCっぽくすればマクロも作れるようにできるよっと。
>>279 2.0からGC使えるようになったね
ObjCはCと思うからいかんのよね
アレはSmalltalkにCのふりかけかけたもんだし
goはどっちかいうと(C+python)/2風味でGC有り。gccgoはまだ未実装
まあObjCに限らず今後はUIを含むような
Webやデスクトップのアプリ作る言語はGC有りでいいんじゃね
組み込みや制御系やOSなんかはCみたいな住み分けで。
このスレはCみたいなのを目指してんだろ
286 :
デフォルトの名無しさん :2010/04/27(火) 19:07:54
C言語の問題点。 1、コンパイラを軽く書きたいので色々端折ってる 2、軽く書きたいと良いながら、先読みが必要だったりする 3、軽く書けるので膨大な方言が発生し、それの取りまとめで仕様がボロボロ 4、機能の追加が必要最小限に留められているので、色々中途半端 C++の問題点 1、C言語との互換性を重視したので、記号が珍妙 2、追加、追加が多すぎて、なにがなんだか状態 3、オブジェクト指向の学識が高まるのと歩調を合わせた結果仕様が複雑 4、C言語の欠点を引き継いでしまってる さて、以上の欠点は総て、言語が生まれた当時はまだ分かっていないことや、 当時では無理だったことが、後年解決された事など、色々に理由があって、 単に順調に成長した言語だから発生したとも言える。 そこで、プログラミング言語40年の歴史から学べる知見を総動員して、 C言語的なプログラミング言語を過去の遺産にとらわれず、今、開発 するとすればどんな仕様になるのだろうか?という事。
でもお前らプログラミング言語40年の歴史から学べる知見なんて持ってねぇだろ?どうすんの?
せきねさんに頼もう
そうやって作ってるのがDじゃないのか
if(A){B} のAの部分に副作用を伴う式が書けてしまうのは混乱の原因にならないカナ
別にならない
292 :
デフォルトの名無しさん :2010/04/27(火) 20:06:44
>>289 DはC言語の部分は守るって言ってるから、系統としてC++を再デザイン。
いや、全然守ってないし
よく低水準言語の話で、自分でメモリ管理もできないヤツがどうのこうの、って言うけどさ 必ずメモリ管理するなら最初からあったほうがいいんじゃないの? メモリ管理しないほうがいいケースって具体的にどんなの?
何が、あった方が良いって?
メモリマネージャだのガーベージコレクタを「作る側」なのが低水準言語だから
過去のメモリマネージャの欠点にとらわれず、知見を総動員してメモリ管理する。
バッファオーバーフローを考慮しない標準ライブラリの話な
299 :
デフォルトの名無しさん :2010/04/27(火) 22:35:36
>>294 メモリー管理機能は当然あったほうがいいよ。
もちろんメモリマネージャだのガーベージコレクタを作るときには、その機能を使わずに作るだろうけど
低水準言語では常にどんな場合でもフル機能が使えるわけじゃないからね。
作ってしまえば、それ以外の機能を作るときに十分役に立つ。
>>286 Cの仕様のどこがはしょられていて、どこがぼろぼろなのかね。
かなり昔は方言もいろいろあったけど、今では ANSI C の部分は共通だし、独自仕様を使っているところはもともと独自でないといけないところ。
C++の記号が珍妙ってなんだろな。
ライブラリが肥大化しすぎているだけで、言語仕様自体はそんなに複雑ではない。(パースはしにくい)
301 :
デフォルトの名無しさん :2010/04/27(火) 22:46:40
C/C++ は enum とか完全に終わってるだろww 過去のしがらみで修正不能だしwwwwww
自動化すると修正不能だが手動でやれば融通がきく点が低級言語のメリットだな
Cのenum便利じゃん
歴史のしがらみ==自動化のしがらみ
「自動化」って何だ?
enumは0xで型付きにできる
enum は便利な #define としてあとからわざわざ導入したもの。
>>305 configure; makeとかuse strict;を使うこと
?
型付って何? いまでもワーニングでてた気がするが
enum定数に型をつけられる charとかshortとか
あまりいらないな。 intだけでもいい。あっても邪魔じゃないが。
バイナリで保存したい時にサイズが分からないってんじゃ困るっしょ
何の話?
sizeof
まるでcharやshortがヘッダやsizeofなしにサイズが分かるような口ぶりだな
そのためのstdint.hだろ
んなわけない
D言語はC言語のプリプロセッサは無くしてC++のようなテンプレートを導入し、 mixinでソース文字列をコンパイル時に生成したり、 さらに構文木までいじれるようにするとか何とか言ってたりしてます。 ただ、構文解析を楽にするための文法の変更とかはしてないJava,C#と同系統な発展になってますね。 javascript,ActionScript,haXe,Scala等は構文解析が楽なデザインになっているのではないかと。 それをもっと分かりやすくってことを考えると式を演算子で結ぶ式言語ですべて表せるものがいいのではないか? という主張をオレはしてるのですけど、手法がよく知られていないのか、まだないのか分からないですが、 分からないので手探りな状態で開発したいけどすぐには出来ないでいます。 B言語は動的な性質を持ってたように思うので、C言語を作る前にB言語を作る手法を考えるのがよいのかなと。 でB言語をjavascriptにするのか、javascriptをマクロを扱えるように式ベースにした言語を使うのか、 式ベースなpythonにするのかで、出来上がる言語の性質が違ってきますよ。 一度変えたら次のチャンスはまた40年後ですよってなると俺は生きてないかもしれない。 LispのマクロはCのプリプロセッサより強力でDSLはソースを短く分かりやすくする。 ということは知見の1つでしょう。 優先順位付きの演算子がないと一般には受け入れられないのも間違いなさそうですし。 ifの条件はbool以外はワーニングがいいでしょうね。
最後の行でいきなり細かい話でワラタ
式言語はろくなもんじゃない myはきたない文でletはきれいな式だとか馬鹿馬鹿しい
式言語って何?
式言語の人々 ○lambdaさん ○CPSさん ○IOモナドさん ○letさん
letはlambdaの構文糖じゃなかったか
式言語の定義は?
関数型言語と何が違うんだろう
メリットが良く解らんね
>>326 ちょっと「式言語」って言ってみたかっただけ。ゴメンナサイ
ぐぐるとJSPのELばっか出てくるのな
331 :
デフォルトの名無しさん :2010/04/28(水) 01:12:28
式神の城
式言語→四季言語→季語 ということでよろしいか
Dは問題外 EかFしか興奮しねえな
>>322 たしかに、式言語といえば、JSPですね。
ここで言った式言語ってるのは言語を作るための言語のこと。
XML関連の研究とかだと正規生垣言語というものなのかな?
理論的に正規生垣言語となるかはわからないのですけど。
HTMLに対するSGML、
LISPに対するS式、
Dylanに対するD式で
新しいC言語を作るための言語です。
オレはこの言語にC式って名前をつけたんだけど、
それが本当にふさわしいのかわからないので、式言語とだけ書きました。
新しいC言語は正規木文法で定義されたらいいのではと思うのだけど、
それだと、ユーザー定義の演算子を定義できるかどうかもわからないところです。
メリットとデメリットはHTMLとXHTMLの違いを考えれば分かりやすくて、
HTMLはxmlに囚われることなく定義できるけど、その分パーサは作りにくいのが、
XHTMLはXMLのパーサを使えばいいので楽。XMLのパーサ自体もHTMLのパーサを作るより楽だ。
そして、XHTMLはXMLValidなので美しいと感じるかどうかは人によるけど、一定の基準になります。
ただ、文書を書くにはXMLのほうが、長くなる。エラー復帰はすばらしいHTMLのパーサに劣る。
といったことになるかもしれないと。
関数型言語との違いは、まず目指す見た目です。 関数型言語は基本的に論文とかで使う数学の形式的な言語に近いと思います。 ここで考えているのは見た目がC言語に近いものです。 あと、関数型言語は処理系も含みますが、 C言語風の式言語の定義には処理系は含みません。 式をベースとしているからといって、関数指向のプログラミングを行う目的だけに 特化しようとも考えていません。今は高級アセンブラ用として考えているのですよね。 ScalaはC言語風の関数型言語ですが、式をベースとしていません。 DylanやNemerleも関数型言語で式をベースとしていますが、優先順位についてよくわかりませんし、 LISPのリーダマクロ的な手法のようなので自分が作ってみたかんじでは難しと感じます。 CyanはC言語風の式言語も採用しているプロトタイプベースのオブジェクト指向言語で理想に限りなく近いものです。 ただ、オフサイドルールはいらないだろ?っていうのが持論です。 なぜなら、S式にオフサイドルールは余計だから。 最小のルールでC言語風の表現ができればいいのです。 オフサイドルールは過剰なスペックだと思うのです。
文脈自由文法が自由すぎて生きるのが辛い?
CPU固有言語君か? コンパイラの本とか読んだことある? 中田さんとかWirthとかAhoとか。
Cの系譜は何をするにも新しい文法を用意してるから 一般化は無理なんじゃないか
文法的にいうとC/C++はあんまシンプルじゃないよな
で、お前ら的にF#はどうよ?
Cの文法のどこが複雑なのだろう。C++もたいしたことないけどな。
世界初の実用に耐える関数型言語 F#
.NETベース大勝利 式ベースとは一体なんだったのか
おまえらが欲しがっているものがすべて D にあってわろたwww
ツンデレすぎてわろたwww
>>344 んじゃ、俺らが欲しい機能とDの具体的な機能名を対照表で書いてください
>>341 recursiveループがあるような言語をみてみたいよ
>>347 まずお前らが欲しい機能って何?簡潔に纏めろ
>>349 え?そっちはとっくに把握してるのだと思っていました。
だって俺らが欲しがってる機能が全部Dにあると
>>344 で書いてあったから・・・
機能はあるんだよ 機能は あとは仕様とコンパイラが安定してくれれば・・・
オレは自称CPU固有言語クンではないぞ。 ま、固有がいやだっていうならば、CPU定義さえあれば、うまくいくぜ。 GCCだぜ、COINSだぜ、LLVMだぜーって感じになるでしょうね。 でも、出来るならLLVMとかと同じことをやりたい人もいるのかなと、 思うので、x86で構造作ってしまえたらいいな思ってるんです。 LLVMがいいんなら、そうするけど、それだと、 最適化とか作る楽しみがなくなったりしないのかな?と わからんけど。
中田先生の最適化の本とか読んでます。
そこにも下降型の演算子順位法が結構古くから使われているってなことが書いてあったと思うし、
論文も読んでないけど出してたように思います。
ドラゴンブックも目は通したよ。
ボトムアップ型のパーサのLRLAとかなると正直分からない。
最適化はこういうものがあるんだ。ふーんってレベルならわかってるつもりだけど、
実装してみたりはしてないので怪しいもんです。
http://www.hpcs.cs.tsukuba.ac.jp/~msato/lecture-note/comp-lecture/note10.html このページ見てコンパイラも作ってみました。わかりやすかった。
美しい日本のコンパイラのソースは綺麗だし、インライン展開やら、SSA的なこともやってて面白いし
関数型言語系統のα変換とかβ変換とかいう用語が出て来てためになります。
型推論も結局Unifyするってことなんだなぁと。
CoinsのCPU固有の定義のところだけ取り出したいんだけどうまくいってません。
WirthとかAhoは知りません。
ググレばわかるんだろうけど。
Ahoがドラゴンブックの人で、Wirthはパスカルの人か。ふむふむ。
PaskalはLL(1)という点ですばらしいですよね。
でも、Paskalは構造化されたマクロはつかえないでしょ。
ドラゴンブックにLispのコンパイルの話はないだろうし。
基本がBNFになってるから、Lispのマクロは無理。AlgolにLispのマクロは無理。
っていうことになってしまう。
実際はそんなことなくて、正規木文法は文脈自由文法のサブセットなので、正規木文法で表される 文法は文脈自由文法として扱うことが可能ですから、普通に文脈自由文法として扱えば いいのは分かってますよ。 ただ、そうじゃないもっと綺麗にできないかなぁってなるとドラゴンブックレベルじゃ無理。 Cは文法の拡張しまくってるってほどでもないのでは? RubyとかPerlに比べたらそれほど機能ないでしょ。 class、アクセス、ネームスペース、try & catchとsynchronized,テンプレート、pragmaくらいじゃないの? foreachとか、javascriptだとwithとか、正規表現リテラルとかか。 その辺の拡張する文だって大体似たような形をしてるのでそのへんを表すことが可能な演算子を用意すればいいだけです。 それがいいか悪いかは2通りの見方があるので、好きなほうを選択すればいいのではないかと思います。 Cのどこがっていうのは、HTMLの文法のどこが複雑なんだろうっていうのと同じだってば。 Cと、C++のパーサを空で2日くらいで書けるか?と。オレは無理。 でも、演算子順位法使って、特殊な演算子を定義すれば、 演算子順位の調整を除けば書ける。 .NETベース大勝利とかわけわからん。戦っている層が違うだろ。 .netベースでどうやって高級アセンブラを作るんだ? Nemerleとか知らんで書いてるだろ。 F#はML系だから、C系統の言語から移行するのはいろんな意味で辛いぞ。 だったら、Scalaのほうがずっといいと思う。 MLの仕事がいかんというわけではなくて、F#を周りのプログラマが理解して お客がそれを納得してくれるならいいけど、それは現状は難しいかなぁっと。 長文すんませーん。(w
355 :
デフォルトの名無しさん :2010/04/29(木) 01:45:13
・論点を絞る ・論旨を明確にする ・適度に箇条書きを利用する ・一般的ではない用語を使用するときは予め説明する ・論旨に影響の少ない固有名詞を無意味に使わない ・接続詞を使う
長文すぎてウザがられてることに気付かないんだろうな プログラム言語の前に日本語勉強しろっていう
説得力無いって自分でも分かってるから長文になるんでしょ。読まないよそんなの
まあツッコミ所は多々あるけど 意気込みはわかった Cのパーザは手書きすると意外にめんどいよな 取り合えず言語仕様考えてbisonとか javaccみたいなんで遊んでみたら? 俺言語をcにトランスレートでもいいかも
>>355 ありがとうございます。なるほど。参考になります。
>>356 うざかったですか。すいません。国語苦手なんですよね。
>>357 説得力ないですか。
まずは355の実践からなのでしょうけど。
>>358 ではCへのトランスレータを書いてみます。
いろいろとご意見、ありがとうございます。
function CExp(l,op,r){this.l=l;this.op=op;this.r=r}
CExp.prototype.toString = function() {return "["+this.l+",\""+this.op+"\","+this.r+"]"}
// 戦闘力表
CExp.lpowers={".":200,"->":200,"*":190,"/":190,"%":190,
"+":180,"-":180,"<<":170,">>":170,"<":160,"<=":160,">":160,">=":160,
"==":150,"!=":150,"&":140,"^":130,"|":120,"&&":110,"||":100,",":80}
// 読み込み処理
CExp.read = function(str) {
var arr = str.split(/[\b\s]+/) // 文字列を配列にする
function battle(power) {
var result = arr.shift()
while (CExp.lpowers[arr[0]] > power) {// 演算子の力が強ければ結合
var operator = arr.shift() // 名前取出し
var nextresult = battle(CExp.lpowers[operator]) // 次の戦いを行う
result = new CExp(result, operator, nextresult) // 式作成
}
return result
}
return battle(0)// 力0で戦闘開始
}
alert(CExp.to_c(CExp.read("a == b | c >> 2 > 5 , b , c >> 2")))// 読み込み
</script>
結果<br/><textarea>
((((a==b)|((c
>>2 )>5)),b),(c
>>2 ))
</textarea>
とりあえず、中置演算子のトランスレータを作りました。 ここでバリデータを作ってみます。
362 :
デフォルトの名無しさん :2010/04/29(木) 14:27:25
コードもいいけど、先ずはその部分のBNFが欲しいな。
自分で作れよ
364 :
デフォルトの名無しさん :2010/04/29(木) 14:47:54
なんだよコードで行う処理のBNFってw
366 :
デフォルトの名無しさん :2010/04/29(木) 14:54:29
「中置演算子のトランスレータ」として、どういう入力を受理するかを定義するBNF
言いたかっただけちゃうんかとw
普通、BNFは最初に書くんじゃないの
369 :
デフォルトの名無しさん :2010/04/29(木) 15:09:13
まあ、そうかもしれないけど、せっかくコード貼るなら、貼った意図を皆で理解できた方がいろいろ議論しやすいでしょ。 コードだけよりBNFがあった方がその意図を理解しやすいから。
>>368 何も考えず適当にコーディングしちゃったんだろうな
このスレ的には、文法よりコードが先行しても構わないよ。面白いアイデアなら
こういうコーディングができればいいなぁ、というアイデアを仮想の言語で書いてみるって言うのもありだけどね。 ブレインストーミングの時には。
373 :
デフォルトの名無しさん :2010/04/29(木) 15:18:46
>>371 面白いかどうかを判断するためにも、コードだけではなく、何をするのか説明されていた方がいい。
その説明する手段の一つがBNF。
コードだけでは分かりにくい。(バグっているかもしれないし。)
>>372 そうそう。
実現したいコードの例を書くのはいいけど、
それを実現するための既存言語(あるいは疑似言語)によるパーサーのコードを書いても意味無いだろってことだよな。
既存言語のBNFと変わらないように見えるのに要求する意味がワカンネ
既存言語もたくさんあるし、
>>360 の意図が実際にそうであるのかを確認するためにもBNFは有った方が分かりやすいよ。
単にコードを貼りたいだけで、それ以上議論したくないなら、BNFも説明もなくてもいいけど。
確認とか分かり易いとか、なんなんだよ。コードを見て おっ? と思うならBNFを見たくもなるけど
明らかにC系だしBNFに拘っても仕方ないだろ。
>>360 は単にコードを貼りたいだけだろ
お前はどこに説明を欲しいわけ?
単なるオナニーコーディングだし。出して気持ち良ければそれで満足。それ以上何かしたいわけじゃないんだろ。
380 :
デフォルトの名無しさん :2010/04/29(木) 15:32:26
じゃあいいや。
>>360 は見る価値の無いどうでもいいコードってことだな。
>>380 なにヤケになってんだよw
お前が食いついてただけだろ。むしろ食い付いた理由を知りたいわ
>「中置演算子のトランスレータ」として、どういう入力を受理するかを定義するBNF 結局、コレ言いたいだけちゃうんかと!最近BNF勉強しただけちゃうんかと!
「だけちゃうんかと」と言いたいだけだということはわかった。
384 :
デフォルトの名無しさん :2010/04/29(木) 15:41:34
>>381 「コード貼るなら、説明しろ」というのが真意
>>382 誰もそんなこと言ってないのにそう思うってことは、あなたに当てはまることだから?
BNFに固執してるから
BNFを書かないとyaccれないじゃん
いつその段階まで話が進んだんだよ。このスレにはまだ具体性の一つもねえよ
if then else節をどうにかしてほしいね シーケンス上で分岐条件が整ったら即分岐を推奨 template機能でも駆使して成否混在したコードを一括記述できるとか
390 :
デフォルトの名無しさん :2010/04/29(木) 17:34:01
always @(posedge event) begin some_action(); end
391 :
デフォルトの名無しさん :2010/04/29(木) 17:39:45
>>386 BNFは説明の手段の一つ。
BNFに固執しているというよりは、BNFでも何でもいいから説明があった方がいいと言っている。
せっかくコードを書いたなら、その意図を読み手に誤解なく受け取ってもらった方が、書いた方も読む方も幸せでしょ?
コードを貼りたいだけなら別にそれ以上何も望まないけど。
だからコードを貼りたいだけってことだよ言わせんな恥ずかしい 説明が欲しいなら該当箇所を質問しろよ
>>392 だから、「CExpのパラメータの意味を教えてください」って質問だろ。
で、結局、その回答はBNFで書くのが一番楽だろう。
394 :
デフォルトの名無しさん :2010/04/29(木) 17:53:42
>>392 コードを貼りたいだけなら別に質問はないわ。コード自体に興味はないし。
BNFには興味があるのかw
396 :
デフォルトの名無しさん :2010/04/29(木) 17:57:19
>>395 コードが実現する機能には興味があった。
機能を説明することもできない貼りたいだけの捨てコードなら別にもうどうでもいいけど。
矛盾してるよ
>>390 こういう非同期をキャッチする仕組みいいね。
399 :
デフォルトの名無しさん :2010/04/29(木) 18:10:46
verilogもC以上に糞構文だけどな。 並列の記述には優れているよね。
つか、ハードウエアは基本並列だからなw
401 :
デフォルトの名無しさん :2010/04/29(木) 18:22:44
論理合成のためだけではなく、ソフトウェアの並列記述にも役に立つってこと。
CPUは原理的にはシリアルだよ?
だから機械語直接記述は最小限にしたい
>>402 直列に連なったステージが並列に動作するのがパイプライン
並列というならパイプラインよりスーパースケーラだな
>>402 当たり前だがチューリングマシンは基本直列だからねえ
つか、並列動作はやっぱ人間にとってわかりにくいから難しい
アセンブラ使わなくてパイプライン充填率高められる言語作ってくれよ そしたら使ってやるよ
>>406 それは言語仕様じゃなくてコンパイラの範疇では
コンパイラじゃ限界あるだろ
409 :
デフォルトの名無しさん :2010/04/29(木) 21:39:56
それならそれが限界ということ。 CPUアーキテクチャを有効に活かすのはコンパイラの仕事。それを最もうまく行うのがコンパイラ。
それならアーキテクチャを変更すれば良いということ。
つまり、パンがないならお菓子を食べればいいじゃない。ということだな。
>>406 初代Pentiumのころはコンパイラがそれをやってたけど、今はCPUがそれやってくれるんだよね。
つまりマリー・アントワネット的転回ということだな
あとキャッシュ効率を自動で高められる言語がいいな ブロッキングとかメンドイのなくしたい
>>414 JAVAのGCがそれをやってくれるってふれこみだったけど・・・・
Dにはあるが、ただのaliasではないtrue typedefが欲しい Cだとdata abstructionの目的でopaque pointerを用いることは よくあるが、true typedefがあれば、それを型安全に出来る
DからGCを省いたD♭を作って欲しいな。
data abstractionだな Cなんて使ってると、どうもstructと書いてしまう
true typedefって何?
投機実行はやるけどちょっと違うな
422 :
デフォルトの名無しさん :2010/04/29(木) 23:13:45
>>419 最近のインテルプロセッサならx86をデコードしてuopsを実行するときにやってくれるよ。
パイプラインがわかってないんだろ simdとかやってりゃ分かってくると思うんだが いかにRSとかROBに処理をためないで計算実行するかをね
>>422 インテルのCPUは下品だからな
今でもパイプライン埋めるなんて静的な最適化は事前にやるのが効率いい
427 :
デフォルトの名無しさん :2010/04/29(木) 23:18:23
>>427 ちょっと打鍵ミスったけど知らないなら教えてあげない
団子にでも聞け
429 :
デフォルトの名無しさん :2010/04/29(木) 23:20:56
いやパイプライン充填率を高める超重要なこと
424を理解できないと高速プログラミングは実質不可だよ
誤字なら訂正すればいいのに。何意地になってるんだろうね。
ま、超高速をうたったスレなんで書いたけど 超高速が不要なら無視してもいいよ
煽るだけで中身がないのが2ちゃん
436 :
デフォルトの名無しさん :2010/04/29(木) 23:27:33
それでもたまに煽りの中に発見があったりするからね。それを拾っていこう。
ひまなんだなw
フルの仕様ではGC(かそれに相当する機能)が有りだけど、GCを使わないようにも出来て GCを使わない場合でもGCがある場合とそれほど違和感ないようにできないだろうか。
C++でnewオーバーロードでGCライブラリ呼び出しにすればいいだけじゃないか? deleteのあつかいは難しいが単純にメモリ解放だけしないということで
普段はGCを使っているプログラマが、GCなし環境で開発をしなければならなくなったときに、勘違いして致命的なバグを作りこまないようにしたい。 バグがあってもそれをコンパイラで検出できればいい。 newでGCするようにしてそれを達成できるかな。
いろいろやりようはあるよ。 でも実行時検知だけじゃなくコンパイラでって話ならかなり厳しい。 かなり文法や構文にルール導入すればできるだろうけど
C++/CLIのgcnewは、
>>438 で有用だから採用したい。
443 :
デフォルトの名無しさん :2010/04/30(金) 00:23:57
gcnewとnewを使い分けるのが美しくないよね。でも仕方無いか。
>>443 newとgcnewのポインタ間に代入互換性が無いんだぜ。仕方ないで済ませられないほど困る。
GCとか普通にいらんだろ
このスレで話題にしたいような低レベル言語にはいらんな 中〜高レベルには必須だな
そろそろ己の馬鹿自慢合戦は止めようぜ 折角GWに入ったんだから有意義に行こう
Garbage Week
GC が要らないレベルなら C/C++ で十分だな。
GC有り言語とGC無し言語ではメモリに関する考え方がまるで違うから、 学習者からすれば一つの言語に混在するのは良くないんじゃないかな。 低レベルならC/C++でいいけど、 何でも有りすぎて「やっちゃいけない」ことが多すぎるから、 できることを減らしていいからミスが少なくなるようなコンパクトな文法がいいな。 標準ライブラリの整理(scanfなんかいらない)や充実も必要に思う。 良い言語の条件は、 ・読みやすい・メンテしやすいこと(他人の書いたperlコードなんて読みたくない) ・ライブラリが充実してること(画像読み取りぐらいは標準ライブラリに欲しい) ・熟練者じゃなくてもミスのないプログラムが書けること なんじゃないかなと思う。
見た目は何もかわらないんだけど、 宣言の時に処理を埋め込むことができるような指示子を持つ言語にすればGC言語にも変身できるんじゃないの?
このスレ、全般的に超高速にあまり触れていないのは何故? 分かる人いないの?
高速を要求される言語にGCは向かないとは思うよ。 あと、変数には型がある方がいいな。z=x+yと書かれても、 実行時までx,yがintかdoubleか文字列かわからない言語は高速にはならんだろ。
Part1の
>>1 の書き込みからするに、C並みに速い程度で十分だと思われ。
スレタイに囚われて、Cより速い言語とか考えるから、CPU固有言語君とか出てくる。
456 :
デフォルトの名無しさん :2010/04/30(金) 20:46:54
◆新言語の位置づけ◆ Ruby, Python, Haskell, OCaml, Scala, Clojure, Erlang, … 烏合のごとく言語が生まれてきているのにどれも似たようなLLばかりで、ハードウェア制御のような低レベル処理を行える言語が無い。 一方、Cは40年使われ続けてきているわけで、そろそろ置き換えられる言語が出てきてもいいだろう。 そこで、C程度の性能が出せて、Cが使われている分野を全てカバーでき、 過去の互換性に囚われて構文を妥協せず、今時の機能を使えてCよりもプログラミングしやすい新言語を作りたい。
462 :
デフォルトの名無しさん :2010/04/30(金) 22:18:11
>>459 そんなことはない。
自動変数の寿命が尽きる時に呼び出されるだけでも意味がある。
>>462 ヒープに確保した場合は呼ばれないのか。
それに意味があるとは思えないな。
464 :
デフォルトの名無しさん :2010/04/30(金) 22:34:34
Cの場合、 ヒープならmalloc-freeの組が必ずあるからfreeをフックすれば、後始末ができるが スタックはそれができない。 スタックの後始末をするためにデストラクタに相当する機能が欲しい。
ヒープ使うのに抵抗ないならスタック使わなければ問題ない
Java系はそもそもスタックにインスタンスを生成できないな
ヒープ使うのに抵抗がある。
スタックサイズも意識してね
そうだね。 ということで、デストラクタは必要。
いらねーよ。スタックでしか自動化のメリットない。 ヒープは自前で呼び出す必要性がある。対象性なさ杉。
>>464 ヒープとスタックで別の動作をするものが役に立つとは思えないし、分かりにくくなるだけだと思うが、実装は簡単だな。
こいつ自分の言ってる事がわかってない
オブジェクトの破壊ではなくスコープの変化をフックすると考えればいい 無限エクステントを実装するのに使えそうだし
476 :
デフォルトの名無しさん :2010/04/30(金) 23:02:24
C++と同じように、寿命が尽きた時に呼び出される関数が欲しいって言ってるだけでしょ ヒープとスタックで別の動作とか、そんな話どこから出てきたんだか
こいつ自分の言ってる事がわかってない
Javaには君が望むようなデストラクタはないな
Javaは目指さなくていい
ようは理解できないと
C#のusingは有用だから採用したい。
Cにお前らの望むもの追加したら、C++になったでござる
C++の機能を今風の構文で実現できるならそれでもいいけどな
例外はもう少しエレガントにならんのかな try-catchはカッコ悪い
486 :
デフォルトの名無しさん :2010/04/30(金) 23:21:57
次ぎに何時規制になるか、分からないので書きたいことを書いておく。 1、言語の設計とコンパイラの設計は違うぞ。 2、BNF出して議論するのは良いと思うけど、もう少し煮詰まってからだと思う。 3、デストラクタの議論は何かよく分からん。後、スタックというのは、C言語で 採用されたメモリーの使用方法で、コボルにはスタックという概念が無かったし。 非スタックというアプローチが有効だとは思わないが、それも一考の価値は 有ると思う 4、C言語の悪いところは、プリプロセッサとか色々。
以下、構文の美しさの議論から始まって、Lisp厨やらJava厨やらLL厨やら割り込んで 最後にはCPU固有言語君が湧いてくるいつもの無限ループが始まります。 ↓
Cがスタックを採用したのは確かにその通りだが、Cが存在する以前からスタックはあったし PUSH,POPはCPUの基本的な命令だから、スタックはサポートしたいだろう。
>>484 例外って、sjljの敷居を下げてモラルハザードを起こすだけの存在だよね
sjljって何?
491 :
デフォルトの名無しさん :2010/04/30(金) 23:34:45
>>482 まぁ、結局のところそうなんだけど、C++は少し読みにくいので、
機能的にはC++から多重継承やフレンドを取り除いて、C++で出来る事は
全部出来るけど、読みやすく、書きやすく、
その上システムレベルのプログラミングもやりやすい、
ってのがお年頃だと思う。
そうそうそう言えば、
二進数 0b00001111
八進数 Oc0017
10進数 0d15
16進数 0xF
または
二進数 Bi00000001111
八進数 Oc017
10進数 De015
16進数 Hx0F
任意のN進数の整数リテラルがあってもいいかな。
493 :
デフォルトの名無しさん :2010/04/30(金) 23:47:06
>>486 > 1、言語の設計とコンパイラの設計は違うぞ。
確かに。
このスレッドは前者、「言語の設計」をするスレッドである、ということを明確にしておきたいね。
>>490 setjmp-longjmp 綴りあってたっけ?
>>494 おお、それをそう略すのか。初めて知った。thx
C と C++ の差は絶妙なバランスをとっているよ。
素人が紛れててお話にならないな。
交通整理も出来ないくせに
勇気を出して仲間に入れてって言えばいいのに^^ 教室の後ろでブツブツ言ってても気持ち悪がられるだけだよ^^
500 :
デフォルトの名無しさん :2010/05/01(土) 00:13:25
501 :
デフォルトの名無しさん :2010/05/01(土) 00:18:16
0xにはワクワクしないでもないけど、過去のしがらみがちょっとね。
デストラクタみたいな勝手に走る奴は低レベルにはそぐわんでしょ 後x86しかしらんやつは今の主流のRISCをちょい勉強したらどうだろ 今でも引数や戻り番地をスタックに積むしかないと思ってそうだ けど、スタックはメモリの局所性が高くてキャッシュとの相性が抜群だからいいんよ
503 :
デフォルトの名無しさん :2010/05/01(土) 01:38:41
話少し変わるけども、C++で継承元クラスのデストラクタは 仮想関数にしなさいってのは、どうかと思うんだけど、あれって コンパイラが自動的に出来ない物なのか? 常に仮想関数を定義しなきゃ駄目なら、コンパイラがそう解釈すれば 良いのに、何故にあんな仕様になってるのか、理解できないんだけど、 何が理由で、あれはあんな風になってるんだ? 暗黙のコピーコンストラクタとか、色々、やらなくても良いことまで やってる癖に、なぜデストラクタという一番厄介な部分で、常に手書き せよと言う、変な仕様になってるのか理解できないんだが。
>>503 ゼロオーバーヘッド原則
意訳「勝手にやるんじゃねえ糞野郎」
506 :
デフォルトの名無しさん :2010/05/01(土) 01:50:39
>>505 その割に、暗黙の型変換とかね、CとC++はそう言うのが悪いと思う。
そもそも、継承したクラスか、継承元なのかは、静的に解析出来るわけだし、
アップキャストしても、それは同じように分かるはず、というか分かるから、
仮想関数にしておけば、デストラクタが呼び出されるわけだし。
なんかそう言ういい加減さが、C++の欠点なんだと思うんだ。
継承したクラスで、デストラクタが呼び出されなくて嬉しい、という
場合は無いでしょ、あっちゃならねーよ。なんのための継承か
わからねーよ。
と言うことで、新言語ではデストラクタがちゃんと呼ばれることにしよう。
V-Tableくらいデフォルトにすればいいのにな。 使いたくない時だけno-virtual指定するとか。
>>506 仮想関数は重い。C++はそのコストを無視できないんだよ。
言わせてもらうとC++はいらね あの仕様見てたらオブジェクト指向は低級言語に合わねえってのの 実証実験じゃねえのかと思うよ
仮想デストラクタを持った基底クラスを作っておいて、それをはせいさせれば良いんじゃね?
511 :
デフォルトの名無しさん :2010/05/01(土) 01:55:36
C++がいらないのは確かだが、オブジェクト指向は低級言語に合わないわけではない。
>>509 別にあんたのために作ったんじゃないんだからねっ
素直にJava使ってろ
514 :
デフォルトの名無しさん :2010/05/01(土) 02:03:56
>>508 いやいや、意味が分からね。静的に解析出来るじゃん。
基底クラスは自分のデストラクタ使えば良いし、派生クラスは自分と
基底クラスのデストラクタ双方が必要ってのは絶対なんだから。
基底クラスが派生クラスのデストラクタを必要とすること無いんだし。
素直にJava使ってろ
516 :
デフォルトの名無しさん :2010/05/01(土) 02:07:21
最低2回は繰り返す
>>514 静的に解析って……アホか
基底へのポインタが、基底型オブジェクトを指してるのか派生型オブジェクトを
指しているかは実行時の問題であって、静的に解析できんだろが
だからvtblとか使ってポリモーフィズムさせてるんだぞC++は
基底へのポインタをdeleteしたときに、それが指している実行時型に応じた
デストラクタが起動されるためには、デストラクタが仮想関数でなければならない
そして常にデストラクタを仮想にしないのは、zero overhead principleのため
それがC++の流儀だ
518 :
デフォルトの名無しさん :2010/05/01(土) 03:24:51
>>517 言ってることがよく分からない。
継承されるかどうか分からないから、ヴァーチャル付けとけで、
zero overhead principleが守られてるのか?
519 :
デフォルトの名無しさん :2010/05/01(土) 03:28:02
当初の設計思想と、その後実際使った経験則に則ったEffective C++的な作法との間で整合が取れなくなっているんだよな。 だから、ダメなんだよC++は。
なんか、勝手にオレの分身がむかつき度をアップしている。 おかげさまで、BNFと同等のものが必要ということが分かりました。 ホント、馬鹿でした。(汗
360のコードのBNFは演算子はあとからも登録できるので、こんな感じですか C式0 : C式1 ( 演算子1 C式1 )+ C式1 : C式2 ( 演算子2 C式2 )+ C式2 : C式3 ( 演算子3 C式3 )+ C式3 : C式4 ( 演算子4 C式4 )+ C式4 : C式5 ( 演算子5 C式5 )+ C式5 : C式6 ( 演算子6 C式6 )+ : : C式∞: 字句
+じゃなくて、*だろ
と、自作自演風訂正をしたけど、バレバレだな。
525 :
デフォルトの名無しさん :2010/05/01(土) 11:54:54
>>522 それなら、こんな↓感じじゃない?
C式 : C式 ( 演算子 C式 )*
演算子 : <<ここが未定義>>
>>522 525それだと演算子の優先順位がつかないので、
定義されている演算子も含めてこんな感じでしょうか?
C式 : C式∞
C式∞ : C式(∞-1) ( 演算子(∞-1) C式(∞-1) )*
:
:
C式1 : C式0 ( 演算子1 C式0 )*
C式0 : トークン ( 演算子0 トークン )*
トークン: [^\s]
演算子200: '.' | '->' | <<未定義>>
演算子190: '*' | '/' | '%'| <<未定義>>
演算子180: '+' | '-'| <<未定義>>
演算子170: '<<'| '>>'| <<未定義>>
演算子160: '<' | '<=' | '>' | '>='| <<未定義>>
演算子150: '=='| '!='| <<未定義>>
演算子140: '&'| <<未定義>>
演算子130: '^'| <<未定義>>
演算子120: '|'| <<未定義>>
演算子110: '&&'| <<未定義>>
演算子100: '||'| <<未定義>>
演算子80: ','| <<未定義>>
演算子n:<<未定義>>
527 :
デフォルトの名無しさん :2010/05/01(土) 13:00:36
生成規則と優先順位の定義は分けた方がいいのでは。
528 :
デフォルトの名無しさん :2010/05/01(土) 13:08:32
C式 : C式 ( 演算子 C式 )* | トークン ( 演算子 トークン )* トークン: [^\s] 演算子: 演算子200 | 演算子190 | 演算子180 | 演算子170 | 演算子160 | 演算子150 | 演算子140 | 演算子130 | 演算子120 | 演算子110 | 演算子100 | 演算子80 | 演算子n 演算子200: '.' | '->' | <<未定義>> 演算子190: '*' | '/' | '%'| <<未定義>> 演算子180: '+' | '-'| <<未定義>> 演算子170: '<<'| '>>'| <<未定義>> 演算子160: '<' | '<=' | '>' | '>='| <<未定義>> 演算子150: '=='| '!='| <<未定義>> 演算子140: '&'| <<未定義>> 演算子130: '^'| <<未定義>> 演算子120: '|'| <<未定義>> 演算子110: '&&'| <<未定義>> 演算子100: '||'| <<未定義>> 演算子80: ','| <<未定義>> 演算子n:<<未定義>>
>>527 こんなかんじ?
left: ',' | <<未定義>>
left: '||'| <<未定義>>
left: '&&'| <<未定義>>
left: '|'| <<未定義>>
left: '^'| <<未定義>>
left: '&'| <<未定義>>
left: '=='| '!='| <<未定義>>
left: '<' | '<=' | '>' | '>='| <<未定義>>
left: '<<'| '>>'| <<未定義>>
left: '+' | '-'| <<未定義>>
left: '*' | '/' | '%'| <<未定義>>
left: '.' | '->' | <<未定義>>
C式 : C式 ( 演算子 C式 )*
| トークン
演算子 : <<ここが未定義>>
leftが多重定義に見えるけど。
<<未定義>>はわざわざ書かなくてもいいんじゃないの。
単項演算子と括弧がねえぞ
>>532 欲しいなら自分で定義に追加すればいいよ。
| '_>' |
<<未定義>>ってなんだよ
言語は後で設計するとして、先にコンパイラを設計しようってことだろ
つかBNFのお勉強かよ まじめにやるとCは結構でかいぞ 後書き方は::=か=が一般的かね。 式 = 項 { 演算子 項 } みたいなかんじ。 PEGもいいぜ
>>536 そうなんだが、BNF中に未定義とかあったらあかんだろw
空(ε)と未定義は違う
539 :
デフォルトの名無しさん :2010/05/01(土) 15:06:59
構文の定義は当業者が理解できる範囲で合理的な記述であれば厳密である必要はないよ。 それこそBNFのお勉強じゃないんだからね。BNF自体方言があるわけだし。 未定義は好意的に受け取れば「みなさん追加してください」って意味なんだろうけど わざわざ明記する必要はないね。
BNFに方言があるのは確かだが 共通な話題にしたいなら 仕様書や教科書を読めとは言わんが 少し書き方を覚えても損はないよ。 区切り文字や左と右に何を書くのか、 繰り返しや選択は?位ね 俺には未定義とかleftとか意味わからんかった
makefileも楽々記述できるようになるしな
まだ構文以前の話だろ。 駆動とかルーチンとかの基本的な話をしようぜ。 構文にこだわるなら安全なマクロの仕組みとか。 マクロ自体をPEGとかBNFとかで組めるようにする手もあるけどな。
駆動って何の駆動?
544 :
デフォルトの名無しさん :2010/05/01(土) 21:13:03
コンパイラの勉強なら別スレがあるじゃん。 BNFとかだらだら書かれたら迷惑。 書いてるのC言語だし。
欲しい構文があるならBNFで明快に書かれた方が議論しやすいだろ。
>>352-354 みたいな文章をだらだら書かれたら困るw
546 :
デフォルトの名無しさん :2010/05/01(土) 21:18:20
BNFで書くのはコンパイラのためじゃないよ。 共通言語として読み手が理解しやすいからだよ。
このスレでアホアホフィルター掛けちゃったら 何も残らないじゃないか
548 :
デフォルトの名無しさん :2010/05/01(土) 21:31:58
で、ネタふりなんだけど、 if文は、現状のままで良い? if(条件){ }else{ } と、中括弧を必須にするのはどう?
549 :
デフォルトの名無しさん :2010/05/01(土) 21:34:33
>>546 そうだけどさ、BNFの勉強会始められたらビックリだよ。
コンパイラ関係のスレは沢山あるし、まだまだそこまで
議論煮詰まってる訳じゃないし、BNFで書きにくいから
なんて言うのは、今、考える事じゃないし。
何でコンパイラ関連のスレが出てくるのかよくわからないけど、 別にBNFの意味を確認しあうぐらいはいいんじゃないの。言葉の認識を合わせるためなんだから。 そもそも勉強会なんて始めてないし。ビックリするなら始まってからビックリすればいい。別に大したビックリでもないし。
551 :
デフォルトの名無しさん :2010/05/01(土) 21:50:05
>>550 BNF位、読めて書ける人が、気合い入れないで、
あの文法めんどくせーよ、よめねぇーよ、と
気楽に書いてるのがこのスレなんだよ。
だから、稚拙なBNF書いてUPされるとすげー
迷惑なんだよね。
例えて言うと、言語学者が「ら抜き言葉」は文法上の必然か
どうか議論してるところに、「ままぁ、ひらがなかけたよ」と
子供が練習帳持ってきて、ちゃんと書けてるか、みてみて
と言ってきてるような違和感があるんだよ。その違和感というか
迷惑に気がつけないで、BNFかいて何が悪いという、その感性に
ビックリなんだよ。
俺はBNFの方が曖昧性の少ない議論をしやすいから好み。 お前は稚拙なBNFにビックリするから嫌い。 好みの問題は歩み寄るのは難しいから、まあ各人が好きなように書けばいいんじゃないの。 もっとも、個人的には「俺がビックリするから止めろ」という姿勢には賛同できないけどね。
553 :
デフォルトの名無しさん :2010/05/01(土) 21:58:09
>>552 稚拙なBNFをUPするな、BNFの書き方すら怪しいレベルで
UPするなって事もちゃんと書いてるので、日本語すら怪しい
お前がどれだけ迷惑なのか・・・
でも
>>552 を平気で書いてるところを見ると、お前はそう言う人間
なんだろと思う。
構文を、斬新なのでなく、ありふれたのにするなら、最後にしたらいいこと。
556 :
デフォルトの名無しさん :2010/05/01(土) 23:18:38
>>553 すいません。オレがBNFをちゃんとかけなかったばっかりに、、、。
たしかに文法を書くならどの記法で書くと明記した上でその文法に則って書けば
突込みが入ることもないですよね。
そこで質問です。
<<未定義>>と書いたのは演算子を後から定義できることを表す為でした。
しかし実行時に文法が変わることを記述可能な文法の記法を私は知りません。
もしご存知でしたら文法が後で変わる記法を教えてください。
またご存知なければどのように書けば違和感がなく伝えることが出来るか教えてください。
>>532 前置演算子がないのは書いたプログラムに前置演算子がないからです。
>>556 switchを無くしてEVALUATE文にする理由は?
>>556 確かにswitch-case文よりこっちの方がいいな。これがあればif文も要らんかも。
560 :
デフォルトの名無しさん :2010/05/01(土) 23:27:02
>>559 使える型が制限されるけど、SIMDでも威力を発揮しそうなんだよね。
>>558 switchに関するお約束やノウハウが多すぎるので、この際、switchを
破棄した方が、Cから流れてきた人に混乱が少ないと思う。
561 :
デフォルトの名無しさん :2010/05/01(土) 23:28:53
if(A() == B()){ }else if(A() == C()){ }else if(A() == D()){ }else if(A() == E()){ }else{ } これのswitch風構文糖が欲しいな。 evalutateってそういうの?
562 :
デフォルトの名無しさん :2010/05/01(土) 23:31:20
>>561 もっと強烈に強力。それが出来るのは当然として。
563 :
デフォルトの名無しさん :2010/05/01(土) 23:32:02
それはいい。採用。
>>542 >駆動とかルーチンとかの基本的な話をしようぜ。
>
>構文にこだわるなら安全なマクロの仕組みとか。
>マクロ自体をPEGとかBNFとかで組めるようにする手もあるけどな。
この話はすごく興味があります。
なにかお考えがあればお聞かせください。
switch文を置き換えるなら、強力なマッチング構文にしたいですね。 新しいswitch文に欲しい機能一覧 ・1つのケースについて条件を複数組み合わせて記述できる。 ・型チェックを簡潔に記述できる。 ・型内の値に名前を付けて取り出すことが出来る。 ・何かしらのチェック項目をすべて網羅されていることをチェックできる。 足りなければ追加してください。
567 :
デフォルトの名無しさん :2010/05/02(日) 00:03:46
提案しておいてなんだけども、
EVALUATE文の導入には、もの凄く大きな問題が有って。
>>561 EVALUATE TRUE
WHEN A()=B()
WHEN A()=C()
WHEN A()=D()
WHEN A()=E()
END−EVALUATE.
と、
EVALUATE A()
WHEN B()
WHEN C()
WHEN D()
WHEN E()
END−EVALUATE.
では、
A()が呼び出される度に違った結果を返す関数の場合、
結果が異なる場合があり得るんだよね。
強力な甘さがあるので、そんな物だと言うことでOKだろうと思うのだけど、
その辺このコンパイラならこうなるああなるってのは避けたいと思う。
後、評価順を、1行1列、2列、3列、とするとか、一行1列、2行2列として
行くか、キーワードを追加して選べるようにするかとか。
568 :
デフォルトの名無しさん :2010/05/02(日) 00:07:20
evaluateは知らないけど、 これ↓ if(A() == B()){ }else if(A() == C()){ }else if(A() == D()){ }else if(A() == E()){ }else{ } と、これ↓ auto V = A(); if(V == B()){ }else if(V == C()){ }else if(V == D()){ }else if(V == E()){ }else{ } は使い分けられるようにしたいな。 基本的には後者だけあれば十分だけど。
正直そう書きゃいいだけの話だな
570 :
デフォルトの名無しさん :2010/05/02(日) 00:08:44
571 :
デフォルトの名無しさん :2010/05/02(日) 00:14:35
>>570 それなら、evaluateで問題無いわ。
書いた回数しかA()を評価されないなら誤解しなそうだし。
ただ、比較演算子がオーバーロードされる場合はちょっと怖いかな。
比較演算子の右辺と左辺を個別に処理できない場合は困るね。
前も書いたけど、駆動だったらまずは駆動レコードをどうするかがポイントになると思う。 簡単にはC風のフラットなスタックにしちまえば良いんだけど、その場合でもインラインやマクロみたいな 別の駆動レコードに寄生する関数をOKにしたいなぁ。 またルーチンだと、引数の処理をどうするのかが一つのポイントかね。 評価後に渡すのか遅延評価&メモ化するのかでずいぶん挙動が違うし(遅延評価はバグの温床になりそうだけど)。 また、C風のサブルーチンオンリーじゃなくて、高級なコルーチンとか継続OKのルーチンとか…… ……・は要らないか。 マクロは名前解決がポイントかね。cだと健全かどうかはあまり気にしなくて良さそうだけど、名前空間を汚染するか どうかはけっこう重要にならない? どう解決するかはあんまりアイディア無いけど。簡単には関数と同じ扱いにするのかな? ちなみに >マクロ自体をPEGとかBNFとかで組めるようにする手もあるけどな。 は、コンパイラのパーサをパース中に差し替えることができるようにすれば可能だよ。
いつからかコボラーが紛れ込んでるな…
574 :
デフォルトの名無しさん :2010/05/02(日) 00:25:05
駆動って何なの? ググった感じ、下の記述と、このスレくらいしか出てこないんだけど、継続ともまた違うんだよね? >【駆動レコード(フレーム)】 > >関数呼び出しによる駆動レコードは、関数が生成する局所環境、大域環境へのポインタ、 >引数の受け渡し、戻り番地に関する情報を記録する。 >駆動レコードは、関数が呼び出されたときにスタック上に生成され、 >関数内でリターン命令が実行されたときにスタックからポップアップされて消滅する。(H17 137文字)
575 :
デフォルトの名無しさん :2010/05/02(日) 00:26:16
>>573 COBOLは知ってる人しか知らない失われた古代文明だから、現代人にとっては学ぶべきところがある。
576 :
デフォルトの名無しさん :2010/05/02(日) 00:26:44
>>573 前スレのENVIRONMENT DIVISION辺りから。
>574 ごめんごめん、駆動レコードのこと。スタックフレームかアクティベーション・レコードというのが一般的かね。 まあ、スタックフレームを動かす時の動作全般のことにしといて。
>>557 BNFで未定義があっちゃだめ。
アレはオートマトンを人間に読めるように書いたもんだと思ってくれ
字句的に未定義がダメなら変数とかの宣言どうすんの?
字句解析と構文解析とセマンティックスはそれぞれ別に考えなきゃダメ
つまりif (cond) {}とか書いてあっても動作はかいてないでしょ?てこと
switchはgo風のがいいよ。C的なswitch(xx) { case XX: }と
switch { 条件式: }って使える。
変な構文ならシンプルにif-elseの砂糖でいんじゃね
>>572 突っ込ませてもらうと、駆動レコードとか言わずにスタックフレームとか言えばいいのに。
インラインは別にフレームなんて持たなくていいし、マクロは実行時には関係ないし。
遅延評価やメモをやるなら関数型だろ。低レベル言語でやるのか?カリー化とかも?
継続とかコルーチンとかコンテキストの動的生成が必要だから
ランタイムが重くなるかもしれんが比較的軽く実装もできるし
クロージャもだが仕様にあってもおもしろいかもね
マクロが好きな人が多いみたいだが
algol系言語のmacroは黒魔術になりがちだから敬遠すべきと思うぜ
どうせやるなら変数定義とlamdaと構文的なブロックとifとgotoだけの言語作って
後は全部マクロでやったらどうさ
演算子とか構文をいじれるような言語はまったく実用的じゃないってことを
考えて見てくれ
579 :
デフォルトの名無しさん :2010/05/02(日) 00:57:26
>>557 <<未定義>>は未定義ですってコメントとして書けばいいよ。
ミニマリストにとってはマクロは魅力なのよ。下のほうからシームレスに弄れるし。 低水準言語だとForthなんかがそんな感じだよね。 まあ、マクロ無しでもインライン&引数評価なし関数で十分代用できるけどね。 これでもまだ落とし穴たくさんあるけど。
ついでに書くと スタックフレームを抽象化しようというのは かなりアーキテクチャ依存な話だし そんなのは意識はしつつももっと後に考えていい話。 むしろレジスタ数の多いCPUでグローバル最適化を賢く作ったら ほとんどスタック使わないようにコンパイルできるかもしれんでしょ スタックはあんま使わずにすべてヒープ確保何て言う方向性だってあるし スタックをリストとか別な構造で作ったらどうよなんて おもしろいかもしれんが低レベルから離れていく
>>580 forthはlispと同じく永遠のマイナーだからな
583 :
デフォルトの名無しさん :2010/05/02(日) 01:03:14
>>577 「スタックフレーム」も知らないけど、スタックを直接操作できるってこと?
どう使うんだろ。良くわからないけど、相当邪悪なことができそうだね。
goはこれですね。
http://golang.org/doc/go_spec.html#Switch_statements PHP もこんな感じで書けるので COBOL のEVALUATEに似てるかも
switch (true) {
case A == B:
case C != D: 処理1(); break;
default: 処理2(); break;
}
haXeはenumをswitchで使うとenumの全パターンをチェックする機能があります。
関数型言語のmatchに一段近くなるけどマッチング能力に不満も残ります。
http://haxe.org/ref/enums Scalaになるとmatch構文とsealed case classがとても強力で値のバインディングと
チェックが出来たりifによる条件もつけたりと強力ですがclassが必要になってしまいます。
新しいC言語はclassいらないので
union UNI {
struct A (char* a);
struct B (static int b,imutable int c);
}
UNI uni = B(3,4);
switch (uni) {
case A(str): 処理1(str); break;
case B(a,b) if(hoge): 処理2(str); break;
}
というかんじがいいのかもしれません。
585 :
デフォルトの名無しさん :2010/05/02(日) 03:18:29
EVALUATEって、MISD(Multi Instructions Single Dataっていうのか?)的なことができるのかな。 MIMDを統一的に扱える構文があるといいね。
駅前にいけばいいじゃない
並列となると、ケースごとの条件が一意にならないといけないですよね。 上から順番に判定するルールと、、、そのへん詳しくないのだけど。
プリミティブ型をスレッド間でハンドリングする際に妥当なラッパーを生成コードに埋め込む様にすればいいんじゃないかな
twitterにこのスレと似たような事をやってるクラスタがあるけど、そっちはもう動くものが出来上がっちゃってるなw
2chが順調に終りに近づいてる気がする
>>590 人少なくなったね
twitter始まったころとほぼ同時期に始めたけど、
いまいち何が面白いのか分からなかったからやめてたけど、
もういっかいやってみるか。
え、ここは雑談しながら 初心者を生温かくいじるとこでしょw 最近規制も多いし
593 :
デフォルトの名無しさん :2010/05/02(日) 15:36:43
>>590 読んでみたいけどどう検索すれば読みやすくヒットするのか
未だにわからんのだよ、twitterってどうも読みにくい。
>>593 まずは50人フォローしてみな。
んで適当なtweetにreplyして反応をみろ。
自然にクラスタが出来上がる。
595 :
デフォルトの名無しさん :2010/05/02(日) 15:47:49
>>594 50人ものぶつぶつ言ってること聞かなきゃ、
言語の話にたどり着けないのか?
2chより酷いな(w
グーグルの検索でツイッターのつぶやきのようなゴミ情報をヒットさせるな
>>595 ゴチャゴチャ言わずに行動しろw
50人登録するぐらい10分でできるだろ。
文句ばっかり言って何もしないニート的性格が身についちゃってるぞ。
ツイッターやってる奴って何を求めてるの?つぶやき(笑)って、冗談キツいわ
>>598 お前もつぶやいてるじゃん。
twitterではお前の呟きに対してスレ違いと言われないだけマシじゃん?
つぶやきなんて何の価値もないからなw スレ違いというレスポンスが返ってくることもなければ それ以外のどんな有意義なやりとりもなされないだろうな
>>600 同じ興味を持っているみんながお互いにフォローしあってなんとなくクラスタっぽいものが出来上がって、
そこで井戸端会議らしき事がなされる。
お互いがクラスタだと認識するために必要な機能は揃っている。
しかも荒らしは存在できない仕組みになっている。
602 :
デフォルトの名無しさん :2010/05/02(日) 16:07:18
いやいやいや、そうじゃなくて、リンク貼ってくれよ そこ読んでこれは参加する価値が有ると思えば参加するから。
信者きめぇな。2chでツイッター布教しすぎ
>>602 俺のlistを見せればすぐに納得できるだろうけど、
匿名掲示板ですることじゃないね。
自分でたどり着いてこい。
>>603 信者とは違う。
実際に成果物を上げているコミュニティがあることを言ったまで。
606 :
デフォルトの名無しさん :2010/05/02(日) 16:13:12
紹介できないのなら無いのと一緒じゃん(w もうこの話はすれ違いだから終わりな。
ちなみに、tweetを見る価値があると思われない奴はfollowerがほとんどいないから、 自分の言いたいことを誰にも聞いてもらえず、そういう奴は自然にやめていく。 つまり、ゴミはtwitterに存在できないw
ツイッターは個人個人が勝手に好きなことを書き込むのに対して、 2chだとスレタイというテーマに沿って書き込まれるから、ある程度まとまった情報が得られる。 あとツイッターが強制コテハンなせいで自由な書き込みが少ないのも面白くない。 勝手に馴れ合ってれば良いじゃん。押し付けるなよ
紹介したくない秘密兵器っぽい言語をつくれよ 布教する手間が省けて色々捗るぞ
>>608 別に誰も押し付けてないけどw
2chが潰れたらお前らはどこに行くのかなぁと疑問に思っただけ。
>>604 はあ?お前のつぶやきレベルが低過ぎるから見せられたもんじゃないんだろ
なにが、自分でたどり着いてこい(キリッだよwww
参加するに値するものを示せば参加するって言ってるのに順番がおかしいだろw
>>611 twitterでは参加するに値するかどうか決めるのはお前じゃないんだよ。
お前がやりたいと思ったらアプローチしてくるのはお前なんだよ。
>>607 2chでツイッターの布教してるゴミはなんなの?w
twitterは有名人の追っかけか、リアルで交流のある連中の馴れ合いしかできない。 どんな話題で盛り上がってるかなんて、何10人何100人追っかけないと把握できな糞ツール。
ブログとしても使えないし、mixi以上に馴れ合ったり気を使ったりする糞ツール
チラシの裏以下の糞レスを、荒らしの如く吐き捨てる肥溜めとしては最適
うぉ、なんで、こんな話になってるんだ。。。 黙っておけばよかった。orz... 2chは2chで、twitterはtwitterで場合によりけりだと思うんですけど。
所詮ローカルだからな 全世界に公開されているように見えて、 検索性が悪くて誰も情報に辿り着けない
>>615 でもリアルほど気を使わなくていいだろう
twitterでfollowing/followers比が高いヤツほど社会不適合者。 誰と付き合うべきか一発でわかっていいよ。
こんな2chの辺境にtwitter布教しにくるゴミとは付き合いたくない
>>621 ところが、この過疎スレが今やム板で最も活発なスレの一つなんだよね。
ム板は2chでは一番重要な板だ。
VIPほど人は多くないがVIP住人はそもそも素人集団だ。
2chのあるべき姿を考え行動できるのはこの板しかない。
にもかかわらずこの過疎ぶり。
もう2ch終わったなとしか言いようがない。
なにかとんでもない誤解ししている。 2chのあるべき姿を考え行動するのはこの板でも、VIPでもν速でもない。 ススキノで遊んでる中年オヤジと、フィリピン在住のアメリカ人だ。
twitterで議論してる奴って、スラッシュドットとかはてなダイアリーで偉そうにしていた 自称ITコンサルとか自称ジャーナリストとか、わらわらしてそう。
twitter民はネット社会の勝ち組。 これで満足か?
まぁ・・負け組は自分からやめていくからね・・・
631 :
デフォルトの名無しさん :2010/05/02(日) 18:49:40
両方使えばいいやん スレチ過ぎ しかしこのスレみてたら 今更ながら下からCとgoとscalaと javaとjsとpythonの6つで十分だなと思う
Cとpythonで十分だよ
Haskellにしとけよ
Haskellは遅延評価であるがゆえに速度的に越えられない壁が・・
まあそういう クリティカルなところは正格評価させりゃいいからさ
>>637 いや、原理的にすべての値のクロージャ変換があるからなんだけど、
最適化でなんとかなるような気もするんだけど、なんともなっていない気がする。
RWH読んだか?
640 :
デフォルトの名無しさん :2010/05/02(日) 19:38:09
関数型言語なんか、永遠にマイナーなんだからすっこんでろよ。
Ruby World Hacking
関数型言語は神のような存在だよ。まさに全知全能。一般人には手の届かない存在なのだ
誰にも信仰されない神様
その神がいるのが博麗神社
悪魔は嵐の中から君たちの心に入り込む。神の道は狭い。
名前にVなんとかとか#とかついてる奴らのことだな
関数型なんて考えるのが間違っているんだよ。 モジュールのインターフェイスをどうするかという汎用視点で考えりゃ良い。 関数型はモジュールの影響が内部に閉じているだけだろ。 局所化の度合いは強いけど、モジュールの中と外を対称化できないコストもデカいから大変だな、 ぐらいで考えりゃいいだろ。
関数型のコードは括弧が沢山あって大変だな、 ぐらいで考えりゃいいだろ。
>>639 RWHはHaskellの仕組みには言及していないぞ
最適化について徹底的に追っている章があるだろ
気をつけろ
生徒会が
長く深淵を覗くならば、深淵もまた等しく生徒会を見返すのだ。
極上生徒会
すまねえ。俺がscalaなんてのを入れたばっかりに。。。
幸運を祈る
657 :
デフォルトの名無しさん :2010/05/02(日) 23:02:29
OCaml(実用レベル) D(インディーズ) Go(未完成) どれかを使え
なぜか命令形…(ゴクリ
660 :
デフォルトの名無しさん :2010/05/02(日) 23:20:49
MSは Visua F# 2010 Express を何で出さないんだろうな。がっかりだよ。
岡村さんなにやってはるんですか。
662 :
デフォルトの名無しさん :2010/05/03(月) 01:21:39
リストでもタプルでもいいからヴァリアント型の順序付き集合が欲しいな。
不沈艦googleの名を冠し神が作りたもうたgoに負けは無い
googleは有り余る金でパフォーマンス的にあれやこれやと浅く広くやってる感じだろ 検索サイト以外は微妙。ハンパなネットユーザーは至れり尽くせりだと感じてるのかもしれないが
>>665 浅く広くは自分の子とじゃねえか。ちゃんと使ってみてねえだろ
Ken Thompsonだから看板に申し分ねえし、
まだ未完成とはいえなかなか悪くねえ言語仕様だよ
アホがよってくるオブジェクト指向と誰もついてこない関数言語を避けているのは賢明だ
は?一瞬も使った事ねえよカスが
ググッても出てきません!
演算子を定義できるってことは文脈に依存する文法だから 文脈自由文法の範囲外なのですね
文脈自由とかBNFとかいう言葉をここまで見るスレも珍しいよ。どんだけ初学者ホイホイなんだ
>>670 軽口を叩いて生み出される物があるなら教えてください
反感
反感は生み出すものではなくて買うものです
買うのは生産者じゃなく消費者だよ
矛盾している。反感を買うって変な言葉だな
文脈に依存しない、すなわち自由であることは文法が固定されるということです。 それはつまるところ言語の設計者のみが文法を変更できるということになります。 文脈に依存することによって言語設計者だけではなく、 言語を使う人も文法を変更することができるようになります。
677 :
デフォルトの名無しさん :2010/05/03(月) 02:50:40
678 :
デフォルトの名無しさん :2010/05/03(月) 02:54:03
C一族が嫌いでネイティブ高速が必要ならML系しかなかろう
スレ違いだがいかにもMSは長期凋落の会社らしいわな javaとOCamlの方言とか作って何がうれしいんだ
自前で持っとけばビジネスになるだろう? Word&Excelだっていつのまにかメジャーになったし
681 :
デフォルトの名無しさん :2010/05/03(月) 09:58:24
言語仕様検討に戻って、3項演算子って必要か? 無くても何とかなるけども、あれば便利ってのは 分かる気がするんだよね。 Wikiを見ると、pythonでは順番を変えて導入とか 書いてるし。 ンで、pythonの順番はただしいと思うのだけれども、 どうも3項演算子やってると読みにくい感じも有って。
if が式であればいらない
BNFは文脈自由文法を記述する記法なので文脈依存文法を記述することは出来ません。 したがってBNFではユーザー定義可能な演算子のある言語を正しく表現することは出来ません。 違和感があったのはこのためでしょう。 文脈自由であることが絶対的な物であるという思い込みが 文脈依存なものを排除したくなる要因なのではないでしょうか?
hoge(if (...) { ... } else { ... }); C風文法だと関数型言語と違って違和感あるな 慣れの問題か
3項演算子は要するにBNF的な記述が出来るのがメリット 例えば e = switch(true){ case a == 2 => b case a == 3 => c default => d } というようにswitch文を式として強化したもので代用できればそちらのほうがよい
3項演算子はマクロ関数を作るときに必要だが
inline関数や最適化機能で代用できるので
新入社員には使わないように指導している。
switchは定数との一致だけでなく変数との比較が記述できれば
使い勝手が増すが
>>685 のようなものはif文を使うべき。
そのあたりはパターンマッチングで包括して扱えば良い。 パターンマッチング自体をどうするか議論しようぜ。
688 :
デフォルトの名無しさん :2010/05/03(月) 12:21:47
実装が大変になりそうなんだけど、列挙型は値の指定が出来ない変わりに、 範囲内と言うことを強く型付けしたいと思う。 例えば enum Weekday { SUNDAY,MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATRUDAY}; とした場合、 Weekday day; day = SATRUDAY; day++; if(day == SANDAY){ // OK SUNDAY } となるような感じ。 また、char* dayname[Weekday]; と定義すれば、 char* pday; pday = dayname[7]; でコンパイルエラーが出るような事に死体。
689 :
デフォルトの名無しさん :2010/05/03(月) 12:23:52
しかし、 char* pday; int count=6; count += 2; pday = dayname[count]; は通ってしまうくらいの感じで。
>>688 列挙型ではなく、順序型という別の型を作ったほうが良いな。
>>686 if (a) {
hoge[i][j] = foo;
} else {
hoge[i][j] = bar;
}
と
hoge[i][j] = (a ? foo : bar);
だと、分かりやすさに関してはどっちもどっち(趣味嗜好の範囲)だが、
if を使うと左辺コピペミスや修正ミスの入る余地があるのが
個人的には問題あると思う
>>691 if (a) x = foo;
else x = bar;
hoge[i][j] = x;
個人的には?:は結構使う方だけど、
そういうのはこう書けばいいと思うよ
コピーにコストのかかる型の場合はどうするよ?
694 :
デフォルトの名無しさん :2010/05/03(月) 13:23:07
>>690 むしろ、今の列挙型の方が、順序型だと思うのだが?
Haskellの代数的データ型は超ベンリ
foo_t *lhs = &hoge[i][j] if (a) *lhs = foo; else *lhs = bar; でいいんじゃね
強い型付けって点ではC++0xのenum classが似ているけど 配列サイズに型名を指定ってのはできないな
>>696 どちらにしろテンポラリが3つ並ぶのが心臓に悪いというか、
ただの代入ごときでテンポラリが入る事自体がちょっと・・・と思ってしまう
* <- これアナルに見える
>>698 俺も?:派だけど、こういう書き方しとくと、デバッグ時に便利なこともあるよ
まーね [] がオーバーロードされてる時とか
702 :
デフォルトの名無しさん :2010/05/03(月) 13:46:52
>>689 ん?
> pday = dayname[7];
は、コンパイルエラーにするけど、
> int count=6;
> count += 2;
> pday = dayname[count];
は、エラーにするなと?
だったら、
int count = 8;
pday = dayname[count];
は、どうするの?
>>697 > 配列サイズに型名を指定ってのはできないな
Pascal, Ada は可能だったような気がする。
703 :
デフォルトの名無しさん :2010/05/03(月) 13:55:17
>>702 単に、動的評価(添え字が定義の範囲かチェックするコードを生成することになる)
はまではやらないってこと。
静的評価は出来るのでやるぞ、そう言うこと。
わかってるヤツも書いてると思うが gccの拡張は制限はあるが ブロックは値を持つ 配列の宣言は定数じゃなくていい
705 :
デフォルトの名無しさん :2010/05/03(月) 14:05:54
>>704 何が言いたいのか分からん。
C言語に代わる言語を設計しようっていうスレだよ?
だから? 情報提供に「何が言いたいのか分からん。」て、何が言いたいのか分からん。
>>703 そう言うことか、
>>689 だと「エラーにするな」のように読めた。
最適化で
>>689 でもコンパイルエラーになるケースはありそうだが、
それはいいんだよね。
個人的には、enum と int が混在しててもエラーにならないと言う
のは受け入れ難いけど。
enumとintを分ける必要無いだろ。統一したら? せいぜいコンパイル時整数と実行時整数を分けるぐらいだと思うけど。
型エラーにならないほうがおかしいだろ
>>688 は半端すぎるように思えるなあ
意図が分からん
っていうか、全然「強く型付け」してないだろ、それは
void foo(int x) { Weekday wd = x; }
これを静的にも動的にもチェックせずに許すんだろ?
intとenumは非互換として、
どうしてもintとenumを変換したいんなら、実行時チェックを行う
dynamic_castっぽい仕掛けを使えばいいんじゃないの
Weekday wd = dynamic_cast<Weekday>(x);
Weekdayの範囲に入っていなければ、bad_castをスロー
まあCのレベルの言語なら別の仕掛けになるだろうけどな
711 :
デフォルトの名無しさん :2010/05/03(月) 16:56:58
>>707 >個人的には、enum と int が混在しててもエラーにならないと言う
>のは受け入れ難いけど。
その通りだ、配列の宣言にenumを使える変わりに、そこはenum
型にすれば良いんだ。確かにおっしゃる通し。
連想配列のキーにenum型が使えるってことだね。 それはそれでいいかと
普通の配列の方が効率が全然いいから 実装上、連想配列でenumはおいしくないな ま、言いたいことはわかるがね
しかしintとenum互換てのは低レベル記述じゃ便利 がちがちな列挙型というとPascalとか思い出すよw
715 :
デフォルトの名無しさん :2010/05/03(月) 19:50:03
>>714 言語を設計しようっていうスレなんだから、
ニュース速報系みたいな、そういう気分を語られても困る。
こういう場合こうなって便利とか書いて欲しい。
>>713 やるとしたら、普通の配列で行くべきだと思ってる。
連想配列とかはライブラリ対応。
まあ気楽にやれよw バイナリのインターフェース書くのに enumが順序不明ベース型不明とかじゃやりにくいだろ?
なんでもごった煮できる言語がいいなら、ポインタと整数の区別もなくすといいな。 ついでに変数も、a は a[0] の意味ってことにして、配列と一本化。
なんでもいいからenumの値全部についてループできるようにしてくれ
>>716 > バイナリのインターフェース書くのに
そんなところに enum 使う状況が想像できない。
>>714 ,
>>717 「本物のプログラマ」用の言語ですか?
アセンブラ
BASICのVariantは型がはっきりしないところがバカにされる原因になっていたが、最近はやり出した動的型付けの言語はまさにそう。
>>721 > BASICのVariantは型がはっきりしないところが
はぁ? Variant の型がはっきりしないなんて初耳だ。
型をはっきり意識せず使っててバカにされてる奴はいたと思うが。
>>721 型が変数に結びついている=静的型
型がオブジェクト/インスタンスに結びついている=動的型
ってだけの話
動的型だが型付けの強い言語もあれば、
静的型だが型付けの弱い言語もある
馬鹿にされるべきはどっちかっつーとお前なんじゃね
そういえばC++で開発された動的言語が少ないのは、型を崇拝しているからなのか
Variant型が気にくわなければObject型でもいいよ。
「最近流行りの動的型言語」がどういうものか見せてやる 分かったら糞して寝ろ >>> x = 1 >>> y = "this" >>> type(x) <type 'int'> >>> type(y) <type 'str'> >>> x + y Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: unsupported operand type(s) for +: 'int' and 'str'
>>719 いんだよ。enumなんて構文にとりこんだ定数定義みたいなもんで。
それだけで不要なマクロなくせる訳だし
計算しちゃっておかしくならないよう演算を制限するだけでよし
>>726 COM VARIANTとの違いを説明してくれ。
VBでこれはできるか? みたいなのはよしてよ。
>>728 は?
>型がはっきりしない
>最近はやり出した動的型付けの言語はまさにそう
とか馬鹿げたことを言ってるようだから、動的型言語の実例を見せただけだよ
動的型付けはコンパイル時にチェックできないのが痛いな。ランしてみないとエラーが分からない地雷みたいなものだ。そんなの怖くて客先に納入できないよ。 ちょっとしたスクリプトには良いが、大規模になるときつい。
>>730 単にテストのカバレッジ率が低いんじゃねえか
といいたいところだが、テストが多くなるのが動的型言語の欠点だわな。
Cの代わりになる言語は静的な型でいいだろ
>>729 BASICという言語をわざわざだしているのに、型がはっきりしないという言葉をそのように曲解するという思考がよくわからない。
>>732 いや、VBのOLE VARIANTって要はタグつきunionだろ?
本質的には動的型言語におけるオブジェクトと一緒だよ
変数の型として(静的に)データが何者かを記述しているのではなく、
自分が何者かを「データ自身が」知っている
「知ってる」んだから、「はっきりしない」というのはおかしいね
それで「馬鹿にされる」とかいうのも意味不明
void*よかValiantの方がまだ実行時にチェックできるだけ ましなデータ型なんだが 中身が何であれ勝手に型変換して通してしまうのが バカにされる原因だろ
VBはバカに使わせる言語だからしゃあねえ MS系言語は頭悪いから次行こう
企業としては正しい
>>733 Option Strict を使わず、なんでもVariantにするやつをバカにしていたもんだけどな。
このコンテキストではっきりしないというのは、実行時まではっきりしないという意味だろ。
それ以外の解釈法は私には発想できないな。
>>734 C++のキャスト演算子や非explicitなコンストラクタのことですね分かります
そういえばC++で開発された言語が少ないのは 文字列処理はランしてみないと入力文字列をチェックできないからなのか
ブートストラップしにくいし ランタイムかくのにC++いらねえ 言語処理はCでも十分
C以外に自分自身で書かれている言語って何かあるのかな?
C++みたいな変な色の付いた言語を 新たな言語設計者は好まないだろうな
>>741 もっと高級な言語だと結構あるよ。
例えばlispとか
745 :
デフォルトの名無しさん :2010/05/04(火) 00:11:32
言語じゃないけど、gccも自分でコンパイルするしな。
746 :
741 :2010/05/04(火) 00:11:53
Dim range As Variant Set range = [A1] range = 3 ' さあどうなるか
749 :
デフォルトの名無しさん :2010/05/04(火) 07:26:12
記号演算子を減らして整理整頓したいんだけど、 ”<<” ”>>” のシフト演算子って記号じゃなくて、 プロパティで対応するってのどうだろうか? 例えば、 AreaOfTriangular = base * height >> 1; AreaOfTriangular = base * height.rightshift(1); ただこれだと演算子の優先順位の問題が出てくるので、 精度を確保したい場合、こうやって。 AreaOfTriangular = (base * height) >> 1; AreaOfTriangular = (base * height).rightshift(1); こういうのも有りって事で。ビット演算子も、同様に radius.and() radius.or() radius.xor() radius.not() 代入については全体に宗教論争になると思うので後回しにするとして、 && は AND に、 || は ORにしたい。
SmalltalkとRubyですね
>>でシフトってわかりやすいじゃねえか むしろfoo >* 4でrorとかbit単位で使える範囲指定子とか 代入、コピー、演算なんかが欲しいね 他にbit型とかでbit var[100][2]とかで2bitx100の配列とかそういうの 変な記号が多いとわかりにくいが、アルファベットばっかも読みにくい
ああ重箱隅つつきだが、/2の代わりに>>と書くのは余り良くないぞ
753 :
デフォルトの名無しさん :2010/05/04(火) 08:26:56
>>751 C言語の良さは、演算子がsizeof除いて総て記号で統一されてる事にも有って、
その伝統を大事にしたいと言う気持ちはもの凄く分かるんだけど、それならば
C言語で良い訳だよ。
C言語からC++ときて、0x、拡張されている内に、記号演算子が増えすぎた
のと、優先順位だとかなんだとか、で、読み辛く、実装依存が増えすぎたと思うんだ。
なので、ここらで整理したいってのが
>>1 なので、そういう視点からの反論が
欲しいんですよ。こんな問題が起きるとか、結局は混乱の元とか。
>>749 ビット演算はあまり多用しないだろうから、記号じゃなくてもいいと思う
&&や||はあった方がコードが見やすくていい
755 :
デフォルトの名無しさん :2010/05/04(火) 08:32:35
>>752 計算式の中のビットシフトという事を表現するのに良い例が
見つからなかったので。
>>751 追加、ビットロテートはIntelぐらい?Intelというかx86ぐらい
しか持ってない?その辺詳しくないんだけど、それでそちらの対応は、
あれじゃない、CPU依存言語拡張、前から言ってるENVIRONMENT
DIVISIONの導入で、
unsigned int aa=1;
aa.intel_rot(4);
とかどうだろ?intelにするかx86にするかとか有ると思うけど、
それは後の議論だ罠。
756 :
デフォルトの名無しさん :2010/05/04(火) 08:43:42
あーーーーーー後、今思いついたんだけど、 .rightshift(); .leftshift(); .rightlot(); .leftlog(); って面倒だから、サイン付きで+なら左、マイナスなら右って事で どうだろ? aa << 4 == aa.leftshift(4) なので aa << 4 == aa.shift(4) aa >> 4 == aa.rightshift(4) なので aa >> 4 == aa.shift(-4) 実装出来るのか?
>>754 組み込み屋だかんな
ビット演算なんて普通に多用するし
しょぼいCPUなら多彩なbit演算やrorができたら速くなる演算もあったりすんのよ
bitmapテーブルなんかもよく使うし。
でもCPUにbit演算機能があってもCからは使えなかったりする
演算の種類なんてむしろもっと増やして積和演算用の演算子とか
並列演算範囲の指定とか欲しいね
ま、そういう要求もあるってことね。
富豪なPCクラスのシステムだけ考えるならいまさらCの代替品なんて山ほどあるし
C言語のシフト演算の欠点はキャリービットみたいな桁あふれ情報が消えちゃうこと。 おかげでアセンブラよりシフト演算が面倒になってる シフト演算を実装するなら、桁あふれ情報を保持してほしい (ついでにCPUのフラグレジスタの情報もあると便利かもしれない) uint8_t x = 0xaa; x.<<(2); #記号でも単語でもどっちでもいいけど puts x.flood; #=>2 #2ビットのシフト演算で溢れたビット(2b'10) uint32_t x = 0xffff.ffff; x += 1; puts x; #=>0 puts x.carry; #=>1 とかね
760 :
デフォルトの名無しさん :2010/05/04(火) 09:01:00
>>759 それなんとかしたいんだけど、どんな表記構文にすれば良いか
タイミングの問題が有るじゃん。
例えば、
bb = aa.leftshif(4) * 5;
という構文にどうやって突っ込むのが分かりやすいか?
後、機械語に落とせる構文じゃないと不味いし。
キャリーフラグとかないCPUはどうすんだよ
その部分だけアセンブラでいいだろ。
763 :
デフォルトの名無しさん :2010/05/04(火) 09:13:25
>>761 だから、それはCPU拡張で行くんだよって言ってるだろうが。
対象CPUに対してコンパイラ作るんだから、その辺言語仕様で
定義しておけば、新しいCPU作りやすいし、コンパイラも作りやすいじゃん。
CFを持ってるCPU
INTELのCF
をどう交通整理するのかはもう少し後で考えるとして。
言語から、intel_cf 定数を操作出来る訳だよ。
それをどんな構文で扱う事にすれば良いのかて話。
で、例えばintel_cfを使ったプログラムをCFを持たないCPUで
コンパイルするときには、基本的にコンパイルエラーもしくは、
CFを扱えるコードを生成するとかね、そういう風にやっていけば良いと思うんだ。
リファクタリングを視野に入れた言語って事かな?
インラインアセンブラでいいだろ。 言語をややこしくする意味がわからん。
intelがベースかよ
>>760 演算のたびに更新されるでいいと思うけど・・・
確かに、CPUのフラグ変数はグローバルだから、演算のたびに
設定・参照すると重くなっちゃうね。
普通は通常通りで、べつに、溢れ情報を考慮する演算を追加するのがいいかな
aa.leftshift_with_carry(4) とか
767 :
デフォルトの名無しさん :2010/05/04(火) 09:19:06
>>764 アセンブラ記述してしまうと最適化の恩恵を受けられないから。
CFを見る必要のないビットシフトの場合、CPUによって、
シフト命令の方が早かったり、かけ算しちゃった方が早かったり
するでしょ。そこなんだよ。
s/フラグ変数/フラグレジスタ/
やはり固有言語君だな まずそのIntel-Win-COBOL脳を改善する必要がありそうだなw CPU固有の方言言語なんて誰も考えてないだろw フラグは一見面白そうだがかなり難しいぜw 昔PL/Mで判定に使えたような記憶があるが、 どの演算で変化するかとかCPUによって違うし 最適化すると演算順序変わったり、演算がなくなったり、 関数呼んだら壊れるし、複雑な式のフラグはどうなるのか予想不可能だ
>>761 参考までに知りたいんだけど、それなんていうCPU?
>>767 フラグぐりぐり使っているところに最適化も期待するのか。
>>767 インラインアセンブラは普通に最適化対象だぞ
だいたいそんな命令の置き換えなんてまさに最適化の仕事だろ
SHとか知らんの?
シフトよりかけ算が速いCPUなんてあんの
776 :
デフォルトの名無しさん :2010/05/04(火) 09:31:59
>>772 どういう最適化の対象かって問題ですがな。
ここでキャリーフラグを示すシステム変数の登場
778 :
デフォルトの名無しさん :2010/05/04(火) 09:35:10
>>769 答えたことにまで、異論挟んでくるその知性が
どうにも、答えに対して再反論してくるのなら
ともかく。
uint9_t x; uint33_t x;
780 :
デフォルトの名無しさん :2010/05/04(火) 09:37:17
>>777 じゃなくて、問題はキャリーフラグはCPUグローバルなので
計算の度に更新されちゃうから、どう記述すると違和感なく
扱える構文になるか、って問題で、場合によってはフラグを
退避しても良いと思うんだけどね。そこだよ。
781 :
デフォルトの名無しさん :2010/05/04(火) 09:40:31
C言語って低水準な割に、CPU最大公約数的で残念なんだよね。 CPU最大公約数+対象CPU拡張で、CPU最小公倍数的な言語が出来れば C言語の代わりの新言語と言えるんじゃないのかなって思うんだ。 C言語拡張したいわけでも、もう一つ別のC言語や式言語作りたい訳じゃなく、 そう言うのは、もう既にみんなやってる。
if文拡張して if.carry if.nocarry if.zero if.nozero とか
>>781 > CPU最大公約数+対象CPU拡張で、CPU最小公倍数的な言語
自分ではうまいたとえだと思ってるんだろうけど、何を言いたいのか
さっぱりわからん。
>>782 もうセミコロン廃止して
st1; st2; st3;をst1.chain(st2).chain(st3)にしようぜ。
>>782 +. -. >>. <<.
crc演算が美しく書ける
キャリー持ち越し演算子もいるんじゃね
お前ら具体的なアプリを作る気ないだろ それこそ公約数的で残念じゃねーか
788 :
デフォルトの名無しさん :2010/05/04(火) 10:48:15
>>782 その発想は無かったわ。そっちの方が良いかも。
今考えてたのは、cpu_flg型を作って。
cpu_flg qa,qb;
aaa.leftshift(4,q=intel_cf);
if(q){
キャリーが有った
}
とすればどうだろうかだったんだけど。
ンで、例えば、
DD= aaa.leftshift(4,qa=intel_cf)+bbb.leftshift(4,qb=intel_cf);
if(qa){
}else if(qb){
}
とか書けちゃえて、
この場合は、CFを退避するコードを生成する事にしたらどうだろ?
フラグ持ち越すレジスタとかメモリが必要になっちゃうよ
790 :
デフォルトの名無しさん :2010/05/04(火) 10:50:45
ンで、
>>788 の最初の例では、そのまま直ぐに評価してるので、
CFを退避するコードは生成しないで、2番目の場合は退避しなきゃね
ってコードを生成する。
791 :
デフォルトの名無しさん :2010/05/04(火) 10:52:20
>>789 >>790 で書いたけど、それは覚悟の上で、でも、次のif文とかが
安全ならば、フラグ持ち越さない、フラグを退避しないように
最適化出来たら良いねって事で。
最適化考えるよりは、 フラグがつぶれそうなときは出口でCPU依存でフラグのset/resetする方がいいような
793 :
デフォルトの名無しさん :2010/05/04(火) 11:24:24
聞きたいんだけど。 俺の手元には、x86と、PPC601の命令リファレンスが有るんだけど、 32bit以上のCPUでこれは見ておけっての有る? この際だから、シェアは有るんだけど命令セットが貧弱 そんなCPUな方が良いと思う。 それからインターネットで手に入ると嬉しい。 32bit以下はめんどくさいから考えたくない。
794 :
デフォルトの名無しさん :2010/05/04(火) 13:19:30
新言語としては現行のCPUの細かい仕様にあわせて必要以上に妥協したりはしないから CPUの一般的な機能について知っているなら改めてデータシートを見る必要はないよ。 (もちろん、個人でCPUの勉強するのはいいことだからどんどんやっていただいて構わないよ。) それと、低級言語としては組み込み向けが多いから16ビットCPU以下も対象にしないとね。 (これも、一般的な機能を知っているなら改めてデータシートを見る必要はないよ。)
>>793 命令セットが美しいのは68030とMIPS32
美しくないのはSPARCとARM
潔いのはSHとIA64
796 :
デフォルトの名無しさん :2010/05/04(火) 13:53:29
>>794 君はそれで実装と提案やっていけばいいと思う。
後、組み込み分野でも16bitは終焉してきてるので、
16bitはC言語やアセンブラに任せておけば良いと思う。
そもそも、64K程度なんだからアセンブラで充分だし。
797 :
デフォルトの名無しさん :2010/05/04(火) 13:55:52
>>796 じゃあ、それでおk。
実装は言語仕様が固まった後だけどね。
>>796 > そもそも、64K程度なんだからアセンブラで充分だし。
いまどきそれはないわ。
CPU固有言語君とマシン語の美しさ語る老害のコラボ
今でも組み込みじゃ8/16bitは多いぜ アセンブラなんて冗談かよ
今日、使われてるC/C++製のOSから新言語製のOSが主流になることなんて生きているうちにあるのだろうか?
一生CP/M使ってろ
速度のために安全性を犠牲にする 少ないタイプ量のために一意性を犠牲にする 私は英語を使うので英語だけ扱えればいい いずれもC言語が生んだ悪しき慣習 早々に切り捨てねばなるまい
今日のOSでもアセンブラは使われ続けているので、 新言語の新OSでも裏方ではCが使われ続ける
アセンブラの使用を認めると、Cから変換しただけのコードも認めざるをえない。 全く新しい物を作りたいなら、Cだけでなくアセンブラも禁止するべき。
マジかよ…2進数の世界来たこれ
存在する全CPUの固有命令を包括した開発言語など存在し得ない よってアセンブリ言語禁止など妄言の極みである 何度も言うが抽象化不可能と分かってる部分まで抽象化しようとするな
ますますこのスレの電波度が上がってるよなw
ネタがネタとして機能する範囲内で頑張ってくれ じゃなきゃ腐る
>805 馬鹿だな。全てのプログラム言語が基本的に等価だということを知らんのかね。 >807の通り基本的な部分と特殊な部分を分離するのが普通だろ。 特殊な部分はミニ言語orマクロで実装すれば良い。 だからベースはForth(ry
なにいってんの 全ての道はlispへとつながっとる
どんな言語つくってもいいからさ コンパイル後にCのソースを吐けばややこしいこと考えないで作れるぜ?
低級言語ということをお忘れなく
だから書いたんだよ Cなら中間の言語に申し分ないからな
OS作るのに必要なものは全部ライブラリやスタートアップにでも突っ込めばいい そうすればアセンブリ言語は直接触る必要も無い
最近じゃめっきりアセンブラを使うことは減ったが アセンブリでやる必要があるのはOSだけじゃないがね。 ちょいスレチな風味だが 直I/Oとか割り込みハンドラなどの低レベルライブラリが CPU毎に異なってるのが組み込み屋の悩みだな メーカ提供のライブラリの出来も千差万別だし 言語の話と離れるが、共通化してくれたらいいのにね
817 :
デフォルトの名無しさん :2010/05/05(水) 02:11:09
>>816 しょーがね
それが共通化出来たらデバイスドライバを書くプログラマの仕事が
無くなる事だけは確かだが
悪いageちまった
>>816 mathライブラリなんかもアッセンブラで書かれてるよね。
goのmathライブラリにもある。
./src/pkg/big/arith_386.s
./src/pkg/big/arith_amd64.s
./src/pkg/big/arith_arm.s
./src/pkg/bignum/arith_amd64.s
...
コンパイラのランタイムは四則演算なんかも含めてアセンブラ多いね
高速なメモリコピーとかも。
>>817 デバイスは多用だからそんなことはないと思うが
キャッシュセーフなI/Oとか諸々の奴がね。
同じ名前なら実装はなんでもいいって感じ
OS向けにはまた別途コードはいるだろうけど
今でも速度重視のところはアセンブラ。 普通の人がアセンブラで書いてもコンパイラの最適化に勝てないけど。
822 :
デフォルトの名無しさん :2010/05/05(水) 09:12:43
>>821 コンパイラの最適化が追いつかないって話よりも、
CPU固有の力を効率よく出すのにアセンブラが必要なのですよ。
少し前とは時代が変わってる。
コンパイラも万能じゃない
せっせとアセンブラで書いてコンパイラの最適化に負けたときの悲しさはない
今ではコンパイラの最適化に勝てる場面はせっせとSSE2/3を使って 論理演算をさせた時ぐらいになってきてるよ それ以外の時は手でアセンブラを書く時間でコンパイルして走らせて しまった方がずっと速い
最適化の期待度 ??>VM>コンパイラ>手アセ
アセンブラの必要ステップ数を適当に推定して、コンパイル結果を逆アセしてステップ数が推定に近くなるまでソースをいじってコンパイルしなおしてるな。
超越関数なんかは自分でアセンブラで書いたほうがコンパイラ付属のものより速くできるけどな 数学わからん奴には無理だが
数学わからんがエッチな関数だということは知っている
乗除算の結果をフルに利用する場合は手アセの方が速かったり
インラインアセンブラは構文じゃなくて、関数で実現したらいいと思うんだぜ。
833 :
デフォルトの名無しさん :2010/05/05(水) 11:11:39
>>831 int year=365,week=7,yearofweek,int mod;
”/(剰余=%)”と言う演算子を作ってみる。
yearofweek = year /(mod=%) week; //...(1)
”/(剰余)”と言う演算子を作ってみる。
yearofweek = year /(mod) week; //...(2)
”/(剰余)/”と言う演算子を作ってみる。
yearofweek = year /(mod)/ week; //...(3)
”/剰余/”と言う演算子を作ってみる。
yearofweek = year /mod/ week; //...(4)
これは駄目だな、余剰を取らないのと区別付かない。
”/%=剰余”と言う演算子を作ってみる。
yearofweek = year /%=mod week; //...(5)
右向き代入と左向き代入が混在
”/剰余=%”と言う演算子を作ってみる。
yearofweek = year /mod=% week; //...(6)
=%と区別がつかん。
”/剰余%”と言う演算子を作ってみる。
yearofweek = year /mod% week; //...(7)
すっきりして良いかも。
なので、(1)か(7)でどうだろうか?
分かりにくいわ
実際にこういうコード書いてるんだろうなあ…
836 :
デフォルトの名無しさん :2010/05/05(水) 11:18:44
>>834 気持ちは分かるんだけど、インテルのCPUだと、DIV命令で、
商と余りがいっぺんに出るんだよね。まぁ当然と言えば当然なんだけど。
なので、旧来のC言語の記法だと、商と余りを得るために、ただでさえ
重たい割り算を二回発行しなきゃならないんだよ。
それをどうやって構文の中に織り込んでいくのが良いかって事で、
読みにくいという批判は重々承知の上で、それでもまだ我慢できる
そういう記法を考えて欲しいんだよ。
日本語とコメントが汚いだろ
year of weekってなんなん?
weeksinayearを言いたかったと思われ
こいつの書いたドキュメント読みたくないなぁ
一週間が何年か?ってことだろ だいたい0.02年くらいか?
逆だろ普通。
int year = 365; int week = 7; int weeks_in_a_year; int mod; // :% … 左側に商、右側に剰余を出す演算子っぽい何か weeks_in_a_year :% mod = year / week; //#せめてこのぐらいは…
俺も何言ってるのか分からんな
845 :
デフォルトの名無しさん :2010/05/05(水) 12:01:47
>>843 それも考えたんだけど、
weeks_in_a_year :% mod = year / week;
weeks_in_a_year :% mod = year / week * 7/5;
の場合どうしようもなくなるので、UPしなかった。
846 :
デフォルトの名無しさん :2010/05/05(水) 12:01:52
ゆとりはdiv関数も知らんのか 内部実装と最適化次第でx86のdiv命令直接操作と同等のコードが得られるのに。
847 :
デフォルトの名無しさん :2010/05/05(水) 12:03:04
>>846 だから、関数でOKというのなら、C言語使ってれば良いんだよ。
>>843 std::pair<int,int> divmod(int lhs,int rhs)
{
return std::make_pair(lhs/rhs,lhs%rhs);
}
//
boost::tie(weeks_in_a_year,mod)=divmod(year,week);
複数パラメタ出力作ってほしい int q, r, a, b; (q,r)=div(a,b); unsigned int x, y, z; bool c; (z,c)=add(x,y); こんな使い方ができる あとはビット連結(::)とか、その左辺値代入とか。 c::z = x+y;
ビット連結てなに?
>>850 32ビット2個を並べて64ビットとして扱うような。
ビッチ連結ってなに?
simdじゃダメなんだべか?
こういうアホな要求が言語仕様をぐちゃぐちゃにするんだよね とくに腰の軽いスクリプト系で
スクリプト系は作者が使い易いと思えればそれでいいって感じ
857 :
デフォルトの名無しさん :2010/05/05(水) 13:07:29
各社、各CPUのSIMDを比較サイトって無いかな? MMXから考えると沢山有って、ややこしい。 それぞれに、アセンブラ使ってくれ、という時代が長かったから しょうがないんだろうけど、後今度インテルが全面的に更新した 命令セット出すとか言ってるし。
>>836 商と剰余が同時に求まるのは別にインテル CPU に限ったこと
じゃなくて、割と一般的な動作だよ。
問題は一つの式から二つの結果が返るのをどう扱うかの問題で
片方の値を特殊変数に返す (1) とか、複数値を返す構文 (2)
を作るとかがよくある手だよな。
(1) yearofweek = year / week; mod = _mod_; // _mod_ が特殊変数
(2) (yearofweek, mod) = year / week;
ただどっちの方法も、除算を複数含む式の扱いがスマートにで
きない。なんか、いい方法あるかなぁ。
だから、関数でいいだろ
>>860 > 除算を複数含む式の扱いがスマートにできない。
結局演算子とか構文を変えるとかその程度の話か
タプルみたいなのじゃなく多値返すのが普通な仕様なら 低レベル的にも効率よいな 関数でやるのは組み込みかinline関数必須で参照渡しなのが汚いんだよね
だからさ、多値ってsimdとどう違うのさ?
(yearofweek, mod) = year /% week;
多値は言語レベルの概念で、SIMDはアーキテクチャのレベルの用語で、 レイヤが全く違わないか?
多値でやるならコンテキストでわけて 商 = a / b 商, 余 = a / b でいけるわな 左辺にカッコつけるとリストやタプルみたいなんが構文的に必要になるからダメ
実際にリストやタプルを生成しないで タプル構文を導入すればいいんだね
Cの返り値は基本レジスタに入れて返すのだけど、複数の値を返す場合の ノウハウがないのが問題のようなので、多値を返せる関数フレームのあり方 はどうあるといいのか考えてみては?
複数の戻り値を返せる言語はあるでしょ
>>869 >>870 の議論の通り実装については
> 機械語レベルでは構造体の返却と同じ扱いで実装可能
で全然問題ない。
メモリーを使うかレジスタで返すかは CPU によっても違うし。
問題は、わかり易い構文をどうするかで、
>>870 のリンク先でも結論
出てない。
873 :
デフォルトの名無しさん :2010/05/05(水) 19:30:10
>>872 CPUじゃなくてコンパイラじゃ?
当然、コンパイラがどちらを選択するのかっては、
CPUで決めるんだろうけど。
,で並べると複数値のコンテキストつー感じでいいんじゃないの Cの,演算子を見直して構文要素とするか複数コンテキストを作る演算子とする すると多値戻り値も関数引数も多値の演算もすべて複数値コンテキストとして同列に扱える c,d = foo(a,b=1,5*2,3)なんてのも許しちゃう 複数値を返す関数の戻り値をそのまま次の関数に渡せるし。
>>873 レジスタ数と戻り値の型や数で決まるんじゃない
基本型2-3個くらいならほとんどのcpuでレジスタだろうし
続きの使い方次第ではスタック積んだり、入れるレジスタを最適化したりできそう
876 :
デフォルトの名無しさん :2010/05/05(水) 19:38:03
>>870 のまとめはまとめじゃなくて、議論の出発点だな。
>>874 プログラミングモデルで考えると、おいらはむしろ、
戻り値を返さない事にしたい位だけどなぁ。
boolしか返せないようにしたいんだけど、現実的かどうかで
少し悩む。
LWLに馴染んだ人かな?
>>874 Cで書かれたpythonで出来てるんだから当然出来るんだろうが
今なにを問題にしてるんだっけ
>872 構造体戻しにするんだったらデータを引き出すのは呼び出し元の責任だよ。 呼び出し元の負担を低減するんだったらデフォルト値を用意するという手があるけど、 デフォルト値を戻して欲しいのか多値を戻して欲しいのかはやっぱり呼び出し元の責任だわな。 それよりも多値をバラして使いたいときの方が面倒だな。Cの場合だと一度変数に代入して名前を付けなきゃいかん。 Delphiのwithみたいなのが欲しいけど、構文の話なんで後でも良いや。
>874 そこまでやるならForth(ry
>>873 > CPUじゃなくてコンパイラじゃ?
確かにそうだな。
CPU によって、レジスタで返しやすいやつとそうでないやつがあるって
言う意味で書いてた。
882 :
デフォルトの名無しさん :2010/05/05(水) 20:11:19
>>881 多値戻り値を議論してるときにそれは無いわ(w
多値戻りは、戻りを組み立ててはばらす処理を頻繁に行うことになる。タプルなら組み立てたまま扱えるメリットがあるな。
>>874 > 複数値を返す関数の戻り値をそのまま次の関数に渡せるし。
int, float foo(int);
void bar(int, float);
bar(foo(1)); ってやると、
int i;
float f;
i, f = foo(1);
bar(i, f); ってなるってこと?
foo() の、int だけ使いたいときはどうする?
つまり、i, f = foo(1); bar(i, 1.0); ってやりたい時。
>>877 「新たなプログラミング言語」なんだから、既存のやつは
気にしなくていいんじゃね。
>>884 じゃあ、今まで通りi, j = 0;なんて書くとどうなるんだろう。
こんなことで悩むぐらいなら(i, j ) = foo(1);と書かせればいい。
ついでにvoidに代入できるようにして、(i, void) = foo(1); bar(i, 10);
とさせればいい。ついでに関数の引数リストと
(x,y,z)記法を同一視できればいい。
#どんどん変な方向へ。
> つまり、i, f = foo(1); bar(i, 1.0); ってやりたい時。 bar((i=foo(),i),1.0); でいいんじゃないかな?
多値戻り値なんて、テンポラリオブジェクト作って そのアドレスを渡しまくればいいだけ
>>878 タプルみたいなのはデータ型を導入せにゃならん
Pythonの多値はそんな奴だね
>>884 まさにそんな感じ。多値の一つを選択したいなら
bar( i,f = foo(1); i, 1.0)
てな感じでどう。
>>885 i,j = 0は多値コンテキストにシングル値代入だからエラーだ
多値はgolangをイメージしてるんだが引数にはできないんよね
あっちはvoidじゃなく_が捨て変数だね
ちなみにgolangは代入は並列に評価されるからa,b=b,aでswap
a,b=1,2*2,3は出来なくてa,b=1*2,2*3だ
あ
とタプルつーより引数も戻り値も無名で型推論からstructの実体を作るような
イメージを考えたらいいんよね
>>887 構文に組み込めば ({a as int ,b as int ,c as bool})func();
呼び出し側が任意で返り値を捨てられる。if ((x)=func)〜 → if (x=a,(bool)c)〜
従来型のモノな返り値型と互換性が保てる。if (func()) 〜 → if (func(),c)〜
美的感覚のない文法を量産するでない
>>886 ,
>>888 > bar((i=foo(),i),1.0);
> bar( i,f = foo(1); i, 1.0)
う〜ん、一時変数は避けられないか...。
だったら、個人的には素直に2文に分けて書くようにした方が
いいように思う。
>>882 何を言いたいんだ?
892 :
デフォルトの名無しさん :2010/05/05(水) 21:37:13
>>890 言ってもしょうがないから、多値戻りは彼らに任せてしまえば良いと思う。
bar((use, ) = foo(), 1.0); bar(( , use) = foo(), 1.0);
多値戻しで何を実現するの? 構造体でダメな理由は? 単にバラすのが面倒というのなら、それこそパターンマッチングを応用すれば良いのに。
多値のn番目を取り出すのであれば、 bar(foo()[0], 1.0);とするとか? 関数の引数は多値であると考えると bar foo() で、fooが多値ならbarの引数として渡せるといいのかも。
>>894 構造体だといちいち定義しなければならない。
定義しなくても使えるtupleで十分なんだけどな。tupleの状態で取り回せるのでいちいちばらす必要も無いしな。
タプルだとオーバヘッドがあるだろ 構造体をいちいち定義するのも面倒 パターンマッチって意味わからん データ型を想定しないで多値のコンテキストってを考えたら? first classで扱っても面白いけど、皮むかないと普通の関数に渡せないよな
898 :
デフォルトの名無しさん :2010/05/05(水) 22:32:28
>>896 それは、LWLの考え方だと思うんだ。
定義することが一々なのか、ライブラリになってしまって
実装詳細を得られ無い事や、変更されたときにどうするっていう
視点が無い。
この視点がないのが問題。
己をよく知ってから、言葉使い選んだ方が良いよ。
読みにくいかな? seconds を sec, min, hour, dayに分解。 #include <stdlib.h> div_t t; t.quot = seconds; int sec, min, hour, day; t = div(t.quot, 60); sec = t.rem; t = div(t.quot, 60); min = t.rem; t = div(t.quot, 24); hour = t.rem; day = t.quot;
>>899 今まで出てきた中で一番分かりやすいな。
901 :
デフォルトの名無しさん :2010/05/05(水) 22:40:42
> 己をよく知ってから、言葉使い選んだ方が良いよ。 正直、鏡を見てみることをお勧めする。
rest, sec = second / 60 rest, min = rest / 60 day, hour = rest / 24
903 :
デフォルトの名無しさん :2010/05/05(水) 22:45:23
>>901 LWLの考え方、と言う部分には反論無しかな(www
>>902 sec, rest = second / 60
min, rest = rest / 60
hour, day = rest / 24
名なしの型はいいが、名なしのフィールドは間違いの元
今のコンパイラなら
>>899 のソースで
これくらいのコードは吐いてくれるだろう。
mov eax,[second]
xor edx,edx
mov ebx,60
idiv ebx
mov [sec],edx
xor edx,edx
mov ebx,60
idiv ebx
mov [min],edx
xor edx,edx
mov ebx,24
idiv ebx
mov [hour],edx
mov [day],eax
これのどこが不満なんだ。
mov ebx,60が2回あったら不満なのか。
水と安全があれば良いのに、なぜか満たされないんだよね
907 :
デフォルトの名無しさん :2010/05/05(水) 22:58:21
scalaでの多値 object a { def main(argv:Array[String]):Unit = { var a,b = foo(); var (c:Int,d:Int) = foo(); var e,f:(Int,Int) = foo(); var (g,h) = foo();//型推論 var (i,j):(Int,Int)=foo();// warning // i,j = foo(); error // (i,j) = foo(); error } def foo():(Int,Int) = { return (1,2); } } 実装はジェネリックスを使ったjavaのclass。Tuple2〜Tuple20がある。 cのレベルで考えれば型情報のポインタ付きの構造体。 構造体を生成しなくてすませられるかどうかはJVM次第。
908 :
デフォルトの名無しさん :2010/05/05(水) 23:00:15
>>907 いい加減にしてくれよ、C、C++の置き換え言語を作ろうって
話なのに、OSごとくっついてくるjavaの話されても困るんだって。
909 :
デフォルトの名無しさん :2010/05/05(水) 23:04:18
>>905 OS作るときには標準関数無いから。
こっから話さなきゃ駄目?
>>909 算術演算ライブラリも無いのか。
FPUの無いCPUではdoubleは使えないのか。
それは困った。
おまえら LISPを作ろうとしているぞ
>>894 >>897 scalaで書けばパターンマッチングでこのようにかけるので
こういうことだと思うよ
object a {
def main(argv:Array[String]):Unit = {
foo() match {
case (a:Int,b:Int)=>println(a+b)
}
}
def foo():(Int,Int) = {
return (1,2);
}
}
>>908 javaのbytecodeは中間表現に置き換えて
JVMの最適化フェーズでやることをコンパイルタイムにやれば同じでしょ。
914 :
デフォルトの名無しさん :2010/05/05(水) 23:15:39
915 :
デフォルトの名無しさん :2010/05/05(水) 23:16:47
>>913 もしかして、本気で、それが反論たり得ると考えてる?
917 :
デフォルトの名無しさん :2010/05/05(水) 23:19:31
ついったーの餓鬼どもが押し寄せてきてるような気がする(ww
>897 関数の戻り値の型を定義する時にどのみち必要だろ。 別定義が面倒ならばそれこそ関数宣言で戻り値の型を定義できるようにすれば良い。 で、>912みたいにして構造体の一部に名前を付けて活用する、と。
>>904 pythonだったらこう出来るね
def div(dividend, divisor):
quot = dividend / divisor
rem = dividend % divisor
return (quot, rem)
rest,sec = div(second, 60)
rest,min = div(rest,60)
day, hour = div(rest,24)
これはかなり読みやすい。 標準でmathにあっても良さそうだね。
>>905 GCCはだめだった。 IMULとSARの組み合わせを吐いた。
>>917 ジジィどももな
仲良くしようぜ
同じ日本人じゃないか
なに?キモイって?
>>920 それは定数での除算を逆数での乗算に最適化しているな。
idivとか滅茶苦茶遅いから正しい最適化だ。
60と24を引数で渡してやるとちゃんとidivを発行してくれる。
VC++だと/と%を連続して記述してもidivは1回しか発行しないように
最適化してくれる。GCCでも似たようなものだろう。
unsignedの掛け算をunsigned long longにして欲しい時に (unsigned long long)a * b と書いてもmulに最適化されないgcc VC++はどうなんだ
925 :
デフォルトの名無しさん :2010/05/06(木) 16:45:53
多値はリスト型でいいよ
動的メモリ管理乙
タチだけじゃなくてネコの話もしろよ
で、そろそろ何か決まったか?
>>899 改良した。
div_t sec, min, day_hour;
sec = div(seconds, 60);
min = div(sec.quot, 60);
day_hour = div(min.quot, 24);
printf ("%d days %02.2d:%02.2d:%02.2d¥n",
day_hour.quot, day_hour.rem, min.rem, sec.rem);
931 :
デフォルトの名無しさん :2010/05/06(木) 22:53:32
quotって何? せめて div_t の定義でもあれば分かりやすいんだけど。
>>931 つ stdlib.h
typedef struct {
int quot; /* quotient */
int rem; /* remainder */
} div_t;
一昨日簡単な文法はなんだろう、と考えた。 簡単といってもBASIC的な簡単さではなく、 シンプルといった意味の簡単さだ。 そうしていろいろ作ってみたが、要するにそれはLispだった。
Lispだろ、と書くまでもなかったな
935 :
デフォルトの名無しさん :2010/05/06(木) 22:58:22
Forth! Forth!!
frothってよくわかんね 1 2 +ならしってる ポーランド基本ね
・新しいC言語ではタプルがあるとよさそう。 ・最適化技術次第で割り算の商と余りは1つの命令に最適化可能。 ・名前なしの構造体あるいは、ジェネリックスで作成されたものと出来そう。 ・演算子を定義できるように作れば割り算の商と余を出す演算子はライブラリとして作成可能。 ・ただしヘッダファイル等にその情報を記述しておかないとリンクできない。 ジェネリックスをどうするかが課題と。
>>933 Lispの呪縛に囚われずにもっと自由に考えるんだ!
C言語はLispより表現力があるだろう。
C言語の表現力の本質は何だ?
>>938 新しいC言語にジェネリクスとか、演算子の再定義とかいらねーよ
C++でもやってろよ
タプルとヘッダいらんだろ 無名構造体と型推論は欲しいね
演算子の定義もいらんね 定義の混乱したのはスパゲッティじゃなくてなんて言えばいんだろ
GPL汚染
MSベンダーロックインの間違いじゃね
GPL汚染だよ
947 :
デフォルトの名無しさん :2010/05/07(金) 08:57:06
>>938 >・最適化技術次第で割り算の商と余りは1つの命令に最適化可能。
「最適化」という表現は適切ではないと思うが、商と剰余を同時に扱うなら多値型を使うのだろう。
>・ただしヘッダファイル等にその情報を記述しておかないとリンクできない。
ヘッダファイルはいらないだろ。
他の言語と同様にIDEの使用を前提として C/C++のヘッダファイルを不要にする。 共通ライブラリは外部参照として別途設定し 宣言は自動的にスコープ内に反映させる。 リアルタイムで構文エラーをチェックする。 これだけで敷居が大分下がる。
Javaの強みはファイル単体でコンパイルユニットが完成してしまうこと。 Cと違ってファイル単品で文法レベルならパースできる。 これがJavaのIDEを強力にさせてる。 Cだとインクルードはあるわ、 マクロがトークンをいじったり、トークンを結合したりできる。
950 :
デフォルトの名無しさん :2010/05/07(金) 11:08:45
組み込みならどうせクロスで開発するんだから、 現在の標準的な開発機で現実的な時間でコンパイルが終わるのであれば 必要以上にコンパイル速度に配慮する必要ない。 コンパイル速度のためにプログラマーに必要以上の手間をかけさせない方がいい。
じゃあJAVAでよくね?携帯でも使えるし
>既存の言語を使って何かをすることが目的ではなく、新たなプログラミング言語を考えることが目的であるから、 >「既存のXX言語を使えばいい。」という類の発言は無意味である。
>>952 じゃあ今までの議論には意味があったとか思ってるの?
>>949-950 インクルードは悪しき伝統だよな。
コンパイラ屋がサボりたいだけだしな。
確かに実装を隠蔽できるというメリットは確かにあるが
もう少し便利になってもいいと思う。
その議論は終わってる。
その結論は?
959 :
デフォルトの名無しさん :2010/05/07(金) 13:18:17
ヘッダは要らない。 実装を隠すためにとかで、どうしても必要ならばコンパイラが吐けるようにしてもいい。
基本的にヘッダーファイルは無しということで。
961 :
デフォルトの名無しさん :2010/05/07(金) 13:22:33
・割り算の2つの値を取得するには多値があればよい。 ・多値は名前なしの構造体にする。 の2つですか?
962 :
デフォルトの名無しさん :2010/05/07(金) 13:28:24
C++0xのようにリストを戻り値にできるようにすればいいな。 return {1, 0}; 割り算の場合は、商だけ取りたいこともあるだろうから {商, 剰余}のリスト型を、商の型に暗黙キャスト出来てもいいかもしれない。
>>957 >>958 と
>>959 、これ以上の結論は仕様をまとめる人というか
コンパイラ作る段階になってコンパイラ組む人が自分の好みで
決めれば良いと思う。
ここで結論出すような話題じゃないし。
今はどんなアイデアがあり得るか、っていう段階。
争点として別視点が有るのなら提供して欲しい、
IDE前提とかいう与太話はよそでやってくれ 少ない脳みその補完道具と言語とは全然関係ない
ヘッダのような手動で作るものは今後はなしになるだろうね でも内部を隠してexport, import出来る仕組みはないと困るわな コンパイルしたらobjとともにヘッダ的な情報を用意する必要はあるとおもう
>>964 IDEに優しくないというのは、Cの欠点のひとつ。IDEの便利機能を拒否するアホは相手にしなくていい。
>>962 それってリストを戻してるのじゃなくて返す型の一時オブジェクトを初期化した
ものを返しているのだから、受け取る方で複数の変数に代入出来る訳じゃ
ないから
>>904 みたいな事ができる訳じゃないね。
コンパイラが、Windowsでいう.libを作るというのならヘッダなしでもいけるが、C同様に.objをアーカイブして.libにするならヘッダファイルは必要になるだろう。
>>967 /演算子が{商,剰余}リストを返すようにして、イコールの前に複数の変数が並んでいればその順に商と剰余を代入するようにすればいいんじゃないの。
>>968 そんなのリンカーの仕様だろ。言語には関係ない。
商と剰余の両方が必要な状況はそれほど多くない。関数が構造体を返せばできること。わざわざそのために構文を用意するほどのものではない。一般に順序のない多値を返すことができるようにするなら、意味が順序に依存してしまうのは、分かりにくいプログラムを生む原因になる。
>>970 ライブラリ関数の型を知らなきゃ駄目なので、色々大変なんだよ。
>>971 >商と剰余の両方が必要な状況はそれほど多くない。関数が構造体を返せばできること。わざわざそのために構文を用意するほどのものでは
CPUを見るとね、って事。(X=CF)と同じ気持ちって奴?
A %= B;
C /= B;
より重くなる多値は、この手の議論からは既に外れてる。
>>970 Cはプロトタイプがあるので参照する.objが存在しなくてもコンパイルができる。それを禁止たところで循環参照を解決する何らかの仕組みが必要になる。
>>971 つまり、関数呼び出しの時も、すべて名前付きパラメータにするべきだってことだな。
memcpy(dest:d, src:s, n:sizeof(d));
みたいな。
>>972 > ライブラリ関数の型を知らなきゃ駄目なので、色々大変なんだよ。
いろいろとは?プログラマーが大変なの?
>>975 そもそもコンパイル時に型が決定できないのでコンパイルできない。
テンプレートのようにリンク時に評価することは原理的には可能であろうが、そんな解決は美しくないし、分かりにくい。
ヘッダというか言語的な外部参照の情報だからリンカーでもないんだよな import hogeみたいに使う奴 コンパイルしたらheader的ファイル PreCompiledHeaderみたいなのを自動で作る感じでいいだろ 今のように手動で作る必要はないわな
>>976 >そもそもコンパイル時に型が決定できないのでコンパイルできない。
そんなのコンパイラが頑張ればいいだろ。
>>977 そうだね。必要なときに自動生成できればそれでいいと思うよ。
>>978 型を知らない関数を、プログラマはどうやって呼び出すのか?
気合いで行くってのも良いのかも知れない。
>コンパイラが、Windowsでいう.libを作るというのならヘッダなしでもいけるが、C同様に.objをアーカイブして.libにするならヘッダファイルは必要になるだろう。 .objをアーカイブした.libって型情報とか入っていないの?
elfとかcoffみたいな.oや.aをコンパイラが読むのか?
>>977 でいいんじゃねえの
吐く情報はxmlでも新言語のやつでも全く独自でもいいけどさ
>>981 問題は人間じゃなくてコンパイラがどうやって知るかだろう
ヘッダーファイル無しってもうGoがやってるじゃん。 コンパイラが頑張ってる。
>>985 それは、Javaにヘッダがないのと同じ理由。jarの間の依存関係は、非循環である必要があるが、Cでは循環参照した.oを作ることができる。
循環参照くらいコンパイラが見つけろよw
無理いうなw 循環参照は汚えし
99 名前:デフォルトの名無しさん [sage] 投稿日:2010/05/07(金) 19:26:58 前スレ埋めろよ
ヘッダーファイルって、実質マクロのためにあるようなもんだよな。 んで、マクロの重要な機能の1つに定数の置換があるわけだが、これはどうするの? まさかエディタで置換とか言わないよな?外部参照の手段は?
ほんものの定数があればいらんだろ
ダウングレードだが 言語サポートのマクロに変えればいい
Javaが悲しい事に成ってるしな
>>993 マクロの置換はインラインだから実行時のオーバーヘッドが無いんだよ。
const修飾だとグローバルスコープに置かなきゃならんので参照のたびにオーバーヘッドが生じる。
この差は非常に大きい。2つを解決できるアイディアはないもんかね?
それはコンパイル時に最適化できるだろう。
inline constで。
inline修飾はあくまでコンパイラへのヒントでしかない。 プログラマの意図どおりにバイナリを生成する保障はどこにもない。 マクロはプリプロセスなので必ずインライン展開される。その違いを認識せよ。
このスレではCを現在の文法でつくり直すわけじゃない。その点を認識せよ。
1000
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。