رؤية ذاتية للغة برمجة مثالية

النص الإضافي هو وجهة نظري. ربما سيسمح لشخص ما بإلقاء نظرة جديدة على تصميم لغات البرمجة أو رؤية بعض مزايا وعيوب ميزات محددة. لن أخوض في تفاصيل معينة من النوع "يجب أن يكون للغة بعض الوقت" ، لكن ببساطة أصف الطرق العامة. ملحوظة: كانت لدي فكرة عن إنشاء لغة برمجة خاصة بي ، لكن تبين أنها عملية معقدة إلى حد ما ، لم أتقنها بعد.


تأثير التجربة السابقة


ألهمني هذا المقال لكتابة مقال . توصل المؤلف إلى لغة البرمجة الخاصة به ، وتبين أن هذه اللغة ببناءها وميزاتها تشبه بشكل مثير للريبة Free Free Pascal ، حيث تمت كتابة تطبيق VM للغة. وهذه ليست صدفة. تدفع لغات البرمجة التي كتبناها في وقت سابق التفكير في إطار اللغة. قد لا نلاحظ ذلك نحن أنفسنا ، ولكن قد ينصح أحد المراقبين الخارجيين ذوي الخبرة المختلفة بشيء غير متوقع أو يتعلم شيئًا جديدًا.


يتحرك إطار التفكير قليلاً بعد إتقان عدة لغات. ثم في اللغة A ، قد ترغب في الحصول على ميزة من B والعكس بالعكس ، كما سيظهر الوعي بنقاط القوة والضعف في كل لغة.


على سبيل المثال ، عندما حاولت التفكير وإنشاء لغتي الخاصة ، كانت أفكاري مختلفة جذريًا عن تلك الموضحة في المقالة أعلاه. فكرت في أشياء مختلفة تماما ضمن شروط مختلفة تماما. أدناه سوف أصف ميزات اللغة التي أود رؤيتها بلغة البرمجة "المثالية".


تجربتي: لقد بدأت مع باسكال ذات مرة ، وبعد ذلك تعرفت على Java و Kotlin و C ++ و Python و Scheme ، وأنا أعتبر Scala هي اللغة الرئيسية. كما في الحالة الموضحة أعلاه ، فإن لغتي "المثالية" تشترك مع لغة Scala كثيرًا. على الأقل أنا أدرك هذا التشابه)


تأثير بناء الجملة على نمط الرمز


"يمكنك الكتابة في فورتران بأي لغة"


يبدو أنه يمكن التعبير عن أي فكرة تقريبًا بأي لغة برمجة ، كما أن بناء جملة اللغة غير مهم. ولكن يتم كتابة برنامج نموذجي بسيط وقصير قدر الإمكان ، وقد تسود بعض ميزات اللغة على غيرها. أمثلة على الكود (لم أتحقق من صحتها ، هذه مجرد عرض للفكرة)


بيثون:


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


All Articles