プログラミング言語をどのように設計しますか?[閉まっている]


41

プログラミング言語を設計する場合、どうしますか?どの機能を追加しますか?何を残しますか?静的または動的に型付けされましたか?強くまたは弱く入力されましたか?コンパイルまたは解釈されましたか?答えを正当化します。


12
この質問は曖昧すぎます。言語の機能は、言語の目的が決定されるまで、実際には議論できません。
blucz

1
投票して、これが有用な質問であると思う場合、または以下に有用な回答がある場合は、投票してください。StackExchangeサイトは、優れたコミュニティを構築するために投票が必要です。1日に30票を投じることができます。無駄にしないでください。特に評価が高く、投票数が少ないユーザーは、こちらをお読みください。meta.programmers.stackexchange.com
questions

3
1つのメソッドで非常に高レベルの言語を作成します:public void DoWhatIMeant();
デイブ

6
理想的なプログラミング言語は?...私はコンパイラーに私の心を読んでもらい、私が望むように正確にプログラムを生成させます。
WalterJ89

2
コンパイルと解釈は...言語の特徴ではなく、コンパイラーまたはインタープリターの特徴です。すべての言語は、コンパイラーまたはインタープリターによって実装できます。そして実際、それらのほとんどすべてがそうです。ルビー、Pythonの、ECMAScriptの、PHP用のコンパイラがありますが、C、C ++、Javaの、ハスケル、...のために通訳がある
イェルクWミッターク

回答:


55
  • 関数型プログラミング言語が普及することは間違いないので、私の言語は機能するでしょう。関数型プログラミングによる効果の調整を参照してください

  • CPUにはすぐにコアの数百があり、スレッドは管理するのに大変なことになると思います。したがって、アクターモデルはスレッドではなく必須です。Erlang-Concurrent Worldのソフトウェアをご覧ください

  • また、OOPが失敗し、オブジェクト間の通信は非同期であると想定されたと思います。そのため、不変のメッセージでメッセージを渡す必要があると思います。送信して忘れる。アクターモデルのように。参照してください。間違ったパス:オブジェクト指向プログラミングを?

  • 静的型付けは良いと思いますので、開発サイクルの早い段階でエラーをキャッチします。しかし、Haskellのように型推論を使用するので、開発者はC、C#、Javaのようにコードのどこにでも型を記述する必要がありません。Learn You A Haskell for Great Goodご覧ください

  • 私はまた、デザインでしょう偉大なUIライブラリをして、宣言型レイアウト WPFとAndroidのように、。しかし、Functional Reactive Programmingのようにそれを持ちたいです。

したがって、私の言語は、Erlangの並行性のようになりますが、Haskellのように入力し、WPF.NETのようにGUIフレームワークを使用します。


4
素晴らしいUIライブラリを除いて、実際はScalaのように聞こえます。
猿の稲荷

scalaにはメッセージパッシングとアクターがいると思いました。私はそれがOOPにどのように関係していないと思います。
猿の稲荷

@ジョナス:見栄えが良い:)俳優モデルについてあまり知りません、それはGoがゴルーチンでしたことと似ていますか?
マチューM.

1
私が疑っているのは静的型付けだけです。私は間違いなく、弱い型付けよりも強い型付けを好みますが、静的型付けは制限が強すぎる場合があります。しかし、私はHaskellに慣れていないので、タイピングシステムについて良いことしか聞いていません:)
sakisk

1
率直に言って、OOPの失敗は、「オブジェクト指向」言語が実際にそれを実装することはほとんどないということです。最も単純に、オブジェクトモデルを手続き型言語に靴べらし、それを1日と呼ぶ。Smalltalkがすべての手続き型言語ウィニーに「ええ、私たちはそのようなことをすることができます」と言って、OOPのポイントを完全に見逃すことを促すのではなく、Smalltalkがもっとそれ自体を理解したことを望みます。
cHao 14

22

注:Cのような構文を使用してこの投稿の機能を説明しましたが、すべてのキーワードがCAPSのように馬鹿げたものでない限り、構文自体については気にしません。

1.入力システム

私が言語で望む一番の機能は、オプションの動的型付けを伴う静的型付けです。その理由は、静的型付けを使用すると、a)遅延ではなく早期にエラーをキャッチし、b)言語が区別するかどうかにかかわらず、ほとんどのコードが暗黙的に静的に型付けされるためです。ただし、動的な型指定が非常に役立ついくつかのユースケースがあります。たとえば、ファイルからデータを読み取る場合、多くの場合、さまざまなタイプのフィールドがあり、動的な型付けにより異種コンテナが簡単になります。したがって、私の理想的な言語には次のようなものがあります。

