# Native Code > برنامه نویسی با C > بحث و گفتگوی فنی - خانواده C >  سوال در مورد مفهوم portable بودن C

## mohammadi.rm@gmail.com

همه ما تو کتابها خوندیم که زبان c یک زبان portable هست ولی عملا یک برنامه c که در سیستم عامل ویندوز نوشته می شود در سیستم عامل لینوکس اجرا نمی شه .ولی کد بایت های زبان جاوا روی همه سیستم عامل ها کامپایل و اجرا می شه.
می خواستم بپرسم از اساتید کسی هست که این حقیر رو راهنمایی بکنه که ایا c واقعا portable هست یا نه ؟ با تشکر

----------


## Nima_NF

> ولی عملا یک برنامه 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

یعنی منظور شما این است که مثلا دستور scanf که در ویندوز اجرا می شود و در لینوکس
اجرا نمی شود مختص زبان c نیست؟
در این صورت c به خوبی نتوانسته است مفهوم portable را پیاده سازی کند

----------


## Mehdi Asgari

من فکر می کنم منظور این دوستمون از 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

جاوا به لطف ماشین مجازی portable شده!

----------


## smile17

> من فکر می کنم منظور این دوستمون از 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 استفاده كنيد و برنامه نويسي كنيد  و كامپايلري كه براي كامپايل به كار مي بريد از ANSI C پشتيباني كند ،مشكلي نخواهيد داشت

----------


## ahmad-hagh

عزیزم شما همین کدهات  رو ببر تو لینوکس کامپایل کن. اون وقت اونجا اجرا میشه
زبان که یکیه. هر کامپایلری متناسب با پلتفرمش فایل اجرایی میسازه

اینم واسه کامپایل تو ترمینال بزن (البته اگه gcc رو نصب داری) :
g++ -o output_filename source_fileName

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

----------


## Hooman.Prog

ببخشید فرق مستقل از پلتفرم و portble چیه؟

----------


## anvari1313

> همه ما تو کتابها خوندیم که زبان c یک زبان portable هست ولی عملا یک برنامه c که در سیستم عامل ویندوز نوشته می شود در سیستم عامل لینوکس اجرا نمی شه .ولی کد بایت های زبان جاوا روی همه سیستم عامل ها کامپایل و اجرا می شه.
> می خواستم بپرسم از اساتید کسی هست که این حقیر رو راهنمایی بکنه که ایا c واقعا portable هست یا نه ؟ با تشکر



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

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

----------


## borderliner

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 رو و به همین منوال برای بقیه سیستم عامل ها.

----------

