Dan*_*l O 25 compiler-construction syntax programming-languages language-design
你自己(我认为是完美的)编程语言会是什么样的?举一个小例子来解释你的新想法吧!
我对语法很感兴趣.
Kon*_*lph 15
乔恩说得对,"[d]不同的任务适合不同的语言和范例."然而,有一些考虑因素在很大程度上独立于领域.这些主要涉及语法,但由于代码的读取频率高于写入,因此我认为语法很重要.
一方面,以及许多语言错误的东西,将语法基于C语言完全是任意的.C实际上有一个非常糟糕的语法.我将选择两个例子.
第一个是没有争议的:分号是不必要的.请使用以下代码; 语法完全明确,易于解析编译器.分号和明确的行继续都不是必需的.
answer = 42
fraction = answer * 2 /
(answer + 1)
Console.WriteLine(
"Some funny number: {0}",
fraction
)
Run Code Online (Sandbox Code Playgroud)
这实际上与Python非常相似,但更宽松:fraction跨越多行的定义.这是合乎逻辑的,因为第一行尚未完成.
我必须选择类似C语法的另一个骨头是它们的隐含变量声明.他们羞涩地低声说道,而不是明确宣布"我宣布一种variable类型" Foo,而不是" Foo var".由于Foo在大多数情况下甚至不是保留字,因此程序员不会在此提供单一的视觉提示.我更喜欢VB的显式Dim var As Foo,甚至认为这里使用的关键字是,非常暗淡.
(C++实际上通过引入许多几乎相同且通常含糊不清的语法来实现更多,更糟糕的是,这些语法意味着完全不同的东西,从变量初始化到函数声明).
我的语言必须要做的另一件事是静态输入.确实,动态类型有其用途,但它们非常罕见.即使是大多数"脚本语言"也不会真正需要它们.我认为这通常与隐式打字混淆,后者具有更多用途.拿(再次)Python的例子.为什么不提供静态输入?它已经是强类型的,静态类型检查只会随之而来,并且会在调试时减少很多.显式变量声明也是如此.我没有看到隐含变量声明提供的优势.
所以我们已经有了一种语言大纲:
此外,我是某些C++概念的忠实粉丝,例如通用模板,RAII(即避免垃圾而不是收集它),不变性以及通过迭代器定义的值范围的概念.我在别处说过,我认为迭代器是有史以来最基本的创新之一.Give'em有点口红,你甚至不会认识到C++丑陋的野兽:
for i in MyVector:
print(i)
Run Code Online (Sandbox Code Playgroud)
而不是
for (typename vector<T>::const_iterator i = MyVector.begin();
i != MyVector.end();
++i)
cout << *i << endl;
Run Code Online (Sandbox Code Playgroud)
当然我知道上面的语法是由许多语言提供的.但它们都只提供了C++强大的迭代器概念的淡化版本(使用C++术语,大多数语言都知道的唯一类型的迭代器是输入迭代器,它们基本上是最不强大的迭代器).
在这一点上,我应该说,所有这些想法的唯一版权是我的,正在申请专利(特别是对于没有真正比较对象参考的MayOrMayNotBe运营商).
Jon*_*eet 10
我没有"完美"编程语言的概念,因为不仅要执行一项任务.
不同的任务适合不同的语言和范例.
我完美的语言可以让我在需要的时候提升功能.如果我需要编写一个没有类的小型直接实用程序,我可以.如果我需要使用类,我也可以这样做,如果我想编写一个完全面向对象的解决方案,我也可以这样做.链接器足够聪明,可以让我创建小型快速命令行实用程序(没有运行时依赖性)或我能想象的最大的膨胀OOP GUI应用程序.
问题是我喜欢的东西有相反的目标,因此我总是被迫使用完全不同的语言.我目前没有特别使用PowerShell,VBScript,PowerBasic,Java和C#(有时候是VB .NET,VB 6,C++,Python和Perl).
现在,如果我能够在创建这些小应用程序时使用一个具有全局函数且没有运行时依赖性的C#语言来完成所有操作,那么让我在需要时充分利用.NET Framework和Java SDK的强大功能,我我很高兴.
完美的编程语言往往出现在科幻小说中.例如:
这一切仍然归结为同样的基本困境.任何不强迫人类学习技能的编程语言都会限制思想的自由.自然语言也不好,因为它有很多含糊之处.
我不介意将自由与权力和最小语法结合起来的人.我最近开始学习lisp,到目前为止看起来非常好.
job = "Upvote this answer"
@price = "$0.01"
fork(10000, job, @price)
Run Code Online (Sandbox Code Playgroud)