6
社区成员
发帖
与我相关
我的任务
分享在整个计算历史中,两种语言并存。这些没有任何确定的名称,所以我会弥补一些:
这种划分是有道理的,因为 99% 的代码不必非常高效。用高级语言编写所有内容意味着我们将用完计算机来运行这些东西。用底层语言编写所有内容意味着我们会用完程序员。我们采用的健康组合让我们两者兼得。
但这种情况并不对称。绝大多数语言都是高地语言。与此同时,它的低端只是汇编、C 和 C++,没有人对此感到高兴。其他一切都没有达到这些流行度的 1%。
已经有很多尝试来挑战这种情况。首先,出现了中间地带语言,如 Java、C# 和 Go。这些是内存管理和 JIT 编译的,通常与人工微基准测试中的低端语言相匹配。与我们的希望相反,他们从来没有达到严重挑战底层语言的地步,因为他们的内存使用通常是 C/C++ 的两倍,而且即使是最好的 GC 也会使执行时间变得高度不可预测。
随着时间的推移,已经有许多尝试挑战 C/C++ 在低地的主导地位。最近是 Rust,它似乎获得了有限的关注(而且它是低端语言还是中端语言甚至有争议)。但在此之前很久,一个有点值得注意但最终失败的低地尝试是 [D 编程语言]( https://en.wikipedia.org/wiki/D_(programming_language\) )。甚至它的名字也意味着挑战。
但首先,让我们来看看你好,世界!
<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code><span style="color:var(--syntax-comment-color)">// hello world in D</span>
<span style="color:var(--syntax-text-color)">import</span> <span style="color:var(--syntax-text-color)">std</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">stdio</span><span style="color:var(--syntax-text-color)">;</span>
<span style="color:var(--syntax-declaration-color)">void</span> <span style="color:var(--syntax-name-color)">main</span><span style="color:var(--syntax-text-color)">()</span> <span style="color:var(--syntax-text-color)">{</span>
<span style="color:var(--syntax-text-color)">writeln</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-string-color)">"Hello World"</span><span style="color:var(--syntax-text-color)">);</span>
<span style="color:var(--syntax-text-color)">}</span>
</code></span></span>
好的,这里没什么了不起的。
让我们做通常的💩测试:
console.log只打印复杂类型的东西==适用于复杂类型
<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code><span style="color:var(--syntax-text-color)">import</span> <span style="color:var(--syntax-text-color)">std</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">stdio</span><span style="color:var(--syntax-text-color)">;</span>
<span style="color:var(--syntax-text-color)">import</span> <span style="color:var(--syntax-text-color)">std</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">string</span><span style="color:var(--syntax-text-color)">;</span>
<span style="color:var(--syntax-text-color)">import</span> <span style="color:var(--syntax-text-color)">std</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">utf</span><span style="color:var(--syntax-text-color)">;</span>
<span style="color:var(--syntax-declaration-color)">void</span> <span style="color:var(--syntax-name-color)">main</span><span style="color:var(--syntax-text-color)">()</span> <span style="color:var(--syntax-text-color)">{</span>
<span style="color:var(--syntax-declaration-color)">int</span><span style="color:var(--syntax-text-color)">[]</span> <span style="color:var(--syntax-text-color)">arr1</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-text-color)">[</span><span style="color:var(--syntax-literal-color)">1</span><span style="color:var(--syntax-text-color)">,</span><span style="color:var(--syntax-literal-color)">2</span><span style="color:var(--syntax-text-color)">,</span><span style="color:var(--syntax-literal-color)">3</span><span style="color:var(--syntax-text-color)">];</span>
<span style="color:var(--syntax-declaration-color)">int</span><span style="color:var(--syntax-text-color)">[]</span> <span style="color:var(--syntax-text-color)">arr2</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-text-color)">[</span><span style="color:var(--syntax-literal-color)">1</span><span style="color:var(--syntax-text-color)">,</span><span style="color:var(--syntax-literal-color)">2</span><span style="color:var(--syntax-text-color)">,</span><span style="color:var(--syntax-literal-color)">3</span><span style="color:var(--syntax-text-color)">];</span>
<span style="color:var(--syntax-declaration-color)">int</span><span style="color:var(--syntax-text-color)">[]</span> <span style="color:var(--syntax-text-color)">arr3</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-text-color)">[</span><span style="color:var(--syntax-literal-color)">4</span><span style="color:var(--syntax-text-color)">,</span><span style="color:var(--syntax-literal-color)">5</span><span style="color:var(--syntax-text-color)">,</span><span style="color:var(--syntax-literal-color)">6</span><span style="color:var(--syntax-text-color)">];</span>
<span style="color:var(--syntax-text-color)">string</span> <span style="color:var(--syntax-text-color)">s1</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-string-color)">"hello"</span><span style="color:var(--syntax-text-color)">;</span>
<span style="color:var(--syntax-text-color)">string</span> <span style="color:var(--syntax-text-color)">s2</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-string-color)">"hello"</span><span style="color:var(--syntax-text-color)">;</span>
<span style="color:var(--syntax-text-color)">string</span> <span style="color:var(--syntax-text-color)">s3</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-string-color)">"Żółw"</span><span style="color:var(--syntax-text-color)">;</span>
<span style="color:var(--syntax-text-color)">string</span> <span style="color:var(--syntax-text-color)">s4</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-string-color)">"💩"</span><span style="color:var(--syntax-text-color)">;</span>
<span style="color:var(--syntax-text-color)">writefln</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-string-color)">"Printing arrays: %s"</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-text-color)">arr1</span><span style="color:var(--syntax-text-color)">);</span>
<span style="color:var(--syntax-text-color)">writefln</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-string-color)">"Array equality: %s %s"</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-text-color)">arr1</span> <span style="color:var(--syntax-error-color)">==</span> <span style="color:var(--syntax-text-color)">arr2</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-text-color)">arr1</span> <span style="color:var(--syntax-error-color)">==</span> <span style="color:var(--syntax-text-color)">arr3</span><span style="color:var(--syntax-text-color)">);</span>
<span style="color:var(--syntax-text-color)">writefln</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-string-color)">"String equality: %s %s"</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-text-color)">s1</span> <span style="color:var(--syntax-error-color)">==</span> <span style="color:var(--syntax-text-color)">s2</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-text-color)">s1</span> <span style="color:var(--syntax-error-color)">==</span> <span style="color:var(--syntax-text-color)">s3</span><span style="color:var(--syntax-text-color)">);</span>
<span style="color:var(--syntax-text-color)">writefln</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-string-color)">"Unicode length: %s %s %s"</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-text-color)">s1</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">length</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-text-color)">s3</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">length</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-text-color)">s4</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">length</span><span style="color:var(--syntax-text-color)">);</span>
<span style="color:var(--syntax-text-color)">writefln</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-string-color)">"Unicode length: %s %s %s"</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-text-color)">std</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">utf</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">count</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-text-color)">s1</span><span style="color:var(--syntax-text-color)">),</span> <span style="color:var(--syntax-text-color)">std</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">utf</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">count</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-text-color)">s3</span><span style="color:var(--syntax-text-color)">),</span> <span style="color:var(--syntax-text-color)">std</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">utf</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">count</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-text-color)">s4</span><span style="color:var(--syntax-text-color)">));</span>
<span style="color:var(--syntax-text-color)">writefln</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-string-color)">"Unicode upcase %s"</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-text-color)">toUpper</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-text-color)">s3</span><span style="color:var(--syntax-text-color)">));</span>
<span style="color:var(--syntax-text-color)">}</span>
</code></span></span>
它打印:
<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code>Printing arrays: [1, 2, 3]
Array equality: true false
String equality: true false
Unicode length: 5 7 4
Unicode length: 5 4 1
Unicode upcase ŻÓŁW
</code></span></span>
很好==,我们有某种console.log,UTF8 是半支持的。.length返回字节数,我们需要特殊函数来计算实际字符数。可能更糟。
<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code><span style="color:var(--syntax-text-color)">import</span> <span style="color:var(--syntax-text-color)">std</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">stdio</span><span style="color:var(--syntax-text-color)">;</span>
<span style="color:var(--syntax-declaration-color)">int</span> <span style="color:var(--syntax-name-color)">fib</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-declaration-color)">int</span> <span style="color:var(--syntax-text-color)">n</span><span style="color:var(--syntax-text-color)">)</span> <span style="color:var(--syntax-text-color)">{</span>
<span style="color:var(--syntax-declaration-color)">if</span> <span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-text-color)">n</span> <span style="color:var(--syntax-error-color)"><=</span> <span style="color:var(--syntax-literal-color)">2</span><span style="color:var(--syntax-text-color)">)</span> <span style="color:var(--syntax-text-color)">{</span>
<span style="color:var(--syntax-declaration-color)">return</span> <span style="color:var(--syntax-literal-color)">1</span><span style="color:var(--syntax-text-color)">;</span>
<span style="color:var(--syntax-text-color)">}</span>
<span style="color:var(--syntax-declaration-color)">return</span> <span style="color:var(--syntax-text-color)">fib</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-text-color)">n</span> <span style="color:var(--syntax-error-color)">-</span> <span style="color:var(--syntax-literal-color)">1</span><span style="color:var(--syntax-text-color)">)</span> <span style="color:var(--syntax-error-color)">+</span> <span style="color:var(--syntax-text-color)">fib</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-text-color)">n</span> <span style="color:var(--syntax-error-color)">-</span> <span style="color:var(--syntax-literal-color)">2</span><span style="color:var(--syntax-text-color)">);</span>
<span style="color:var(--syntax-text-color)">}</span>
<span style="color:var(--syntax-declaration-color)">void</span> <span style="color:var(--syntax-name-color)">main</span><span style="color:var(--syntax-text-color)">()</span> <span style="color:var(--syntax-text-color)">{</span>
<span style="color:var(--syntax-declaration-color)">for</span> <span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-declaration-color)">int</span> <span style="color:var(--syntax-text-color)">i</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-literal-color)">1</span><span style="color:var(--syntax-text-color)">;</span> <span style="color:var(--syntax-text-color)">i</span> <span style="color:var(--syntax-error-color)"><=</span> <span style="color:var(--syntax-literal-color)">40</span><span style="color:var(--syntax-text-color)">;</span> <span style="color:var(--syntax-text-color)">i</span><span style="color:var(--syntax-error-color)">++</span><span style="color:var(--syntax-text-color)">)</span> <span style="color:var(--syntax-text-color)">{</span>
<span style="color:var(--syntax-text-color)">writeln</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-text-color)">fib</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-text-color)">i</span><span style="color:var(--syntax-text-color)">));</span>
<span style="color:var(--syntax-text-color)">}</span>
<span style="color:var(--syntax-text-color)">}</span>
</code></span></span>
这也可能是 C++。
<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code><span style="color:var(--syntax-text-color)">import</span> <span style="color:var(--syntax-text-color)">std</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">stdio</span><span style="color:var(--syntax-text-color)">;</span>
<span style="color:var(--syntax-text-color)">import</span> <span style="color:var(--syntax-text-color)">std</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">conv</span><span style="color:var(--syntax-text-color)">;</span>
<span style="color:var(--syntax-text-color)">string</span> <span style="color:var(--syntax-name-color)">fizzbuzz</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-declaration-color)">int</span> <span style="color:var(--syntax-text-color)">n</span><span style="color:var(--syntax-text-color)">)</span> <span style="color:var(--syntax-text-color)">{</span>
<span style="color:var(--syntax-declaration-color)">if</span> <span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-text-color)">n</span> <span style="color:var(--syntax-error-color)">%</span> <span style="color:var(--syntax-literal-color)">15</span> <span style="color:var(--syntax-error-color)">==</span> <span style="color:var(--syntax-literal-color)">0</span><span style="color:var(--syntax-text-color)">)</span> <span style="color:var(--syntax-text-color)">{</span>
<span style="color:var(--syntax-declaration-color)">return</span> <span style="color:var(--syntax-string-color)">"FizzBuzz"</span><span style="color:var(--syntax-text-color)">;</span>
<span style="color:var(--syntax-text-color)">}</span> <span style="color:var(--syntax-declaration-color)">else</span> <span style="color:var(--syntax-declaration-color)">if</span> <span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-text-color)">n</span> <span style="color:var(--syntax-error-color)">%</span> <span style="color:var(--syntax-literal-color)">3</span> <span style="color:var(--syntax-error-color)">==</span> <span style="color:var(--syntax-literal-color)">0</span><span style="color:var(--syntax-text-color)">)</span> <span style="color:var(--syntax-text-color)">{</span>
<span style="color:var(--syntax-declaration-color)">return</span> <span style="color:var(--syntax-string-color)">"Fizz"</span><span style="color:var(--syntax-text-color)">;</span>
<span style="color:var(--syntax-text-color)">}</span> <span style="color:var(--syntax-declaration-color)">else</span> <span style="color:var(--syntax-declaration-color)">if</span> <span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-text-color)">n</span> <span style="color:var(--syntax-error-color)">%</span> <span style="color:var(--syntax-literal-color)">5</span> <span style="color:var(--syntax-error-color)">==</span> <span style="color:var(--syntax-literal-color)">0</span><span style="color:var(--syntax-text-color)">)</span> <span style="color:var(--syntax-text-color)">{</span>
<span style="color:var(--syntax-declaration-color)">return</span> <span style="color:var(--syntax-string-color)">"Buzz"</span><span style="color:var(--syntax-text-color)">;</span>
<span style="color:var(--syntax-text-color)">}</span> <span style="color:var(--syntax-declaration-color)">else</span> <span style="color:var(--syntax-text-color)">{</span>
<span style="color:var(--syntax-declaration-color)">return</span> <span style="color:var(--syntax-text-color)">to</span><span style="color:var(--syntax-error-color)">!</span><span style="color:var(--syntax-text-color)">string</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-text-color)">n</span><span style="color:var(--syntax-text-color)">);</span>
<span style="color:var(--syntax-text-color)">}</span>
<span style="color:var(--syntax-text-color)">}</span>
<span style="color:var(--syntax-declaration-color)">void</span> <span style="color:var(--syntax-name-color)">main</span><span style="color:var(--syntax-text-color)">()</span> <span style="color:var(--syntax-text-color)">{</span>
<span style="color:var(--syntax-declaration-color)">for</span> <span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-declaration-color)">int</span> <span style="color:var(--syntax-text-color)">i</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-literal-color)">1</span><span style="color:var(--syntax-text-color)">;</span> <span style="color:var(--syntax-text-color)">i</span> <span style="color:var(--syntax-error-color)"><=</span> <span style="color:var(--syntax-literal-color)">100</span><span style="color:var(--syntax-text-color)">;</span> <span style="color:var(--syntax-text-color)">i</span><span style="color:var(--syntax-error-color)">++</span><span style="color:var(--syntax-text-color)">)</span> <span style="color:var(--syntax-text-color)">{</span>
<span style="color:var(--syntax-text-color)">writeln</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-text-color)">fizzbuzz</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-text-color)">i</span><span style="color:var(--syntax-text-color)">));</span>
<span style="color:var(--syntax-text-color)">}</span>
<span style="color:var(--syntax-text-color)">}</span>
</code></span></span>
到目前为止,它没有留下深刻印象。有一些奇怪的to!string转换语法,其余的看起来很像 C++ 代码。
现在这完全是故意的。D 试图取代 C/C++,因此它试图用熟悉的语法来吸引 C/C++ 程序员。这也是 Java、JavaScript 和 C# 所做的。
值得注意的是,一些较新的语言,如 Go 和 Rust,针对相同的中低端,更愿意使用不熟悉的语法。
类的工作方式与 C++ 类非常相似,除了相当奇怪的运算符重载。
<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code><span style="color:var(--syntax-text-color)">import</span> <span style="color:var(--syntax-text-color)">std</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">stdio</span><span style="color:var(--syntax-text-color)">;</span>
<span style="color:var(--syntax-text-color)">import</span> <span style="color:var(--syntax-text-color)">std</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">format</span><span style="color:var(--syntax-text-color)">;</span>
<span style="color:var(--syntax-declaration-color)">class</span> <span style="color:var(--syntax-name-color)">Point</span> <span style="color:var(--syntax-text-color)">{</span>
<span style="color:var(--syntax-declaration-color)">float</span> <span style="color:var(--syntax-text-color)">x</span><span style="color:var(--syntax-text-color)">,</span><span style="color:var(--syntax-text-color)">y</span><span style="color:var(--syntax-text-color)">;</span>
<span style="color:var(--syntax-declaration-color)">this</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-declaration-color)">float</span> <span style="color:var(--syntax-text-color)">x</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-declaration-color)">float</span> <span style="color:var(--syntax-text-color)">y</span><span style="color:var(--syntax-text-color)">)</span> <span style="color:var(--syntax-text-color)">{</span>
<span style="color:var(--syntax-declaration-color)">this</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">x</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-text-color)">x</span><span style="color:var(--syntax-text-color)">;</span>
<span style="color:var(--syntax-declaration-color)">this</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">y</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-text-color)">y</span><span style="color:var(--syntax-text-color)">;</span>
<span style="color:var(--syntax-text-color)">}</span>
<span style="color:var(--syntax-text-color)">Point</span> <span style="color:var(--syntax-text-color)">add</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-text-color)">Point</span> <span style="color:var(--syntax-text-color)">p</span><span style="color:var(--syntax-text-color)">)</span> <span style="color:var(--syntax-text-color)">{</span>
<span style="color:var(--syntax-declaration-color)">return</span> <span style="color:var(--syntax-declaration-color)">new</span> <span style="color:var(--syntax-text-color)">Point</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-declaration-color)">this</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">x</span> <span style="color:var(--syntax-error-color)">+</span> <span style="color:var(--syntax-text-color)">p</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">x</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-declaration-color)">this</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">y</span> <span style="color:var(--syntax-error-color)">+</span> <span style="color:var(--syntax-text-color)">p</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">y</span><span style="color:var(--syntax-text-color)">);</span>
<span style="color:var(--syntax-text-color)">}</span>
<span style="color:var(--syntax-declaration-color)">override</span> <span style="color:var(--syntax-text-color)">string</span> <span style="color:var(--syntax-text-color)">toString</span><span style="color:var(--syntax-text-color)">()</span> <span style="color:var(--syntax-text-color)">{</span>
<span style="color:var(--syntax-declaration-color)">return</span> <span style="color:var(--syntax-text-color)">format</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-string-color)">"<%f,%f>"</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-text-color)">x</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-text-color)">y</span><span style="color:var(--syntax-text-color)">);</span>
<span style="color:var(--syntax-text-color)">}</span>
<span style="color:var(--syntax-text-color)">}</span>
<span style="color:var(--syntax-declaration-color)">void</span> <span style="color:var(--syntax-name-color)">main</span><span style="color:var(--syntax-text-color)">()</span> <span style="color:var(--syntax-text-color)">{</span>
<span style="color:var(--syntax-declaration-color)">auto</span> <span style="color:var(--syntax-text-color)">a</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-declaration-color)">new</span> <span style="color:var(--syntax-text-color)">Point</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-literal-color)">2.0</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-literal-color)">3.0</span><span style="color:var(--syntax-text-color)">);</span>
<span style="color:var(--syntax-declaration-color)">auto</span> <span style="color:var(--syntax-text-color)">b</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-declaration-color)">new</span> <span style="color:var(--syntax-text-color)">Point</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-literal-color)">3.5</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-literal-color)">7.0</span><span style="color:var(--syntax-text-color)">);</span>
<span style="color:var(--syntax-text-color)">writefln</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-string-color)">"%s + %s = %s"</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-text-color)">a</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-text-color)">b</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-text-color)">a</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">add</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-text-color)">b</span><span style="color:var(--syntax-text-color)">));</span>
<span style="color:var(--syntax-text-color)">}</span>
</code></span></span>
如果我们运行这个,我们或多或少会得到我们期望的:
<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code>$ dmd point.d
$ ./point
<2.000000,3.000000> + <3.500000,7.000000> = <5.500000,10.000000>
</code></span></span>
好的,到目前为止它完全没有意思。让我们看一些更有趣的东西——D 是如何管理内存的。
所以 D 默认情况下 GC 一切都像 Java。但是你也可以把一些内存区域排除在GC之外,有非GC的线程,非GC的函数等等。
老实说,我不知道在普通垃圾收集代码的便利性与任何可能想要避免 GC 的特殊需求代码之间的平衡有多好,因为从来没有任何用 D 编写的主要软件可以用来判断它。
我们可以显式地将一个函数标记为 no-GC:
<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code><span style="color:var(--syntax-text-color)">import</span> <span style="color:var(--syntax-text-color)">std</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">stdio</span><span style="color:var(--syntax-text-color)">;</span>
<span style="color:var(--syntax-text-color)">import</span> <span style="color:var(--syntax-text-color)">std</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">format</span><span style="color:var(--syntax-text-color)">;</span>
<span style="color:var(--syntax-text-color)">import</span> <span style="color:var(--syntax-text-color)">std</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">math</span><span style="color:var(--syntax-text-color)">;</span>
<span style="color:var(--syntax-declaration-color)">class</span> <span style="color:var(--syntax-name-color)">Point</span> <span style="color:var(--syntax-text-color)">{</span>
<span style="color:var(--syntax-declaration-color)">float</span> <span style="color:var(--syntax-text-color)">x</span><span style="color:var(--syntax-text-color)">,</span><span style="color:var(--syntax-text-color)">y</span><span style="color:var(--syntax-text-color)">;</span>
<span style="color:var(--syntax-declaration-color)">this</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-declaration-color)">float</span> <span style="color:var(--syntax-text-color)">x</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-declaration-color)">float</span> <span style="color:var(--syntax-text-color)">y</span><span style="color:var(--syntax-text-color)">)</span> <span style="color:var(--syntax-text-color)">{</span>
<span style="color:var(--syntax-declaration-color)">this</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">x</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-text-color)">x</span><span style="color:var(--syntax-text-color)">;</span>
<span style="color:var(--syntax-declaration-color)">this</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">y</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-text-color)">y</span><span style="color:var(--syntax-text-color)">;</span>
<span style="color:var(--syntax-text-color)">}</span>
<span style="color:var(--syntax-text-color)">Point</span> <span style="color:var(--syntax-text-color)">add</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-text-color)">Point</span> <span style="color:var(--syntax-text-color)">p</span><span style="color:var(--syntax-text-color)">)</span> <span style="color:var(--syntax-text-color)">{</span>
<span style="color:var(--syntax-declaration-color)">return</span> <span style="color:var(--syntax-declaration-color)">new</span> <span style="color:var(--syntax-text-color)">Point</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-declaration-color)">this</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">x</span> <span style="color:var(--syntax-error-color)">+</span> <span style="color:var(--syntax-text-color)">p</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">x</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-declaration-color)">this</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">y</span> <span style="color:var(--syntax-error-color)">+</span> <span style="color:var(--syntax-text-color)">p</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">y</span><span style="color:var(--syntax-text-color)">);</span>
<span style="color:var(--syntax-text-color)">}</span>
<span style="color:var(--syntax-declaration-color)">override</span> <span style="color:var(--syntax-text-color)">string</span> <span style="color:var(--syntax-text-color)">toString</span><span style="color:var(--syntax-text-color)">()</span> <span style="color:var(--syntax-text-color)">{</span>
<span style="color:var(--syntax-declaration-color)">return</span> <span style="color:var(--syntax-text-color)">format</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-string-color)">"<%f,%f>"</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-text-color)">x</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-text-color)">y</span><span style="color:var(--syntax-text-color)">);</span>
<span style="color:var(--syntax-text-color)">}</span>
@<span style="color:var(--syntax-text-color)">nogc</span> <span style="color:var(--syntax-declaration-color)">float</span> <span style="color:var(--syntax-text-color)">size</span><span style="color:var(--syntax-text-color)">()</span> <span style="color:var(--syntax-text-color)">{</span>
<span style="color:var(--syntax-declaration-color)">return</span> <span style="color:var(--syntax-text-color)">sqrt</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-text-color)">x</span><span style="color:var(--syntax-error-color)">*</span><span style="color:var(--syntax-text-color)">x</span> <span style="color:var(--syntax-error-color)">+</span> <span style="color:var(--syntax-text-color)">y</span><span style="color:var(--syntax-error-color)">*</span><span style="color:var(--syntax-text-color)">y</span><span style="color:var(--syntax-text-color)">);</span>
<span style="color:var(--syntax-text-color)">}</span>
<span style="color:var(--syntax-text-color)">}</span>
<span style="color:var(--syntax-declaration-color)">void</span> <span style="color:var(--syntax-name-color)">main</span><span style="color:var(--syntax-text-color)">()</span> <span style="color:var(--syntax-text-color)">{</span>
<span style="color:var(--syntax-declaration-color)">auto</span> <span style="color:var(--syntax-text-color)">a</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-declaration-color)">new</span> <span style="color:var(--syntax-text-color)">Point</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-literal-color)">2.0</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-literal-color)">3.0</span><span style="color:var(--syntax-text-color)">);</span>
<span style="color:var(--syntax-declaration-color)">auto</span> <span style="color:var(--syntax-text-color)">b</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-declaration-color)">new</span> <span style="color:var(--syntax-text-color)">Point</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-literal-color)">3.5</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-literal-color)">7.0</span><span style="color:var(--syntax-text-color)">);</span>
<span style="color:var(--syntax-text-color)">writefln</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-string-color)">"%s + %s = %s"</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-text-color)">a</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-text-color)">b</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-text-color)">a</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">add</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-text-color)">b</span><span style="color:var(--syntax-text-color)">));</span>
<span style="color:var(--syntax-text-color)">writefln</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-string-color)">"Length of %s if %f"</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-text-color)">a</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-text-color)">a</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">size</span><span style="color:var(--syntax-text-color)">());</span>
<span style="color:var(--syntax-text-color)">}</span>
</code></span></span>
如果我们尝试标记任何可能潜在分配为的内容@nogc,编译器将返回如下错误:
<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code>gc.d(13): Error: `@nogc` function `gc.Point.add` cannot call non-@nogc constructor `gc.Point.this`
gc.d(17): Error: `@nogc` function `gc.Point.toString` cannot call non-@nogc function `std.format.format!(char, float, float).format`
</code></span></span>
我不太确定这在玩具示例之外有多实用。
与 C++ 不同,它们是同一件事,D 具有针对简单情况使用类型变量系统的泛型,以及针对更复杂情况的单独模板系统。
这是一个通用类:
<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code><span style="color:var(--syntax-text-color)">import</span> <span style="color:var(--syntax-text-color)">std</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">stdio</span><span style="color:var(--syntax-text-color)">;</span>
<span style="color:var(--syntax-text-color)">import</span> <span style="color:var(--syntax-text-color)">std</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">format</span><span style="color:var(--syntax-text-color)">;</span>
<span style="color:var(--syntax-text-color)">import</span> <span style="color:var(--syntax-text-color)">std</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">math</span><span style="color:var(--syntax-text-color)">;</span>
<span style="color:var(--syntax-declaration-color)">class</span> <span style="color:var(--syntax-name-color)">Point</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-text-color)">T</span><span style="color:var(--syntax-text-color)">)</span> <span style="color:var(--syntax-text-color)">{</span>
<span style="color:var(--syntax-text-color)">T</span> <span style="color:var(--syntax-text-color)">x</span><span style="color:var(--syntax-text-color)">,</span><span style="color:var(--syntax-text-color)">y</span><span style="color:var(--syntax-text-color)">;</span>
<span style="color:var(--syntax-declaration-color)">this</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-text-color)">T</span> <span style="color:var(--syntax-text-color)">x</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-text-color)">T</span> <span style="color:var(--syntax-text-color)">y</span><span style="color:var(--syntax-text-color)">)</span> <span style="color:var(--syntax-text-color)">{</span>
<span style="color:var(--syntax-declaration-color)">this</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">x</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-text-color)">x</span><span style="color:var(--syntax-text-color)">;</span>
<span style="color:var(--syntax-declaration-color)">this</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">y</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-text-color)">y</span><span style="color:var(--syntax-text-color)">;</span>
<span style="color:var(--syntax-text-color)">}</span>
<span style="color:var(--syntax-text-color)">Point</span> <span style="color:var(--syntax-text-color)">add</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-text-color)">Point</span> <span style="color:var(--syntax-text-color)">p</span><span style="color:var(--syntax-text-color)">)</span> <span style="color:var(--syntax-text-color)">{</span>
<span style="color:var(--syntax-declaration-color)">return</span> <span style="color:var(--syntax-declaration-color)">new</span> <span style="color:var(--syntax-text-color)">Point</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-declaration-color)">this</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">x</span> <span style="color:var(--syntax-error-color)">+</span> <span style="color:var(--syntax-text-color)">p</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">x</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-declaration-color)">this</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">y</span> <span style="color:var(--syntax-error-color)">+</span> <span style="color:var(--syntax-text-color)">p</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">y</span><span style="color:var(--syntax-text-color)">);</span>
<span style="color:var(--syntax-text-color)">}</span>
<span style="color:var(--syntax-declaration-color)">override</span> <span style="color:var(--syntax-text-color)">string</span> <span style="color:var(--syntax-text-color)">toString</span><span style="color:var(--syntax-text-color)">()</span> <span style="color:var(--syntax-text-color)">{</span>
<span style="color:var(--syntax-declaration-color)">return</span> <span style="color:var(--syntax-text-color)">format</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-string-color)">"<%s,%s>"</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-text-color)">x</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-text-color)">y</span><span style="color:var(--syntax-text-color)">);</span>
<span style="color:var(--syntax-text-color)">}</span>
<span style="color:var(--syntax-text-color)">}</span>
<span style="color:var(--syntax-declaration-color)">void</span> <span style="color:var(--syntax-name-color)">main</span><span style="color:var(--syntax-text-color)">()</span> <span style="color:var(--syntax-text-color)">{</span>
<span style="color:var(--syntax-declaration-color)">auto</span> <span style="color:var(--syntax-text-color)">a</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-declaration-color)">new</span> <span style="color:var(--syntax-text-color)">Point</span><span style="color:var(--syntax-error-color)">!</span><span style="color:var(--syntax-declaration-color)">int</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-literal-color)">400</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-literal-color)">300</span><span style="color:var(--syntax-text-color)">);</span>
<span style="color:var(--syntax-declaration-color)">auto</span> <span style="color:var(--syntax-text-color)">b</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-declaration-color)">new</span> <span style="color:var(--syntax-text-color)">Point</span><span style="color:var(--syntax-error-color)">!</span><span style="color:var(--syntax-declaration-color)">int</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-error-color)">-</span><span style="color:var(--syntax-literal-color)">200</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-literal-color)">100</span><span style="color:var(--syntax-text-color)">);</span>
<span style="color:var(--syntax-declaration-color)">auto</span> <span style="color:var(--syntax-text-color)">c</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-declaration-color)">new</span> <span style="color:var(--syntax-text-color)">Point</span><span style="color:var(--syntax-error-color)">!</span><span style="color:var(--syntax-declaration-color)">double</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-literal-color)">3.5</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-literal-color)">7.0</span><span style="color:var(--syntax-text-color)">);</span>
<span style="color:var(--syntax-declaration-color)">auto</span> <span style="color:var(--syntax-text-color)">d</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-declaration-color)">new</span> <span style="color:var(--syntax-text-color)">Point</span><span style="color:var(--syntax-error-color)">!</span><span style="color:var(--syntax-declaration-color)">double</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-literal-color)">1.5</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-literal-color)">3.0</span><span style="color:var(--syntax-text-color)">);</span>
<span style="color:var(--syntax-text-color)">writefln</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-string-color)">"%s + %s = %s"</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-text-color)">a</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-text-color)">b</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-text-color)">a</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">add</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-text-color)">b</span><span style="color:var(--syntax-text-color)">));</span>
<span style="color:var(--syntax-text-color)">writefln</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-string-color)">"%s + %s = %s"</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-text-color)">c</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-text-color)">d</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-text-color)">c</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">add</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-text-color)">d</span><span style="color:var(--syntax-text-color)">));</span>
<span style="color:var(--syntax-text-color)">}</span>
</code></span></span>
它打印以下内容:
<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code><400,300> + <-200,100> = <200,400>
<3.5,7> + <1.5,3> = <5,10>
</code></span></span>
我删除了size(),因为它没有为ints 定义。
总体而言,D 看起来像是采用 C/C++ 并创建清理版本的非常保守的尝试。默认情况下,它最“激进”的背离是 GC,但与 Java 不同的是,它在有益时为显式内存管理提供了大量逃生通道。
D从来没有真正到达任何地方。对于语言的发展,拥有认真的企业支持者(如 Go、Java 或 C#——D 甚至缺乏适度的支持者,如 Mozilla 支持的 Rust 或 Github 支持的 CoffeeScript)、忠实的受众(如浏览器中的 JavaScript 或 ObjectiveC)真的很有帮助、iPhone 上的 Swift)或任何“杀手级应用”(如 Ruby with Rails,或 Python with data science)。另一部分是目标真正困难的领域——建立新的高地相对容易,低地语言即使在最好的情况下也面临着巨大的挑战。
据我所见,D 并没有做得特别好,也没有做得特别差。如果“清理 C/C++”是您要找的东西,并且您不被小社区打扰,您可以试试 D。
Go 和 Rust 做出了一些更大胆的选择,因此谈论它们的优点和缺点要容易得多。不知何故,在一些公司的支持下,这个公式比 D 所做的更成功。
我预计 D 会慢慢陷入默默无闻,但它仍在积极尝试,所以如果命运为它转身也不会完全令人震惊。
关注我的博客,您将在其中获得提示、技巧和挑战,以保持您的技能敏锐。记得关注我哦!