//variable declarations
int anInt = 42 //anInt is now irrevocably an integer and assigning another type to it is an error
vartype aVariable = 42 //aVariable is currently an integer, but any type can be assigned to it in the future

//function definitions
int countElements(Collection c)
{
  return c.count();
} 

//c HAS to be a collection, since countElements doesn't make sense otherwise

void addToCollection(Collection& c, vartype v) 
{
  c.append(v)
}

//c is passed by reference here

2.コンパイル済みと解釈済み

言語を事前にコンパイルするか、JITコンパイルするが、純粋に解釈されないため、速度が理由です。これは、最適化コンパイラ/ジッターが静的に型付けされたコードを最適化する時間をはるかに容易にし、動的に型付けされたコードをそのまま残すことができるため、ポイント1に結び付けられます。

3.クロージャー

言語は関数型プログラミングの構成をサポートする必要があり、関数はファーストクラスのオブジェクトでなければなりません。

4.オブジェクト指向

この言語では、オブジェクト指向のコードを記述できますが、単純な命令型コードも許可する必要があります。つまり、次のようなhello worldプログラムを作成できるはずです。

int main(string<> args=null)
{
  printf("hello, world"); 
  return 0;
}

// this code also demonstrates two other features,
// default arguments for functions (not explained further)
// and immutable lists like string<> (see 6. Built-in datatypes)

5.名前空間

名前空間は良いことです。グローバルな名前空間に入れるものはほとんどありません。しかし、グローバルな名前空間に何かを置く必要がある場合は、できます(ala C ++)。

6.組み込みデータ型

言語には、組み込みデータ型として次の構造が必要です。

  • 1 intつまたは複数のデータ型。intタイプが1つしかない場合は、範囲を無制限にする必要があります。さらにある場合は、計算結果を保持できる最小の型に暗黙的にアップキャストする必要があり、無制限の範囲型が最大になります。
  • floatIEEE 754と同等の単一の組み込みバイナリタイプdouble
  • list二重リンクリストまたは各要素へのポインタを保持する連続したメモリのブロックとして実装される可変タイプ
  • list配列のように機能するが、作成後にサイズを変更できない不変の型
  • 可変および不変のstringタイプ。デフォルトは不変です。
  • 可変であり、不変のキーと可変および/または不変の値を保持するmapまたはdict型。
  • 組み込みのコレクション型は、デフォルトで同種型である必要がありますが、vartype必要に応じてd
  • booleanタイプ
  • A nullまたはnone任意の型の変数に割り当てることができるタイプ。
  • 可変set型および不変型
  • decimal10進浮動小数点変数を実装する型
  • fixed固定小数点数を実装するタイプ、

decimalfloat及びfixedタイプは共有する必要があり、正確なそれらの透過に渡され、関数から返されることを可能にする、(いずれかの相続またはダックタイピングを介して)同じパブリックインターフェイスを。親タイプを呼び出すことができますreal

7.値と参照による呼び出し

値と参照の両方で関数を呼び出すことができます。デフォルトは値です(つまり、引数のコピーが作成され、関数内で操作されます)。

8.ポインター

言語にはポインターが必要であり、ポインター演算を許可する必要があります。ポインターは静的にのみ入力できます(悪夢を回避するためvoid*)。vartypeポインターは明示的に禁止されています。ポインターとポインター演算を使用すると、この言語をシステムプログラミング言語として真剣に使用できます。

9.インラインアセンブリ

8.に関連して、言語は、必要な状況でインラインアセンブリ言語コードを許可する必要があります。

10.安全性

この言語は、例外処理などをサポートするために、ほとんど安全に使用できる必要があります。ポインター演算とインラインアセンブリは、安全でないと明示的にマークされたコードの部分に委ねることができます。安全でないコードは許可されますが、強く非推奨です。

11.未定義の動作

言語標準では、明示的に安全でないとマークされたコードを除き、すべての状況でプログラムがどのように動作するかを指定する必要があります。つまり、安全でないブロック以外に未定義の動作がありません。これにより、この言語を実行可能なアプリケーション開発言語として使用できますが、OSを記述することもできます。

現時点で考えられるのはこれだけです。しかし、もっと多くのことを考えて、投稿を編集/更新します。


5
「Dプログラミング言語」のを見てみましょう:digitalmars.com/d
Wizard79

私が覚えている限り、Dにはオプションの動的型付けや組み込みの無制限の範囲整数型はありません。整数型はそれほど大きな問題ではありませんが、オプションの動的型付けがないため、非常に魅力的ではありません。
チンマイカンチ

