เชฎเซ‡เชถ เชเช• เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชฟเช‚เช— เชฒเซ‡เช‚เช—เซเชตเซ‡เชœ เช›เซ‡ เชœเซ‡ เชชเซ‹เชคเซ‡ เช•เชฎเซเชชเชพเชˆเชฒ เช•เชฐเซ‡ เช›เซ‡.

เชฎเซ‡เชถ เชเช• เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชฟเช‚เช— เชฒเซ‡เช‚เช—เซเชตเซ‡เชœ เช›เซ‡ เชœเซ‡ เชชเซ‹เชคเซ‡ เช•เชฎเซเชชเชพเชˆเชฒ เช•เชฐเซ‡ เช›เซ‡.

เชจเชตเชพ เชตเชฐเซเชท 2020 เชจเซ€ เชธเซŒเชจเซ‡ เชถเซเชญเซ‡เชšเซเช›เชพเช“.

เชชเซเชฐเชฅเชฎ เชจเชพ เชชเซเชฐเช•เชพเชถเชจ เชฅเซ€ เชชเซ‹เชธเซเชŸ เชฎเซ‡เชถเชจเซ‡ เชฒเช—เชญเช— เชฌเชฐเชพเชฌเชฐ 1 เชตเชฐเซเชท เชตเซ€เชคเซ€ เช—เชฏเซเช‚ เช›เซ‡.

เช† เชตเชฐเซเชท เชฆเชฐเชฎเชฟเชฏเชพเชจ, เชญเชพเชทเชพเชฎเชพเช‚ เช˜เชฃเซ‹ เชธเซเชงเชพเชฐเซ‹ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซ‹ เช›เซ‡, เชคเซ‡เชจเชพ เช˜เชฃเชพ เชชเชพเชธเชพเช“ เชชเชฐ เชตเชฟเชšเชพเชฐ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซ‹ เช›เซ‡ เช…เชจเซ‡ เชตเชฟเช•เชพเชธ เชตเซ‡เช•เซเชŸเชฐ เชจเช•เซเช•เซ€ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซ‹ เช›เซ‡.

เชœเซ‡ เชคเชฎเชพเชฎ เชธเชฎเซเชฆเชพเชฏ เชธเชพเชฅเซ‡ เชถเซ‡เชฐ เช•เชฐเชตเชพเชฎเชพเช‚ เชฎเชจเซ‡ เช†เชจเช‚เชฆ เชฅเชพเชฏ เช›เซ‡.

เชœเชตเชพเชฌเชฆเชพเชฐเซ€เชจเซ‹ เช‡เชจเช•เชพเชฐ

เช† เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ เชซเช•เซเชค เช‰เชคเซเชธเชพเชน เชชเชฐ เชตเชฟเช•เชธเชพเชตเชตเชพเชฎเชพเช‚ เช†เชตเซ€ เชฐเชนเซเชฏเซ‹ เช›เซ‡ เช…เชจเซ‡ เช—เชคเชฟเชถเซ€เชฒ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชฟเช‚เช— เชญเชพเชทเชพเช“เชจเชพ เช•เซเชทเซ‡เชคเซเชฐเชฎเชพเช‚ เชตเชฟเชถเซเชตเชจเชพ เชตเชฐเซเชšเชธเซเชตเชจเซ‹ เชกเซ‹เชณ เช•เชฐเชคเซ‹ เชจเชฅเซ€!

เชคเชฎเชพเชฐเซ‡ เช† เชตเชฟเช•เชพเชธเชจเซ‡ เชเช• เชงเซ‹เชฐเชฃ เชคเชฐเซ€เช•เซ‡ เชงเซเชฏเชพเชจเชฎเชพเช‚ เชฒเซ‡เชตเซเช‚ เชœเซ‹เชˆเช เชจเชนเซ€เช‚ เช•เซ‡ เชœเซ‡เชจเชพ เชฎเชพเชŸเซ‡ เชคเชฎเชพเชฐเซ‡ เชชเซเชฐเชฏเชคเซเชจ เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡, เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ เช†เชฆเชฐเซเชถ เชจเชฅเซ€, เชชเชฐเช‚เชคเซ เชคเซ‡เชฎ เช›เชคเชพเช‚ เชคเซ‡ เชตเชฟเช•เชพเชธ เชชเชพเชฎเซ‡ เช›เซ‡.

GitHub
เชตเซ‡เชฌเชธเชพเช‡เชŸ
เชซเซ‹เชฐเชฎ

เชจเชตเซเช‚ เช•เชฎเซเชชเชพเชˆเชฒเชฐ

เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ เชฐเซ€เชชเซ‹เชเซ€เชŸเชฐเซ€เชจเซ€ /mashc เชถเชพเช–เชพเชฎเชพเช‚, เชคเชฎเซ‡ เช•เชฎเซเชชเชพเชˆเชฒเชฐเชจเซเช‚ เชจเชตเซเช‚ เชธเช‚เชธเซเช•เชฐเชฃ เชœเซ‹เชˆ เชถเช•เซ‹ เช›เซ‹, เชœเซ‡ Mash (เชญเชพเชทเชพเชจเซเช‚ เชชเซเชฐเชฅเชฎ เชธเช‚เชธเซเช•เชฐเชฃ) เชฎเชพเช‚ เชฒเช–เซ‡เชฒเซเช‚ เช›เซ‡.

เช•เชฎเซเชชเชพเช‡เชฒเชฐ เชชเชพเชธเซ‡ asm เชธเซ‚เชšเชฟเชฎเชพเช‚ เช•เซ‹เชก เชœเชจเชฐเซ‡เชŸเชฐ เช›เซ‡ (เชธเซเชŸเซ‡เช• VM เชนเซ‡เช เชณ เชเชธเซ‡เชฎเซเชฌเชฒเชฐ เชฎเชพเชŸเซ‡).
เช† เช•เซเชทเชฃเซ‡ เชนเซเช‚ Java (JDK 1.8) เชฎเชพเชŸเซ‡ เชœเชจเชฐเซ‡เชŸเชฐเชจเซเช‚ เชธเช‚เชธเซเช•เชฐเชฃ เชตเชฟเช•เชธเชพเชตเซ€ เชฐเชนเซเชฏเซ‹ เช›เซเช‚.

เช•เชฎเซเชชเชพเช‡เชฒเชฐเชจเซเช‚ เชจเชตเซเช‚ เชธเช‚เชธเซเช•เชฐเชฃ เชญเชพเชทเชพเชจเชพ เชชเซเชฐเชฅเชฎ เชธเช‚เชธเซเช•เชฐเชฃเชจเซ€ เช•เชพเชฐเซเชฏเช•เซเชทเชฎเชคเชพเชจเซ‡ เชธเช‚เชชเซ‚เชฐเซเชฃเชชเชฃเซ‡ เชธเชฎเชฐเซเชฅเชจ เช†เชชเซ‡ เช›เซ‡ เช…เชจเซ‡ เชคเซ‡เชจเซ‡ เชชเซ‚เชฐเช• เชฌเชจเชพเชตเซ‡ เช›เซ‡.

เชจเชตเซเช‚ OOP

เชญเชพเชทเชพเชจเชพ เชจเชตเชพ เชธเช‚เชธเซเช•เชฐเชฃเชฎเชพเช‚, เชตเชฐเซเช—เซ‹ เชธเชพเชฅเซ‡เชจเชพ เช•เชพเชฐเซเชฏเชจเซ‡ เช•เช‚เชˆเช• เช…เช‚เชถเซ‡ เชซเชฐเซ€เชฅเซ€ เชกเชฟเชเชพเช‡เชจ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซเช‚ เช›เซ‡.
เชตเชฐเซเช— เชชเชฆเซเชงเชคเชฟเช“ เชตเชฐเซเช—เชจเชพ เชฎเซเช–เซเชฏ เชญเชพเช—เชฎเชพเช‚ เช…เชจเซ‡ เชคเซ‡เชจเซ€ เชฌเชนเชพเชฐ เชฌเช‚เชจเซ‡ เชฐเซ€เชคเซ‡ เชœเชพเชนเซ‡เชฐ เช•เชฐเซ€ เชถเช•เชพเชฏ เช›เซ‡.
เชตเชฐเซเช—เชฎเชพเช‚ เชนเชตเซ‡ เชธเซเชชเชทเซเชŸ เช•เชจเซเชธเซเชŸเซเชฐเช•เซเชŸเชฐ เช›เซ‡: init.

เช•เซ‹เชก เช‰เชฆเชพเชนเชฐเชฃ:

...
class MyClass:
  private:
    var a, b

  public:
    init(a, b):
      $a ?= a
      $b ?= b
    end

    func Foo():
      return $a + $b   
    end
end

func MyClass::Bar(c):
  return $a + $b + c
end
...

เชœเซ‹ เชตเชพเชฐเชธเซ‹ เชฎเชณเซ‡, เชคเซ‹ เช…เชฎเชพเชฐเซ€ เชชเชพเชธเซ‡ เชตเชพเชฐเชธเชพเช—เชค เช•เซ‰เชฒเซเชธ (เชธเซเชชเชฐ) เชธเชฐเชณเชคเชพเชฅเซ€ เช•เชฐเชตเชพเชจเซ€ เช•เซเชทเชฎเชคเชพ เช›เซ‡.

เช•เซ‹เชก เช‰เชฆเชพเชนเชฐเชฃ:

