古いプログラミング言語が引き続き改訂されるのはなぜですか?


46

この質問は、「なぜ人々はまだ古いプログラミング言語を使用しているのですか?」ではありません。私はそれをよく理解しています。実際、私が最もよく知っている2つのプログラミング言語はCとSchemeで、どちらも70年代に遡ります。

最近、C99とC11対C89の変更について読んでいました(実際にCの最も使用されているバージョンであり、K&Rから学んだバージョンです)。周りを見ると、頻繁に使用されるすべてのプログラミング言語は、少なくとも10年に1回程度新しい仕様を取得しているようです。Fortranを使用しているほとんどの人がまだFORTRAN 77を使用しているという事実にもかかわらず、Fortranでも新しいリビジョンを取得しています。

たとえば、組版システムTeXのアプローチと比較してください。1989年、TeX 3.0のリリースに伴い、Donald KnuthはTeXは機能が完全であり、将来のリリースにはバグ修正のみが含まれると宣言しました。これ以上に、彼は彼の死の際に、「残っているすべてのバグが機能になる」と述べており、それ以上の更新は一切行われないと述べています。他の人はTeXを自由にフォークして自由にフォークできますが、結果のシステムの名前が変更され、公式のTeXとは異なることを示します。これは、KnuthがTeXを完璧だと考えているからではなく、50年後に同じことをする安定した予測可能なシステムの価値を理解しているからです。

ほとんどのプログラミング言語デザイナーが同じ原則に従っていないのはなぜですか?もちろん、言語が比較的新しい場合、落ち着く前に急速な変化の期間を経ることは理にかなっています。また、既存の疑似標準を体系化するか、意図しない読み取り値を修正する以上の小さな変更に、実際に誰も反対することはできません。しかし、10、20年経ってもまだ言語の改善が必要なように思える場合、すでに使用されているものを変更しようとするのではなく、単にフォークするか、最初からやり直さないのですか?Fortranでオブジェクト指向プログラミングを本当にしたい人がいるなら、その目的のために「Objective Fortran」を作成し、Fortranをそのままにしてみませんか?

将来の改訂に関係なく、C89はすでに標準であり、人々がそれを使用し続けることを止めるものはないと言えるでしょう。これは一種の真実ですが、意味合いには結果があります。GCCは、pedanticモードで、C99で非推奨またはわずかに異なる意味を持つ構文について警告します。つまり、C89プログラマーは新しい標準を完全に無視することはできません。したがって、C99には、言語を使用するすべての人にこのオーバーヘッドを課すのに十分な利点がなければなりません。

これは本当の質問であり、議論を呼びかけるものではありません。明らかに私はこれについて意見を持っていますが、現時点では、これがすでに行われている方法だけではない理由を理解しようとしています。質問は次のとおりです。

古い言語に基づいて新しい言語を作成するのではなく、言語標準を更新することの(実際の、または認識されている)利点は何ですか?


2
多くのコンパイラーは、古い標準を強制するスイッチ(GCCの--std=xスイッチなど)で呼び出すことができるため、新しい標準を作成すると、古いコードを不安定にするツールになるわけではありません。
Blrfl

2
「古い言語に基づいた新しい言語」をどのように定義しますか?Fortran 90は古いF77に基づいた「新しい言語」であると主張します。固定vsフリーソース、動的vs静的メモリなど、プログラムの方法が完全に変更されました。また、Fortran 2003はF90に基づく「新しい言語」であると主張することもできます。C ++とCの関係のように
聞こえ

1
この質問は非常に重要だと思います。なぜそれを閉じたいのか理解できません。これは非常に興味深い現象であり、おそらく何らかの説明があります。数年前(20?)、Fortranの新機能について読んでいて、「Fortranプログラマーがこれらの機能を必要とするなら、なぜCに切り替えないのか」と自問しました。最近、C ++に関する同様の考慮事項がありました。C++開発者がラムダを使用したい場合、なぜOCaml(linux-nantes.org/~fmonnier/ocaml/ocaml-wrapping-c.php)に切り替えないのですか?なぜ彼らは新しい言語を作成し、それでもC ++と呼ぶことを好むのですか?
ジョルジオ