1
decimalここに実際に型を追加します。
コンフィギュレー

3
「任意の型の変数に割り当てることができるnullまたはnone型。」—ブール値を含む?:-p
ティムウィ

1
元の投稿に「柔軟」とは表示されません。インラインアセンブラーは、プログラミング言語の最重要要件として思い浮かぶことはありません。たぶん、Felix von Leitnerによると、最近ではAssemblerを書くと、ほとんどの場合、誤った結果が遅くなります。
LennyProgrammers

7

これは私の夢のプログラミング言語がどのように見えるかです:

  • 依存型付けをサポートする強力な静的型システム。
  • オプションの動的型付け。
  • Numeric Tower a la Lispが静的に入力されています。
  • Lispのマクロ。
  • 主に命令プログラミング(MLファミリなど)の基本的なサポートを備えた関数型プログラミング言語。
  • ガベージコレクション。
  • 型推論。
  • 継続。
  • オプションの遅延セマンティクス。
  • すべての制御構造は、ライブラリ関数の形式で提供されます。(これは、最後の2つの機能を使用して可能になります。)
  • 最小限の構文(Lispほどではなく、Ioke / Sephのようなもの)

いいですね。ただし、静的に型保証されたマクロを実行する良い方法を実際に見たことがありません。
ヨルグWミットタグ

@ヨルク:ネメルル?
missingfaktor

Smalltalkでは、すべての制御構造は実際にはメソッドであり、実装で継続を使用しません。一方はもう一方には必要ありません。
オーク

@ Oak、yieldSmalltalkでPythonを実装できますか?使用するのと同じくらいきれいでなければなりません。
missingfaktor

yieldのようなメカニズムは、継続なしで既にライブラリメソッドとしてsmalltalkに実装されています。
オーク

6

私はC#とほぼ同じように設計していましたが、Microsoftは私を打ち負かしました。:)

(もちろん、私のものはあまりよく考えられておらず、よりアマチュアだったはずです。)

コンパイルまたは解釈されるかどうかはあまり気にしないので、そのビットを正当化する必要はありません。

強力な静的型付けに関しては、正当化が必要な理由を理解するのは難しいと感じています。静的型付けは、コンパイル時にバグをキャッチする機能です。動的型付けはその機能の欠如であり、実行時までバグを延期します。私の個人的な経験では、動的ディスパッチが理にかなって有用なユースケースはほとんどなかったので、4.0の前にC#でそれを取得する必要があった畳み込みは、簡単に正当化されました。C#4.0では、動的ディスパッチがあるため、それを正当化する必要さえありません。

ただし、C#のように古いC構文に忠実に固執するのではなく、おそらく新しい構文を作成したでしょう。switchステートメントは特に恐ろしく、キャスト構文も嫌いです(これは間違った方法です)。ただし、構文の詳細については大騒ぎしないので、Visual Basicほど冗長にしたくない場合を除き、詳細に正当化する必要はありません。

他に何を正当化してほしいですか?


+1良い答えです!後で自分の投稿も投稿します。
チンマイカンチ

4
C#は強力な言語ですが、構文が面倒なことがよくあります。これは、これらの機能の多くが元の設計になかったためだと思います。
Casebash

したがって、「4.0」だと思います。
マークC

5

さて、ここに私が入れた機能のリストがあります:


Lispのような構文

Lispスタイル

長所

  • 簡単に拡張可能な構文。Cでforeachループを実装しようとしたことがありますか?簡単ではありません。(気をつけて、私はそれをやった)。
  • 同質性。簡単にできます(eval "your data files")

短所

  • ネストされたポーランド語表記は読みにくいことが多い

関数型プログラミング

ハスケルスタイル

長所

  • 同時実行が容易で、すべてのコードはスレッドセーフです。

短所

  • モナドは良い仕事をしているようですが、副作用を純粋な機能コードに実装することは困難です。

強力な動的型付け

Pythonスタイル

長所

  • 動的な型付けにより、コードが読みやすくなり、強力な型付けにより型エラーを排除できます

実装

CLのように、型に基づいて関数のオーバーロードを許可しますdefgeneric

(define (+ (a <int>) (b <int>))
  (ints-add a b))

(define (+ (a <string>) (b <string>))
  (string-concat a b))

(define (+ a b)
  (add-generic a b))

コンパイル可能で解釈可能

長所

  • コンパイルされた場合のパフォーマンスの向上(通常は常にではありません)

短所

  • 言語の機能を制限することができますが、llvmを使用することをお勧めします。

システムプログラミング

Cスタイル

