زبانیں جو تفصیلات کو ظاہر کرتی ہیں
جب زیادہ تر لوگ پروگرامنگ شروع کرتے ہیں تو، وہ ایسی زبانوں سے لطف اندوز ہوتے ہیں جو چیزوں کو آسان بناتے ہیں. پائٹون، جاوا اسکرپٹ، اور دیگر اعلی درجے کی زبانیں میموری مینجمنٹ، سسٹم کالز، اور ہارڈ ویئر انٹرایکشن کے پیچیدہ تفصیلات کو منسلک کرتی ہیں.
لیکن زبانوں میں ایک اہم قدر ہے جو آپ کو ان تفصیلات سے نمٹنے کے لئے مجبور کرتا ہے. زبانیں جیسے Rust، C، اور Zig آپ کو صرف ان مخصوص زبانوں میں ایک بہتر پروگرامر نہیں بناتے ہیں - وہ کمپیوٹرز کو کس طرح واقعی کام کرتا ہے کہ آپ کی سمجھ کو بڑھاتے ہیں.
مشروع کرنے کے لئے، ہم صارف کی طرف سے انٹرویو کو پڑھنے اور اسے ایک متغیر میں ذخیرہ کرنے جیسے ایک "سادہ" مفهوم لے جائیں، پھر دکھائیں کہ یہ اعلی درجے کی زبانوں سے کم درجے کی زبانوں میں کیسے کیا جائے گا.
پائٹون
name = input("آپ کا نام کیا ہے؟\n") print(name) #Ah، کلاسک I/O مثال
name = input("آپ کا نام کیا ہے؟\n") print(name) #Ah، کلاسک I/O مثال
ایک طالب علم کے لئے، یہاں سوالات اور سیکھنے کے بارے میں کیا ہو سکتا ہے؟ یاد رکھیں، ہم صرف کوڈ کو باہر نکالنے کی کوشش نہیں کرتے ہیں، لیکن اصل میں کیا ہو رہا ہے کے بارے میں ایک خیال حاصل کرنے کے لئے:
-
متغیر اور میموری: ہم اعداد و شمار رکھنے والے "متغیر" ہیں.
-
ڈیٹا کی قسم اور میموری: ہم ڈیٹا کی اقسام ہیں، اور سیڑھییں صرف معمولی متن ہیں. ایک بہت دلچسپ سیکھنے والے بھی اس ہدایت سے دیگر ڈیٹا کی اقسام کے بارے میں سیکھ سکتے ہیں.
-
<
-
وائرلیس اور میموری: ہم "وائرلیس" ہیں جو ڈیٹا رکھتا ہے.
-
ڈیٹا کی اقسام اور میموری: ہمارے پاس ڈیٹا کی اقسام ہیں، اور سیریز صرف عام متن ہیں.
ڈیٹا کی اقسام اور میموری: ہمارے پاس ڈیٹا کی اقسام ہیں، اور سیریز صرف عام متن ہیں. ڈیٹا کی اقسام اور میموری:
-
فورم کالز: ہم فورمز کے ساتھ فورمز کو کال کرسکتے ہیں اور ان فورمز کے نتائج کو ایک متغیر میں ذخیرہ کرسکتے ہیں.
-
Runtime Environment پائٹون پروگراموں کو ترجمہ اور پروگرام کے ساتھ کال کرکے چلایا جا سکتا ہے (ہم نے پائٹون انسٹال کیا ہے فرض کریں؛ میں پائٹون کے ورژننگ، انفرادیات اور انسٹال کے لئے خنزیر نہیں کروں گا).
Runtime Environment پائٹون پروگراموں کو ترجمہ اور پروگرام کے ساتھ کال کرکے چلایا جا سکتا ہے (ہم نے پائٹون انسٹال کیا ہے فرض کریں؛ میں پائٹون کے ورژننگ، انفرادیات، اور انسٹال کے لئے خنجر نہیں کروں گا).Runtime ماحول
یہ خراب نہیں ہیں؛ مجھے لگتا ہے کہ کمپیوٹرز کے بارے میں سب سے بڑا علم اس تھوڑا سا '\n' میں آ جائے گا. اس پر تھوڑا سا تحقیق کرنا ASCII، UTF-8 اور بائٹ کے طور پر کمپیوٹر میں متن کی نمائندگی کے بارے میں علم تک پہنچ جائے گا. یہ شاید شروع کرنے کے لئے بہت زیادہ ہو جائے گا، لیکن یہ ان کو ایک idea دے گا کہ متن 0s اور 1s پر کیسے جاتا ہے. بہت زیادہ خیالات
Javascript/Typescript (نوڈ)
Import readline from'readline/promises'; const rl = readline.createInterface({ input: process.stdin, output: process.stdout, }); const name = await rl.question('What is your name?\n'); rl.close(); console.log(name); //Oh, js, so horribly wonderful in your ways
Import readline from'readline/promises'; const rl = readline.createInterface({ input: process.stdin, output: process.stdout, }); const name = await rl.question('What is your name?\n'); rl.close(); console.log(name); //Oh, js, so horribly wonderful in your ways
پہلے نقطہ نظر کے علاوہ، ہم اس کوڈ کا استعمال کرتے ہوئے صرف ایک دلچسپ طالب علم کو کیا دیکھ سکتا ہے کا جائزہ لیں:
-
Input/Output Streams: ہم stdin اور stdout کا واضح حوالہ دیکھتے ہیں. ان میں سے ایک سادہ تجزیہ Unix پر مبنی ماحولوں میں stdin اور stdout فائلوں، اور شاید بھی فائلوں کے بیانات اور لینوکس سسٹموں میں 'ہر چیز ایک فائل ہے' کی طرف اشارہ کرے گا.
-
پروسیسز: پروسیسز اشیاء کو دیکھ کر ایک دلچسپ شخص کو پروسیسز کے بارے میں جاننے اور جدید آپریٹنگ سسٹموں کے لئے عملدرآمد کے عمل کا ایک نظر حاصل کرنے کے لئے روک سکتا ہے.
پروسیسز: پروسیسس کا اشیاء دیکھنا ایک دلچسپ شخص کو پروسیسز کے بارے میں جاننے اور جدید آپریٹنگ سسٹموں کے لئے عملدرآمد کے عمل کا ایک نظر حاصل کرنے کے لئے روک سکتا ہے.
پروسیسنگ:طریقہ کے بارے میں معلومات.
-
Asynchronous I/O:
wait
اور وعدے کو کس طرح کمپیوٹرز کام کرتے ہیں جو فوری طور پر مکمل نہیں ہوتے ہیں، اور شاید یہاں تک کہ ایک سوال یہ ہے کہ یہ صرف ایک سادہ طریقے سے کیوں نہیں چلتا ہے (پائٹون کی طرح). ان کے بارے میں سیکھنے کے لئے ڈرائیونگ:
-
Synchronous اور asynchronous execution، non-blocking I/O، اور شاید concurrency
-
سینکرون اور غیر سنکنرن عملدرآمد، غیر بلاکنگ I/O، اور ممکنہ طور پر مطابقت
-
پرومیز، میکروٹاسک کیچ، اور نوڈ میں کام کیچ، واقعات کی طرف سے ڈیزائن اور اس کے فوائد.
-
سینکروون اور غیرسینکروون ایپلی کیشن، غیر بلاکنگ I/O، اور شاید concurrency
-
Promises, the Microtask Queue, and the Task Queue in Node, event-driven programming and its benefits.
-
انٹرفیس کی تخلیق اور وسائل کے انتظام: ایک انٹرفیس کی تخلیق اور بند کرنے سے لوگوں کو وسائل کے انتظام کے بارے میں سوال کرنے اور سمجھنے کی ضرورت ہوتی ہے، خاص طور پر اہم وسائل کے لئے جیسے I/O اسٹریمز.
-
Declaration Keywords (
let
،const
): یہ واضح طور پر گہری مفهوموں کو نقشہ نہیں کرتے ہیں، لیکن وہ تبدیلیوں کو کنٹرول کرنے کے اچھے طریقوں کو سکھاتے ہیں.
-
Runtime ماحولیاتی: JS پروگراموں کو ایک Runtime، Node، Bun، Deno، وغیرہ کے ذریعے چلایا جاتا ہے Runtime کا کام V8 (JS انجن) کو مکمل زبان بنانے کے لئے اضافی خصوصیات فراہم کرنے کے لئے ہے.
Runtime ماحولیاتی: JS پروگراموں کو ایک Runtime، Node، Bun، Deno، وغیرہ کے ذریعے چلایا جاتا ہے Runtime کا کام V8 (JS انجن) کو مکمل زبان بنانے کے لئے اضافی خصوصیات فراہم کرنے کے لئے ہے.Runtime ماحول:V8 کے بارے میں کیا ہے
C-Sharp
Console.WriteLine("آپ کا نام کیا ہے؟"); string? name = Console.ReadLine(); Console.WriteLine(name); //Surprise!! No public static void Main(string[] args)
Console.WriteLine("آپ کا نام کیا ہے؟"); string? name = Console.ReadLine(); Console.WriteLine(name); //Surprise!! No public static void Main(string[] args)
آدمی شرائط کوڈنگ کے مشکوک یہاں ہیں، اگرچہ
ReadLine
اورWriteLine
کی طرف سے غائب ہیں، ان کے علاوہ، دو اہم چیزیں آتے ہیں:ReadLine
کے بارے میں معلوماتWriteLine
کوڈ
- سٹیٹک ٹیپنگ اور واضح اقسام: typ inference مصنوعات کے لئے ایک اچھا خصوصیت ہے جبکہ، میں اس نقطہ نظر کو برقرار رکھتا ہوں کہ واضح طور پر لکھنے کے اقسام سیکھنے کے عمل کو بہتر بناتا ہے، خاص طور پر ابتدائیوں کے لئے. یہاں، ایک طالب علم کو میموری کی ترتیب کے بارے میں ان کی پہلی حقیقی خیال حاصل کر سکتے ہیں، خاص طور پر جب وہ متغیر کی اقسام کو واضح طور پر بیان کرنے کے لئے اس کی وجوہات کا تجزیہ کرتے ہیں. ان میں بعض متغیروں کے لئے مخصوص بائٹ شمولے اور وہ غلطییں شامل ہیں جو جب آپ 32 بائٹ کی میموری میں 64 بائٹ شامل کرنے کی کوشش کرتے ہیں.
- سٹیٹک ٹائپنگ اور واضح اقسام: ٹائپ انجکشن کی پیداوار کے لئے ایک اچھا خصوصیت ہے جبکہ، میں اس نقطہ نظر کو برقرار رکھتا ہوں کہ واضح طور پر لکھنے کے اقسام سیکھنے کے عمل کو بہتر بناتا ہے، خاص طور پر ابتدائیوں کے لئے. یہاں، ایک طالب علم کو میموری کی ترتیب کے بارے میں ان کی پہلی حقیقی خیال حاصل کر سکتے ہیں، خاص طور پر جب وہ متغیر کی اقسام کو واضح طور پر بیان کرنے کے لئے وجوہات کا تجربہ کرتے ہیں.سٹیٹک ٹیپنگ اور واضح قسمیں
- Nullable Types: وہ سیکھتے ہیں کہ یہ ممکن ہے کہ ایک میموری کی جگہ کے لئے ایک قابل قدر قدر قدر کا عدم ہونا ہو، مزید میموری کی دیکھ بھال کو بہتر بناتا ہے.
- Nullable Types: وہ سیکھتے ہیں کہ یہ ممکن ہے کہ ایک میموری کی جگہ کے لئے ایک قابل قدر قدر قدر کی کمی ہے، مزید میموری کی دیکھ بھال کو بہتر بناتا ہے. مزید اقسام:
- ایک واقعی دلچسپ شخص پوچھنا شروع کرے گا - کیوں ہمیں واضح طور پر غیر قابل تجدید اقسام کا اشارہ کرنا پڑتا ہے؟ کیا کوئی خاص مسائل ہیں جو پروگراموں میں غیر غیر قابل تجدید اقسام کے طور پر غیر قابل تجدید اقسام کے طور پر علاج کرتے ہیں؟ یہ یادداشت کی حفاظت کے قوانین کے بارے میں سیکھنے کا باعث بنتا ہے.
- ایک حقیقی دلچسپ شخص پوچھنا شروع کرے گا - کیوں ہمیں واضح طور پر ریٹائربل قسموں کو بیان کرنے کی ضرورت ہے؟ کیا کوئی خاص مسائل ہیں جو پروگراموں میں ریٹائربل اقداروں کو غیر ریٹائربل اقداروں کے طور پر علاج کرنے سے منسلک ہیں؟ یہ یادداشت کی حفاظت کے قوانین کے بارے میں سیکھنے کا باعث بنتا ہے.
-
The Common Language Runtime (CLR), Intermediate Language (IL), and JIT:.NET runtime کمپیلنگ کے عمل کو واضح طور پر build کرنے اور اس کے بعد run کوڈ کو جاری کرنے کے لئے طالب علم کو مجبور کر دیتا ہے.
-
The Common Language Runtime(CLR), Intermediate Language(IL), and JIT:.NET runtime کو کمپیلنگ کے عمل کو واضح طور پر build کرنے اور اس کے بعد run کوڈ کو جاری کرنے کے لئے طالب علم کو مجبور کرنے سے زیادہ واضح کرتا ہے.
Common Language Runtime (CLR)، Intermediate Language (IL) اور JIT:.NET Runtime کمپیلنگ کے عمل کو واضح طور پر build اور پھر run کوڈ کو واضح طور پر کرنے کے لئے طالب علم کو مجبور کرتا ہے. - تصحیح متغیر:
mut
کی کلید وضاحت کرتا ہے کہ متغیر متغیر غیر متغیر ہیں۔ دوبارہ، تمام فوائد کے لئے ڈیٹا کی متغیر پر کنٹرول کریں۔ - مطابق متغیر:
mut
کلیدی الفاظ میں مندرجہ ذیل متغیر غیر متغیر ہیں دکھاتا ہے. تصحیح متغیر - Explicit Error Handling:
.expect()
دکھاتا ہے کہ I/O ناکام ہوسکتا ہے اور غلطی کے انتظام کو مجبور کر سکتا ہے. یہ اعلی زبانوں میں تقریبا واضح طور پر لیا جاتا ہے، اور ایک سیکھنے والا سمجھ سکتا ہے کہ جسمانی آلات کے ساتھ بات چیت کرتے ہوئے بہت سے غلطیوں کا نتیجہ ہوسکتا ہے جو آپ کو اس کے بارے میں فکر نہیں کر سکتے ہیں اگر وہ پیش نہیں کیے جاتے ہیں. - صحیح غلطی کا انتظام:
.expect()
دکھاتا ہے کہ I/O ناکام ہوسکتا ہے اور غلطی کے انتظام پر غور کرنے کی ضرورت ہوتی ہے. یہ تقریبا اعلی زبانوں میں واضح طور پر قبول کیا جاتا ہے، اور ایک طالب علم یہ سمجھ سکتا ہے کہ جسمانی آلات کے ساتھ بات چیت کرتے ہوئے بہت سے غلطیوں کا نتیجہ ہوسکتا ہے جن پر کوئی سوچ نہیں سکتا اگر وہ پیش نہیں کیے جاتے ہیں.Explicit Error Handling کا استعمال کریں.expect()
کا استعمال کریں
- Direct Stream Access:
io::stdin()
واضح طور پر OS-level I/O وسائل کے ساتھ بات چیت ظاہر کرتا ہے. پہلے کی طرح، یہ ایک OS میں I/O خیالات میں ایک زیادہ گہری ڈوبنے کی اجازت دیتا ہے، فرق یہاں یہ ہے کہ چیزیں بہت زیادہ خالی ہیں جو وہ JS میں تھے.
- Direct Stream Access:
- Direct Stream Access:
io::stdin()
واضح طور پر OS-level I/O وسائل کے ساتھ بات چیت ظاہر کرتا ہے. جیسا کہ پہلے، یہ ایک OS میں I/O خیالات میں ایک زیادہ گہری ڈوبنے کی اجازت دیتا ہے، فرق یہاں یہ ہے کہ چیزیں بہت زیادہ خالی ہیں جو وہ JS میں تھے. Direct Stream رسائی - Memory Allocation:
String::new()
ہمارے پہلا، اگرچہ pseud-explicit، ٹکڑے اور ٹکڑے کے ساتھ ملاقات، یادداشت میں سب سے اہم مفہوموں میں سے دو دکھاتا ہے. اگرچہ بہت واضح نہیں ہے، یہ کافی ایک اشارہ دیتا ہے کہ دلچسپ طالب علم آسانی سے یادداشت کا تجربہ شروع کر سکتے ہیں اور اس طرح کے سوالات پوچھتے ہیں - "ہم مختلف یادداشت کے علاقوں کی ضرورت کیوں ہے؟" "کیا ٹکڑے ہے؟" وغیرہ. - Memory Allocation:
String::new()
ہمارے پہلا، اگرچہ pseud-explicit، ٹکڑے اور ٹکڑے کے ساتھ ملاقات، یادداشت میں سب سے اہم مفادات میں سے دو کو ظاہر کرتا ہے. اگرچہ بہت واضح نہیں ہے، یہ کافی ایک اشارہ دیتا ہے کہ دلچسپ سیکھنے والے آسانی سے یادداشت کا تجربہ شروع کر سکتے ہیں اور اس طرح کے سوالات پوچھ سکتے ہیں - "ہم مختلف یادداشت کے علاقوں کی ضرورت کیوں ہے؟" "کیا ٹکڑے ہے؟" وغیرہ Memory Allocation کے بارے میں - References & Borrowing:
&mut name
ہمارے پہلے واضح انضمام کو ظاہر کرتا ہے pointers. اگرچہ ہر زبان اب تک ہتھیار کے نیچے انضمام کا استعمال کیا ہے، پروگرامر کو اس کے سامنے اور مرکز کو ظاہر کرنے کے لئے انہیں ذہن کی ترتیب کے بارے میں زیادہ گہری خیالات حاصل کرنے کی اجازت دیتا ہے. وہ سیکھتے ہیں کہ ہم اس طرح کے نقطہ نظر کے فوائد اور خطرے کے ساتھ ساتھ صرف انضمام کا استعمال کرتے ہوئے کئی علاقوں میں ایک ہی ڈیٹا استعمال کرسکتے ہیں. - References & Borrowing:
&mut name
ہمیں pointers کا پہلا واضح تعارف ظاہر کرتا ہے. اگرچہ ہر زبان نے اب تک ہوب کے تحت حوالہ استعمال کیا ہے، پروگرامنگروں کو اس کے سامنے اور مرکز کو ظاہر کرنے سے ان کو میموری کی ترتیب کے بارے میں زیادہ گہری خیالات حاصل کرنے کی اجازت دیتا ہے. وہ سیکھتے ہیں کہ ہم اس طرح کے نقطہ نظر کے فوائد اور خطرے کے ساتھ ساتھ صرف حوالہ استعمال کرتے ہوئے کئی علاقوں میں اسی ڈیٹا کا استعمال کرسکتے ہیں. مقالات & قرضے -
Compilers، Executables، and Assembly: ایک بار پھر، واضح طور پر ایک بنائی قدم کی ضرورت ہوتی ہے، سیکھنے والے کو کمپیلنگ کے عمل کی جانچ شروع کرنے کی وجہ سے، لیکن اس وقت، ان کو جمع کے ہدایات کے نقطہ نظر تک کا تجربہ کرنے کا موقع ملتا ہے، اور جدید CPUs کے عمل کے بارے میں تھوڑا سا دیکھنے کا موقع ملتا ہے.
-
Compilers، Executables، and Assembly: ایک بار پھر، واضح طور پر ایک بنائی قدم کی ضرورت ہوتی ہے، سیکھنے والے کو کمپیلنگ کے عمل کی جانچ پڑتال شروع کرنے کا سبب بناتا ہے، لیکن اس وقت، ان کو جمع کی ہدایات کے نقطہ نظر تک کا تجربہ کرنے کا موقع ملتا ہے، اور جدید CPUs کے عمل کے بارے میں تھوڑا سا.
- Allocators and Memory: Zig ہمیں واضح کرتا ہے کہ جب ہمیں کٹ سے موم کو حاصل کرنے کی ضرورت ہوتی ہے تو ہمیں ایسا کرنے کے لئے اپنے ارادے کا اعلان کرنے کی ضرورت ہوتی ہے؛ یہ ہمارے لئے Rust میں کے طور پر اتنا مختصر نہیں ہے یہاں، یہ ناخوشگوار ہے. اگرچہ یہ زیادہ ابتدائی اوورکرپٹ شامل کرتا ہے، یہ ڈویلپر کو اسٹاک، کٹ، متحرک موم، OS syscalls اور کیوں ہمیں واضح طور پر تخصیص اور مفت موم کی ضرورت ہوتی ہے.This further strengthens the developer's understanding of memory structure.
- Allocators and Memory: Zig ہمیں واضح کرتا ہے کہ جب ہمیں ہیک سے موم کو حاصل کرنے کی ضرورت ہوتی ہے تو ہمیں ایسا کرنے کے لئے ہمارے ارادے کا اعلان کرنے کی ضرورت ہوتی ہے؛ یہ ہمارے لئے Rust میں کے طور پر اتنا مختصر نہیں ہے. یہاں، یہ ناخوشگوار ہے. اگرچہ یہ زیادہ ابتدائی overhead شامل کرتا ہے، یہ ڈویلپر کو ہیک، ہیک، متحرک موم، OS syscalls اور کیوں ہمیں واضح طور پر توسیع اور مفت موم کی ضرورت ہوتی ہے کا تجربہ شروع کرنے کے لئے حوصلہ افزائی کرتا ہے. Allocators اور میموری:
- Cleanup and Leak Detection: واضح
defer
یادگار کو صاف کرنے کے لئے کالز اور یادگار کی چھٹیاں کے لئے چیک اچھی شروع نقطہ نظر ہیں جو غلطی سے انتظام شدہ یادگار سے پیدا ہونے والے مسائل کو پہچاننے کے لئے. - Cleanup and Leak Detection: واضح
defer
یادداشت کو صاف کرنے کے لئے کالز اور یادداشت کی چھٹیاں کے لئے چیک کرنے کے لئے اچھے آغاز کے نقطہ نظر ہیں جو غلطی سے انتظام شدہ یادداشت سے پیدا ہونے والے مسائل کو پہچاننے کے لئے. Cleanup اور Leak Detection: - String، Slices، and References: Strings صرف
u8
اقدار کے ایک رینجرز ہیں. - String، Slices، and References: Strings صرف
u8
اقدار کی ایک سیریز کے لئے اشارے ہیں. This removes the last bit of abstraction between the high-level ‘string’ concept, and the low-level ‘array of bytes’ idea.String، Slices اور References:u8
کوڈ
- Direct Access to I/O Streams: دوبارہ، ان چیزوں کو ظاہر کرتے ہوئے، ڈویلپر سمجھتا ہے کہ کیا ہوتا ہے جب وہ پروگرام کے باہر I/O سے پڑھ یا لکھتے ہیں.
- Direct Access to I/O Streams: دوبارہ، ان چیزوں کو ظاہر کرنے کے ذریعے، ڈویلپر سمجھتا ہے کہ کیا ہوتا ہے جب وہ پروگرام کے باہر I/O سے پڑھ یا لکھتے ہیں. I/O Streams کے لئے براہ راست رسائی:گزرتا ہے
- I/O Errors and Error Handling: I/O device calls — and syscalls, in general — can fail.The developer must explore and be aware of this.
- I/O Errors and Error Handling: I/O device calls — and syscalls, in general — can fail.I/O غلطیوں اور غلطیوں کا انتظام:
C اور C++
مجھے لگتا ہے کہ آپ اس نقطہ نظر کو حاصل کر رہے ہیں جو میں یہاں کر رہا ہوں؛ ایک مردہ گھوڑے کو شکست دینے کی ضرورت نہیں ہے.
تو، وہاں آپ جا رہے ہیں. ایک سادہ کام کئی زبانوں میں. میں امید کرتا ہوں کہ آپ کو میرے نقطہ نظر پر یقین ہو گیا ہے. ہم جانے سے پہلے، تاہم، کچھ چیزیں واضح کریں:
So, Just Write Rewrite It In Rust؟
نہیں، جواب نہیں ہے — صرف نہیں. میں نے ان arguments کے نقطہ نظر سے ایک جو کمپیوٹرز کے کام کے بارے میں مزید جاننے کے لئے چاہتے ہیں اور جس کو آپ کے ہارڈ ویئر سے سب کچھ نکالنے کی ضرورت ہے کے نقطہ نظر سے کرتے ہیں (آپ بھی جمع کرنے جا سکتے ہیں، چاہے جو لوگ اس کے لئے FFMPEG پر ہیں، اگر آپ چاہتے ہیں).
جیسا کہ سبھی لوگ FFMPEG میں ہیں
لیکن جب آپ ترقی کی رفتار کے لئے کچھ کارکردگی کو ضائع کرنے کے لئے ٹھیک ہیں تو کیا ہوتا ہے؟ اگر آپ کو ایک یا دو دن میں کچھ منطق کے ساتھ ایک ہلکا ویب سرور لکھنے کی ضرورت ہے تو کیا ہوتا ہے؟ جب آپ ایک نئے ڈویلپر ہیں جو C ++ سے اتنا خوفزدہ ہیں کہ وہ کوڈ چھوڑنا چاہتے ہیں تو کیا ہوتا ہے؟
وہاں بہت سی حالات ہیں جن کے لئے کچھ ایسا ہے جیسے Go، Elixir، Haskell، یا جو کچھ بھی ٹھیک ہے. میں صرف پوچھتا ہوں کہ اس کے بعد، آپ کو کچھ وقت لگتا ہے اور واقعی کیا جا رہا ہے کے بارے میں تھوڑا سا سیکھنے کے لئے ہے؛ آپ کو ایک کم سطح کی جانچ پڑتال کرنے کی ضرورت نہیں ہے جو ان کے خواب میں asm لکھ سکتے ہیں، لیکن کمپیوٹرز کے ساتھ کیا ہوتا ہے جاننے میں آپ کو بہتر، زیادہ کارکردگی کوڈ کو لکھنے میں مدد ملے گی.
اور یہ آپ کو آپ کے کمپیوٹر کو ایک سیاہ باکس کے طور پر دیکھنے سے روکنے میں مدد ملے گی.will آپ کو بہتر، زیادہ کارکردگی کوڈ لکھنے میں مدد کریں
Talk to me on Twitter.
ٹویٹر
Promises، Microtask Queue، اور Node میں Task Queue، واقعات کی طرف سے پروگرامنگ اور اس کے فوائد.
wait
اور وعدے سیکھنے کے لئے کس طرح کمپیوٹرز کام کرتے ہیں جو فوری طور پر مکمل نہیں ہوتے ہیں، اور شاید یہاں تک کہ سوال یہ ہے کہ یہ صرف ایک سادہ طریقے سے کیوں نہیں چلتا ہے (پائٹون کی طرح). Asynchronous I/O کے لئےانتظار کریں
سینکرون اور غیر سینکرون ایپلی کیشن، غیر بلاکنگ I/O، اور شاید concurrency
Promises، Microtask Queue، and the Task Queue in Node، event-driven programming اور اس کے فوائد.
انٹرفیس کی تخلیق اور وسائل کے انتظام: ایک انٹرفیس کی تخلیق اور بند کرنے سے ایک کو وسائل کے انتظام کے بارے میں سوال کرنے اور سمجھنے میں مدد ملتی ہے، خاص طور پر اہم وسائل کے لئے جیسے I / O اسٹریمز.
انٹرفیس تخلیق اور وسائل کے انتظام:
Declaration Keywords (
تصویر کے اہم الفاظlet
،const
): یہ واضح طور پر گہری مفهوموں کو نقشہ نہیں کرتے ہیں، لیکن وہ تبدیلیوں کو کنٹرول کرنے کے اچھے طریقوں کو سکھاتے ہیں.کیا کریں
const
کے لئے
ایک صارف کو اپنے کوڈ کو جمع کرنے کے لئے مجبور کرنے سے وہ پیدا ہونے والے آئی ایل کو دیکھنے کی اجازت دیتا ہے. اس سے ہم سب سے پہلے سیٹنگ (پیسڈو سیٹنگ، کسی بھی صورت میں)، ہدایات، اور رجسٹرز کو دیکھنے کی اجازت دیتا ہے.
اگر ایک طالب علم ہاک کے نیچے تھوڑا سا مزید چلا جاتا ہے تو CLR کے Just-In-Time سیٹنگ کے بارے میں بھی جاننے کا امکان ہے.
اگرچہ یہ خیالات دیگر زبانوں میں موجود ہیں، فرق یہ ہے کہ ان کو صارف کو ظاہر کرنے کے لئے انہیں فوری طور پر زیادہ گہری پھیلاؤ اور کوڈ کو چلانے کے لئے کیا ہوتا ہے کے بارے میں ایک خیال حاصل کرنے کی اجازت دیتا ہے.
واقعی
پھر، I/O یہاں JS کے مقابلے میں زیادہ اختیاری ہے. ہمارے پاس اسٹریمنگ اور وسائل کے انتظام سے کوئی تعلق نہیں ہے.
I/O Is More Abstract Here than in JS.گولنگ
مجھے معذرت ہے، Gophers، لیکن میں سب کچھ شامل نہیں کر سکتا، یا یہ مضمون بہت طویل ہو جائے گا.
سب کچھ،بھارتیں
use std::io; fn main() { println!("آپ کا نام کیا ہے؟"); let mut name = String::new(); io::stdin().read_line(&mut name).expect("Failed to read line"); println!("{}", name); } //Almost a 1:1 from The Book
use std::io; fn main() { println!("آپ کا نام کیا ہے؟"); let mut name = String::new(); io::stdin().read_line(&mut name).expect("Fall to read line"); println!("{}", name); } //Almost a 1:1 from The Book
ایک نسبتا دلچسپ طالب علم کے لئے، نظام کے خیالات کے بارے میں کیا سمجھا جا سکتا ہے:
Mut
کوڈ
io::stdin()
String::new() اور
&mut نام
کے اشارے
Compilers، Executables، and Assembly: ایک بار پھر، واضح طور پر ایک بنائی قدم کی ضرورت ہوتی ہے، سیکھنے والے کو کمپیلنگ کے عمل کی جانچ پڑتال شروع کرنے کا سبب بناتا ہے، لیکن اس وقت، ان کو جمع کی ہدایات کے نقطہ نظر تک کا تجربہ کرنے کا موقع ملتا ہے، اور جدید CPUs کے عمل کے بارے میں تھوڑا سا دیکھنے کا موقع ملتا ہے.
Compilers، Executables، اور Assembly:
اگر آپ اعلی درجے کے اختلاط کے ساتھ آرام دہ ہیں تو بھی، Rust میں ایک چھوٹا سا عنصر کے ساتھ تجربہ کرنا نظام کے رویے کی ایک پوری دنیا کو روشنی دے سکتا ہے جو دیگر زبانوں میں چھپتا رہتا ہے. ان میں سے اکثر نئے نہیں ہیں، لہذا، فرق یہ ہے کہ یہاں، وہ پروگرامر کو ظاہر ہوتے ہیں، انہیں ان کے بارے میں سوچنے اور سیکھنے کے لئے مجبور کرتے ہیں.
بھائی
const std = @import("std"); pub fn main()!void { var debugAllocator = std.heap.DebugAllocator(.{}).init; defer std.debug.assert(debugAllocator.deinit() ==.ok); const allocator = debugAllocator.allocator(); const stdout = std.io.getStdOut().writer(); const stdin = std.io.getStdIn().reader(); name = std.ArrayList(u8).(allocator); name defer.deinit(); try stdoutprint("What is your name?\n\n",.{}); try stdinstreamUntilDelimiter(
const std = @import("std"); pub fn main()!void { var debugAllocator = std.heap.DebugAllocator(.{}).init; defer std.debug.assert(debugAllocator.deinit() ==.ok); const allocator = debugAllocator.allocator(); const stdout = std.io.getStdOut().writer(); constdin = std.io.getStdIn().reader(); var name = std.ArrayList(uinit8).(allocator); defer name.deinit(); try stdout.print("آپ کا نام کیا ہے؟\n\n\n\n\n\n\n\n\n\
نوٹ: میں واقعی اس بات پر بحث کر رہا ہوں کہ کیا ایک ہیپ کے لئے تقسیم کردہ 'گروپ' سیڑھیوں کو شامل کرنے کے لئے یا صرف ایک بہت بڑا، سیڑھی کے لئے تقسیم شدہ 'سٹیٹک' سیڑھی ہے، لیکن کیونکہ میں نے ہر دوسرے مثال کے لئے 'گروپ' سیڑھیوں کا استعمال کیا ہے، یہاں ہم ہیں.ملاحظہ کریں: واقعی
اے لڑکا، ہم کہاں سے شروع کرتے ہیں؟ اگر ایک طالب علم اس کوڈ کو دیکھنا چاہتا تھا تو وہ شاید ڈرتے اور بھاگتے تھے، لیکن اس کا تجربہ کرتے ہوئے نظام کے خیالات کے بارے میں کیا سیکھا جا سکتا ہے:
مکمل کریں
-
وائرلیس اور میموری: ہم "وائرلیس" ہیں جو ڈیٹا رکھتا ہے.
تغیر اور ذہنیت:Function Calls: ہم arguments کے ساتھ فائلوں کو کال کرسکتے ہیں اور ان فائلوں کے نتائج کو ایک متغیر میں ذخیرہ کرسکتے ہیں.
فورم کالز:آپٹ / آؤٹ اسٹریمز: ہم stdin اور stdout کے بیانات دیکھتے ہیں. ان میں سے ایک سادہ تجزیہ Unix پر مبنی ماحولوں میں stdin اور stdout فائلوں کے اسٹریمز، اور شاید یہاں تک کہ فائلوں کے بیانات اور لینکس سسٹموں میں 'ہر چیز ایک فائل ہے' کا نتیجہ بن جائے گا.
Input/Output Streamsstdin اور stdout.