web-dev-qa-db-ja.com

数値リテラルでアンダースコアを使用できる最初の言語はどれですか?

Java 7+では、 数値リテラルのアンダースコア を使用できます。これは、リテラルの値には影響しませんが、グループ化には役立ちます。 Java 7のドキュメンテーション、「数値リテラルのアンダースコア」という題名のドキュメント)の例:

long creditCardNumber = 1234_5678_9012_3456L;
long socialSecurityNumber = 999_99_9999L;
float pi =  3.14_15F;
long hexBytes = 0xFF_EC_DE_5E;
long hexWords = 0xCAFE_BABE;
long maxLong = 0x7fff_ffff_ffff_ffffL;
byte nybbles = 0b0010_0101;
long bytes = 0b11010010_01101001_10010100_10010010;
  • ここ はJava 8のドキュメントです。これ以降のバージョンでは、このようなことはできません。
  • ここ は、Java言語仕様v。13の関連セクションです。

最近では、この機能はPythonなどにもあります。

Java 7( 2011年7月リリース )より前の言語(ある場合)には、この特定の機能がありましたか?

9
David Tonhofer

David Arno の回答がない場合、最初に仮説を出した人、ここに調査結果の概要を示します。

数値リテラルの桁区切り記号としてアンダースコアを提供した最初のプログラミング言語は Ada だったようです。別の言語での以前の使用の証拠は見つかりませんでした。

エイダと歴史的証拠におけるその使用

論文で * Adaプログラミング言語の設計の根拠 、6月に発表1979Adaリードデザイナー- Jean Ichbiah et al。、機能は正当化されています2-3ページ:

アンダースコアは、長い数字のシーケンスを分割するために数値内で許可されます。これは、プリンタで長い間認識されてきた要件です。

1978年に公開された Steelmanの要件 にはリテラルに関する明示的な要件がないため、これはイクビアと彼のチームのオリジナルの提案です DoDによる 。ただし、この機能は、保守のための読みやすさのニーズに対応します(要件1C)。

この機能は、1980年7月に公開された 最初に提案されたAda標準 の文法に含まれています(セクション2.4.1)。

他の言語で使用

数時間の徹底的な調査の結果、この機能を他の言語で以前に使用した形跡は見つかりませんでした。

  • Adaプログラミング言語の(非常に)重要なレビュー Adaの隠されたコスト David A. Bennett、Brent D. Kornman、R。Wilson著、公開1982年5月、この機能を不必要な贅沢として批判しました

    この手法を使用することで得られる数値の可視性の向上は、ルールを学習したり、スキャンしたりするコストに見合うものではないようです。 (...)数字列でのアンダースコアの使用は、識別子での使用と不必要に矛盾し、言語に不必要な複雑さを追加します。 "(シック)

  • 他のより最近の広範な分析では、以前の使用法は見つかりませんでした。たとえば、 この記事はここ はAdaに言及し、 Perl は先駆者として言及しています。しかし、Perlは1987年にのみ登場し、その言語がその時点ですでにその機能を持っていたかどうかは明らかではありません。別の Pythonデザイナーによる分析 による分析も、この機能Adaを提供する最も古い言語として引用しています。

  • これは科学的な証拠ではありませんが、 Wikipedia は、現在この機能を備えている12の言語に言及しています。それには、空白を数字の区切り文字として受け入れるFortranと、同じ目的でアポストロフィを使用するC++ 14を追加できます。

もちろん、Adaより前に古い使用法が存在することは不可能ではありません(たとえば、あまり人気のない言語で)、証拠は見つかりませんでした。

12
Christophe