Un texte supplĂ©mentaire est mon point de vue. Peut-ĂȘtre que cela permettra Ă quelqu'un de jeter un regard neuf sur la conception des langages de programmation ou de voir certains avantages et inconvĂ©nients de fonctionnalitĂ©s spĂ©cifiques. Je n'entrerai pas dans des dĂ©tails particuliers du type «le langage devrait avoir un certain temps», mais je dĂ©crirai simplement les approches gĂ©nĂ©rales. PS J'ai eu une fois l'idĂ©e de crĂ©er mon propre langage de programmation, mais cela s'est avĂ©rĂ© ĂȘtre un processus assez compliquĂ©, que je n'ai pas encore maĂźtrisĂ©.
L'influence de l'expérience antérieure
Cet article m'a inspirĂ© pour Ă©crire un article . L'auteur est venu avec son propre langage de programmation, et ce langage avec sa syntaxe et ses fonctionnalitĂ©s s'est avĂ©rĂ© ĂȘtre Ă©trangement similaire Ă Free Pascal, sur lequel la mise en Ćuvre de la machine virtuelle pour le langage a Ă©tĂ© Ă©crite. Et ce n'est pas un hasard. Les langages de programmation que nous avons Ă©crits prĂ©cĂ©demment poussent la rĂ©flexion dans le cadre du langage. Nous ne le remarquons peut-ĂȘtre pas nous-mĂȘmes, mais un observateur extĂ©rieur ayant une expĂ©rience diffĂ©rente peut conseiller quelque chose d'inattendu ou apprendre quelque chose de nouveau.
Le cadre de la pensĂ©e s'Ă©loigne un peu aprĂšs avoir maĂźtrisĂ© plusieurs langues. Ensuite, dans la langue A, vous voudrez peut-ĂȘtre avoir une fonctionnalitĂ© de B et vice versa, et une prise de conscience des forces et des faiblesses de chaque langue apparaĂźtra Ă©galement.
Par exemple, lorsque j'ai essayé de penser et de créer mon propre langage, mes pensées étaient radicalement différentes de celles décrites dans l'article ci-dessus. J'ai pensé à des choses complÚtement différentes dans des termes complÚtement différents. Ci-dessous, je décrirai les caractéristiques du langage que j'aimerais voir dans le langage de programmation "idéal".
Mon expérience: j'ai une fois commencé avec pascal, plus tard j'ai fait connaissance avec Java, Kotlin, C ++, Python, Scheme, et je considÚre Scala comme le langage principal. Comme dans le cas décrit ci-dessus, ma langue «parfaite» a beaucoup en commun avec Scala. Au moins, je suis conscient de cette similitude)
L'effet de la syntaxe sur le style de code
"Vous pouvez écrire en Fortran dans n'importe quelle langue"
Il semblerait que presque n'importe quelle idĂ©e puisse ĂȘtre exprimĂ©e dans n'importe quel langage de programmation, et la syntaxe du langage n'est pas importante. Mais un programme typique est Ă©crit aussi simple et court que possible, et certaines fonctionnalitĂ©s du langage peuvent prĂ©valoir sur d'autres. Exemples de code (je n'ai pas vĂ©rifiĂ© l'exactitude, ce n'est qu'une dĂ©monstration de l'idĂ©e)
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)
, , . .
- , "" , - (, )
- , .
- , .
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, , .
-, . -, (, ), . , ( ++ ).
, , , . - , .
, , :
/ , , .
, . , .
, â .