「強力な」言語とは何ですか?


22

私はしばしば、自分の好きな言語が他の言語よりも「強力」であると争う人々を見てきました。プログラミング言語の記述に関しては、オブジェクト指向言語とは何か、動的言語とは何かを理解することはできますが、「強力な」言語とは何なのかはまだわかりません。あなたの考えは何ですか?


5
言語はユーザーと同じくらい強力です。
ysolik

6
@ysolikは必ずしも真実ではありません。私は誰かにくだらない言語を与え、彼らがどこまで到達するかを見ることができました。1つのop、NOOPがあります!=)
マーク・カンラス

2
@Markが極端な話をしているなら、あなたは正しい。ただし、今日の多かれ少なかれ広く使用されている言語を検討する場合、ユーザーはその大部分を占めています。
ysolik

1
PowerBASIC:これ以上強力なものはありません。^^
ギャブリン

1
@ysolik:「ユーザーよりも強力な言語はない」と言う方が正確です。
ダンカン・ベイン

回答:


32

「強力な」という言葉を最初に定義しないと、「強力な」言語が何であるかを定義できません。

力の文字通りの定義は「効力」であり、コンパイラーの大部分-そしてチューリング完全ではない多くのインタープリターでさえ-プロセッサーに命令を実行させるのと同じくらい良い仕事をするということは皆同意できると思います。したがって、文字通りの定義に関する限り、質問に対する答えは「ほぼすべての言語」です。

実際には、私たちは本当にそこで停止するべきです。「強力な言語」を定義することは、「善良な人」または「品質の高い製品」を定義することに少し似ています。これらの単語の客観的な定義は絶対にありません。すべての人、または大多数の専門家に同意してもらうことはできず、ほとんどの定義は単に質問を懇願するだけです。話し相手に応じて、力は次のいずれかになります。

  • さまざまな一般的なタスクを実行するための豊富な汎用フレームワークまたはライブラリ
  • 「1つのことを実行して適切に実行する」洗練されたドメイン固有の構文
  • マシン機能への直接アクセス、すなわち低レベルのコードを書く機能
  • マシンレベルの概念、つまり高レベルのコードを書く能力を抽象化する
  • リフレクション、DI、静的分析などの高度な戦略を可能にする非常に豊富な型システム
  • プログラマがそれを成し遂げることを可能にする非常にゆるい型システム(型強制など)
  • 概念検証を提供するオブジェクトとしてすべてを扱う機能
  • 数学的検証を提供する関数としてすべてを扱う能力
  • バグの減少につながる自動メモリおよびリソース管理(GC、RAII)
  • 最適化されたパフォーマンスにつながる可能性のある手動のメモリおよびリソース管理
  • 読みやすさの向上につながる最小限の構文ノイズ
  • より浅い学習曲線を提供する、より英語に似た構文
  • 非常に簡潔なコードを書く能力(すなわち、三項演算子、null合体、null拡張)
  • 無力書き込み、潜在的に混乱したコード(すなわちノー三項演算子など)

誰もがここで何が起こっているのかわかりますか?事実上、すべての箇条書き機能は「パワー」の兆候として解釈できます

どこかで、変数変数は言語を非常に強力にする素晴らしいアイデアだと誰かが明らかに思っていました。私は判断しません。私はPHPの男ではありません。

私はすべてのこの聖戦のナンセンスの代わりに、私たち全員がこの本当にシンプルな定義を使用することを提案します:

最も強力な言語は、最短時間で低コストで最高品質の製品を出荷できる言語です。

あいまい?もちろんです。そのため、自分を専門家と呼びたい人は、プログラミングの概念プロジェクトドメインの両方を理解する必要があります。それが、あなたにとって何が「強力」であるかを決定できる唯一の方法です。

そうでなければ、あなたは銃撃戦に本当に大きなナイフを持ってくるだけかもしれません。


