すべての言語は基本的に同じですか?


39

最近、私は知らなかった言語で書かれた小さなプログラムの設計を理解しなければなりませんでした(知っていなければABAP)。難しすぎずに理解できました。

新しい言語を習得することは全く異なる球技であることを認識していますが、いくつかの言語を知っている場合は、任意の言語のコード(特に複雑ではない生産標準コード)の意図を純粋に理解することは簡単です(できれば1つの手続き型/ OOと1つの機能)。

これは一般的に本当ですか?すべてのプログラミング言語は、ループ、条件ステートメント、関数間のメッセージ受け渡しなどの類似の構成要素で構成されていますか?典型的なJava / Ruby / Haskellプログラマーが理解できない非難解な言語はありますか?すべての言語には共通の起源がありますか?


4
私はあなたを指示します平均を打つポール・グラハムによって。全部読みたいと思うかもしれませんが、関連部分については「The Blub Paradox」という見出しを検索してください。グラハム氏は彼のテキストの壁にアンカーを置くことを気にすることはできないので、私はそれに直接リンクすることはできません。
kwatford

4
言語には共通の起源はありません。しかし、すべての言語はいくつかの問題を解決しようとします。話し言葉にやや似ていると思います。目的は自分を表現することです。1つの手続き/オブジェクト指向/機能の知識に基づいて言語を理解することは簡単だとは言えません。私はこれをやっていませんが、この質問をするなら、perlまたはlispをたくさんの括弧で見て、すべてのタイプの1つの言語を知っているだけで十分だとは言えません。
shahkalpesh

1
その場合:ラムダ計算。おそらく「本当の」言語ではないかもしれませんが、ある意味ではすべてのプログラミング言語の母です。私はかつてラムダ式にコンパイルされるような関数型言語を実装する必要がありました(その後、直接解釈されました)。関連するすべての識別子を保持しているにもかかわらず、結果は(少なくとも私には)判読できませんでした。特に、Yコンビネータを使用した再帰関数。サンプル式のいくつかが何をしたかを理解する唯一の実用的な方法は、それらを手で評価することでした。fibonnaciやマージソートのような単純なものは読めませんでした。
kwatford 09

2
関数型言語を知っているなら、すべての言語でループが可能ではないことを知っておく必要があります。
jalf

Pietはかなり異なります。:)

回答:


88

ほとんどの手続き型言語の基本はほとんど同じです。

彼らは提案する:

  • スカラーデータ型:通常、ブール値、整数、浮動小数点数、および文字
  • 複合データ型:配列(文字列は特殊なケースです)および構造
  • 基本的なコード構成:スカラー上の算術演算、配列/構造体へのアクセス、割り当て
  • 単純な制御構造:if-then、if-then-else、while、forループ
  • コードブロックのパッケージ:関数、パラメーター付きプロシージャ
  • スコープ:識別子が特定の意味を持つ領域

これを理解すれば、地球上の言語の90%を十分に把握できます。これらの言語の理解を少し難しくしているのは、人々が同じ基本的なことを言うのに使用する信じられないほど多様な奇妙な構文です。奇数の句読点を含む簡潔な表記法を使用するものもあります(APLは極端です)。多くのキーワードを使用するものもあります(COBOLは優秀な代表者です)。それは大した問題ではありません。重要なのは、言語がそれ自体で十分に完成していて、髪を引き裂かずに複雑なタスクを実行できる場合です。(Windows DOSシェルスクリプトで深刻な文字列ハッキングをコーディングしてみてください。チューリングは可能ですが、すべてが本当に悪いです)。

より興味深い手続き言語の提供

  • ネストされたスコープまたはレキシカルスコープ、名前空間
  • 動的なストレージ割り当てにより、あるエンティティが別のエンティティを参照できるようにするポインター
  • 関連コードのパッケージ化:パッケージ、メソッドを持つオブジェクト、特性
  • より洗練された制御:再帰、継続、クロージャ
  • 特殊な演算子:文字列と配列の演算、数学関数

技術的には言語のプロパティではなく、そのような言語が存在するエコシステムのプロパティですが、開発ツールの一部として簡単にアクセスできるか、その言語で提供されるライブラリです。幅広いライブラリ機能を備えていると、ライブラリの機能を再発明する必要がないため、アプリケーションの作成が単純化/高速化されます。JavaとC#はそれ自体で優れた言語であると広く考えられていますが、JavaとC#が本当に役立つのは、それらに付属する巨大なライブラリと、簡単に入手できる拡張ライブラリです。

