පසුගිය මාස කිහිපය තුළ මම ක්රියාත්මක කිරීම් සඳහා Go භාවිත කළා.
දුර්වල ක්රමලේඛකයින් සඳහා නිර්මාණය කර තිබේද?
යන්න ඉගෙන ගැනීම ඉතා පහසුයි, කෙතරම් පහසුද යත්, හැඳින්වීම මට එක් සැන්දෑවක් ගෙන ගියේය, ඉන් පසුව මට දැනටමත් ඵලදායි ලෙස කේත කිරීමට හැකි විය. මම ඉස්සර Go ඉගෙන ගත්ත පොත තමයි කියන්නේ
Go හි සරල බව එහි විකුණුම් ලක්ෂ්යය බව Google ප්රකාශ කරන අතර භාෂාව විශාල කණ්ඩායම්වල උපරිම ඵලදායිතාව සඳහා නිර්මාණය කර ඇත, නමුත් මට එය සැකයි. නැතිවූ හෝ ඕනෑවට වඩා විස්තර සහිත විශේෂාංග තිබේ. එමෙන්ම සංවර්ධකයින් කෙරෙහි විශ්වාසයක් නොමැතිකම නිසා, ඔවුන්ට කිසිවක් නිවැරදිව කිරීමට නොහැකි යැයි උපකල්පනය කරමින්. සරලත්වය සඳහා වූ මෙම ආශාව භාෂාවේ නිර්මාණකරුවන් විසින් දැනුවත් තීරණයක් වූ අතර, එය අවශ්ය වූයේ මන්දැයි සම්පූර්ණයෙන් අවබෝධ කර ගැනීම සඳහා, සංවර්ධකයින්ගේ අභිප්රේරණය සහ ඔවුන් Go හි සාක්ෂාත් කර ගැනීමට උත්සාහ කළ දේ අප තේරුම් ගත යුතුය.
එසේනම් එය එතරම් සරල කළේ ඇයි? මෙන්න උපුටා දැක්වීම් කිහිපයක්
මෙහි ප්රධාන කරුණ නම් අපගේ ක්රමලේඛකයින් (ආසන්න වශයෙන්:
ගූගල් කරන්නන් ) පර්යේෂකයන් නොවේ. ඔවුන්, රීතියක් ලෙස, තරමක් තරුණ, ඉගෙනීමෙන් පසු අප වෙත පැමිණ, සමහර විට ඔවුන් Java, හෝ C/C++, හෝ Python ඉගෙන ගත්තා. එයාලට ලොකු භාෂාවක් තේරෙන්නේ නෑ, ඒත් එක්කම අපිට ඕනේ එයාලට හොඳ Software හදන්න. ඒ නිසා ඔවුන්ගේ භාෂාව ඔවුන්ට තේරුම් ගැනීමට සහ ඉගෙන ගැනීමට පහසු විය යුතුය.
ඔහු හුරුපුරුදු විය යුතුය, දළ වශයෙන් C ට සමාන ය. Google හි වැඩ කරන ක්රමලේඛකයින් ඔවුන්ගේ වෘත්තීය ජීවිතය කලින් ආරම්භ කරන අතර බොහෝ දුරට පරිපාටිමය භාෂා, විශේෂයෙන්ම C පවුල ගැන හුරුපුරුදුය. නව ක්රමලේඛන භාෂාවක ඉක්මන් ඵලදායිතාවයක් අවශ්ය වන්නේ භාෂාව ඉතා රැඩිකල් නොවිය යුතු බවයි.
කුමක් ද? ඉතින් Rob Pike මූලිකවම කියන්නේ Google එකේ developers ලා එච්චර හොඳ නෑ, ඒ නිසා තමයි ඔවුන් මෝඩයන්ට භාෂාවක් හැදුවේ (ආසන්න වශයෙන්: ගොළු විය) එවිට ඔවුන්ට යමක් කිරීමට හැකි වේ. ඔබේම සගයන් දෙස බලන්නේ කුමන ආකාරයේ උඩඟු බැල්මක්ද? Google හි සංවර්ධකයින් පෘථිවියේ දීප්තිමත්ම සහ හොඳම අයගෙන් තෝරාගෙන ඇති බව මම සැමවිටම විශ්වාස කරමි. නිසැකවම ඔවුන්ට වඩා දුෂ්කර දෙයක් හැසිරවිය හැකිද?
අධික සරලත්වයේ කෞතුක වස්තු
සරල වීම ඕනෑම නිර්මාණයක වටිනා ඉලක්කයක් වන අතර සරල දෙයක් කිරීමට උත්සාහ කිරීම අපහසුය. කෙසේ වෙතත්, සංකීර්ණ ගැටළු විසඳීමට (හෝ ප්රකාශ කිරීමට පවා) උත්සාහ කරන විට, සමහර විට සංකීර්ණ මෙවලමක් අවශ්ය වේ. සංකීර්ණත්වය සහ සංකීර්ණත්වය ක්රමලේඛන භාෂාවක හොඳම ලක්ෂණ නොවේ, නමුත් භාෂාවකට පහසුවෙන් තේරුම් ගැනීමට සහ භාවිතා කිරීමට හැකි අලංකාර වියුක්තයන් නිර්මාණය කළ හැකි සතුටු මාධ්යයක් තිබේ.
ඉතා ප්රකාශිත නොවේ
සරල බව සඳහා ඇති ආශාව නිසා, වෙනත් භාෂාවල ස්වභාවික දෙයක් ලෙස සැලකෙන නිර්මිතයන් Go හි නොමැත. මෙය මුලින් හොඳ අදහසක් ලෙස පෙනුනද, ප්රායෝගිකව එය වාචික කේතයක් ඇති කරයි. මෙයට හේතුව පැහැදිලි විය යුතුය - සංවර්ධකයින්ට වෙනත් පුද්ගලයින්ගේ කේතය කියවීමට පහසු විය යුතුය, නමුත් ඇත්ත වශයෙන්ම මෙම සරල කිරීම් කියවීමේ හැකියාවට හානි කරයි. Go හි කෙටි යෙදුම් නොමැත: එක්කෝ ගොඩක් හෝ කිසිවක් නැත.
උදාහරණයක් ලෙස, stdin කියවන කොන්සෝල උපයෝගිතා හෝ විධාන රේඛා තර්ක වලින් ගොනුවක් මේ ආකාරයෙන් පෙනෙනු ඇත:
package main
import (
"bufio"
"flag"
"fmt"
"log"
"os"
)
func main() {
flag.Parse()
flags := flag.Args()
var text string
var scanner *bufio.Scanner
var err error
if len(flags) > 0 {
file, err := os.Open(flags[0])
if err != nil {
log.Fatal(err)
}
scanner = bufio.NewScanner(file)
} else {
scanner = bufio.NewScanner(os.Stdin)
}
for scanner.Scan() {
text += scanner.Text()
}
err = scanner.Err()
if err != nil {
log.Fatal(err)
}
fmt.Println(text)
}
මෙම කේතය ද හැකිතාක් සාමාන්ය වීමට උත්සාහ කළද, Go හි බලහත්කාරයෙන් වාචිකත්වය බාධාවක් වන අතර, එහි ප්රතිඵලයක් වශයෙන්, සරල ගැටළුවක් විසඳීමෙන් විශාල කේත ප්රමාණයක් ලැබේ.
මෙන්න, උදාහරණයක් ලෙස, එකම ගැටලුවට විසඳුමක්
import std.stdio, std.array, std.conv;
void main(string[] args)
{
try
{
auto source = args.length > 1 ? File(args[1], "r") : stdin;
auto text = source.byLine.join.to!(string);
writeln(text);
}
catch (Exception ex)
{
writeln(ex.msg);
}
}
දැන් වැඩිපුර කියවිය හැක්කේ කාටද? මම මගේ ඡන්දය D ට දෙන්නම්. ඔහු ක්රියාවන් වඩාත් පැහැදිලිව විස්තර කරන බැවින් ඔහුගේ කේතය බොහෝ සෙයින් කියවිය හැකිය. D වඩාත් සංකීර්ණ සංකල්ප භාවිතා කරයි (ආසන්න වශයෙන්:
කොපි කරන මගුලක්
Go වැඩිදියුණු කිරීම සඳහා ජනප්රිය යෝජනාවක් වන්නේ සාමාන්යභාවයයි. මෙය අවම වශයෙන් සියලුම දත්ත වර්ග සඳහා සහය දැක්වීම සඳහා අනවශ්ය ලෙස කේත පිටපත් කිරීම වැළැක්වීමට උපකාරී වේ. උදාහරණයක් ලෙස, නිඛිල ලැයිස්තුවක් සාරාංශ කිරීම සඳහා වන ශ්රිතයක් එක් එක් නිඛිල වර්ගය සඳහා එහි මූලික ශ්රිතය පිටපත් කිරීම හැර වෙනත් ආකාරයකින් ක්රියාත්මක කළ නොහැක; වෙනත් ක්රමයක් නොමැත:
package main
import "fmt"
func int64Sum(list []int64) (uint64) {
var result int64 = 0
for x := 0; x < len(list); x++ {
result += list[x]
}
return uint64(result)
}
func int32Sum(list []int32) (uint64) {
var result int32 = 0
for x := 0; x < len(list); x++ {
result += list[x]
}
return uint64(result)
}
func int16Sum(list []int16) (uint64) {
var result int16 = 0
for x := 0; x < len(list); x++ {
result += list[x]
}
return uint64(result)
}
func int8Sum(list []int8) (uint64) {
var result int8 = 0
for x := 0; x < len(list); x++ {
result += list[x]
}
return uint64(result)
}
func main() {
list8 := []int8 {1, 2, 3, 4, 5}
list16 := []int16{1, 2, 3, 4, 5}
list32 := []int32{1, 2, 3, 4, 5}
list64 := []int64{1, 2, 3, 4, 5}
fmt.Println(int8Sum(list8))
fmt.Println(int16Sum(list16))
fmt.Println(int32Sum(list32))
fmt.Println(int64Sum(list64))
}
තවද මෙම උදාහරණය අත්සන් කළ වර්ග සඳහා පවා ක්රියා නොකරයි. මෙම ප්රවේශය ඔබ නැවත නොකිරීමේ මූලධර්මය සම්පූර්ණයෙන්ම උල්ලංඝනය කරයි (
D හි එකම උදාහරණය:
import std.stdio;
import std.algorithm;
void main(string[] args)
{
[1, 2, 3, 4, 5].reduce!((a, b) => a + b).writeln;
}
සරල, අලංකාර සහ කෙලින්ම කාරණයට. මෙහි භාවිතා වන කාර්යය වේ reduce
අච්චු වර්ගය සහ පුරෝකථනය සඳහා. ඔව්, මෙය නැවතත් Go අනුවාදයට වඩා සංකීර්ණයි, නමුත් ස්මාර්ට් ක්රමලේඛකයින්ට තේරුම් ගැනීම එතරම් අපහසු නොවේ. නඩත්තු කිරීමට පහසු සහ කියවීමට පහසු උදාහරණය කුමක්ද?
සරල ආකාරයේ පද්ධති බයිපාස්
මම හිතන්නේ මේක කියවන Go programmers කටින් පෙණ දමමින්, “ඔයා කරන්නේ වැරදියි!” කියා කෑගසයි. හොඳයි, සාමාන්ය ශ්රිතයක් සහ වර්ග සෑදීමට තවත් ක්රමයක් තිබේ, නමුත් එය ටයිප් පද්ධතිය සම්පූර්ණයෙන්ම බිඳ දමයි!
ගැටලුව විසඳා ගැනීමට මෝඩ භාෂා විසඳුමක් පිළිබඳ මෙම උදාහරණය බලන්න:
package main
import "fmt"
import "reflect"
func Reduce(in interface{}, memo interface{}, fn func(interface{}, interface{}) interface{}) interface{} {
val := reflect.ValueOf(in)
for i := 0; i < val.Len(); i++ {
memo = fn(val.Index(i).Interface(), memo)
}
return memo
}
func main() {
list := []int{1, 2, 3, 4, 5}
result := Reduce(list, 0, func(val interface{}, memo interface{}) interface{} {
return memo.(int) + val.(int)
})
fmt.Println(result)
}
මෙම ක්රියාත්මක කිරීම Reduce
ලිපියෙන් ණයට ගන්නා ලදී interface{}
- විහිළුවක්, සහ භාෂාවෙන් එය අවශ්ය වන්නේ ටයිප් කිරීම මග හැරීමට පමණි. මෙය හිස් අතුරු මුහුණතක් වන අතර සියලු වර්ගයන් එය ක්රියාත්මක කරයි, සෑම කෙනෙකුටම සම්පූර්ණ නිදහස ලබා දෙයි. මෙම ක්රමලේඛන විලාසය දරුණු ලෙස කැතයි, එපමණක් නොවේ. මෙවැනි ඇක්රොබැටික් ක්රියා සඳහා ධාවන කාල පරාවර්තනය භාවිතා කිරීම අවශ්ය වේ. රොබ් පයික් පවා ඔහුගේ වාර්තාවක සඳහන් කළ පරිදි මෙය අනිසි ලෙස භාවිතා කරන පුද්ගලයින්ට කැමති නැත.
මෙය ප්රවේශමෙන් භාවිතා කළ යුතු ප්රබල මෙවලමකි. දැඩි ලෙස අවශ්ය නම් මිස එය වළක්වා ගත යුතුය.
මම මේ විකාර වෙනුවට D සැකිලි ගන්නම්. කවුරුහරි එහෙම කියන්නේ කොහොමද interface{}
වඩා කියවිය හැකි හෝ ආරක්ෂිත ටයිප් කරන්නද?
යැපුම් කළමනාකරණයේ දුක්ඛිත තත්වයන්
Go සතුව ජනප්රිය සත්කාරක සපයන්නන් මත ගොඩනගා ඇති පරායත්ත පද්ධතියක් ඇත
මෙම ගැටලුවට විසඳුමක් ගැන ප්රශ්න ඇසීමෙන් පසුව, Go සංවර්ධන කණ්ඩායම නිර්මාණය කළේය
Xi වෙතින් සංස්කෘතික ගමන් මලු
මගේ මතය අනුව, Go වර්ධනය කර ඇත්තේ ඔවුන්ගේ ජීවිත කාලය පුරාම C භාවිතා කළ අය සහ අලුත් දෙයක් උත්සාහ කිරීමට අකමැති අය විසිනි. භාෂාව අමතර රෝද සහිත C ලෙස විස්තර කළ හැක(මුල්.:
තවත් ප්රශ්නයක් වන්නේ Go යනු ක්රියා පටිපාටි භාෂාවක් වීමයි (C හි නිහඬ භීෂණය වැනි). ඔබ කේත ලිවීම අවසන් කරන්නේ පෞරාණික සහ යල් පැන ගිය බවක් හැඟෙන ක්රියා පටිපාටි ශෛලියකින්. වස්තු නැඹුරු ක්රමලේඛනය රිදී උණ්ඩයක් නොවන බව මම දනිමි, නමුත් විස්තර වර්ග වලට සාරාංශ කර සංග්රහයක් ලබා දීමට හැකි නම් එය ඉතා හොඳ වනු ඇත.
ඔබේම ප්රයෝජනය සඳහා සරල බව
Go නිර්මාණය කර ඇත්තේ සරල ලෙස වන අතර එය එම ඉලක්කයට සාර්ථක වේ. එය ලියා ඇත්තේ දුර්වල ක්රමලේඛකයින් සඳහා පැරණි භාෂාවක් අච්චුවක් ලෙස භාවිතා කරමිනි. එය සරල දේවල් කිරීමට සරල මෙවලම් සමඟ සම්පුර්ණ වේ. එය කියවීමට පහසු සහ භාවිතා කිරීමට පහසුය.
එය අතිශයින්ම වාචික, සිත් ඇදගන්නාසුළු නොවන අතර දක්ෂ ක්රමලේඛකයින්ට නරක ය.
ස්තුතියි
මූලාශ්රය: www.habr.com