未来有望干掉 Python 和 JavaScript 的编程语言

更新日期: 2019-12-07阅读: 1.9k标签: 语言

Python 和 JavaScript 是两门非常有影响力的编程语言,二者都是我们在打造跨平台应用时会用到的主流语言。由于 Python 和 JavaScript 都是脚本语言,因此它们有很多共同的特性,都需要解释器来运行,都是动态类型,都支持自动内存管理,都可以调用 eval()来执行脚本等等脚本语言所共有的特性。在过去这些年来,Python 和 JavaScript 占据着主导型地位,但有句话说得好,长江后浪推前浪,青出于蓝胜于蓝。如果将来有一天,Python 和 JavaScript 被打败赶下榜单,那这个挑战者会是谁呢?退休的软件工程师 Richard Kenneth Eng 为我们分享了他的看法,罗列了那些他认为有望打败 Python 和 JavaScript 的编程语言。

Python 和 JavaScript 是当今最热门的两种编程语言。但是,它们不可能永远位居榜首。最终,它们一定会失宠,就像所有的编程语言一样。这很可能在未来十年内就会发生。

哪些编程语言有望取代它们呢?下面就是我列出的挑战者名单。


Dart

由于 Flutter 框架和 Google 的认可,这门语言迅速流行起来。它与使 Ruby 如此流行的驱动力相似:Rails 框架。

如果 Google 的新操作系统 Fuchsia 取得成功的话,Dart 将会成为其中心。

主要优势:它是一种比 JavaScript 更优秀的编程语言。

主要缺点:它面对来自 JavaScript 及其迷惑的群体的对抗。

曼德勃罗分形图(Mandelbrot set)示例代码

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 的派生语言,具有改进的语法,以及与 Erlang 相同的、惊人的并发性支持。作为一种纯函数式语言,它很有可能将这一范式提升为主流。

主要优点:它使函数式编程变得异常简单。它非常适合并发性。

主要缺点:需要了解潜在的一次性可编程基础知识,这可能是一项艰巨的任务。

曼德勃罗分形图(Mandelbrot set)示例代码:

defmoduleMandelbrotdo
defsetdo
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,fny ->
im = minIm + stepY * y
Enum.map(0..xsize,fnx ->
re = minRe + stepX * x
62- loop(0, re, im, re, im, re*re+im*im)
end) |> IO.puts
end)
end

defploop(n, _, _, _, _, _)whenn>=30,do:n
defploop(n, _, _, _, _, v)whenv>4.0,do:n-1
defploop(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

另一种 Google 支持的语言 Golang,得益于其闪电般的编译速度、简单高效的并发性以及非凡的简单性,它被证明是赢家。唯一缺少的就是泛型,不过,这个特性已经在路线图上了。

主要优点:超级简单,对并发性支持非常好。

主要缺点:它(目前)缺少泛型。

曼德勃罗分形图(Mandelbrot set)示例代码:

packagemain

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
)

funcmandelbrot(acomplex128)float64{
i :=0
forz := 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,那么 Julia 肯定是一个竞争者。

主要优点:这门语言是为科学家精心设计的。

主要缺点:这门语言面临数据科学之王 Python 的挑战。

曼德勃罗分形图(Mandelbrot set)示例代码:

usingImages

@inlinefunctionhsv2rgb(h, s, v)
constc = v * s
constx = c * (1- abs(((h/60) %2) -1))
constm = v - c

constr,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)
end

functionmandelbrot()

constw, h =1000,1000

constzoom =0.5
constmoveX =0
constmoveY =0

constimg =Array{RGB{Float64}}(h, w)
constmaxIter =30

forxin1:w
foryin1:h
i = maxIter
constc =Complex(
(2*x - w) / (w * zoom) + moveX,
(2*y - h) / (h * zoom) + moveY
)
z = c
whileabs(z) <2&& (i -=1) >0
z = z^2+ c
end
constr,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 的一个可以立即使用的替代品。Google 已经将其打造成 Android 开发的一流语言。

主要优点:它是一种升级版的 Java。

主要缺点:它是一种非常庞大的语言,即使与 Java 相比也是如此。

曼德勃罗分形图(Mandelbrot set)示例代码:

importjava.awt.Graphics
importjava.awt.image.BufferedImage
importjavax.swing.JFrame