理解するのが難しい言語は非手続き型です:

  • 割り当ても副作用もない純粋に機能的な言語
  • シンボリック計算と統合が発生するPrologなどの論理言語
  • パターンマッチング言語。問題に一致する形状を指定します。多くの場合、アクションは一致によってトリガーされます。
  • 関係言語を指定し、方程式を自動的に解くことができる制約言語
  • すべてが並行して実行されるハードウェア記述言語
  • SQL、色付きペトリネットなどのドメイン固有の言語。

言語には2つの主要な表現スタイルがあります。

  • テキストベース。識別子はエンティティに名前を付け、情報フローは識別子を使用してエンティティに名前を付ける式で暗黙的にエンコードされます(Java、APL、...)
  • グラフィカル、エンティティはノードとして描画され、エンティティ間の関係はそれらのノード間の明示的な円弧として描画されます(UML、Simulink、LabView)

グラフィカル言語では、多くの場合、ノードおよびアークの注釈としてテキストのサブ言語を使用できます。Odderグラフィカル言語では、ノードおよびアーク上でグラフ(テキスト付き)を再帰的に使用できます。本当に奇妙なグラフィカル言語は、注釈グラフが注釈されているグラフを指すことを可能にします。

これらの言語のほとんどは、非常に少数の計算モデルに基づいています。

  • ラムダ計算(Lispおよびすべての関数型言語の基礎)
  • ポストシステム(または文字列/ツリー/グラフの書き換え手法)
  • チューリングマシン(状態の変更と新しいメモリセルの選択)

ほとんどの業界が手続き型言語と複雑な制御構造に重点を置いているため、このカテゴリの興味深い言語の1つをよく学べば、特に何らかのオブジェクト指向が含まれていれば、あなたは大いに役立ちます。

特にすばらしい本、「コンピュータプログラムの構造と解釈」からSchemeを学ぶことを強くお勧めし ます。これは、これらすべての基本概念を説明しています。このことを知っていれば、他の言語は間抜けな構文を除いてかなり簡単に思えます。


3
すばらしい回答です!フォローアップとして(SOでフォローアップの質問をする方法はありますか)、プログラミングソフトウェアのすべての概念を理解するために習得して主張できる言語は1つありますか?Lisp(またはSchemeなどの方言)でしょうか?

@Anirudh:正式なフォローアップメカニズムはありませんが、新しい質問を開くことができます。根拠とこの質問へのリンクが含まれている場合は、閉じられていない可能性もあります。;)あなたのフォローアップに答えるために、パラダイムがあまりにも異なるので、私は心から一つの言語だけではないと信じています。

@Anirudh:ジョンYに同意しました。1人だけではありません。しかし、この分野に比較的慣れていない場合は、手続き型のパラダイムを習得するためにかなりのエネルギーを費やす必要があります(OOは単なる専門分野だと考えています)。他のパラダイム(ロジック、制約、データフロー)を見て、それらがどのように機能するかを理解するのに害はありませんが、ほとんどの日常の産業作業では、手続き型言語が非常に重要です。
アイラバクスター

1
自然言語と同様に、「理解しにくい」というのは主観的であり、最初に学ぶ言語に依存しています。
NullUserException

1
@NullUserException:これは、他の人が理解しやすいように、最初の言語を慎重に選択する必要があることを示唆しています。それがSchemeのポイントであり、特にSICPブックです。
アイラバクスター

6

ハードウェア記述言語はプログラミング言語ですが、概念的には非常に異なります。サイズについては、VHDLまたはVerilogを試してください。FPGAのプログラミングには一般的です。(わかりましたので、これらはプロセッサではありませんが、汎用のコンピューティングデバイスです。これらは、コンピュータサイエンスのトピックに有効なハードウェアと見なされる必要があります。)それは完全に異なるモデルです。並行して発生することを、例外ではなくルールとして考えています。verilogのforループは、並列ハードウェアに拡張されます。そのため、「期待される」動作は期待したものとは異なる場合があります。


それは良い点です。Verilog / VHDLを検索します。

私はいつも、従来のプログラミング言語は、VHDLなどの自然に並列なプログラムをコーディングするための本当に厄介な方法であると考えてきました。ハードウェア設計者としてスタートしたとき、シリアル形式で発生するすべてのことについてのこのビットは、信じられないほど不器用に見えます。(間違ったプログラミング言語を最初の言語として人々に教えています。それはVerilogであるべきです!)
イラバクスター

