Visión subjetiva de un lenguaje de programación ideal.

Más texto es mi punto de vista. Tal vez le permita a alguien echar un vistazo al diseño de los lenguajes de programación o ver algunas ventajas y desventajas de características específicas. No entraré en detalles particulares del tipo "el lenguaje debería tener una construcción temporal", sino que simplemente describiré los enfoques generales. PD: Una vez tuve la idea de crear mi propio lenguaje de programación, pero resultó ser un proceso bastante complicado, que aún no he dominado.


La influencia de la experiencia previa.


Este artículo me inspiró a escribir un artículo . El autor creó su propio lenguaje de programación, y este lenguaje con su sintaxis y características resultó ser sospechosamente similar a Free Pascal, en el que se escribió la implementación de la VM para el lenguaje. Y esto no es casualidad. Los lenguajes de programación que escribimos anteriormente conducen a pensar en el marco del lenguaje. Puede que nosotros mismos no notemos esto, pero un observador externo con una experiencia diferente puede aconsejar algo inesperado o aprender algo nuevo.


El marco de pensamiento se separa un poco después de dominar varios idiomas. Luego, en el lenguaje A, es posible que desee tener una característica de B y viceversa, y también se dará cuenta de las fortalezas y debilidades de cada idioma.


Por ejemplo, cuando traté de pensar y crear mi propio lenguaje, mis pensamientos eran fundamentalmente diferentes de los descritos en el artículo anterior. Pensé en cosas completamente diferentes dentro de términos completamente diferentes. A continuación, describiré las características del lenguaje que me gustaría ver en el lenguaje de programación "ideal".


Mi experiencia: una vez comencé con pascal, luego me familiaricé con Java, Kotlin, C ++, Python, Scheme, y considero que Scala es el lenguaje principal. Como en el caso descrito anteriormente, mi lenguaje "perfecto" tiene mucho en común con Scala. Al menos soy consciente de esta similitud)


El efecto de la sintaxis en el estilo del código


"Puedes escribir en Fortran en cualquier idioma"


Parece que casi cualquier idea puede expresarse en cualquier lenguaje de programación, y la sintaxis del lenguaje no es importante. Pero un programa típico está escrito de la manera más simple y breve posible, y algunas características del lenguaje pueden prevalecer sobre otras. Ejemplos de código (no verifiqué la corrección, esto es solo una demostración de la idea)


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


All Articles