我的观点是进一步的文字。 也许它会让某人重新审视编程语言的设计,或者了解某些特定功能的优缺点。 我将不讨论“语言应具有一段时间的构造”类型的特定细节,而仅描述一般方法。 PS我曾经有一个想法来创建自己的编程语言,但事实证明这是一个相当复杂的过程,我尚未掌握。
先前经验的影响
这篇文章启发了我写一篇文章 。 作者提出了自己的编程语言,并且这种语言的语法和功能与可疑的Free Pascal类似,后者在其上编写了用于该语言的VM的实现。 这不是巧合。 我们之前编写的编程语言使人们思考该语言的框架。 我们自己可能不会注意到这一点,但是经验不同的外部观察者可能会提供一些意想不到的建议或学习一些新知识。
精通几种语言后,思维框架会稍微分开。 然后,使用语言A,您可能希望拥有一种语言B的功能,反之亦然,并且还会出现对每种语言优缺点的认识。
例如,当我尝试思考并创建自己的语言时,我的想法与上一篇文章中描述的根本不同。 我想到了完全不同的术语中完全不同的事物。 下面,我将描述我希望在“理想”编程语言中看到的语言的功能。
我的经验:我曾经从pascal开始,后来我熟悉Java,Kotlin,C ++,Python,Scheme,并且我认为Scala是主要语言。 如上所述,我的“完美”语言与Scala有很多共同点。 至少我知道这种相似性)
语法对代码样式的影响
“您可以用任何语言用Fortran编写”
似乎几乎任何想法都可以用任何编程语言表达,并且该语言的语法并不重要。 但是典型的程序编写起来要尽可能简单和简短,并且某些语言功能可能会优先于其他语言。 代码示例(我没有检查正确性,这只是该想法的演示)
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, , .
-, . -, (, ), . , ( ++ ).
, , , . - , .
, , :
/ , , .
, . , .
, — .