1
+1これは、言語力のさまざまな概念をすべて含めようとする唯一の定義です。特に、競合する機能が両方とも強力であるとみなせることを示す方法が気に入っています。コンピューターサイエンスは、言語の選択においてもトレードオフの科学です。
CodexArcanum

11

私はシステムプログラマーだからです。カーネル、システム、サーバー、アプリケーションプログラミングのすべてに使用されるプログラミング言語、または複数のプログラミングパラダイムをサポートするプログラミング言語、またはその両方を「強力な」と呼ぶことができます。

C、C ++、Dは強力ですが、明らかにこれは単なる謙虚な意見です。


カーネルレベルのプログラミングにJavaを使用しますか、それとも誤解していますか?
Davy8

@ Davy8、あなたは正しいです、私自身の定義では、Javaを含めるべきではありませんでした。
grokus

5

チューリングの完全性を超えたパワーの定義がいくつかあります。マークは、私が「ポール・グラハムの定義」と考える傾向があるものを引用しました。それは非常に良い定義であり、1つの重大な欠陥があります。それは間違っています。理論的には言語力の非常に良い定義ですが、理論と実践の違いについて彼らが言うことは知っています...

誰もが完全にバグのないだけでなく、完全に将来にわたっても完璧なコードを一貫して書くことができれば、Paul Grahamの定義は正しいでしょう。しかし、明らかにそうではありません。現実の世界では、ソフトウェアエンジニアリングに費やされる時間と労力の大部分は、製品の最初の作成ではなく、その後のメンテナンスに費やされています。聞いている統計に応じて(そしておそらくプロジェクトによってかなり異なります)、メンテナンスはプログラムに費やされる総作業量の60%から90%を占めることができます。

メンテナンスは、多くの場合、最初にコードを書いた人以外の人によって実行され、コードの最初の作成から数ヶ月または数年後まで頻繁に実行されます。つまり、元のコーダでさえ「他の人のコード」ポイント。メンテナンス中に生産的になりたい場合は、コードを読んでコードの元の意図をすばやく確認できる必要があります。

したがって、より強力な言語は、コードをすばやく読みやすくするものであり、コードすばやく書きやすくするものではありません。両者はかなり重なる傾向がありますが、簡潔な構文ではコンパイラ/インタープリターがメンテナンスプログラマーよりもはるかに簡単に推測できる詳細が省略されることが多いため、多くの場合、概念は共通の目的にも使用されます。

編集:言語の力を記述する上でもう1つの重要なポイントがあります。表現できる概念の範囲と、その両端をどれだけ簡単に叩くことができるかです。ポール・グラハムは、どれだけ高い抽象化レベルに到達できるかについて、これを評価したいのですが、それは半分に過ぎません。抽象化の下限を課している言語は、その下に必要なときに行けないが、抽象化されている詳細が理由があるために機能しなくなる。これは、COBOLなどの読みやすいおもちゃの言語と読みやすい強力な言語の違いです。COBOLにはポインターがなく、インラインアセンブリへのアクセスもありません。インラインアセンブリでは、COBOLが不適切な場合でも計算を表現できます。

また、COBOLは、抽象化の範囲の上限を達成するのにも特に適していません。ウィキペディアによると、「ユーザー定義型もユーザー定義関数もない」ため、アルゴリズムとデータ構造の作成が非常に難しくなっています。


1
これに関する問題は、COBOLが非常に強力な言語であることを示しているように見えることです。
デビッド・ソーンリー

2
Lispを知らないのですか?:)
ダッシュトムバング

1
@Matt:それが問題だ。どのような言語が使用され、言語は何によって制限されることができるために使用され、より少ないあなたは抽象離れメモリ関連の詳細をしない言語よりもPythonので行うことができますがたくさんあります。
メイソンウィーラー

