言語デザイナーに何に注意してもらいたいですか?[閉まっている]


38

この質問の目的は、それなしでは生きていけない、または選択したメイン言語で望んでいたプログラミング言語機能のランドリーリストを組み立てることではありません。この質問の目的は、ほとんどの言語設計者が考えていないかもしれない言語設計の隅を明らかにすることです。したがって、言語機能Xについて考える代わりに、もう少し哲学的に考えてください。

私の偏見の1つであり、おそらく議論の余地があるかもしれませんが、エンジニアリングのより柔らかい側面(理由と理由)が、より具体的な側面よりも何倍も重要であるということです。たとえば、Rubyは、開発者の幸福を改善するという目標を掲げて設計されました。それが実現したかどうかについてあなたの意見はまちまちかもしれませんが、目標であったという事実は、言語設計の選択のいくつかがその哲学によって影響を受けたことを意味します。

投稿しないでください:

  • 構文フレーム戦争。それに直面しましょう、私たちには好みがあり、言語設計に関係する構文が重要です。私は、emacs vs. VI(最近では多くの人が何も知らない)の性質の壮大な戦いを避けたいだけです。
  • 「機能Xを持たない言語は存在するに値しない」とコメントを入力します。すべてのプログラミング言語が存在する理由は、少なくとも1つあります。良いか悪いかです。

してください行うポスト:

  • 言語デザイナーが見逃していると思われる哲学的アイデア。
  • 実装頻度が低いと思われる技術的概念。それが引き起こす痛みの例を提供してください、そしてあなたがそれが機能するのを好む方法のアイデアがあれば。
  • 希望するものはプラットフォームの共通ライブラリにありましたが、めったにありません。同じトークンがありますが、通常は共通ライブラリにあるものはそうではありません。
  • すべてのプログラミング言語が適切に実装され、適切に定義されることを望む、組み込みのテスト/アサーション/契約/エラー処理サポートなどの概念的な機能。

私の希望は、これが楽しく刺激的なトピックになることです。

編集: Syntax Flame Warsの意味を明確にしました。特に構文はプログラム言語設計の基本的な部分であるため、構文のすべての議論を避けようとはしていません。


構文は単なる実装の詳細であると言うのは、まったく間違っています。構文設計は、言語設計の基本的に重要な部分です。また、投稿たいポイントの多くは、実際には構文に関係している場合があります。残念。興味深い質問のようです。
コンラッドルドルフ

私が避けたいのは炎戦争です。フレーム戦争を開始せずに構文について議論できる場合は、それを試してください。
ベリンロリチュ

回答:


49

デフォルトでのUnicodeサポート

今日、プログラムは、国際的に使用されるように、または国際的に使用される可能性があるという仮定の下で開発されています。彼ら文字セットのサポートを提供するか、その言語で書かれたプログラムを役に立たなくする必要があります。


2
+1実際、言語自体は、識別子に任意の文字を使用できるようにする必要があります。私たちはみんな英語ではありません。
ベリンロリチュ

13
@ベリン:実際、私はフランス語ですが、英語のプログラムが好きです。問題はコミュニケーションの1つです。ハンガリー語、スペイン語、またはポルトガル語の識別子を使用してプログラムを作成する場合、私がこれまでに飛び込むことを期待しないでください... 、それは識別子、コメント、ドキュメントに共通言語を使用することを意味します。英語は開発者の共通語です。
マチューM.11年

11
言語を使用する場合、Unicodeサポートは自然なものであるべきだと付け加えます。可能であれば、「追加」するために余分な労力を費やすべきではなく、「適切に機能する」場合にのみ「機能する」必要があります。
-RHSeeger

4
関連して、言語はテキスト(文字のシーケンス)とバイナリ(バイトのシーケンス)データを基本的に区別する必要があります。C#はでこの権利を取得stringしてbyte[]。Python 3.xとのようstrbytes。C(++)charはこれをひどく間違っています。
dan04

1
@RHSeeger-確かに!!! Pythonでも、と入力する必要がありますu'My Unicode Štring'。どのタイプの文字列を扱っているかを忘れて、コードを作成することをお勧めします。
-orokusaki

25

私はいくつかあります:

  • ジェネリック/テンプレート。たとえば、Javaジェネリックは強力ですが、必ずしも柔軟ではありません。また、型消去を使用しているため、特にインターフェイスで抽象的に実装する際に問題が発生しました。また、コンパイラは、非特定のジェネリックが使用されている場合に警告するべきではありません(のHashmap代わりにHashmap<String, int>)。大幅に改善できると思います。優れたテンプレートは非常に便利ですが、しばしば無視されます。

  • 標準ライブラリでのGood Dateのサポート。日付、時間、分を加算および減算でき、1970年1月1日以降のミリ秒数を処理する必要がないことを意味します。


2
ただし、「良い日付のサポート」は非常に厳しい要件です。それは一体何の意味ですか?日付と時刻は、万能ではないものの一つだと思います。あなたはそれを単純で間違ったものにするか、それを正しくて不敬に複雑なものにします。良い妥協点を見つけるのは本当に難しいです。
サラ

@kai重要なのは、通常、日付のサポートはかなりひどいことです。古いものにjava.util.Dateは、ほぼすべての問題と問題があります。新しいjava.time.*パッケージの一部しか知りませんが、クリーンで使いやすく、バグがありません。上級ユーザーは問題を見つけるかもしれませんが、それは大きな改善です。+++問題は複雑な問題であり、最初のバージョンが急いで壊れているようです。
maaartinus

24

コンピュータセキュリティ担当者が言語を分析/監査できるようにしてください。

セキュリティ担当者は、出荷前にプログラムの脆弱性を発見できる必要があります。理想的には、早期に呼び出され、開発中にコードベースについてコメントできますが、多くの場合そうではありません。

言語またはコアライブラリの新しいバージョンがリリースされたとき、以前は安全だったものがもはやなくなる可能性があります。

  1. ライブラリがより強力になる可能性があります。たとえば、URLライブラリがサポートされるようになりました javascript:
  2. 文字列やバイトをコードに変換する新しい方法があるかもしれません:例えば、evalまたは逆シリアル化ライブラリ
  3. 言語リフレクション技術がより強力になる可能性があります。たとえば、ローカル変数の公開

