2020年编程语言展望
时下最热门的语言是JavaScript,Java和Python,但是编程语言的新陈代谢也在不断发展着,新的优秀语言层出不穷,立足取代他们地位。有一首歌唱的好:"由来只有新人笑,有谁知道旧人哭",对编程语言也是如此。那么在2020的今天,谁是最有前途的语言呢?我们需要拉一个列表,一起说道说道。
Dart
和Ruby借助RoR一样,Dart语言也是借助有一个强有力的框架Flutter以及有个好爹谷歌的缘故,该语言迅速流行起来。
优势:一种比JavaScript更好的语言。
缺点:与JavaScript及其庞大生态系统直面竞争。
实例:
class Complex { double _r,_i; Complex(this._r,this._i); double get r => _r; double get i => _i; String toString() => "($r,$i)"; Complex operator +(Complex other) => new Complex(r+other.r,i+other.i); Complex operator *(Complex other) => new Complex(r*other.r-i*other.i,r*other.i+other.r*i); double abs() => r*r+i*i; } void main() { double start_x=-1.5; double start_y=-1.0; double step_x=0.03; double step_y=0.1; for(int y=0;y<20;y++) { String line=""; for(int x=0;x<70;x++) { Complex c=new Complex(start_x+step_x*x,start_y+step_y*y); Complex z=new Complex(0.0, 0.0); for(int i=0;i<100;i++) { z=z*(z)+c; if(z.abs()>2) { break; } } line+=z.abs()>2 ? " " : "*"; } print(line); } }
Elixir
Elixir有一个美好的名字,翻译为中文是"灵丹妙药,长生不老药",它源自于Erlang,改进了语法以及对有更强大的并发人支持。作为一种纯函数式语言,是否可以作为了主流,并长久不衰,长生不老呢?需要我们拭目以待。
优势:功能编程非常简单,强大的并发性。
缺点:需要熟悉函数式编程和函数式思维,学习曲线不直。
实例:
defmodule Mandelbrot do def set do xsize = 59 ysize = 21 minIm = -1.0 maxIm = 1.0 minRe = -2.0 maxRe = 1.0 stepX = (maxRe - minRe) / xsize stepY = (maxIm - minIm) / ysize Enum.each(0..ysize, fn y -> im = minIm + stepY * y Enum.map(0..xsize, fn x -> re = minRe + stepX * x 62 - loop(0, re, im, re, im, re*re+im*im) end) |> IO.puts end) end defp loop(n, _, _, _, _, _) when n>=30, do: n defp loop(n, _, _, _, _, v) when v>4.0, do: n-1 defp loop(n, re, im, zr, zi, _) do a = zr * zr b = zi * zi loop(n+1, re, im, a-b+re, 2*zr*zi+im, a+b) end end Mandelbrot.set
Golang
谷歌的又一个嫡儿子。在攻城掠土方面,Golang已经取得了不错的成绩。Golang编译速度快,便捷的语法,静态变量,基于协程的高性能并发支持。当然也有槽点,比如繁琐错误语法、混乱模块机制,和缺乏泛型,当然golang社区也一直在努力改进,这些槽点预计将来都会消失。
优势:语法简单,静态类型,很好的并发性。
缺点:缺少泛型,错误语法,模块机制。
实例:
package main import ( "fmt" "image" "image/color" "image/draw" "image/png" "math/cmplx" "os" ) const ( maxEsc = 100 rMin = -2. rMax = .5 iMin = -1. iMax = 1. width = 750 red = 230 green = 235 blue = 255 ) func mandelbrot(a complex128) float64 { i := 0 for z := a; cmplx.Abs(z) < 2 && i < maxEsc; i++ { z = z*z + a } return float64(maxEsc-i) / maxEsc } func main() { scale := width / (rMax - rMin) height := int(scale * (iMax - iMin)) bounds := image.Rect(0, 0, width, height) b := image.NewNRGBA(bounds) draw.Draw(b, bounds, image.NewUniform(color.Black), image.ZP, draw.Src) for x := 0; x < width; x++ { for y := 0; y < height; y++ { fEsc := mandelbrot(complex( float64(x)/scale+rMin, float64(y)/scale+iMin)) b.Set(x, y, color.NRGBA{uint8(red * fEsc), uint8(green * fEsc), uint8(blue * fEsc), 255}) } } f, err := os.Create("mandelbrot.png") if err != nil { fmt.Println(err) return } if err = png.Encode(f, b); err != nil { fmt.Println(err) } if err = f.Close(); err != nil { fmt.Println(err)
Julia
Julia是一门强大的数值计算语言。其语法对数学支持非常好,很适合数据科学家编写应用。是取代Python统计分析和数值计算的预备选手之一。
优势:对数学友好。
缺点:要与Python竞争。
实例:
using Images @inline function hsv2rgb(h, s, v) const c = v * s const x = c * (1 - abs(((h/60) % 2) - 1)) const m = v - c const r,g,b = if h < 60 (c, x, 0) elseif h < 120 (x, c, 0) elseif h < 180 (0, c, x) elseif h < 240 (0, x, c) elseif h < 300 (x, 0, c) else (c, 0, x) end (r + m), (b + m), (g + m) end function mandelbrot() const w, h = 1000, 1000 const zoom = 0.5 const moveX = 0 const moveY = 0 const img = Array{RGB{Float64}}(h, w) const maxIter = 30 for x in 1:w for y in 1:h i = maxIter const c = Complex( (2*x - w) / (w * zoom) + moveX, (2*y - h) / (h * zoom) + moveY ) z = c while abs(z) < 2 && (i -= 1) > 0 z = z^2 + c end const r,g,b = hsv2rgb(i / maxIter * 360, 1, i / maxIter) img[y,x] = RGB{Float64}(r, g, b) end end save("mandelbrot_set.png", img) end mandelbrot()
Kotlin
Kotlin是优化版本的Java,作为Java的取代者之一。谷歌已经在安卓开发中支持Kotlin。
优势:更强大的Java。
缺点:好要依靠Java的阴影活着。
import java.awt.Graphics import java.awt.image.BufferedImage import javax.swing.JFrame class Mandelbrot: JFrame("Mandelbrot Set") { companion object { private const val MAX_ITER = 570 private const val ZOOM = 150.0 } private val img: BufferedImage init { setBounds(100, 100, 800, 600) isResizable = false defaultCloseOperation = EXIT_ON_CLOSE img = BufferedImage(width, height, BufferedImage.TYPE_INT_RGB) for (y in 0 until height) { for (x in 0 until width) { var zx = 0.0 var zy = 0.0 val cX = (x - 400) / ZOOM val cY = (y - 300) / ZOOM var iter = MAX_ITER while (zx * zx + zy * zy < 4.0 && iter > 0) { val tmp = zx * zx - zy * zy + cX zy = 2.0 * zx * zy + cY zx = tmp iter-- } img.setRGB(x, y, iter or (iter shl 7)) } } } override fun paint(g: Graphics) { g.drawImage(img, 0, 0, this) } } fun main(args: Array<String>) { Mandelbrot().isVisible = true }
Lua
Lua是一种小型,简单,快速,可嵌入,可移植且灵活的语言。
优点:小型、内嵌,nginx编程
缺点:已经26年了,年事已高。
实例:
Pharo
Pharo是Smalltalk的现代化变体,是一种非常有生产力的面向对象语言。实际上,Smalltalk是OOP的典范,并且已经启发了几乎所有其他OOP语言。但是,也没有其他一种语言能比Smalltalk更好地实现OOP。
Pharo也是世界上最简单和最优雅的语言之一,可以让我们在15分钟内学习Smalltalk的全部语法,
优势:生产率高,生产率提高5倍。
缺点:需要不同的编程思想。
实例:
Rust
Rust是一种设计为内存安全的编程语言,通过borrow和变量生命周期控制消除了与存储器相关的编程错误。Rust承诺编程会更安全。而且Rust效率也非常高,语法也非常优雅,目前热度很高,Github中Rust新项目层出不穷。
优势:开发更加可靠,有从系统级到应用级,浏览器引擎(Firefox),Web开发等各方面的实例。门槛有点高,可以筛选掉一批写bug的码农。
缺点:学习曲线比较陡峭,门槛较高,把一批新手挡在外面。
实例:
WebAssembly
WebAssembly可以说是一匹黑马。预计在接下来十年左右的时间里,可能会衍生出许多升至顶级的语言。WebAssembly 是一种接近机器语言的跨平台二进制格式。目前四大主流浏览器厂商谷歌Chrome、苹果Safari、微软Edge 和 Mozilla FireFox 均以支持了WebAssembly 的初始版本,而且为了安全规范,去年各大厂商又成立了字节码联盟,立足于通过协作制定和实施标准,完善 WebAssembly 在浏览器之外的生态。
优点:广泛的浏览器和语言支持。
缺点:生态体系尚未完善。