Subjektive Vision einer idealen Programmiersprache

Weiterer Text ist mein Standpunkt. Vielleicht ermöglicht es jemandem, einen neuen Blick auf das Design von Programmiersprachen zu werfen oder einige Vor- und Nachteile bestimmter Funktionen zu erkennen. Ich werde nicht auf bestimmte Details des Typs "Die Sprache sollte eine Weile konstruieren" eingehen, sondern nur die allgemeinen AnsÀtze beschreiben. PS Ich hatte einmal die Idee, meine eigene Programmiersprache zu erstellen, aber es stellte sich als ziemlich komplizierter Prozess heraus, den ich noch nicht beherrschte.


Der Einfluss frĂŒherer Erfahrungen


Dieser Artikel hat mich dazu inspiriert, einen Artikel zu schreiben. Der Autor entwickelte eine eigene Programmiersprache, und diese Sprache mit ihrer Syntax und ihren Funktionen Ă€hnelte verdĂ€chtig Free Pascal, auf dem die Implementierung der VM fĂŒr die Sprache geschrieben wurde. Und das ist kein Zufall. Die Programmiersprachen, die wir in frĂŒheren Sprachen geschrieben haben, treiben das Denken in den Rahmen der Sprache. Wir selbst bemerken dies vielleicht nicht, aber ein externer Beobachter mit unterschiedlicher Erfahrung kann etwas Unerwartetes empfehlen oder etwas Neues lernen.


Der Denkrahmen bewegt sich ein wenig auseinander, nachdem er mehrere Sprachen beherrscht hat. Dann möchten Sie in Sprache A möglicherweise eine Funktion von B und umgekehrt, und es wird auch ein Bewusstsein fĂŒr die StĂ€rken und SchwĂ€chen jeder Sprache angezeigt.


Als ich zum Beispiel versuchte, meine eigene Sprache zu erfinden und zu erschaffen, waren meine Gedanken radikal anders als die im obigen Artikel beschriebenen. Ich dachte an ganz andere Dinge in ganz anderen Begriffen. Im Folgenden werde ich die Funktionen der Sprache beschreiben, die ich in der "idealen" Programmiersprache sehen möchte.


Meine Erfahrung: Ich habe einmal mit Pascal angefangen, spĂ€ter habe ich Java, Kotlin, C ++, Python, Scheme kennengelernt und ich betrachte Scala als die Hauptsprache. Wie im oben beschriebenen Fall hat meine „perfekte“ Sprache viel mit Scala gemeinsam. Zumindest bin ich mir dieser Ähnlichkeit bewusst.


Die Auswirkung der Syntax auf den Codestil


"Sie können in Fortran in jeder Sprache schreiben"


Es scheint, dass fast jede Idee in jeder Programmiersprache ausgedrĂŒckt werden kann, und die Syntax der Sprache ist nicht wichtig. Ein typisches Programm ist jedoch so einfach und kurz wie möglich geschrieben, und einige Sprachfunktionen haben möglicherweise Vorrang vor anderen. Codebeispiele (Ich habe nicht auf Richtigkeit ĂŒberprĂŒft, dies ist nur eine Demonstration der Idee)


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, , .



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



, , :


  • ,
    • -
    • , .

    • .
    • ()
    • ide .
  • extension- .
  • , AST

/ , , .


, . , .


, — .

Source: https://habr.com/ru/post/de435300/


All Articles