Python 和 JavaScript 2020年你认为那个走的更长远?
Python 和 JavaScript 是目前最火的两大编程语言,但是 2020 年,什么编程语言将会取而代之呢?
以下为译文:
Python 和 JavaScript 是目前最火的两大编程语言。然而,他们不可能永远屹立不倒。最终,必将像其他编程语言一样跌下神坛。这很可能在接下来的十年左右上演。
那么什么编程语言将会取而代之呢? 下面给出我的候选者名单!
Dart
多亏了 Flutter 框架和 Google 的认可,该语言迅速流行开来。这和 Rails 框架让 Ruby 流行起来的原因非常相似。如果谷歌的 Fuchsia 系统能够火起来,Dart 将受益最大。
核心优势:它是一种比 JavaScript 更棒的编程语言。
主要缺点:不得不面对 JavaScript 语言和 JavaScript 的强烈拥护者的挑战。
曼德布洛特集样本:
classComplex{double_r,_i; Complex(this._r,this._i);doublegetr => _r;doublegeti => _i;StringtoString() =>"($r,$i)"; Complexoperator+(Complex other) =>newComplex(r+other.r,i+other.i); Complexoperator*(Complex other) =>newComplex(r*other.r-i*other.i,r*other.i+other.r*i);doubleabs() => r*r+i*i;}voidmain() {doublestart_x=-1.5;doublestart_y=-1.0;doublestep_x=0.03;doublestep_y=0.1;for(inty=0;y<20;y++) {Stringline="";for(intx=0;x<70;x++) { Complex c=newComplex(start_x+step_x*x,start_y+step_y*y); Complex z=newComplex(0.0,0.0);for(inti=0;i<100;i++) { z=z*(z)+c;if(z.abs()>2) {break; } } line+=z.abs()>2?" ":"*"; }print(line); }}
Elixir
Elixir 是基于一种基于 Erlang 虚拟机的函数式编程语言,对并发的支持非常好。作为一个纯粹的函数式编程语言,它有望将这种范式变为主流。
核心优势:它让函数式编程变得异常简单,对并发的支持非常棒。
主要缺点:需要有 OTP 基础,但掌握 OTP 却没那么容易。
曼德布洛特集样本:
defmodule Mandelbrotdodefsetdoxsize =59ysize =21minIm =-1.0maxIm =1.0minRe =-2.0maxRe =1.0stepX = (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 * x62- loop(0, re, im, re, im, re*re+im*im)end) |> IO.putsend)enddefp loop(n,_,_,_,_,_) when n>=30,do: n defp loop(n,_,_,_,_, v) when v>4.0,do: n-1defp loop(n, re, im, zr, zi,_)doa = zr * zr b = zi * zi loop(n+1, re, im, a-b+re,2*zr*zi+im, a+b) endend Mandelbrot.set
Golang
得益于其闪电般的编译速度、简单和高效的并发支持,另外一个谷歌受支持的编程语言 Golang 已经崭露头角。唯一缺的就是泛型支持,但是这个特性已经在规划上了。
核心优势:上手简单,对并发的支持非常出色。
主要缺点:缺少泛型支持(暂时的)。
曼德布洛特集样本:
packagemainimport("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)funcmandelbrot(acomplex128)float64{ i :=0forz := a; cmplx.Abs(z) <2&& i < maxEsc; i++ { z = z*z + a }returnfloat64(maxEsc-i) / maxEsc}funcmain(){ 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)forx :=0; x < width; x++ {fory :=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")iferr !=nil{ fmt.Println(err)return}iferr = png.Encode(f, b); err !=nil{ fmt.Println(err) }iferr = f.Close(); err !=nil{ fmt.Println(err) }}
Julia
Julia 的优势在于对数学计算的支持非常出色。它对数学的语法支持非常好,堪称数据科学家的福音。假如有任何编程语言可以颠覆 Python, 它将是一个强有力的竞争者。
核心优势:为科学家精心设计。
主要缺点:面临着数据科学之王 Python 的竞争。
曼德布洛特集样本:
usingImages@inlinefunctionhsv2rgb(h, s, v)constc = v * sconstx = c * (1- abs(((h/60) %2) -1))constm = v - cconstr,g,b =ifh <60(c, x,0)elseifh <120(x, c,0)elseifh <180(0, c, x)elseifh <240(0, x, c)elseifh <300(x,0, c)else(c,0, x)end(r + m), (b + m), (g + m)endfunctionmandelbrot()constw, h =1000,1000constzoom =0.5constmoveX =0constmoveY =0constimg =Array{RGB{Float64}}(h, w)constmaxIter =30forxin1:wforyin1:h i = maxIterconstc =Complex( (2*x - w) / (w * zoom) + moveX, (2*y - h) / (h * zoom) + moveY ) z = cwhileabs(z) <2&& (i -=1) >0z = z^2+ cendconstr,g,b = hsv2rgb(i / maxIter *360,1, i / maxIter) img[y,x] = RGB{Float64}(r, g, b)endendsave("mandelbrot_set.png", img)endmandelbrot()
Kotlin
Kotlin 是升级版的 Java。 实际上,它可以完全替代 Java 编程语言,谷歌已经将其打造成 Android 开发的首选语言。
核心优势:比 Java 更强大。
主要缺点:Kotlin 非常庞大,甚至比 Java 更庞大。
曼德布洛特集样本:
importjava.awt.Graphicsimport java.awt.image.BufferedImageimport javax.swing.JFrameclassMandelbrot:JFrame("Mandelbrot Set") {companionobject{privateconstvalMAX_ITER =570privateconstvalZOOM =150.0}privatevalimg: BufferedImage init { setBounds(100,100,800,600) isResizable =falsedefaultCloseOperation = EXIT_ON_CLOSE img = BufferedImage(width, height, BufferedImage.TYPE_INT_RGB)for(yin0until height) {for(xin0until width) {varzx =0.0varzy =0.0valcX = (x -400) / ZOOMvalcY = (y -300) / ZOOMvariter = MAX_ITERwhile(zx * zx + zy * zy <4.0&& iter >0) {valtmp = zx * zx - zy * zy + cX zy =2.0* zx * zy + cY zx = tmp iter-- } img.setRGB(x, y, iter or (iter shl7)) } } }overridefunpaint(g:Graphics){ g.drawImage(img,0,0,this) }}funmain(args:Array){ Mandelbrot().isVisible =true}
Lua
核心优势: Lua 是一种小巧、简单、快速、可嵌入、可移植和灵活的编程语言。
主要缺点:Lua 被忽视了 26 年了。现在还能掀起风浪吗?
曼德布洛特集样本:
localmaxIterations=250local minX, maxX, minY,maxY= -2.5,2.5, -2.5,2.5local miX, mxX, miY, mxYfunction remap( x, t1, t2, s1, s2 ) localf= ( x - t1 ) / ( t2 - t1 ) localg= f * ( s2 - s1 ) + s1 return g;endfunction drawMandelbrot() local pts, a, as, za, b, bs, zb, cnt,clr= {} forj=0, hei -1do fori=0, wid -1doa= remap( i,0, wid, minX, maxX )b= remap( j,0, hei, minY, maxY )cnt=0;za= a;zb= b while( cnt < maxIterations ) doas= a * a - b * b;bs=2* a * ba= za + as;b= zb + bsifmath.abs( a ) + math.abs( b ) >16thenbreak endcnt= cnt +1endifcnt== maxIterationsthenclr=0elseclr= remap( cnt,0, maxIterations,0,255) end pts[1] = { i, j, clr, clr,0,255} love.graphics.points( pts ) end endendfunction 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 )ifbutton==1thenstartDrag=true;miX= x;miY= yelseminX= -2.5;maxX=2.5;minY= minX;maxY= maxX startFractal()startDrag=falseendendfunction love.mousereleased( x, y, button, istouch )ifstartDragthenlocal lifx > miXthenmxX= xelsel= x;mxX= miX;miX= l endify > miYthenmxY= yelsel= y;mxY= miY;miY= l endmiX= 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= mxY startFractal() endendfunction love.draw() love.graphics.draw( canvas )end
Pharo
Pharo 是 Smalltalk 的现代版变体,是一个非常高效的面向对象编程语言。事实上,Smalltalk 是面向对象的典范,几乎所有的其他面向对象编程语言都受到它的启发。却没有一个编程语言比 Smalltalk 面向对象的程度更高。
Pharo 也是世界上最简单、最优雅的编程语言之一,你只需要 15 分钟就能掌握 Smalltalk 的全部语法。
关键优势:开发效率非常高,编程效率能提升接近 5 倍。
主要缺点:它需要一种与众不同的编程思维。但是人总是害怕改变,很难接受这种编程思维。
分形树样本:
Object subclass:#FractalTree instanceVariableNames:''classVariableNames:''poolDictionaries:''category:'RosettaCode'"Methods for FractalTree class"tree: aPoint length: aLength angle: anAngle |pa| (aLength >10) ifTrue: [p:= Pennew.pup.pgoto: aPoint.pturn: anAngle.pdown.5timesRepeat:[pgo: aLength /5.pturn:5. ].a:= anAngle -30.3timesRepeat:[ self tree:plocation length: aLength *0.7angle:a.a:=a+30. ] ].draw Display restoreAfter: [ Display fillWhite. self tree:700@700length:200angle:0. ]"Execute"FractalTreenewdraw.
Rust
由于内存安全特性——借用检查器,Rust 已经赢得广泛认可。这一特性实际上消除了所有内存相关错误。Rust 提供了更安全的编程特性。
关键优势:有助于提高软件的可靠性。
主要缺点:它学起来很难。借用检查器比较复杂且难以理解。
曼德布洛特集样本:
extern crate image;extern crate num_complex; use std::fs::File;use num_complex::Complex; fn main() {letmax_iterations=256u16;letimg_side=800u32;letcxmin= -2f32;letcxmax=1f32;letcymin= -1.5f32;letcymax=1.5f32;letscalex= (cxmax - cxmin) / img_side as f32;letscaley= (cymax - cymin) / img_side as f32; // Create a new ImgBufletmutimgbuf= image::ImageBuffer::new(img_side, img_side); // Calculate for each pixel for (x, y, pixel)inimgbuf.enumerate_pixels_mut() {letcx= cxmin + x as f32 * scalex;letcy= cymin + y as f32 * scaley;letc= Complex::new(cx, cy);letmutz= Complex::new(0f32,0f32);letmuti=0; for tin0..max_iterations {ifz.norm() >2.0{ break; }z= z * z + c;i= t; } *pixel= image::Luma([i as u8]); } // Save imageletfout= &mut File::create("fractal.png").unwrap(); image::ImageLuma8(imgbuf).save(fout, image::PNG).unwrap();}
TypeScript
TypeScript 是一个增强版的 JavaScript. 它主要新增了静态类型的特性。
由于 TypeScript 和 JavaScript 完全兼容,已经掌握了 JavaScript 的前端 web 开发者们可以轻松掌握 TypeScript,因而深受他们青睐。
核心优势:它是 JavaScript 的超集 , 对 JavaScript 开发者来说没啥太大变化。
主要缺点:由于它是 JavaScript 的超级,这就导致了它同样也继承了 JavaScript 的一些历史包袱。
分形树样本:
//Setup canvasfordrawingvar canvas: HTMLCanvasElement = document.createElement('canvas')canvas.width =600canvas.height =500document.body.appendChild(canvas)varctx: 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 */functiondrawLine(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 */functiondrawTree(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 drawingoftreectx.beginPath()drawTree(300,500,-90, totalDepth)ctx.closePath()ctx.stroke()
WebAssembly
WebAssembly 是一匹黑马。在接下来的十年左右的时间,它可能会衍生出一系列编程语言,这些编程语言有望登顶编程语言排行榜。
虽然 WebAssembly 只是一个编译目标,但是它有充足理由被应用到 Web 领域之外。哪种基于 WebAssembly 的编程语言能够荣登榜首?谁也说不准。
感谢大家阅读 ,喜欢的点个关注 ,不定时更新
网友评论