【肥大化】C++ を見捨てたヤシ 2人目【複雑化】

■ このスレッドは過去ログ倉庫に格納されています
2008/05/17(土) 21:07:51
前スレ
http://pc11.2ch.net/test/read.cgi/tech/1201567967/
2008/07/03(木) 07:08:03
>>407
>>405の定番の指摘の後でバグ付きのソース出すとは勇気あるなw
2008/07/03(木) 10:50:20
参照渡しがあれば、ポインタはなくともswap()は書ける
Javaにはポインタも参照渡しもないので、swap()すら書けない

Javaにポインタがあるなんて話はどっから出てきたんだ?
2008/07/03(木) 12:50:42
javaにはアドレス演算子・間接演算子を含むポインタ演算関連はありません。
しかし、

//C++  ※説明のためdeleteは省略
 struct A{ int n; A():n(){} };
 struct B{ A* a; B(){ a=new A();} };
 void f(){
   B* b = new B();
   f2(b);
 }
 void f2(B* b){ b->a->n = 10; }

//Java  ※説明のためf()を含むクラスは省略
 class A{ public int n; }
 class B{ public A a; public B(){ a=new A();} }
 void f(){
   B b = new B();
   f2(b);
 }
 void f2(B b){ b.a.n = 10; }

の上記2つは、ほぼ等価です。
Javaのオブジェクト変数が、
実質的に演算不可のポインタであることが分かると思います。
2008/07/03(木) 15:06:44
>>410
> Javaのオブジェクト変数が、
> 実質的に演算不可のポインタであることが分かると思います。

そういうあやふやでいい加減な理解はドブに捨てたほうが良い。
A a = new A();
A b = a;
とするとき、
bはaを指しているのではない。bとaが同じオブジェクトを指しているだけだ。

Javaにはポインタは存在しないから、別の変数を参照する方法は存在しない。
Perlのリファレンスもポインタとは違うものだが、別の変数を指すことは出来る。
412411
垢版 |
2008/07/03(木) 15:19:21
まあ、Javaのobject変数がobjectのinstanceへのポインタのようなものであり
そのように実装されている、というのは正しい。

ただしそれは言語の実装詳細であって、Javaという言語が、ポインタという道具を
仕様としてユーザに提供しているわけではない。
それどころかリファレンスすら提供していないし、参照渡しも無い。
だから、Javaのユーザはswap()すらも書けない。そういう言語だ。

Javaが裏方で実装にポインタを使っているからといって、だからどうしたんだ?
実装にポインタを使っていない言語なんて、それこそ存在しないだろ。
2008/07/03(木) 15:50:37
ぬるぽは別の言い方無かったのかな
2008/07/03(木) 15:59:09
>>411
>>401>>374-381の話を続けただけなんじゃない?
そうだとすると初めから裏方というか
概念の話をしてるんだと思うよ

あと、ポインタとポインタ演算をごっちゃにしてる気がする
ポインタは論理的な位置(を指す情報)の変数でしかないよ

http://ja.wikibooks.org/wiki/Java/クイックツアー
http://ja.wikipedia.org/wiki/ポインタ_(プログラミング)
2008/07/03(木) 16:15:54
>>414
えーと、どっからごっちゃにしてるという話が出てくるんだ?

別に論理的に任意な位置情報(無効なものを含む)を自由に指せないからとか
演算が出来ないからJavaにはポインタが無いと言ってるんじゃないよ。

単純に「他の変数を指す」方法を提供していないからポインタが無いと言ってるの。
それは実際にはポインタよりはstrictなリファレンスで出来ることだが、
要するにJavaはリファレンスすら提供していないのよ。
2008/07/03(木) 16:17:05
>>411
そういうあやふやでいい加減な理解は
ドブに捨てたほうが良いと思います。

A b = a;
とするとき、
aに入っているのがポインタとしての値だからこそ、
bとaが同じオブジェクトを指すようになるわけです。
2008/07/03(木) 16:19:11
>>416
そんなことは分かった上で、「aと同じものを指す」方法はあるが、
「aを指す」方法は無いからポインタは無いと言っているわけだが。