これらの変更は、プログラムが持つ悪用可能な権限の量を増やすことができますが、プログラムが使用する権限の量(悪意のないクライアントを処理する場合)は変更されていないため、セキュリティ担当者は集中的にせずにそれを把握することは困難です再監査。

そのため、言語を設計およびバージョン管理する際に私たちについて考えてください。以下にいくつかのヒントを示します。

プログラムを分解できるいくつかのプリミティブを定義します。

HTML5はこの方法で特に悪いです。彼らは明らかにセキュリティに多くの考えを入れており、非常に優秀な人々を持っていますが<video>、古いもののように新しいプログラム要素を指定したり、新しいもの<video>と古いものの<img>両方を指定できる共通の抽象化を作成する代わりに、<video>まだ独自のセキュリティ結果を伴う別の一時プログラム要素。

(静的に型付けされていなくても)静的分析を受け入れやすい言語にします。

セキュリティ担当者は、静的分析を使用してパターンを見つけ、プログラムの一部を除外して、本当にトリッキーな部分に集中できるようにします。

どの識別子がローカル変数であり、どの識別子がそうでないかは明らかです。

たとえば、JavaScriptの古いバージョンと同じ間違いを犯さないでください。これによりx、以下のローカル変数参照かどうかを判断できなくなります(古いバージョンの仕様のリテラルの読み取りによると)。

if (Math.random() > 0.5) {
  Object.prototype.x = 0;
}

function f() {
  var x = 1;
  (function () {
    alert(x);  // Might alert 0, might alert 1.
  })();
}

分解可能なセキュリティを許可する

多くの安全なシステムは、セキュリティの特性を保持する安全なカーネルを中心に設計されているため、セキュリティ担当者は、少量のコードの分析に集中でき、ほとんどのプログラマーが{annoying、pedantic、paranoid}セキュリティ担当者に対処する必要がなくなります。

あなたの言語でそのようなカーネルを書くことが可能であるべきです。あなたの言語のセキュリティプロパティの1つが、URLの特定のサブセットのみがフェッチされるということである場合、カーネルライターはコードを介してすべてのURLフェッチを行うために何かを行うことができますか?または、静的なビルドチェック(インポートの確認など)で同じ機能を提供できます。

Newspeakなどの一部の言語では、オブジェクト機能モデルを使用しています。これは素晴らしく、分解可能なセキュリティを得るための素晴らしい方法です。

しかし、それができない場合、モジュールグラフを静的に分析可能なアーティファクトにすることで、かなりのメリットが得られます。モジュールがファイルI / Oモジュールに到達できないことを証明できる場合(TCBのモジュール内のコードを呼び出すことを除く)、そのモジュールから問題のクラス全体を除外できます。

組み込みスクリプト言語の権限を制限する

多くの便利なシステムは、動的な(関数型の)言語で書かれた多くのコードを開始する静的なコアとして構成されています。

また、スクリプト言語を埋め込むと、システムの拡張性が大幅に向上します。

ただし、スクリプト言語はVMの完全な権限を持つべきではありません。

埋め込みスクリプト言語を許可することを選択した場合、実行者が実行できることを簡単に制限できるようにします。ここでは、オブジェクト機能モデル(上記のニュースピークに関するコメントを参照)が非常に適切です。そのため、スクリプト言語でコードを評価する場合、呼び出し元は実行するコードとそのコードのすべてのグローバル変数を渡す必要があります。

evalスクリプト言語として組み込まれている言語として扱う

言語が独自のコンパイラを呼び出して文字列をコードに変換できる場合、埋め込みスクリプト言語と同じようにサンドボックス化できるようにします。

単純な同時実行モデルを使用する

セキュリティ担当者は、セキュリティプロパティが維持されているかどうかを判断しようとするときに競合状態を心配する必要はありません。

スレッドをセトリングする前のスレッド化の代替手段を、ほとんどセキュリティ保護が不可能なデフォルトオプションとして検討してください。

1つの簡単な方法は、E、Verilog、およびJavaScriptで見られるようなイベントループの同時実行です。

引用の混乱を助長しないでください

一部の言語はグルー言語であり、多くの異なる言語の文字列を処理することになります。

たとえば、JavaScriptは多くの場合、HTML、CSS、XML、JSON、さらにはJavaScriptの文字列を構成します。プログラマーがプレーンテキスト文字列を組み合わせて他の言語の文字列を作成する際に適切にエンコードすることを覚えるのは非常に難しいため、当然ながらJSプログラムにはあらゆる種類の引用混乱問題があります:XSSは最悪です。

文字列構成機能を含める場合は、プログラマのセキュリティ負担を軽減してください。DSL、衛生マクロ、組み込みテンプレート言語は、ライブラリまたは言語開発者に適切に逃げる負担を開発者から遠ざけることで、これを実現する優れた方法です。


美しい故障。
Qix 14

23

最高の言語のいくつかは、自分で言語を作りたい人によって設計されました。

そのため、言語デザイナーはユーザーにあまり注意を払うべきではないと思います。みんなを喜ばせることはできませんし、試みることもできません。


4
それはある程度真実かもしれません。ただし、ユーザーの話を聞いたことがなければ、彼らがあなたの脳の子を使用しようとするとき、あなたが彼らに与える痛みを知ることはありません。その痛みを聞いたり感じたりしなければ、その問題や他の問題を解決する次の素晴らしいアイデアを思い付くことはありません。誰も島ではありません。痛みは、イノベーションの大きな動機となります。
ベリンロリチュ

5
@Berin:ポイントは決してユーザーの声に耳を傾けてはならないということではないと思いますが、意図していないことをするために言語を使用したいユーザーの声に耳を傾けないでください。特定のセットまたは問題を解決するために言語を設計した場合、それらの問題も解決する必要があるユーザーに対応する必要があります。しかし、あなたは極端に対処し、言語は新しいドメインでニッチを見つけることができるので、+ 1します。
ジェレミーハイラー

