Mais texto é o meu ponto de vista. Talvez isso permita que alguém dê uma nova olhada no design das linguagens de programação ou veja algumas vantagens e desvantagens de recursos específicos. Não entrarei em detalhes específicos do tipo "a linguagem deve ter um tempo de construção", mas simplesmente descreverei as abordagens gerais. PS: Certa vez, tive uma ideia de criar minha própria linguagem de programação, mas acabou sendo um processo bastante complicado, que ainda não dominei.
A influência da experiência anterior
Este artigo me inspirou a escrever um artigo . O autor criou sua própria linguagem de programação, e essa linguagem, com sua sintaxe e recursos, revelou-se suspeitamente semelhante ao Free Pascal, no qual foi escrita a implementação da VM para a linguagem. E isso não é coincidência. As linguagens de programação que escrevemos anteriormente direcionam o pensamento para a estrutura da linguagem. Nós mesmos podemos não perceber isso, mas um observador externo com experiência diferente pode aconselhar algo inesperado ou aprender algo novo.
A estrutura do pensamento se distancia um pouco depois de dominar várias línguas. Em seguida, no idioma A, convém ter um recurso de B e vice-versa, e a consciência dos pontos fortes e fracos de cada idioma também aparecerá.
Por exemplo, quando tentei pensar e criar minha própria linguagem, meus pensamentos eram radicalmente diferentes daqueles descritos no artigo acima. Pensei em coisas completamente diferentes em termos completamente diferentes. Abaixo, descreverei os recursos da linguagem que gostaria de ver na linguagem de programação "ideal".
Minha experiência: uma vez comecei com o pascal, depois me familiarizei com Java, Kotlin, C ++, Python, Scheme e considero o Scala a linguagem principal. Como no caso descrito acima, minha linguagem "perfeita" tem muito em comum com Scala. Pelo menos estou ciente dessa semelhança)
O efeito da sintaxe no estilo do código
"Você pode escrever no Fortran em qualquer idioma"
Parece que quase qualquer idéia pode ser expressa em qualquer linguagem de programação, e a sintaxe da linguagem não é importante. Mas um programa típico é escrito da maneira mais simples e curta possível, e alguns recursos de idioma podem prevalecer sobre outros. Exemplos de código (não verifiquei a correção, isso é apenas uma demonstração da ideia)
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, , .
-, . -, (, ), . , ( ++ ).
, , , . - , .
, , :
/ , , .
, . , .
, — .