アホですか?
2008/07/03(木) 16:25:17
繰り返すが、
言語内部の実装でポインタが使われていることと
言語仕様がポインタを提供していることは全く別の問題だ

Javaは言語仕様としてはポインタを提供していないし、
前者をもって、その言語がポインタを提供しているとは間違っても言えないし
言わない
そういうことで言うのなら、LISPにもBASICにもポインタはあるのだろうよ
2008/07/03(木) 16:26:55
ポインタ=アドレス演算子ですか。そうですか。

アホですね。
2008/07/03(木) 16:29:26
>>419
別にアドレス演算子である必要は無いだろ

抽象的には、リファレンスは束縛されている別の名前に対するエイリアスであれば
良い。つまり、メモリアドレスとは何の関係も無い話だ
そしてJavaはそのようなものを一切提供していない
2008/07/03(木) 16:29:47
>要するにJavaはリファレンスすら提供していないのよ。

http://java.sun.com/docs/books/jls/second_edition/html/typesValues.doc.html#9317
>4.3 Reference Types and Values
2008/07/03(木) 16:36:14
>>421
それ、内部的にポインタで実装されている「参照型」というカテゴリの型が
存在します、というだけだろ
2008/07/03(木) 16:41:06
おまいら、話の発端って

>>374-375のポインタが「理解出来ない」奴がjavaを作った
というネタに対して

>>379-381のようなポインタの概念はあるからそれは無理
ってツッコミじゃないの?
2008/07/03(木) 16:47:11
見たいものしか見えないのな
2008/07/03(木) 16:59:08
つまり、Javaのobject変数は、有効な object instanceを指すか、
「何も指さない」かの二択の、非常に限定されたreferenceなんだよ
「ポインタ」ではない
2008/07/03(木) 17:17:53
ポインタとポインタ演算の違いが分からない奴には、
何言っても無駄のようだな。
2008/07/03(木) 17:20:11
演算ができないだけでなく、
・別の名前(変数)を指せない(その程度のindirectionの手段するら提供していない)
・無効なものを指せない
こんなものを「ポインタ」と呼ぶことこそ強弁だろ
2008/07/03(木) 17:27:19
>演算ができないだけでなく
演算が出来ないからだよ。
アドレス演算子も文字通り演算だ。

>無効なもの
null
2008/07/03(木) 17:29:31
>>428
nullは「無効なものを指している」のではなく、「何も指していない」ことを
示しているんだよ

それと、C++やPerlのリファレンスぐらい知って語ってるのか?
アドレス演算子が無くとも別の名前に対するエイリアスは作れるだろうが。
Javaでは作れないけどな。

というか、エイリアシングの問題を避けるために、そのようなことは
出来ないようにしてある。
2008/07/04(金) 02:08:53
なんか「Javaを見捨てた香具師」スレかと思たw
その争点がポインタってのも面白いな

いや煽り地味てしまったが、俺のような三下には興味深い話題です
2008/07/04(金) 06:29:36
もう分かってるのだろうけど、争点がずれてるし。
・JAVAも(内部で)変数をポインタで指している
・JAVAは(言語仕様でCのような)ポインタをサポートしてない

暗黙の前提条件は忘れて、双方折れるべき。
2008/07/04(金) 07:11:57
>>427
> ・別の名前(変数)を指せない(その程度のindirectionの手段するら提供していない)

これは>>429の言うエイリアスですが、
これはCのポインタもPascalのポインタも出来ません。
たぶん言葉を間違えているのだと思いますが。

変数のアドレスがファーストクラスのオブジェクトであることを言いたいのでしょう。
2008/07/04(金) 10:19:34
JAVAの文法は分からないが
A a = new A();
A b = a;
この場合、bに入ってるのは、aのインスタンスのコピーであって、aのインスタンスそのものでは無いはずだが
仮に、この表現で、aの別名をbと出来るのであれば、JAVAはC++以上の変態言語だと思うのだが...
2008/07/04(金) 10:45:01
>>433
> この場合、bに入ってるのは、aのインスタンスのコピーであって、
> aのインスタンスそのものでは無いはずだが

