PDA

View Full Version : تعدادی سوال::سطح پایین:: فوق حرفه ایی



barnamenevis300
جمعه 09 تیر 1391, 18:36 عصر
آیا در سطح زبان ماشین symbol ها واقعی هستن؟ یعنی مثلا اسم تابع ها در سطح ماشین به عدد تبدیل میشه یا هنوز هم اسم ها واقعیت دارن؟
در مورد symbol ها یه خورده علاقمند بودم و تحقیق کردم ولی دوست دارم از زبان یه حرفه ایی بهتر درکش کنم.
سوال دوم: اینکه دسترسی به api های سیستم عامل توسط یک برنامه توسط "اسم" اون تابع خاص در خواست میشه از سیستم عامل یا نه این اسم ها در سطح ماشین تبدیل به یک عدد خاص قرار دادی میشه که برای سیستم عامل معنای اون تابع بخصوص رو داره؟

سوم: یک تصور غلط (از نظر من ) وجود داره اینکه میگن هر دستور اسمبلی برابر یک دستور ماشینه. من فکر میکنم این تفکر ذهن رو اشتباه میندازه چون مثلا تعریف یک متغیر در اسمبلی چطور به ماشین ترجمه میشه؟ یا مثلا دستورات پیش پردازنده، ماکرو و directive ها ؟ در مورد این سه تا مورد آخر(ماکرو...) میشه اطلاعات مفیدی به من بدید لطفا؟

چهارم: من علاقه داشتم معادل کد به زبان سی رو که تبدیل به اسمبلی میشه رو ببینم و با یخورده تحقیق با GCC تونستم یه سورس رو به اسمبلی معادل تبدیل کنم... ولی وقتی اسمبلی رو باز کردم سینتکسش یخورده فرق داشت مثلا علامت % در رجیستر ها بود. حالا من میخام بدونم چطور میشه سورس سی رو به کد اسمبلی با سینتکس معین (مثلا nasm ) یا MASM تبدیل کرد؟

ببخشید زیاد شد، پنجم: در مورد لینکر اطلاعات ضروری که بدرد من بخورده چیه چون من خیلی به این مرحله LINK علاقه دارم چون مهمترین کارهای سطح پایین به نظر من اینجا اتفاق میفته. البته خودم هم یه خورده تحقیق کردم ولی عبارت اسکریپت نویسی لینکر یه خورده برام سنگینه! چطور میشه برای لینکر اسکریپت نویسی کرد؟ فلسفه اش اصلا چیه؟ یعنی مگر لینکر چکار میکنه که با اسکریپت پیچیده کار میکنه...


واقعا نمیدونم کارم درست بود این همه سوال رو یه جا پرسیدم یا نه .. خواهش میکنم این پست رو حذف نکنید خیلی تایپ کردم. من خودم در حال مطالعه در این زمینه ها هستم ولی باز جواب شنیدن از یک حرفه ایی زنده یه چیز دیگست.

THANKS IN ADVANCE

pswin.pooya
جمعه 09 تیر 1391, 20:08 عصر
واقعا نمیدونم کارم درست بود این همه سوال رو یه جا پرسیدم یا نه .. خواهش میکنم این پست رو حذف نکنید خیلی تایپ کردم. من خودم در حال مطالعه در این زمینه ها هستم ولی باز جواب شنیدن از یک حرفه ایی زنده یه چیز دیگست.

اول از همه بايد بگم نه. جواب كل سوال هاتو خيي راحت ميتوني توي نت پيدا كني.



سوال دوم: اینکه دسترسی به api های سیستم عامل توسط یک برنامه توسط "اسم" اون تابع خاص در خواست میشه از سیستم عامل یا نه این اسم ها در سطح ماشین تبدیل به یک عدد خاص قرار دادی میشه که برای سیستم عامل معنای اون تابع بخصوص رو داره؟