2
@ジェレミー、はい、それはまさに私が言っていることですが、言語が設計されていないドメインでうまく機能することは珍しいと思います。
dan_waterworth

@dan_waterworth:成功した言語は通常、設計されていないドメインでもうまく機能します。
デビッドソーンリー

8
「ユーザーの話を聞いてはいけない」のではなく、「持っていないユーザーの話を聞いてはいけない」と表現するのがよいでしょう。
chrisaycock

16

実際にコードを書くのに費やす時間は5〜10%だけです。言語設計者は、実際にソフトウェアを機能させることの難しさに注意を払う必要があります。つまり、エラーとバグを修正することです。

つまり、取得から適切なデバッガーが必要です。不可解な構文とキーコマンドを備えたツールは、大量のprintステートメントよりもわずかに優れているだけではありません。


2
+1。デバッグは、一部の言語が他の言語よりも優れている場所の1つです。一部のIDEは、使用可能な言語と邪魔になる言語との違いをすべて生じさせます。
ベリンロリチュ

2
これに少し追加して、可能な場合は有用なスタックトレースについて説明します。エラー(または、言語に応じてキャッチされない例外など)がある場合、使用された引数の値とともに、そのエラーに到達したコールスタック全体を表示できるようにします。Tclはこれを非常にうまく行います。しかし、公平を期すために、すべてがTclの文字列であるため、すべての値を比較的簡単に印刷できます。
RHSeeger

1
デバッグだけでなく、バ​​グの記述を困難にします。Javaが配列の自動境界チェックを導入したとき、私はとても幸せでした...しかし、15年後、ここで私たちはまだ他の言語でそれらの間違いを犯しています。
アレックスファインマン

3
コンパイル時にバグを見つける言語を用意する方が良いでしょうか?たとえば、Adaを使用する場合、CまたはC ++を使用する場合よりもデバッガで費やす時間が大幅に短くなります。
マーティン

12

私が出会った他のどの言語よりも多くのことをしてくれるPythonに注意を払うべきだと思います(そして、あなたがいくつかの機能を嫌っていても)。Pythonをエミュレートする必要があるという意味ではありませんが、Pythonのような言語をまったく作成したくない場合でも、Pythonが正しく動作したことを知ることが重要です。

そこで関連する哲学的アイデアについては、これらはPython of Zenの最も重要なものです。

  • 明示的は暗黙的よりも優れています。
  • 読みやすさが重要です。
  • 特別なケースは、規則を破るほど特別ではありません。
  • 実用性は純度よりも優れていますが。
  • 1つ-できれば1つだけ-明白な方法が必要です。
  • 実装を説明するのが難しい場合、それは悪い考えです。
  • 名前空間は素晴らしいアイデアの1つです。それらをもっとやってみましょう。

これらのルールに従う言語は必ず大丈夫でなければならないと思いますが、これを行うのはPythonだけです。たとえば実装のRubyとのすべての類似点について、Rubyは読みやすさのようなものを逃し、あなたはゴルフをコード化することを勧めます。

Pythonで私が見逃している唯一の技術的特徴は、「until」ステートメントです(whileのようですが、初めて式をテストしません)。次に、Pythonと他の言語の標準ライブラリの両方で改善できるものがたくさんありますが、それは厳密には言語ではないので、それは別の質問です。:-)


4
特に言語設計レベルでは、「ルールを破るのに十分な特別なケースではない」という他の2つのことを重要だと考えています。何千もの特別なケースや難解なルールを持つ言語は、「実用性は純粋さよりも優れているが」と組み合わせて使用​​するのが難しいからです。それ以外の場合は、ターピットをチューリングの領域にドリフトします。

15
明示的が暗黙的よりも優れている場合、なぜ変数を宣言する必要がないのですか?単純なタイプミスがデバッグしにくいエラーを引き起こす可能性がある場合(コンパイル時に捕捉されるエラーや、明らかでデバッグしやすいランタイムエラーとは対照的に)、それは言語IMOに対する大きな打撃です。
メイソンウィーラー

4
@Mason Wheeler:他の言語で変数を宣言する必要がある唯一の理由は、変数がどの型であるかを宣言する必要があるということです。Pythonは動的であるため、型宣言は必要ないため、宣言は必要ありません。それが暗黙的/明示的とどう関係するかわかりません。Pythonの型は明示的です。変数も同様です。10年後、タイプミスがデバッグ困難なエラーを引き起こしたことはありません。実際、デバッグは簡単です。
レナートレゲブロ

8
リストの場合は+1、ファンボーイの場合は-1。大きな成功を収めたすべての言語に注意を払い、それらの要素の適用可能性を組み込むか、少なくとも分析しようとすることは、より実用的なアプローチのように思えます。
スティーブンエバーズ

3
@Lennart:関数の型を明示的に指定できる(ただし、必須ではありません、ルール4を参照)のは良いことだと思います。契約による設計に似ています。それが私がしたいポイントです。
テオベレール

11

あなたのニーズに合わせて言語を変更する機能は、私にとって大きなものです。Lispの場合はマクロで、Tclの場合はアップレベルで行います。それほどではありませんが、Rubyはラムダなどを使用します。利用可能な制御構造の周りに問題を成形するのではなく、問題に合った新しい制御構造を追加できるようにしたいだけです。簡単な例として、一部の言語には存在するが他には存在しない「do .. until」構造は、「while」よりもいくつかのケースを処理するためのよりクリーンな方法であり、他のケースを満たすために新しい構造を追加できることは非常に便利です。

より一般的な意味では、これはメタプログラミングです...しかし、私は主に新しい制御構造を構築するためにそれを使用します。


面白い。適切なメタプログラミングサポートを正しく行うことは困難ですが、そうなると非常に強力になります。Lispが好きな人から、Lispの実装が最高だと聞いたことがありますが、Lispのすべてについてそう言っています。メタプログラミングが正しく行われていると思われる例はありますか?
ベリンロリチュ

「適切なメタプログラミング」は、適切に行うのが簡単な場所(つまり、合理的な単純なアクティビティ)であり、最終結果が言語の自然な部分のように感じる場所でなければなりません。
ドナルドフェローズ

