飞道的博客

2020 年,大火的 Python 和 JavaScript 是否会被取而代之?

332人阅读  评论(0)

Python 和 JavaScript 是目前最火的两大编程语言,但是 2020 年,什么编程语言将会取而代之呢?

作者 | Richard Kenneth Eng

译者 | 明明如月,责编 | 郭芮

出品 | CSDN(ID:CSDNnews)

以下为译文:

Python 和 JavaScript 是目前最火的两大编程语言。然而,他们不可能永远屹立不倒。最终,必将像其他编程语言一样跌下神坛。这很可能在接下来的十年左右上演。

那么什么编程语言将会取而代之呢? 下面给出我的候选者名单!

Dart

多亏了 Flutter 框架和 Google 的认可,该语言迅速流行开来。这和 Rails 框架让 Ruby 流行起来的原因非常相似。如果谷歌的 Fuchsia 系统能够火起来,Dart 将受益最大。

  • 核心优势:它是一种比 JavaScript 更棒的编程语言。

  • 主要缺点:不得不面对 JavaScript 语言和 JavaScript 的强烈拥护者的挑战。

曼德布洛特集样本:


   
  1. class Complex {
  2.   double _r,_i;
  3.   Complex(this._r,this._i);
  4.   double get r => _r;
  5.   double get i => _i;
  6.   String toString() =>  "($r,$i)";
  7.   Complex operator +(Complex other) =>  new Complex(r+other.r,i+other.i);
  8.   Complex operator *(Complex other) =>
  9.        new Complex(r*other.r-i*other.i,r*other.i+other.r*i);
  10.   double abs() => r*r+i*i;
  11. }
  12. void main() {
  13.   double start_x= -1.5;
  14.   double start_y= -1.0;
  15.   double step_x= 0.03;
  16.   double step_y= 0.1;
  17.    for(int y= 0;y< 20;y++) {
  18.     String line= "";
  19.      for(int x= 0;x< 70;x++) {
  20.       Complex c= new Complex(start_x+step_x*x,start_y+step_y*y);
  21.       Complex z= new Complex( 0.00.0);
  22.        for(int i= 0;i< 100;i++) {
  23.         z=z*(z)+c;
  24.          if(z.abs()> 2) {
  25.            break;
  26.         }
  27.       }
  28.       line+=z.abs()> 2 ?  " " :  "*";
  29.     }
  30.      print(line);
  31.   }
  32. }

Elixir

Elixir 是基于一种基于 Erlang 虚拟机的函数式编程语言,对并发的支持非常好。作为一个纯粹的函数式编程语言,它有望将这种范式变为主流。

  • 核心优势:它让函数式编程变得异常简单,对并发的支持非常棒。

  • 主要缺点:需要有 OTP 基础,但掌握 OTP 却没那么容易。

曼德布洛特集样本:


   
  1. defmodule Mandelbrot do
  2.   def set do
  3.     xsize =  59
  4.     ysize =  21
  5.     minIm =  -1.0
  6.     maxIm =  1.0
  7.     minRe =  -2.0
  8.     maxRe =  1.0
  9.     stepX = (maxRe - minRe) / xsize
  10.     stepY = (maxIm - minIm) / ysize
  11.     Enum.each( 0..ysize, fn y ->
  12.       im = minIm + stepY * y
  13.       Enum. map( 0..xsize, fn x ->
  14.         re = minRe + stepX * x
  15.          62 - loop( 0, re, im, re, im, re*re+im*im)
  16.       end) |> IO.puts
  17.     end)
  18.   end
  19.   defp loop(n, _, _, _, _, _) when n>= 30, do: n
  20.   defp loop(n, _, _, _, _, v) when v> 4.0, do: n -1
  21.   defp loop(n, re, im, zr, zi, _) do
  22.     a = zr * zr
  23.     b = zi * zi
  24.     loop(n+ 1, re, im, a-b+re,  2*zr*zi+im, a+b)
  25.   end
  26. end
  27. Mandelbrot.set