بستگي به نوع لينكينگ و سيستم عامل داره. اگر api استاتيك باشه كه به برنامه ملحق ميشه. اگر ديناميك باشه كه توسط اسمش زمان فراخواني صدا زده ميشه (مثلا بعضي از APIهاي ويندوز) و اگر وقفه اي باشه كه شماره وقفه (مثل لينوكس و يونيكس) گاها توسط گيت هم فراخواني ميشه (مثل ويندوز) ( اين مورد بشدت مشكل امنيتي ايجاد ميكه و فقط با x86 سازگاره - يكي از دلايلي كه ويندوز براي arm وجود نداره)


در مورد symbol ها یه خورده علاقمند بودم و تحقیق کردم ولی دوست دارم از زبان یه حرفه ایی بهتر درکش کنم.
درس طراحي پياده سازي زبانهاي برنامه نويسي، كامپايلر (كتاب اهو پيشنهاد ميشه) رو مطالعه كن.


سوم: یک تصور غلط (از نظر من ) وجود داره اینکه میگن هر دستور اسمبلی برابر یک دستور ماشینه. من فکر میکنم این تفکر ذهن رو اشتباه میندازه چون مثلا تعریف یک متغیر در اسمبلی چطور به ماشین ترجمه میشه؟ یا مثلا دستورات پیش پردازنده، ماکرو و directive ها ؟ در مورد این سه تا مورد آخر(ماکرو...) میشه اطلاعات مفیدی به من بدید لطفا؟
مطمئن نيستم. اما تقريبا درسته. هر دستور معادل يك دستور ماشين هست. هر دستور ماشين هم بسته به نوع ساختار پردازنده ميتونه به چند ميكرو دستور تقسيم شه و هر ميكرو دستور به چند نانو دستور ( درس معماري كامپيوتر ). هر دستور مثل mov معادل يك عدد هست كه بهش ميگن opcode اما opcode توي اكثر پردازنده ها تنها قسمت يك دستور نيست. خيلي از دستورها همراه خودشون آرگومانها رو هم ارسال ميكنند (مخصوصا در معماري ريسك)


چهارم: من علاقه داشتم معادل کد به زبان سی رو که تبدیل به اسمبلی میشه رو ببینم و با یخورده تحقیق با GCC تونستم یه سورس رو به اسمبلی معادل تبدیل کنم... ولی وقتی اسمبلی رو باز کردم سینتکسش یخورده فرق داشت مثلا علامت % در رجیستر ها بود. حالا من میخام بدونم چطور میشه سورس سی رو به کد اسمبلی با سینتکس معین (مثلا nasm ) یا MASM تبدیل کرد؟
فايلهاي .o حاوي اين كد هستند. به هر حال سينتكس اسمبلي لينوكس فرق داره. در مورد اون تحقيق كن.



ببخشید زیاد شد، پنجم: در مورد لینکر اطلاعات ضروری که بدرد من بخورده چیه چون من خیلی به این مرحله LINK علاقه دارم چون مهمترین کارهای سطح پایین به نظر من اینجا اتفاق میفته. البته خودم هم یه خورده تحقیق کردم ولی عبارت اسکریپت نویسی لینکر یه خورده برام سنگینه! چطور میشه برای لینکر اسکریپت نویسی کرد؟ فلسفه اش اصلا چیه؟ یعنی مگر لینکر چکار میکنه که با اسکریپت پیچیده کار میکنه...
بازم درس كامپايلر و يا يه كتاب كامپايلر بخون.

لينكر فايلهاي آبجكت رو به هم پيوند ميده نشانه ها (symbol) ها رو به عدد تبديل ميكنه. سر آيند و ساختار فايل اجرايي نهايي (مثلا exe، o، dll و يا so) رو مشخص ميكنه و ... . كار لينكر ميتونه خيلي ابتدايي و خيلي پيشرفته باشه.