1
変更可能なだけでなく、解読可能な変更。あなたが言語で何かを再マップしたなら、読者として私はすぐにそれを理解できるはずです。これには注釈やその他の外部マーカーが役立ちます。
アレックスファインマン

Mata-LuaまたはTemplate Haskellはこれを提供するのに良い仕事をしていると思います。(Schemeマクロほど良いものではありませんが、それは言語で括弧よりも多くを使用するために支払うものです)
テオベレール

10

最も重要なことは、あなたの言語が「スタイル」を持つ必要があるということです。たとえば、私はCをポインタベースのシステムプログラミング言語と呼びます。Erlangは高度な並行機能プログラミング言語と呼びます。他のいくつかの言語(C ++やほぼ間違いなくJavaなど)は、Allan Kayが「凝集」言語と呼んだものです。フランケンシュタインの言語は、多数の機能が組み合わされて構成されていました。

次に重要なのは、言語自体の変更が最後の手段であるべきだということです。言語のその他の機能と組み合わせると、最も穏やかな響きでさえ複雑になる可能性があります。言語に新しい機能を追加するには、次のことが必要です。

  1. それが本当に必要であることを証明してください。
  2. 図書館ではできないことを証明してください。
  3. 言語に属していることを証明します。

2
言い換えれば、言語には1つの包括的な設計原則があり、言語はその原則と一貫している必要があります。言語の進化についてのコメントは保証されています(これは何度か失敗しました)。
ベリンロリチュ

1
私のお気に入りのC ++の引用を思い出させます... 犬に余分な足を釘付けして作られたタコ。
オコド

4
図書館では出来ないことを証明しろ。+1
Qix 14

2
私は図書館のちょっとしたことが好きです。haskellのような言語に、ループ、例外、継続などの制御フローが組み込まれていないのは素晴らしいことです。言語内で定義するのは非常に簡単で、構文を本当にきれいに保ち、巧妙な言語機能を作成するよりも拡張性と構成性を促進します。
サラ

10

すばらしい質問をありがとう。かなり良い答えが得られています。

あなたの目をglむのではなく、私はプログラマーを情報チャンネルとして見ています。アイデア/概念/要件は一方の端にあり、コードはもう一方の端にあります。

一連の要件(どのように記載されていても)と巨大なホワイトボード上のコードのセットを取り、各要件をそれを実装するコードにマッピングする線を引く場合、そのグラフの複雑さはコードがどれだけ適切かによって異なります要件を表します。理想的には、かなり直接的で1対1である必要がありますが、実際に実行するのは困難です。

言語のドメイン固有性を、そのグラフを単純化する程度として測定します。これは非常に望ましいプロパティであり、適切なクラス/ルーチン(名詞/動詞)の定義からマクロ、独自のパーサーおよびインタープリター/コンパイラーの作成まで、さまざまな方法でアプローチできます。

私が意味することの例を挙げましょう。柔軟なダイアログユーザーインターフェイスの作成の問題については、この手法により、イベントハンドラー、データ移動、通常UIで通常行われるほとんどのことを記述する必要がなくなります。また、ソースコードが約1桁削減されます。メタ言語は、実際にはC / C ++ / Lispのほんの数個のルーチンとマクロであり、マクロのない言語でも実行しました。

コードの5ポイント編集または10で要件を実装できる場合、5でそれを行うとコードが減るだけでなく、ステップを見逃してバグを入れる可能性が少なくなります。そのため、言語がドメイン固有であるほど、コードは小さくなり、保守性が高くなり、バグがなくなります。私たちはそれに向けてどのように運転するかを知る必要があると思います。読者がテクニックを理解するために学習曲線に投資していない限り、コードが読みやすいという意味ではありませ


9

PascalやAdaのような有界および個別の整数型。正直に言って、どのくらいの頻度で整数の全範囲が必要ですか?プリミティブ型では、実世界をよりよく表現するために改善すべき点がたくさんあると思います。


2
C、C ++、D、Java、C#などの境界付き整数型には、確実な場所があります。一部の種類のプログラミングは気にせず、単に整数と浮動小数点の区別が必要なだけです。それでも、おそらく数値型が必要なだけで、後で数値の整数部分を心配するのでしょうか?要するに、ビジネスプログラミングは、数値が整数であるという事実よりも、特定の整数型に敏感ではありません。低レベルでプロトコルを実装する場合、ルールは大幅に変更されます。
ベリンロリチュ

2
type Date_Of_Month is 1 .. 31;16ビットや32ビットなどの決定をオプティマイザーに委ねるだけのAdaで、型が好きだと思ったこと。しかし、もっと重要なのは、型の変数に32または0または-5を割り当てることですRANGE_ERROR
マーティン

範囲は、使用する明らかな範囲があるDate_Of_Month(またはMonth_Of_Year)などの場合にうまく機能しますが、多くの場合、おそらくほとんどの場合、あいまいです。 type Persons_Age is 0..120?誰かが長寿記録を破ったらどうなりますか? type Year is 0..9999?あなたがエジプト学者ならどうしますか?
dan04

あなたがエジプト学者であれば、あなたは気付かずに必要type Egyptian_Year is -9999 .. 300;です。私の経験では、ほとんどの場合、整数の有用な境界を見つけることができます。この点でtype Scrolls_Found is array Egyptian_Year of Natural;、配列インデックスとして無制限の型を使用することはできません。これは、ハッカーにとっての単なる攻撃ベクトルです。ところで:Adaは、実行時に範囲の境界を計算することを許可します。
マーティン

1
@kai誰も、型システムのこの特定の機能を例外なくどこでも使用する必要があるとは言いませんでした。Adaは「通常の」数値型の使用も許可していると確信しています。そして、いくつかの(やや一般的な)問題には、制限付き数値型が確かに役立ちます。
セージボルシュ

8

プログラミング言語を習得すると使いやすくなる機能があります。また、使いやすく習得できる機能もあります。言語のユーザーは理想的には長期的な関係を持っているため、使いやすさを最適化することは、学習を容易にすることを最適化するよりも優れています。物事を必要以上に難しくしないでください。しかし、言語に精通していない人に読みやすくするために表現力を犠牲にしないでください(多くのことをする小さなコードを書くことができます)。一方、この言語は、長年使用してきた人々にとっては回線ノイズのように読まれるべきではありません。それは使いやすく、習得しにくいでしょう。


