私が知っている事実上すべての言語は、基本的にテーマのバリエーションです。変数と関数を作成し、条件やその他の構造を使用してそれらを操作します。関数型プログラミングなどは「伝統的な」言語とは多少異なることは理解していますが、基本的にはほとんど同じです。あなたはまだ変数を扱っており(不変などであっても、ある程度)、関数を作成しています。
現在私たちが使用しがちなものを完全に排除し、まったく異なるアプローチを持つ言語またはシステムはありますか?
11 に答える
関数型プログラミングの強引な却下にもかかわらず、確認バイアスを使用してそれを「より多くの同じ」として却下するのではなく、理解と学習のために読むために、今回だけもう一度それを見る必要があると思います。関数型スタイルでコードを記述することは、命令型スタイルでコードを記述することとは大きく異なります。しかし、それがあなたにとって十分な違いではない場合は、これらのいずれかを見てみましょう?:
- Prologや (IIRC) Mercuryなどの言語に代表される論理プログラミング。
- Forthのような連結言語はかなりトリッピーです。
- 関数レベルのプログラミング(関数型とは対照的に!) は、計算に関して気分を害するのであれば、変数を取り除きます。 最近、この領域ではJしか選択肢がありません。
- 配列プログラミングは、上記とかなり密接に関連しています。この典型的な例としてAPLを見てください(ただし、JとKにはこの要素が組み込まれています)。
基本的に、利用可能な数十のプログラミング パラダイムのいずれかを見て、確証バイアスによる却下ではなく、理解と啓発のために説明を読むだけです。あなたが使用している「異なる」という漠然とした定義に対して十分に異なるように見える言語ごとに1つの言語を学び、楽しみましょう.
グラフィック言語については、いくつかの試みがなされてきました。National InstrumentsのLabVIEWシステムは、おそらく最も成功しています。データに作用するコンポーネントを含むデータ フローのグラフを使用します。
グラフィカル言語の別の試みはUMLです。陪審員はこれについて出ていると思います。標準化委員会が関与して万人向けのものにする前に、それはおそらく良い考えでした.
膨大な数の電気機械システムが、ラダー ロジックでプログラムされたPLCによって制御されています。これは本質的に、信頼性の高い有限状態マシンを作成するための規律ですが、手続き型言語とはほとんど似ていません。
次に、難解であいまいな代替言語があり、チューリング完全では言語が理にかなっていることを必要としないことを人々に思い出させる以外に、ほとんど実用的な目的を果たしません。チューリング マシン自体をこのカテゴリに入れる人もいるかもしれませんが、BrainF*ckとPietは、この群集の中で私にとって本当に際立っています。
難解な言語whenは、フロー制御がまったくないという点でも興味深い演習です。
編集: Befungeのことをほとんど忘れていました。そのソース テキストは ASCII 文字のグリッドで、各セルはオペコードです。実行は 4 つの方向のいずれかで実行されるため、1 つのオペコードを 4 つの異なるシーケンスでフローできます。これは別の難解な言語であり、(1993 年に) コンパイラを作成するのができるだけ難しくなるように設計されました。それが実際に誰かがそれをするのを止めたというわけではありません。
私が指摘した言語のいくつかは難解な言語でした。これらは一般に、小規模な (多くの場合 1 つまたは 2 つのみの) ユーザー コミュニティを持つ言語です。それらはさまざまな理由で作成されており、チューリング完全であることの意味と、プログラムをどのように表現するかの境界を探ることが、より深刻な理由として挙げられています。
すべての難解な言語の祖先は、1972 年に作成されたINTERCALです。これは、表面的には COBOL に似ている言語ですが、その多くの癖の中で、実行を継続するためにプログラムが十分に丁寧である必要があります (ただし、丁寧すぎないようにする必要があります)。礼儀正しさをサポートする、PLEASE DO
の丁寧な形式ですDO
。注目すべき拡張機能はCOME FROM
ステートメントです。これにより、指定された場所からここに制御が流れます。
それ自体は言語ではありませんが、アナログ コンピューターはいくつかの点で、より一般的なデジタル コンピューターとはまったく異なります。
さて、ピートがいます。それはかなり違います。(以下は Piet の Hello World です。) それでも、いくつかの整数を含むデータ構造 (この場合はスタック) を扱っており、スタックに何かを追加したり削除したりしていると主張するかもしれませんが、値などを操作するので、実際にはまだ同じです。
良い質問。一歩後退しましょう。私の最初の回答では、あなたが探しているのは新しい言語ではなく、新しいアーキテクチャであることを説明しようと思います。少なくとも重要なものは知っていると思います。
20 年前、コンピューター プログラムは、Basic プログラムのような「シリアル」ロジックを使用して構築されていました。
10 INPUT "PASSWORD: ";A$
20 IF A$="PASSWORD" THEN GOTO 40
30 PRINT "TRY AGAIN" : GOTO 10
40 PRINT "WELCOME"
MS-DOS プログラムも同じです。しばらく実行してから、ユーザーの入力を待ってから、再度実行します。Unix システムでは、マルチタスク システムであっても、ゲームは非常に似ており、複数のユーザーがその方法でプログラムを実行できます。
2 つのベラクスルー波がありました。
- イベント駆動型システム: プログラム フローが大幅に変更されました (イベント ハンドラー、コールバック、リスナー)。
- Web システム、特に AJAX: プログラムはさまざまなマシン (分散処理、クライアント サーバー アーキテクチャ、サービス) で実行されています。
その間、コンパイルとプログラムの構築が変更されましたが、私はいくつか少ないと思います:
- メタプログラミング (IDE ベースのコード ジェネレータ、プリプロセッサ)、
- 技術をプラグインし、
- 動的ライブラリ。
また、プログラミングのターゲット環境も大幅に変更されました。
- 仮想マシン (Java)、
- インタプリタ プラットフォーム (PHP)、
- システムサービス、
- フレームワーク、
- ポータル システム (Drupal)。
いくつかの大きくて太ったプログラムがプラットフォームになりました:
- Lotus Notes (独自の言語、現在は Java)、
- MS Excel (Visual Basic)。
新しい言語については言及しませんでしたが、同じ言語であっても非常に異なるプログラミングになる可能性があります。たとえば、携帯電話用の J2ME ゲームを作成し、Oracle SQL 用のストアド プロシージャを両方とも Java で作成します。
探しているのはプログラミング言語ではないかもしれません。たとえば、タスクはデータのリスト、ある種のテーブルをブラウザに表示することです。Web アプリは次のようになります。
- PHP スクリプトが SQL クエリを実行し、テンプレート システムが取得したデータを準備された HTML テンプレートに挿入します。
- PHP スクリプトが SQL から取得したデータを XML に変換し、ブラウザーがそれを XSLT 変換を使用して最終的な HTML に変換します。
- JavaScript アプリが PHP スクリプトからデータを要求すると、SQL の結果が JSON 形式で返され、JS アプリが最終的な HTML をレンダリングします。
HTML+XSLT はプログラミング言語ですか? いいえ。PHP がサーバー側で行うのと同じタスクを実行しますか、または JS がクライアント側で実行しますか? 絶対に。共通プラットフォームですか?はい、すべてのブラウザがサポートしています。
低レベルのプログラミング言語、つまり手続き型、OOP、またはその他のチューリング完全言語は十分にあると思います。新しい (プログラミングよりも少ない) 言語の目標は、より効果的なものにすることです。より高速なコード生成、より柔軟なアプリ、コミュニティ作業のサポート、スケーラビリティ、メンテナンスの容易さ、再利用性などです。
(ここで回答を分割します。次のパートでは、しばらく遊んでいる回答を紹介します。)
質問内容にもよりますが、答えはおそらくノーです。
その理由は、チューリング完全である現在のすべてのコンピューター言語が、まあ、チューリング完全であるためです。これは、これらの言語のいずれも、このグループの他の言語によってシミュレートできることを意味します。次に、どのプログラミング言語にも、現在のコンピューターで実行できるコンパイラーまたはインタープリターを含めることができます (概算)。これらには、アーキテクチャ上、コードとデータの概念があります。
そのため、関数型プログラミングと命令型 (「伝統的な」) プログラミングは同じであると考える場合、それらはコンピューター上で実行されるため、他に選択肢はありません。
コードとデータは、関数とデータ構造 (変数) に変換されます。それらはバリエーションを許可します:
- 不変性は、関数型プログラミングの主な要因です。
- コードとデータの違いはあいまいです。たとえば、ホモイコニシティとは、関数をデータ構造として使用できることを意味します。Lisp 言語を参照してください。
- これに関連するのは自己変更コードです。
一方で、プログラムの表現方法も少し違った書き方をすることがあります。関数合成を基礎として使用すると、連結プログラミングの方向に進む可能性がありますが、データフロー プログラミング (多くのグラフィカル言語を含む) や関数型プログラミングも同様に連結プログラミングをサポートしています。
言語を表現する方法の最後のグループは、データ構造に対する最適化または検索プロセスとしてモデル化されたものです。
- Prologのようなロジック プログラミング。
- Evolutionary Computationは、標準的なプログラミング言語でプログラムを出力します。しかし、おそらく、結果のプログラムを見つけて実行するために「実行」できる記述言語を書くことができます。これは、多くの機械学習手法にも使用できます。
これはすべてややアカデミックです。私のアドバイスは、異なるとは何を意味するのかを特定しようとすることです. おそらく、関数型プログラミングはあなたの目的にとって十分に異なっています。
編集:「条件やその他の構造を使用してそれらを操作する」という表現の使用に気付きました。制御フロー構造は、コードとデータに対して異なる構造である必要はありません。たとえば、条件if
は として表現filter
でき、ループは として表現できますmap
。高階関数と遅延評価を指定すると、関数とデータ構造のみを使用して、明示的なif
orなしで実行できます。for
それは、実際にそれを行う能力を失ったという意味ではありません。そのようなものを見たい場合は、 Haskellに興味があるかもしれません。
また、制御構造体アプローチでデータ構造に適用される関数を使用しながら、グラフィカル言語や難解な言語など、見た目が異なる言語の他の回答も参照してください。
http://en.wikipedia.org/wiki/Programming_paradigmと、右側のリンク ボックスにリンクされているすべてのページを読んでください。見方によっては、まったく異なるものもあれば、基本的にすべて同じものもあります。
先ほど言ったように、今日ではプログラミング可能なプラットフォームや環境がたくさんあります。プラットフォームによっては、Microsoft .NET など、VisualBasic や C# などでプログラミングできる言語の長いリストから選択できます。また、Android で使用される Java や Oracle SQL サーバーのストアド プロシージャなど、非常に異なるプラットフォームが同じ言語を使用する場合もあります。
また、ドメインをカバーするか、何らかの構成を明確にする非プログラミング言語もあります。これは、実際のプログラミング言語としてははるかに単純ですが、プログラミング言語よりもうまく使用できます。例: PLC のラダー ロジック プログラミング。
データフロー プログラミングは、この種のプログラミングの 1 つです。ウィキペディアを見てみましょう。データフロー プログラミング (フローベース プログラミングとも呼ばれます) とは何か:
コンピューター サイエンスでは、フローベース プログラミング (FBP) は、アプリケーションを「ブラック ボックス」プロセスのネットワークとして定義するプログラミング パラダイムです。このネットワークは、メッセージ パッシングによって事前定義された接続間でデータを交換します。接続はプロセスの外部で指定されます。これらのブラック ボックス プロセスは、内部で変更することなく、エンドレスに再接続してさまざまなアプリケーションを形成できます。したがって、FBP は当然コンポーネント指向です。
出典: http://en.wikipedia.org/wiki/Flow-based_programming、http://en.wikipedia.org/wiki/Dataflow_programmingも参照
ウィキペディアの記事は素晴らしく、他の質問にもいくつか答えたので、繰り返したくありません。代わりに、非同期データフロー サーバーに使用している言語について説明しています。
3つの言語要素があります。
コンポーネント宣言
cmp: 比較
これは、Compare の一種である「cmp」という名前のコンポーネント インスタンスを参照します。
メッセージ定義
src.out >> cmp.value cmp.gt >> dst1.in cmp.lt >> dst2.in cmp.eq >> dst3.in
ポイントの前の単語はコンポーネント インスタンスの名前、ポイントの後の単語はポート名、左側のコンポーネントとポートのペアがソース、右側が宛先です。(ポートは、メッセージを送受信するためのコンポーネントのピン ポイントです。Wkikpedia の記事を参照してください。)
プロパティ
cmp.base = 8
これは、コンポーネント インスタンスのポートの値を定義します。
(これらの行をまとめると、短いデータフロー プログラムが得られます。つまり、値は src から取得され、cmp はその値をチェックし、8 より大きい場合は dst1 に、8 より小さい場合は dst2 に、8 より小さい場合は dst3 に渡します。ちょうど8です。)
この言語はあなたの基準を満たしていると思います。手続き型ではなく、従来の変数もサブルーチンもサイクルもありません。
データフロー プログラミングを実装しているいくつかの本格的なプロジェクトがあるのは面白いですが、それらはそれについて言及さえしていません。
(データフロー プロジェクトの Web ページはまだありません。作成中です。)
データフロー プログラムを表示したり、グラフとして編集したりできます (SynthEdit を参照)。
Forthを確認してください。これは、ほとんどすべてがスタックの操作に関するものである、かなり異なるシステムです。それは小さな非常に原始的な VM のようなものです。
チューリング マシンについて調べます。ウィキペディアの記事には、プログラムを実行できるいくつかのシミュレーターがリストされています。少なくとも審美的には異なります。
それは言語についてではなく、最も違いを生むのはあなたがそれを使って何をするかです. 多くの言語はあなたを特定の方向に押し進めます。たとえば、Haskell のような純粋な関数型言語では、命令型でプログラミングすることはほとんど不可能になりますが、パラダイムを学ぶのに時間をかけない限り、ほとんどの言語はマシンと同じように見えます。実際に実行され、条件を評価し、メモリ空間に値を割り当てる言語。
パラダイムは、探している抽象化を提供します。優れたオブジェクト指向または機能的なコードは、あなたが説明したものとはまったく異なります。そして、これを行うために言語は必要ありません。単純な C で記述された優れたオブジェクト指向コードと、C++ で機能するコードを見てきました。ただし、適切な仕事に適切な言語を使用することは大いに役立ちます。残念ながら、物事は逆にも機能します。パラダイムを理解するのに時間がかからない場合でも、Scheme や Smalltalk で命令型のコードを書くことになります。