2020年编程语言展望

Python和JavaScript是当今最热门的两种编程语言。 但是,它们不能永远保持在最高位置。 最终,它们必须不受欢迎,就像所有语言一样。 这很可能在未来十年左右的时间内发生。

哪些语言可以代替它们? 这是我的挑战者名单...

得益于Flutter框架和Google的热情,这种语言迅速流行起来。 它与使Ruby如此流行的相同推动力相似:Rails框架。

而且,如果Google的“樱红色”风靡一时,Dart将会成为它的中心。

关键优势:它是一种比JavaScript更好的语言。

关键缺点:它与JavaScript及其成群的部落对抗。

Mandelbrot样本集:

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

关键优势:它使功能编程异常容易。 并发性很棒。

关键缺点:您需要了解潜在的OTP基础,这可能是一项艰巨的任务。

Mandelbrot样本集:

defmodule Mandelbrot do
  def set do
    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, fn y ->
      im = minIm + stepY * y
      Enum.map( 0. .xsize, fn x ->
        re = minRe + stepX * x
        62 - loop( 0 , re, im, re, im, re*re+im*im)
      end) |> IO.puts
    end)
  end
 
  defp loop(n, _, _, _, _, _) when n>= 30 , do : n
  defp loop(n, _, _, _, _, v) when v> 4.0 , do : n -1
  defp loop(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已证明是赢家,这得益于其迅捷的编译速度,轻松高效的并发性以及非凡的简便性。 唯一缺少的是泛型,而且此功能还在路线图上。

关键优势:它非常简单,并发性很好。

关键缺点:(目前)缺少泛型。

Mandelbrot样本集:

package main
 
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
)
 
func mandelbrot(a complex128) float64 {
    i := 0
    for 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,那么这绝对是竞争者。

关键优势:为科学家精心设计。

关键缺点:它与数据科学之王Python对抗。

Mandelbrot样本集:

using Images
 
@inline function hsv2rgb ( h, s, v )
    const c = v * s
    const x = c * ( 1 - abs(((h /60) % 2) - 1))
    const m = v - c
 
    const 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)
end
 
function mandelbrot()
 
    const w, h = 1000, 1000
 
    const zoom  = 0.5
    const moveX = 0
    const moveY = 0
 
    const img = Array{RGB{Float64}}(h, w)
    const maxIter = 30
 
    for x in 1:w
        for y in 1:h
            i = maxIter
            const c = Complex(
                (2*x - w) / (w * zoom ) + moveX ,
                ( 2 *y - h ) / ( h * zoom ) + moveY
            )
            z = c
            while abs ( z ) < 2 && ( i -= 1 ) > 0
                z = z ^2 + c
            end
            const r , 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()

科特林

科特林更好的Java。 实际上,它实际上是Java的直接替代。 Google已经使其成为Android开发的一流语言。

关键优势:它是强大的Java。

关键缺点:与Java相比,它是一种很大的语言。

Mandelbrot样本集:

import java.awt.Graphics
import java.awt.image.BufferedImage
import javax.swing.JFrame
 
class Mandelbrot : JFrame (" Mandelbrot Set ")  {
    companion object {
        private const val MAX_ITER = 570
        private const val ZOOM = 150.0
    }
 
    private val img: BufferedImage
 