8

命名規則(私はあなたを見ていますPHP)


ただし、言語設計の問題はそれほどありません。確かに、標準ライブラリに入るものに常に注意する必要がありますが、言語デザイナーは命名規則を強制できません;)

3
標準ライブラリが可能です。
マルフィスト

3
PHPについても言及しないでください。最も一般的に使用されている言語。コンピューター科学者によって設計されたのではなく、テンプレートが必要な男だけで、ステロイドが追加されました。
-Keyo

@delnan:MercuryやEiffelなどの一部の言語は、命名規則(すべての大文字のクラス名、大文字で始まる変数など)を課し、コンパイラーによって強制されます。Fortranは、i、j、kで始まる変数は整数であると述べました(したがって、ほとんどの言語でループ変数としての伝統的な使用法です...)。等々。慣習が気に入らないのであれば、どういうわけか迷惑ですが、少なくともソースコードの一貫性には適しています。
ピロ

@PhiLho:それは非常に限られています。一貫性のある、意味のある(人間の読者にとって)大文字またはアンダースコアの使用を強制することはできません(試行することはできますが、プロセスのプログラマーの正気を脅かすことになります)。

7

開発環境との最高の統合。

現在、コーディングは豊かな環境で行われています。HTML / CSS / JSには、Firebugおよびその他のインタラクティブツールがあります。Java、Eclipse、IDEA、およびその他の真のIDE向け。などなど。ツールのエコロジーがあり、エディターから始まり、そこで終わるわけではありません。

  • ファイル内およびファイル間のコードの編成
  • スマートな強調表示
  • スマート補完/予測タイピング
  • 静的デバッグ(構文、セマンティック、およびスタイルのエラーにフラグを立てる)
  • テンプレートとマクロの作成と使用
  • バージョン管理(バージョン管理、マージ、分岐など)
  • 複数の作成者による分散開発(コメント、インラインドキュメント、注釈など)
  • 実行時デバッグ(スタックトレース、ステップ実行、監視など)
  • インタラクティブな「ライブ」デバッグ(Firebugのような-ライブシステムの動作の編集)
  • ...次は何もわかりません。

これらのアクティビティをサポートする言語を構築する必要があります。たとえば、他の開発者がコードの意図を理解するのを支援するために、Javaで注釈が付けられています。

しかし、ほとんどの場合、コメントで$ Id $を使用してCVS制御のソースにバージョン番号を含めることができるなど、ハッキングされています。言語自体からこのようなことをできないのはなぜですか?


ASIS(ISO / IEC 15291:1999“ Ada Semantics Interface Specification”)のようなものですか?ASISはあなたが望むすべてをカバーしているわけではありませんが、かなりたくさんあります。私は他のプログラミング言語用のASISのようなものをしばしば望んでいました。詳細については、sigada.org / wg / asiswgを参照してください。
マーティン

コードの編成、構文の強調表示、コードの折りたたみ、バージョン管理、テンプレート/マクロなど、これらの作業のいくつかは比較的安価で、IDEから無料で提供されています。ランタイムデバッグ、静的デバッグ、スマート補完/予測タイピング、リファクタリングなど、さらに多くの労力が必要な場合もあります。IDEプラグインについても考慮する必要がある場合、一貫した言語の設計はしばしば無視されます。
ベリンロリチュ

6

分散計算

無料のランチは終了しました。今日では、複数のコア/複数のプロセッサ(および特別な状況では複数のコンピューター)で実行するプログラムが必要です。

残念ながら、マルチスレッドコードの記述は概念的に難しいため、言語を障壁として追加する必要はありません。

futureのC ++ 0xの使用、ライブラリとして提供されており、実際の同期の問題から解放されないという点で、確かに興味深いものです(ご存知のように、簡単に解決できるものです...)

私はGoが本当に好きですの問題に対するアプローチが。マルチスレッドが組み込まれており、採用されたアプローチ(チャネルとゴルーチン)は、従来のセマフォ/ミューテックス/ロックアプローチよりもはるかに簡単な考え方を設定します。ただし、非同期構造に同時にアクセスすること(Goにはポインターがあります)またはデッドロック(チャネルでの待機のサイクル...)

関数型言語のように、データの不変性を好む言語にはその権利があると思います(しかし、私はそこでの経験が好きです)。

また、アクターモデルが次のターゲットになる可能性があります。分散コンピューティング向けでもありました。


別の例はErlangです。この種の言語に共通するテーマは、何も共有しないアプローチです。このアプローチでは、基本的にメッセージとともに状態が渡されます。アプローチは適切に拡張されます。
ベリンロリチュ

@Berin:そのとおりです。メッセージでErlangを引用していませんが、ほとんど知らないので、アクターモデルを実装していることを正しく思い出します。
マチューM.

6

私を夢中にさせてください。しかし、私にとって最も重要な言語機能の1つは、優れたオンラインリファレンスとサンプルの入手可能性です。どの言語でも良い検索結果を見つけることができることは知っていますが、MSDNとJava APIのサイトは本当に気に入っています。特定の言語の経験があまりない人にとっては、プログラミングがずっと簡単になります。


JavaDoc、CppDoc、RubyDocなどは、作成したライブラリだけでなく標準ライブラリを理解する上で優れた資産です。それらはすべて平等に作成されているわけではなく、他のものよりもナビゲートしやすいものもあります。
ベリンロリチュ

同意しました、Java APIサイトは優れた資産です。APIドキュメントを作成するための標準形式も用意されています。JavaDoc(netbeans)の分析をサポートする組み込みのIDEを使用することによる生産性の向上は驚くべきものです。私は恐ろしい記憶を持っていますが、おそらく他の人よりも私に多くの利益をもたらします。
toc777

6

コンパイラーがコードをチェックするのを支援するより多くの機能。

組み込みシステムプログラマーであるため、私は常にCを使用します。しかし、検証できるように、コードに期待することをコンパイラに伝えるためのより良い/より良い方法があればいいのです。

