بىلوگ يازمىسى ئارقىلىق ئۆزۈمنىڭ بىلگەنلىرىنى ۋە ھىس تۇيغۇلىرىمنى دوسلار بىلەن ئورتاقلىشالىغانلىقىمدىن خۇشالمەن،
يازما ھەققىدە
ئاپتورنىڭ تۆۋەن قاتلام پروگرامما تىللىرىدىن ئاساسلىقى C++ ئارقا كۆرۈنۈشى بار بولۇپ ئىلگىرى ئۈستەليۈزى (Qt بىلەن)، مىكرو كونتىروللىغۇچ ئۆزىكى (MCU ئاساسلىقى Avr, ARM32, Esp32) ۋە Linux embedded systems (Raspberry pi) قاتارلىقلارنى يازغان ۋە بىر قىسىم سىناق خارەكتىرلىك مۇلازىمىتىر پروگراممىلىرىنى C++ دا يېزىشنى سىناپ باققان.
ئاپتور C++ دىن Rust قا كۆچۈشنى قارار قىلىپ كۆچۈش سەپىرىدىن كىيىن مەلۇم يۇمشاق دېتال شىركىتىدە خىزمەت قىلىش جەريانىدا تەجرىبە خارەكتىرلىك يېڭىدىن لاھىيەلىگەن مۇلازىمىتىردا ئىجرا بولىدىغان Micro service ھەل قىلىش لاھىيەسىنىڭ يادرولۇق بىر بۆلىكىنى Rust پروگرامما تىلى بىلەن يېزىپ چىقىش جەريانىدىكى تەجرىبىلىرى ۋە ھىس تۇيغۇلىرىغا قوشۇلۇپ بۇ يىڭى پروگرامما تىلى ھەققىدە بىلىملەرنى ئورتاقلىشىشنى قارار قىلدى.
Rust دىگەن نىمە؟
Rust
بولسا Mozilla نىڭ FireFox تور كۆرگۈچى ئىنژىنىرلىرى ئۇزۇن يىل C++ يېزىش جەريانىدا C++ دا ساقلانغان ئىچكى ساقلىغۇچ بىخەتەرلىك مەسىلىلىرى ۋە ئۆزىنىڭ ئىددىيەلىرى، ھەل قىلىش لاھىيەلىرىنى بىرلەشتۈرۈپ لاھىيەلەپ چىققان يىڭى بىر ئەۋلاد سىستېما دەرىجىلىك پروگرامما تىلى،
پروگرامما تىللىرى ھەققىدە
ئاپتورنىڭ شەخسىي كۆز قارىشىچە پروگرامما تىللىرى بىر قانچە قاتلامغا بۆلۈنىدۇ، يەنى:
- تۆۋەن دەرىجىلىك پروگرامما تىلى (سىستېما دەرىجىلىك پروگرامما تىلىمۇ دىيىلىدۇ)
- يۇقىرى دەرىجىلىك پروگرامما تىللىرى
ئالدىنقىسىغا تەۋە پروگرامما تىللىرىدىن Assembler, C, C++, Rust, Swift, GoLang قاتارلىقلار بولۇپ ئاساسلىق ئەۋزەللىكى سۈرئىتى ئىنتايىن تىز، قاتتىق دېتال بايلىقىغا بولغان تەلىۋى ئىنتايىن تۆۋەن، تىرناقچىلىك كېلىدىغان مىكرو كونتىرول ئۆزىكىدىن باشلاپ نەچچە يۈزلىگەن CPU يادروسى بار غايەت زور مۇلازىمىتىرلارغىچە بىز ھەممە يەردىن، ھەر قانداق جايدىن بۇ پروگرامما تىللىرىنى تاپالايمىز، ئادەتتە بۇ پروگرامما تىللىرى بىلەن ئىجرا سۈرئىتى ۋە قاتتىق دېتال تەلىۋىگە ئالاھىدە تەلەپ قويىدىغان ساھەلەردە ئىشلىتىلىدۇ، مەسىلەن مەشغۇلات سىستېمىسى، ساندان، ئويۇن ماتورى، ئويۇن، گىرافىك رىندىرلاش ماتورلىرى، مىكرو كونتىرول ئۆزىكى (MCU) مەشغۇلات سىستېمىسىنىڭ قاتتىق دېتال قوزغاتقۇچلىرى ھەتتا GPU بىلەن ھېسابلاش قاتارلىقلار،
كىيىنكىسىگە تەۋە پروگرامما تىللىرىدىن C#, Java, Kotlin, Python, JavaScript, TypeScript, Dart, ھەپەپەپەفففف ۋە ئالدىنقى تۈرگە تەۋە بولمىغان ھەر قانداق پروگرامما تىللىرى بولۇپ ئۇلارنىڭ ئەۋزەللىكلىرى ئىنسان لوگىكىسىغا يىقىن، چۈشىنىشلىك، ئىلاستىكىلىق، چەكلىك ۋاقىت ئىچىدە يۇقارقى تۆۋەن قاتلام پروگرامما تىللىرىغا سىلىشتۇرغاندا خىزمەت ئۈنۈمى يۇقىرى بولۇش، قولايلىق بولۇش تەرەپلىرى بار بولۇپ ئاساسلىقى ئىجرا بولۇش تىزلىكى ۋە قاتتىق دېتال مەنبەسىگە نىسبەتەن ئالاھىدە تەلەپ بولمىغان مۇھىتلاردا ئىشلىتىلىدۇ، مەسىلەن مۇلازىمىتىر پروگراممىلىرى، ئويۇن (رىندىر ماتورى ئەمەس پەقەت لوگىكا قىسمى)، كومپىيۇتېر ۋە كۆچمە ئۈسكۈنىلەردىكى يۇمشاق دېتاللار، تور بەتلەر قاتارلىقلار،
C, C++ لار بولمامدۇ؟ زادى نەرىگە نىم بولدى بۇ تىللارنىڭ؟
قىسقا جاۋاب: بولىدۇ، تارىختىن بۇيان بۈگۈنگىچە مۇتلەق كۆپ سانلىق سىستېما دەرىجىلىك يۇمشاق دېتاللار C, C++ دا يېزىلىپ كەلگەن، مەسىلەن Linux, Windows دىگەنلەر C, C++ لار بىلەن ۋۇجۇدقا چىققان (ئاستىدىكى ئاز بىر قىسىم ئاسسىمبىلىر كودلىرىنى نەزەردىن ساقىت قىلىشقا بولىدۇ)، يەنە سىلەر بىز ئىشلىتىدىغان داڭلىق ساندان سىستېمىلىرى (مەسىلەن MySql, Sqlite, MariaDb, Postgrees, MongoDb, Redis, ArangoDb, LevelDb, InfluxDb.... ھەپەپەپەپپپپپپ قاتارلىقلار)،
ئاندىن يەنە ئويۇن ماتورلىرى،
OpenGl, Vulkan قاتارلىق تۆەن قاتلام 3D Development api لار
مىكرو كونتىرول ئۆزىكى (MCU) غا پروگرامما يېزىش
مۇنداقلا دەي، ئەگەر C, C++ مەۋجۇت بولمىسا سىز بىلەن مەن ياشاۋاتقان بۇ دۇنيا بۈگۈنكىدەك بولالىشى ناتايىن ئىدى،
C, C++ نىڭ قولى يەتمەيدىغان ھەر قانداق بىر بۇلۇڭ پۇچقاق يوق، ھەتتا تور كۆرگۈچنىڭ ئىچىگىچە.
مەشغۇلات سىستېمىسى C, C++ قاتارلىق تۆۋەن قاتلام پروگرامما تىللىرىدا يېزىلغاندىن كىيىن مۇناسىۋەتلىك I/O مەشغۇلاتلار ئۈچۈن پروگراممىرلارغا C دا Api تەمىنلەيدۇ،
بىز تور، قاتتىق دىسكا، ۋە ھەر قانداق سىرتقى ئۈسكۈنىلەر بىلەن ئالاقە قىلماقچى بولساق پەقەت بىرلا تاللىشىمىز بار، ئۇ بولسىمۇ چوقۇم مەشغۇلات سىستېمىسى تەمىنلىگەن c api لار ئارقىلىق قىلىش
، مەيلى سىز GoLang ئىشلىتىڭ، مەيلى PYthon ۋە ياكى kolin/java, dart يېزىڭ، ۋە ياكى Android, Linux, macOS نىڭ ئۈستىدە پروگرامما يېزىڭ.
سىزنىڭ ئىككىنچى بىر تاللىشىڭىز يوق،
چۈنكى I/O مەشغۇلاتى (مەسىلەن تور، قاتتىق دىسكا مەشغۇلاتى، سىرتقى ئۈسكۈنىلەر بىلەن ئالاقە قىلىش) قاتارلىقلار پەقەت يۇمشاق دېتال بولغانغىلا پۈتمەيدۇ، سىز چوقۇم فىزىكىلىق قاتتىق دېتاللارنىڭ قوللىشىغا مۇھتاج، مەسىلەن تور كارتىسى، كۆكچىش مودۇلا، قاتتىق دىسكا ئۆزىكى...
پۈتۈن دۇنيادىكى قاتتىق دېتاللارنى ھەر قايسى شىركەتلەر ھەر خىل تېخنىكىدا ياسايدۇ، سىز ئۇلار بىلەن بىۋاستە ئالاقە قىلىش ئۈچۈن شۇ قاتتىق دېتالغا پىششىق بولىشىڭىز كىرەك، مەسىلەن ئىچكى تۈزۈلۈشى، خىزمەت پىرىنسىپى، رەقەملىك سىگنال بىلەن ئالاقە قىلغاندا توك يولىدىكى سىگناللارنىڭ كىلىشىمى دىگەندەك،
سىز بىر دانە مۇزىكا قويغۇچ ياسىماقچى بولسىڭىز مەشغۇلات سىستېمىسى سىزگە ۋايفاي بىلەن تور تەمىنلىمىسە، ياڭراتقۇ ۋە ھەر قايسى توك يوللىرى ئارقىلىق ئاۋازنىڭ قوللىشى بىلەن تەمىنلىمىسە سىز بۇلارنى ئىشلەتمەي تۇرۇپ ياسىيالامسىز؟
نىمە دىمەكچى دىگەندە سىز قاتتىق دېتاللار بىلەن ئالاقە قىلىش ئۈچۈن مەشغۇلات سىستېمىسىنىڭ قوللىشىغا مۇھتاج،
مەسىلەن Linux نىڭ يادروسىدا دۇنيادا ھازىرغىچىلىك بار بولغان دۇنيادىكى ھەممە ئۈسكۈنىلەرنىڭ قاتتىق دېتال قوزغىتىش پروگراممىلىرى بار، مەيلى ئۇ تور كارتىسى، ياكى بارماق دىسكا ۋە ياكى كامىرا بولسۇن.
مەسىلەن سىز ئەتىلىككە مۇلىكۇلا، ھۈجەيرىگە ئۇچۇر ساقلايدىغان بىر تېخنىكىنى كەشىپ قىلسىڭىز ئۆگۈنلۈككە سىز مۇشۇ يېڭى مۇلىكۇلا قاتتىق دىسكىڭىز بىلەن قانداق ئالاقە قىلىشنى قوزغىتىش پروگراممىسى شەكلىدە Linux foundation غا تەمىنلەيسىز، ئۇلار تەكشۈرۈپ تەستىقلىغاندىن كىيىن كىلەركى ئايلىق Linux kernel نىڭ يېڭىلانمىسىدا سىزنىڭ قاتتىق دىسكىڭىزنى قوللايدىغان بولىدۇ،
ئۇنداقتا مەسىلە چىقتى، سىز I/O مەشغۇلاتى قىلالمايدىغان، كونكىرىتراق دىگەندە تور، قاتتىق دىسكا بىلەن ئالاقە قىلىش، كونۇپكا تاختىسىنىمۇ ئوقۇش، ئىكرانغىمۇ بىر نېمە چىقىرالمايدىغان پروگرامما تىلىنى ئىشلىتەمسىز؟ سىز ھېسابلاپ چىققان نەتىجىنى بىلىشكىمۇ ئامالسىز قالسىڭىزچۇ؟ (چۈنكى Gpu بىلەن ئالاقە قىلىش مەلۇم مەنىدىن ئېيىتقاندا ئۇمۇ I/O غا تەۋە.)
This is meaningless right?
ئەگەر ھەر قانداق بىر پروگرامما تىلى C نى چاقىرالمايدىكەن ئۇنداقتا ئۇ پروگرامما تىلىنىڭ ئۆزىمۇ مەۋجۇت بولالمايدۇ،
بۇ دىگەنلىك ئاشۇ پروگرامما تىللىرى سىزگە ھەر قانداق I/O نى تەمىنلەش ئۈچۈن پەقەت بىردىنبىر تاللىشى مەشغۇلات سىستېمىسىنىڭ c api سىنى ئىشلىتىش كىرەك، شۇڭا بۈگۈنكى كۈندىكى بىز ئاڭلاپ باققان ھەممە پروگرامما تىللىرى دەل مەشغۇلات سىستېمىسىنىڭ c api سى ئارقىلىق ئۆزىنى ئەمەلگە ئاشۇرغان،
بۇ دىگەنلىك:
دۇنيادىكى ھەر قانداق پروگرامما تىلىدا C نى چاقىرغىلى بولىدۇ، بۇ زۆرۈرىيەت ئاشۇ پروگرامما تىللىرىنىڭ ئۆزىنىڭ ئىقتىدارىنى ئاشۇرۇشتىكى زۆرۈرىيەت.
بىز نۆۋەتتە C, C++ نىڭ نەقەدەر مۇھىملىقىنى تونۇپ يەتتۇق،
يادىڭىزدا بولسۇنكى C پروگرامما تىلى پەقەت ئۇ پروگرامما تىلىلا ئەمەس، ئۇ بىر ئۆلچەم.
ھەر قانداق پروگرامما تىللىرى باشقا پروگرامما تىللىرىغا ئۆزىنى چاقىرالايدىغان ئىقتىدار تەمىنلىمەكچى بولسا ئۆز ئارا ئالاقە قىلىش ئۈچۈن ئاۋال C abi بىلەن سىغىشىدىغان ھالەتكە كەلتۈرىلىدۇ، يەنى ئۆزىنى چوقۇم ئۆلچەملىك C پروگرامما تىلىنىڭ api سى ھالەتكە ئايلاندۇرۇشى كىرەك، ئاندىن باشقا پروگرامما تىللىرى FFi ۋە ياكى باشقا ۋاستىلەر ئارقىلىق بۇ پروگرامما تىلىنى چاقىرالايدۇ،
مەسىلەن سىز python بىلەن GoLang نى چاقىرماقچى بولسىڭىز ئاۋال GoLAng دا يېزىپ بولغان پروگراممىنى C دا چاقىرغىلى بولىدىغان ھالەتتە بىر دانە كۆۋرۈك ياسايسىز، ئاندىن python دا ffi شەكلىدە ئاشۇ يېزىپ قويغان golang نىڭ پروگراممىسىنى چاقىرىسىز،
سىز Java بىلەن C++ نى ياكى Rust نى ۋە ياكى GoLang نى چاقىرماقچى، Swift بىلەن koylin-native نى چاقىرماقچى، ھەممىسى ئوخشاش،
ئاۋال ئۇلار c api
غا ئايلاندۇرۇلىدۇ، ئاندىن باشقا تىللارغا تەمىنلىنىدۇ،
نېمىشقا بۇنداق بولىدىغىنى مەن بۈگۈنكى سۆلەيدىغان تېما بولمىغاچ ئۆتۈپ كېتىمىز،
ۋاي زادى C, C++ بولامدۇ بولمامدۇ؟
بولىدۇ، دەپ ئۆتكەندەك ئۇلار بولغاچ مەن بۇ خەتلەرنى يازالاۋاتىمەن (چۈنكى مەن ئەزەلدىن Linux نى كومپىيۇتېرىمدا ئاساسى سىستېما سۈپىتىدە ئىشلىتىمەن)
ئەمما لىكىن ۋە بىراق...
سىز تارىخقا نەزەر سېلىڭ، مەنمۇ بىلگىنىمنى دەپ بېرەي، مەن سىزگە كاپالەت بېرەي، ئەگەر سىز ئەزەلدىن C, C++ بىلەن ئۇچرىشىپ باقمىغان بولسىڭىز سىز چوقۇم ھەيران قالىسىز،
ئەمسە ھەيران قىلىش ئۈچۈن: بىر، ئىككى ئىككى... ئۈچ. كەتتۇق.
ئەگەر سىز Jvm دىن كەلگەن بولسىڭىز (مەسىلەن سىز Java, Kotlin پروگرامما تىللىرىنى يازىدىغان بولسىڭىز) Gradle بىلەن Maven نى بىلىسىز،
Node.js دىن كەلگەن بولسڭىز npm ناتونۇش ئەمەس،
GoLang -> GoModule
Dart/Flutter -> Pub
Swift -> CocoaPods
DotNet (C#) -> Nuget
Python -> Pip
Rust -> Cargo
ھەپەپەپەپ -> پەپەپەەپففف
ھەر قايسى پروگرامما تىللىرىنىڭ ئاساسەن دىگۈدەك ئىگە تەرەپ تەمىنلگەن بىرلا بوغچا باشقۇرغۇچ يەنى Package manager سى بار، پەقەت بىرلا Build system سى بار،
Project قۇرۇشنىڭ پەقەت بىرلا خىل ئۇسۇلى بار، پروگراممىنى بولاقلاشنىڭمۇ بىرلا ئۇسۇلى بار، باشقا ئۈچىنچى تەرەپنىڭ بوغچىلىرىمۇ ئىگە تەرەپنىڭ قوللىشى ئاستىدىكى بىرلا تور بەت بىلەن زىيارەت قىلغىلى، ئىشلەتكىلى بولىدۇ،
ئەڭ مۇھىمى پەقەتلا پەقەت بىرلا Compiler بار،
ھەي قاراڭ، سىز پروجىكىتنى ۋىندوۋستا بىر خىل، لىنۇكىستا يەنە بىر خىل قۇرمايسىز، سىزنىڭ كودىڭىز باشتىن ئاخىرى ئوخشاش،
ئەمما C, C++ لار ئۇنچە تەلەيلىك ئەمەس
بۇ پروگرامما تىللىرى بارلىققا كەلگەن دەسلەپكى ۋاقىتلاردا قانداق قىلسا ياخشى بولىدىغانلىقىنى ھىچكىممۇ بىلمەيتتى، بۇ پروگرامما تىللىرى ھەم ئوچۇق كودلۇق، بىكارلىق بولغاچقا كىملا ئۆزگەرتىۋالسا بولىۋېرەتتى، كىملا قانداق ئۆلچەم چىقىرىپ كىم قانداق تەرەققىي قىلدۇرىۋالسا بولاتتى،
شۇ سەۋەبلىك بۇ ئىككى پروگرامما تىللىرى ئوپىراتسىيە ئۈستىلىدىكى تەجرىبە بۇيۇمىغا ئايلىنىپ كەتتى،
دەرۋقە ھەر قايسى شىركەتلەر ئۆزى بىلگەنچە بۇ پروگرامما تىللىرىنى ئۆزگەرتىپ بېقىشتى، ھەر خىل ئۆزىگە خاس گىرامماتىكا قوشۇپ بېقىشتى، ھەر خىل Compiler لارنى ياساپ بېقىشتى،
ئەمما ئۇلار بىر-بېرىنىڭكىنى ئىتراپ قىلىشنى خالىمايتتى، ئۆزىمۇ باشقىلار قىلالىغاننى قىلالايدىغانلىقىنى ئىسپاتلاش ئۈچۈنمىكى تاڭ زورلاپ يەنە بىرنى قىلىپ باقمىسا ئۇنىمايتتى،
نەتىجىدە بىز C, C++ دەپ ئاڭلىغان بۇ پروگرامما تىلى پەقەت ئىككى بولسىمۇ ئەمما بۇ يەردە نەچچە ئونلىغان ھەر خىل تۇغۇندى، ئۆزگەرگەن، ھەر خىل ھەر ياڭزا غەلىتە مەخلۇق C, C++ لار مەيدانغا كەلدى،
بۇلار ئۈچۈنمۇ بىردىن غەلىتە مەخلۇق Compiler لار مەيدانغا كەلدى،
بۇ مەنزىرىنى مەن سىزگە تەسۋىرلەپ بېرەي،
سىزنىڭ يازغان بىر پروگراممىڭىز Linux, macOS دە Compile قىلىنغان بولسا windows دا Compile بولمايدۇ، سىزنىڭ كودلىرىڭىز Microsoft نىڭ msvc تەرىپىدىن خاتا دەپ قارىلىدۇ،
مەن ئاز بولسىمۇ ھازىر كاللامغا كەلگىنىنى ئوخشاش بىر C نىڭ microsoft visual c, apple c, gnu c, borland c, يەنە بىرنىمە بىرنىمە c..., apple objectv-c
visual c++, borland c++, gnu c++, intel c++,
جىق،
ئۇزۇن ژىللاردىن بۇيان تۈگەيدىغانلىرى تۈگەپ ھازىر قىلىپ قالغانلىرى بولسىمۇ يەنىلا بۇ يەردە ھەر خىل Compiler لار مەۋجۇت،
- Microsoft msvc (for windows)
- GNU Gcc (cross platform, for linux, android, macOS, windows)
- LLVM Clang (cross platform, for linux, android, macOS, windows)
- Apple CLang (for macOS, iOS and other apple platform/devices)
- WebAssembly compilers
يەنە بەزى مەخسۇس قاتتىق دېتاللار ئۈچۈن پەقەت مۇشۇ قاتتىق دېتالغىلا خاس، ئەمما باشقا ھىچنىمىگە ئوخشىمايدىغان نۇرغۇن Compiler لار بار، مەسىلەن
Esp32 نىڭ Xtensa.
بۇلارنىڭ بەزىلىرى سۇپا ھالقىغان، بەزىلىرى سۇپا ھالقىمىغان شەخسىيەتچى Compiler لار،
ئەمدى شۇنداق بولغانكەن سىز ئوخشاش بىر C, C++ دا پروگرامما يازماقچى بولسڭىز ھەر خىل مۇھىت، ھەر خىل مەشغۇلات سىستېمىلىرىدا ھەر خىل پروجىكىت قۇرۇشىڭىز كىرەك، مەسىلەن:
- Windows: Visual studio بىلەن
- Apple: Xcode بىلەن
- Linux: Gnu make بىلەن
- Android: Android MK بىلەن
- يەنە بەك جىق بەك جىق...
بۇ يەردە ھەر خىل مۇھىتلاردا ھەر خىل Build system مەۋجۇت، مەسىلەن:
- Gnu Make (Linux)
- Nmake (Windows)
- MsBuild (Windows)
- Cmake (Cross platform)
- QMake (For QT software development toolkit)
- ninja (Cross platform)
- meson (Cross platform)
- bazel (Cross platform)
- Gn (Cross platform but mainly used by google open source projects, for example: V8, Chromium, Skia etc.)
- Android mk (For android)
قاراڭ، بۇ يەردە سىزنىڭ يازىدىغان كودىڭىز ئەسلى بىر خىل، قىلىدىغان ئىشىڭىزمۇ ئوخشاش بىر خىل، ئەمما ئوخشاش ئىشنى ھەممە يەردە ھەر خىل قىلىشىڭىز كىرەك،
چۈنكى ھەر قايسى مەشغۇلات سىستېمىلىرىنىڭ ئىگىلىرى تەكەببۇرلۇق بىلەن بىر-بېرىنىڭ ئۇسلۇبىنى ئىتراپ قىلىشمايدۇ،
Cross compiling ئۇ بىر قارا چۈش،
يەنە بىرگە C++ ھەر يېلى ئۆزىدە نۇرغۇن ئەخلەتكە ئوخشايدىغان لاۋزا بىر يۈرۈش ئىقتىدارلارنى توختىماي بارلىققا كەلتۈرۈپ تۇرىدۇ،
بۇ تىلنىڭ ئۆزىنىڭ مۇرەككەپلىكىنى دىمەيلا تۇرايلى، يەنە ھەر يىلى نۇرغۇن مۇرەككەپلىك ئېلىپ كېلىپ بېرىدۇ، توختىماي ھالقىلىق سۆز، گىرامماتىكىلار قوشۇلىدۇ، ھەر قوشۇلۇشتا سىز قىلالمايدىغان، ئەمما پروگرامما تىلى ياسىغۇچىلار قىلالايدىغان ھەر خىل سىھرىگەر نەرسىلەر مەيدانغا كېلىدۇ (مەسىلەن std::move) ئادەمنى ھەقىقەتەن بىزار قىلىدۇ،
بۇ تىل ئاخىرىدا غايەت زور ئۆگىنىپ تۈگەتكىلى بولمايدىغان، بىر ئىشنى قىلىشنىڭ ئالتە خىل ئۇسۇلى بار بىر نەرسىگە ئايلىنىدۇ،
ھازىرمۇ توختىماي ھەر يىلى يېڭى نەرسىلەر قوشۇلىۋاتىدۇ،
مەسىلەن ھەي ئويلاپ بېقىڭ، C++ دا تىپ ئايلاندۇرۇشنىڭ 6 خىل ئۇسۇلى بار،
سىز چوقۇم مۇشۇ 6 خىل تىىپ ئايلاندۇرۇش ئۇسۇلىنىڭ ھەممىنى ئۆگىنىشىڭىز كىرەك ئاندىن ئۆزىڭىز ئەمەلىي ئىشلەتكەندە ئۆزىڭىز بىلىپ ماس كېلىدۇ دەپ قارىغىنىڭىزنى ئىشلىتىشىڭىز كىرەك، نېمىشقا ئالتە؟ ئەمەلىيەتتە بىرسى بولسىلا بولاتتىغۇ؟
ئەڭ مۇھىم يەنە بىر مەسىلە: ئۈچىنچى تەرەپ ئامبار، بوغچىلارنى تەمىنلەيدىغان ئىشەنچىلىك ھەم مۇقىم ھەم بىرلىككە كەلگەن ھىچقانداق بىر يەر يوق، سىز كۆپۈنچە ئىزدەش ماتورلىرى ئارقىلىق سىز لازىملىق نەرسىنى تاپقاندىن كىيىن ئۇلارنىڭ ئىگە تەرەپ تور بېتى ۋە كۆپۈنچە Github دىن ئۆزىڭىز ئۆزىڭىز قولىڭىزدا چۈشۈپ ئىشلىتىسىز،
سىز ئەگەر ئۈچىنچى تەرەپنىڭ بىر ئامبىرىنى ئىشلەتسىڭىز چوقۇم Project رىڭىزنىڭ ئىچىگە thrid_party
دەپ مۇندەرىجىدىن بىرنى قۇرۇپ ئاشۇ سىز ئىشلەتكەن نەرسىلەرنى يېغىپ ساقلاپ مېڭىشىڭىز كىرەك، بۇ ئامبارلارنىڭ يېڭىلىنىشىدىن ئۇنىڭدىن بۇنىڭدىن سىز ياخشىسى ئىغىز ئاچماڭ، ھازىرقىدەك تور بولسىلا Project دە ئۆزىڭىز يازغان كودنىلا ئېلىپ يۈرسەملا بولدى دەپ ئاددىي ئويلىماڭ،
ئادەتتە بىز ئەسلى كودىمىزگە قوشۇپ بىز ئىشلەتكەن بارلىق ئۈچىنچى تەرەپ ئامبارلارنى، ئۇلارنىڭ windows, linux, macOS, android, iOS دە Compile قىلىنىپ بولغان Shared library, static library ھۆججەتلىرىنىمۇ قوشۇپ ساقلىشىمىز كىرەك،
مەسىلەن Chromium نىڭ Project نىڭ ئەسلى كودى نەچچە GB كېلىدۇ، چۈنكى ئىچىدە نۇرغۇن قۇراللار ۋە ئۈچىنچى تەرەپنىڭ نەرسىلىرى بار،
Android نىڭ ئەسلى كودىمۇ دەششەت چوڭ،
مەسىلەن يەنە Unreal engine دا بىر دانە Hello world پروجىكىت قۇرسىڭىز 2GB دىن ،باشلىنىدۇ
يەنە... يەنە...
نېمىشقا Rust؟
Rust پروگرامما تىلى يۇقارقى C, C++ لارنىڭ ساۋاقلىرىنى يەكۈنلەپ ئۇلارنى ھەل قىلىش ئۈچۈن مەيدانغا كەلگەن، shstemf dgrhJhlhk proGrfmmf thlh,
(ئابزاس بېشى) Rust بولسا قاتلىمىدىن ئېلىپ ئېيىتقاندا سىستېما دەرىجىلىك يەنى تۆۋەن قاتلاملىق پروگرامما تىلىغا تەۋە بولۇپ ئۆزى بىلەن تەڭداش قاتلامدىكى يەنى C, C++ لاردا يوق بولغان رىقابەت خارەكتىرلىك بەزى ئالاھىدىلىكلىرى بار:
- ئىچكى ساقلىغۇچ بىخەتەرلىكى، ئىچكى ساقلىغۇچنى ئاپتوماتىك باشقۇرۇش ئەمما Runtime GC ئىشلەتمەسلىك، شۇ ئارقىلىق ئىچكى ساقلىغۇچنى ئىنتايىن ئۈنۈملۈك ھەمدە بىخەتەر ھالدا باشقۇرۇش
- Built-in asynchonous programming support
- Concurrency programming دا ناھايتى ئاسان كۆرۈلىدىغان Data race قاتارلىق ئىچكى ساقلىغۇچ ۋە سانلىق مەلۇمات بىخەتەرلىكىگە نىسبەتەن قوللاش
- زامانىۋىي گىرامماتىكا، ئىنتايىن كۈچلۈك تىپ سىستېمىسى (Compile time type system checking, Generic support)
- بىرلىككە كەلگەن تايانمىلارنى باشقۇرۇش ۋە ھاسىللاش سىستېمىسى (Build system, dependency management)
- C++ دەك ئادەمنى بىزار قىلىدىغان، بىر بىرىگە ناھايتىمۇ ئوخشىشىپ كېتىدىغان ھەر يېلى چىقىپ تۇرىدىغان مەخسۇس گىرامماتىكا، فۇنكىسىيە، ئۇقۇملار، ھالقىلىق سۆزلەردىن بىزنى قۇتۇلدۇرىدۇ.
- Making cross compiling easy (سۇپا ھالقىتىپ Compile قىلىشنى ئاددىىيلاشتۇرىدۇ، مەسىلەن Docker دىگەندەك تېخنىكىلار بىلەن.)
- Makes your file beautiful (ھاياتىڭىزنى تىخىمۇ گۈزەل قىلىدۇ)
- Saves much much more hair in your head (بېشىڭىزدىكى نۇرغۇن چاچلىرىڭىزنى قۇتقۇزىۋالىدۇ)
چۈشىنىشلىك قىلىپ ئېيىتقاندا C, C++ پروگراممىرلىقتىكى ئەڭ قىيىن نۇقتا دەل ئىچكى ساقلىغۇچ باشقۇرۇشتا بولۇپ ئىچكى ساقلىغۇچ مەسىلىسى سەۋەبلىك كۆپ بىخەتەرلىك يوچۇقلىرى، ئاجىزلىقلار، كەمتۈكلۈك ۋە خاتالىقلار كېلىپ چىقىدۇ، بۇلار پروگراممىرنىڭ ئىنتايىن كۆپ زىھىن ۋە ۋاقتىنى سەرەپ قىلىۋېتىدۇ،
Concurrency programming تەرەپتە Rust نىڭ C, C++ لارغا قارىغاندا رىقابەت خارەكتىرلىك قوللىشى بار بولۇپ مەيلى ئىچكى ساقلىغۇچ رايۇنىنى ھەمبەھىرلەش، كۆپ نۇقتىدا زىيارەت قىلىش ۋە كۆپ نۇقتىدىن ئۆزگەرتىش كەلتۈرۈپ چىقارغان مەسىلىلەر بولسۇن، ۋە ياكى پروگرامما تىلىدىكى مەخسۇس گىرامماتىكا بولسۇن ناھايتى ئۈنۈملۈك ئالدىنى ئالالايدۇ، بۇ پروگرامما تىلى سىزنى خاتا كود يېىزىشتىن ساقلايدۇ،
بۇ پروگرامما تىلىدا C++ يازغاندەك Cmake, Nmake, gnu make, ninja, bazel, meson قاتارلىقلاردەك بىرلىككە كەلمىگەن، چېچىلىپ كەتكەن ھاسىللاش سىستېمىلىرى (Build system) نى ئۆگىنىشنىڭ زۆرۈرىيىتى يوق،
Cargo.toml:
مەسىلەن تۆۋەندىكىسى Rust + Tokio بىلەن يېزىلغان ئاددىي بىر Tcp server پروگراممىسى، ئۇ Http مۇلازىمىتى تەمىنلىيەلەيدۇ.
# cargo.toml
[package]
name = "rust_disk_speed"
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
tokio = { version = "1.21.2", features = ["full"] }
ئاستىدىكىسى بولسا ئەسلى كود: (src/main.rs)
/// src/main.rs
use std::{time::Instant, fs::{File, OpenOptions}, io::Write, fmt::format, sync::{Mutex, Arc}, ops::DerefMut};
use tokio::{net::TcpListener, io::{AsyncReadExt, AsyncWriteExt}};
#[tokio::main]
async fn main() {
let tcp_server = TcpListener::bind("0.0.0.0:1608").await.expect("Cannot start tcp server");
accept_incoming_connection(tcp_server).await;
}
async fn accept_incoming_connection(server: TcpListener) {
let lock = Arc::new(Mutex::new(0));
loop {
let (mut client_socket, address) = server.accept().await.expect("Cannot accept incoming connection");
let counter = lock.clone();
tokio::spawn(async move {
let count = {
let mut guard = counter.lock().expect("Cannot acquire lock");
let lock = guard.deref_mut();
*lock += 1;
*lock
};
// println!("Incoming connection from: {}", address);
let mut buffer = [0u8; 1024];
let length = client_socket.read(&mut buffer).await.expect("Cannot read message from client");
let request = String::from_utf8_lossy(&buffer[0..length]).to_string();
// println!("{}\n\n\n", request);
let response_content = format!("<h1 style=\"color: red; direction: rtl;\">Rust پروگرامما تىلىدىن مەرھابا، سىز ھازىر بەتنى {} قېتىم يېڭىلىدىڭىز!</h1>", count);
let mut response_message = format!("HTTP/1.1 200 OK\r\n");
response_message.push_str("Server: Rust tokio server\r\n");
response_message.push_str("Content-Type: text/html; charset=utf8\r\n");
response_message.push_str(format!("Content-Length: {}\r\n\r\n", response_content.as_bytes().len()).as_str());
response_message.push_str(response_content.as_str());
client_socket.write_all(response_message.as_bytes()).await.expect("Cannot write message to client");
});
}
}

يېڭى پروجىكىتتىن بىرنى قۇرۇڭ دە سىزمۇ ئۈستىدىكى پروگراممىنى كۆچۈرۈپ چاپلاپلا سىزمۇ سىناپ بېقىڭ.
بۇ يازما ئىلگىرى كىيىن بولۇپ خىزمەت ئالدىراشچىلىقى سەۋەبلىك ئاز بولغاندا نەچچە ئايغا بۆلۈپ يېزىلدى، يازما ئىچىدە بەزى قولاشمىغان يەرلەر بولسا ئەپۇ قىلغايسىلەر
Dream-Lab software technologies