科学的プログラミング言語はなぜ奇妙なのですか?[閉まっている]


9

科学と工学での使用を意図したプログラミング言語は、汎用言語と比較して一貫して奇妙なように思えます。私の頭の上のいくつかの例:

  • Matlabでは、各関数を個別のファイルに配置する必要があります
  • Rでは、他のほとんどすべての言語で=とは対照的に、<-は代入演算子です。
  • Matlab、R、Juliaなどはすべて1インデックスです
  • Matlabはコメントに%を使用し、標準の#または//ではありません

もちろん、これらの言語にはすべて、いくつかの設計機能があり、より自然な行列表記など、科学的アプリケーションで実際に使用しやすくなっています。それでも、これらすべてが不可解にすべての奇妙な選択を行いますが、これは何も簡単ではなく、言語設計者が他の言語の99%が行うことを選択した場合、簡単に回避できたはずです。ベンダーロックインの理由は何ですか?幅広いソフトウェア開発コミュニティとの連絡がないのですか?他に何か?

私はこのスレッドを読んで、説明が満足できるものであるとは思いませんでした。Rが科学的言語として設計されたからといっ、規則を完全に無視し、=の代わりに<-を使用しなければならなかったわけではありません。


6
短い答え:プログラマのためではなく、科学者のために作られたからです。
Bart van Ingen Schenau 2014

19
短い答え:あなたは、通常のだと思うすべての言語はCで、共通の祖先の影響を受けていたので
ロス・パターソン

3
私はあなたが見つけるのに苦労すると思う任意の言語間の規則を。それは彼らの遺産に依存します。
ロビーディー

6
奇妙なことは何もありません。ただ違います。なぜなら、特定の言語の特定の作者が慣れているものを除いて、一方の構文を他方よりも選択する特別な理由はないからです。
Jan Hudec 14

8
あなたの99%は間違っています。Cとその派生物しか知らない場合は、そう思うかもしれませんが、C以外の言語の50%以上は、代入、インデックス、コメントに別の何かを使用しています。
david.pfx 14

回答:


21
  • さまざまな規則があります。数学、論理、および応用科学の慣習とITの慣習。最初のものははるかに古いです。
  • 科学言語は、ユーザーの生活をより便利にするために作られています。ユーザーは科学者と見なされ、実際に何か新しいことを学ぶ必要なく、アルゴリズムを時々実現したり、理論をチェックしたりできます。したがって、科学者向けの言語は、IT以外の標準に合わせて作成する必要があります。IT担当者向けではありません。彼らは他の基準に達しており、それは対象の聴覚のために良いです。優れたSW UIと言語はSW UIであるため、コーダーではなくユーザーのニーズに基づいて実行する必要があります。
  • 当社のIT標準は業界標準です。ITは業界です。科学は産業ではありません。科学者たちはそれを誇りに思っています。そして、彼らはしぶしぶ私たちの慣習から彼らのものに何でも取り入れるでしょう。そして、彼らは標準をまったく好きではありません。そして、誰も外国の基準を好まない。したがって、誰かがIT基準を尊重する科学的言語を作成する場合、客観的により便利であったとしても、対象の聴覚が嫌いであるため、うまく売れなくなるでしょう。

そして、IT基準のみに従って判断する場合でも、申し訳ありませんが、どのような基準を意味しますか?APLまたはSNOBOLでprogを記述しようとしましたか?これらの2つの言語は、適切なフィールド(カウントと文字列)で最も強力なIMHOです。しかし、構文は非常に奇妙な(そして効果的な)ものです。APLコードの行を読み取るには数日かかることがあります。一方、そのようなラインはSWの重要な部分です。安心して涙を浮かべてMathlabに戻ります。

「=」については、平等ではなく代入であることに慣れている人が多い。ところで、Pascalでは等価であり、代入は ":="です。

そして、あなたは本当に平等のための==がより自然であると思いますか?逆に、=と==の混在はCプログラミングで最も一般的なエラーであり、自動制御を備えた最近のIDEでも非常に頻繁に発生します。