例えば、私は機能を持つことができます

f(int x)

しかし、私は好むだろう

f(int range[-5..25] x)

EG LispやHaskellのような高レベルの関数型言語を使用して、関数に関するアサーションを書きたいと思います。これらはコードにコンパイルされませんが、静的または動的分析に使用できます。


本質的に境界チェックを行う効率的な方法は?それはかなりクールだろう。ただし、少なくともランタイムチェックとコンパイル時チェックに含める必要があります。データベースまたはユーザーインターフェイスから情報を取得する場合、値が有効であることを常に保証します。これが言語機能であれば、これらの目的にも使用したいと思います。
ベリンロリチュ

3
パスカルを使用する必要があります。-5..25など、コンパイラがコンパイル時に検証できる任意の範囲の数値をカバーするタイプを定義できます。(もちろん、定数のみを割り当てている限り。)
メイソンウィーラー

1
@Kugel:コンパイラー機能以外にアサートしているものは何ですか?また、単体テストでは本番環境でコードをチェックしません。そして、本番でチェックインしないことは、処女航海の後にライブボートを離陸するようなものです。燃料を節約し、船をより速くするため。
マーティン

1
私が作業しているプラ​​ットフォームにAdaコンパイラがないことを除いて、Adaを使用します。Cコンパイラのみを備えているため、いずれにしてもアカデミックです。
Rocketmagnet

1
私はすでに多くのアサートを使用していますが、これと他のものを言語機能として持っているとさらに良いでしょう。
Rocketmagnet

5

冗長な構文は習得が難しく、読みやすさを向上させないため、可能な限り少ないキーワードで小さな構文を作成します。

最悪の例はAdaです。

procedure Hello is
begin
  Put_Line("Hello World!");
end Hello;

のようなフィラー語は、プログラミング言語では意味がありません。


4
最悪の例はあなたが言う言語ですpublic static void
ジョーイアダムス

1
アイデアは新しいものではなく、キーワードのないSmallTalkの形式で既に実装されています。したがって、SmallTalkを主張の肯定的な例として使用する必要がありました。BTW:のIS目的がわからない場合、Adaを理解できません(Adaをプログラムしたことがありますか?):ISプロシージャ宣言をローカル変数の宣言から分離し、仕様と実装を区別します。もちろん、関数の仕様と実装を比較してIS、完全な意味を持ち、フィラーではないことを確認する場合にのみ気付くでしょう。
マーティン

1
言及するのを忘れました:SmallTalk構文は、ポストカードの裏にも収まります。そのため、「小さな」という欲求も満たされます。もちろん、ここでのほとんどのアイデアはどこかの言語ですでに実装されており、ここでのほとんどのポスターは、誤った否定的な例を作る代わりに肯定的な例としてその言語を使用しています。十分な評判を嫌うなら、あなたを投票します。あなたのアイデアが悪いからではなく-否定的な例を使用するため。
マーティン

7
フィラーワードは、構文を明確にするのに役立つ場合、実際に目的を果たします。例えば、私はあまり好みif x then …if (x) …。コンテキストキーワードの括弧を交換しました。これは、条件xが独自の括弧を持つ複雑な式である可能性があるため、理にかなっています。最も外側のペアを削除すると、読みやすさが大幅に向上します。もちろん、Pythonのように、ここでコロンを使用することもできます。実際、このような曖昧さを解消するフィラーのほとんどはコロンに置き換えることができると思います。私が好む方法がわからない。
コンラッドルドルフ

3
@Konrad:構文を曖昧にする場合、それはフィラーではありません。Ada あいまいさなしに許可できたため、これis フィラーです。procedure Hello begin ... end
dan04

4

もっと学習言語を見たいですすべてのトークンの間にスペースを必要とするなどの聖なる制限がある絶対的な初心者のための言語だけでなく、すでにプログラミングを知っており、新しい概念を学びたい、またはプログラミング全般を良くしたい人のための言語。

私にとって、Haskellは、「学習言語」とは何を意味するのかという素晴らしい例です(ただし、長年にわたって人気と一般的な有用性も高まっています)。おなじみのCの構文を放棄し、後方関数合成演算子を有することにより(例えば(+2) . (*3)、3を乗算機能で、その後 2が追加されます)、Haskellは短い関数を書くことを教えてくれました。その冷酷なタイプチェッカーは、言語をより早く学習し、コードについて論理的に考える能力を向上させました。これらの利点は両方とも、他の言語、さらにはアセンブリにまで波及しています。

言語学習の目標と汎用言語の目標はしばしば対立します。学習言語は、学習するのにやりがいがあり、やりがいがあり、特定のスタイルが多くのアプリケーションに最適ではない場合でも、そのスタイルを実施する必要があります。汎用言語は、物事を成し遂げるのに適している必要があり、抽象化の使用は慎重に測定し、「意味をなす」必要があります。例えば、ウェブサイトを修正するとき、モナドについて学ぶことはプログラマーの心の最後のものです。コインの反対側では、誰かがプログラミングを学んでいるときに、機能についてまだ学んでいないのであれば、「パブリックスタティックボイド」のナンセンスをうろうろする必要はありません。

あなたが言語デザイナーなら、あなたの言語が学習言語であるか応用言語であるかどうかを考えてください。これにより、設計で純度をどの程度使用するかが決まります。


2
Haskellの関数構成はどのように逆になっていますか?の直接翻訳です(f ∘ g)(x) = f(g(x))
ジョンパーディ

@Jon Purdy:これは、アプリケーションを逆の順序で関数を記述する必要があることを意味します。どちらの形式でも、g最初に引数に適用され、その後にが適用されfます。リストをソートし、グループ化し、それらのリストの最初の項目を取得する場合は、(map head . group . sort) listまたはmap head $ group $ sort listまたはを記述しますmap head (group (sort list))。すべての場合において、操作を逆方向に書くことになります。ちなみに、インポートControl.Arrowすると言うことができます(sort >>> group >>> map head) listが、>>>オペレータは私にはかなり厄介で冗長に見えます。
ジョーイアダムス