長所

  • 非常にわずかに幅広いユーザーにアピールします。
  • アプリケーション、カーネル、およびデバイスドライバーがすべて同じ言語で記述されている場合、それらが相互作用しやすい

短所

  • 言語の抽象化を制限するため、多くの場合、動的型付けは適切ではありません。

衛生的なマクロ(CLスタイルとSchemeスタイル)

長所

  • 特にLispy™構文を使用すると、言語を簡単に拡張できます
  • 前にも言ったでしょ?

短所

  • Lispy™構文で行われた場合、多くはありません

考えてみれば、これは多かれ少なかれスキームを定義していますが、コンパイルとシステムプログラミングビットを除きます。libguileを使用してこれらのビットをCで記述することで回避できます。


1
IokeとSephを見てください。S-Expressionsと比較してほんの少しの構文を追加するだけで、完全なマクロ機能を備えた言語がどれほど簡単に読めるかは驚くべきことです。(基本的に、「すべての関数呼び出しはリストであり、リストはファーストクラス」ではなく、「すべてがメッセージ送信であり、メッセージチェーンはファーストクラスです」。car関数でありcdr引数であるリストの代わりに、nameフィールドがメソッドであり、argumentsフィールドが引数であるオブジェクト。ネストする代わりにprevnextポインタフィールドがあります。)
JörgW Mittag