3
@ tpg2114(FORTRAN 77:Fortran 90)と(C:C ++)の違いは、Fortran 90がFORTRAN 77に取って代わり、「Fortranを学びたいなら、Fortran 2003を学ぶか、少なくとも90。これが現在の標準だからです。」「Cを学びたいのなら、C ++を学ぶのは新しい標準だから」と言う人はいません。なぜなら、それらは2つの異なる言語として提示されているからです。私が言ったように、意味合いには結果があります。

6
Cは決して死なないため、
アデル

回答:


13

言語デザイナーが既存の言語を改訂する動機は、ターゲット開発者コミュニティが一緒にいて新しい言語を採用することを保証しながらイノベーションを導入することだと思います:既存のコミュニティを既存の言語の新しいリビジョンに移動することは、新しいコミュニティを作成するよりも効果的です新しい言語の周り。もちろん、これにより、一部の開発者は古い標準で問題ない場合でも新しい標準を採用する必要があります。コミュニティでは、コミュニティをまとめたい場合、少数派に特定の決定を下す必要があります。

また、汎用言語はできるだけ多くのプログラマーにサービスを提供しようとし、多くの場合、それは設計されていない新しい領域に適用されます。したがって、コミュニティは、デザインのシンプルさと安定性を目指す代わりに、言語が新しいアプリケーション領域に移行するときに、新しいアイデアを(他の言語からでも)取り入れることを選択できます。このようなシナリオでは、最初の試行で正しくなるとは期待できません。

これは、言語が長年にわたって大きな変化を受ける可能性があり、最新のリビジョンが最初のリビジョンとは大きく異なる場合があることを意味します。言語の名前は技術的な理由で保持されませんが、開発者のコ​​ミュニティは新しい言語に古い名前を使用することに同意しているためです。したがって、プログラミング言語の名前は、言語自体ではなく、ユーザーのコミュニティを識別します。

IMOが多くの開発者がこれを受け入れられる(または望ましい)と判断する動機は、マスターするのにより多くの時間と労力がかかる完全に新しい言語にジャンプするよりも、わずかに異なる言語への段階的な移行が容易で混乱が少ないことです。1つまたは2つの好みの言語を持ち、新しい(根本的に異なる)言語の学習にあまり熱心ではない開発者が多数いることを考慮してください。そして、新しいことを学ぶのが好きな人にとってさえ、新しいプログラミング言語を学ぶことは常に大変で時間のかかる活動です。

また、あまり知られていない言語を使用する非常に小さなコミュニティよりも、大きなコミュニティと豊かなエコシステムの一部であることが望ましい場合があります。そのため、コミュニティが先に進むことを決定すると、多くのメンバーが孤立を避けるために従うことを決定します。

サイドコメントとして、レガシーコードとの互換性を維持しながら進化を可能にするという議論はかなり弱いと思います。JavaはCコードを呼び出すことができ、ScalaはJavaコードと簡単に統合でき、C#はC ++と統合できます。ソースコードの互換性を必要とせずに、別の言語で記述されたレガシーコードと簡単にインターフェイスできることを示す多くの例があります。

注意

いくつかの回答とコメントから、質問を「なぜプログラミング言語を進化させる必要があるのか​​」と解釈した読者がいることを理解しているようです。

プログラミング言語を進化させる必要があることとその理由(新しい要件、新しいアイデア)が明らかであるため、これは問題の主要なポイントではないと思います。問題は、「なぜ、この進化は多くの新しい言語を生み出すのではなく、プログラミング言語の内部で起こらなければならないのか?」です。


この答えは私がここで見たものの中で最も理にかなっています:言語を更新すると、既存のコミュニティ、ライブラリなどを(少なくともいくつか)継承できます。Lispの最大の問題は、コミュニティの維持を困難にする、互換性のない方言; 既存の言語を更新することは、同じ方法で他のコミュニティを断片化することを回避する方法かもしれません。

@SunAvatar:私の知る限り、Lispにはいくつかの方言がありますが、いくつかは他のものよりも成功しています(Common Lisp、Scheme、Racket、Clojure)。新しい言語を始めるときはいつでも、ごく小さなコミュニティだけがその周辺に集まるというリスクを冒します。Lispコミュニティでは、これは一般的な慣行のようです。誰かが新しいアイデアを持っている場合、彼らは分岐して何が起こるかを確認します。他の言語の作成者にとって、コミュニティを失うことは選択肢ではありません。
ジョルジオ