Golang

 

得益于其闪电般的编译速度、简单和高效的并发支持,另外一个谷歌受支持的编程语言 Golang 已经崭露头角。唯一缺的就是泛型支持,但是这个特性已经在规划上了。

  • 核心优势:上手简单,对并发的支持非常出色。

  • 主要缺点:缺少泛型支持(暂时的)。

曼德布洛特集样本:


   
  1. package main
  2. import (
  3.      "fmt"
  4.      "image"
  5.      "image/color"
  6.      "image/draw"
  7.      "image/png"
  8.      "math/cmplx"
  9.      "os"
  10. )
  11. const (
  12.     maxEsc =  100
  13.     rMin   =  -2.
  14.     rMax   =  .5
  15.     iMin   =  -1.
  16.     iMax   =  1.
  17.     width  =  750
  18.     red    =  230
  19.     green  =  235
  20.     blue   =  255
  21. )
  22. func mandelbrot(a complex128) float64 {
  23.     i :=  0
  24.      for z := a; cmplx.Abs(z) <  2 && i < maxEsc; i++ {
  25.         z = z*z + a
  26.     }
  27.      return float64(maxEsc-i) / maxEsc
  28. }
  29. func main() {
  30.     scale := width / (rMax - rMin)
  31.     height := int(scale * (iMax - iMin))
  32.     bounds := image.Rect( 00, width, height)
  33.     b := image.NewNRGBA(bounds)
  34.     draw.Draw(b, bounds, image.NewUniform(color.Black), image.ZP, draw.Src)
  35.      for x :=  0; x < width; x++ {
  36.          for y :=  0; y < height; y++ {
  37.             fEsc := mandelbrot(complex(
  38.                 float64(x)/scale+rMin,
  39.                 float64(y)/scale+iMin))
  40.             b.Set(x, y, color.NRGBA{uint8(red * fEsc),
  41.                 uint8(green * fEsc), uint8(blue * fEsc),  255})
  42.         }
  43.     }
  44.     f, err := os.Create( "mandelbrot.png")
  45.      if err != nil {
  46.         fmt.Println(err)
  47.          return
  48.     }
  49.      if err = png.Encode(f, b); err != nil {
  50.         fmt.Println(err)
  51.     }
  52.      if err = f.Close(); err != nil {
  53.         fmt.Println(err)
  54.     }
  55. }

Julia

 

Julia 的优势在于对数学计算的支持非常出色。它对数学的语法支持非常好,堪称数据科学家的福音。假如有任何编程语言可以颠覆 Python, 它将是一个强有力的竞争者。

  • 核心优势:为科学家精心设计。

  • 主要缺点:面临着数据科学之王 Python 的竞争。

曼德布洛特集样本:


   
  1. using Images
  2. @inline function hsv2rgb(h, s, v)
  3.      const c = v * s
  4.      const x = c * ( 1 - abs(((h/ 60) %  2) -  1))
  5.      const m = v - c
  6.      const r,g,b =
  7.          if h <  60
  8.             (c, x,  0)
  9.         elseif h <  120
  10.             (x, c,  0)
  11.         elseif h <  180
  12.             ( 0, c, x)
  13.         elseif h <  240
  14.             ( 0, x, c)
  15.         elseif h <  300
  16.             (x,  0, c)
  17.          else
  18.             (c,  0, x)
  19.         end
  20.     (r + m), (b + m), (g + m)
  21. end
  22. function mandelbrot()
  23.      const w, h =  10001000
  24.      const zoom  =  0.5
  25.      const moveX =  0
  26.      const moveY =  0
  27.      const img = Array{RGB{Float64}}(h, w)
  28.      const maxIter =  30
  29.      for x in  1:w
  30.          for y in  1:h
  31.             i = maxIter
  32.              const c = Complex(
  33.                 ( 2*x - w) / (w * zoom) + moveX,
  34.                 ( 2*y - h) / (h * zoom) + moveY
  35.             )
  36.             z = c
  37.             while abs(z) <  2 && (i -=  1) >  0
  38.                 z = z^ 2 + c
  39.             end
  40.              const r,g,b = hsv2rgb(i / maxIter *  3601, i / maxIter)
  41.             img[y,x] = RGB{Float64}(r, g, b)
  42.         end
  43.     end
  44.     save( "mandelbrot_set.png", img)
  45. end
  46. mandelbrot()