コピーじゃないよ。

Javaの組み込み以外の型Aの
A a = new A();
A b = a;
は、C++の
A* a = new A();
A* b = a;
と全く同じ意味。組み込みの場合は、
A a;
A b = a;
と同じになる。(ただしaが初期化されてないからエラー)

2008/07/04(金) 10:51:08
それは、困ったちゃんだなぁ
b.x = 10;
としたら
a.xも10ってなられると、使い道が無いじゃん
JAVA使えねぇ
2008/07/04(金) 10:59:42
>>431
記号表では変数をポインタで指しているだろうが、
ボックスモデルのことを言っているのなら、変数がオブジェクトのインスタンスを
指していると言うべきじゃないのか
それと、あんたの主張は俺の主張と全く同じものに思えるのだが、
どう「折れ」ればいいんだ

>>432
うん、ちょっといい加減過ぎた
Cのような言語はシンボルテーブルの名前を弄れるわけではないし
シンボリックリファレンスとハードリファレンスを混同しているような
言い方になったな

> 変数のアドレスがファーストクラスのオブジェクトであることを言いたいのでしょう

ポインタといえば普通はそのようなものを指すと思うんだが、違うのか
「アドレス」でなくとも、何らかの形で変数のlvalueが扱えれば良いんだが
Javaはそのような手段を提供していない

単に参照型がボックスモデルで実装されているというだけで、
そんなことを言ったらLispのconsセルだってそうだろう
2008/07/04(金) 11:31:53
>>436
> ポインタといえば普通はそのようなものを指すと思うんだが、違うのか

つPascalのポインタ

基本的にヒープオブジェクトしか指せない。
Cで言うようなautoやstaticのストレージクラスのオブジェクトとは無縁。
しかしPascalではそれを「ポインタ」とよんでいる。

Javaはさらに、組み込み型以外のオブジェクトは、
ヒープのみに置けるとすることで、
ポインタ無効問題を避けている。
// auto変数のアドレスを生存期間が過ぎても指したまま→invalid reference

2008/07/04(金) 11:42:56
>>437
PascalのポインタとJavaの参照型は違うんじゃねえのか?
つうか元々のPascalにはポインタは無かったような気はするが

Javaは単にオブジェクトをラップするためのbox-modelであって、
変数はinstanceへの参照、instanceが参照先という参照関係を
常に強制しているだろ
変数は変数を参照できないし、instanceを直接扱うこともできない

Javaは汎用的な参照の仕組みを提供しているのではなく、参照型を
常にハンドルを通じてユーザに扱うようにしてあるというだけだ

2008/07/04(金) 12:05:47
>>438
> PascalのポインタとJavaの参照型は違うんじゃねえのか?

そっくりですよ。
最初からあるし。> Pascalのポインタ
(* @で変数のアドレスを取れるのはベンダー拡張です *)
2008/07/04(金) 13:38:05
>>436, >>438
自動変数のアドレスを取る演算子が無いとポインタとは言えないの?
CにはC++の参照は無いから、方法は & だけだよね。

もし仮にC言語に & が無くて、
  char* p = malloc(...);
  f(p);
  free(p);
のようにmallocするしか*型の値を作れないとしたら、
Cにポインタは無いってことになる?
2008/07/04(金) 15:12:06
>>440
任意の型Tに対して、型Tのlvalueを保持する型T*が存在する
型Tはスタック、静的領域、ヒープに配置できる
ただし、型T*がポイントできるのは、ヒープ上にある型Tオブジェクトのみ、
ということか?

Cよりは制約がずっと大きいが、
その仕様はJavaとは全然違うだろ

Javaには型Tに対する参照型T*、のような概念は存在しない
2008/07/04(金) 16:11:19
逃げた感たっぷりのレスですねw

で、結局、
無いってことになるの?
ならないの?
2008/07/04(金) 17:13:40
>>440
Wirth, ISOの標準Pascalはその通りの仕様ですね。
もちろん整数からのキャスト、整数風の数値演算もダメです。