    init {
        setBounds( 100 , 100 , 800 , 600 )
        isResizable = false
        defaultCloseOperation = EXIT_ON_CLOSE
        img = BufferedImage(width, height, BufferedImage.TYPE_INT_RGB)
        for (y in 0 until height) {
            for (x in 0 until width) {
                var zx = 0.0
                var zy = 0.0
                val cX = (x - 400 ) / ZOOM
                val cY = (y - 300 ) / ZOOM
                var iter = MAX_ITER
                while (zx * zx + zy * zy < 4.0 && iter > 0 ) {
                    val tmp = zx * zx - zy * zy + cX
                    zy = 2.0 * zx * zy + cY
                    zx = tmp
                    iter--
                }
                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
}

a

关键优势:Lua是一种小型,简单,快速,可嵌入,可移植且灵活的语言。

关键缺点:已经被忽略了26年。 现在会发生什么变化?

Mandelbrot样本集:

local maxIterations = 250
local minX, maxX, minY, maxY = -2.5 , 2.5 , -2.5 , 2.5
local miX, mxX, miY, mxY
function remap (  x, t1, t2, s1, s2  )
    local f = (  x - t1  ) / (  t2 - t1  )
    local g = f * (  s2 - s1  ) + s1
    return g ;
end
function drawMandelbrot ( )
    local pts , a , as , za , b , bs , zb , cnt , clr =  {}
    for j = 0 , hei - 1 do
        for i = 0 , wid - 1 do
            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
                if math.abs( a ) + math.abs( b ) > 16 then break end
                cnt = cnt + 1
            end
            if cnt == maxIterations then clr = 0
            else clr = remap( cnt, 0 , maxIterations, 0 , 255 )
            end
            pts[ 1 ] = { i, j, clr, clr, 0 , 255 }
            love.graphics.points( pts )
        end
    end
end
function startFractal ( )
    love . graphics . setCanvas (  canvas  ); love . graphics . clear ( )
    love . graphics . setColor (  255 , 255 , 255  )
    drawMandelbrot ( ); love . graphics . setCanvas ( )
end
function love . load ( )
    wid , hei = love . graphics . getWidth ( ), love . graphics . getHeight ( )
    canvas = love . graphics . newCanvas (  wid, hei  )
    startFractal ( )
end
function love . mousepressed (  x, y, button, istouch  )
    if button ==  1 then
        startDrag = true ; miX = x ; miY = y
    else
        minX = -2.5; maxX = 2.5; minY = minX ; maxY = maxX
        startFractal ( )
        startDrag = false
    end
end
function love . mousereleased (  x, y, button, istouch  )
    if startDrag then
        local l
        if x > miX then mxX = x
        else l = x ; mxX = miX ; miX = l
        end
        if y > miY then mxY = y
        else l = 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
function love . draw ( )
    love . graphics . draw (  canvas  )
end

法罗

Pharo是Smalltalk的现代变体,Smalltalk是一种非常有生产力的面向对象语言。 实际上,Smalltalk是OOP 典范,并且已经启发了地球上几乎所有其他OOP语言。 最后,没有一种语言能比Smalltalk更好地实现OOP。

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承诺编程会更安全。

关键优势:它有助于使软件更加可靠。

关键缺点:学习困难,借位检查器可能很难理解。

Mandelbrot样本集:

extern crate image;
extern crate num_complex;
 
use std::fs::File;
use num_complex::Complex;
 
fn main() {
    let max_iterations = 256 u16;
    let img_side = 800 u32;
    let cxmin = -2 f32;
    let cxmax = 1 f32;
    let cymin = -1.5 f32;
    let cymax = 1.5 f32;
    let scalex = (cxmax - cxmin) / img_side as f32;
    let scaley = (cymax - cymin) / img_side as f32;
 
    // Create a new ImgBuf
    let mut imgbuf = image::ImageBuffer:: new (img_side, img_side);
 
    // Calculate for each pixel
    for (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 ( 0 f32, 0 f32);
 
        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 image
    let fout = &mut File::create( "fractal.png" ).unwrap();
    image::ImageLuma8(imgbuf).save(fout, image ::PNG).unwrap();
}

打字稿

TypeScript是JavaScript…具有优势。 它主要添加静态类型。 与JavaScript的兼容性使其成为前端Web开发人员的最爱,因为他们已经了解JavaScript,并且几乎不需要更改其工作流程。

关键优势:它是JavaScript,因此JavaScript开发人员没有太大变化。

关键缺点:它仍然是JavaScript,因此您继承了它的所有包g。

分形树样本:

// Set up canvas for drawing
var canvas: HTMLCanvasElement = document .createElement( 'canvas' )
canvas.width = 600
canvas.height = 500
document .body.appendChild(canvas)
var ctx: CanvasRenderingContext2D = canvas.getContext( '2d' )
ctx.fillStyle = '#000'
ctx.lineWidth = 1
 
// constants
const degToRad: number = Math .PI / 180.0
const 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 tree
ctx.beginPath()
drawTree( 300 , 500 , -90 , totalDepth)
ctx.closePath()
ctx.stroke()

Web组装

WebAssembly是一匹黑马。 在接下来的十年左右的时间里,它可能会产生出许多上升到顶部的语言。 WebAssembly只是一个编译目标,但是没有理由它不能扩展到整个Web域之外。 哪些基于WebAssembly的语言可以升至最高? 有人猜。



From: https://hackernoon.com/programming-languages-of-the-future-b61332kd

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值