@SunAvatar:既存のライブラリを継承することは強力な議論とは思えません。そのためのソースコードの互換性は必要ありません。たとえば、ClojureとScalaでJavaコードを使用する方法を参照してください。
ジョルジオ

1
言語は死なず、それを使用するプログラマーだけが死ぬ。
エヴァンプライス

@SunAvatar:別のポリシーに従うことを試みるコミュニティもあります。名前は言語を識別し、コミュニティの一部があまりに異なる方言を作成する場合、混乱を避けるために新しい名前を使用します。例:racket-lang.org/new-name.html
Giorgio

21

下位互換性があなたの答えです。特定の言語、特にCのような広く使用されている言語には、何十年も動作するコードが変更されていない場合があります。メンテナンスが必要な場合は、開発作業のために最新のシステムで実行しながら、その種類のプラットフォームをターゲットにできるコンパイラを用意することが役立ちます。標準化と言語バージョンの更新により、プログラミングプラクティスを最新の状態に保ちながら、「新しい」言語全体の学習に抵抗するベテランプログラマに親近感を提供できます。

更新された言語の多くは、「新しい光沢のあるビットが追加された」ほど更新されないことに注意してください。昔の獣はまだまだ潜んでいます。

Knuthに関する限り、彼は学者であり、TeXは更新されておらず、正しいことが証明されているだけです。


14
Tex =科学論文テキストのフォーマットの問題領域は、あまり変わっていません。プログラミング言語の領域=新しいコンピューターの新しい用途を見つけることは、かなり広範です。それはラテン語が英語としてはそれほど多くの新しい単語を追加していないのと同じ理由だ
マーティン・ベケット

後方互換性が正当な理由だとは思いません。Scalaは既存のJavaコードと簡単に統合できますが、Javaのスーパーセットではありません。したがって、一般的に、新しい言語がソースコードのレベルで古い言語と互換性を持つ必要はないと思います。新しいコードからレガシーコードを呼び出すための明確に定義されたメカニズムがあれば十分です。
ジョルジオ

@Martin Beckett: "Texの問題領域=科学論文のテキストをフォーマットしますが、あまり変わっていません。":質問の要点が欠けていると思います。OPは、プログラミング言語に革新があるべきかどうかを尋ねているのではなく(革新が必要であることは誰も否定できません)、新しい言語を作成する代わりに古い言語を改訂する理由を尋ねています。
ジョルジオ

システムは、時間、お金、専門知識の投資に基づいて構築されます(特定の言語での経験)。新しい取り組みは、メンテナンスの取り組み(3つのカテゴリすべて)よりも大幅にコストがかかります。一般に言語とプラットフォームを改善しなければ、メンテナンスのコストが上がり、新しいシステムのコストがより魅力的になり、そのCOBOLアプリをまったく別のプラットフォームに生涯で8回再ホストすることは思えないかもしれません。もうそんなに好きです。
-JustinC

COBOL言語の更新された標準とCOBOLツールの実装者が途中で独自の独自の機能を追加しなかった場合、言語が改善され、より広く主流の最新プラットフォームで動作する能力が改善されました。このアプリは60年間は生き残れませんでした。相対的なコストは、専門知識の不足の増加により、確かにその人生の後半に上昇しましたが、全体の努力は、瞬間の言語が出現したときの通常の書き直しと比較して、少額でした。
-JustinC

5

明らかな答えは、言語設計とシステムアーキテクチャがまだ進歩中であり、十分な人が古い言語を気にしているため、新しい技術(複数のコア、より良いスレッドまたはメモリモデル)を活用したいからだと思いますまたは言語標準に組み込まれています。また、サードパーティに依存するのではなく、コンパイラやプラットフォームに関係なく、そこにいると期待できること(XML解析、DBアクセスなど)を行うための「1つの真の方法」があると役立ちます。インストールされている場合とされていない場合があります(また、必要なバージョンなどである場合とそうでない場合があります)。


「古い言語を気にする人」が理由なら、あなたの答えは「既存の言語への感傷的な愛着」と言い換えることができると言いますか?軽answer的に言っているのではなく、あなたの答えを理解しようとしているだけです。
アヴナーシャハルカシュタン