1からのインデックス付けについて-それは唯一の自然なものです。あなたが子供だったとき、あなたはあなたが数えた詩と歌を学びました:1、2、3 ...そして0、1、2ではありません...学校の数学では、数え方は1から始まり、その0自然/カウント数に属していません。関数の定義がある場合にのみ、非自然なインデックスが発生します。結局のところ、0は私たちの祖先が指を上げてから数千年後に発明されました。

0-startはより簡単に実現でき、Cの登場後すぐにITの実践に入りました。しかし、最初の言語であるFortranでは、1インデックスが使用されます。産業革命以前の他の言語と同じです。

そして、はい、私は0ベースのカウントの自然さに関するDyjkstraの記事を読みました。そして完全に彼の議論に同意しない。それはミュージシャンのみにとっては自然なことです。CおよびJavaコンパイラを作成する0人の愛好家でも、1から始まるコードの行数を数えます。


1
":="割り当てと1ベースのインデックス付けは、Smalltalkでも使用されます。
ロリーハンター

1
0ベースのインデックス付けは、実装の容易さのために購入しません(FORTRANはこれをかなり反証します)。cs.utexas.edu/users/EWD/transcriptions/EWD08xx/EWD831.htmlは、0ベースのインデックス付けを好むいくつかの理由を示していますが、選択はかなり恣意的であることに注意してください。
jk。

2
FORTRANには1ベースのインデックスがありました。PASCALは任意ベースのインデックス付けを許可しました。たとえば、-42から+57までの範囲のインデックスを持つ配列を宣言できます。(これが役立つ例については、en.wikipedia.org / wiki /…を参照してください。)
John R. Strohm 14

1
@Gangnus現代の言語をCと比較して意図的に読みにくいと考えるのは誤りだと思います。それは、低レベルの言語の高レベルの代替となるように設計されました。
ロビーディー

1
FORTHはスタックベースの言語です。HP電卓を考えてみてください。それは非常にコンパクトで高速でしたが、貫通できないコードを書くのは困難でした。FORTHでは、変数を使用することはめったになく、スタックにプッシュして、スタックに作用する演算子を使用します。
Gort the Robot

16

1からのインデックス付けは奇妙ではありません。プログラマーを除いて、それは完全に正常で予期されています。Cによる0ベースのカウントを期待するように条件付けられているためです(Cはプロセッサーアーキテクチャーのプロパティから条件付けられました)。

コメントは、さまざまな言語でさまざまな方法で示されます。標準的な方法はありません。すべての言語が、まだ採用されていない記号またはダイグラフを選択します。

割り当ては、プログラマを除いて、同様に奇妙で理解できない概念です。ほとんどの人は、それはだかあまり気にしませんでした=か、:=または<-、彼らは理解して闘争の意味を(と彼らのために、それはより良い実際にはない使用に=これがその割り当てを強調しているため平等ではない、 -非プログラマのための最も一般的なハードルコードを理解する)。

要するに、プロのプログラマー以外の人々を対象としたプログラミング言語は、それらを最も使用する人々がそのようにそれを望んでいるので、異なって見えます。


4
1からのインデックス付けは奇妙ではないことに同意しません。数学では、0インデックス付けは少なくとも1インデックス付けと同じくらい一般的であり、MatlabまたはS / Rが登場する前の何年もの間、明らかにプログラミングの標準でした。
haroba

9
@Aqwisああ、はい、私はすでに赤ちゃんが0、1、2を数えるのを見ています...本当に自然な方法です。
Gangnus 2014

4
赤ちゃんはコードを書きません。ゼロインデックスを使用するのには十分な理由があります(参照:ダイクストラ)。ゼロインデックスが数学でも一般的である場合、1インデックスを使用する多くの理由がわかりません。
haroba

1
@Aqwis自分の言葉に答えてください。変なものとそうでないもの。乳児期から数学によって設定されたもの(自然数にはゼロは含まれません)は、どの側からも変ではありません。そしてそれと矛盾するのは奇妙です。そして、あなたが何か他のことに慣れているということは、無関係です。これらの言語は単にあなたや私のために作られたものではありません。
Gangnus 14

