理想的なプログラミング言語の主観的なビジョン

さらにテキストが私の視点です。 おそらく、誰かがプログラミング言語の設計を改めて見たり、特定の機能の長所と短所を見たりできるようになるでしょう。 「言語にはwhile構造が必要」というタイプの特定の詳細には触れませんが、一般的なアプローチについて説明します。 PS私はかつて自分のプログラミング言語を作成することを考えていましたが、それはかなり複雑なプロセスであることが判明しましたが、まだ習得していません。







以前の経験の影響



この記事に触発されて記事を書い 。 作者は自分のプログラミング言語を思いつき、この言語の構文と機能は、その言語のVMの実装が記述されたFree Pascalに疑わしいほど似ていることが判明しました。 これは偶然ではありません。 以前に書いたプログラミング言語は、言語のフレームワークへの思考を促します。 私たち自身はこれに気付かないかもしれませんが、異なる経験を持つ外部のオブザーバーは、予期しないことをアドバイスしたり、新しいことを学ぶかもしれません。







いくつかの言語をマスターした後、思考の枠組みは少し離れます。 次に、言語Aでは、Bの機能を使用したり、Bの機能を使用したりできます。また、各言語の長所と短所の認識も表示されます。







たとえば、自分の言語を考えて作成しようとしたとき、私の考えは上記の記事で説明したものとは根本的に異なっていました。 まったく異なる用語の中で、まったく異なることを考えました。 以下では、「理想的な」プログラミング言語で見たい言語の機能について説明します。







私の経験:私はかつてpascalを使い始め、後にJava、Kotlin、C ++、Python、Schemeに精通し、Scalaをメイン言語と考えています。 上記の場合のように、私の「理想的な」言語にはScalaと多くの共通点があります。 少なくとも私はこの類似性を認識しています)







コードスタイルに対する構文の影響



「Fortranで任意の言語で記述できます」







ほとんどすべてのアイデアはどのプログラミング言語でも表現でき、言語の構文は重要ではないようです。 しかし、典型的なプログラムはできるだけシンプルで短く書かれており、言語の一部の機能が他の機能よりも優先される場合があります。 コード例(正確さを確認しませんでした。これは単なるアイデアのデモンストレーションです)







Python:







filtered_lst = [elem for elem in lst if elem.y > 2]
filtered_lst = list(filter(lambda elem: elem.y > 2, lst))
      
      





, . , .







Scala:







val filteredLst = lst.filter(_.y > 2)
      
      





, . . , it => it.y > 2



, .







, lst.map(_.x).filter(_>0).distinct()



, , . , .







[elem for elem in



, . , - .







... = set(filter(lambda it: it > 2, map(lambda it: it.x, lst))))
      
      





!







lst.filter(...).map(...) , , . , numpy max — . , , - .







, java:







int x = func();
final int x = func();
      
      





, , , . Rust , .







let x = 1;
let mut x = 1;
      
      





, , . . ++, , template, typename, inline, virtual, override, const, constexpr



"" .









, , , , .







. , , , . , . , - , , .







, , . , hashmap -.







, . - , . (, - , , )







— must have . , , . — , .







Unit, void



/delphi ( ) (- ). , . . ? , . , Java, ++ . : " void!" , void , , . , Java HashSet<T>



HashMap<T, Boolean>. boolean — , . , HashMap , , . /++ sizeof(void).







, Unit, 0 ( , , Unit, ). , , . HashSet<T>



HashMap<T, Unit>



.









- , , , . , . ?! , :









, "" — , , .







std::tuple



++, , , , , (T1, T2)



. (, Unit ). T => U



, T U — - . , - Unit, , . , , . , .







Union, / , - . scala/kotlin/rust — .







val a = 10 * 24 * 60 * 60
val b = {
    val secondsInDay = 24 * 60 * 60
    val daysCount = 10
    daysCount * secondsInDay
}
      
      





Enums, Union Tagged Union



, , , ,



go.







-, -. , . , 0 , true (1) false (0) . . , , - success | fail



ok|failReason1 | failReason2



.







, -, . , ok | error(code)



Pointer[MyAwesomeClass] |null



.







-. . Union Tagged Union , , int | int



. Union int | int == int



, . - union . int | int



tagged union , int — .









, - (Union), .







List(x) = Unit | (x, List(x))
      
      





.

- ( ), , :







f(x) = 1 + x * f(x)
      
      





, f(x) = 1 + x + x*x + x*x*x + ...



, - () -







List(x) = Unit | (x, Unit) | (x, (x, Unit)) | ...  = Unit | x | (x, x) | (x, x, x) | ...
      
      





C x = , x, , ...







, (x, Unit) == x



, x * 1 = x



, (x, (x, (x, Unit)))



(x, x, x)



.







, , , , , ( ), . , . , — , ++ -, .







, - , , - (). (A, B | C) == (A, B) | (A, C)











, , . .







  1. , "" , - (, )
  2. , .
  3. , .


2 3 , : , ++ . - , , .

— , -, . - . — final java.







, 1-2 /. , , . , "" — , , , , .

( , jvm , const)







, — . , D. - static value = func(42);



.









- gradle, , , build "wtf? ?"







android {
    compileSdkVersion 28
}
      
      





Groovy. android { compileSdkVersion 28}



, - - , . groovy — , .







, , -







class UnderlyingAndroid(){
     compileSdkVersion: Int = 42
}

fun android(func: UndelyingAndroid.() -> Unit) ....
      
      





, -, / UnderlyingAndroid, .







, :







android { it =>
    it.compileSdkVersion = 28
}
      
      





! ? + DSL. , gradle , . , .







extension . , . , . - . — . , T, , sum, , T .







Call-by-name



, , . , map.getOrElse(key, new Smth())



, . , assert(cond, makeLogMessage())



.







, — , assert if (cond) { log(makeLogMessage())}



, .







, must have , .







----



. "" , "" , , . , .









, . , , . , , . , int long.







?



. ,



. ( , ++). , ( ) .







, ,



. ++ , T



- . , , rvalue-, const. , , , . - Scala Kotlin, "" , .









# — , - . ( , # Unity) , , . 3 ! , , , - . , — .







kotlin/scala — , . , . , .







— inline C++/Kotlin. ! inline , inline , (++) return (kotlin). forced_inline__, noinline, crossinline, - . , , inline , .









, . . , ++ , , . lisp scheme, , .









. - - , — , - . : , "" .







Substructural type system



, . , , , .

? Move- , . , . , , - /, . , () .







- , - , .









, , , . , , , , 5, 3, , .









-, . -, (, ), . , ( ++ ).

, , , . - , .









, , :









/ , , .







, . , .







, — .








All Articles