...
class MySecondClass(MyClass):
  public:
    var c

    init(a, b, c):
      super(a, b)
      $c ?= c
    end

    func Bar():
      super($c)  
    end
end
...

x ?= new MySecondClass(10, 20, 30)
println( x -> Bar() )     // 60

เชตเชฐเซเช—เชจเชพ เชฆเชพเช–เชฒเชพเช“ เชฎเชพเชŸเซ‡ เชชเชฆเซเชงเชคเชฟเช“เชจเซเช‚ เช—เชคเชฟเชถเซ€เชฒ เช“เชตเชฐเชฐเชพเช‡เชกเชฟเช‚เช—:

...
func Polymorph::NewFoo(c):
  return $a + $b + c  
end
...
x -> Foo ?= Polymorph -> NewFoo
x -> Foo(30)    // 60

เชชเซ‡เช•เซ‡เชœเซ‹ / เชจเซ‡เชฎเชธเซเชชเซ‡เชธ

เชจเซ‡เชฎเชธเซเชชเซ‡เชธ เชธเซเชตเชšเซเช› เชฐเชนเซ‡เชตเซ€ เชœเซ‹เชˆเช!
เชคเชฆเชจเซเชธเชพเชฐ, เชญเชพเชทเชพเช เช† เชคเช• เชชเซ‚เชฐเซ€ เชชเชพเชกเชตเซ€ เชœเซ‹เชˆเช.
Mash เชฎเชพเช‚, เชœเซ‹ เชตเชฐเซเช— เชชเชฆเซเชงเชคเชฟ เชธเซเชฅเชฟเชฐ เชนเซ‹เชฏ, เชคเซ‹ เชคเซ‡เชจเซ‡ เช•เซ‹เชกเชจเชพ เช•เซ‹เชˆเชชเชฃ เชญเชพเช—เชฎเชพเช‚เชฅเซ€ เชธเซเชฐเช•เซเชทเชฟเชค เชฐเซ€เชคเซ‡ เช•เซ‰เชฒ เช•เชฐเซ€ เชถเช•เชพเชฏ เช›เซ‡.

เช‰เชฆเชพเชนเชฐเชฃ:

...
class MyPackage:
  func MyFunc(a, b):
    return a + b  
  end
end
...
println( MyPackage -> MyFunc(10, 20) )    // 30

เชฎเชพเชฐเซเช— เชฆเซเชตเชพเชฐเชพ, เชธเซเชชเชฐ เช“เชชเชฐเซ‡เชŸเชฐ เช†เชตเชพ เช•เซ‰เชฒ เชธเชพเชฅเซ‡ เชฏเซ‹เช—เซเชฏ เชฐเซ€เชคเซ‡ เช•เชพเชฐเซเชฏ เช•เชฐเชถเซ‡.

เช…เชชเชตเชพเชฆเซ‹

เชญเชพเชทเชพเชจเชพ เชจเชตเชพ เชธเช‚เชธเซเช•เชฐเชฃเชฎเชพเช‚, เชคเซ‡เช“เชจเซ‡ เชตเชฐเซเช—เซ‹เชจเซ€ เชœเซ‡เชฎ เช—เชฃเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡:

...
try:
  raise new Exception(
    "My raised exception!"
  )
catch E:
  if E is Exception:
    println(E)
  else:
    println("Unknown exception class!")
  end
end
...

เชจเชตเซเช‚ enum

เชนเชตเซ‡ เช—เชฃเชคเชฐเซ€เชจเชพ เช˜เชŸเช•เซ‹เชจเซ‡ เชธเชคเชค เชฎเซ‚เชฒเซเชฏเซ‹ เช…เชธเชพเช‡เชจ เช•เชฐเซ€ เชถเช•เชพเชฏ เช›เซ‡:

enum MyEnum [
  meFirst = "First",
  meSecond = 2,
  meThird
]
...
k ?= meSecond
...
if k in MyEnum:
  ...
end

เชเชฎเซเชฌเซ‡เชกเซ‡เชก PL

เชธเช‚เชญเชตเชฟเชค เชฐเซ€เชคเซ‡ - เชฎเซ‡เชถ เชฒเซเช†เชจเซ€ เชœเซ‡เชฎ เชเชฎเซเชฌเซ‡เชก เช•เชฐเซ€ เชถเช•เชพเชฏ เชคเซ‡เชตเซ€ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชฟเช‚เช— เชญเชพเชทเชพ เชคเชฐเซ€เช•เซ‡ เชคเซ‡เชจเซเช‚ เชตเชฟเชถเชฟเชทเซเชŸ เชธเซเชฅเชพเชจ เชถเซ‹เชงเซ€ เชถเช•เซ‡ เช›เซ‡.

