当前位置: 首页 > 科技观察

Python和JavaScript2020,你认为哪个更进一步?

时间:2023-03-19 22:21:56 科技观察

Python和JavaScript是目前最流行的两种编程语言,但是2020年什么编程语言会取代它们呢?以下为译文:Python和JavaScript是目前最流行的两种编程语言。然而,他们不能永远站立。最终,它会像其他编程语言一样跌落神坛。这可能会在未来十年左右发挥作用。那么什么编程语言会取而代之呢?这是我的候选名单!Dart得益于Flutter框架和Google的背书,该语言的流行度呈爆炸式增长。这与Rails框架如何使Ruby流行起来非常相似。如果Google的Fuchsia系统能够流行起来,Dart将受益最大。核心优势:它是一种比JavaScript更好的编程语言。主要缺点:不得不与JavaScript语言和JavaScript的坚定拥护者抗衡。Mandelbrot集合示例:classComplex{double_r,_i;Complex(this._r,this._i);doublegetr=>_r;doublegeti=>_i;StringtoString()=>"($r,$i)";Complexoperator+(Complexother)=>newComplex(r+other.r,i+other.i);Complexoperator*(Complexother)=>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++){Complexc=newComplex(start_x+step_x*x,start_y+step_y*y);Complexz=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);}}ElixirElixir是一种基于Erlang虚拟机的函数式编程语言,对并发的支持非常好。作为一种纯函数式编程语言,它有望使这种范式成为主流。核心优势:让函数式编程变得极其简单,对并发的支持非常好。主要缺点:需要OTP基础,但掌握OTP并不容易。Mandelbrot集合样本:defmoduleMandelbrotdodefsetdoxsize=59ysize=21minIm=-1.0maxIm=1.0minRe=-2.0maxRe=1.0stepX=(maxRe-minRe)/xsizestepY=(maxIm-minIm)/ysizeEnum.each(0..ysize,fny->im=minIm+stepY*yEnum.map(0..xsize,fnx->re=minRe+stepX*x62-loop(0,re,im,re,im,re*re+im*im)end)|>IO.putsend)enddefploop(n,_,_,_,_,_)whenn>=30,do:ndefploop(n,_,_,_,_,v)whenv>4.0,do:n-1defploop(n,re,im,zr,zi,_)doa=zr*zrb=zi*ziloop(n+1,re,im,a-b+re,2*zr*zi+im,a+b)endendMandelbrot.setGolang得益于其闪电般的编译速度、简单高效的并发支持,另一种谷歌支持的编程语言Golang应运而生。唯一缺少的是通用支持,但此功能已在计划中。核心优势:简单易用,对并发支持出色。主要缺点:缺乏泛型支持(临时)。Mandelbrot集示例: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&&i0z=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()KotlinKotlin是Java的升级版。事实上,它可以完全取代Java编程语言,谷歌已将其确立为Android开发的首选语言。核心优势:比Java更强大。主要缺点:Kotlin非常庞大,甚至比Java还要大。曼德布洛特集样本:importjava.awt.Graphicsimportjava.awt.image.BufferedImageimportjavax.swing.JFrameclassMandelbrot:JFrame("MandelbrotSet"){companionobject{privateconstvalMAX_ITER=570privateconstvalZOOM=150.0}privatevalimg:BufferedImageinit{setBounds(100,100,800,600)isResizable=falsedefaultCloseOperation=EXIT_ON_CLOSEimg=BufferedImage(width,height,BufferedImage.TYPE_INT_RGB)for(yin0untilheight){for(xin0untilwidth){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+cXzy=2.0*zx*zy+cYzx=tmpiter--}img.setRGB(x,y,iteror(itershl7))}}}overridefunpaint(g:Graphics){g.drawImage(img,0,0,this)}}funmain(args:Array){Mandelbrot().isVisible=true}Lua核心优势:Lua体积小,简单、快速、可嵌入、可移植和灵活的编程语言。主要缺点:Lua已经被忽视了26年。局部最大迭代次数=250localminX,maxX,minY,maxY=-2.5,2.5,-2.5,2.5localmiX,mxX,miY,mxYfunctionremap(x,t1,st2.,)localf=(x-t1)/(t2-t1);localg=f*(s2-s1)+s1return;endfunctiondrawMandelbrot()localpts,a,as,za,b,bs,zb,cnt,clr={}forj=0,this-1dofori=0,width-1doa=remap(i,0,width,minX,maxX)b=remap(j,0,this,minY,maxY)cnt=0;za=a;zb=bwhile(cnt16thenbreakendcnt=cnt+1endifcnt==maxIterationthenclr=0elseclr=remap(cnt,0,maxIteration,0.255);endpts[1]={i,j,clr,clr,0.255}law.graphics.points(pts)endendfunctionstartFractal()law.graphics.setCanvas(canvas);love.graphics.clear()love.graphics.setColor(255,255,255)drawMandelbrot();love.graphics.setCanvas()endfunctionlove.load()width,hei=love.graphics.getWidth(),love.graphics.getHeight();;canvas=love.graphics.newCanvas(width,hei)startFractal()endfunctionlove.mousepressed(x,y,button,istouch)ifbutton==1thenstartDrag=true;myX=x;myY=yelseminX=-2.5;maxX=2.5;minY=minX;maxY=maxXstartFractal()startDrag=falseendendfunctionlove.mousereleased(x,y,button,istouch)ifstartDragthenlocallifx>miXthenmxX=xelsel=x;mxX=miX;miX=lendify>miYthenmxY=yelsel=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()endendfunctionlove.draw()love.graphics.draw(canvas)endPharoPharo是Smalltalk的现代变体,是一种非常高效的面向对象编程语言。事实上,Smalltalk是面向对象编程的典范,几乎所有其他面向对象编程语言都受到了它的启发。但是没有一种编程语言比Smalltalk更面向对象。Pharo也是世界上最简单优雅的编程语言之一,只需15分钟即可掌握Smalltalk的全部语法。主要优势:开发效率非常高,编程效率可提高近5倍。主要缺点:它需要不同的编程思维方式。但是人总是害怕变化,很难接受这种编程思维。分形树示例:Objectsubclass:#FractalTreeinstanceVariableNames:''classVariableNames:''poolDictionaries:''category:'RosettaCode'"MethodsforFractalTreeclass"tree:aPointlength:aLengthangle:anAngle|pa|(aLength>10)ifTrue:[p:=Pennew.pup.pgoto:aPoint.pturn:anAngle.pdown.5timesRepeat:[pgo:aLength/5.pturn:5.].a:=anAngle-30.3timesRepeat:[selftree:plocationlength:aLength*0.7angle:a.a:=a+30.]].drawDisplayrestoreAfter:[DisplayfillWhite.selftree:700@700length:200angle:0.]"Execute"FractalTreenewdraw.RustRust因其内存安全特性(借用检查器)而获得广泛认可。此功能几乎消除了所有与内存相关的错误。Rust提供了更安全的编程特性。主要优点:有助于提高软件可靠性。主要缺点:很难学习。借用检查器复杂且难以理解。Mandelbrot集示例:externcrateimage;externcratenum_complex;usestd::fs::File;usenum_complex::Complex;fnmain(){letmax_iterations=256u16;letimg_side=800u32;letcxmin=-2f32;letcxmax=1f32;letcymin=-1.5f32;letcymax=1.5f32;letscalex=(cxmax-cxmin)/img_sideasf32;letscaley=(cymax-cymin)/img_sideasf32;//CreateanewImgBufletmutimgbuf=image::ImageBuffer::new(img_side,img_side);//Calculateforeachpixelfor(x,y,pixel)inimgbuf.enumerate_pixels_mut(){letcx=cxmin+xasf32*scalex;letcy=cymin+yasf32*scaley;letc=Complex::new(cx,cy);letmutz=Complex::new(0f32,0f32);letmutz=0;fortin0..max_iterations{ifz.norm()>2.0{break;}z=z*z+c;i=t;}*pixel=image::Luma([iasu8]);}//Saveimageletfout=&mutFile::create("fractal.png").unwrap();image::ImageLuma8(imgbuf).save(fout,image::PNG).unwrap();}TypeScriptTypeScript是JavaScript的增强版本。它主要是新添加的静态类型功能。由于TypeScript与JavaScript完全兼容,已经掌握JavaScript的Web前端开发人员可以轻松掌握TypeScript,因此受到他们的青睐。核心优势:它是JavaScript的超集,对于JavaScript开发人员来说没有太大变化。主要缺点:由于它是JavaScript的超级英雄,它也继承了JavaScript的一些历史包袱。分形树示例://Setupcanvasfordrawingvarcanvas:HTMLCanvasElement=document.createElement('canvas')canvas.width=600canvas.height=500document.body.appendChild(canvas)varctx:CanvasRenderingContext2D=canvas.getContext('2d')ctx.fillStyle='#000'ctx.lineWidth=1//constantsconstdegToRad:number=Math.PI/180.0consttotalDepth:number=9/**Helperfunctionthatdrawsalineonthecanvas*/functiondrawLine(x1:number,y1:number,x2:number,y2:number):void{ctx.moveTo(x1,y1)ctx.lineTo(x2,y2)}/**Drawsabranchatthegivenpointandangleandthencallsitselftwice*/functiondrawTree(x1:number,y1:number,angle:number,depth:number):void{if(depth!==0){letx2:number=x1+(Math.cos(angle*degToRad)*depth*10.0)lety2: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)}}//实际绘制reectx.beginPath()drawTree(300,500,-90,totalDepth)ctx.closePath()ctx.stroke()WebAssemblyWebAssembly是一匹黑马。在未来十年左右的时间里,它可能会催生出一系列有望登上编程语言排行榜前列的编程语言。虽然WebAssembly只是一个编译目标,但它有充分的理由应用于Web域之外。哪种基于WebAssembly的编程语言将位居榜首?没有人确切知道。