Kotlin

Kotlin 是升级版的 Java。 实际上,它可以完全替代 Java 编程语言,谷歌已经将其打造成 Android 开发的首选语言。

  • 核心优势:比 Java 更强大。

  • 主要缺点:Kotlin 非常庞大,甚至比 Java 更庞大。

曼德布洛特集样本:


   
  1. import java.awt.Graphics
  2. import java.awt.image.BufferedImage
  3. import javax.swing.JFrame
  4. class MandelbrotJFrame("Mandelbrot Set") {
  5.     companion object {
  6.          private  const val MAX_ITER =  570
  7.          private  const val ZOOM =  150.0
  8.     }
  9.      private val img: BufferedImage
  10.     init {
  11.         setBounds( 100100800600)
  12.         isResizable =  false
  13.         defaultCloseOperation = EXIT_ON_CLOSE
  14.         img = BufferedImage(width, height, BufferedImage.TYPE_INT_RGB)
  15.          for (y in  0 until height) {
  16.              for (x in  0 until width) {
  17.                  var zx =  0.0
  18.                  var zy =  0.0
  19.                 val cX = (x -  400) / ZOOM
  20.                 val cY = (y -  300) / ZOOM
  21.                  var iter = MAX_ITER
  22.                  while (zx * zx + zy * zy <  4.0 && iter >  0) {
  23.                     val tmp = zx * zx - zy * zy + cX
  24.                     zy =  2.0 * zx * zy + cY
  25.                     zx = tmp
  26.                     iter--
  27.                 }
  28.                 img.setRGB(x, y, iter  or (iter shl  7))
  29.             }
  30.         }
  31.     }
  32.     override fun paint(g: Graphics) {
  33.         g.drawImage(img,  00, this)
  34.     }
  35. }
  36. fun main(args:  Array<String>) {
  37.     Mandelbrot().isVisible =  true
  38. }

Lua

 

  • 核心优势: Lua 是一种小巧、简单、快速、可嵌入、可移植和灵活的编程语言。

  • 主要缺点:Lua 被忽视了 26 年了。现在还能掀起风浪吗?