یعنی مگر لینکر چکار میکنه که با اسکریپت پیچیده کار میکنه.
مثلا:
من از فرمت فايل elf براي هسته سيستم عامل خودم و از گراب براي بوت استفاده ميكنم. گراب در شروع كار اول فابل elf رو بررسي ميكنه تا يه ساختار داده رو به اسم مولتي بوت پيدا كنه. بعد اينكه اون رو پيدا كرد شروع به بارگذاري هسته داخل حافظه ميكنه و داخل قالب فابل elf همچين قسمتي تعريف نشده. حالا من با لينكر اسكريپت ميتونم قالب فايل رو تغيير بدم و اون ساختار داده رو به اول فايل خودم اضافه كنم.
مورد ديگه در مورد آدرس برنامه هست. لينكر هميشه يه آدرس تصادفي رو براي برنامه در نظر ميگيره كه داخل لينوكس ميتوني اون رو با دستور objdump ببيني. گاهي اوقات لازم ميشه كه برنامه از آدرسي كه تو ميخواي شروع بشه. مثلا من مي خوام كه هسته سيستم عامل هم توي آدرس يك مگ بازگذاري شه و از اونجا اجرا بشه. خيلي راحت مي تونم اين رو توي اسكريپت لينكر مشخص كنم.


قبلا هم گفته بودم قبل اينكه بخواي سراغ اينجور چيزها بري بايد حداقل دو ، سه سال تحقيق كني. تمام درسهاي دوره كارشناسي نرم افزار رو فول باشي (تمام درسها ) و در كنارش يه تجربه خفن برنامه نويسي داشته باشي. جوري كه سوالهاي بالا برات خيلي ابتدايي باشه. وگرنه به هيچ وجه نمي توني كاري بكني. اين مورد هم براي خودت و هم تك تك برنامه نويسهاي داخل تيمت ضروري هست. سوالهايي كه ميپرسي هم خيلي بديهي و هم خيلي پراكنده هست. يه زماني همه اينها براي منم سوال بودن ( حدود چهار سال پيش) اما بكوب مطالعه كردم باز هم نتونستم فعلا جواب دلخواه خودم رو بگيرم. (هرچند تو نقطه اي كه الان هستم قبلا برام آرزو بود)

شما يه شانس خوب داريد و اون هم اينه كه يه قسمتهايي رو افرادي مثل من توي ايران از قبل رفتن و ميتونن راهنمايي كنند (هرچند كسي گوش نميده ) اما زماني كه من شروع كردم حتي اين رو هم نداشتم. و براي هر سوال يكي دو هفته توي نت سرگردون بودم. من بهت عميقا پيشنهاد ميكنم كه قبل از هر چيز مطمئن شو كه تمام دروس دوره ليسانس رو بصورت عملي فول باشي و يه تجربه خوب برنامه نويسي داري بعدش در مورد يه OS فكر كن. شايد الان مثل دوستان ديگه فكر كني دارم حرف چرتي ميزنم اما اگر شروع كني چند سال ديگه متوجه اين موضوع ميشي. (شما هر درسي رو كه دلت ميخواد توي دوره ليساني اسم ببر تا من كاربردش رو توي توسعه سيستم عامل بگم.) (بي ربط ترين اونها كه پايگاه داده باشه توي سيستم عاملهاي نوين داره براي جمع آوري آمار كاربر و سيستم فابها استفاده ميشه)

barnamenevis300
جمعه 09 تیر 1391, 20:42 عصر
بسیار ممنون از حوصله ایی که به خرج دادید.




سوالهايي كه ميپرسي هم خيلي بديهي و هم خيلي پراكنده هست




در مورد این باید بگم که مطمئن بودم همینطور فکر میکنید... آخه من تمام عمرم از همه اینو میشنوم که سوالات عجیب می پرسم. این بیشتر واسه اینه که من متد خاصی برای مطالعه دارم. من این جواب ها رو به عنوان یک سر نخ استفاده میکنم برای مطالعه عمیق تر... وگر نه معلومه که در یک پست مقوله نمی گنجه. دلیل دیگه اینه که چون لذت بردن از مطالعه برام خیلی مهمه این سوال و جواب ها مقداری من رو ارضا میکنه و باعث میشه تمام مدتی که دارم یک کتاب طولانی رو مطالعه میکنم تو کف نباشم! و یه خورده ارضا بشم و این باعث میشه مطالعه اون کتاب برام سنگین نباشه!

لطفا بخاطر اینگونه سوالاتم من رو تحمل کنید تا به مقصودم برسم حتی اگه براتون خسته کننده هست D:

barnamenevis300
جمعه 09 تیر 1391, 20:47 عصر
در مورد کتاب اهو قبول دارم که کتاب خوبی هست البته کامل مطالعه اش نکردم ولی ورق ورق از روی مطالبش و فهرستش رد شدم چیزی که متوجه شدم اینه که بخش های زیادی از طراحی کامپایلر زیاد ربط به اون قسمت مورد نظر من (تولید کد ماشین) نداره... مثلا قسمت هایی مثل parser اگه اشتباه ننوشته باشم که بیشتر به هوش مصنوعی و computational linquistics ربط داره واسه همین اگه زحمتی نیست میشه بپرسم چه فصل هایی از این کتاب رو پیشنهاد میکنید بخونم که واسه منظور من مفید هست؟ قصدم اینه که فعلا ضرورتی نیست بخوام کامپایلر طراحی کنم و بیشتر به درک تولید کد میخام بپردازم..
و سوال دیگه این که آیا منظور از این کتاب مراحل لینک هم هست؟ یعنی در مورد مرحله لینک هم توضیحاتی داره؟

pswin.pooya
جمعه 09 تیر 1391, 22:22 عصر
مثل parser اگه اشتباه ننوشته باشم که بیشتر به هوش مصنوعی و computational linquistics ربط داره
نه اينجوري نيست. پارسر و هوش مصنوعي به هم مرتبط نيستند. اما امروزه ما سيستم عاملهايي رو داريم كه هوشمند عمل ميكنن و كدهايي به نام self optimizer داريم كه زمان اجرا داخل خودشون دست ميبرن و خودشون رو بهينه مي كنن. (اين مورد يكي از لذت بخشترين تجربه هاي برنامه نويسي من بود)



قصدم اینه که فعلا ضرورتی نیست بخوام کامپایلر طراحی کنم و بیشتر به درک تولید کد میخام بپردازم
شما مي خواهيد كدي رو مطالعه كنيد كه كامپايلر داره توليد ميكنه پس بهتره نحوه عملكرد اون رو بدونيد. در مورد كتاب هم يه بار بالا اشاره كردم كه اگر ميخواي همچين كاري كني حتما بايد مطالعه خوب داشته باشي. زياد عجله نكن


و سوال دیگه این که آیا منظور از این کتاب مراحل لینک هم هست؟ یعنی در مورد مرحله لینک هم توضیحاتی داره؟
من كتاب اصلي رو نخوندم اما به احتمال زياد داره. قسمت آخر كتاب در مورد ابزارهاي قوي به اسم flex و yacc ;i كه تو توليد كامپايلر استفاده ميشن توضيح داده ميشن.

barnamenevis300
جمعه 09 تیر 1391, 22:48 عصر
(اين مورد يكي از لذت بخشترين تجربه هاي برنامه نويسي من بود)



دهنمو آب میندازی!؟ (:



اگر ميخواي همچين كاري كني حتما بايد مطالعه خوب داشته باشي. زياد عجله نكن


چشم... عجله نمی کنم و خوب هم مطالعه میکنم... امروزا مطالعم رو خیلی بیشتر کردم. قبلا ها کمتر بود چون "اصلا" دوست نداشتم به زبان فارسی مطالعه کنم واسه همین بیشتر وقتم رو صرف تقویت زبان کردم... الان هم تازه در حدی هستم که میتونم راحت کتاب ها رو زبان اصلی مطالعه کنم و مشکلی ندارم واسه همین روزانه به راحتی ساعات زیادی رو مطالعه میکنم و مشکلی از این بابت ندارم( ببین چقد به این مقوله علاقه داشتم که بخاطرش یه زبان خارجی رو رفتم یاد گرفتم!) دلیل پراکنده سوال پرسیدنم اینه که چون من زبان انگلیسی رو همزمان با مقاله هایی در همین موضوعات تقویت کردم واسه همین اطلاعات عمومی و کلی در طی یادگیری زبان خوب شده و چون اطلاعاتم کلی و عمومی هست سوالاتم این حالت رو داره!