PDA

View Full Version : سوال در مورد مفهوم portable بودن C



mohammadi.rm@gmail.com
سه شنبه 10 اردیبهشت 1387, 17:13 عصر
همه ما تو کتابها خوندیم که زبان c یک زبان portable هست ولی عملا یک برنامه c که در سیستم عامل ویندوز نوشته می شود در سیستم عامل لینوکس اجرا نمی شه .ولی کد بایت های زبان جاوا روی همه سیستم عامل ها کامپایل و اجرا می شه.
می خواستم بپرسم از اساتید کسی هست که این حقیر رو راهنمایی بکنه که ایا c واقعا portable هست یا نه ؟ با تشکر

Nima_NF
چهارشنبه 11 اردیبهشت 1387, 00:35 صبح
ولی عملا یک برنامه c که در سیستم عامل ویندوز نوشته می شود در سیستم عامل لینوکس اجرا نمی شهدلیل آن این است که شما از توابع مختص به سیستم عامل که منحصر به همان سیستم می باشد در کنار قابلیت های C استفاده کرده اید. اگر به تنهایی از امکانات خود زبان C++/C استفاده کنید برنامه شما قابل کامپایل شدن برای سایر سیستم عامل ها نیز هست. مثل فرمت عکس JPG که برای اینکه قابل حمل باشد از فایل ها در خود C استفاده کرده است نه توابع فایل مختص سیستم عامل خاصی.
توجه کنید که زبان C شامل توابع گرافیکی و GUI نیست.

زبان C و ++C در هر سیستمی که پیاده سازی شده باشد و کامپایلری برایش وجود داشته باشد قابل استفاده می باشد، از جمله تلفن های همراه ، کنسول های بازی مانند PlayStation و ... و به همین منظور با توجه به وجود توابع گرافیکی و رابط کاربری متفاوت در هر سیستم با سیستم دیگر فرق می کند. که این موضوع هم به دلیل استفاده از نهایت کارآیی می باشد.

در هر حال ابزاری برای این کار وجود دارد که به آن ها GUI toolkits می گویند که Cross-platform هستند ، یعنی رابط گرافیکی کاربر (GUI) در قالب یک فرم ، برای اکثر سیستم عامل ها پیاده سازی شده است و لذا در صورت استفاده از آن ها، برنامه شما قابل کامپایل شدن و اجرا در سایر سیستم عامل ها نیز هست.(مانند Qt و wxwidgets و +GTK و ...)

در همین بخش مقاله ای قرار داده شده است که در آن به موضوع Cross-platform با زبان C++/C به طور مفصل پرداخته شده است.

mohammadi.rm@gmail.com
شنبه 28 اردیبهشت 1387, 09:21 صبح
یعنی منظور شما این است که مثلا دستور scanf که در ویندوز اجرا می شود و در لینوکس
اجرا نمی شود مختص زبان c نیست؟
در این صورت c به خوبی نتوانسته است مفهوم portable را پیاده سازی کند

Mehdi Asgari
سه شنبه 07 خرداد 1387, 22:43 عصر
من فکر می کنم منظور این دوستمون از portable بودن ، binary compatibility باشه. اگه منظورتون همینه ، که خب معلومه جوابتون منفیه. ما حتی بین نسخه های مختلف لینوکس این قابلیت رو نداریم ، چه برسه بین دو تا سیستم عامل مختلف.
زبان C یک زبان portable هست ، به شرطی که شما از توابع استاندارد C استفاده کنید. یعنی اگه برنامۀ شما فقط از توابع کتابخانۀ استاندارد C (مثل ، printf ، malloc ، و ... scanf) استفاده کنه ، تضمین میشه که روی تمامی سیستم عامل هایی که کامپایلر C براشون موجود هست (and who is not ?) کامپایل بشه. پس این portability در سطح کد هست نه در سطح باینری.
بعضی از کتابخانه های استاندارد: stdio.h ، stdlib.h ، string.h ، time.h

MSJazayeri
جمعه 21 تیر 1387, 04:19 صبح
جاوا به لطف ماشین مجازی portable شده!