3
-1短く、表現力豊かなコードは維持するのが多少難しいという暗黙の概念のため。言語力の一般的な意味(表現力とオープン性)の両方を取り入れて、2つの元のアイデアのどちらかを半分しか表現しない1つの概念にまとめました。
CodexArcanum

1
@JörgW Mittag:そのとおりですが、私が引用した文はハードウェアリソース(メモリなど)の直接制御に関するものだと思います。C++を使用すると、より多くの制御が可能になります。もちろん、仮想マシンを実装する場合は完全に制御できますが、Mason Wheelerは実際のマシンを制御することに言及していると思います。
ジョルジオ

4

これは長い間繰り返し議論されてきました(たとえば、comp.lang.lispで数回)。誰も「正しい」答えを思い付くとは思いませんが、多くの人が明らかに間違っていると思う答えを思いついています。

私がここで見る答えでは、メイソン・ウィーラーの答えを選んでみましょう。一方で、彼がカバーする問題重要ですが、他方では、それらを「権力」に関連するものと呼ぶことはまったく想像できません。それは彼のホンダのミニバンがトップ燃料ドラッグスターよりも強力であることを言っているようです。それはより安全で、静かで、より良いハンドリング、より多くの客室とはるかに快適な乗り心地を持っているからです。これらはすべて真実であり、すべてが重要です。これらの要因(他の多くの要因の中でも)は、ほとんどの人にとってミニバンをより実用的で合理的なものにしますが、ミニバンのエンジンが約250 HPしか生成しないのに対し、ドラッグスターは約8000 HPを生成するという事実を変更しません。

もちろん、問題は、車両には「パワー」を構成するものとそうでないものの明確な定義があることです。プログラミング言語の場合、議論は最終的には取り扱い、快適さ、速度、貨物容量、航続距離をすべて「パワー」の一部として扱うことに相当するように思えます。その結果、スレッドは無限に実行され、光よりも多くの熱を発生する傾向があります。基本的に発生する質問のほとんどは、完全に無関係で直交する機能に付ける重要度になります。たとえば、高レベルの関数を作成する機能よりも「強力な」アセンブリ言語でMMUをプログラムする機能です。ハスケルで?少なくともIMO、2つを比較する意味のある方法はなく、「

そのため、この場合、意味のある唯一の答えは基本的に相対論的なものです-強力な言語は、あなたがやりたいことを達成するのに役立つものです。人々の目標の違いにより、電力のほとんどの「絶対」測定値は無意味になります。


3

簡潔さと柔軟性の適切なバランス。

いい質問ですね。多くの言語が「完全なチューリング」であることを考えると、理論的に何ができるかに関して、すべての言語を同じ根拠に置くことができます。しかし、言語は明らかに異なるため、我々はそれを行いません。そして、違いは何ですか?

違いはほんの少しで多くの異なることを言う能力です。極限までジャンプできれば、「c」という1文字だけを使用してコンテンツ管理システムを自動的に初期化するのに最適な言語を作成できます。しかし、そのポイントは何でしょうか?確かに、非常に短いという意味では強力ですが、柔軟性はありません。あなたが望むのは、あまり冗長にならずに多くの異なる複雑なことを言うことができる言語です。集会のようにならず、太陽の下ですべてが可能で、無限に柔軟ですが、非常に冗長です。

強力な言語とは、可能な限り短い長さでさまざまなことを言うことができる言語です。


1
-1。申し訳ありませんが、それは誤解であるだけでなく、将来の生産性を大幅に妨げる可能性があるため、危険なものです。
メイソンウィーラー

@メイソン・ウィーラー:詳しく説明していただけますか?
ジョーイアダムス

@Joey:この質問に対する私の回答をご覧ください。
メイソンウィーラー

1

チューリングが完成したら(言語でこれを行うのは簡単です)、「パワー」はそれほど意味がありません。つまり、あるチューリング完全言語で言えることは別の言語で言えるという意味です。Mark Canlasの答えはそれを否定しています。簡潔さと柔軟性が違いを生みます。

