無論、私も代替可能である機構のすべてが言語のポテンシャルを広げることに貢献していないとは考えていません。C++ のクラスも C 言語を使って実装可能です(実際初期の C++ 処理系は C++ から C へのトランスレータでした)。しかし、C++ はカプセル化などの機能をプログラマに提供するという意味で、言語のポテンシャルを上げていると考えています。
大学で教えている立場から,初学年ではいろいろ面白いことのできる開発環境を使って,プログラミングに親しませる講義もあると良いと思っています.現在我々が普通に使っているソフトウェア環境はGUIがメインであるのに,いつまでもコンソールベースの Hello World ではじまるような授業では,多くの学生のモティべーションを高めるのは難しいでしょう.ある程度高い抽象度をもつ言語・実行モデルの上で画像や音声なども扱えるような(面白い)プログラミングを学び,その後でそれらがどのようなメカニズムに基づいて実行されるのかを学ぶという形でもよいのではないでしょうか.
仕事で時々出かけますが、「ウォータールー」と発音します。
カナダの大学は、だいたい大きいのですが、Univ. of Waterlooは、1学年2000人の大規模大学です。レベル的にも規模的にも北大ぐらいかな? 学科の入っている建物から判断して計算機科学は学年200人ではと想像します。そうすると元記事のトロントの新聞のキッチェナー郡のページに書かれていた、学部長の弁明の「計算機科学の学生の2割、2クラスだけが使う契約」、と数字が合います。1クラスは10人ぐらいで輪講や演習とかやっている光景をよく見かけましたので。
論点になりそうな/なったところを (スコア:4, 参考になる)
いろいろまとめてみました。あくまで私見なんで、それぞれ識者のコメントを期待いたします。
1.C#はMS .NET Frameworkでしか動かないからダメ?
フリーの.net実装であるmono [go-mono.com]は、Windowsでもlinuxでも使えます。コンソールベースの言語ならこれで十分。
そもそもWindowsでしか動かないからって*絶対*ダメとは言えないと思います。私なんかはAppleのHypertalkなんてやらされました(授業は、HTMLで十分に代用できる内容でしたが...)。
2.C#という言語による制約が学生の思考に悪影響をおよぼす?
もちっと具体的な批判が無いと。同じ事は、対象をCにもC++にもJavaにもlispにしても言えるはずです。C#だけやってるとポインタが理解できないだろうけど、Javaを導入したときは、特に大きな問題にはならなかったと思います(そんなことはない?でもC#になったときに騒ぐ事じゃないですよね)。
C#は、JavaやC++に比べると、例外的状況を意識させないコーディングが可能ですが(asで例外の発生しないキャストができちゃったり、Javaみたいに内部で発生する例外のcatchが無くても通っちゃったりとか)、これはPerlやJavaScriptでも同じです。 これもやっぱり問題にならないと思います。
3.企業が大学に寄付した見返りで科目を作るなんて...
ウォータールーは州立大学なんで、私立大学とは違った角度で物事を語るべきですが、こちら [srad.jp]が正しいとしたら、少なくとも日本では前例のある事になるでしょう。カナダでは問題のあることなのかもしれません。(この辺、日本の事情も含めて識者のコメントを期待)
ちなみにC#が必須でも、別に大きな問題ではないと思います。
4.学習参考書が少ないじゃん
これはけっこう致命的な欠点です(単なる参考書は多いんですがね)。ただ、私は洋書でのそろい具合がどんなもんか分かっていないので、日本とは意識が違うかもしれません。
5.RADで勉強するのもいいんじゃない?
実際にはMSの.NET Frameworkだけが使われることは明白です(そのために寄付したわけですから)。そしたら、面白みのないコンソールアプリなんかより、もっとキャッチーなところをネタにすることでしょう(そうじゃないとdelegateとか教えにくいし)。そしたら学生は自宅ではMicrosoftの.NET環境が無いと自習できません。
# まぁこれはAppleも使ってた戦略です(別に免罪符にはなりませんが)
さらに、.NET Frameworkなら、まだWin98以降が使える人なら無料で学習できますが、ASP.NETなんかを教えてしまうとWin2000以降が必須になりますし、WinFormsが必須になると、Visual Studio.NETの有無によって勉強に格差が顕れることになってしまいます(MSとしてはVS.NETの販売が大きな目的のひとつなので、これは実に効果的な宣伝になりますね)。これはかなり好ましくない事です。
6.でも必須科目にしなくても良いじゃん
これは、5.を肯定する(RAD開発の楽しさを積極的に教える)限りにおいて、全く同感です。
re: 4.学習参考書が少ないじゃん (スコア:2, 参考になる)
に関して。書籍という面で見れば、他の言語に比べれば少ないでしょう。ただ、英語が使えるなら、.Net Framework のドキュメントが 充実してるし(msdn library [microsoft.com])、onlineでMSのチュートリアル(日本語版 [gotdotnet.com])とかもあるし、ここ [c-sharpcorner.com]と ここ [dotnet247.com]で大抵の疑問は解決するはず。
ベッドで寝転がりならが読むために活字じゃなきゃ駄目ということになれば、Programming C# [oreilly.com]という本が一応ある。
っていうか、E&CE 050 という入門の講座でプログラミングのプの字も知らんような奴ら向けだから、まともな本なんてなくたっていいんです。どうせ読まないから。教授が自作で作った本が大学の本屋で売られるに 1 カナダドル。
computer scienceをしっかりやる奴らは一年の後半から C++ とかアセンブリとか Scheme とか自作の言語とか色々やっていくわけで。 初心者向けなんだから、「Windowsソフトも、ほら、こんなに簡単につくれてしまいます」ってほうが習うほうも楽しいはず。 自分で作ったソフトがそのまま使えちゃう喜びっていうか。 件の大学はどうか知らんけど、僕の大学はWindowsを持ってることを義務付けてるし。
それを言ったら (スコア:2, 参考になる)
情報処理の講義で(必須かどうかは自信がありませんが)、
Fortranを未だに使ってコード書かせていたのにビックリしました。
実務と教育の世界のギャップは意外に大きいものかも。
それに確かUCSDではComputer Scienceを専攻した場合には
Pascalが必須項目だった記憶が。(さすがPascalの総本山)
まぁDelphiやるならPascalは使えない言語ではないのでしょうけど。
Re:それを言ったら (スコア:3, 参考になる)
stoshさんがなにを専攻されていたかわかりませんが、すくなくとも
物理・化学系の場合、Fortranの資産が膨大にあります。僕はCばかり
で作ってしまいますが、それでもFortranで書かれたコードは必然的に
読まざるを得ないワケで・・・。
ですから、物理系または化学系の学生を対象とした一般教養の講義では
あながち間違いではないのではと思います。
(おなじく某N大学でFortranをかじった者より)
Re:それを言ったら (スコア:1, 興味深い)
ないの? それにUCSDだったらまともな教育してるはずだから,
学生がたった一つのプログラミング言語しか習得する実力がないと
いうことはありえないでしょう.
仕事でプログラミングやってる人間だったらC/C++だろうがPascal
だろうがLISPだろうがCOBOLだろがSmalltalkだろうが,必要に
応じて何でも使いこなせて当然だと思うが....(そうでない奴が
多いのは何故?)
Re:それを言ったら(スコア:-1 余計なもの) (スコア:1, おもしろおかしい)
Re:それを言ったら (スコア:1)
別に毛嫌いする必要はないと思いますがねぇ。
私が10年ほど前 COBOL 開発に従事していたときは、BATCH, CICS, サブルーチン に分けてそれぞれ雛型を使用していたので、IDENTIFICATION DIVISION を直接入力する機会は殆どありませんでした。
それに、高級言語になればなるほど、記号的ではなく、文に近づいていくというのは当然ではないでしょうか。
(まずないとは思いますが、高級言語の意味を履き違えないでくださいね)
それに最近は、Java 等もメソッド名に明確に意味がわかる名前を付けることが主流になってきていますし、
isIgnoringElementContentWhitespace()
なんて、文字数だけでいったらこっちの方が長いですよね。(使用頻度に違いはありますけど)
COBOL にも COBOL のメリットがあって、言語そのものを否定するというのはどうもいただけない気がします。
もっとも、その言語を選択する/しないはあなたの自由(又はお客さんの自由)ですがね。
Re:それを言ったら (スコア:1, 参考になる)
Fortran で書かれた膨大なライブラリがある場合、扱っていても不思議はありません。
ただ、一般教養課程で用いるのに相応しい言語かというと疑問に思います。
C と perl という学校もあるそうですが。
Re:それを言ったら (スコア:1)
それだけとか言われると非常に困りますが。
Re:それを言ったら (スコア:2, 参考になる)
コンパイラの最適化に使う解析手法は、プログラムの流れを追っていくコントロールフロー解析と、プログラムの流れに即しながらデータの中身がどう変わっていくかを追うデータフロー解析の2 種類に大別できます。
ポインタはデータフロー解析の難易度をアップさせます。
まず、ポインタが何を示しているかをデータフロー解析しておいてから、ポインタが指す可能性があるオブジェクトをデータフロー解析するというような多層の解析が必要になるからです。
あと、配列が数学的な行列というよりも、メモリを便利に使える機構的に捕らえられている点も問題です。配列の境界チェックがなくA[1][-1][2] のような記述も許されています。あと 書き手の傾向の問題ですが、多次元配列でも 2次元配列で実装しようとするため、解析困難になっています。
1.静的大域変数の多用。
これは大きいです。
C 言語のように大きな配列を malloc で確保してしまうと、
どのくらいの大きさの配列がどこにあるのかすら分らなくなる可能性があります。
2.関数、副プログラムの引数は参照渡し。
これは、むしろデメリットですね。すべて値渡しの方が好都合。
3.再帰呼び出し不可。
これはコントロールフロー解析を楽にしてくれます。
ソースコードを 1 回 上から下に解析するだけで、関数の呼び出しグラフができてしまいますから。
コンタミは発見の母
Re:それを言ったら (スコア:2, 参考になる)
>ポインタはデータフロー解析の難易度をアップさせます。
なるほど。
C のようななんでもありのポインタがない Fortran だとデータフロー管理のコストを
小さくできるので、解析後の最適化処理がかけやすいということでしょうか。
論文が読めません・・・ (スコア:1)
というか、なぜいまだにあの世界はPascalなんだろう・・・。まあ、100%パスカルというわけではないし、ちゃんと動くPascalで書いてあるわけでもないですけどねぇ・・・。
---------- ------ ISHII Nayuta
Re:論文が読めません・・・ (スコア:1)
以前,論文の中のある擬似コードをLisp風に書いたところ,査読者から「もっとメジャーな言語で書いて欲しい」と言われて悲しくなったことがあります.
Re:論文が読めません・・・ (スコア:1)
これ以前だと、COBOLとFORTRANとPL/Iしかなかったと記憶してます。
これらと比較した場合、読み易さがかなり違うと思います。
論理構造がはっきりと記述できれば何でもよいんでしょうけど。
(この意味では多重継承を許す言語は不適かな?判りずらくなるから。)
# Occamで記述すると並列処理が簡単に書けていいかも…
# 読める人の数がLISPの半分だったりして。
notice : I ignore an anonymous contribution.
最古参はAlgolでは? (スコア:2, 参考になる)
ついでに#にフォローしますが…
OccamはCSPから諸概念を借りてきているので,並行計算の理論的扱いをちょっとかじったひとなら案外読めてしまうと思います.
最近はCSPよりもCCSやπ-計算的な記法の方をよく見かけますが.
正直、言語なんて問わないです (スコア:2, すばらしい洞察)
問題なのは特定の言語に依存してしまうことで(MSはそれを期待してやってるはず)、基本的なアルゴリズムや物事の考え方といったものをきちんと伝えることが重要でしょう。
だから、授業の中でアルゴリズムが重要なところでなにげにフォームビルダでどうこう、とか教えるというのはしないでほしいです。
C#、使いたいならCUIでね(笑)
-- やさいはけんこうにいちば〜ん!
Re:正直、言語なんて問わないです (スコア:1)
いや、さすがにbrainf*ck [muppetlabs.com]はやだなぁ。
# mishimaは本田透先生を熱烈に応援しています
Re:正直、言語なんて問わないです (スコア:1)
「言語」よりも「動作環境」ないし「処理系」
と言うべきでしょう。
# C# はよく知らないけど
たとえば自動車の大手企業の作った専門学校と
似てますが(リクルート or その企業への飼い慣らし)
なんか「買収」みたいな気もします。
寄付。。? (スコア:2, 興味深い)
僕の学校では一年に全員に必修でJavaやらされたけど、 同じようなものではないでしょうか。
VS.NET 使えば C# ほど面白い言語もないと思うんだけどなぁ。RAD環境って素人が object-oriented な感覚を養うのにちょうどいいと思うんだけど。CUIで作ればHello Worldみたいなとこから始めていけるし。
正規表現、XMLパーサとかなんでも .NET でそろってるのがおいしい。画像と音関係がまだないけど。動的に型を発見したり、リモートでオブジェクト作ったり面白いですよぉ。
C++ Builder -> Delphi -> C#と使ってきてるんで、意見に偏りがあるかもしれませんが。
# 今は趣味でC#でゲームとか人工知能(のようなもの)書いてます。
# で、できあがったら条件付GPLにしてる。うけけけ>ゲイツ
思うに (スコア:1)
「見返りに・・・」っていうのがあれば、商談が成立したってことのような・・・
Re:思うに (スコア:1)
Re:思うに (スコア:1)
結局は、「よりよい教育」か否かが問題 (スコア:1)
そこまで言わないにしても、教育的「効果」の良し悪しってのものは、無視するわけにはいかないかも。
どれだけ「良い」言語で勉強させるか?によって、出来上がる(^^;学生の質は
結構変わってしまったりしないだろうか?ということです。
心配するのはやっぱり、「言語は思考を規定する」という意味での、言語の影響力ですね。
変な面のある言語で刷り込まれてしまうと、痛いわけで。
たとえば往年の行番号BASICに刷り込まれた人々ってのも、それだったかなと。#そういやあれもMS由来だったなあ。
そういう意味では、引き合いに出されてるSUNのサーバーのほうがまだしも罪(^^;は軽いかと。
思考を規定する度合いは、鯖よりも言語のほうが「深刻」だと思いますので。
#ということは、むしろ心配なのは、今実際に巷の多くで学ばせさらてるらしきJava言語かな。
#この場合、もともとのライセンスが無料であるかどうかは別問題です。
使いでが無いかどうかは、むしろ学生さん段階ならば、あまり拘り過ぎないほうが良いと思います。
仕事で仕方なく使わされる糞言語の類(どれとは言いませんが)に、学生のころから耽溺しちゃったら、
そりゃもう痛々しいっす。使いでの無さだけで「よい教育」かどうかを決めるのは、たぶん的外れっす。
で、C#ですが…どうなんでしょうね?(^^;
まあ仕様から察するに言語の潜在能力自体はJavaより上かも知れないけど、
その潜在能力をMSの実装がきちんと過不足なく出しているかどうかは別だし。
あと、開発統合環境の問題もあるかな。
環境も結構、思考を規定しちゃうので、あんまり変なもので刷り込まれてほしくない。
C#のMS実装は指一本触れたことがないんで判らないんですが、その↑へんがどうなのかは、識者のコメントを期待します。
ん?そういやC#の非MSな実装は、どんなのが有るんでしたっけ?
あ。あと重要なものがひとつ。開発したソフトを動かすターゲット環境に対する刷り込みも、問題ですね。
APIとかさぁ。
てゆーか、そのまんま.NET必須っすか?
.NETの世界オンリーで脳が漬物になった学生さんって、その後どうなるんでしょう?
目に触れたものをそのままじゃなく、いったん抽象化して理解することが出来るくらいにまで成長した後ならば、
なにをどう触れようが良いんですが、それ以前だとどうなんだろうな?
#文中でしばしば仕事という言葉を使っていますが、趣味だって同じことだと思います。
#糞言語に耽溺するのは、趣味だとしても、ハタから見てて痛々しい。
##フリーソフト作者で時折、自分がなじんだ(糞)言語の選択の自由(「この言語を使うのは俺の自由だ、
##なぜならこれは趣味だからだ」)を叫ぶ人が居ますが、自由かどうかと貴賎が無いかどうかは別問題です。
Re:結局は、「よりよい教育」か否かが問題 (スコア:3, 参考になる)
プログラミングを独習するには10年かかる [neweb.ne.jp]でも書いてあるが、
プログラミング言語は複数学ぶことが必要だろう。
そのうちの一つがC#であっても、何ら問題は無いと思われ。
# 個人的には Lisp が必須だと思うが
# mishimaは本田透先生を熱烈に応援しています
Re:結局は、「よりよい教育」か否かが問題 (スコア:1)
それもそうですね。少なくともどれか1つしかやったことが無い人ってのは
「話にならない」感じがすることがしばしば有ります。
言語の数だけ概念が有る(という言い方でもなお過小評価だが)わけだから、
言語にかこつけて(^^;それらを片っ端から知っておくのは、損はなさそう。
ただ、
>そのうちの一つがC#であっても、何ら問題は無いと思われ。
C#の実力とか、逆に「毒度」とかが、どうなってるか次第だと思います。
なにごとも経験とはいっても、あんまり変な言語が「そのうち」に入っていると、ちょっとねえ。
C#が変かどうかはさておきますが。
># 個人的には Lisp が必須だと思うが
そうらしいですね。経験してないので、今ごろ困って(ってゆーか…)います(^^;
Re:結局は、「よりよい教育」か否かが問題 (スコア:2, 興味深い)
同意. 少なくともその言語を作った人は「既存の言語ではだめ」と思って作ったわけですし. プログラム言語をいじることによって,その言語の作者の思想に触れる,というのはあると思います.
で,更にプログラミングの概念の歴史的変遷,というのも見えてきますね.
Re:結局は、「よりよい教育」か否かが問題 (スコア:2, 参考になる)
現状でも,情報系の学科・コースでは複数の言語を扱っている所がほとんどなのですが,それらの間の諸概念の関連を(理論的内容もある程度含めて)きちんと扱っている授業は案外少ないようです.その辺を理解していないと,多くの学生さんは結局メジャーとされる言語(例えばCなど)だけわかっていればいいと思ってしまうようです.
Cなどによる初歩的なプログラミングの講義を受講した学生を対象にHaskellやStandard MLを使った講義をしたことがあります.後でまたCのプログラムを書く際,プログラムの見通しがよくなってバグが少なくなったと報告してくれた学生が複数いたのがちょっとうれしかったです.
あと,言語だけでなく仮想機械やミドルウェアのような実行環境もいろいろ経験するといいのでしょうが,大学の講義や演習ではなかなか全てをカバーしきれませんね.教えられる人も限られてきてしまいますし.
Re:結局は、「よりよい教育」か否かが問題 (スコア:2, 興味深い)
>まあ仕様から察するに言語の潜在能力自体はJavaより上かも知れないけど、
>その潜在能力をMSの実装がきちんと過不足なく出しているかどうかは別だし。
いまだに普通の環境でまともに動く統合開発環境すら出してくれない sun に
比べたらMSの方がよほどマシです。
forte と VisialStdioの差を見れば明白です。
フリーとか有償とかはこの際問題ではありません。
まともに動くということが大切です。
>ん?そういやC#の非MSな実装は、どんなのが有るんでしたっけ?
BSD(これはMSらしいが)
Linux(mono project)
などがあります。
by rti.
Re:結局は、「よりよい教育」か否かが問題 (スコア:1)
まあ、よく言われてはいるが、
C# != CLI != .NET Frameworkではあるはず。なので洗脳されるかどうかは大学のカリキュラム(と自己学習)しだい。むしろ、開発/実行環境が特殊になってしまう言語よりかはいいかなと思うんだけどなぁ~。
#個人的にはSunも好きくないので、*BSDなCLIでプリミティブに開発を勉強しなおしたいな(笑)
M-FalconSky (暑いか寒い)
Re:結局は、「よりよい教育」か否かが問題 (スコア:1)
>環境も結構、思考を規定しちゃうので、あんまり変なもので刷り>込まれてほしくない。
(統合環境の是非はともかく)
C#はコマンドラインでも使えますよ。
寄付といえば (スコア:1)
JAIST とかでも確か企業からの寄付の講座というのはあったと思います.
ということを考えると,この話でアレなのは「必修」になっちゃってるあたりなのかなぁ.
カリキュラムにより善し悪しが・・・ (スコア:1)
# ライブラリって言うと、とてつもなく広い言い方ですが、そこらへんは推し量ってください(笑)。「Cのstdio.hもらいぶらりじゃないか!」とかいわれても困ります^^;。こういう場合はなんていうのが適切なんですかね?
そういう意味では、CとかC++とかのほうが断然有利ではありますね。ある程度プラットフォームから切り離されて存在してるし、それなりの教科書もたくさんあるし。C#はまだまだ.Net本ばっかりだし、Javaもそういう意味ではある意味似たような状況にある気がします。
欲を言えば、複数の言語をやってほしいですね。C#やるんだったらあとCとか、PerlでもLispでもかまわないですが。VBはちょっといただけないですね。プラットフォームから切り離せないし・・・。
# オフトピックですが、VBの言語は何なんでしょうかね?(笑) なんか、VBが他の言語と比べてどうだという話を見てるとJ2SEはC++と比べてこうだ、といってるようにしか思えないんですが^^;。なんか、VB.NETでは言語体系がオブジェクト指向化(っていうの?)されてObjective Basic(笑)みたいなことになってます。みてみると面白いかも。
---------- ------ ISHII Nayuta
JavaやC#から始める若い人がかわいそう (スコア:2, 興味深い)
FORTRANからBASIC、VBいろいろ。
CからC++、Java、C#。
UNIXプログラミング環境からAWK、Perl、PHPとかスクリプト言語いろいろ。
だいたい新しい言語は古い言語からアイデアを借りていたり、互換性が考慮されていたりするし、そうでなくても、似たものとの差に着目すれば、新しい言語は楽に覚えることができるものだけど、いきなりJavaとかC#とかを速成で勉強する人はたいへんだな。歴史も合わせて勉強しないと習得には時間がかかりそうです。
私は仕事中心で考えるので、何言語がコンピュータサイエンスの勉強には適しているかは興味はなく、生産性ばかり気になります。私の経験では、仕事で生産性の高いプログラマほど多くの言語を知っているし、知らない新しい言語でも即日使い始めるほど習得も早いものです。JavaとかC#しか知らないプログラマより、古い言語をたくさん知っているプログラマの方が安心できます。
教育用かな? (スコア:1)
逆にC言語って、抽象化の度合いのせいで適度に生のコンピュータが見えるので、教育用としてはなかなかの言語だと思うんですよ。ポインタ概念ってコンピュータサイエンスを学ぶ上では避けて通れないし。
それから、フリーの実装が出てないのも不安>C#
Re:教育用かな? (スコア:1)
monoは、従来型の教育用としては、十分に使い物になると思います(ただし、まだバギーである可能性は高いですが)。簡単なものはコンパイルしてみたことがあります。教育用なら、基本型が使えてファイル入出力さえ出来れば良いでしょうし。ちなみに.NET Frameworkクラスのサポート状況...ただしmonoの自己申告...はこちら [go-mono.com]。
ただ、Windows Formsでウィンドウ プログラミングをしましょうとか、ASP.NETでWebアプリケーションを作ってみましょう、XMLベースのWebサービスを作ってみましょう、とか言われると無理です(必須科目の内容じゃないだろー、というツッコミはおいといて)。こういうのが使えないと、イベントハンドリングなどの例題コードに困ると思いうんですけどね。それにこの辺が使えないと何かC#やってる気分になれないかも(って、教育とは無関係ですね)。
dotGNU [gnu.org]はどうなんだろう...?? ひさしぶりに見たらページががらっと変わっていてビックリ。
Re:いい方に考えると (スコア:1, すばらしい洞察)
でも、同じ問題は結局JavaだのRubyだのでも生じますよね。ポインタつーか参照については。
単に症状の出方が違う(いきなりコアダンプするか、NullPointerなんたらExceptionが出るか、の違いというか)だけで。
ポインタって、その概念的原理(つまり、なにかがなにかを「参照」する)と、 C独特の構文と、
の2者さえ理解すれば、逆にいえばたいして難関でもないと思います。
あの程度のことを理解*できない*ような人ならば、情報系の学生だろうが仕事だろうが趣味(フリーソフトとか)だろうが
こっちとしてはちょっと遠慮願いたいものだ、と思ったりします。
#ポインタって結局は、四角と矢印の組み合わせからなる図で、ぜんぶ説明できますよね。
#四角はメモリ領域(byteやWord)。矢印はポインタがどこかの領域を指してる様子。
そういう意味では、ポインタバリバリでバギーなコードを書いちゃった時点で、その人の
(Cに限らない)プログラミング能力を、俺は疑いますね。
ただ、Cがメインの学習カリキュラムってのもそれはそれで痛いってことならば、同意。
あとは、都市伝説よりきちんとした定義を学ぶ、ということを知ってる人でないと駄目ですね。
C言語なりポインタなりについて(というか他のどれでもそうだが)、
正しい理解をしている人は、たいていいつも正しいコードを書き、
あやふやでバギーな理解(^^;をしてる人は、書くコードもバギーです。
自分が抱えてる知識(やそれへの参照)が正しいかどうか?を、きちんと身辺整理できる人でないと、ちょっとね。
>でもコンピュータサイエンティストなら、アセンブラはやって欲しいけどね。
それってハードウェアサイエンティストのことですか?ソフト(上層)ではなくて?
エンジニア向けと一般向け (スコア:1)
サイエンティストがアセンブラやるべきかどうかは分からないけど、エンジニアならやっておくべきかも。
例えばここで話題になっているC言語のポインタにしても、最初に
なんていう風に端から抽象化して説明されちゃうと、かえって分かりづらくなると思うのです(JavaやLispのような動的メモリ管理をしてくれる言語だとそれでもなんとかなるかもしれませんが)。最初はむしろ具体的に、インデックスレジスタ(アドレスレジスタ)でアドレッシングするんだよ、というような、 という方に近い説明の方が直截的で分かりやすいと(私は)思います。「C言語とは高級アセンブラの一種である」なんていうことを言う人もいますが、後でCを使うのならアセンブラから入るのが反って分かりやすい(場合もある)というのが私の考えです。ま、この辺り、メモリ上の具体的なイメージさえ湧くなら、アセンブラやらなくてもC言語をやれば良いということも言えますけどもね。C言語と聞いてまず「ポインタ! 理解不能!」と思っちゃう人は、たぶんアセンブラを知らない人に限られるんじゃないかなあと思います。(検証したことはないですが)
ただ、以上は「泥臭いプログラミングもできなきゃいけない」エンジニアにとっては学ぶべき範疇と思いますが、大学の(コマ数の限られた)教養で学ぶプログラミングの知識として適切かというと、それはまた別の問題ですね。そういう意味では、個人的には、やっぱLispを推しちゃうかな。あるいはMLとかもいいかなあ。
ま、ぢつはLispもアセンブラ知ってた方が分かりやすいって面もあるけどネ^^;。なにせCARだのCDRだのの語源がそもそもアセンブラらしいし……。抽象的議論に耐え、かつぢつは結構泥臭い、てところがLispのミ・リョ・ク☆ :-) どうせ限られた数の言語しかやらないなら、後で訳もなく愛せてしまう言語を選ぶってのもいいカモネ! :-) :-)
その点C#はどうなのかな?
「ポインタ」は「参照」に非ず (スコア:1)
「ポインタ」は「参照」としても利用できるように設計されていますが、「参照」よりも遥かに広いポテンシャルを持った機構です。ゆえにバグの温床となる。
「ポインタ」はメモリアドレスを示す「値」(+型情報)、「参照」はもっと抽象的なオブジェクトやクラスなどを参照することができるデータ。
例えば、言語屋さんから見ると C 言語には "call by reference" がないように見えるそうです。C 言語が "call by reference" と称しているのは、アドレスを渡す "call by value"。
> でも、同じ問題は結局JavaだのRubyだのでも生じますよね。ポインタつーか参照に
> ついては。単に症状の出方が違う(いきなりコアダンプするか、NullPointerなんたら
> Exceptionが出るか、の違いというか)だけで。
いいえ。
例えば、下記のようなコードの問題は Java では生じません。記述もできません。
これは大きな違いです。
int a = 0;
int b = 0;
int c = 0;
int* p = &b;
*(p + 1) = 1;
printf( "a=%d, c=%d\n", a, c );
コンタミは発見の母
Re:「ポインタ」は「参照」に非ず (スコア:2, 参考になる)
>と称しているのは、アドレスを渡す "call by value"。
C言語の文法と挙動を正確に理解できるようになるために学ぶ段階において、
C言語がcall by referenceだなんて考えたらドツボにはまっちゃうわけで。
あくまでcall by valueと考えるべき。
そう考えることで、初学者にもベテランにも言語屋さんにも、誰にとっても
矛盾なく使える(かつ、なにか重要なものを欠落させるわけでもない)モデルが
頭ん中に構築できるわけで。
言語屋さんには見える、という狭い話じゃなくて、誰にでもそれは事実であるのでは?
>例えば、下記のようなコードの問題は Java では生じません。記述もできません。
>int* p = &b;
ああ。これは失礼。
CのポインタとJavaとかの参照との違いとして、「データじゃなく変数(データの器)を」指すということが
可能か不可能か、という差がありますね。
他の変数に代入されてる値にアクセスする、ということが、この機能の有無によって、可能か不可能か変わってくる。
でも逆にいえば、それしか差は無いわけで。
あ。ごめん。もうひとつだけ差があった。Cのポインタには「演算」が定義されてる。
++とかが出来てしまう。
で、それらの機構を「参照」に盛り込むことが、べつに論理的に不可能なわけではない。
ただ実用性において無意味だから誰もやらない(Cを真似ない)だけで。
余談:
C++の参照と、それ以外の多くの言語(JavaとかRubyとかDelphiとかLispとか…)の参照とを混同している人が
近傍に居るようですが(^^;、まぁそれはそのぉ…って感じ。
C++って、用語の変さという意味でも、痛い言語なんだよな。時として他の言語を学ぶのを妨げかねない。
Re:「ポインタ」は「参照」に非ず (スコア:2, すばらしい洞察)
ただ,現実に多くの人がポインタの理解で苦しんでいるのは事実のようです.またC/C++のポインタはプログラムの解析を行う際にも様々な困難を引き起こすのですが,そのことも使うのが難しいということを裏付けていると思います.
Re:「ポインタ」は「参照」に非ず (スコア:2, 参考になる)
> (何故なら通常コンパイラの警告で除去できるミスなので)、まぁいるんでしょう。
おお!これは私に対する挑戦ですね。いいでしょう。
警告を出させずにローカル変数の参照を運び出してみせましょう。
◎ パターン1
int& foo(int& i) {
return i;
}
int& goo() {
int i;
return foo(i);
}
まぁ、このぐらいならコンパイラの警告なしでも気づきますよね。
◎ パターン2
パターン1 の応用です。
class Sample1 {
int& index;
public:
Sample1(int& i) : index(i) {}
};
Sample1* moo() {
int i=0;
return new Sample1(i);
}
◎ パターン 3
暗黙の型変換を使います。
class Sample2 {
int& index;
public:
Sample2(int& i) : index(i) {}
};
Sample2 boo(int i) {
return i;
}
どうでしょう?
コンタミは発見の母
Re:ポインタ型 ←→ 整数型 (スコア:2)
>> コンピュータ言語の表面的な文法の話ではなく、ポテンシャルの話をしているのだ
>> と思っていたのですが、、、
> 移植性も無い、状況しだいで動いたり動かなかったりする(^^;コードに
> 「潜在」能力を期待するわけにはいかないと思います。
> むしろ「潜喪失」能力ってんでしょかね。いつか意図しない形で無くなりかねない(^^;
なぜ、私の話をそらすのかなぁ?
コードのポテンシャルの話をしているのではなく、言語機構のポテンシャルの話をしているのです。
過去のコメントの中に、G7さんは「独自の言語を設計し、その実装を行った」とありましたが、その際に言語の中にある別の機能で代用不能な機能と、便利な言い換えを区別して設計しませんでしたか?
>> ポインタがメモリアドレス値を格納するシステムだとすれば、必然的にアドレス値を
>> 整数とみなせて相互変換する機能があるはずです
> そういう問題とは別だと思います。
なぜ?
> 整数とは別の、あくまでポインタという世界があって、そいつが整数との加減や
> ++(というか、これも整数との加減の亜種ですね。+=1なのですから。)を定義されて
> いる。整数との加減算は、ポインタを「進める/戻す」という性質のために存在し、
> CASTとは別問題であるはず。
「目的」や「使用方法」の問題ではないのです。
C 言語の for/while/do-while 文は、if と goto 文とラベルがあれば代替可能です。
for/while/do-while はループをあわわすために存在します。しかし、言語のポテンシャルを増やしている分けではないでしょう?
# for/while/do が不要だといっているわけではない。
無論、私も代替可能である機構のすべてが言語のポテンシャルを広げることに貢献していないとは考えていません。C++ のクラスも C 言語を使って実装可能です(実際初期の C++ 処理系は C++ から C へのトランスレータでした)。しかし、C++ はカプセル化などの機能をプログラマに提供するという意味で、言語のポテンシャルを上げていると考えています。
> というのは、ポインタに整数を加減できるという性質と、ポインタを整数にCAST
> できるという性質は、別々に成立(or不成立)させることが可能だからです。
問題にしているのは、「ポインタに整数を加減でるという性質」と「ポインタを整数にCASTし、その逆変ができる」という性質です。妙なところで端寄るのはやめましょう。
上の2つの機能は独立ではあるが同条件ではありません。「ポインタを整数にCASTし、その逆変ができる」を言語仕様から外すと、処理系非依存の依存の機能を用いない限り、言語のポテンシャルは小さくなります。つまり、実現できない機能がでてきます。
> ソレが証拠(?)に、ポインタを整数にCASTしたものを++して再び元のポインタにCAST
> したものと、ポインタをそのまま++したものとでは、しばしば(詳細は略していいで
> すね?)同じ値になりません。
詳細をあげください。無論、char 型より大きい方のポインタでは一致しないなんては駄目ですよ。私はすでにポインタの指す型のサイズ(sizeof(*pointer))を加えた例を挙げているのですから。このとき両者は同じ値ですね。
それとも、ポインタは参照と型の両方を持っている点が違うといいたいのですか? ポインタ演算を行っている場所では、そのポインタの指す型がどこでも手に入りますよ。つまり、ポインタを整数にキャストして足す時とした場合、その足し幅が手に入るということです。なぜなら、この型の情報を持っているのは実行コンテキストではなく、プログラムのフローだからです。
p.s.
追加しおきますが、ポインタを整数型にキャストして演算し戻し場合と、ポインタ演算の結果が異なる可能性は確かに存在します(C 言語の仕様上)。
おそらく G7 さんが意図したこととは異なるし、この議論とは関係ないので詳細は述べませんが。
# *((int*)0) = 0;
# どのメモリアドレスに値を書き込もうとしているか分かりますか?
p.p.s.
#147884 [srad.jp]の
>>ポインタバリバリ使ってバギーなコード書かれるよりはましかも。
に
> でも、同じ問題は結局JavaだのRubyだのでも生じますよね。ポインタつーか参照に
> ついては。 単に症状の出方が違う(いきなりコアダンプするか、NullPointerなんたら
> Exceptionが出るか、の違いというか)だけで。
と答えたあたりから疑っていたのですが、G7 さんはC言語から Java へ乗り換えることによって、どのようなC言語特有のバグがどのように減るのか
コンタミは発見の母
Re:いい方に考えると (スコア:1, 興味深い)
必要な場所で必要な知識があればよし。それ以上を求めてもきりがない。
理想と現実は違うものだよ。技術者としての理想と、仕事としてのスキルは全くの別問題。
Re:いい方に考えると (スコア:1)
もっとも現役のコンピュータサイエンティストと言われている人達は,いざとなればアセンブラでプログラムを書くことくらいはできると思いますがね.
案外そうでも無いのかな? :-P
Re:いい方に考えると (スコア:1)
>した時対処出来ない。
>こういうのはVB屋さんとかにダメな人が多いね。
こういう文脈でVB屋を引き合いに出すなんて、コンパイラ屋さん(なのかな?)のやることじゃないですね。
優劣はさておくとしても「畑」が違いすぎるんだから、その畑での勝負は、結果が目に見えている出来レースです。
逆に、下層に強い人だからといって、上層もすらすらこなせるとは限らないと思うんですが、どうなんでしょう?
下層でやってることを再帰的に積み重ねる「だけ」で上層も説明できるわけでは、無い筈ですから。
よだん:
パフォチューといえばDBマガジンなんかでも(もちろんDB畑について)よく記事が乗るようです。
まぁ色々あるということで。
よだん2:
ここでは関係ない話であることを期待します(笑)が、
「自分のバグを見逃して、コンパイラのバグだと騒ぐ」人も結構いるらしいですね。
上層やってる側から言えば、いかにコンパイラのバグみたいなものを「踏まず」にいられるような
素朴(笑)なコードで実装を済ますか?を気にしたりは、します。
Re:いい方に考えると (スコア:1)
今更であっても、コンピュータの中身を知るという点では、Cのほうが、ずっといいと思ふ。
コンピュータの動作をわきまえているのと、いないのとでは、後々、大きな差になって現れてきますよ。
Re:それと (スコア:1)
両方を行き来していると混乱します。
頭を切り換えるのが大変。
例:
[java] Object.toString()
[C#] Object.ToString()
Re:で、その大学は (スコア:3, 興味深い)
話題となっているウォータールー大学のElectrical & Computer Engineering [uwaterloo.ca]学科ですが,コンピュータ分野では(少なくとも研究レベルでは)わりと名の通った所です.コースもバランスが取れているので,ご心配のようなことはたぶん起こらないでしょう.むしろ初学年のC++による必修講義をC#に置き換えるのは,MSの支援がどうのというところを別にすれば学生のためにもなると思います.OSやシステムプログラミングに関する講義もあるので,CやC++はそのときに学んでも遅くはないでしょう.
大学で教えている立場から,初学年ではいろいろ面白いことのできる開発環境を使って,プログラミングに親しませる講義もあると良いと思っています.現在我々が普通に使っているソフトウェア環境はGUIがメインであるのに,いつまでもコンソールベースの Hello World ではじまるような授業では,多くの学生のモティべーションを高めるのは難しいでしょう.ある程度高い抽象度をもつ言語・実行モデルの上で画像や音声なども扱えるような(面白い)プログラミングを学び,その後でそれらがどのようなメカニズムに基づいて実行されるのかを学ぶという形でもよいのではないでしょうか.
残念ながらC#や.NETのフルセットの開発・実行環境はMSが提供する有料のものしかないので,この話みたいに寄付でもしてもらえないと日本の大学で大々的に導入するのは難しそうです.現状ならJavaで十分という気もしますが.
MSDN academic alliance (スコア:2, 参考になる)
MSDN アカデミックアライアンス [microsoft.com]というのがありまして、学科単位で破格で開発環境を構築できたりします。学生のパソコンにも入れられたりする。
うちの学校はこれに入っているので、借りてきて入れています。もともと開発環境は揃えられるだけ揃えたいタイプ(そのほうがいざなんかやらなきゃならないときに適したものを選びやすいし)なので(笑)。
# ちなみに私は学生です。でも・・・いれててもあんまつかわないな・・・Perlが楽だ・・・。提出期限も迫ってるし・・・。
---------- ------ ISHII Nayuta
Re:で、その大学は (オフトピ) (スコア:2, 参考になる)