ほとんど正確にClojureのように聞こえる(あなたは一部のプログラミングシステム用のLLVMのネイティブコードgeneraltionためミョルニルを使用すると仮定- github.com/halgari/mjolnirを
mikera

3

私はかなり良いと思ういくつかの言語があります(C#が現在のお気に入りです)。これは私の幻想的な言語なので、ここに私が本当に欲しいものがあります:

  • Kick-ass公式APIドキュメント。Java APIはこのように優れており、C#/。NETはかなり優れています。ここではRuby / Railsはかなりひどいです。
  • 公式の一般的なドキュメンテーション(ハウツー、一般的な使用法、多くのサンプルコード)。C#/。Netはこれに適しています。
  • ブログベースのドキュメント作成者とStackOverflowの問題解決者の巨大なコミュニティは、私が困難な状況から抜け出すのを助けてくれます。
  • 幅広いサポート、ドキュメント、強力なプラグイン/ライブラリ/拡張機能(Ruby / Railsは「強力」ですが、他の2つはありません)。
  • 合理的に安定しています。既存のほとんどのコードを毎年壊すためにすべてを変更することはありません(あなたを見て、Ruby / Rails)。
  • 安定しすぎていません-言語設計の進歩に適応できます(あなたを見て、C ++)

2
「キックアスドキュメンテーション」のポイントには、PHPを含める必要があります:D
Corey

3

コンパイラーのヒント

私は言語設計についてあまり知らないので、私はおかしな話をしていますが、私が話している機能は他の言語のヒントと呼ばれると思います。コンパイラのヒント、多分?

これをPerl6ドラフトで読んだのか、それとも当時はただ高かったのかはわかりませんが、デフォルトではすべてがだらしないグージーで自動の言語であると思います。しかし、実際にパフォーマンスを上げたいと思ったら、この値は常に整数であるか、決してnullではない、これは並列である、またはこれはステートレスである、など...コンパイラは自動的に町に行くことができるこれらの特別にマークされた領域。

E:私が求めていることを明確にしたり、これが既に存在する例を引用したりするコメントをいただければ幸いです。


1
Common Lispでこれのいくつかを行うことができます。たとえば、iが適切なサイズの整数であることをコンパイラーに伝えることができます。有用なことの1つは、safetyand speed値を変更することで、多くの場合、コンパイラーにチェックと強制(問題を見つけるため)をさせるか、ユーザーの発言が正しいと仮定する(およびより高速なコードをコンパイルする)ことです。
デビッドソーンリー

2

新しいアイデアを試すには:

動的型の関数型プログラミング言語を作成します。これにより、すべてのステートメント式のトリックと、パターンマッチングを使用した最も単純なラムダ構文を実行できます。オフサイドルールが有効になっています。

// a view pattern (or Active Pattern in F#)
default = \def val: !!val.Type val def

// usage of the pattern
greet = \name<(default "world") `and` hasType Str>:
  p "Hello, \{name}!"

(p "Enter your name", .input).greet // (, ) is a sequence expression, returning the last value

説明は次のとおりです。

default =設定記憶、\def val2つの引数を持つカリー化関数を開始するval.Typeのと同じでありType[val]!!変換ブールし、ブール値を適用することができるので、val及びdef are after it.

f x= f[x]= x.f .f=f[]

そしてgreet、それは使用さname<(default "world")hasType Str>、それはパターンdefault "world"が使用され、バインドされることを意味しnameます。デフォルトパターンはデフォルト値を指定します。 and2つのパターンを連結する別のパターンです。default一方、パターンが失敗することはできませんhasType失敗する可能性があります。その場合、例外をスローします。

変数は実際にはストレージであり、機能的に渡すことができ、ストレージテーブルは参照の作成、スコープの変更に応じて作成および破棄することができます。

ハッシュなどは、LuaやJavaScriptのようになります。

コンパイル済み言語を作成する場合は、Haskellのような機能を備えたJava用のF#を作成します。純粋な関数型言語です。ただし、QuotationsとComp Exprsを組み合わせて、擬似コードのようなブロックを記述することで命令型プログラミングを実現する機能があります。


1
それは、動的型付け機能プログラミング言語であるErlangに少し似ているように聞こえますが、それには非常にユニークな並行言語構成要素が追加されています。
ジョナス

2

私が知っている唯一の言語はPHPとjavascriptであり、言語を設計する前にもう少し学ぶ必要があることに留意してください。

構文: 関数名と引数の順序について慎重に検討します(つまり、PHPよりも乱雑ではありません)。

特徴: の設定したstring一連のバイトとして変数を操作する関数を、が、テキストを理解していない、とのセットtext機能、エンコーディングの多くを理解しているし、UTF-8およびその他のマルチバイト文字列を操作することができます。(そしてtext.isValidEncoding(text, encoding)、バイトシーケンスが不正な形式であり、テキストとして扱うのに安全でないかどうかを通知するような関数を使用して、言語にエンコードの健全性チェックを組み込みます。

私は強力な静的型付けのアイデアが好きだと思いますが、私はそれを使用したことがないので、私は本当に言うことができません。


2

プログラミング言語を設計する前に、質問に対する良い答えを見つけるでしょう:なぜさらに別のプログラミング言語が必要なのですか?この記事の執筆時点でのRosettaコードには、344の言語がリストされています。それらのどれもが私のニーズを満たしていない場合、なぜ彼らがそうしなかったのかという詳細が、出発点(最も近い言語)とそれに追加されるものを決定するでしょう。

宝くじに当選し、何らかの理由でそれ以上のことをする必要がなかった場合、Liskellから始めてGHCフロントエンドではなく本格的な言語にしてから、FFIをより簡単(および自動化)にして、 C / C ++ライブラリ。


2

良い言語とは、次の言語です。

  • 簡単に推論できます(わかりにくい構文はありません)
  • 最小限の歪みでアイデアを表現できます
  • 重要な詳細を非表示にします(最適化/リソース管理)
  • 簡単に並列化可能(マルチコア、分散コンピューティング)

これを機能のリストに変えるのはかなり難しいですが、関数型プログラミングは、自然ではないと感じていますが、命令型プログラミングよりもこれに近いと思います(特に重要な詳細を隠す場合)

  • Cインターフェース:Cはプログラミング言語の共通語であり、Cで開発されたライブラリの数は驚くべきものです。Cへの簡単なインターフェース(Pythonなど)を使用することで、この言語はすべてのライブラリから自動的に恩恵を受け、また、金属言語に近いほど最適化できない重いタスクを送信することもできます。
  • 分散:ランタイムがそのアクティビティに応じてスレッドにディスパッチする軽量ルーチンを備えたGoのマルチスレッド化が好きです。このような言語は、プログラマーがタスクについて推論し、タスクを互いに分離することを奨励します。
  • ガベージコレクション:言うまでもなく、最近のことです;)
  • 不変:絶対に変更できないものについて推論するのがはるかに簡単で、マルチスレッド/分散コンピューティングの実装もはるかに簡単です(コンパイラタスクであるライフタイムを処理するために同期のみが必要です)
  • ラムダス:私が推測するファーストクラスの関数と一緒に行く
  • メッセージの受け渡し:不変性はミューテックスがないことを意味するため、Tony Hoaresの提案に従います
  • モジュール:名前空間にやや似ていますが、カプセル化が改善されています
  • リフレクション:分散計算にはシリアル化が必要であり、これはコンパイラーに任せる必要があり、逆シリアル化は何らかの形のリフレクションにより簡単に実現できます。
  • 静的な強い型付け:エラーが早く検出されるほど、コストは最小になります

現時点では、このリストに近い言語はおそらくHaskellです。

  • ルーチンが欠けている:Haskellで並列処理を表現する自然な方法はまだ見ていません(私の無知かもしれませんが...)
  • あいまいな構文があります:どういうわけか、Haskellプログラマーは言葉ではなく奇妙な演算子を使用して繁栄しているように見えます。滑らかに見えるかもしれませんが、何が起こっているのかを理解するのにはあまり役立ちません。

2

最初の質問、「どうやってやるの?」-短い答え、私はしません。私はそれを引き出すのに十分なパーサー/コンパイラ理論を持っていません。しかし、私は25年間プログラミングを行ってきました。そのため、共有するアイデアや意見があります。

まず、真に接続されたモデルを作成できるOOPアプローチを考えます。つまり、モデルはほとんどすべての種類のプログラミングプロジェクトで最も重要なものの1つです。それを正しく行うには、常に多くの面倒な作業と継続的なリファクタリングが必要です。オブジェクト指向言語。

デモを許可してください。クラスHouseにDoorプロパティがあるとします。

var door = house.Door;

これで、Doorインスタンスへの参照を含むローカル変数が作成されました。

しかし、何が起こったのかを考えてみてください。あなたはちょうどドアを家から引き裂いたので、ドアをすり抜けることにとても満足しています。残りのコードは、このドアが実際に家に取り付けられているという事実を知らないのです。

私にとって、これは根本的に間違っています。

そして、はい、私は知っています、これはケースバイケースで「簡単に」修正されます-この場合、現在接続されている家へのすべてのドアからの逆参照を維持することによって。もちろん、これは2つの逆参照を正確に維持する義務があるため、モデルにエラーが発生するため、House.DoorsプロパティとDoor.Houseプロパティをプライベートにし、House.AddDoor()、House.RemoveDoor()などのメソッドを追加します。 )、Door.SetHouse()など、すべてを配線し、ユニットテストして実際に機能することを確認します。

これは、そのような単純な関係をモデル化するための多くの作業のように聞こえ始めていませんか?維持すべき多くのコード?モデルの進化に合わせてリファクタリングするコードはたくさんありますか?

問題はポインターです。私が見たすべてのオブジェクト指向言語は、オブジェクト参照が本当にポインターであるという事実に本質的に苦しんでいます。それはコンピューターが使用するものだからです。

ポインターは、実世界をモデル化するための良い方法ではありません。どの世界をモデル化しようとしても、その世界の関係は双方向の関係になることがほぼ保証されています。ポインターは一方向のみを指します。

基本的なデータモデルがグラフであり、デフォルトですべての関係に両端がある言語を見てみたいです。これはほぼ確実に、現実世界のモデリングにはるかに自然な適合性を提供しますが、そもそもコンピューターが必要なのはこれだけです。(それとビデオゲーム。)

そのような言語の構文がどのように見えるか、またはテキストを使用して表現できるかどうかはわかりません。(どういうわけか、そのような言語はグラフィカルでなければならないのだろうか...)

また、あらゆる形態の偶発的な状態が解消されることを望んでいます。

たとえば、Web開発では、データをデータベースからビジネスモデル、表示モデルに表示するために多くの時間を費やします。そのデータの一部はフォーム上に表示されますが、これはまさに別の変換です。 ..状態はフォームポストから返されます。その後、そのデータの形状を変更して、ビューモデルに再投影します。たとえば、ビューモデルバインダーなどです。次に、ビューモデルからビジネスに再投影します。モデル...次に、オブジェクトリレーショナルマッパー(または単調な作業)を使用して、ビューモデルからのデータを変換し、リレーショナルデータベースに投影します...

これは冗長に聞こえ始めていますか?この狂気のすべての時点で、私たちは実際に何か有益なことを達成しましたか?そして、有用というのは、具体的なもの、つまりエンドユーザーが理解し、気にすることができるものです。結局のところ、ユーザーが理解できるものを構築するのに実際に費やした時間は、実際に費やした唯一の時間です。それ以外はすべて副作用です。

非常に動的な言語が必要です。書き込み/コンパイル/実行サイクルは退屈な時間の無駄です。理想的には、言語は変更内容を把握し、必要に応じてバックグラウンドで透過的にコンパイル/ロードする必要があります。

理想的には、「実行」を押す必要さえないはずです-変更を行うと、すぐに変更が反映され、画面上で発生するはずです。書き込み/コンパイル/実行サイクル、またはさらに直接的な書き込み/実行サイクルの問題は、あなたがやっていることから切り離されていることです-私たちの仕事とのつながりを感じるために、即時のフィードバック、即時の結果が必要です。待ち時間が長すぎます!

繰り返しますが、これが従来のIDEで実現できるかどうか、またはこれがまったく新しい種類のインターフェイスを必要とするかどうかもわかりません。

あなたが取り組んでいる問題に最も適したものであれば、弱いタイピングと強いタイピングを組み合わせて使用​​できるはずです。

一般に、状態は、言語が完全に管理するものでなければなりません。永続性をデータベースに依存する必要があるのはなぜですか?理想的には、モデル内の任意の変数の寿命を単純に指定できるようにしたいです:1つのWeb要求、1つのセッション、24時間、永久に。

さまざまなメディアや寿命に合わせて、ストレージソリューション全体を選択する必要があるのはなぜですか?-各メディアに合わせてデータを変換および整形することは言うまでもありません。ブラウザのキャッシュ、データベース、メモリ、ディスク、気にする人!データはデータです。データを保存する場所(およびその期間)は、神との戦いではなく、単純な選択である必要があります。

まあ、それで幸運。


1

それはおそらく、以下をサポートするマルチパラダイム言語でしょう。

  • 構造化/手続き型プログラミング
  • オブジェクト指向プログラミング
  • 関数型プログラミング

なぜこれらですか?特にデータを整理するために、大規模なプログラムを整理するのに最適な方法であるため、オブジェクト指向です。常にそれが必要/必要というわけではないため(OOP)構造化されているので、人々は選択する必要があります。プログラマがデバッグしやすくなり、プログラムがより明確になるため、機能的です。

インデントされたブロックを持つPythonのモデルを使用して、コードブロックをマークします。それは非常にクレンと読んでいいです。

Pythonは非常に素晴らしい言語であるため、実際にはPythonから多くのアイデアを盗みます。私はそれを声明のために取り、そのマップ、リスト、およびタプルをコピーします。

今、私は恐らくPythonの動的な概念を受け入れないでしょう。1つには、おそらく明示的かつ静的に型付けされるでしょう。それによってプログラムがより明確になると思います。変数はすべてメソッドを持つオブジェクトである可能性が高いstr.length()ため、文字列の長さを取得するなどの操作を行うことができます。関数定義では、戻り値の型と引数の型を指定する必要があります(ある種のジェネリック型もサポートします)。

Pythonからのコピーに戻りましょう;-)。オプションの手続き引数を持つ方法が大好きなので、おそらくそうするでしょう。ただし、Pythonはプロシージャのオーバーロードをサポートしていません。