いいえ、私は言語がまだアクティブに使用されていることを意味し、それらは最新の技術を利用したい人々によって使用されています。ALGOLがアクティブに使用されていないため、だれかがALGOLにマルチスレッドサポートを追加するとは思わない。ただし、新しいシステムの開発にはFORTRANとCOBOLが引き続き使用されているため、それらの言語仕様は定期的に更新され、新しい技術と技術が組み込まれています。
TMN

1

汎用言語が構築する基本概念または目標は、関連性を失わない。ただし、作業環境またはハードウェアの小さな変更では、言語に更新または小さな機能を追加する必要があります。

64ビット型のクリーンなサポート、より標準的な正規表現のサポート、または新しいタイプのファイルシステムのより堅牢なサポートが必要な場合でも、言語でのアルゴリズムの表現方法は変わりません。

「新しい」機能が既存の言語に追加されている場合がいくつかありますが、多くの場合、これらの変更は、人々がすでに苦労していたことの単純化に相当します。(関数ポインターとファンクターの代わりに高次関数を使用するC ++を参照してください。)


1
2番目の段落で説明する変更は、かなり異論のないものです(つまり、私は反対しないというだけでなく、誰も真剣に反対することはできません)。ラムダに関しては、C ++でのラムダの有用性についてコメントすることはできませんが、アルゴリズムの表現方法を変更しないのにラムダを追加するのはなぜですか?

ああ、彼らは信じられないほど便利です。誤解しないでください。これらは、C ++(IMO)で最も重要な追加機能です。私はそこで何を意味したのか明確ではなかったと思います。通常、メモリへの直接アクセス、確定的なパフォーマンス、および最適化の可能性が高いC ++を選択します。それは最近の追加で変わりません。C ++を選択した理由に関する他の多くのプログラミングタスクを単純化しますが、同じ理由でC ++は依然として有効で有用です。Schemeは定期的に更新されますが、code-as-dataとlispy-nessは変わらないため、20年前と同じ理由でスキームを選択します。
ベン

「ラムダについては、C ++での有用性についてコメントすることはできませんが、なぜアルゴリズムの表現方法を変更しないのにわざわざ追加するのですか?」:さらに進む:なぜ言語に切り替える代わりにC ++に追加するのか最初から持っていた?
ジョルジオ

2
@Giorgio言語のキャッシュおよび抽象化機能を制御します。両方を提供する既存の言語がない場合、1つを犠牲にすることなく言語を切り替えることはできません。言語を変更するか、新しい言語を作成する必要があります。
mike30

@マイク:「キャッシュ機能」とはどういう意味ですか?
ジョルジオ

-2

これは話されている言語の考慮事項に少し似ています。

過去には、現在ほど頻繁に使用されなかった(または別の意味で使用された)単語がありました。

例えば。nice:(非常に古い)英語では、特に誰かの性格を記述するために使用する場合、今日使用しているものとほぼ逆の意味を持ちます。

悪い:それほど昔ではなく、悪い意味はただ一つの意味しかありませんでしたが、今では「超驚くべき」何かを意味することができます(それは熱狂的な方法で使用されます(おそらく、熱狂的なスペルミスを見逃しました)!

別の新しい開発は、書記言語用の携帯電話の「テキスト読み上げ」です。

プログラミング言語が同様の方法で開発されない理由は個人的にわかりません。言葉や機能は特定の意味/アクションを指定しており、新しいアイデア、新しい方法論を取り入れるために変更する必要があります。

私は多くの異なる言語を話す人々を知っています、そして、彼らはしばしば3番目か4番目の後に新しいものを学ぶことはより簡単になると彼らに提案します。

同様の経験があるプログラマーがいるかどうかはわかりませんが、あっても驚くことはありません。

私は、JAVAでプログラミングの幸せを感じていることを知っています(英語で話すのが幸せだと感じているのと同じくらい) 。JavaからPHP、Perlに行くのと同じように、構造は似ていますが、私を捕まえて壁にぶつけるためのちょっとした落とし穴があります。

これは、英語からフランス語へ、またはJavaからSASへの移行とは異なります。これらは非常に異なるため、熟達するにはかなり時間がかかります。

とにかくこれは私の考えです。


あなたは「ファセット」を考えていると思います。
ウリウィットネス16
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.