2
私は知らない、私はまだ右から左の方が理にかなっていると思う。(map head . group . sort) list「ある種の各グループの最初のアイテム」として読み取りますがlist、これは非常に自然です。私の耳には、(sort >>> group >>> map head) list「ソートしてグループ化し、各グループの最初のアイテムを取得する」とむしろ命令的かつ逆方向に読み取るよりも機能的です.. list"。
ジョンパーディ

@JoeyAdams - 冗長むしろ厄介とオペレータのルックス -いくつかのより多くの最近の関数型言語を使用して開始している目に少し楽かもしれないです左から右への連鎖オペレーター、など...>>>|>
ジュール・

4

2011年なので、

  • 完全に完全な仕様。Cのようなアーキテクチャ依存の穴はありません
  • マルチスレッドのサポート。同期機能(ロック)だけでなく、ループを書くのと同じくらい簡単にマルチスレッドを作成する言語機能:

    all(o in myCollection){o.someMethod()}

  • マルチパラダイム; プログラマーに、ケースバイケースで静的言語のコンパイル時の安全性と動的言語の簡潔さのどちらを望むかを決めさせてください。オブジェクト指向機能、機能機能などを教えてください

  • 一貫性(一貫性とマルチパラダイムの両方を少し求めていることがわかります...)


完全な仕様を実現するために、100%協力しています。マルチパラダイムと一貫性は間違いなくバランスのとれた行為になります。動的パラダイムの一連の動作を静的チェックの動作のサブセットとして指定できますが、これら2つのアプローチは非常に異なるプログラミングスタイルに役立つと思います。彼らは本当にその時点で別個の言語であるべきではありません。おそらく、100%の互換性を持つ一貫した言語のペアがあなたが探しているものでしょうか?
ベリンロリチュ

Scalaのような言語(そしておそらくHaskell?十分に知りません)は、型推論と暗黙のおかげで、強力な静的型システムと簡潔さを持っています。
ピロ

2
言語がプログラマーに重要または重要でないものを指定させる場合、アーキテクチャー依存の機能は問題ありません。Cを恐ろしいのは、「65536を法とする数値型」を宣言する方法がないことです。プラットフォームがuint16_tを実装している場合でも、標準では、一部の実装では2つのuint16_t値の差を符号付きとみなし、他の実装では差を符号なしとみなす必要があります。プログラマーが望ましい動作を指定する方法を提供しません。
supercat 14年

マルチパラダイムには同意しません。コーディングスタイルの戦いには余りにも多くの余地があります。ライブラリAは、多数の動的なパラダイムで記述されています。ライブラリBは、静的パラダイムの束で書かれています。さて、今ライブラリAはライブラリBと話す必要があります。中間点はどこですか?同じ言語の2つのコードの間に接着剤を記述する必要がある場合、その言語には本質的に欠陥があります。
Qix 14

3

軽量プロセス

Erlangのように軽量プロセスが欲しいです。これは主にランタイムの問題です。これは、JVMおよび.NET CLRにはありません。LWPは、大規模な並行ソフトウェアの作成に役立ちます。理想的には、言語でオブジェクトを作成するのと同じように、プロセスを作成するのに費用がかからないはずです。私のアプリケーションで何百万ものプロセスを作成したいと思います。

これは、プリエンプティブスケジューリングを備えたスレッドプールとして実装されているため、1つのタスクが他のタスクをブロックすることはなく、使用可能なCPUコアでタスクをスケジュールできます。

末尾再帰のサポート

末尾再帰をサポートしたいと思います。これは、ランタイム環境にとっても問題になる可能性があります。たとえば、JVMは末尾再帰をサポートしていません。

簡単な分散プログラミング

Erlangと同じネットワード上の他のマシンで実行されているアプリケーションの一部への送信()および受信プリミティブをサポートしたいと思います。これにより、分散データストアなどのスケーラブルなアプリケーションを簡単に構築できます。言語に組み込まれているシリアライゼーションに追加されたものも、アーランのように非常に役立ちます。また、Javaのように手動で行う必要はありません。



Scalaには末尾再帰があり、JVMにコンパイルされます。IBM Javaコンパイラーも末尾再帰を実行できます。
マーティン

3

メタプログラミングを促進します。

特殊フォームを制限する

Pythonでは、組み込み関数ではなく印刷するのに十分な理由はありません。それは、括弧とは何も関係ないことを除いて、関数のように見え、機能します。

私たちは本当に必要ですかforforeachwhileおよび独自の特殊な形態として、それぞれのように。1つのループ構造といくつかのデフォルトマクロは、バリアントループ形式の構文糖を提供します。

特別なフォームのメタプログラミング

form['if'](test-fn, body-fn)


少なくとも反復可能なオブジェクトは通常each、コードブロックを引数として取るようなメソッドを持っているという意味で、Rubyにはループ用の「特別な形式」があります。(Rubyにはforand whileループもありますが、自尊心のあるRubyプログラマーが実際にそれらを使用することはありません。)
mipadi

@mipadi:私はRubyブロックと関連するイディオムの大ファンです。
ダイエット仏

おそらく彼らは思う-あなたはあなたの目を撃つでしょう。:)私の推測では、それはあなたがたがすべての強力な「Python」と「正当な理由がない」の関連だった。それにもかかわらず、メタプログラミングは有効な言語設計の問題であり、しばしば無視されます。そのため、これに賛成します。
ベリンロリチュ

@Berin:私は実際に使用していますが、Pythonのファンであり、Pythonをより面白くしています。
-Dietbuddha

ループの1つのタイプは、コードのフローを不明瞭にします。たとえばdo..while、最上部に評価があるループのタイプが1つある場合、ループはどのように見えますか?do..whileループのようには見えません。
Qix 14

2

ネットワーク機能

一部のネットワークサポートなしで出荷される言語は、今日の世界ではかなり不十分です。

ほとんどの実際のアプリケーションは、何らかのネットワークを介して通信する必要があります。

  • 自動更新
  • データベースアクセス
  • ウェブサービス

もちろん、分散/クラウドコンピューティングサポートの基盤でもあります。


8
ただし、標準のライブラリ機能としては問題ありません。
ドナルドフェローズ