クラスを見てみましょう、私は多重継承を捨てます。悪用しやすい。プライベートスコープと同様のスコープを実装し、おそらくC ++で行われる方法で実装します。抽象クラスとインターフェイスもあります。Pythonにそれがあるとは思わない。

内部クラスをサポートします。実際、非常に強力なオブジェクト指向言語が必要です。

おそらく解釈されるでしょう。優れたJITコンパイル(プログラマーの生産性が最初になりますが、高速な言語が必要です)を使用して、本当に高速に取得することができます。通訳された言語は、プラットフォームの独立性も促進しますが、これは日々重要になっています。

組み込みのUnicodeサポートがあるはずです。最近の国際化は非常に重要です。

それは間違いなくガベージコレクションです。くそー、私は自分でメモリ管理をするのが嫌いです。生産性も良くありません。

最後に、それは良い標準ライブラリを持つでしょう。

うわー、私はPythonがどれだけ大好きかを実感しました。


なんでInterpreted languages also promote platform independance?コンパイラ(パーセンテージ)よりもクロスプラットフォームインタプリタの方が多いと思いますが、なぜこの文が正しいのか理解できませんでしたか?クロスプラットフォームの能力に関して、両者の間に違いはないと思います。
マハディ

1

まず第一に、コンパイラーに関するいくつかの本といくつかの標準を購入し、言語とコンパイラーのコースを1つか2つ受講します。私はPEPに貢献し、C ++標準委員会の会議に出席します。できれば機能とバグの両方のために、使用するコンパイラにパッチを提供します。