4

「基本的に」という意味によって異なります。柔軟性のあるすべての言語はチューリング完全です。その意味では、はい、それらはすべて基本的に同じです。

低レベルでは、それらはすべて同様の操作シーケンスを実行し、すべてのWindows、Linux、および(最近の)OS Xスタッフはすべて、同じ命令セットを使用してIntel互換プロセッサで実行されます。そのように、それらも基本的に同じです。

質問の中で「基本的に」定義されていることを理解していますが、実際に答えるには、その定義をさらに洗練する必要があります。多くの点でそれらはすべて似ています。多くの点でそれらは区別されます。「それは依存する」と言うのはとても簡単です。どちらか極端なものを選んだ場合、質問は意図したとおりに答えない可能性が高いため、線を引く場所は、意図したとおりに質問に答えるために重要です。


3

言語は意味をエンコードすると言うでしょう。意味が何らかの文脈で何らかの意味を持っている場合、意味を表現できるすべての言語は、意味と文脈によって制限された同等であると言えるでしょう。

そのコンテキストを標準のフォンノイマンマシンに限定すると、メモリの変更とCPUでの計算の計算上の意味が起源と言えます。おそらくすべての言語に共通する唯一の意味です。他のすべてのものは、これらの上に構築された抽象化です。


1
ジョン・フォン・ノイマン。そして、「ニューマン」のように発音されるのではなく、「ノイマン」のように発音されます。

訂正してくれてありがとう-私は発音はあなたが言ったようです。
プリエサンガ

誰かが修正を提案したら、投稿を編集してそれを反映することができます。
フィルミラー

2

プログラミング言語も思考のためのツールです。あなたが(例えば、この参照Lispで考えているとき(例えば、多くのC ++スタイルのデザインパターンがちょうど消える別の思考の観点では、いくつかの問題が消えまたは異なる、より管理しやすい種類に変換されているピーターNorvikのプレゼンテーションを)、とErlangのは思考からあなたを解放しますいくつかの低レベルの同時実行性または分散コンピューティング構成要素を使用して、アプリケーションロジックに集中することができます。

ただし、「新しい」パラダイムを「古い」プログラミング言語に部分的に適用できる場合があることに注意してください。これにより、たとえばJavaプログラマー向けの関数型プログラミングに関する書籍があります。しかし、言語レベルでより強力なパラダイムをネイティブでサポートおよび統合すると、パラダイムのより自然な適用が可能になります(その結果、他の回答で示唆されるように、なじみのないパラダイムをサポートする言語のプログラムを理解できなくなります-@Ira Baxterは非手続き型言語をリストします@kwatfordはPaul Grahamに言及しています)。


2
+++++++[>+++++++++++<-]>+.<+++++++++++[>+++<-]>.>>+++++++[>++++++<-]>++++.

最低レベルでは、すべてのプログラミング言語は「同じ」ですが、実際に対話するレベルで同じであるという意味ではありません。問題を抽象化します。それは、彼らが同じ問題を抽象化することも、各問題を同じ方法で抽象化することも意味しません。


1

成熟した言語には一般にいくつかの目標があり、あるものを別のものに犠牲にするというトレードオフを行います。汎用言語は何にでも使用できますが、すべての分野で優れた言語はありません。いくつかの例:

Cは、理想的なシステムプログラミング言語を目指しています。このため、低レベルの制御と速度の可読性と安全性が犠牲になります。

Pythonは理想的なスクリプト言語を目指しています。このため、生産性と移植性のために速度と検証可能性が犠牲になります。

Haskellは、安全で数学的に純粋な言語を目指しています。このため、検証可能性と信頼性のために学習可能性と慣習を犠牲にします。

これらの犠牲と利益は、言語に大きな違いをもたらします。はい、ほとんどのプログラミング言語はコンピューターで実行できるものであれば何でも使用できますが、すべてに同じ言語使用することできません。上記のすべての言語は、特定のタスク用に選択するものですが、他のタスク用には選択しません。オペレーティングシステムをプログラミングする場合、Cを選択します。Webサイトのバックエンドを作成する場合は、Pythonを使用します。そして、私が金融システムを書いているなら、Haskellを使うでしょう。

結局のところ、プログラマーとしてのあなたの選択こそが、仕事にふさわしいツールです。

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