私はしばしば、自分の好きな言語が他の言語よりも「強力」であると争う人々を見てきました。プログラミング言語の記述に関しては、オブジェクト指向言語とは何か、動的言語とは何かを理解することはできますが、「強力な」言語とは何なのかはまだわかりません。あなたの考えは何ですか?
私はしばしば、自分の好きな言語が他の言語よりも「強力」であると争う人々を見てきました。プログラミング言語の記述に関しては、オブジェクト指向言語とは何か、動的言語とは何かを理解することはできますが、「強力な」言語とは何なのかはまだわかりません。あなたの考えは何ですか?
回答:
「強力な」という言葉を最初に定義しないと、「強力な」言語が何であるかを定義できません。
力の文字通りの定義は「効力」であり、コンパイラーの大部分-そしてチューリング完全ではない多くのインタープリターでさえ-プロセッサーに命令を実行させるのと同じくらい良い仕事をするということは皆同意できると思います。したがって、文字通りの定義に関する限り、質問に対する答えは「ほぼすべての言語」です。
実際には、私たちは本当にそこで停止するべきです。「強力な言語」を定義することは、「善良な人」または「品質の高い製品」を定義することに少し似ています。これらの単語の客観的な定義は絶対にありません。すべての人、または大多数の専門家に同意してもらうことはできず、ほとんどの定義は単に質問を懇願するだけです。話し相手に応じて、力は次のいずれかになります。
誰もがここで何が起こっているのかわかりますか?事実上、すべての箇条書き機能は「パワー」の兆候として解釈できます。
どこかで、変数変数は言語を非常に強力にする素晴らしいアイデアだと誰かが明らかに思っていました。私は判断しません。私はPHPの男ではありません。
私はすべてのこの聖戦のナンセンスの代わりに、私たち全員がこの本当にシンプルな定義を使用することを提案します:
最も強力な言語は、最短時間で低コストで最高品質の製品を出荷できる言語です。
あいまい?もちろんです。そのため、自分を専門家と呼びたい人は、プログラミングの概念とプロジェクトドメインの両方を理解する必要があります。それが、あなたにとって何が「強力」であるかを決定できる唯一の方法です。
そうでなければ、あなたは銃撃戦に本当に大きなナイフを持ってくるだけかもしれません。
チューリングの完全性を超えたパワーの定義がいくつかあります。マークは、私が「ポール・グラハムの定義」と考える傾向があるものを引用しました。それは非常に良い定義であり、1つの重大な欠陥があります。それは間違っています。理論的には言語力の非常に良い定義ですが、理論と実践の違いについて彼らが言うことは知っています...
誰もが完全にバグのないだけでなく、完全に将来にわたっても完璧なコードを一貫して書くことができれば、Paul Grahamの定義は正しいでしょう。しかし、明らかにそうではありません。現実の世界では、ソフトウェアエンジニアリングに費やされる時間と労力の大部分は、製品の最初の作成ではなく、その後のメンテナンスに費やされています。聞いている統計に応じて(そしておそらくプロジェクトによってかなり異なります)、メンテナンスはプログラムに費やされる総作業量の60%から90%を占めることができます。
メンテナンスは、多くの場合、最初にコードを書いた人以外の人によって実行され、コードの最初の作成から数ヶ月または数年後まで頻繁に実行されます。つまり、元のコーダでさえ「他の人のコード」ポイント。メンテナンス中に生産的になりたい場合は、コードを読んでコードの元の意図をすばやく確認できる必要があります。
したがって、より強力な言語は、コードをすばやく読みやすくするものであり、コードをすばやく書きやすくするものではありません。両者はかなり重なる傾向がありますが、簡潔な構文ではコンパイラ/インタープリターがメンテナンスプログラマーよりもはるかに簡単に推測できる詳細が省略されることが多いため、多くの場合、概念は共通の目的にも使用されます。
編集:言語の力を記述する上でもう1つの重要なポイントがあります。表現できる概念の範囲と、その両端をどれだけ簡単に叩くことができるかです。ポール・グラハムは、どれだけ高い抽象化レベルに到達できるかについて、これを評価したいのですが、それは半分に過ぎません。抽象化の下限を課している言語は、その下に必要なときに行けないが、抽象化されている詳細が理由があるために機能しなくなる。これは、COBOLなどの読みやすいおもちゃの言語と読みやすい強力な言語の違いです。COBOLにはポインターがなく、インラインアセンブリへのアクセスもありません。インラインアセンブリでは、COBOLが不適切な場合でも計算を表現できます。
また、COBOLは、抽象化の範囲の上限を達成するのにも特に適していません。ウィキペディアによると、「ユーザー定義型もユーザー定義関数もない」ため、アルゴリズムとデータ構造の作成が非常に難しくなっています。
これは長い間繰り返し議論されてきました(たとえば、comp.lang.lispで数回)。誰も「正しい」答えを思い付くとは思いませんが、多くの人が明らかに間違っていると思う答えを思いついています。
私がここで見る答えでは、メイソン・ウィーラーの答えを選んでみましょう。一方で、彼がカバーする問題は重要ですが、他方では、それらを「権力」に関連するものと呼ぶことはまったく想像できません。それは彼のホンダのミニバンがトップ燃料ドラッグスターよりも強力であることを言っているようです。それはより安全で、静かで、より良いハンドリング、より多くの客室とはるかに快適な乗り心地を持っているからです。これらはすべて真実であり、すべてが重要です。これらの要因(他の多くの要因の中でも)は、ほとんどの人にとってミニバンをより実用的で合理的なものにしますが、ミニバンのエンジンが約250 HPしか生成しないのに対し、ドラッグスターは約8000 HPを生成するという事実を変更しません。
もちろん、問題は、車両には「パワー」を構成するものとそうでないものの明確な定義があることです。プログラミング言語の場合、議論は最終的には取り扱い、快適さ、速度、貨物容量、航続距離をすべて「パワー」の一部として扱うことに相当するように思えます。その結果、スレッドは無限に実行され、光よりも多くの熱を発生する傾向があります。基本的に発生する質問のほとんどは、完全に無関係で直交する機能に付ける重要度になります。たとえば、高レベルの関数を作成する機能よりも「強力な」アセンブリ言語でMMUをプログラムする機能です。ハスケルで?少なくともIMO、2つを比較する意味のある方法はなく、「
そのため、この場合、意味のある唯一の答えは基本的に相対論的なものです-強力な言語は、あなたがやりたいことを達成するのに役立つものです。人々の目標の違いにより、電力のほとんどの「絶対」測定値は無意味になります。
簡潔さと柔軟性の適切なバランス。
いい質問ですね。多くの言語が「完全なチューリング」であることを考えると、理論的に何ができるかに関して、すべての言語を同じ根拠に置くことができます。しかし、言語は明らかに異なるため、我々はそれを行いません。そして、違いは何ですか?
違いはほんの少しで多くの異なることを言う能力です。極限までジャンプできれば、「c」という1文字だけを使用してコンテンツ管理システムを自動的に初期化するのに最適な言語を作成できます。しかし、そのポイントは何でしょうか?確かに、非常に短いという意味では強力ですが、柔軟性はありません。あなたが望むのは、あまり冗長にならずに多くの異なる複雑なことを言うことができる言語です。集会のようにならず、太陽の下ですべてが可能で、無限に柔軟ですが、非常に冗長です。
強力な言語とは、可能な限り短い長さでさまざまなことを言うことができる言語です。
チューリングが完成したら(言語でこれを行うのは簡単です)、「パワー」はそれほど意味がありません。つまり、あるチューリング完全言語で言えることは別の言語で言えるという意味です。Mark Canlasの答えはそれを否定しています。簡潔さと柔軟性が違いを生みます。
そうは言っても、Matthias Felleisenの「プログラミング言語の表現力に関する論文」は興味深い読み物になります。その中で、彼は言語の表現力の概念を形式化しようとしている。
言語力を構成するものについては多くの意見の相違があるようです。簡潔さ、読みやすさ、順応性、それとも単なるチューリング完全性ですか?これらの要因はすべて作用すると思いますので、おそらくそれを見るための最良の方法はステータスポイントの観点からです。はい、私はここでペンと紙のRPGを話しています。
考え方は、各言語には(ほぼ)同じ数の「ポイント」があり、それを複数のカテゴリに任意に分散できるということです。議論の目的のために、唯一の要因は簡潔さ、読みやすさ、および柔軟性であると言います。その場合、言語は非常に簡潔で柔軟性がありますが、結果として非常に読みにくくなります。または非常に読みやすく柔軟ですが、非常に冗長です。
(おそらく、言語が配布しなければならないポイントの数は、デザイナーと実装者のスキルによって定義されますが、すべての言語デザイナーが彼らの仕事に等しく優れているふりをしましょう。)
言語設計者が1つのカテゴリの言語の強度を上げると決定した場合、他のすべてのカテゴリからその潜在的な強度の一部を論理的に奪います。これが、プログラミング言語の設計はすべてトレードオフであるとよく言われる理由です。この観点から、言語の全体的な力はまだ定義できず、言語の相対的な強さに基づいて分類された実証済みの方法に戻らなければなりません。満足できない?残念な。
強力な言語は、ポイントの分布が比較的均等なもの(すべての取引のジャック、なしのマスター)、または1つのエリアに他の人を放置しないでできるだけ多くのポイントを持つ(スペシャリスト)という2つの方法を論じることができます。多くの分野で完璧に熟達した「ルネサンスの男」言語のようなものはありません。そして、それが最も強力な可能な言語の定義であるなら、あなたは運が悪いだけです。
さらに読むために、この記事(偶然にも意見が混ざっているように見えるPaul Grahamによる)は、プログラミング言語の力が実際に異なるかどうかを判断することは難しいかもしれないという考えに触れています。彼は、言語があなたが好む言語よりもどれだけ強力でないかを見るのは非常に簡単だと主張します-機能Xが欠けています-しかし、本当により強力な言語が実際にどのように見えるかは非常に難しいので、基本的に言語Xと同等ですが、他の多くのものが投入されました。その論文からの引用を残します。
帰納法により、さまざまな言語間の力の違いをすべて見ることができるプログラマーは、最も強力な言語を理解しているプログラマーだけです。(これはおそらく、Eric RaymondがLispを使ってより良いプログラマーにしたことを意味するものです。)他の人の意見は、Blubパラドックスのために信用できません。彼らは使用する言語に満足しています。彼らがプログラムについて考える方法。
プログラミング言語はツールです-それ以上でもそれ以下でもありません。一部のツールは非常に特殊化されており、特定の目的に適しています。その他は一般化され、ほとんど役に立たないほど単純化されています。
最も「強力な」言語は、最小限の時間、エネルギー、およびその他の投資で目標を達成できる言語であると主張します。つまり、最大のROIを提供する言語です。状況によっては、Cである可能性があります。他では、Java; さらに他では、Haskell。
最善の方法は、さまざまな言語とそれらが何に役立つのかをよく理解することです。次に、新しいプロジェクトを開始する時が来たら、どちらが最も適切かについて十分な情報に基づいた決定を下すことができます。
プログラミング言語に関する議論は-私見-一部のLinuxニュースグループのメールクライアントに関する議論と同じです。それらは火炎戦争になりがちです。VB6が人気だった時代を思い出すことができます。プログラミング言語ではない、と主張する人もいましたが、他の人はそれを使って素晴らしいアプリケーションを作成しました。
作成者は言語の作成/設計時にさまざまなことを念頭に置いていたため、プログラミング言語の概念はすでに異なっていると思います。そのため、ある目的に合った言語-そしてその状況下では強力な言語-は、別の目的に合わないかもしれません。言語に強力な名前を付けるかどうかは、純粋に主観的です。とはいえ、適用できる指標があるとは思いません。
最も強力なプログラミング言語は、次の線形プログラミングの問題を解決するものです。
最大化
対象
(そして、はい、私はすでに完全に矛盾した答えを投稿しました。それは私が方言家だからです。)
これは自然言語に関して書かれたものですが、プログラミング言語にも適していると思います。
一部の言語は他の言語よりも本質的に優れているという信念が広まっていますが、言語的事実には根拠がありません。一部の言語は、特定の歴史において、もちろん他の言語よりも有用または名声がありますが、これはその時点での話者の卓越性によるものであり、固有の言語特性によるものではありません。
--David Crystal(ed。)。The Cambridge Encyclopedia of Language 2 / e(1997)。p.7
「力」は、単にある言語が他の言語に起因するものではありません。「中国語は韓国語よりも強力な言語です」と言うのはばかげているでしょう。同様に、「APLはCOBOLよりも強力な言語です」と言うのはばかげています。
言語力を何らかの客観的尺度と同一視しようとするいくつかの試みがありました。私はこれらの試みが失敗すると信じています:
私の意見では、「ある言語が他の言語よりも優れている」という議論は、他のグループよりも優れているという話者の感情の隠れた表現だということです。要するに、その偏見とステレオタイプ。もちろん、実際に偏見を抱いている人は、ステレオタイプを非常に強く信じており、考えを変えるよう説得することはできません。