未来的编程将会是什么样子?
多核挑战
不同的方法:数据流编程
进入 Nevalang
自 20 世纪 40 年代以来,编程并没有发生根本性的变化。大多数语言仍然遵循冯·诺依曼范式:编写顺序指令并修改内存中的数据。我们来看一个简单的例子:
total = 0
for number in range(1, 6):
total += number
print(total) # Outputs: 15
是不是很简单,很熟悉?但有一个问题。现代计算机的速度不再像以前那么快了。相反,它们拥有越来越多的核心,而我们传统的编程模型并不擅长高效地处理多核。
多核挑战
我们尝试使用并发编程工具。以 Go 的 goroutines 为例:
package main
import (
"fmt"
"sync"
)
func main() {
var wg sync.WaitGroup
numbers := []int{1, 2, 3, 4, 5}
for _, n := range numbers {
wg.Add(1)
go func(x int) {
defer wg.Done()
fmt.Printf("Processing %d\n", x)
}(n)
}
wg.Wait()
fmt.Println("All done!")
}
这些解决方案确实有效,但它们也带来了诸如竞争条件、死锁和复杂的状态管理等问题。我们构建的范式并非为并行执行而设计,而且控制流语言本身就难以可视化。
不同的方法:数据流编程
如果我们能用不同的方式编写程序会怎么样?想象一下,把你的程序描述成一个由独立节点组成的网络,这些节点之间相互传递数据——没有共享状态,只有数据在系统中流动:
- 默认情况下,所有内容并行运行
- 数据不可变,可防止竞争条件
- 程序结构反映数据流
- 跨多核自然扩展
进入 Nevalang
Nevalang正是这样做的。它是一门围绕数据流构建的现代语言,它将程序视为消息传递图,而不是指令序列:
import { fmt }
def Main(start any) (stop any) {
for_print For{Print}
wait Wait
---
:start -> 1..5 -> for_print -> wait -> :stop
}
这里我们定义了一个Main
接收start
信号和发送stop
信号的组件。它有两个节点:(for_print
一个For
包含Print
的节点)和wait
。启动时,它会创建一个包含 1-5 的数字流,通过 打印每个数字for_print
,等待完成,然后发送stop
信号。
可视化:
Nevalang 代表了编程的根本转变,它采用了一种自然适合并行性和可视化的范式,而不是对抗传统的编程限制。
编程的未来或许与过去截然不同。随着硬件的不断发展,我们的编程模型也需要随之演进。Nevalang 为我们展现了这种未来令人兴奋的可能性。
警告:Nevalang 目前处于开发阶段,尚未达到生产环境要求。我们正在寻找贡献者和早期采用者。快来加入吧!
这是一个由一小群爱好者维护的雄心勃勃的项目。您的加入将体现您的兴趣,并激励我们继续前行。
请给我们一颗星⭐️以增加我们进入 GitHub 趋势的机会——Nevalang 受到的关注越多,我们真正发挥作用的机会就越大。
文章来源:https://dev.to/emil_valeev/how-programming-will-look-in-the-future-5bj4