トップページ⇒tech
862コメント256KB

新C言語を作ろう

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2007/07/21(土) 18:27:03
これまでの古いC言語から新しいC言語を作りましょう。
C言語に足りない、欲しい機能を追加して最終的には標準化しましょう。

いまここに新C言語作成委員会の発足を宣言します。

とりあえず必要と思われる機能は
・クラス
・テンプレート
などでしょうか?
0002デフォルトの名無しさん2007/07/21(土) 18:29:25
D言語で
0003デフォルトの名無しさん2007/07/21(土) 18:58:52
>>1
この素人め
お前には無理
削除依頼出しとけ
0004デフォルトの名無しさん2007/07/21(土) 19:39:27
コンパイラ誰が作ってくれるんだよ
0005デフォルトの名無しさん2007/07/21(土) 19:44:57
変数は文字列型と実数型のみで。
0006デフォルトの名無しさん2007/07/21(土) 19:45:29
実数は誤差なしで
0007デフォルトの名無しさん2007/07/21(土) 19:51:49
インタプリタで。
0008デフォルトの名無しさん2007/07/21(土) 19:57:18
Interpreter C言語
0009デフォルトの名無しさん2007/07/21(土) 20:20:15
>>1
それなんてC++
0010デフォルトの名無しさん2007/07/21(土) 20:24:42
ぐぐらずに質問。
C++ってjavaみたいにnew演算子で動的にオブジェクト生成できるけど、
あれってC++にもガーベージコレクションがついてるってこと?
VMでもないのにどうなってるの?
コンパイル時にコンパイラが
スコープとか計算してメモリ開放処理を付け加えてるの?
0011デフォルトの名無しさん2007/07/21(土) 20:26:06
>>10
newしたらdeleteしなきゃならん。
mallocしたらfreeするのと同じ。
0012デフォルトの名無しさん2007/07/21(土) 20:27:43

>コンパイル時にコンパイラが
>スコープとか計算してメモリ開放処理を付け加えてるの?
じゃあこの機能欲しいね。
0013デフォルトの名無しさん2007/07/21(土) 20:29:58
最近の小学校は夏休みの宿題にC言語を作らせるのか
0014デフォルトの名無しさん2007/07/21(土) 20:32:27
コンパイラは作らない。
機能内容と実装方法の提案だけ。
0015デフォルトの名無しさん2007/07/21(土) 20:34:23
といっても、JavaとかC++とかC#とか他ruby、関数型言語の
後追いをしても仕方がないので
あくまでもC言語をベースに革新的な言語を作る
0016デフォルトの名無しさん2007/07/21(土) 20:57:49
>>10
> コンパイル時にコンパイラが
> スコープとか計算してメモリ開放処理を付け加えてるの?
scoped_ptrやshared_ptrならまさにそんなことをやってくれる。
0017デフォルトの名無しさん2007/07/21(土) 21:06:29
言語仕様はそのままでDirectXかopenGLのプログラムしかつくれないC言語は?
C+ライブラリの開発環境だとめんどくさいことが多い。
最初から3Dを意識した仕様にしてみては?

0018デフォルトの名無しさん2007/07/21(土) 21:23:37
>>17
言語仕様がそのままなら、一体何をするっての?バカだろ
0019デフォルトの名無しさん2007/07/21(土) 21:42:32
C++やObjective-Cに秋田から
Cでいいや
0020デフォルトの名無しさん2007/07/21(土) 21:51:41
だが、今更Cに戻る気にもなれない。
0021デフォルトの名無しさん2007/07/21(土) 22:01:38
言語使用って言ったのが悪かった。
構文はそのままって意味。
0022デフォルトの名無しさん2007/07/21(土) 22:08:39
>>21

nara
Java
demo
yookune?
0023デフォルトの名無しさん2007/07/21(土) 22:16:42
重箱の隅
0024デフォルトの名無しさん2007/07/21(土) 23:04:04
Objective-C
C++
D

好きなのを選ぶヨロシ。
0025デフォルトの名無しさん2007/07/21(土) 23:16:14
車輪の再発明スレか
0026デフォルトの名無しさん2007/07/21(土) 23:34:21
D言語改良するんだったら期待するのに。
0027デフォルトの名無しさん2007/07/22(日) 07:32:34
C系の言語にはまだ型推論の導入された言語ってないんじゃね?
0028デフォルトの名無しさん2007/07/22(日) 09:01:12
でもさ、ラムダ式ベースの構文じゃないのに
型推論って導入できるの?