เช† เชนเซ‡เชคเซเช“ เชฎเชพเชŸเซ‡ เชฎเซ‡เชถเชจเซ‹ เช‰เชชเชฏเซ‹เช— เชถเชฐเซ‚ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡, เชคเชฎเชพเชฐเซ‡ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ เชœเชพเชคเซ‡ เชฌเชจเชพเชตเชตเชพเชจเซ€ เชชเชฃ เชœเชฐเซ‚เชฐ เชจเชฅเซ€.

Mash เชชเชพเชธเซ‡ เชฐเชจเชŸเชพเช‡เชฎ เชเชจเซเชตเชพเชฏเชฐเซเชจเชฎเซ‡เชจเซเชŸ เช›เซ‡ - เชธเช‚เชชเซ‚เชฐเซเชฃ API เชธเชพเชฅเซ‡ เชกเชพเชฏเชจเซ‡เชฎเชฟเช• เชฒเชพเช‡เชฌเซเชฐเซ‡เชฐเซ€ เชคเชฐเซ€เช•เซ‡ เชฌเชจเซ‡เชฒ เชธเซเชŸเซ‡เช• VM.

เชคเชฎเชพเชฐเซ‡ เชซเช•เซเชค เชคเซ‡เชจเซ‡ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ เชจเชฟเชฐเซเชญเชฐเชคเชพเชฎเชพเช‚ เช‰เชฎเซ‡เชฐเชตเชพเชจเซ€ เช…เชจเซ‡ เชฅเซ‹เชกเชพ เช•เซ‰เชฒเซเชธ เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡.

เชญเชพเชทเชพ เชชเซ‹เชคเซ‡ เชœ เชเชฎเซเชฌเซ‡เชกเซ‡เชก เชญเชพเชทเชพ เชคเชฐเซ€เช•เซ‡ เช•เชพเชฐเซเชฏ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เช•เชพเชฐเซเชฏเช•เซเชทเชฎเชคเชพ เชชเซเชฐเชฆเชพเชจ เช•เชฐเซ‡ เช›เซ‡.
เชคเซ‡ เชœ เชธเชฎเชฏเซ‡, เชญเชพเชทเชพ เช…เชจเซ‡ เชคเซƒเชคเซ€เชฏ-เชชเช•เซเชท เชชเซเชธเซเชคเช•เชพเชฒเชฏเซ‹ เชธเชพเชฅเซ‡ เชœเซ‹เชกเชพเชฃเชฎเชพเช‚ เช•เชพเชฎเช—เซ€เชฐเซ€เชจเซเช‚ เช‰เชฒเซเชฒเช‚เช˜เชจ เชฅเชคเซเช‚ เชจเชฅเซ€.
เช…เชฎเชจเซ‡ เชเชฎเซเชฌเซ‡เชกเซ‡เชฌเชฒ เชญเชพเชทเชพ เชฎเชณเซ‡ เช›เซ‡ เชœเซ‡ เชคเซ‡เชฎเชพเช‚ เชฒเช–เซ‡เชฒเชพ เชตเชฟเชตเชฟเชง เชซเซเชฐเซ‡เชฎเชตเชฐเซเช•เชจเซ€ เชธเช‚เชชเซ‚เชฐเซเชฃ เชถเช•เซเชคเชฟเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€ เชถเช•เซ‡ เช›เซ‡.

เชฎเซ‡เชถ + JVM

JVM เชฎเชพเชŸเซ‡ เช…เชจเซเชตเชพเชฆเช•เชจเซเช‚ เชธเช‚เชธเซเช•เชฐเชฃ เชตเชฟเช•เชธเชพเชตเชตเชพเชจเซเช‚ เชถเชฐเซ‚ เช•เชฐเซเชฏเซเช‚.
เช•เชฆเชพเชš, N-th เชธเชฎเชฏ เชชเช›เซ€, เช† เชตเชฟเชทเชฏ เชชเชฐเชจเซ€ เชชเซ‹เชธเซเชŸ Habrรฉ เชชเชฐ เชฆเซ‡เช–เชพเชถเซ‡.

เชชเชฐเชฟเชฃเชพเชฎเซ‹

เชคเซเชฏเชพเช‚ เช•เซ‹เชˆ เชšเซ‹เช•เซเช•เชธ เชชเชฐเชฟเชฃเชพเชฎเซ‹ เชจเชฅเซ€. เช† เชชเชฐเชฟเชฃเชพเชฎเซ‹เชจเซ€ เชฎเชงเซเชฏเชตเชฐเซเชคเซ€ เชฐเชœเซ‚เช†เชค เช›เซ‡.
2020 เชฎเชพเช‚ เชฆเชฐเซ‡เช•เชจเซ‡ เชถเซเชญเช•เชพเชฎเชจเชพเช“.

เชธเซ‹เชฐเซเชธ: www.habr.com

เชเช• เชŸเชฟเชชเซเชชเชฃเซ€ เช‰เชฎเซ‡เชฐเซ‹