Visi subyektif dari bahasa pemrograman yang ideal

Teks selanjutnya adalah sudut pandang saya. Mungkin itu akan memungkinkan seseorang untuk melihat segar pada desain bahasa pemrograman atau melihat beberapa kelebihan dan kekurangan fitur tertentu. Saya tidak akan masuk ke rincian khusus dari jenis "bahasa harus memiliki konstruksi sementara", tetapi hanya menggambarkan pendekatan umum. PS Saya pernah punya ide untuk membuat bahasa pemrograman saya sendiri, tetapi ternyata prosesnya agak rumit, yang belum saya kuasai.


Pengaruh pengalaman sebelumnya


Artikel ini menginspirasi saya untuk menulis artikel . Penulis datang dengan bahasa pemrogramannya sendiri, dan bahasa ini dengan sintaks dan fitur-fiturnya ternyata mirip dengan Free Pascal, di mana implementasi VM untuk bahasa itu ditulis. Dan ini bukan kebetulan. Bahasa pemrograman yang kami tulis sebelumnya mendorong pemikiran ke dalam kerangka bahasa. Kita sendiri mungkin tidak memperhatikan hal ini, tetapi pengamat luar dengan pengalaman berbeda mungkin menyarankan sesuatu yang tidak terduga atau mempelajari sesuatu yang baru.


Kerangka berpikir bergerak sedikit terpisah setelah menguasai beberapa bahasa. Kemudian dalam bahasa A, Anda mungkin ingin memiliki fitur dari B dan sebaliknya, dan kesadaran akan kekuatan dan kelemahan masing-masing bahasa juga akan muncul.


Misalnya, ketika saya mencoba memikirkan dan membuat bahasa saya sendiri, pikiran saya sangat berbeda dari yang dijelaskan dalam artikel di atas. Saya memikirkan hal-hal yang sangat berbeda dalam istilah yang sama sekali berbeda. Di bawah ini saya akan menjelaskan fitur-fitur bahasa yang ingin saya lihat dalam bahasa pemrograman "ideal".


Pengalaman saya: Saya pernah mulai dengan pascal, kemudian saya berkenalan dengan Java, Kotlin, C ++, Python, Scheme, dan saya menganggap Scala sebagai bahasa utama. Seperti dalam kasus yang dijelaskan di atas, bahasa "sempurna" saya memiliki banyak kesamaan dengan Scala. Setidaknya saya menyadari kesamaan ini)


Efek sintaks pada gaya kode


"Anda dapat menulis dalam bahasa Fortran dalam bahasa apa pun"


Tampaknya hampir semua gagasan dapat diekspresikan dalam bahasa pemrograman apa pun, dan sintaksis bahasa itu tidak penting. Tetapi program tipikal ditulis sesederhana dan sesingkat mungkin, dan beberapa fitur bahasa mungkin menang atas yang lain. Contoh kode (saya tidak memeriksa kebenarannya, ini hanya demonstrasi gagasan)


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/id435300/


All Articles