Javaの場合は、さらに、
・参照型はヒープのみに配置できる。
となってます。
だからスタック上のオブジェクトは共有できない問題や
参照外れの問題がなくなってます。
2008/07/04(金) 17:21:40
>>441
>Javaには型Tに対する参照型T*、のような概念は存在しない
int a;
int[] pa = new int[1];
int[][] ppa = new int[][]{pa};

ppa[0][0] = 10; // (pa[0] == 10)

StringBuilder b = new StringBuilder();
StringBuilder[] pb = new String[]{b};
StringBuilder[][] ppb = new String[][]{pb};

b.append("1")
pb[0].append("2")
ppb[0][0].append("3")

System.out.println(b); // "123"
2008/07/04(金) 17:23:32
× new String
○ new StringBuilder
2008/07/04(金) 18:30:24
>>444
ヒープの中身限定どころか、その配列の中身しかマネージできない
「ポインタ」かよw

ポインタが無い言語で、ポインタの代用として使われてた昔ながらのテクニックだな
Javaですら、そのようなことをやる必要は滅多に無いだろ

次は配列を使ってメモリマネージャを構築するのか?

Cでオブジェクト指向のプログラミングは可能だが、
Cをオブジェクト指向言語であるとは言わないだろが

その種の詭弁だな
447440
垢版 |
2008/07/04(金) 18:40:30
俺の質問にも答えてくれないかな。
2008/07/04(金) 22:58:44
>>447
おう。
「プギャー(AA略」

次どうぞ
2008/07/04(金) 23:25:01
答えられないなら
無理してまでそんな寒いレスしなくて良いよw
2008/07/04(金) 23:50:28
おう。
すまん。
2008/07/05(土) 11:35:09
>>440
質問の意味が不明すぎる
mallocが返すのは何だよって話だ
2008/07/05(土) 11:45:01
まだいたのかよw

(Cのサブセットの)Java言語への変換による安全なポインタの実装方式
http://www.kb.ecei.tohoku.ac.jp/~sumii/pub/fsc2java.pdf
2008/07/12(土) 00:56:07
ぬるぽ<Javaにポインタがある証拠
2008/07/12(土) 01:19:05
JavaのVMはCで書かれてる?
2008/07/12(土) 01:20:02
C++って聞いたことはあるがソースが無いので嘘かも知れない
2008/07/12(土) 08:18:03
>>455
ソースあるよ。
http://jp.sun.com/company/Press/release/2006/1114.html
http://download.java.net/openjdk/jdk6/

コアのところはC言語。JavaMEと基本は同じソースで、
組み込み(C++コンパイラが無いような環境)でも使うからね。

AWTの部分や、メジャーOS用のhotspotVM部分は殆どC++で書かれてる。

class Linux { friend class os; ... }; なんてクラスもある。
2008/10/01(水) 11:29:14
結局、後継はどれなんだ……?
#はあんまり好きになれんかった。
Dはいい感じだと思ったけども。
2008/10/28(火) 06:46:42
>>417
aもbもポインタだろjk
2008/12/27(土) 21:31:50
今更だが
>>246
>>248

Phenom X2で同一のアルゴリズムをシングルスレッドプログラムを
マルチスレッドに変えただけで2.2倍以上の速度が出た訳だが。
恐らく、キャッシュが共有されていることが原因で、ランダムアクセスを頻発する
場合は逆に下がる可能性はあるかもしれない。

ところで、問題です。以下のコード中のaとbはC++98仕様上では
何型と何型になるのが適当でしょう?

typedef int T;
struct Struct
{
   T a;
   typedef char T;
   T b;
};

答えメル欄
2008/12/27(土) 22:05:34
>>459
T a;でTという名前が使われた(この時点では::Tでint)後に、
typedef char T;でStruct内でTの表すものが変化したためアウト (3.3.6)。
2008/12/27(土) 22:17:31
これ、さすがに混乱を招くから、コンパイルできなくてよいことに決まったようだ。
2008/12/28(日) 01:10:27
別にJavaにポインタがあろうが無かろうがどうでも良い。
単なる言葉遊びだ。
だが、Javaのような参照しか知らん者に

char buff[0x100],result[0x100]={0};
char *begin,*end;

scanf("%255s",buff);
begin=strstr(buff,"[");
end=trstr(buff,"[");
strncpy(result,begin,end-begin);
printf("%s",result);

みたいなコードを説明するには、どうしてもポインタと参照を
区別して説明しないとキツい。必要に応じて言い分けるだけ。
463462
垢版 |
2008/12/28(日) 11:38:20
済まん大口叩いた割にひどいミスを書いた

begin=strstr(buff,"[");
end=trstr(buff,"[");

じゃなく
begin=strstr(buff,"[");
end=trstr(begin,"]");
だったお恥ずかしい。
464デフォルトの名無しさん
垢版 |
2008/12/29(月) 22:13:22
Javaの設計者はポインタの概念が理解できなかった。
ポインタで躓いたんだ。
そこで一大決心してJavaを設計した。
普通ならポインタの理解に努めるとこだろう。
だがそうしなかったことに多くの人々が魅了された。
もうポインタがわからないのは恥ずかしいことじゃない。
俺が悪かったわけじゃないんだ。
ポインタが悪かったんだ。
そしてJavaは伝説の黄金ツールとなった。
2008/12/30(火) 00:36:50
今日JRで大規模システムダウンが2件も発生してるが
これもJavaで書かれてるのか?
466デフォルトの名無しさん
垢版 |
2008/12/30(火) 01:31:59
>>465
それはどうか知らないが、そうだとしたら今日も伝説を作るために頑張ったということだろう。
2008/12/30(火) 01:46:19
PCに限って言えば.NETの方が遙かにJavaより軽いな
2008/12/31(水) 18:02:03
Visual D Express Edition マダ?
2008/12/31(水) 18:11:54
>>467
俺の貧弱なノートでは.NETは十分重いっす
PowerShellにしろ、F#にしろ、アホみたいに起動に時間がかかり、
とても常用する気にはなれません
2008/12/31(水) 18:20:41
PC環境でのJavaのJITってあまり最適化されないのか、ネイティブや同じような技術の.NETと比較して速度面にどうしても不満が出るな。
組み込みとかだとそのあたりはどうなんだろう?
2009/01/01(木) 03:00:25
>>469
PowerShellに関してはngenすれば全く問題なくなる
F#は知らん
2009/01/16(金) 20:17:48
俺はlispに乗り換えた
2009/01/21(水) 21:26:31
結局の処行き着く先はVBってのがよく分った
2009/01/21(水) 22:33:03
>>473
それはない。
2009/01/22(木) 18:10:58
>>472
defmacro かわいいよ defmacro
2009/01/23(金) 13:35:39
>>470
C# Mono JITだとGCJと同じくらい遅いけどね。
477デフォルトの名無しさん
垢版 |
2009/05/08(金) 16:52:22
2009/07/31(金) 13:08:40
>>470
ネイティブと同じ速度のVM JITがあったら、それはネイティブと同じレベルの
エラーチェックしかして無いってことになるからVMの意味がなくね?
2009/07/31(金) 14:04:37
起動前にどうやっても問題ないと確認できるまで調べ尽くす(と共にJITする)という方式なら、
起動に時間はかかるけど、実行速度はネイティブと同じ速度でVMによる安全性も享受できるはず。
もちろん、これは理想論だけど。
2009/08/06(木) 12:56:23
JITコンパイルしたネイティブコードをキャッシュすれば2回目以降はネイティブと同等になるよ。というか.NETとかそうじゃないの。
481デフォルトの名無しさん
垢版 |
2009/08/10(月) 20:32:38
C++はもはやプログラミング言語じゃねえ
メタプログラミング言語だ
2009/08/10(月) 22:33:40
関数ヲタが自重してくれればここまで肥大化した言語にはならなかったと思うんだけどなあ
483デフォルトの名無しさん
垢版 |
2009/08/11(火) 15:29:20
で、c++0xはいつになったらでるんだい?
2009/08/11(火) 15:30:12
知らんけどConceptが委員会の投票で却下されたので
少しは早まるんじゃね?
485デフォルトの名無しさん
垢版 |
2009/08/13(木) 16:24:22
素人なんであんま詳しくないが、
visual C#の方がvisual C++よりwindowsプログラミングにはいいよな。
ツールが使いやすいし、窓とかに使う部品のクラスやら
プロパティやらイベントの発生やらが直感的に理解しやすい。
ボーランドでdelphi作ってた人がMSに移ってきてC#
作ったらしいが、delphiやらborland C++ builderはvisual c++より
使いやすかったもん。C#はC++ builderまんまじゃん。
2009/08/13(木) 18:10:59
包丁より皮むき器のほうがジャガイモの皮むくのは簡単だよな。

でも皮むき器では大根切れないよな。
2009/08/13(木) 18:58:26
>>486
C++は包丁どころかチェーンソーなのよね
2009/08/13(木) 19:40:31
チェーンソー付き十徳高周波ブレードナイフ(+砥石)だと思う
2009/08/17(月) 17:16:49
C++はいい加減にリファクタリングしろよ
2009/08/17(月) 17:43:16
Cとの互換性を捨てれば色々綺麗に出来るだろうが、今更無いだろうな
2009/08/17(月) 18:27:30
現在のC++はPL/Iよりひどい状態になってるよ

でもなぜだが面白いんだよなあやめられない
492デフォルトの名無しさん
垢版 |
2009/08/18(火) 14:41:02
C/C++は原子マニピュレーター
アセンブリ言語は核融合
2009/08/18(火) 20:59:14
>>492
CとC++を一緒にするなぁ!!!
Cは高級アセンブリ言語だ

2009/08/18(火) 22:39:45
pLaTeX なんかに比べたら
まだまだだと思う
2009/08/19(水) 16:12:39
ATLのバグ騒動で分ったこと
・自分の使うライブラリは自分で作るべし!!!

...ごめん、それは無理...orz
496デフォルトの名無しさん
垢版 |
2009/08/22(土) 13:21:18
C++オワタ
2009/08/23(日) 05:28:12
>>485
言語と開発環境は別物。
開発環境をごっちゃにするんならQTでも使ってみろ考えが変るぞ。
498デフォルトの名無しさん
垢版 |
2009/09/01(火) 21:46:31
2009/09/15(火) 23:58:58
>>496
情報煽動は辞めて下さい><
2009/09/16(水) 00:06:38
Blocks で C にクロージャ入ったから C++ は無くても良いや
2009/09/19(土) 19:44:38
C++最前線はアホ過ぎ
アルゴリズムで解決できる事を言語構文にしちゃってるよ ギザワロス プゲラっ
いや・・・それによって、みんながそれを使えば
Boost使い同士にはみやすいソースになってんのかな・・・・謎だわ
俺は素のC++に少しSTL混ぜる位で満足してる
2009/09/20(日) 22:12:45
具体的に
2009/09/24(木) 14:47:30
莫迦には訊くだけ無駄
2009/11/02(月) 16:38:38
>>501
>C++最前線
これって、本?、どこかのサイトの記事?
2009/11/02(月) 19:48:25
梶本裕介の事だろうな
2009/11/02(月) 22:54:06
C++0xで、(ライブラリではなく)言語本体に組み込まれる機能で、
アルゴリズムでできるに該当するのが拡張for文(いわゆるfor each)しか思い浮かばない。

decltype、auto、type_traits、ラムダ、初期化リストなど
今のBoostにも同じか似たようなものがあるけど、
どれもライブラリでは対応しきれなかったり記法が無理矢理だったりするものばかりだし。
2009/12/28(月) 18:19:39
>>506
例え無理やりでもコンパイラに実装されるのをまたなくても使えるのは有り難いよ
2010/01/13(水) 20:20:56
C++はPHP以下ww

人気プログラミング言語ランキング ‐ PHP、C++を抜いて3位 | エンタープライズ | マイコミジャーナル
http://journal.mycom.co.jp/news/2010/01/12/022/index.html
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況