あ、構文木をラムダ式に変換すればいいだけなのかな
0029デフォルトの名無しさん2007/07/22(日) 09:03:09
C++0xでどうなるか期待
0030デフォルトの名無しさん2007/07/22(日) 09:06:35
>>27
DとかC# 3.0とか
0031デフォルトの名無しさん2007/07/22(日) 09:18:10
ところでC++の例外処理ってどうなってるの?
VMもないのにどうやって検出されるの?
0032デフォルトの名無しさん2007/07/22(日) 09:38:08
setjump/longjumpを応用したり、 (g++のsjlj eh)
OSが例外処理を持っていたり。(WindowsのSEH)
0033デフォルトの名無しさん2007/07/22(日) 09:57:23
>>32
1つめのはコンパイル時に自動挿入ですか?(setjump/longjump)
0034デフォルトの名無しさん2007/07/22(日) 10:00:15
どう見てもバグであろう部分を、自動的に補正してくれるバグ推論ができたら、是非宜しくお願い致します
0035デフォルトの名無しさん2007/07/22(日) 10:10:37
>>33
それは当然。
例外処理なんてようするに関数を越えたジャンプにデストラクタの後片付けを入れただけ。
検出するなんてものではないと思う。
0036デフォルトの名無しさん2007/07/22(日) 11:36:08
>>34
もっと酷いバグ作りこむかもしれないけど、それでいい?
0037デフォルトの名無しさん2007/07/23(月) 23:19:17
変数名や関数名に日本語が使えるようにしてほしい。
プログラムの保守性が絶対に上がるよ。
0038デフォルトの名無しさん2007/07/23(月) 23:28:02
使えたとしても使わないのが多数じゃないか?
Javaは使えたよな?C++も使えるんだっけ?
ジョークプログラムでたまに見るが、?が頭を駆け巡る。
慣れの問題で済む程度じゃないと思う。
0039デフォルトの名無しさん2007/07/23(月) 23:42:28
変換とかさせる言語はクソ
ひ○わり
なで○こ
0040デフォルトの名無しさん2007/07/24(火) 01:48:24
C にクラス「だけ」を追加した言語が欲しい
それ以外の、C の素朴さを損なう様な追加機能は要らない
カプセル化はオブジェクト指向の本質ではないので要らない
テンプレートでメタプログラミングとかも要らない
総称関数も要らない
GC も要らない
クロージャはあったら嬉しいけど、動的クロージャなら何の役にも立たない

本来の意味の C w/ Class が欲しい
GLib とかじゃなくて