classMandelbrot:JFrame("Mandelbrot Set") {
companionobject{
privateconstvalMAX_ITER =570
privateconstvalZOOM =150.0
}

privatevalimg: BufferedImage

init{
setBounds(100,100,800,600)
isResizable =false
defaultCloseoperation = EXIT_ON_CLOSE
img = BufferedImage(width, height, BufferedImage.TYPE_INT_RGB)
for(yin0until height) {
for(xin0until width) {
varzx =0.0
varzy =0.0
valcX = (x -400) / ZOOM
valcY = (y -300) / ZOOM
variter = MAX_ITER
while(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<String>){
Mandelbrot().isVisible =true
}

Lua

主要优点:Lua 是一种小巧、简单、快速、可嵌入、可移植的灵活的语言。

主要缺点:它已经被人们忽视了 26 年,现在会有什么改变呢?

曼德勃罗分形图(Mandelbrot set)示例代码:

localmaxIterations =250
localminX, maxX, minY, maxY =-2.5,2.5,-2.5,2.5
localmiX, mxX, miY, mxY
functionremap( x, t1, t2, s1, s2 )
localf = ( x - t1 ) / ( t2 - t1 )
localg = f * ( s2 - s1 ) + s1
returng;
end
functiondrawMandelbrot()
localpts, a, as, za, b, bs, zb, cnt, clr = {}
forj =0, hei -1do
fori =0, wid -1do
a = remap( i,0, wid, minX, maxX )
b = remap( j,0, hei, minY, maxY )
cnt =0; za = a; zb = b
while( cnt < maxIterations )do
as = a * a - b * b; bs =2* a * b
a = za + as; b = zb + bs
ifmath.abs( a ) +math.abs( b ) >16thenbreakend
cnt = cnt +1
end
ifcnt == maxIterationsthenclr =0
elseclr = remap( cnt,0, maxIterations,0,255)
end
pts[1] = { i, j, clr, clr,0,255}
love.graphics.points( pts )
end
end
end
functionstartFractal()
love.graphics.setCanvas( canvas ); love.graphics.clear()
love.graphics.setColor(255,255,255)
drawMandelbrot(); love.graphics.setCanvas()
end
functionlove.load()
wid, hei = love.graphics.getWidth(), love.graphics.getHeight()
canvas = love.graphics.newCanvas( wid, hei )
startFractal()
end
functionlove.mousepressed( x, y, button, istouch )
ifbutton ==1then
startDrag =true; miX = x; miY = y
else
minX =-2.5; maxX =2.5; minY = minX; maxY = maxX
startFractal()
startDrag =false
end
end
functionlove.mousereleased( x, y, button, istouch )
ifstartDragthen
locall
ifx > miXthenmxX = x
elsel = x; mxX = miX; miX = l
end
ify > miYthenmxY = y
elsel = y; mxY = miY; miY = l
end
miX = 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()
end
end
functionlove.draw()
love.graphics.draw( canvas )
end

Pharo

Pharo 是 Smalltalk 的现代变体,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
| p a |

(aLength > 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.
]
].

draw
Display restoreAfter: [
Display fillWhite.
self tree: 700@700 length: 200 angle: 0.
]

"Execute"

FractalTree new draw.

Rust

Rust 因其内存安全特性:借位检查器而得到了广泛的认可。这个特性实际上消除了所有与内存相关的编程错误。Rust 保证了编程的安全性。

主要优点:它有助于使软件更可靠。

主要缺点:这门语言很难学习,而且借位检查器可能也很难理解。

曼德勃罗分形图(Mandelbrot set)示例代码:

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;

// Create a new ImgBuf
letmutimgbuf = image::ImageBuffer::new(img_side, img_side);

// Calculate for each pixel
for(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);

letmuti =0;
fortin0..max_iterations {
ifz.norm() >2.0{
break;
}
z = z * z + c;
i = t;
}

*pixel = image::Luma([iasu8]);
}

// Save image
letfout = &mutFile::create("fractal.png").unwrap();
image::ImageLuma8(imgbuf).save(fout, image::PNG).unwrap();
}

TypeScript

TypeScript 是 JavaScript……带来了好处。它主要是添加了静态类型。与 JavaScript 的兼容性使它成为前端 Web 开发人员的最爱,因为他们已经了解 JavaScript,而且几乎不需要改变他们的工作流程。

主要优点:它就是 JavaScript,因此对 JavaScript 开发人员来说没有什么太大的变化。

主要缺点:它仍然是 JavaScript,所以仍然继承了 JavaScript 的所有包袱。

分形树示例代码:

// Set up canvas for drawing
varcanvas: htmlCanvasElement =document.createElement('canvas')
canvas.width =600
canvas.height =500
document.body.appendChild(canvas)
varctx: CanvasRenderingContext2D = canvas.getContext('2d')
ctx.fillStyle ='#000'
ctx.lineWidth =1

// constants
constdegToRad:number=Math.PI /180.0
consttotalDepth: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) {
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)
}
}

