ページ 11

c以外の言語の経験

Posted: 2007年6月17日(日) 17:33
by 組木紙織
ただいま卒論の関係でfortran77を勉強しているのですが、
プログラムが書きにくくて少しいらいらしながら勉強しています。

古い言語なので仕方が無いとは思うのですが、ループ分がforループしかなかったり、
gotoを絶対に使わないとwhileやdoのループ制御が出来なかったり、などがあり、
cで書いたプログラムをfortranに変換するプログラムを作って、その変換をかけてしてみたい気分です。
(変換プログラムを作るのに時間がかかるからしませんが)

ここの掲示板に来る人はc/c++言語使いだと思いますが、他の言語を使ってどうだったか?
他の言語の経験年数などを聞きたいと思います。

私の場合は
java 半年   単一継承が使いやすい。ライブラリーが大きいのでそれを学ぶのが大変。
perl   1ヶ月   変数の宣言がなれないと難しいな。ラベルつきのループ文は使いやすいけど。
fortran 2週間   色々と制限がきつくて書きにくいです。言語仕様は大きくないのがいいのですけど。

といった感じです。
ちなみにperlはCGIを作るためだけに勉強して、CGIを完成させてからまったく触っていないです。

Re:c以外の言語の経験

Posted: 2007年6月17日(日) 20:12
by Hermit
最初、学校でのプログラムは フォートラン からでしたね、私は。
77 のフォートランは、for 文があるんですか。
私がしてたときのマニュアルを見ると、そんな物ありませんでした(^^;
do 文がそれにあたるみたい。
goto は、かなり強力です。

まあ、マークカードを読ませて実行だったので、でかい物は作ったこと無いけど。

Re:c以外の言語の経験

Posted: 2007年6月17日(日) 20:19
by バグ
私は最初がBASICで、学校でCOBOLとFORTRAN、C言語を少々という感じでした。

ただ、当時の私はBASIC以外はあまり興味が湧かなかったので、あまり記憶に残ってません(^^ゞ

おぼろげながら、FORTRANはBASICに近かったようなイメージがあるので、オブジェクト指向に慣れていると使いにくいでしょうね。
私の場合はBASICでばかり遊んでいたので、逆にC言語に慣れるのに苦労しました(;^_^A

Re:c以外の言語の経験

Posted: 2007年6月17日(日) 20:20
by 組木紙織
>77 のフォートランは、for 文があるんですか。

すみません。説明が悪かったみたいです。
フォートラン77には"for"の予約語は無いです。
"forループ"を表現する予約語に"do"があるというだけです。
なのでfor"文"でなくfor"ループ"という言葉を使いました。

>まあ、マークカードを読ませて実行だったので、でかい物は作ったこと無いけど。

私の母がその時代でした。母はCOBOLを勉強していたようですが。

Re:c以外の言語の経験

Posted: 2007年6月18日(月) 13:04
by YuO
趣味と仕事を一緒くたにして書くと,
Basic,Quick Basic, Visual Basic for MS-DOS, MASM 6, Visual Basic (16bit), Visual Basic (32bit), C, C++, Java, C#, Visual Basic.NET/Visual Basic 2005, PHP 5
といったところでしょうか。
使いやすかったのはQBとC# (IDE込みで)。あと,C++は使っていて面白いなぁ,と。
最悪はPHP。class::instance-methodで$thisにバインドされずにインスタンスメソッドが呼べるあたりが終わっています。
# で,それをやっちゃう上司。面倒なのでそのまま放っておきましたが……。


> java 半年   単一継承が使いやすい。ライブラリーが大きいのでそれを学ぶのが大変。

単一継承って使いやすいですか?私自身は多重継承必須だと思っていますが。
実際,単一継承であるC#で多重継承が使えないために複数箇所に同一コードへの呼び出しが分散したことがあります。
現実的にMix-inレベルの多重継承は必須だと思いますけどね……。
# C#の拡張メソッドで十分かどうかは,でてみないとなんとも。

Re:c以外の言語の経験

Posted: 2007年6月18日(月) 19:13
by なぎ
一部の間では有名な、Ratfor というのが存在しています。
最近は処理系を見たことがないけど。
C言語風の Fortran で、トランスファー使って、FORTAN (77 じゃなくて、もっと前の)に変換するような仕掛けでした。
サンプルも見かけないのでちょっと探したら、
http://pages.stern.nyu.edu/~sbrown/mysub.r
に少しありました。
この頃は、FORTRAN にはブロック IF すらなかったのです。

さて、私は、影響を受けたものとしては、Modula-2 があります。
オブジェクト指向までいってませんでしたが、情報のカプセル化などは充分に実現されていました。
また、構造体とポインタの組み合わせを理解したのは、Modula-2 経由でした。

あとは、SmallTalk。ただ、これはほとんど使えませんでした。(役に立たないというのではなく理解できなかった)
しかし、多分、C++で道を踏み外さなかったのは、SmallTalk で扱った、オブジェクト指向のおかげでしょう。

あと、Forth でちょっと寄り道したり。
これは、「逆ポーランド記法」がベースになっているのですが、このおかげで、括弧無しで演算の優先順序が完全にコントロールできたり、関数(じゃないですが、似たようなものがあって)を並べて書くと、関数の合成ができたりと、一風変わった言語でした。

あとは、よく見かける言語しか使ってないかな。

Re:c以外の言語の経験

Posted: 2007年6月18日(月) 21:20
by 組木紙織
>単一継承って使いやすいですか?私自身は多重継承必須だと思っていますが。

私も多重継承は必要なときがあると思っていますが、
オブジェクト指向がまだ勉強中で、多重継承を使った設計ができないので普段は単一継承しか考えていないのと、c++とjavaで同じ単一継承だけを考えると、c++では仮想関数を考えてコーディングを無いといけないので、
"java"の継承のほうが"c++"の継承より使いやすいと感じたので上記のような書き込みをしました。

Re:c以外の言語の経験

Posted: 2007年6月18日(月) 21:27
by なぎ
C++の多重継承は、本物の多重継承と、インターフェイスの継承があって、適切に設計すれば、インターフェイスの継承で十分じゃないかというのが、Java や C# の立場ですね。
私自身は多重継承は使ったことがないので何ともいえません。

Re:c以外の言語の経験

Posted: 2007年6月19日(火) 01:43
by YuO
> C++の多重継承は、本物の多重継承と、インターフェイスの継承があって、適切に設計すれば、インターフェイスの継承で十分じゃないかというのが、Java や C# の立場ですね。

どちらもルートクラスを用意してしまったが為に,多重継承を許すと菱形継承になってしまうからお茶を濁したのでは,というのが私の感覚です。
実際問題として,実装の多重継承は必要になる場面が実際に存在しますから。
# だからこそmix-inを用意しろと思うわけで。フルセットの多重継承はおそらく必要になることが少ないので。

> c++では仮想関数を考えてコーディングを無いといけないので

これも私とは意見が逆だったり……。
# っていうか,この私の意見は「オブジェクト指向入門 第2版」第14章と真っ向から対立しますが。

経験的な問題として,完全に全体が解析されなかったシステムにおいては,
継承階層上で全く異なる動作を行う同一シグネチャの関数が存在する可能性があります。
そのため,この点ではC#のvirtual/override/newのシステムが便利で,不用意なoverrideによるバグが無くなるのは相当有用です。
# 全部動的束縛に振っておくのが理想なのは理解できるのですが……。

Re:c以外の言語の経験

Posted: 2007年6月19日(火) 20:18
by 組木紙織
>経験的な問題として,完全に全体が解析されなかったシステムにおいては,
>継承階層上で全く異なる動作を行う同一シグネチャの関数が存在する可能性があります。

私は今までに最大で5千行?
/*
cやjavaは文脈自由文法なので行数を言うのは概念として正しくないと思いますが、 
ここではプログラムの大きさを表現するものと見てください。感覚的には理解できると思いま

す。
*/
程度に満たないプログラムを作ったことしかなく、要求分析から設計、コーディング、テスト
全て自分ひとりでやっているので、"完全に全体が解析されなかったシステム"で作成すること


なかったので、この内容は私には理解できない部分です。(想像することは出来ますが)

なので
"継承階層上で全く異なる動作を行う同一シグネチャの関数が存在する可能性"
はまったく考えたことがなかったです。
この内容を基にして考えるなら、なるほどと思う部分はあります。

私が
>c++では仮想関数を考えてコーディングを無いといけないので
といったのは、もっと小さい部分の話で、
c++で継承を使う場合に関数を仮想関数にして動的結合にするか、通常の関数にして静的結合


するかということを考えながら書いており、全て動的結合のjavaは意識して
書かなくてすむので、c++の継承よりはjavaの継承が使いやすいと思ったからです。