みたいな事を考えてた事もあった
0041デフォルトの名無しさん2007/07/24(火) 02:51:47
C って素朴か……?
0042デフォルトの名無しさん2007/07/24(火) 05:38:49
とりあえずC言語に足りないものを全て列挙してみようか
0043デフォルトの名無しさん2007/07/24(火) 13:17:34
処理系依存
0044デフォルトの名無しさん2007/07/24(火) 13:20:01
排他的再帰
0045デフォルトの名無しさん2007/07/24(火) 16:59:44
マンコ
0046デフォルトの名無しさん2007/07/24(火) 19:20:20
自動コーディング
0047デフォルトの名無しさん2007/07/24(火) 19:58:38
型推論と例外処理とクラスだけのオブジェクト指向とnew演算子
0048デフォルトの名無しさん2007/07/24(火) 20:04:38
逆にプリプロセッサ要らない。
何らかの代替機能を用意した上で廃止してくれ。
0049デフォルトの名無しさん2007/07/24(火) 20:18:16
java 使ってると C のマクロが非常に恋しくなる。マクロは残してもらいたいなぁ。
0050デフォルトの名無しさん2007/07/24(火) 20:45:39
むしろlisp級にまでマクロ強化
0051デフォルトの名無しさん2007/07/24(火) 21:00:44
結局C++が出来上がる気がするな
0052sage2007/07/24(火) 21:09:48
C+++
0053デフォルトの名無しさん2007/07/24(火) 21:38:12
C--
0054デフォルトの名無しさん2007/07/24(火) 21:39:30
>>50ではないが、俺もマクロの強化を望む。
lisp の defmacro の強力さを知らんのだよ。
Symbolics の FORTRAN はマクロによって lisp に展開されていた。
餓鬼どもには想像も出来んだろうがな(w
0055デフォルトの名無しさん2007/07/24(火) 21:39:40
実はC言語はこんなこともできないのです。
int f(int n) { return n + 1; }
int g(int n)
{ int x = f(n);
{ int x = f(x);
{ int x = f(x);
return x;
}
}
}
int main() {
printf("g()=%d\n", g(1));
return 0;
}

さて、g(1)はいくつを返すでしょう?
このコードに対してエラーも警告も出さなかったコンパイラがあったら要注意です。
C言語は { int x = f(x); 〜} を期待通り処理しません。
初期化式中のxは変数宣言xによって既に親を上書きしています。
つまりこの規則は変数のアドレスを再帰的に初期化式に
適用したいというかなり特殊な状況以外に全く役に立ちません。
h() {
struct _tag {
struct _tag *next, *prev;
} a = {&a, &a};
printf("&a=%d a.next=%d a.prev=%d\n", &a, a.next, a.prev);
}
変数のアドレス限定なのは、初期化式中に変数の値を参照しても
何の意味もないからです。もし参照してたらエラーにすべきでしょう。
0056デフォルトの名無しさん2007/07/24(火) 21:42:19
?
0057デフォルトの名無しさん2007/07/24(火) 21:47:19
int g(int x)
{ int x = f(x);
{ int x = f(x);
{ int x = f(x);
return x;
}
}
}
だとエラーになった
: error C2082: 仮引数 'x' が再定義されました。
int g(int n)
だと警告
: warning C4700: 値が割り当てられていないローカルな変数 'x' に対して参照が行われました。

(VC6SP4)
0058デフォルトの名無しさん2007/07/24(火) 21:47:59
>>55
で、お前はそれがどうなったらいいと思う?

初期化式では、初期化対象の変数がまだ見えないようにするのか、
そもそもコンパイルエラーになるようにするのか、
はたまたそれ以外の方法があるというのか。
0059デフォルトの名無しさん2007/07/24(火) 21:48:56
では、この辺の規則がしっかりしてるSchemeだとどうなるでしょう。
(define (f x) (+ x 1))
(define (g x)
(let ((x (f x))) (let ((x (f x))) (let ((x (f x))) x))))

(g 1)
=>4
まさに期待通りです。
まったくSchemeは素晴らしいですね。
0060デフォルトの名無しさん2007/07/24(火) 21:51:18
>>55
そんなの当たり前のじゃん…
0061482007/07/24(火) 21:51:33
>>50
LISPみたいなのだったらありだ。

Cプロセッサは、C自体の字句解析と独立しているから、
IDEの入力支援機能なんかと相性が悪いはず。俺はそれが嫌なんだ。
0062デフォルトの名無しさん2007/07/24(火) 21:53:26
>>57
いきなり関数の引き数と同じ名前で自動変数宣言すんなw
0063デフォルトの名無しさん2007/07/24(火) 21:55:39
むしろ何を期待すれば>>55になるの?
0064デフォルトの名無しさん2007/07/24(火) 22:02:49
>>55-59
そりゃ、変数に対する考え方が違うから当然だろ。
Cの変数つうか識別子は、つまるところ名前付きメモリ領域だからな。

ん、むしろ、これで当然(そしてSchemeも当然)と思える
俺の方がどうかしてるのか?
何か悩んだり面白がったりするものなのか?
0065デフォルトの名無しさん2007/07/24(火) 22:25:36
>>64
どうかしてる。
>>57相当の事をしたいとなると、わざわざ別名を考える必要が
出てきて思考の妨げになるじゃん。
0066デフォルトの名無しさん2007/07/24(火) 22:30:22
変数の初期化式中にその変数自身が含まれるべき、
なんて普通は考えないからな。違うスコープにある方が自然だろ。
C言語が一般的になりすぎたとか、そういう言語に慣れすぎたとかで、
その違和感に気付かないのかもしれないな。
0067デフォルトの名無しさん2007/07/24(火) 22:33:17
変数でどうにかしようと考えるからだ。
C系言語的には、そういうときは変数名じゃなく型名を定義する事を考える。
つまりクラスにする。
あ、Cではクラス無理かw
0068デフォルトの名無しさん2007/07/24(火) 22:37:20
C言語だとマクロに変数が入る時とかで困るんでは。

#define G(n) do { int x = f(n); return x; } while(0)
int g(int n)
{ int m = f(n);
{ int x = f(m);
G(x);
}
}
: warning C4700: 値が割り当てられていないローカルな変数 'x' に対して参照が行われました。
0069デフォルトの名無しさん2007/07/24(火) 22:45:27
その例なら、C99やC++でインライン関数使えばいいよ。
0070デフォルトの名無しさん2007/07/24(火) 22:45:58
すまんこれはマクロでないと無理だなorz
0071デフォルトの名無しさん2007/07/24(火) 22:47:58
>>59のgは
(define (g x) ((lambda (x) ((lambda (x) ((lambda (x) x) (f x))) (f x))) (f x)))
と等価という考え方であり、つまり初期化式は関数適用と同じスコープで
評価されるので、xは親を参照するという事が自然と自明になり、
文脈上のあいまいさもありません。Schemeにはletの他にlet*やletrecもあり、
こういった束縛規則をコントロールできます。
Schemeの変数束縛はとても理に適った設計なのです。
0072デフォルトの名無しさん2007/07/24(火) 22:50:08
何か似たような問題を(もっと実用的な例で)解けるデザパタがあったような。
TMPという手もあるけど、それは今の流れ的にお呼びでなさそうだな
0073デフォルトの名無しさん2007/07/24(火) 22:54:15
>>71
だから変数の考え方が違うと何度言えば
0074デフォルトの名無しさん2007/07/24(火) 22:58:30
つまりboost::lambdaがあるC++最強だな
0075デフォルトの名無しさん2007/07/24(火) 22:59:37
> struct _tag {
> struct _tag *next, *prev;
> } a = {&a, &a};
おれもこれは最初キモイなーと思ったけど、必要悪かな。
グローバル変数のテーブルの初期化とかでちょっとイイ思いができるとか。
(初期化でコードを書かなくて済む)
書き忘れさせないとか、消極的な理由。
今の言語にはコンストラクタがあるから、そういう事気にするのは減ったけど。
0076デフォルトの名無しさん2007/07/24(火) 23:04:40
>>73
そのオメエの考え方がそもそもキモイんだよ、というお話では
0077デフォルトの名無しさん2007/07/24(火) 23:08:10
>>74違うw
0078デフォルトの名無しさん2007/07/24(火) 23:09:27
新しいC言語には
classical int x = f(x) ; // エラー
int x = f(x) ; // OK
という風にclassicalキーワードを用意してみては

struct _tag {
struct _tag *next, *prev;
} a = {&a, &a}; // えらー 無効なaを参照した
0079デフォルトの名無しさん2007/07/24(火) 23:14:31
>>78そのfに渡す初期値はどう決めるのよ?

>>74
boost::scheme…いや何でもない。冗談。
0080デフォルトの名無しさん2007/07/24(火) 23:16:15
ヘッダファイルをやめようぜ
0081デフォルトの名無しさん2007/07/24(火) 23:18:36
同意。
コンポーネント単位でインクルード出来てもいい。
0082デフォルトの名無しさん2007/07/24(火) 23:23:10
確かに>>55は見ただけだと問題なく通りそうではあるし、
移植を繰り返して警告沢山出る様な引継ぎコードの一部だったりして、
しかもテスト環境がたまたまxが普通の値をとったりして、
とんでもない間違いにそのまま気付かないでデスマーチ突入とか
ありそうで笑える。
0083デフォルトの名無しさん2007/07/24(火) 23:30:02
俺ならこんなの発見したら、
即消して書き直すかな…
0084デフォルトの名無しさん2007/07/24(火) 23:41:32
つーか
int x = f(x);
と書いている時点で相当キモイ
こういうキモイ書き方を右辺のxがより広いスコープのxだと思って書く奴はもっとキモイ
そしてそれを期待する奴はどうしようもなくキモイ
そうなる様に言語仕様を変えろという奴は氏んでくれ
0085デフォルトの名無しさん2007/07/24(火) 23:50:26
lisperは害悪ということだけは分かった
0086デフォルトの名無しさん2007/07/25(水) 00:01:30
>>84
お前が子ねカス
0087デフォルトの名無しさん2007/07/25(水) 00:10:35
>>84
DとかC#とかだとコンパイルエラーになったような気がする。
0088デフォルトの名無しさん2007/07/25(水) 00:38:45
階層的なデータ構造をコードで記述していく場合、
同じ名前の変数を宣言したい事がよくある。
例えばこういう画面レイアウトの構造を定義したい時、
--------------------------

[button1]  (空き)  [button2]

--------------------------
      [button3]
       (空き)
      [button4]
-------------------------
こんな感じの定義方法を思いついた。
{ void *resource; lay_t lay = layout_create();
{ lay_t vert = layout_push_vertical(lay);
{ lay_t vert2 = layout_push_vertical(vert);
layout_push_control(vert2, "button1");
layout_push_blank(vert2);
layout_push_control(vert2, "button2"); }
{ lay_t horiz = layout_push_horizontal(vert);
layout_push_control(horiz, "button3");
layout_push_blank(horiz);
layout_push_control(horiz, "button4"); }}
resource = layout_make_resource(lay);
layout_destroy(lay);
return resource;
}
この時、vert2の箇所をそのままvertとしてしまったり、
さらに階層が必要になった時、その変更を元に戻したくなった時、
定義した構造ブロックを他で使いまわしたい時、
などで修正が面倒になる。
まあ適当な構造記述言語でも作ればいいんだけど。
0089デフォルトの名無しさん2007/07/25(水) 00:42:52
ごめん、上で定義した構造は↓の間違い。
--------------------------
      [button1]
       (空き)
      [button2]
--------------------------

[button3]  (空き)  [button4]

--------------------------
0090デフォルトの名無しさん2007/07/25(水) 00:54:31
もうね、関数内でも名前空間を定義できるようにしたら万事解決だよ。
int g(int n)
{
  namespace n1
  {
    int x = f(n);
    namespace n2
    {
      int x = f(n1::x);
      namespace n3
      {
        int x = f(n1::n2::x); //C++的名前空間ならn2::xでもいけると思う
        return x;
      }
    }
  }
}
俺はこんなの欲しくないけど。
0091デフォルトの名無しさん2007/07/25(水) 08:56:14
Perlだと理屈の上ではpackageでそれができる。
しかしそういうキモイ書き方使い方は見たことない。
0092デフォルトの名無しさん2007/07/25(水) 09:23:20
話がズレ始めてるんで一応書いておきますが、
特別な事をしなくとも
#define letend }}
#define let1(type, var, init) \
{ type let_tmp = init; \
{ type var = let_tmp;
#define let2(type, var, init, type2, var2, init2) \
{ type let_tmp = init; type2 let_tmp2 = init2; \
{ type var = let_tmp; type2 var2 = let_tmp2;
実はこれだけでschemeのlet束縛を再現できます。(>>72おしい)

int f(int n) { return n + 1; }
int g(int x)
let2(int, x, f(x), int, y, x)
printf("x=%d, y=%d\n", x, y);
let1(int, x, f(x))
let1(int, x, f(x))
return x;
letend
letend
letend
ここでyの初期化式として使われるxはgの引数のままであり、
f(x)の影響を受けません。g(1)を実行するとx=2, y=1と
表示されることから、Schemeのletと同じ動作だと確認できます。
0093デフォルトの名無しさん2007/07/25(水) 14:06:47
あーブロック2重にするのか。思いつかんかった。
0094デフォルトの名無しさん2007/07/25(水) 19:17:15
コンパイラの実装の手間も考えようぜ。
0095デフォルトの名無しさん2007/07/25(水) 21:52:01
標準Cコンパイラのソースってどこかに無料であったりするの?
それを拡張していけばいいのでは
0096デフォルトの名無しさん2007/07/25(水) 21:54:00
GCCは?
すでに拡張されてるけど
0097デフォルトの名無しさん2007/07/25(水) 22:01:02
tccとか
0098デフォルトの名無しさん2007/07/25(水) 22:05:24
なぜ今更C言語を拡張?
D言語(gdc)やC++0x(g++)をベースに改良すればいいのに。
0099デフォルトの名無しさん2007/07/25(水) 22:28:07
D言語w
0100デフォルトの名無しさん2007/07/26(木) 02:15:52
>>98
D や C++ は太り過ぎだから
0101デフォルトの名無しさん2007/07/26(木) 04:32:28
Cがガンダム、初期C++がゼータ、テンプレ付きC++がダブルゼータだとしたら、
百式ぐらいのをきぼんぬ
つーかシャアが乗ってそうなやつ
■ このスレッドは過去ログ倉庫に格納されています