1
@phresnel答えから言い換えると、1からのインデックス付けは正常です。プログラマを除いて、彼らはそれを期待するように条件付けられているので[0からのインデックス付け] Cから
ロビーディー

5

3つの問題があります。

  1. 特定の伝統や、特定の選択の正当な理由を知らない。
  2. 構文に重点を置きすぎて、セマンティクスに重点を置きすぎています。
  3. エンジニアや科学者は言語設計の経験がなく、構文に問題があります。

今あなたの特定のポイントに:

  • Matlabがわからないので、ファイル編成の要件についてコメントできません。Javaはパブリッククラスごとに1つのファイルを使用することを求めていることに注意してください。

  • Rでは=、代入演算子としても使用できます。それは複数の代入演算子が必要であることを注意<-および<<-(スコープのその概念に対処するために<<-外部スコープ内のシンボルに割り当てるの代わりに関数内に新しいシンボルを作成します)。矢印は他の方向にも使用できるため、コードがきれいになる可能性がありますcomplex_calculation() -> x

  • 1ベースのインデックス付けは数学の標準です。これは、MatlabとRのユーザーがCよりも使いやすいものです。ジュリアは、より良い学習曲線を得るためにMatlabに従います。

  • %コメント用はTeX / LaTeXでも使用されます。これ#は、Unixスクリプト言語とその子孫の慣例にすぎません。

また、「実際の」プログラミング言語には多くの奇妙な部分があることも無視します。なぜSchemeは使用しないの=ですか?代わりに:

(define foo 5)

*明らかにキャレット^xが他の伝統でより一般的であるのに、なぜC は逆参照に使用するのですか?


「私はMatlabを知らないので、ファイル編成の要件についてコメントすることはできません。Javaはパブリッククラスごとに1つのファイルを使用することを求めていることに注意してください。」あなたのプロジェクトをいくつかのファイルに分割することを言語が期待することは、言語にとって完全に合理的だと思います。ただし、クラスは通常、比較的大量のコードです。関数はそうである必要はありません。関数ごとに個別のファイルを強制することにより、Matlabは小さな関数を作成するのをやめ、代わりに大きなモノリシック関数を促進します。
haroba

1
p.3を除いて、ほぼすべてに同意します。科学者は自分たちの言語を作るのではなく、それらを注文します。彼らはクライアントであり、ユーザーですが、クリエーターではありません。もし誰かがそうなら、彼/彼女はすでにITオタクです。そして、どの言語の構文も疑わしく、誰もがすべてのタスクに理想的ではありません。
Gangnus 2014

Matlabは必要に応じて関数/ファイルをジャストインタイムでコンパイルします。プログラムの実際の概念はなく、関数の集まりだけです。foo()を呼び出す関数を実行している場合、foo.mというファイルのパスを検索し、コンパイルして実行します。使用するファイルのセットを事前にMatlabに知らせる必要はありません。
Simon B

1

それはあなたが他の言語に触れたことによると思います。私の頭の上から:

  • C / C ++には個別のソースファイル(.c / .cpp&.h)があります。
  • ->文字はラムダ式のC#で使用されます
  • VBの古いバージョンでは、デフォルトのインデックスとして1を使用していました(ただし、これはOption Baseで変更できます)。

1
CおよびC ++では、1つのファイルで必要な数の関数を定義できます。
haroba

私は、モジュールが複数のファイルに分割されることは珍しいことではないことを指摘しています。あなたがあなたに望んだ場合には可能性を.NET言語を使用して別々のファイルにすべての機能を置く部分クラスの構築物。
ロビーディー

1
もちろん、モジュールが複数のファイルに分割されることも珍しくなく、多くの場合望ましいことです。しかし、Matlab では、すべての関数を独自のファイルに配置する必要があります。つまり、1,000個の関数がある場合、1,000個のファイルが必要になります
haroba

3
HTMLのコメントはのようになり<!-- ... -->ます。パーセント記号はURLエンコードに使用されます:にhttp://example.com/()なりhttp://example.com/%28%29ます。
アモン

すみません、私の間違いです。
ロビーディー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.