未来有望干掉 Python 和 JavaScript 的编程语言
作者丨Richard Kenneth Eng
译者丨刘志勇
策划丨Tina
Python 和 JavaScript 是当今最热门的两种编程语言。但是,它们不可能永远位居榜首。最终,它们一定会失宠,就像所有的编程语言一样。这很可能在未来十年内就会发生。
哪些编程语言有望取代它们呢?下面就是我列出的挑战者名单。
由于 Flutter 框架和 Google 的认可,这门语言迅速流行起来。它与使 Ruby 如此流行的驱动力相似:Rails 框架。
如果 Google 的新操作系统 Fuchsia 取得成功的话,Dart 将会成为其中心。
主要优势:它是一种比 JavaScript 更优秀的编程语言。
主要缺点:它面对来自 JavaScript 及其迷惑的群体的对抗。
曼德勃罗分形图(Mandelbrot set)示例代码:
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 是 Erlang 的派生语言,具有改进的语法,以及与 Erlang 相同的、惊人的并发性支持。作为一种纯函数式语言,它很有可能将这一范式提升为主流。
主要优点:它使函数式编程变得异常简单。它非常适合并发性。
主要缺点:需要了解潜在的一次性可编程基础知识,这可能是一项艰巨的任务。
曼德勃罗分形图(Mandelbrot set)示例代码:
defmodule Mandelbrot dodef set doxsize = 59ysize = 21minIm = -1.0maxIm = 1.0minRe = -2.0maxRe = 1.0stepX = (maxRe - minRe) / xsizestepY = (maxIm - minIm) / ysizeEnum.each(0..ysize, fn y ->im = minIm + stepY * yEnum.map(0..xsize, fn x ->re = minRe + stepX * x62 - loop(0, re, im, re, im, re*re+im*im)end) |> IO.putsend)enddefp loop(n, _, _, _, _, _) when n>=30, do: ndefp loop(n, _, _, _, _, v) when v>4.0, do: n-1defp loop(n, re, im, zr, zi, _) doa = zr * zrb = zi * ziloop(n+1, re, im, a-b+re, 2*zr*zi+im, a+b)endendMandelbrot.set
另一种 Google 支持的语言 Golang,得益于其闪电般的编译速度、简单高效的并发性以及非凡的简单性,它被证明是赢家。唯一缺少的就是泛型,不过,这个特性已经在路线图上了。
主要优点:超级简单,对并发性支持非常好。
主要缺点:它(目前)缺少泛型。
曼德勃罗分形图(Mandelbrot set)示例代码:
package mainimport ("fmt""image""image/color""image/draw""image/png""math/cmplx""os")const (maxEsc = 100rMin = -2.rMax = .5iMin = -1.iMax = 1.width = 750red = 230green = 235blue = 255)func mandelbrot(a complex128) float64 {i := 0for 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 的优势在于它对数学计算的出色支持。数学友好的语法对数学家来说非常有用。如果有哪种语言可以推翻 Python,那么 Julia 肯定是一个竞争者。
主要优点:这门语言是为科学家精心设计的。
主要缺点:这门语言面临数据科学之王 Python 的挑战。
曼德勃罗分形图(Mandelbrot set)示例代码:
using Imagesfunction hsv2rgb(h, s, v)const c = v * sconst x = c * (1 - abs(((h/60) % 2) - 1))const m = v - cconst 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)endfunction mandelbrot()const w, h = 1000, 1000const zoom = 0.5const moveX = 0const moveY = 0const img = Array{RGB{Float64}}(h, w)const maxIter = 30for x in 1:wfor y in 1:hi = maxIterconst c = Complex((2*x - w) / (w * zoom) + moveX,(2*y - h) / (h * zoom) + moveY)z = cwhile abs(z) < 2 && (i -= 1) > 0z = z^2 + cendconst r,g,b = hsv2rgb(i / maxIter * 360, 1, i / maxIter)img[y,x] = RGB{Float64}(r, g, b)endendsave("mandelbrot_set.png", img)endmandelbrot()
Kotlin 是更好的 Java。事实上,它实际上就是 Java 的一个可以立即使用的替代品。Google 已经将其打造成 Android 开发的一流语言。
主要优点:它是一种升级版的 Java。
主要缺点:它是一种非常庞大的语言,即使与 Java 相比也是如此。
曼德勃罗分形图(Mandelbrot set)示例代码:
import java.awt.Graphicsimport java.awt.image.BufferedImageimport javax.swing.JFrameclass Mandelbrot: JFrame("Mandelbrot Set") {companion object {private const val MAX_ITER = 570private const val ZOOM = 150.0}private val img: BufferedImageinit {setBounds(100, 100, 800, 600)isResizable = falsedefaultCloseOperation = EXIT_ON_CLOSEimg = BufferedImage(width, height, BufferedImage.TYPE_INT_RGB)for (y in 0 until height) {for (x in 0 until width) {var zx = 0.0var zy = 0.0val cX = (x - 400) / ZOOMval cY = (y - 300) / ZOOMvar iter = MAX_ITERwhile (zx * zx + zy * zy < 4.0 && iter > 0) {val tmp = zx * zx - zy * zy + cXzy = 2.0 * zx * zy + cYzx = tmpiter--}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 是一种小巧、简单、快速、可嵌入、可移植的灵活的语言。
主要缺点:它已经被人们忽视了 26 年,现在会有什么改变呢?
曼德勃罗分形图(Mandelbrot set)示例代码:
local maxIterations = 250local minX, maxX, minY, maxY = -2.5, 2.5, -2.5, 2.5local miX, mxX, miY, mxYfunction remap( x, t1, t2, s1, s2 )local f = ( x - t1 ) / ( t2 - t1 )local g = f * ( s2 - s1 ) + s1return g;endfunction drawMandelbrot()local pts, a, as, za, b, bs, zb, cnt, clr = {}for j = 0, hei - 1 dofor i = 0, wid - 1 doa = remap( i, 0, wid, minX, maxX )b = remap( j, 0, hei, minY, maxY )cnt = 0; za = a; zb = bwhile( cnt < maxIterations ) doas = a * a - b * b; bs = 2 * a * ba = za + as; b = zb + bsif math.abs( a ) + math.abs( b ) > 16 then break endcnt = cnt + 1endif cnt == maxIterations then clr = 0else clr = remap( cnt, 0, maxIterations, 0, 255 )endpts[1] = { i, j, clr, clr, 0, 255 }love.graphics.points( pts )endendendfunction startFractal()love.graphics.setCanvas( canvas ); love.graphics.clear()love.graphics.setColor( 255, 255, 255 )drawMandelbrot(); love.graphics.setCanvas()endfunction love.load()wid, hei = love.graphics.getWidth(), love.graphics.getHeight()canvas = love.graphics.newCanvas( wid, hei )startFractal()endfunction love.mousepressed( x, y, button, istouch )if button == 1 thenstartDrag = true; miX = x; miY = yelseminX = -2.5; maxX = 2.5; minY = minX; maxY = maxXstartFractal()startDrag = falseendendfunction love.mousereleased( x, y, button, istouch )if startDrag thenlocal lif x > miX then mxX = xelse l = x; mxX = miX; miX = lendif y > miY then mxY = yelse l = y; mxY = miY; miY = lendmiX = remap( miX, 0, wid, minX, maxX )mxX = remap( mxX, 0, wid, minX, maxX )miY = remap( miY, 0, hei, minY, maxY )mxY = remap( mxY, 0, hei, minY, maxY )minX = miX; maxX = mxX; minY = miY; maxY = mxYstartFractal()endendfunction love.draw()love.graphics.draw( canvas )end
Pharo 是 Smalltalk 的现代变体,Smalltalk 是一种非常高效的面向对象编程语言。实际上,Smalltalk 是面向对象编程的典范,它几乎启发了地球上所有其他面向对象编程语言的灵感。最后,没有一种语言比 Smalltalk 更适合面向对象编程了。
Pharo 还是世界上最简单、最优雅的语言之一。你可以在 15 分钟内学会 Smalltalk 的全部语法!
主要优点:它的工作效率非常高效,就像工作效率提高了 5 倍一样!
主要缺点:掌握这种语言,需要一种不同的编程思维。但人们往往害怕改变。
分形树示例代码:
Object subclass: #FractalTreeinstanceVariableNames: ''classVariableNames: ''poolDictionaries: ''category: 'RosettaCode'for FractalTree class"tree: aPoint length: aLength angle: anAnglep a |> 10) ifTrue: [p := Pen new.p up.p goto: aPoint.p turn: anAngle.p down.5 timesRepeat: [p go: aLength / 5.p turn: 5.].a := anAngle - 30.3 timesRepeat: [self tree: p location length: aLength * 0.7 angle: a.a := a + 30.]].drawDisplay restoreAfter: [Display fillWhite.self tree: 700@700 length: 200 angle: 0.]"Execute"FractalTree new draw.
Rust 因其内存安全特性:借位检查器而得到了广泛的认可。这个特性实际上消除了所有与内存相关的编程错误。Rust 保证了编程的安全性。
主要优点:它有助于使软件更可靠。
主要缺点:这门语言很难学习,而且借位检查器可能也很难理解。
曼德勃罗分形图(Mandelbrot set)示例代码:
extern crate image;extern crate num_complex;use std::fs::File;use num_complex::Complex;fn main() {let max_iterations = 256u16;let img_side = 800u32;let cxmin = -2f32;let cxmax = 1f32;let cymin = -1.5f32;let cymax = 1.5f32;let scalex = (cxmax - cxmin) / img_side as f32;let scaley = (cymax - cymin) / img_side as f32;// Create a new ImgBuflet mut imgbuf = image::ImageBuffer::new(img_side, img_side);// Calculate for each pixelfor (x, y, pixel) in imgbuf.enumerate_pixels_mut() {let cx = cxmin + x as f32 * scalex;let cy = cymin + y as f32 * scaley;let c = Complex::new(cx, cy);let mut z = Complex::new(0f32, 0f32);let mut i = 0;for t in 0..max_iterations {if z.norm() > 2.0 {break;}z = z * z + c;i = t;}*pixel = image::Luma([i as u8]);}// Save imagelet fout = &mut File::create("fractal.png").unwrap();image::ImageLuma8(imgbuf).save(fout, image::PNG).unwrap();}
TypeScript 是 JavaScript……带来了好处。它主要是添加了静态类型。与 JavaScript 的兼容性使它成为前端 Web 开发人员的最爱,因为他们已经了解 JavaScript,而且几乎不需要改变他们的工作流程。
主要优点:它就是 JavaScript,因此对 JavaScript 开发人员来说没有什么太大的变化。
主要缺点:它仍然是 JavaScript,所以仍然继承了 JavaScript 的所有包袱。
分形树示例代码:
// Set up canvas for drawingvar canvas: HTMLCanvasElement = document.createElement('canvas')canvas.width = 600canvas.height = 500document.body.appendChild(canvas)var ctx: CanvasRenderingContext2D = canvas.getContext('2d')ctx.fillStyle = '#000'ctx.lineWidth = 1// constantsconst degToRad: number = Math.PI / 180.0const totalDepth: number = 9/** Helper function that draws a line on the canvas */function drawLine(x1: number, y1: number, x2: number, y2: number): void {ctx.moveTo(x1, y1)ctx.lineTo(x2, y2)}/** Draws a branch at the given point and angle and then calls itself twice */function drawTree(x1: number, y1: number, angle: number, depth: number): void {if (depth !== 0) {let x2: number = x1 + (Math.cos(angle * degToRad) * depth * 10.0)let y2: number = y1 + (Math.sin(angle * degToRad) * depth * 10.0)drawLine(x1, y1, x2, y2)drawTree(x2, y2, angle - 20, depth - 1)drawTree(x2, y2, angle + 20, depth - 1)}}// actual drawing of treectx.beginPath()drawTree(300, 500, -90, totalDepth)ctx.closePath()ctx.stroke()
WebAssembly 是一匹黑马。在未来十年左右的时间里,它可能会衍生出一系列的语言,这些语言有望最终登上榜首。WebAssembly 只是一个编译目标,但没有理由说它不能扩展到 Web 领域以外的地方。至于哪些基于 WebAssembly 的语言可以登上榜首?现在谁也说不准。
Richard Kenneth Eng,博主。Smalltalk 布道师。退休的软件工程师。《复仇者联盟》粉丝。本文最初发表 Hacker Noon 博客,经原作者 Richard Kenneth Eng 授权,InfoQ 中文站翻译并分享。
原文链接:
https://hackernoon.com/programming-languages-of-the-future-b61332kd
开发者对于容器技术的关注热度越来越高,各家公司也纷纷在容器实践上下功夫。InfoQ 与华为云原生团队共建【容器魔方】技术社群,连接开发者与技术专家,解决容器技术的“疑难杂症”!
点个在看少个 bug 👇