// actual drawing of tree
ctx.beginPath()
drawTree(300,500,-90, totalDepth)
ctx.closePath()
ctx.stroke()

WebAssembly

WebAssembly 是一匹黑马。在未来十年左右的时间里,它可能会衍生出一系列的语言,这些语言有望最终登上榜首。WebAssembly 只是一个编译目标,但没有理由说它不能扩展到 Web 领域以外的地方。至于哪些基于 WebAssembly 的语言可以登上榜首?现在谁也说不准。


作者介绍:

Richard Kenneth Eng,博主。Smalltalk 布道师。退休的软件工程师。《复仇者联盟》粉丝。

原文链接:https://hackernoon.com/programming-languages-of-the-future-b61332kd


链接: https://www.fly63.com/article/detial/7187

vue.js实现多语言_vue.js国际化 vue-i18n插件的使用

在项目开发中遇到需要多语言的支持,在Vue项目中有对应的组件vue-i18n,而且对项目的代码修改不大.这篇文章讲解vue-i18n的安装和使用,语言包的生成 & 替换项目中原有的静态文本

web网页多语言的实现方案_前端实现多语言切换

需要在web中实现多语言的切换,当用户语言切换完成后下次重新打开网页,也是上次设置的语言进行显示。在用户点击切换语言后,把选择的语言版本保存在cookie中;定义语言的标识+内容的json字符串

JavaScript中的黑话

因为球是圆的,所以不论发生什么都有可能,对这点我是深信不疑的,但最近我总是在怀疑,JavaScript也是圆的!本文带你细数JavaScript的黑话,因为这一切是多么的有趣,又是多么的无意义,就如这世界一般,很多事情只有当你了解过,才能做出错误的选择。

10个编译为JavaScript的语言

你不用写一行Javascript或者考虑这种语言的局限,就能生产在浏览器能运行的代码。这篇文章包括了十种有趣的语言能够编译为Javascript,在浏览器或者Node.js中被执行

这三个新特性可能改变JavaScript未来

你想不想知道下一波令人兴奋无比的 JavaScript 特性?你甚至都不知道自己需要这些特性。现在,我要向你展示三个可能会改变你编写 JavaScript 代码方式的提案。这些提案中有很多方面仍未最终确定。

7种主流编程语言的优点和缺点对比

7种主流编程语言:Python需要拿着游标卡尺学习的语言 ,C/C++大多数中国程序员的第一个语言 ,Java最长寿的语言 ,C#自称不是 Java 的 Java 语言 ,JavaScript 不是 Java 语言的语言 ,SQL数据库离不开的语言 ,PHP 世界上最好的语言

JavaScript 的现状_以及对 JavaScript 的批评有哪些呢?

JavaScript 已经成为了一门一流的编程语言,使用 JavaScript 的程序员们正变得无所不能。质疑 JavaScript 是否是一种「真正的」编程语言的时代已经过去,现在的问题是,你有没有准备好投入到这门语言中,进行真正的学习。

学习编程开发_如何学习并掌握一门计算机编程语言

如果你有兴趣编写计算机程序,移动APP,网站,游戏或者任何软件,你应该学习编程。编程语言撰写的代码构建了计算机的程序。无论对于何种计算机编程语言,其核心编程思想都是一样的

前端国际化的另类方式

一个项目发展到一定的环境或者一开始就是为多国打造的,就需要考虑国际化了。简单来说,就是一套页面,多套语言。主要探讨了两种完全不同的国际化方式,前一种主流,后一种完全属于另类,但还是有用武之地的。如果你的页面不太复杂,完全可以采取这种方式。

编程语言排行榜

对于程序员来说,选择一门适合自己,适合职业发展的编程语言也是同等重要。各大编程语言的受欢迎程度、学习的人群数量,以及由于人工智能的兴起,最热门的编程语言排行榜也发生了变化。让我们来看看。

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!