そうは言っても、Matthias Felleisenの「プログラミング言語の表現力に関する論文」は興味深い読み物になります。その中で、彼は言語の表現力の概念を形式化しようとしている。


ところで、これは実際には真実ではありません。チューリング完全であるが、他の言語ほど強力ではない言語を見てきました。簡単な例:データ型として整数と文字列のみを持ち、それらの間で変換する方法はなく、整数の任意の計算、文字列の連結と比較のみの言語を考えてください。(私はそのような言語で作業しました。)これはチューリング完全ですが、文字列で任意の関数を表現できないため、機能を追加すると計算能力が向上します。
-reinierpost

@reinerpost-チューリング完全言語は文字列で任意の関数を計算できると述べ、異なる方法でそれらを表現する必要があります。チューリングの完全性は、使用可能なデータ型の問題とほぼ直交しています。たとえば、一部のチューリング完全言語にはデータ型がなく、すべてを関数で表しているだけです。そして、算術のための教会エンコードなどに頼らなければなりません。
mikera

1

言語力を構成するものについては多くの意見の相違があるようです。簡潔さ、読みやすさ、順応性、それとも単なるチューリング完全性ですか?これらの要因はすべて作用すると思いますので、おそらくそれを見るための最良の方法はステータスポイントの観点からです。はい、私はここでペンと紙のRPGを話しています。

考え方は、各言語には(ほぼ)同じ数の「ポイント」があり、それを複数のカテゴリに任意に分散できるということです。議論の目的のために、唯一の要因は簡潔さ、読みやすさ、および柔軟性であると言います。その場合、言語は非常に簡潔で柔軟性がありますが、結果として非常に読みにくくなります。または非常に読みやすく柔軟ですが、非常に冗長です。

(おそらく、言語が配布しなければならないポイントの数は、デザイナーと実装者のスキルによって定義されますが、すべての言語デザイナーが彼らの仕事に等しく優れているふりをしましょう。)

言語設計者が1つのカテゴリの言語の強度を上げると決定した場合、他のすべてのカテゴリからその潜在的な強度の一部を論理的に奪います。これが、プログラミング言語の設計はすべてトレードオフであるとよく言われる理由です。この観点から、言語の全体的な力はまだ定義できず、言語の相対的な強さに基づいて分類された実証済みの方法に戻らなければなりません。満足できない?残念な。

強力な言語は、ポイントの分布が比較的均等なもの(すべての取引のジャック、なしのマスター)、または1つのエリアに他の人を放置しないでできるだけ多くのポイントを持つ(スペシャリスト)という2つの方法を論じることができます。多くの分野で完璧に熟達した「ルネサンスの男」言語のようなものはありません。そして、それが最も強力な可能な言語の定義であるなら、あなたは運が悪いだけです。

さらに読むために、この記事(偶然にも意見が混ざっているように見えるPaul Grahamによる)は、プログラミング言語の力が実際に異なるかどうかを判断することは難しいかもしれないという考えに触れています。彼は、言語があなたが好む言語よりもどれだけ強力でないかを見るのは非常に簡単だと主張します-機能Xが欠けています-しかし、本当により強力な言語が実際にどのように見えるかは非常に難しいので、基本的に言語Xと同等ですが、他の多くのものが投入されました。その論文からの引用を残します。

帰納法により、さまざまな言語間の力の違いをすべて見ることができるプログラマーは、最も強力な言語を理解しているプログラマーだけです。(これはおそらく、Eric RaymondがLispを使ってより良いプログラマーにしたことを意味するものです。)他の人の意見は、Blubパラドックスのために信用できません。彼らは使用する言語に満足しています。彼らがプログラムについて考える方法。

