美文网首页
Python 和 JavaScript

Python 和 JavaScript

作者: IT领域君 | 来源:发表于2020-04-03 17:22 被阅读0次

    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 的编程语言能够荣登榜首?谁也说不准。

    感谢大家阅读 ,喜欢的点个关注 ,不定时更新

    相关文章

      网友评论

          本文标题:Python 和 JavaScript

          本文链接:https://www.haomeiwen.com/subject/oodkphtx.html