変更に対してプログラミング言語をより安定(互換)にするメカニズムはありますか?


14

プログラミング言語は多数あります。それらのいくつかは成長し、非常に人気があります。人々はそのような言語をますます頻繁に使用します。そのような言語の創設者(または設立組織/コミュニティ)は、言語を改善するために変更を実装しようとする場合があります。しかし、下位互換性のために変更を加えるのが難しい場合があり、そのようないことは何年も言語にすでに存在しており、多くのユーザーによって使用されています。

言語設計段階で、言語設計者が下位互換性を破ることを恐れないように、より安定させるのに役立つアーキテクチャの原則や手順はありますか?


2
言語の安定性には、いかなる種類の重大な変更も含まれません。質問を明確にできますか?
サイモンベルゴ14年

より安定しているということは、変更の発生が少なくなることを意味します(必要でないため)、後方互換性のない変更の正反対です。どちらに興味がありますか、それとも半独立的に両方について質問していますか?

@Simon新しい機能を追加しようとしているときに、比較可能性を弱めることを恐れない言語の設計方法
ヴィアチェス

@delnanは両方とも言えます。
ヴィアチェスラフコンドラティウク14年

@viakondratiuk恐れることは、言語設計が変わる可能性のあるものではありません。より良い質問は、「新しい機能を追加しても重大な変更が生じないように言語を設計する方法」でしょう。
svick

回答:


6

言語の安定性は技術的な決定ではありません。これは、言語作成者とユーザーの間の契約です。

著者は、与えられたバージョンを多少安定していると宣伝しています。言語の安定性が低いほど、作成者はより多くの変更を加えることができます。言語に関心のある各ユーザーは、新しい機能を学習したり、来月の更新までに壊れる可能性のあるアプリケーションを開発するために時間を費やすかどうかを決定できます。

不安定な言語を使用すると、新しい概念に興味があるか、フィードバックを提供して支援したいため、興味深い場合があります。あなたがビジネスをしているなら、技術がより安定するのを待ってから、それに時間を投資することを好むかもしれません。市場投入までの時間やユーザー体験のようなものにもっと関心があります。

したがって、これはコミュニケーションと信頼の問題です。さび言語の開発を見てください。彼らは、彼らが何を変え、何を維持しているのかについて非常に明確です。特定の機能に関する決定を遅らせたい場合は、機能ゲートと呼ばれるものを使用します。反対側では、変更が予想よりも大きかったため、アンギュラーチームは2.0の発表に対して多くの怒りに直面しました。

ライブラリの作成者でさえ、APIの安定性について連絡する必要があります。他の人が使用するほとんどすべての技術は、安定性と完全性のバランスをとる必要があります。自動車メーカーはペダルの位置を変更できず、ラップトップのデザイナーは同じ理由で新しいキーボードレイアウトを発明しません。製品の使用方法を決定できない場合、ユーザーを支援しません。