すべての言語の分布に必然的に同数のポイントがあるというあなたのモデルには同意しません。brainf * ckの極端な例を見てみましょう。ポイントの総数だけであるとしても、現代のどの言語にも匹敵するものではないと簡単に言うことができます。つまり、プログラミング言語のゼロサムゲームではありません。言語はxポイントから始まって配布するのではなく、0から始まり、機能に応じてポイントを取得します。取る必要のある妥協があることは当然のことですが、すべての選択肢は等しくありません(少なくとも私の意見)。
n1ckp

すべての言語が必ずしも同じ数のポイントを持つとは言いませんでした。検討中のすべての言語(つまり、実際に使用するために設計された言語)はほぼ同じ数であると述べました。難解な言語は、そもそも役に立つように設計されていないため、病理学的なケースです。実際に機能が可算であれば、「機能の数」だけに基づいて言語を区別しようとするのは役に立たないので、私は議論のために単純化していました。
ジョンパーディ

申し訳ありませんが、あなたの投稿を読み直しました。少し速すぎて読むことに同意する必要があります。Javaとc ++を取り上げましょう。これらは、私がある程度知っている言語だからです。c ++は基本的にJavaが行うすべて(gcを除く-しかし、javaは手動メモリ管理を提供しない)だけでなく、実際のテンプレートFTWも提供しているからです。私が考えたかった点は何だと思います:いいえ、すべての言語が妖精の国のプログラミングでほぼ等しいわけではありません
n1ckp

主流言語のみを比較する場合。
n1ckp

0

プログラミング言語はツールです-それ以上でもそれ以下でもありません。一部のツールは非常に特殊化されており、特定の目的に適しています。その他は一般化され、ほとんど役に立たないほど単純化されています。

最も「強力な」言語は、最小限の時間、エネルギー、およびその他の投資で目標を達成できる言語であると主張します。つまり、最大のROIを提供する言語です。状況によっては、Cである可能性があります。他では、Java; さらに他では、Haskell。

最善の方法は、さまざまな言語とそれらが何に役立つのかをよく理解することです。次に、新しいプロジェクトを開始する時が来たら、どちらが最も適切かについて十分な情報に基づいた決定を下すことができます。


-1

プログラミング言語に関する議論は-私見-一部のLinuxニュースグループのメールクライアントに関する議論と同じです。それらは火炎戦争になりがちです。VB6が人気だった時代を思い出すことができます。プログラミング言語ではない、と主張する人もいましたが、他の人はそれを使って素晴らしいアプリケーションを作成しました。

作成者は言語の作成/設計時にさまざまなことを念頭に置いていたため、プログラミング言語の概念はすでに異なっていると思います。そのため、ある目的に合った言語-そしてその状況下では強力な言語-は、別の目的に合わないかもしれません。言語に強力な名前を付けるかどうかは、純粋に主観的です。とはいえ、適用できる指標があるとは思いません。


原因不明のダウン票に対抗するために+1。設計されたタスクの言語を使用します。Cで複雑なGUIを記述しない、VB6で複雑なアルゴリズムまたはOSを記述しない
Gerry

-1

それらはすべてツールチェストのツールです。ハンマーは強力ですが、レンチが必要な場合はそうではありません。システムプログラマーであればC / C ++は優れていますが、Adobe Flashはおそらく、構築したいゲームWebサイトにより適しています。


-1

最も強力なプログラミング言語は、次の線形プログラミングの問題を解決するものです。

最大化

      開発の 速さ+
    コードの読みやすさ
    +デバッグのしやすさ
    +表現の簡潔さ/簡潔さ
    +学習/指導のしやすさ -CPU
    使用率
    -メモリ要件

