すべての既存のプログラミング言語の最高の機能を組み合わせて、ユニバーサルプログラミング言語に適合させてみませんか?
同じ理由で、鶏肉を彫刻するために スイスアーミーナイフ を使用しません...
スイスアーミーナイフには通常、刃のほか、ドライバーや缶切りなどのさまざまな工具があります。これらのアタッチメントは、ピボットポイントメカニズムを介してナイフのハンドルの内側に収納されています...
ナイフのデザインとその柔軟性は、世界的に認められています...
なぜなら
あなたがプログラミングで持っているのは、非常に大きな問題領域です。このドメインは非常に多方向に広がっています。
これが、組み込みのフライトコントローラーがCで記述され、WebサイトがPHP、Java、Rails、.NETおよびその他のホストで記述されている理由です。
組み込みのフライトコントローラーの場合、使用するメモリが約128kあります。さらに、コードで未処理の例外が発生すると飛行機がクラッシュし、200人が亡くなり、$ 1Bの調整に訴えられ、エンジニアをすべての人に送る必要があります。世界中の空港で、接地されている航空機を修理して、1日あたり1,000万ドルを失っています。私は、非常にタイトで、問題が発生する可能性のある可動部分が少ない言語を使用する必要があります。
私のWebアプリケーションでは、使用するメモリが数GBありますが、ネットワーク速度は制限されています(毎日の程度は低いですが、これはおそらくWebの最大の制限です)。たくさんの機能を提供し、できるだけ速く送信できる出力を生成する言語を見ていきます。私のサイトがダウンしたとしても、私は本当に気にかけません。多分、数ドルの売り上げ($ 100)を失い、爆撃されたユースケースにパッチを適用する必要があります。
Webサイトは15年以上Cで記述されておらず(誰でもcgiスクリプトを実行していますか?)、私が知る限り、フライトコントローラはC++を検討し始めたばかりですが、それでも非常に制限された方法です。
ツールボックスがない場合、または中空のハンドルにドライバービットが付いた小さなハンマーが1つしかない場合、私は同情しています。
真剣に。あなたが自動車店に行くならば、あなたの整備士は彼の道具箱にたった一つの万能ツールを持っていますか?彼(または彼女)は専門家であり、さまざまな自動車修理作業を実行するために特別に設計されたプロ仕様のツールを備えています。
同様に、プロのソフトウェア開発者は、自分の取引を実行するための十分なツールセットを所有している必要があります。ツールボックスを開いて、フィリップスドライバー[に相当するソフトウェア]だけが表示されている場合は、自分を専門家と見なすことはできません。
ボルトは、オープンエンドレンチ、ボックスエンドレンチ、ラチェットレンチ、またはモンキーレンチで回すことができます。スリップジョイントペンチを使用してボルトをピンチで回すこともできます。しかし、スレッジハンマーでボルトを回すことは非常に困難です。
他の人への別の種類の答え-私は実際に言語が「ユニバーサル」言語になる可能性があり、その機能とパラダイムが可能になると思いますあなたが考えているかもしれない厳密に設計された言語ではないかもしれませんが、他の多くの言語。
上記の brettmjohnsonの類推 を使用する場合、各プログラミング言語がボックス内(またはスイスのアーミーナイフ)のツールであるという考えは、誰もが行っている仮定ですが、実際には不完全な仮定です。
プログラミング言語がツールボックスだった場合はどうなりますか?
つまり、必要に応じて言語に機能を追加および削除し、必要なツールを備えた独自のツールボックスを用意するとどうなるでしょうか。ツールが異なる目的であっても。
その概念はすでに部分的に存在しています。たとえば、 Nemerle のような言語では、 言語に構文を追加 できるため、「言語Xの最高の機能」を利用して追加できます。それをネメルレ(またはあなた自身)に。これは、必ずしも常に独自のマクロを作成することを意味するわけではありません。各言語(またはパラダイム)は、標準ライブラリのマクロ内で定義でき、import Haskell; import Prolog;
、2つの言語を自分の言語の一部であるかのように書き始めますか?
次に問題は-異なる言語/パラダイムの機能をどのようにして相互に連携させるかです。私はそれに答えることはできませんが、.NetやJVMのようなフレームワークはいくつかの解決策を提供します-言語はコンパイルされた方法のために少なくとも部分的に互換性があります。たとえば、C#で記述された任意のコードを取得し、F#から問題なく使用できます。
現在のソリューションの「問題」は、これらの言語を一緒に使用するには、それらを別々のプロジェクトとして作成する必要があるため、相互に参照できないため、一方向の参照しか使用できないということです。言語の障壁は、他のプロジェクトがアクセスする前に、各プロジェクトがすべてのファイルを共通中間言語に個別にコンパイルすることです。
その障壁を取り除くための足がかりは、異なるプロジェクト(C#やF#など)のコードを同じプロジェクト内でコンパイルできるようにすることです。理論的には、各ファイルを個別に(またはグループ-部分的なタイプまたは循環参照がある場合は)コンパイルし、すでにコンパイルされている(CIL)オブジェクトにアクセスできる異なる言語のファイルをコンパイルできます。ただし、これを機能させるにはコンパイルの順序を厳密に定義する必要がありますが、F#の場合はコンパイルの順序がすでに必要です。
とにかく、「万国共通の言語があることは間違いない」とは言っていません。私は、現在存在しているものよりもはるかに優れた言語間の相互運用性の可能性があることを示唆しています。実際には、言語とそれを使用するために必要なライブラリ、ツールなどを実装するための膨大な作業のために、すぐには大幅に改善される可能性は低いです。
一部の言語の最高の機能は、他の言語の最高の機能と競合します。
例:型認識リフレクションは本当に素晴らしい機能ですが、緩やかに型付けされた言語ではそれほど価値がありませんが、緩い型付けは、本当の利点になる場合もあります。
1つの言語内であっても、最高の機能がすべて同時に使用できるとは限りません。
「すべての取引のジャック-なしのマスター」思い浮かぶ。
一部のプログラムは速度を必要とし、他のプログラムは大量のメモリまたはディスクへの高速アクセスを必要とします。ある言語は上手く、他は悪い-私はあなたがまったく上手な言語を手に入れるとは思いません。
したがって、実質的にあらゆるプログラムをあらゆる言語で記述できますが、得られるものが、その問題を解決するために記述できる「最良の」プログラムであるとは限りません。
言語は人々の考え方を形作ります。これは自然言語にも当てはまります。子供が「1、2、多く」という数字の付いた1つの言語しか知らない場合、その子供に数学を教えることは...難しいです。 (申し訳ありませんが、リンクはありません)英語では、まるで場所であるかのように異なる時間について話します。したがって、タイムトラベルの概念は想像できます。他のいくつかの言語では、タイムトラベルのアイデアはその話者にneverが発生するでしょう。
これはプログラミング言語にも当てはまります。
したがって、単一のプログラミング言語を使用している場合、誰もがすべての計算タスクをまったく同じように考えるでしょう。したがって、代替手段を探求することはなく、何かを行うための最良の方法は未発見のままです。
ユニバーサル言語に最も近いのはCです。Cは、基盤となるハードウェアの概念(ハードウェアで実際にどのように行われるか)に非常に密接にマッピングされ、すべての*言語のプログラムはCに変換可能です(CFrontがアセンブラーにCコンパイラを使用した方法を参照してください)タスク)Cの問題は基本的に、上記の変換がCプログラマの観点からは意味をなさないことです。
「ラムダ」はCでは常に可能でした。構文はオフで、コードはプロジェクト/ファイル全体に広がっているため、推奨されるソリューションではありませんでした。 no-capture/upvalue/etcバージョンでは、関数を別の場所で定義し、関数へのポインターを渡します。 (参照qsort())キャプチャされた値でラムダを使用するには、記述しなければならないコードの量と複雑さが大幅に増加します-私が知る限り、実際に使用するコードを記述したことはありませんCでのこのプログラミング方法。ラムダが言語の一部である言語とは対照的に、基本的にどこでも使用されます。
CとC++の主な違いは、C++にstuffの処理を依頼する方法です。しかし、その場合、1行のコードだけでは、実際にどれだけ求めているかを確認できなくなります。答えは次のようになります:依存します(他のすべてのコードに依存します)。
一部のプログラミング言語は特定のタスクに最適ですが、世界中で使用されているほとんどの現在のプログラムは、その言語でプログラムされている場合には意味がありません。つまり、そもそもそのプログラムを実装するためにその言語を使用できるかどうかは、これは規定されていません。
有る。どれもすべてに最適なツールはありませんが、多くのプログラミング言語のような一部のツールserveではなく、あらゆる目的にbestではありません。
仕事に最適なツールを選択できますが、あらゆる目的で使用できるプログラミング言語があり、それらを選択できます。私はそれをお勧めしませんが、それは可能です。
「すべての機能を組み合わせる」ことがより良い言語になると考えるのは間違いです。
最終的には、肥大化した複雑で読めない混乱に陥る可能性が高くなります。
優れた言語設計には、選択とトレードオフが必要です。間違いなく最高の/最も革新的/最も成功した言語は、何かを取り出し、新しいものを追加するのではなく、より良い代替手段を提供する言語です。
アンクルボブマーティンによるこの上で素晴らしい話があります- The Last Programming Language
普遍的な言語を持つことの技術的メリットの不可能性?それはまったくナンセンスです。あなたはcouldすべてのベースをカバーする普遍的な言語を持っています。問題は主に歴史的なものです。さまざまな言語がさまざまなことを行うために発明され、さまざまなコミュニティで使用されています。それらの多くは行き詰まりました。その設定(vi!emacs!待って、私はJava!を意味しました!C#、Microsoft、オープンソースなどを意味して待ってください)と、歴史的事故の一般的な埋め込みを追加してください...小さな土地の自然言語を見てくださいこのトピックがどれほどクレイジーになるかを知るために、いくつかのヨーロッパの国々のように大衆。一部の町には、独自の誇りと喜び、彼らだけが話す小さな方言があります。国家とプログラミングコミュニティはそれほど異なりませんし、プログラミングコミュニティはより合理的でもありません。もしそうなら、私たちは皆、エスペラント語を話し、ユニバーサルサムシングサムシングでプログラムします...
「一般化/専門化のパラドックス」と呼んでいるため、おそらく別の名前が付けられており、実際にはパラドックスではありません。
より一般化されたプログラミング言語ほど、何かを達成するために必要なコードが多くなります。言語を専門化するほど、その言語で達成できることが少なくなります。
これまでに書かれたすべてのことから、多くの新しい根拠を追加することは困難ですが、いくつか紹介します。
進化:導入され、変異され、資源とその独自のものを呼ぶためのニッチの生存競争が行われるのは、生物学的システムだけではありません。競争は良好であり、物事を前進させます。
成熟度:私たちは、おそらく1世紀未満の間、コンピュータ言語を作成してきました。まだすべての質問を知らないので、まだ答えを得ることができません。
別の起源:これにふさわしい言葉はわかりませんが、世界では、多くの地理的地域で始まった多くの書記体系があります。粘土板への彫刻の要求によって部分的に規定された楔形について考えてみてください。サンスクリット語、ギリシャ語、ヘブライ語、ローマ語、アラビア語のアルファベットについて考えてください。象形文字、多くの東アジア諸国で共有されている6000以上の記号を使用した中国の美しい筆記方法。キリル文字、カタカナ、ヒリガナのような、発音が基本のより現代的な混合アルファベットを考えてみてください。私は言語学者ではないので、不正確さをあまり厳しく批判しないでください。しかし、世界中の文化が何かを必要とするとき、彼らはそれを作成し、必要に応じて独自のものにします。コンピュータ言語は、世界中に多くのコミュニケーションがあり、帝国やメートル法のシステムのように、強力なアイデアのリーダーシップを持つ場所から生まれました。しかし、プログラミング言語は多くの異なる文化(一部は企業文化)に対応しているため、それらを作成した人々を反映しています。コンピュータ言語には、デザインと使用を形作る文化遺産が付属しています。 OSカーネルカルチャでは、CおよびC++は、ネイティブコード生成、ハードウェア抽象化を作成するためのハードウェアとのクローズ/効率的なカップリングを可能にするため、Java(またはその逆)ですぐに非推奨になる可能性は低いです。レイヤー、およびかなりのインストールベース。
Design of Design:プログラミング言語は、さまざまな組織パラダイムを使用して生まれます。 COBOLとAdaは、多くの階層を持つDODの一部である委員会からのものでした。私が正しく思い出すと、C、C++、Java、そしておそらく他の多くは、1人または少数のデザイナーからのものでした。フレッド・ブルックスは、彼の論文であるデザイン・オブ・デザイン(http://www.youtube.com/watch?v=pC-DlX-PaF4)で、委員会の結果とビジョナリーベースのアプローチを比較しています。今日、Da Vinciまたは委員会のいずれかを選択してユニバーサルプログラミング言語を定義するために座ったとしたら、それを誰または何がどのような方法で設計すべきかを知ることができるでしょうか。
たぶん、これについて少し異なる傾斜:
言語とは?途方もなく単純であるために、それは語彙、構文、および意味論です。
プログラミング言語で最初に行うことは何ですか?
クラス、変数、メソッドなどを定義し、語彙とセマンティクスを拡張します。
どうして?だから今、あなたはそれでは前に言うことができなかった事柄を言うことができます。
好きかどうかにかかわらず、あなたは新しい特別目的言語を作りました。
私見、汎用言語で探すべきことは、それが特殊目的言語の作成を容易にするかどうかです。
すべての最高の機能を備えたツールはありません。たとえば、JavascriptとSchemeの素晴らしい機能はそれらが小さいということです。そのため、機能のパッキングを開始すると、すでにこの機能を失っています。
それでも Cobra は、他の言語のすてきな機能をすべて使用する方向に有望に見えます。 :-)
Swiss-army-knife引数(ポイントがあります-ドメインよりも優れた広域スペクトル言語を設計することは難しいですが、特定のもの-しかし、それはそのような言語が可能でも良いアイデアでもないという意味ではありません)、「最高の機能を組み合わせる」ことに問題があります:
要するに、言語設計はそれよりも難しく複雑です。ただし、 Scala を確認することをお勧めします。
そのような言語を作成すると、それはさらに別の新しい言語になるからです。大規模なファン層を獲得する可能性がありますが、他のすべての言語は引き続き存在します。
それ以来多くの新しい言語が発明されたにもかかわらず、Cはまだ存在しています。
pythonは非常に普遍的な言語ですが、Rubyもあります。
多くの言語がある理由は、多くのプログラマーがいて、何人かは新しい言語を作成したいからです。
誰もが同意する単一の普遍的な言語がない理由は、クラフトとしてのプログラミングは、すべての決定を行ういくつかの機関によって指示されないためです。誰もが自由に好きなことをすることができます。
それは良いことです。