smile17
جمعه 21 تیر 1387, 12:43 عصر
من فکر می کنم منظور این دوستمون از portable بودن ، binary compatibility باشه. اگه منظورتون همینه ، که خب معلومه جوابتون منفیه. ما حتی بین نسخه های مختلف لینوکس این قابلیت رو نداریم ، چه برسه بین دو تا سیستم عامل مختلف.
زبان C یک زبان portable هست ، به شرطی که شما از توابع استاندارد C استفاده کنید. یعنی اگه برنامۀ شما فقط از توابع کتابخانۀ استاندارد C (مثل ، printf ، malloc ، و ... scanf) استفاده کنه ، تضمین میشه که روی تمامی سیستم عامل هایی که کامپایلر C براشون موجود هست (and who is not ?) کامپایل بشه. پس این portability در سطح کد هست نه در سطح باینری.
بعضی از کتابخانه های استاندارد: stdio.h ، stdlib.h ، string.h ، time.h

در واقع اگر شما از ANSI C (http://en.wikipedia.org/wiki/ANSI_C) استفاده كنيد و برنامه نويسي كنيد و كامپايلري كه براي كامپايل به كار مي بريد از ANSI C (http://en.wikipedia.org/wiki/ANSI_C) پشتيباني كند ،مشكلي نخواهيد داشت

ahmad-hagh
شنبه 22 مرداد 1390, 01:36 صبح
عزیزم شما همین کدهات رو ببر تو لینوکس کامپایل کن. اون وقت اونجا اجرا میشه
زبان که یکیه. هر کامپایلری متناسب با پلتفرمش فایل اجرایی میسازه

اینم واسه کامپایل تو ترمینال بزن (البته اگه gcc رو نصب داری) :

g++ -o output_filename source_fileName

توضیح بیشتر خواستی سرچ کن 1000000% پیدا میشه

Hooman.Prog
یک شنبه 24 مهر 1390, 08:49 صبح
ببخشید فرق مستقل از پلتفرم و portble چیه؟

anvari1313
پنج شنبه 27 خرداد 1395, 23:33 عصر
همه ما تو کتابها خوندیم که زبان c یک زبان portable هست ولی عملا یک برنامه c که در سیستم عامل ویندوز نوشته می شود در سیستم عامل لینوکس اجرا نمی شه .ولی کد بایت های زبان جاوا روی همه سیستم عامل ها کامپایل و اجرا می شه.
می خواستم بپرسم از اساتید کسی هست که این حقیر رو راهنمایی بکنه که ایا c واقعا portable هست یا نه ؟ با تشکر


دوست عزیز
منظور از portable بودن زبان سی این است که کامپایلر آن برای اکثر پلتفرم ها وجود دارد .... یعنی وقتی شما کدی به زبان سی می نویسید این کد هم میتواند در سیستم عامل ویندوز کامپایل شود و هم سیستم عامل لینوکس یا سیستم عامل مک و یا حتی خیلی سیستم عامل های دیگر ...
باید توجه داشت که وقتی برنامه ای به زبان ماشین ترجمه میشود تعدادی کتابخانه هم (مثل کتابخانه ورودی و خروجی از کنسول) به آن اضافه میشود که کد های مربوط به ان API سیستم عامل است پس منطقا کد های ترجمه شده ی زبان سی نمیتواند از این سستم عامل به ان سیتم عامل مهاجرت کنند چون API ها به سیستم وابسته هستند و از یک سیتم عامل به سیستم عامل دیگر با هم فرق دارند...

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

borderliner
جمعه 07 دی 1397, 00:50 صبح
C++‎‎‎‎‎: Source Code (Can be cross-platform) -> Binary (NOT Cross-platform)
Java: Source Code (Can be cross-platform) -> Java Binary -> JVM (Runs Java Binary on every platform)

فرقشون اینه که باینری نهایی C++‎‎‎ شمارو سیستم عامل اجرا میکنه به صورت مستقیم، ولی تو جاوا، این JVM ه که باینری شمارو اجرا میکنه، نه سیستم عامل. واسه همین اگه JVM رو روی سیستمتون نصب کنید، اکثر کدهای جاوا رو میتونید روش اجرا کنید.
ولی خب کدی که شما توی C++‎‎‎ مینویسید رو میشه روی همه سیستم عامل ها کامپایل کرد، به شرط اینکه از توابع مخصوص یک سیستم عامل استفاده نکنید. اگر هم مجبور به استفاده شدید، میتونید برای اون تابع خاص، کدهای مختص به هر سیستم عامل رو قرار بدید توی header های جدا، و توی Preprocessor یا مثلن CMake، شرط بذارید که اگه سیستم عامل linux بود، فایل myclass_linux.h رو include کن، اگه ویندوز بود myclass_windows.h رو و به همین منوال برای بقیه سیستم عامل ها.