対象

  • チューリング完了でなければなりません。
  • 機能的、オブジェクト指向、論理プログラミング、制約プログラミング、同時実行、分散コンピューティングなど、マルチパラダイムでなければなりません。
  • コマンドラインインターフェイス、コンポーネントライブラリ、サーバー、GUI、およびWebアプリケーションを作成できる汎用性が必要です。
  • 移植可能で、つまり、クロスプラットフォーム設定での移植と保守が容易でなければなりません。
  • 適応性がなければなりません。つまり、変更に対してオープンであり、新しいハードウェア(量子チップ)、新しいパラダイム、およびその他の技術革新が発生するにつれて進化できる必要があります。
  • ライブラリ(CPAN、CTAN、CRANなど)の開発を促進する必要があります。
  • 無料オープンソースでなければなりません。

(そして、はい、私はすでに完全に矛盾した答えを投稿しました。それは私が方言家だからです。)


-2

これは自然言語に関して書かれたものですが、プログラミング言語にも適していると思います。

一部の言語は他の言語よりも本質的に優れているという信念が広まっていますが、言語的事実には根拠がありません。一部の言語は、特定の歴史において、もちろん他の言語よりも有用または名声がありますが、これはその時点での話者の卓越性によるものであり、固有の言語特性によるものではありません。
--David Crystal(ed。)。The Cambridge Encyclopedia of Language 2 / e(1997)。p.7

「力」は、単にある言語が他の言語に起因するものではありません。「中国語は韓国語よりも強力な言語です」と言うのはばかげているでしょう。同様に、「APLはCOBOLよりも強力な言語です」と言うのはばかげています。

言語力を何らかの客観的尺度と同一視しようとするいくつかの試みがありました。私はこれらの試みが失敗すると信じています:

  • マオリ語を話すよりもアメリカ英語を話す方がアメリカで仕事をする方が簡単かもしれません。同様に、間違いなくLISPやJよりもJavaやCのプログラミングの仕事を得る方が簡単です。しかし、この経済的利点は、言語の本質的な力を反映していません。その言語の話者の力について。
  • 「Hi」は「ni hao」や「shalom」よりも短く、短いためです。同様に、関数はCOBOLよりもAPLで簡潔に表現できますが、これも言語の生来の力を反映していません。

私の意見では、「ある言語が他の言語よりも優れている」という議論は、他のグループよりも優れているという話者の感情の隠れた表現だということです。要するに、その偏見とステレオタイプ。もちろん、実際に偏見を抱いている人は、ステレオタイプを非常に強く信じており、考えを変えるよう説得することはできません。


同意しません。簡単な例として、理論的には完全にチューリングしているとしても、brainf * ck(たとえば)よりも強力な言語が存在することを言う以外に誰も言うことはないと思います(私は思う)。ポイントは、「パワーフル」はすべて「完全」であるという事実とは関係のない特定の品質であるということです。私はそれがいくらか主観的である可能性があることに同意しますが、「パワーフルネス」に関してすべての言語が平等であると言うことはかなりフェッチされているようです。
n1ckp

1
@ n1ck:Power = Readabilityと言っていますか?そして:。BFの可読性の欠如は、その力の欠如を意味しますか?APLとJも読みやすさが非常に低いですが、非常に有用で簡潔です(確かに有用性または簡潔さを力と同一視していません)。反対の方向に進むと、COBOLは非常に読みやすくなります。その実に詳細な; 繰り返しますが、これによりAPLやBFよりも強力になることはほとんどありません。BFは非常に面白いです。それは楽しませる力を持っています。しかし、それはPower qua Powerではありません。問題は、コンセンサスを得ることができるパワーの良い理論を誰も持っていないようだということです。
その他

1
いいえ、power = readabilityという意味ではありません。すべての言語は平等であり、「パワーフルネス」で言語を比較することはできないというあなたの見解には同意しませんが、あなたはそれを定義します。私の意見では、言語に何らかの力を与えるには基本的な読みやすさが必要ですが、それは実際には問題ではありません。質問に本当に答えたい場合は、もちろん最初に力強さを定義する必要がありますが、私の見解では、これは「あらゆる状況で最高」と同じではありません。すべての言語、私はちょっと同意します)。
n1ckp
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.