曼德布洛特集样本:


   
  1. local maxIterations =  250
  2. local minX, maxX, minY, maxY =  -2.52.5-2.52.5
  3. local miX, mxX, miY, mxY
  4. function remap( x, t1, t2, s1, s2 )
  5.      local  f =  ( x - t1 ) /  ( t2 - t1 )
  6.      local  g =  f *  ( s2 - s1 ) +  s1
  7.      return  g;
  8. end
  9. function drawMandelbrot()
  10.      local  ptsaaszabbszbcntclr = {}
  11.      for j =  0, hei -  1  do
  12.          for i =  0, wid -  1  do
  13.             a = remap( i,  0, wid, minX, maxX )
  14.             b = remap( j,  0, hei, minY, maxY )
  15.             cnt =  0; za = a; zb = b
  16.              while( cnt < maxIterations )  do
  17.                  as = a * a - b * b; bs =  2 * a * b
  18.                 a = za +  as; b = zb + bs
  19.                  if math.abs( a ) + math.abs( b ) >  16 then  break end
  20.                 cnt = cnt +  1
  21.             end
  22.              if cnt == maxIterations then clr =  0
  23.              else clr = remap( cnt,  0, maxIterations,  0255 )
  24.             end
  25.             pts[ 1] = { i, j, clr, clr,  0255 }
  26.             love.graphics.points( pts )
  27.         end
  28.     end
  29. end
  30. function startFractal()
  31.      love. graphics. setCanvas ( canvas ); love.graphics.clear()
  32.     love.graphics.setColor(  255255255 )
  33.     drawMandelbrot(); love.graphics.setCanvas()
  34. end
  35. function love.load()
  36.      widhei =  love. graphics. getWidth ()love. graphics. getHeight ()
  37.      canvas =  love. graphics. newCanvas ( wid, hei )
  38.      startFractal ()
  39. end
  40. function  love. mousepressed ( x, y, button, istouch )
  41.      if  button ==  1  then
  42.          startDrag =  true; miX = x; miY = y
  43.      else
  44.         minX =  -2.5; maxX =  2.5; minY = minX; maxY = maxX
  45.         startFractal()
  46.         startDrag =  false
  47.     end
  48. end
  49. function love.mousereleased( x, y, button, istouch )
  50.      if  startDrag  then
  51.          local  l
  52.          if  x >  miX  then  mxX =  x
  53.          else  l =  x; mxX = miX; miX = l
  54.         end
  55.          if y > miY then mxY = y
  56.          else l = y; mxY = miY; miY = l
  57.         end
  58.         miX = remap( miX,  0, wid, minX, maxX ) 
  59.         mxX = remap( mxX,  0, wid, minX, maxX )
  60.         miY = remap( miY,  0, hei, minY, maxY ) 
  61.         mxY = remap( mxY,  0, hei, minY, maxY )
  62.         minX = miX; maxX = mxX; minY = miY; maxY = mxY
  63.         startFractal()
  64.     end
  65. end
  66. function love.draw()
  67.      love. graphics. draw ( canvas )
  68. end

Pharo

 

Pharo 是 Smalltalk 的现代版变体,是一个非常高效的面向对象编程语言。事实上,Smalltalk 是面向对象的典范,几乎所有的其他面向对象编程语言都受到它的启发。却没有一个编程语言比 Smalltalk 面向对象的程度更高。

Pharo 也是世界上最简单、最优雅的编程语言之一,你只需要 15 分钟就能掌握 Smalltalk 的全部语法。

  • 关键优势:开发效率非常高,编程效率能提升接近 5 倍。

  • 主要缺点:它需要一种与众不同的编程思维。但是人总是害怕改变,很难接受这种编程思维。

分形树样本:


   
  1. Object subclass: #FractalTree
  2.     instanceVariableNames:  ''
  3.     classVariableNames: ' '
  4.     poolDictionaries: ' '
  5.     category: 'RosettaCode '
  6. "Methods for FractalTree class"
  7. tree: aPoint length: aLength angle: anAngle
  8.     | p a |
  9.     (aLength > 10) ifTrue: [
  10.         p := Pen new.
  11.         p up.
  12.         p goto: aPoint.
  13.         p turn: anAngle.
  14.         p down.
  15.         5 timesRepeat: [
  16.             p go: aLength / 5.
  17.             p turn: 5.
  18.         ].
  19.         a := anAngle - 30.
  20.         3 timesRepeat: [
  21.             self tree: p location length: aLength * 0.7 angle: a.
  22.             a := a + 30.
  23.         ]
  24.     ].
  25. draw
  26.     Display restoreAfter: [
  27.         Display fillWhite.      
  28.         self tree: 700@700 length: 200 angle: 0.
  29.     ]
  30. "Execute"
  31. FractalTree new draw.

Rust

由于内存安全特性——借用检查器,Rust 已经赢得广泛认可。这一特性实际上消除了所有内存相关错误。Rust 提供了更安全的编程特性。

  • 关键优势:有助于提高软件的可靠性。

  • 主要缺点:它学起来很难。借用检查器比较复杂且难以理解。