それから私は戻って、今私が出てきたこのリストを恐ろしく見ます。それは、今すぐ始めた場合、私は言語でどんな方向に行くでしょうか:

  • 機能、私は現在、任意の関数型言語に精通していないですと1つのものを学ぶのに最適な方法だろう作るため。直接従わない場合: すべてが一定です。
  • できる限り多くの型推論入力しますが、インターフェイスを明示的に指定するオプションを使用します。他のタイプについてはわかりません。これは、デフォルトですべての関数が汎用であるため倍増します。
  • ご想像のとおり、Interfaces使用します。つまり、使用可能な操作に関する約束のみを提供する型を使用します。
  • 言語が強く型付けされているか弱い型付けされているかを言うことは、私が知る限り、この場合はあまり意味がありません。実装するインターフェイスが物事によって変わることはないため、私はそれを強く型付けしたと呼びます
  • Design by Contractのサポートがたくさんあります。繰り返しになりますが、できる限り:前提条件と事後条件は必須です。関数型プログラミングに関して、不変条件がどれほど重要かはわかりません。
  • 私がそれに取り組んでいる間に、私はあなたが正式に正当性証明し、そこから何かを拾うことができるかどうかを見ることができる言語を見ていきます。
  • 私は外に出て、素晴らしいテストライブラリを書きました。私がそれを素晴らしいものにできなかったとしても、それはすべての言語が持つべきものだと思うので、少なくともかなりの時間を費やしてそれに取り組みます。
  • 構文に関しては、言語にはかなりの空白があり、Python非常に似ている、ロジバン基づいて多くの文法と語彙を共有します。最初のケースでは、文法をできるだけCFGに近づけるように最善を尽くします。
  • 言語を実装した人々が事前にコンパイルするか、JITするか、解釈するか、キャンプファイヤー唱えるか、大学生に代わって実行するかは気にしません。私自身の実装は、おそらくインタプリタまたはCコンパイラとして始まり、最終的にはJITterに移行するでしょう。

