原文標題:《未來有望幹掉 Python 和 JavaScript 的編程語言》
原文來源: InfoQ 作者:Richard Kenneth
導讀:Python 和 JavaScript 是兩門非常有影響力的編程語言,二者都是我們在打造跨平臺應用時會用到的主流語言。由於 Python 和 JavaScript 都是腳本語言,因此它們有很多共同的特性,都需要解釋器來運行,都是動態類型,都支持自動內存管理,都可以調用 eval()來執行腳本等等腳本語言所共有的特性。在過去這些年來,Python 和 JavaScript 佔據着主導型地位,但有句話說得好,長江後浪推前浪,青出於藍勝於藍。如果將來有一天,Python 和 JavaScript 被打敗趕下榜單,那這個挑戰者會是誰呢?退休的軟件工程師 Richard Kenneth Eng 爲我們分享了他的看法,羅列了那些他認爲有望打敗 Python 和 JavaScript 的編程語言。
Python 和 JavaScript 是當今最熱門的兩種編程語言。但是,它們不可能永遠位居榜首。最終,它們一定會失寵,就像所有的編程語言一樣。這很可能在未來十年內就會發生。
哪些編程語言有望取代它們呢?下面就是我列出的挑戰者名單。
飛鏢
由於 Flutter 框架和 Google 的認可,這門語言迅速流行起來。它與使 Ruby 如此流行的驅動力相似:Rails 框架。
如果 Google 的新操作系統 Fuchsia 取得成功的話,Dart 將會成爲其中心。
主要優勢:它是一種比 JavaScript 更優秀的編程語言。
主要缺點:它面對來自 JavaScript 及其迷惑的羣體的對抗。
曼德勃羅分形圖(Mandelbrot set)示例代碼:
類複雜{
雙_r _i;
複雜(this._r this._i);
得到r = >_r;
得到i = >_i;
字符串toString() =比;“(r,我美元)”;
複合運算符+(複合其他運算符)= >新的複雜(r + other.r,我+個人);
複合運算符*(複合其他運算符)= >
新的複雜(r * other.r-i *我,*我+ other.r *我);
雙abs() =比;* r +我*;
}
void main () {
雙start_x = -1.5;
雙start_y = -1.0;
雙step_x = 0.03;
雙step_y = 0.1;
(int y = 0; y< 20 y + +) {
字符串行= " ";
(int x = 0; x< 70; x + +) {
複雜的c =新的複雜(start_x + step_x * x, start_y + step_y * y);
複雜z=新複雜(0.0,0.0);
for (int i = 0; i< 100;我+ +){
z = z * (z) + c;
if (z.abs () > 2)——
打破;
}
}
線+ = z.abs ? () >;
}
打印(行);
}
}
藥劑
Elixir 是 Erlang 的派生語言,具有改進的語法,以及與 Erlang 相同的、驚人的併發性支持。作爲一種純函數式語言,它很有可能將這一範式提升爲主流。
主要優點:它使函數式編程變得異常簡單。它非常適合併發性。
主要缺點:需要了解潛在的一次性可編程基礎知識,這可能是一項艱鉅的任務。
曼德勃羅分形圖(Mandelbrot set)示例代碼:
杏仁準備
def組做
xsize = 59
ysize = 21
二分音符= -1.0
馬克西姆= 1.0
minRe = -2.0
maxRe = 1.0
stepX = (maxRe - minRe) / xsize
stepY = (maxIm - minIm) / ysize
Enum.each (0 . .ysize, fny - >
(暱稱
Enum.map (0 . .xsize, fnx - >
re = minRe + stepX * x
62 -循環(0,re, im, re, im, re*re+im*im)
結局)| >IO.puts
結束)
結束
defp循環(n, _, _, _, _, _)當n > =30時,執行:n
defp循環(n, _, _, _, _, v)當v> 4.0: n - 1
defp循環(n, re, im, zr, zi, _)做
a = zr * zr
b = zi * zi
循環(n+1, re, im, a-b+re, 2*zr*zi+im, a+b)
結束
結束
Mandelbrot.set
Golang
另一種 Google 支持的語言 Golang,得益於其閃電般的編譯速度、簡單高效的併發性以及非凡的簡單性,它被證明是贏家。唯一缺少的就是泛型,不過,這個特性已經在路線圖上了。
主要優點:超級簡單,對併發性支持非常好。
主要缺點:它(目前)缺少泛型。
曼德勃羅分形圖(Mandelbrot set)示例代碼:
主要包
導入(
“fmt”
“圖像”
“圖像/顏色”
“圖像/畫”
“圖像/ png”
“數學/ cmplx "
“你”
)
常量(
maxEsc = 100
rMin = 2。
徵求= 5
iMin = 1。
iMax = 1。
寬度= 750
紅色= 230
綠色= 235
藍色= 255
)
曼德爾勃特函數(a complex128)
我:= 0
for z:= a;cmplx.Abs (z) & lt;2,,我& lt;maxEsc;我+ + {
z = z*z + a
}
返回float64(maxEsc-i) / maxEsc
}
函數main () {
比例:=寬度/ (rMax - rMin)
高度:= int(比例* (iMax - iMin))
範圍:=形象。矩形(0,0,寬度,高度)
b: = image.NewNRGBA(範圍)
畫畫。繪製(b,邊界,image. newuniform (color.Black), image。ZP draw.Src)
對於x:= 0;x & lt;寬度;x + + {
對於y:= 0;y & lt;高度;y + + {
mandelbrot(複合物)
+ rMin float64 (x) /規模,
float64 (y) /規模+ iMin))
b。集(x, y,顏色。NRGBA {uint8(紅色* fEsc),
uint8(綠色* fEsc), uint8(藍色* fEsc), 255}
}
}
f, err:= os.Create(“mandelbrot.png”)
如果err != nil {
fmt.Println (err)
返回
}
如果err = png。編碼(f, b);err != nil {
fmt.Println (err)
}
if err = f.Close();err != nil {
fmt.Println (err)
}
}
茱莉亞
Julia 的優勢在於它對數學計算的出色支持。數學友好的語法對數學家來說非常有用。如果有哪種語言可以推翻 Python,那麼 Julia 肯定是一個競爭者。
主要優點:這門語言是爲科學家精心設計的。
主要缺點:這門語言面臨數據科學之王 Python 的挑戰。
曼德勃羅分形圖(Mandelbrot set)示例代碼:
使用圖像
(h, s, v)
常量c = v * s
((((h/60) % 2) - 1))
平衡n
常數r g b =
如果h & lt;60
(c, x, 0)
elseif h & lt;120
(x, c, 0)
elseif h & lt;180
(0, c, x)
elseif h & lt;240
(0, x, c)
elseif h & lt;300
(x, 0, c)
其他的
(c, 0, x)
結束
(r + m) (b + m) (g + m)
結束
曼德布洛特()函數
常量w, h = 1000, 1000
常量縮放= 0.5
const moveX = 0
const moveY = 0
數組{RGB{Float64} (h, w)
常量maxIter = 30
對x取1:w
y在1:h
i =麥克斯特
常數c=複數(
(2*x - w) / (w * zoom) + moveX,
(2*y - h) / (h * zoom) + moveY
)
z = c
謝謝2 & &>0
z = z ^ 2 + c
結束
const r,g,b = h2rgb (i / maxIter * 360米,一/ maxIter)
img[y,x] = RGB{Float64}(r, g, b)
結束
結束
保存(“mandelbrot_set。png”, img)
結束
mandelbrot ()
芬蘭灣的科特林
Kotlin 是更好的 Java。事實上,它實際上就是 Java 的一個可以立即使用的替代品。Google 已經將其打造成 Android 開發的一流語言。
主要優點:它是一種升級版的 Java。
主要缺點:它是一種非常龐大的語言,即使與 Java 相比也是如此。
曼德勃羅分形圖(Mandelbrot set)示例代碼:
import java.awt.Graphics
進口java.awt.image.BufferedImage
進口javax.swing.JFrame
杏仁麪包
伴星{
私有常量val MAX_ITER = 570
私有const val ZOOM = 150.0
}
私有val img: BufferedImage
init {
setBounds(100, 100, 800, 600)
isResizable = false
defaultCloseOperation = EXIT_ON_CLOSE
img = BufferedImage(寬度,高度,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) /變焦
val cY = (y - 300) / ZOOM
它的實驗堆
暈暈4.0 & &國際核聚變實驗堆>0)——
val tmp = zx * zx - zy * zy + cX
此處= 2
zx = tmp
iter——
}
img。setRGB(x, y, iter或(iter shl 7))
}
}
}
覆蓋fun paint(g: Graphics) {
g。drawImage(img, 0,0, this)
}
}
fun main(args: Array < String >)
曼德布洛特()。isVisible = true
}
月亮
主要優點:Lua 是一種小巧、簡單、快速、可嵌入、可移植的靈活的語言。
主要缺點:它已經被人們忽視了 26 年,現在會有什麼改變呢?
曼德勃羅分形圖(Mandelbrot set)示例代碼:
局部maxiteration = 250
局部minX, maxX, minY, maxY = -2.5, 2.5, -2.5, 2.5
本地混合,mxX, miY, mxY
函數映射(x, t1, t2, s1, s2)
局部f = (x - t1) / (t2 - t1)
局部g = f * (s2 - s1) + s1
返回g;
結束
drawMandelbrot()函數
本地pts, a, as, za, b, bs, zb, cnt, clr = {}
對於j = 0, hei - 1
對於i = 0 wid - 1
a = remap(i, 0, wid, minX, maxX)
b = remap(j, 0, hei, minY, maxY)
cnt = 0;za = a;zb = b
而(問& lt;maxIterations)
as = a * a - b * b;b = 2 * a * b
a = za + as;b = zb + bs
如果數學。abs(a) +數學。abs(b)16然後斷開
cnt = cnt + 1
結束
如果cnt== maxIterations那麼clr=0
其他clr = remap(cnt, 0, maxiteration, 0, 255)
結束
pts[1] = {i, j, clr, clr, 0, 255}
love.graphics。點(分)
結束
結束
結束
startFractal()函數
love.graphics。setCanvas(畫布);love.graphics.clear ()
love.graphics。setColor(255 255 255)
drawMandelbrot ();love.graphics.setCanvas ()
結束
love.load()函數
wid, hei = love.graphics.getWidth(), love.graphics.getHeight()
帆布= love.graphics。newCanvas(wid, hei)
startFractal ()
結束
函數的愛。mousepressed(x, y, button, istouch)
如果button == 1,則
startDrag = true;混合= x;miY = y
其他的
風騷女子= -2.5;maxX = 2.5;如礦坑的=風騷女子;maxY = maxX的
startFractal ()
startDrag = false
結束
結束
函數的愛。鼠標滾屏(x, y,按鈕,istouch)
如果startDrag然後
當地l
如果x比;然後混合mxX = x
否則l = x;mxX =混合;混合= l
結束
如果y比;那麼mxY = y
否則l=y;mxY = miY;米= l
結束
混合=重新映射(混合,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)
風騷女子=混合;maxX = mxX;如礦坑的= miY;maxY = mxY
startFractal ()
結束
結束
love.draw()函數
love.graphics。畫(帆布)
結束
發邏
Pharo 是 Smalltalk 的現代變體,Smalltalk 是一種非常高效的面向對象編程語言。實際上,Smalltalk 是面向對象編程的典範,它幾乎啓發了地球上所有其他面向對象編程語言的靈感。最後,沒有一種語言比 Smalltalk 更適合面向對象編程了。
Pharo 還是世界上最簡單、最優雅的語言之一。你可以在 15 分鐘內學會 Smalltalk 的全部語法!
主要優點:它的工作效率非常高效,就像工作效率提高了 5 倍一樣!
主要缺點:掌握這種語言,需要一種不同的編程思維。但人們往往害怕改變。
分形樹示例代碼:
對象的子類:# FractalTree
instanceVariableNames:”
classVariableNames:“
poolDictionaries:“
類別:“RosettaCode”
" FractalTree類的方法"
樹:aPoint長度:aLength角度:anAngle
| p a |
(aLength比;10)ifTrue:(
p:=鋼筆新。
p。
p goto: a點。
p: anAngle。
p。
5 timesRepeat:(
圍棋:aLength / 5。
p圖n五。
]。
a:= anAngle - 30。
3 timesRepeat:(
自我樹:p位置長度:aLength * 0.7角度:a。
a:= a + 30。
]
]。
畫
顯示restoreAfter:(
顯示fillWhite。
自我樹:700@700長度:200角度:0。
]
“執行”
FractalTree新畫。
生鏽
Rust 因其內存安全特性:借位檢查器而得到了廣泛的認可。這個特性實際上消除了所有與內存相關的編程錯誤。Rust 保證了編程的安全性。
主要優點:它有助於使軟件更可靠。
主要缺點:這門語言很難學習,而且借位檢查器可能也很難理解。
曼德勃羅分形圖(Mandelbrot set)示例代碼:
外面的箱子形象;
外面的箱子num_complex;
使用std:: fs:文件;
使用num_complex::複雜;
fn main () {
令max_iteration = 256u16;
令img_side = 800u32;
令cxmin = -2f32;
令cxmax = 1f32;
令cymin = -1.5f32;
令cymax = 1.5f32;
令scalex = (cxmax - cxmin) / img_side = f32;
令scaley = (cymax - cymin) / img_side as f32;
//創建一個新的ImgBuf
設mut imgbuf = image::ImageBuffer::new(img_side, img_side);
//計算每個像素
for (x, y, pixel)在imgbu .enumerate_pixels_mut() {
設cx = cxmin + x = f32 * scalex;
令cy = cymin + y as f32 * scaley;
設c=complex::new (cx,cy);
設mut z= Complex::new (0f32,0f32);
令mut i = 0;
對於t在0。max_iterations {
唄2.0——
打破;
}
z = z + c;
我= t;
}
*pixel = image::luma ([i as u8]);
}
/ /保存圖片
let fout = &mut File::create("fractal.png").unwrap();
圖片::ImageLuma8 (imgbuf)。保存(輸出信號、圖像::PNG) .unwrap ();
}
打印稿
TypeScript 是 JavaScript……帶來了好處。它主要是添加了靜態類型。與 JavaScript 的兼容性使它成爲前端 Web 開發人員的最愛,因爲他們已經瞭解 JavaScript,而且幾乎不需要改變他們的工作流程。
主要優點:它就是 JavaScript,因此對 JavaScript 開發人員來說沒有什麼太大的變化。
主要缺點:它仍然是 JavaScript,所以仍然繼承了 JavaScript 的所有包袱。
分形樹示例代碼:
//搭建起畫板
var canvas: HTMLCanvasElement = document.createElement('canvas')
畫布。寬度= 600
畫布。身高= 500
document.body.appendChild(帆布)
var ctx: CanvasRenderingContext2D = canvas.getContext('2d')
ctx。fillStyle = ' # 000 '
ctx。線寬= 1
/ /不變
數字=數學。π/ 180.0
const totalDepth: number = 9
在畫布上畫一條線的輔助函數*/
函數繪製線(x1: number, y1: number, x2: number, y2: number): void
ctx。函數(x1, y1)
ctx。lineTo (x2, y2)
}
在給定的點和角度繪製一個分支,然後調用兩次*/
函數繪製樹(x1: number, y1: number,角度:number,深度:number): void
if (depth !== 0) {
設x2: number = x1 + (Math。cos(角度* degToRad) *深度* 10.0)
設y2: number = y1 + (Math)。sin(角度* degToRad) *深度* 10.0)
直線(x1, y1, x2, y2)
繪圖樹(x2, y2,角度- 20,深度- 1)
繪圖樹(x2, y2,角度+ 20,深度- 1)
}
}
//樹的實際繪製
ctx.beginPath ()
繪製樹(300,500,-90,總深度)
ctx.closePath ()
ctx.stroke ()
WebAssembly
WebAssembly 是一匹黑馬。在未來十年左右的時間裏,它可能會衍生出一系列的語言,這些語言有望最終登上榜首。WebAssembly 只是一個編譯目標,但沒有理由說它不能擴展到 Web 領域以外的地方。至於哪些基於 WebAssembly 的語言可以登上榜首?現在誰也說不準。
作者介紹
Richard Kenneth Eng,博主。Smalltalk 佈道師。退休的軟件工程師。《復仇者聯盟》粉絲。本文最初發表 Hacker Noon 博客,經原作者 Richard Kenneth Eng 授權,InfoQ 中文站翻譯並分享。
原文鏈接:https://hackernoon.com/programming-languages-of-the-future-b61332kd
相關閱讀:《Rust 是什麼,有哪些知名區塊鏈項目是用 Rust 開發的?》
來源鏈接:https://mp.weixin.qq.com/s/6XsH71CKaVikqnL6kVPqtg
歡迎加入律動 BlockBeats 官方社群:
Telegram 訂閱群:https://t.me/theblockbeats
Telegram 交流群:https://t.me/BlockBeats_App
Twitter 官方帳號:https://twitter.com/BlockBeatsAsia