5
  • 事前に設計された言語に関係なく、言語は生涯を通じて変化することに注意してください。地球上で最も素晴らしい言語をすぐに出荷しようとする代わりに、最初に有用で拡張可能であるようにしてください。私が実際に使用できる平凡な言語は、理論上のみに存在する素晴らしいプログラミング言語よりも価値があります。
  • マクロなど、構文を拡張可能にする機能を検討してください。マクロは自動的に良いものではなく、強力すぎる場合があります。一部の言語には、最初から非常に柔軟な構文があり、マクロの必要性を減らします。考慮すべきいくつかのシナリオ:

    • |>言語を離れることなくなど、新しい演算子を導入できますか?この演算子の優先順位と結合性を選択できますか?
    • インライン関数/ラムダ/クロージャーのためにどのくらいのセレモニーを通過する必要がありますか?
    • 既存の言語構文を使用してforeachループ構文を実装できますか?たとえば、RubyとScalaは、ラムダを使用した柔軟なメソッド呼び出し構文によりこれを実行できます。
  • セマンティクスを拡張可能にする機能を検討してください。一般的なニーズは次のとおりです。

    • オペレーターのオーバーロード。ユーザー定義型は、既存のオペレーターに独自の意味を割り当てることができます。これにより、数学を多用するアプリケーションで言語がより楽しくなります。
    • リテラルのオーバーロード。文字列リテラルを独自の文字列型にすることはできますか?現在のスコープ内のすべての数値リテラルをbignumにできますか?
    • メタオブジェクトプロトコル。言語に特性がない場合、現在のオブジェクトシステム内に実装できますか?別のメソッド解決順序を実装できますか?オブジェクトの保存方法やメソッドのディスパッチ方法を交換できますか?
  • 回帰テストを行います。たくさんのテスト。言語設計者だけでなく、ユーザーも作成しました。機能を追加するとこれらのテストが中断される場合、その機能の利点と後方互換性の利点を慎重に比較検討してください。
  • 言語をバージョン管理します。ドキュメントだけでなく、ソースコード自体にもあります。それを行うと、変更できない言語の唯一の部分は、このバージョンのプラグマ構文です。例:ラケットでは、方言を指定できます。Perlを使用するとuse v5.20、Perl v5.20のすべての後方互換性のない機能を有効にできます。のように明示的に単一の機能をロードすることもできますuse feature 'state'。類似:Pythonのfrom __future__ import division
  • 予約語がほとんどないような方法で言語を設計することを検討してください。理由だけclass紹介クラスは、私が名前のローカル変数を持つことができないだろうことを意味するものではありませんclass。実際には、これにより、変数またはメソッドの宣言を導入するキーワードが作成され、型名を使用して宣言を導入するCのような伝統に反します。別の代替方法は$variables、PerlやPHPのように、にシギルを使用することです。

この回答の一部は、Guy Steeleのスピーチ「Growing a Language」(1998)(pdf)(youtube)の影響を受けています。


あなたの要点のいくつかは、その言語を使用してプログラマーがそれを拡張できることについて語っています。2つはほとんど無関係ではないのですか?そして質問は後者について話していると思います
svick 14年

@svick考えは、言語はエンドユーザーによって非常に拡張可能であるため、言語自体を変更せずに多くの拡張と実験を行うことができるということです。メタオブジェクトプロトコル、オペレーターのオーバーロード、およびマクロシステムは、後の変更のためにドアを開いたままにする方法です。これらのドアを介して実装されるものはすべて、基本的に言語を壊しません。残念ながら、これらのドア自体は後で再設計する必要があります。そこで、Simonの答えの前提が始まります。安定性を約束する前に、少しのベータテストを行って、言語が実際に機能するかどうかを調べます。
アモン14

1

非常に重要なステップは、言語自体のバージョンも管理できるパッケージマネージャーを宣伝することだと思います。

たとえば、ScalaにはSBTを、ClojureにはLeiningenを使用しています。どちらも、プロジェクトごとに、使用する言語のバージョンを宣言できます。したがって、既存のプロジェクトをより快適なペースでアップグレードする一方で、最新バージョンの言語でグリーンプロジェクトを開始するのは非常に簡単です。

もちろん、言語によっては、関連するライブラリが必要なバージョンに移植されるのを待つ必要があります(たとえば、Scalaで発生します)が、それでも簡単になります。


当然ながら、可能な限り多くの言語をインポート可能なパッケージ/モジュールで定義する必要があります
jk。

はい、ただし必ずしもそうではありません。たとえば、ScalaのコンパイラはScalaで作成されていますが、Scalaバージョンをsbtに設定すると、Jarとして取得され、ソースのコンパイルに使用されます。たとえそれが不透明なバイナリであったとしても、それでも同様です。今、そこにインポート可能なパッケージで定義されている必要があり、可能な言語の多くとして定義するには理由がありますが、それらはアモンの答えで覆われている
アンドレア・
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.