@Donal:私は別のことを言ったことはありません(少なくともそうは思わなかった)。質問は言語とライブラリの両方の機能に開かれています。私のポイントは、言語パッケージを受け取り、そこにネットワーク機能がない場合は、後でよりもむしろ早く痛みを埋めることだということです:)
Matthieu M.

3
標準ライブラリは実際に言語体験の一部であり、同じ注意と敬意を持って扱われるべきです。標準ライブラリのこの要件にも同意します。
ベリンロリチュ

1

習得が容易で、新しいものを作成するために簡単に結合できるプログラミング言語が好きです。

例えば、何かを書くための多くの方法を持つことは魅力的ですが、私はそれを書くために1つか2つの方法しか持たない方が良いと思います。そうすれば、プログラムの保守が簡単になります。

すべての要素に概念を適用できる言語は非常に役立ちます(これは直交性と呼ばれます)。したがって、次回新しい言語機能に直面したときに、その使用方法を推測できます。

コンパイル/解釈段階でパフォーマンスを向上させるために言語構文が邪魔されることがあることは理解していますが、言語デザイナーがこの作業を開発者に委ねていると感じることがあります。たとえば、JavaまたはJavascriptの複数行の文字列。

最後に、言語構文はユーザーインターフェイスであるため、明確で簡潔で直感的で使いやすく、習慣を尊重する必要があります。


直交とは、各機能が異なることを行うことを意味します。grepやawkなどのツールを見てください。彼らは一つのことをよくします。次に、それらを異なる順序で接続して、必要なことを行います。
テオベレール

1
  • 読みやすさ:文法で使用される記号が少ない/小さいほど、よりきれいになります。
  • オブジェクト指向型:関数ではなくメソッド。
  • 理解しやすい:組み込みの流interfacesなインターフェイス、ライブラリクラス/インターフェイスおよび並べ替えの包括的で短い名前。

1
申し訳ありませんが、これについて完全に間違っているため、-1を与える必要があります。簡潔さはコードをより速く書くのに役立ちますが、特定の最小値を超えてコードをより読みやすくすることはほとんど間違いありません。これらの余分な単語や記号は何かを意味し、プログラマーに意味のある情報を伝えるので、特定のレベルの冗長性はコードを非常に読みやすくします。あなたの頭の中のそれのモデル。
メイソンウィーラー

私にとって、きれいなコードは読みやすいコードです。また、PHP配列で「=>」の代わりに「:」を使用するか、「。」を使用することも最小です。「->」の代わりに、確かに改善されます(そして、すでにPHPを楽しんでいます)。
-dukeofgaming

4
@メイソン:私と多くの優れたテクニカルライター(例:ウィリアム・ジンサー)は同意しません。冗長性は読みやすさの敵であり、簡潔さではありません。
コンラッドルドルフ

2
私は記号で定義された簡潔さの形に行きます。読者が自然に単一の記号として扱うものである限り(たとえば、単語は記号です)、複数文字の記号には非常に満足しています。
ドナルドフェローズ

1
最初のポイントは、後者の2つと直接競合します。
Qix 14

1

既存のプログラミング言語に機能を追加します。したがって、新しい言語Bは古い言語Aと機能Xです。

既存の例:

  1. Cクラスの追加=> C ++
  2. Javaが何かを追加する=> C#

2
これは非常に単純化されすぎています。より良い例は、CとObjective-Cの違いです。
ジョンパーディ

0

テクノロジー/プラットフォーム/言語/データベースなどに関しては、ほとんどの場合パフォーマンスに影響します。将来、多くのソフトウェアがグラフィカル言語を使用して設計される可能性があります。これは、より強力な計算能力があるためです。

計算能力と、アプリケーションを設計する言語があり、言語の詳細を心配する必要のない日を願っています。

更新: そのような言語LabViewへのリンクを送信します

更新: 「計算パワフル」とはどういう意味かをもっと説明する必要があります。コンパイルされたソフトウェアのパフォーマンスは、構文言語に基づいたコンパイルされたソフトウェアほど強力ではない場合があります。グラフィカルプログラミングをより高いレベルのプログラミングと考えており、オーバーヘッドが増える可能性があります。今日のコンピューターは、グラフィカルプログラミング言語を簡単に実行できます。


3
これを行うには、コンピューターは既に十分に強力です。何らかの理由でコードを理解する必要があるため、実用的ではありません。
ジェレミーハイラー

2
まだ一種の言語です。これを実現しようとする試みは複数あります。UMLツールは一定量のコードを生成しますが、モデルが十分に詳細に機能する製品を作成できる場合、コードを理解することはできなくなります。Unix環境にはアプリケーションのグラフィカルな配線のための何かがあったと思いますが、それを正しくするには多くの設定が必要でした。ワークフローエンジンはこのメタフォアを使用して、非プログラマがワークフローを設計できるようにします。
ベリンロリチュ

1
要するに、一般的にはこのアプローチの有用性を真剣に疑いますが、現在使用され、そのアプリケーションに適している特定のアプリケーションがあります。Re:your points ... 1.コンピューターには計算能力があり、技術的な側面は問題ではありません。2.問題は、詳細に迷うことなく一般的な意味で作業を行うのに十分な表現力のある視覚言語を提供することです。ニッチアプリケーション以外では、テキストはプログラムをはるかにコンパクトに表現しているようです。それが提起された質問に適用されるため、私は賛成票を投じました。
ベリンロリチュ

1
@アミール:それでは、「グラフィカルプログラミング」がソフトウェア開発を促進するためにコンピューターをより強力にする必要がある理由を説明してください。
ジェレミーハイラー

7
@アミール:技術的な制限とより根本的な制限を混同している。グラフィカルなコンピューター言語があまりないのは、それらをうまくやる方法がわからない(そして、うまくやれるかどうかわからない)からです。私はLabViewを知っていますが、LabViewで複雑なことをしたり、単純なことを変更したりすることについて、十分な愚痴を聞いています。また、このような言語を設計するために、より強力なコンピューターは必要ありません。そのため、このような仮想言語でサンプルプログラムをスケッチしてみてください。
デビッドソーンリー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.