言語を実装し始めると、これらのかなり広いポイントでさえもおそらくおそらく急速に変化するので、さらに詳細に進む必要はないと思います。


0

時間があれば、Scalaに基づいたローカライズ可能なプログラミング言語を設計するので、おそらくXMLを除き、ほとんどの機能を備えています。私の目標は、アラビア語(母国語)など、英語とは異なる構造を持つ言語でほぼ自然に読める言語を作ることです。私は次の機能を考えています:

  • プリプロセッサ#langディレクティブ。プログラミングに使用される人間の言語をプリプロセッサに通知するために使用されます。たとえば#lang ar、のفئة代わりにclass、のعرف代わりに単語の使用を許可しますdef。人間の言語固有のキーワードは、標準のプリプロセッサフ​​ァイルで定義されます。
  • プリプロセッサは、コードをわかりやすくすることを唯一の目的とするいくつかのオプションのキーワードを削除します。たとえば、「から構成される」を削除しclass MyClass is composed of {てになりclass MyClass {、「として」を削除しdef MyMethod(x: Int) as {てになりdef MyMethod(x: Int) {ます。一部の(人間の)言語では、これにより、特に学生にとってコードがはるかに理解しやすくなります。
  • コンパイラは、プロパティアクセスにプレフィックス表記の使用を許可します。これは、ほとんどのラテン語ベースの言語話者には意味がないかもしれませんが、他のいくつかの言語では完全に理にかなっています。たとえば、アラビア語のプロパティアクセスは通常、のように接頭辞です。اعرض طول اسم محمدこれはprint(length(name(Mohammad)))、プログラミング英語の場合と同等です。(括弧は明確にするためのものです。)

プリプロセッサーとコンパイラーに対するこれらの最小限の変更により、英語以外のスピーカーにとってプログラミングがはるかに簡単になると思います。


5
Microsoft(およびそれ以前の一部)は、VBA(Visual Basic for Officeアプリケーション)のローカライズバージョンを作成しました。それは混乱でした。母国語でコードを読むのは初心者、若者、および英語以外の人にとっては良いことですが、国外の人々とコードを共有することは非常に困難です。私たちのインターネット時代には、単独での作業はあまり生産的ではありません。(現在のように)Scalaを学ぶためにフランス語のソース(ブログ記事、書籍など)だけに頼らなければならない場合、多くの有用な情報を見逃してしまいます。...ライブラリをローカライズする作業の難しさ/量は言うまでもありません
PhiLho

1
@PhiLho:あなたは確かに正しい。しかし、このような言語を作成する私の主な目的は、K-12の生徒や英語が堪能でない高齢者など、はるかに幅広い視聴者にプログラミングを紹介できるようにすることです。入門レベルでは、おそらく外部ライブラリを使用する必要はなく、いくつかの小さなもの(例えばprint)のローカライズされたラッパーを作成しても害はありません。
ホサムアリー

1
もう1つのポイントは、多くの人が既にクラス名とメソッド名に母国語を使用していることです。キーワードは英語以外のコードを理解するのに十分ではないため、キーワードが英語であることを助けたり、他の人に違いをもたらしたりすることはありません。それでも、プリプロセッサは常にキーワードを英語に戻し、必要に応じて他の言語に戻すことができます。
ホサムアリー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.