曼德布洛特集样本:


   
  1. extern crate image;
  2. extern crate num_complex;
  3. use std::fs::File;
  4. use num_complex::Complex;
  5. fn main() {
  6.     let max_iterations =  256u16;
  7.     let img_side =  800u32;
  8.     let cxmin =  -2f32;
  9.     let cxmax =  1f32;
  10.     let cymin =  -1.5f32;
  11.     let cymax =  1.5f32;
  12.     let scalex = (cxmax - cxmin) / img_side as f32;
  13.     let scaley = (cymax - cymin) / img_side as f32;
  14.      // Create a new ImgBuf
  15.     let mut imgbuf = image::ImageBuffer:: new(img_side, img_side);
  16.      // Calculate for each pixel
  17.      for (x, y, pixel) in imgbuf.enumerate_pixels_mut() {
  18.         let cx = cxmin + x as f32 * scalex;
  19.         let cy = cymin + y as f32 * scaley;
  20.         let c = Complex:: new(cx, cy);
  21.         let mut z = Complex:: new( 0f32,  0f32);
  22.         let mut i =  0;
  23.          for t in  0..max_iterations {
  24.              if z.norm() >  2.0 {
  25.                  break;
  26.             }
  27.             z = z * z + c;
  28.             i = t;
  29.         }
  30.         *pixel = image::Luma([i as u8]);
  31.     }
  32.      // Save image
  33.     let fout = &mut File::create( "fractal.png").unwrap();
  34.     image::ImageLuma8(imgbuf).save(fout, image::PNG).unwrap();
  35. }

TypeScript

TypeScript 是一个增强版的 JavaScript. 它主要新增了静态类型的特性。

由于 TypeScript 和 JavaScript 完全兼容,已经掌握了 JavaScript 的前端 web 开发者们可以轻松掌握 TypeScript,因而深受他们青睐。

  • 核心优势:它是 JavaScript 的超集 , 对 JavaScript 开发者来说没啥太大变化。

  • 主要缺点:由于它是 JavaScript 的超级,这就导致了它同样也继承了 JavaScript 的一些历史包袱。

分形树样本:


   
  1. // Set up canvas for drawing
  2. var canvas: HTMLCanvasElement = document.createElement( 'canvas')
  3. canvas.width =  600
  4. canvas.height =  500
  5. document.body.appendChild(canvas)
  6. var ctx: CanvasRenderingContext2D = canvas.getContext( '2d')
  7. ctx.fillStyle =  '#000'
  8. ctx.lineWidth =  1
  9. // constants
  10. const degToRad: number = Math.PI /  180.0
  11. const totalDepth: number =  9
  12. /** Helper function that draws a line on the canvas */
  13. function drawLine(x1: number, y1: number, x2: number, y2: number): void {
  14.     ctx.moveTo(x1, y1)
  15.     ctx.lineTo(x2, y2)
  16. }
  17. /** Draws a branch at the given point and angle and then calls itself twice */
  18. function drawTree(x1: number, y1: number, angle: number, depth: number): void {
  19.      if (depth !==  0) {
  20.         let x2: number = x1 + (Math.cos(angle * degToRad) * depth *  10.0)
  21.         let y2: number = y1 + (Math.sin(angle * degToRad) * depth *  10.0)
  22.         drawLine(x1, y1, x2, y2)
  23.         drawTree(x2, y2, angle -  20, depth -  1)
  24.         drawTree(x2, y2, angle +  20, depth -  1)
  25.     }
  26. }
  27. // actual drawing of tree
  28. ctx.beginPath()
  29. drawTree( 300500-90, totalDepth)
  30. ctx.closePath()
  31. ctx.stroke()

WebAssembly

WebAssembly 是一匹黑马。在接下来的十年左右的时间,它可能会衍生出一系列编程语言,这些编程语言有望登顶编程语言排行榜。

虽然 WebAssembly 只是一个编译目标,但是它有充足理由被应用到 Web 领域之外。哪种基于 WebAssembly 的编程语言能够荣登榜首?谁也说不准。

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

作者: Richard Kenneth Eng,Smalltalk 传播者,退休的软件工程师,复仇者联盟的粉丝。译者:明明如月,知名互联网公司 Java 高级开发工程师,CSDN 博客专家。

本文为 CSDN 翻译,转载请注明来源出处。


转载:https://blog.csdn.net/csdnnews/article/details/103951883
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场