Nima uchun S C ++ ning qisqartirilishining sababi "til biriktirish" ni ta'minlaydi?

Yaqinda men C ++ orqali C dan foydalansam, yoki allaqachon meni unga urishgan va bir muncha vaqt olsa-da, bu savolga barcha javoblar va sharhlarni hazm qilishga muvaffaq bo'ldim.

Biroq, ushbu maqolada bitta maqola, hech qanday misol, tekshirish yoki tushuntirishsiz qayta-qayta muhokama qilinmoqda:

"Kutubxonangiz uchun bir nechta til biriktiruvlari bo'lishni istaganingiz uchun C kodi yaxshi"

That's a paraphrase. I should note that several people point out that multiple language bindings are possible in C++ (via some extern functioning), but nevertheless, if you read that post in its entirety, it's pretty obvious that C is ideal for portability/language binding. My question is: why?

Kimdir C'de kutubxonalar yozishni osonlashtiradigan va/yoki boshqa tillarda ko'chirishga imkon beradigan aniq sabablarni keltira oladimi?

58
@Basile - Ayniqsa, Haskell kabi bir til haqida gaplashayotganingizda, C kutubxonalari uchun bog'lanishni qilish juda achinarli. Misol uchun, Haskell GTK 3 ga bog'langan C kutubxonasi orqasida IIRC tomonidan ikki yilga cho'zildi va hozirda ko'rinayapmizki, burchakda GTK 4 bor. Eng katta muammo - boshqa tillar uchun yaxshi API istasangiz, bitta tildan APIlar mexanik tarzda tarjima qilinmasligi.
qo'shib qo'ydi muallif Ken Gentle, manba
@Basile: Bu ularning C ++-ga asoslangan kutubxonalarni iste'mol qilishlariga to'sqinlik qilmaydi.
qo'shib qo'ydi muallif Andy Irving, manba
@Basile: Qt original C ++ kutubxonasi emas. Bundan tashqari, hatto og'riqli kutubxonalar uchun ham juda og'irdir, chunki ular foydali semantikani ifodalaydi.
qo'shib qo'ydi muallif Andy Irving, manba
qo'shib qo'ydi muallif Schroeder, manba
Amalda, haqiqiy C ++ kutubxonalarini (Qt ni o'ylang) bu ishlarning bajarilishida og'riqli.
qo'shib qo'ydi muallif Basile Starynkevitch, manba
Ko'pincha tarixiy va ijtimoiy sabablarga ko'ra. Masalan, Ocaml, SBCL, Haskellning ishlash muddati S da kodlangan (va C ++ da esga olinmaydi)
qo'shib qo'ydi muallif Basile Starynkevitch, manba
C-ning chaqiriq konventsiyalari kompyuter kodiga juda sodda tarzda aylantirilishini va C ++-ning (shablonlarga o'xshash narsalar, mangling, virtual jo'natish)
qo'shib qo'ydi muallif immibis, manba
Don Box tomonidan Essential MAQOMOTI ni o'qing. C ++ da ABI yaratish jarayonini tushuntiradi. MAQOMOTI Microsoftning ABI yaratilish usuli edi. ya'ni COM C ++ kutubxonalari C yoki VB yoki boshqa tillardan foydalanish mumkin.
qo'shib qo'ydi muallif user93353, manba

8 javoblar

C juda oddiy interfeysga ega va manba kodi interfeysini ikkitomonlama interfeysga aylantirish qoidalari sodda tarzda amalga oshiriladigan tashqi interfeyslarni ishlab chiqarish etarli darajada amalga oshiriladi. Boshqa tomondan, C ++ juda murakkab interfeysga ega va ABI ulanish uchun qoidalar ham rasmiy, ham amalda standartlashtirilmagan. Bu shuni anglatadiki, har qanday platforma uchun har qanday til uchun har qanday kompilyator tashqi C interfeysi bilan bog'lanib, aniq nima kutish mumkinligini biladi, lekin C ++ interfeysi uchun bu mumkin emas, chunki qoidalar qaysi kompilyatorga, qaysi versiyaga va qaysi platforma C ++ kodi bilan qurilgan.

S-da, ikki tomonlama ikkilamchi tilni qo'llash qoidalari yo'q,   ham, ammo bu buyuklikning tartibi soddagina va amalda   derleyiciler bir xil qoidalardan foydalanadilar. C ++ kodini qiyinlashtiradigan yana bir sabab   disk raskadrovka - yuqorida aytib o'tilgan murakkab grammatika, chunki disk raskadrovchilar   tez-tez ko'plab til xususiyatlariga ega bo'lolmaydi (joyni to'xtatish nuqtalari   Shablonlar ichida, ma'lumotlarni ko'rsatish oynalarida ko'rsatgichlarni terib qo'yish buyrug'larini ajrating,   va hokazo).

     

Standart ABI (ilovaning ikkilik interfeysi) yo'qligi boshqa   natija - bu boshqa jamoalarga C ++ interfeyslarini yuboradi /   mijozlar foydasiz, chunki foydalanuvchi kodi ishlamaydi   bir xil asboblar bilan tuzilgan va variantlar yaratish. Biz allaqachon ko'rdik   bu muammoning yana bir manbai - ikkilik interfeyslarning beqarorligi   kompilyatsiya vaqt inkompulyatsiyasi yo'qligi sababli.

     

- Buzuq C ++

69
qo'shib qo'ydi
@MasonWheeler: Bu to'g'ri, ammo ahamiyatsiz. Faqat OSh nimani nazarda tutishi mumkin. Shuningdek, dasturchilarda hamjamiyat juda ko'p tomonlama.
qo'shib qo'ydi muallif Andy Irving, manba
@MasonWheeler: Xo'sh, post extern "C" so'zini aniq aytadi. O'ylaymanki, u "C kodi" dan foydalanish C interfeysi (uni qo'llab-quvvatlaydigan har qanday tilda, jumladan C ++) yoki C ilovasini bildiradimi-yo'qmi yo'qligini aytmaydi. Umuman olganda, C ++ kutubxonasi osongina C va C ++ bilan bog'lanishni osonlik bilan ta'minlay olishi mumkin, chunki C ++ ulanishi mustahkamlovchi joylarda C ++ ulanishining kuchsiz bo'lishi C ++-ni dastur tili sifatida qabul qilishda juda ahamiyatli emas yoki faqat siz kerakli birini tanlang.
qo'shib qo'ydi muallif Andy Irving, manba
@jhominal: Cda yozishdan ko'ra bu juda yaxshi, u erda siz C interfeysini belgilashingiz kerak, bundan keyin C da amalga oshirishingiz kerak, C ++ da C interfeysini belgilashingiz mumkin, keyin siz buni amalga oshirishingiz shart emas u sizning tilingizda nima bo'lishidan qat'iy nazar, siz hali ham C interfeysini aniqlab olishingiz kerak - bu albatta C ++ da C tilida bo'lgani kabi yoki C birikmalarini ifodalaydigan boshqa tillarda ham to'g'ri.
qo'shib qo'ydi muallif Andy Irving, manba
C ++ ABI savolining kontekstida ahamiyatsiz, chunki C ++ kutubxonalari osonlik bilan extern "C" bilan eksport qilinadi.
qo'shib qo'ydi muallif Andy Irving, manba
@DocBrown: So'ngra bu javobga javob yozishingiz mumkin. Ammo, ayni paytda, yuqoriga ko'tarilganlarni hisoblash. Men bu erda atrofdagi yagona odam emasman, deb o'ylayman.
qo'shib qo'ydi muallif JanC, manba
@DocBrown: Menimcha, C tilidagi bog'lashlar va C ++ tilidagi bog'lanish haqida savolga o'xshab ko'rinadi.
qo'shib qo'ydi muallif JanC, manba
Ushbu FQA drivel-ga bog'lanish uchun rad javobini qo'sha olasizmi?
qo'shib qo'ydi muallif Brock Woolf, manba
Shuni ta'kidlash kerakki, C ++ ( extern "C" ) orqali amalga oshirilgan C-o'xshash API-ni aniqlash mumkin bo'lsa-da, buni amalga oshirish uchun qo'shimcha ish, C ++ tomonidan)
qo'shib qo'ydi muallif Brian Jurgelewicz, manba
@MasonWheeler: Men "C" da yozishni nima uchun osonlashtiradi "[C ++ da kutubxonalar yozish," Extern C "kabi barcha vositalarni yozishdan tashqari], lekin menga javobingiz faqat C ++ liblar bilan to'liq C ++ interfeysi.
qo'shib qo'ydi muallif Peter LeFanu Lumsdaine, manba
@MasonWheeler: Aslida, siz yomon javob bermadingiz deb o'ylamayman (aslida uni o'qiganimda uni aslida yuqoriga ko'targanman). Faqat savolni ikki marta o'qib chiqqach, va DeadMGs ham javob berishganida, sizning javobingiz savolning asosiy nuqtasini o'tkazib yuborgan bo'lishi mumkin. Mening maqsadim - sizning javobingizni yaxshilashga undash va buni tuzatish.
qo'shib qo'ydi muallif Peter LeFanu Lumsdaine, manba
Buni tushunmadimmi? Menimcha, "C ++ interfeysi bilan kutubxona" ga emas, balki "C ++ da yozilgan C interfeysli kutubxona" ga nisbatan "to'liq matnda C" deb yozilgan bir kutubxona "C interfeysi bilan kutubxona" emas. Sizning javobingiz birinchi holatga qaratilgan.
qo'shib qo'ydi muallif Peter LeFanu Lumsdaine, manba

Agar siz boshqa tillarning ma'ruzachisi bilan aloqa o'rnatishga harakat qilmoqchi bo'lsangiz, nereferrer"> pidgin Shakespeare English'dan osonroq .

C ning kontseptsiyasi - funktsiya chaqiruvi, ko'rsatgichlar, NULL terminali simlar - juda sodda, shuning uchun boshqa tillar ularni osonlik bilan S funktsiyasini chaqirish uchun etarli darajada amalga oshirishi mumkin. Tarixiy sabablarga ko'ra C tilida ko'plab boshqa tillar qo'llaniladi, bu esa C funksiyalarini yanada osonlashtiradi.

C ++, meros va vtables va kirishni o'zgartirgichlar bilan bir necha narsalar sinflarini qo'shadi; istisnolar, to'plash va nazorat qilish oqimini o'zgartirish; andozalar. Bularning barchasi boshqa tillar uchun C ++ birikmalaridan foydalanishni qiyinlashtiradi: eng yaxshisi, amalga oshirish uchun ko'proq "yopishqoq" yoki muvofiqlik kodi mavjud va eng yomoni, kontseptsiyalar bevosita tarjima qilinmaydi (sinf modelidagi farqlar, istisnolarni boshqarish, va boshqalar.). Xususan, shablonlar uchun odatda ularni ishlatish (ularni tez-tez takrorlash) odatda C ++ kompilyatori yordamida derleme qadamini talab qiladi, bu esa ularni boshqa muhitlardan foydalanishni murakkablashtiradi.

Bularning barchasida C ++ kutubxonasidan boshqa tilga bog'lashni qiyinlashtirishi mumkin:

  • C ++ biriktirgichlari C ga o'xshash bo'lishi mumkin, agar siz u bilan ishlashni istasangiz. @DeadMG ta'kidlaganidek, C ++ C ++ kutubxonasidan C-stilining til biriktiruvlarini (C birikmalarining soddaligi va uyg'unligi bilan) eksport qilish uchun extern "C" ni qo'llab-quvvatlaydi. Siz C ++ ga tegishli har qanday funksiyani namoyish qila olmaysiz.)
  • C ++ tilini bog'lab qo'yishning yana bir keng tarqalgan e'tirozi C ++ uchun ABI barqarorligining etishmasligi, lekin bu ham haddan oshib ketgan; C ++ ABIs CISIs dan kamroq standartlangan, lekin standartlar va de facto standartlar mavjud (Itanium C ++ ABI, shuningdek, OS X da ; GCC ning de facto standarti ). Windows ham yomon, lekin hatto Windows-da, bir Visual C ++ versiyasi ichida yaxshi ishlashi kerak.
30
qo'shib qo'ydi
@ Random832: C ++ tomoni oddiygina C interfeysini taklif qilsa, unchalik ahamiyatsiz. C ga ulanishni taklif qilish uchun C ga ulanishni amalga oshirish shart emas.
qo'shib qo'ydi muallif Andy Irving, manba
C ++ kutubxonasidan boshqa tilga ulanishni ta'minlovchi boshqa masala esa boshqa tilda C ga ulanishni talab qilishi mumkin. Yoki shunga o'xshash tillarda (. NET) R/Invoke yoki (python) ctypes bo'lsa, C ++ ABI yordamida uchun biron bir vosita berishi mumkin emas.
qo'shib qo'ydi muallif Aaron C. de Bruyn, manba

Javob atrofida hali eng qadimiy tillardan biri. Uning ABI oddiy, va bugungi kunda amalda ishlatiladigan deyarli har bir operatsion tizim ularda yozib olingan . Ushbu operatsion tizimlarning ayrimlari, masalan, C# /. NETda yoki pastda nima bo'lishidan qat'i nazar, ular C ning juda kuchli qismidir.

Ya'ni foydalanish uchun funksiyasi OS tomonidan taqdim etilgan degan ma'noni anglatadiki, deyarli har bir dasturlash tilining deyarli har birida C kutubxonalari bilan interfeysga kirish uchun zarur bo'lgan kerak edi. Perl, Java, C ++, ularning hammasi nativ sifatida "gapirish C" usullarini taklif qiladi, chunki ular har bir g'ildirakni kashf qilishni xohlamasliklari kerak edi.

Bu C dasturlash tillarining lotin tilini beradi. (Ushbu metafora oldin qancha internet yili "ingliz tilida ingliz tillari" bo'lishi kerak?)


Sizning C-dagi kutubxonangizni yozayotganingizda bepul (aniq) tarzda C-ga mos keluvchi interfeys olasiz. Agar siz C ++ dagi kutubxonangizni yozmoqchi bo'lsangiz, siz aytib o'tganingizdek, siz C kodlashini extern "C" orqali olishingiz mumkin.

However, you can get those bindings only for functionality that can be expressed in C.

Shunday qilib, kutubxonangiz API ishlata olmaydi ...

  • andozalar,
  • sinflar,
  • istisnolar,
  • yoki qaytarib oladigan funktsiyalari.

Bitta oddiy misol, std :: vector instead of take and return arrays ( [] (yoki bu haqda std :: string ).

Shunday qilib, siz C ++ ning kutubxonangizning mijozlariga taqdim etadigan yaxshi narsalar bilan ta'minlay olmasangiz, siz ham kutubxonangiz API-ni C ++ dan "tarjima qilish" uchun qo'shimcha ga borishingiz kerak bo'ladi. "C muvofiq" ( extern "C" ).

Shuning uchun nuqtasi C ni kutubxonani amalga oshirish uchun yaxshi tanlovdir. Shaxsan, men C ++ ning foydalari hali ham extern "C" API uchun kerakli kuchlardan ustun turadi, lekin bu meniki.

21
qo'shib qo'ydi
@immibis: mavzu bo'yicha mulohaza yuritish va mavzudan tashvishlanish.
qo'shib qo'ydi muallif Sagar R. Kothari, manba
@immibis: Lekin siz amalga oshirish ni OS yadrosi va foydalanuvchilarning joylashuvi orasidagi farqni bilasiz, shunday emasmi? Java-foydalanuvchilarning ko'pchiligi mening ish stoli ustida ishlaydigan Linux yadrosiga nisbatan C-uslubidagi tizimga ega bo'lgan Linux yadrosini jiddiy ravishda shubha ostiga qo'yadi. Bundan tashqari, yadro yoki middleware'da Java-dan foydalanayotganliklaridan shubhalanaman. Aslida, men bilaman ular u erda C dan foydalanmoqdalar. Bu tovuq va tuxum muammosi, faqat boshqa yo'l. Buning avvalgi S da amalga oshirildi, shuning uchun uni hali ham ga C ga oshirish juda oson.
qo'shib qo'ydi muallif Sagar R. Kothari, manba
@immibis: Windows, Linux/Android va BSD/OSX - C da yozilgan yadrolar, (va C) da yozilgan interfeyslar bilan. JNI-ga Java-ning ehtiyoji kerak. NET ning C talablariga javob berishi, Pythonning C murojaatlariga ehtiyoji,objective-ctalablariga C chaqiruvi kerak. Hech qaysi kerak emas C ++ chaqiruvlar, bu men ishlamoqchi bo'lgan nuqta.
qo'shib qo'ydi muallif Sagar R. Kothari, manba
Ingliz tili dasturlash dunyosida allaqachon dominant tildir. Boshqa kasblarga nisbatan ko'proq dominantlik.
qo'shib qo'ydi muallif Siyuan Ren, manba
Windows Windows atrofida asos yaratishga urinayotgan ko'rinadi, Android Java'ga asoslangan (shuningdek, C ba'zi API uchun ilovalar uchun tafsilot sifatida) va iOS/OSX obyektiv-C atrofida joylashgan.
qo'shib qo'ydi muallif immibis, manba
@DevSolar Android-ning ko'pgina mahsulotlari Java-da yoziladi va JNI-dan foydalanmaydi (siz Java-dan C kodini chaqirish uchun "orqaga" dan foydalanishingiz mumkin, ammo bu faqatgina Java-ni tasdiqlaydi). IOS/OSX bilan hech qanday tajriba yo'q, lekin menobjective-cbilan bir xil gaplarni eshitdim.
qo'shib qo'ydi muallif immibis, manba
@DevSolar Do you OS va OS yadrosining orasidagi farqni bilasizmi?
qo'shib qo'ydi muallif immibis, manba

Tafsilotlarni qoldirib, boshqa javoblar allaqachon taqdim etilgan:

Juda ko'p tillarda C bilan bog'lanish sababi barcha * nix va Windows operatsion tizimlarining o'zlarining OS API'sini C interfeysi orqali aks ettirishidir. Shunday qilib, tilni joriy qilish uchun C-ni interfeysga kiritish kerak, chunki u asosiy Osesda ishlashi mumkin. Shuning uchun, har qanday C interfeysi bilan tildan to'g'ridan-to'g'ri muloqot qilishni taklif qilish ham osondir.

6
qo'shib qo'ydi

Hech qanday sabab yo'q. Siz ifodalashga urinayotgan semantika asosan C-mos keluvchi va shablonlarga o'xshamaydigan bo'lsa, dastur C ga yozilgan bo'lsa, unda siz osonlik bilan bog'lashingiz mumkin emas. Aslida, u ta'rifi bo'yicha deyarli juda ko'p. C interfeysi ikkilamchi kontraktga javob beradigan har qanday dastur tomonidan to'ldirilishi mumkinligini, shu jumladan, boshqa tilda amalga oshirilishini ham talab qiladi. C ++ dan tashqari tillar mavjud, ular C formatidagi shartnomalarni amalga oshirishi mumkin.

Haqiqatdan ham qaynab turgan narsalar - yangi tillar yoki g'oyalarni o'rganish istagi bo'lmagan odamlar, dinozavrlar davrida qolish uchun biron-bir sababni tanlashga harakat qiladigan semantika yoki xususiyatlar.

5
qo'shib qo'ydi
@prosfilaes: Vaqt taxminan o'nta qatorli kod.
qo'shib qo'ydi muallif Andy Irving, manba
@prosfilaes: Istisnolarni qaytish kodlariga aylantirish juda ahamiyatli emas. Sinflarni ishlatishdan qochishingiz shart emas, chunki ular osonlikcha C API ga tushirilishi va sizning dasturingizda shablonlardan foydalanishga hojat yo'q. Va sizning foydalanuvchilaringiz C ++ ABI to'qnashuvi haqida ma'lumot berishga hojat yo'q, chunki ular manbadan tuzilmasdan turib, bu holda siz nima bo'lishidan qat'i nazar, siz manba tiliga murojaat qilishingiz kerak.
qo'shib qo'ydi muallif Andy Irving, manba
@Snowman: muammoli C ++ birikmalariga ega bo'lgan holda, C birikmalarini ochish bilan bog'liq hech qanday muammo yo'q.
qo'shib qo'ydi muallif Andy Irving, manba
O'ylaymanki, siz to'g'ri va pastga tushuvchilar sizning savolingizni noto'g'ri tushunishdi, lekin aslida sizning javobingiz potentsial noto'g'ri tushunishni ta'kidlash uchun beixtiyor: savol "C interfeysi bilan kutubxona" va "C ++ interfeysi bilan kutubxona" haqida emas, "C ++" da yozilgan C interfeysi bo'lgan kutubxonaga "butunlay" yozib qo'yilgan kutubxona.
qo'shib qo'ydi muallif Peter LeFanu Lumsdaine, manba
Men C ++ da C API bilan kutubxonani yozishni emas, balki C ni ishlatish uchun asosli sabablar bo'lganligi uchun emas, balki dinozavr bo'lishi kerak. Agar siz X tilida API uchun yozmoqchi bo'lsangiz, u C, FORTRAN, COBOL, BLISS yoki Java bo'lsin, har doim bu tilda yozishni osonlashtiradigan, osonroq va to'g'riroq bo'ladi, keyin esa merakli bir kishi uchun , ko'proq qiziqarli til va ikkita interfeys.
qo'shib qo'ydi muallif prosfilaes, manba
Men so'nggi marta tekshirganimdan so'ng, standart C ++ kutubxonasining ikki xil versiyasiga bog'lanish yomon edi va siz ikkita C ++ kutubxonasidan foydalanganda g'amxo'rlik qilishingiz kerak edi. Sinflarni C APIga tushirish oson; sinflarni yaxshi C APIga tushirish juda oson emas.
qo'shib qo'ydi muallif prosfilaes, manba
Shunday qilib siz foydali semantika va xususiyatlarga ega tilni tanlaysiz va keyin ularni C interfeysi sifatida tarjima qilishga majburlaysizmi? Sinflar va shablonlar bekor bo'lishi mumkin (lekin birinchi navbatda C ++ ni nima uchun ishlatayotganligingizni so'rashingiz mumkin), lekin har qanday funktsiya C bilan bog'lanish uchun ularni C kodidan qochish o'rniga istisnolar topishi kerak. C-mos keladigan kutubxonangizdan foydalanib, endi C ++ va uning ABI to'qnashuvlari va kutubxonadagi noto'g'ri gaplar bilan shug'ullanish kerak, shuningdek, C ning ABI to'qnashuvlari va kutubxonadagi noto'g'ri gaplarga qo'shimcha ravishda.
qo'shib qo'ydi muallif prosfilaes, manba

Boshqa til bilan aloqa qilishda ikkita asosiy oq narsa mavjud:

  • Xabar interfeysi bajarilishi mumkin bo'lgan tushunchalar: faqat qadriyatlarmi? havolalar bormi?
  • Interfeys "binarlarda" (ABI deb ataladi) qanday amalga oshiriladi

C ning ushbu ikkita jabhadagi ustunligi bor:

  • C only has mostly simple concepts, which appear in most every other language1
  • The ABI of C binaries is decided by the OS2

Keling, ko'pchilik tillarda "oddiy" yoki "oldindan mavjud" bo'lganligi sababli, ko'pchilik tillarda shunga o'xshash tushunchalar majmui mavjud. Lekin, bu ularning ahamiyati yo'q.

Aksincha, C ++ kompleks tushunchalarga ega va ABI-ga har bir kompilyator tomonidan qarorlar qabul qilinadi (garchi ko'pchilik Windows-dan tashqari Itanimum ABI-ga amal qiladi). Herb Sutter tomonidan ushbu muammolarni qisman ko'rib chiqish uchun OS-larni C ++ ABI-ni (har bir tizim asosida) tuzatish taklifi mavjud edi. Bundan tashqari, C ++ FFI bo'lishi mumkin, D uni 3 ni sinab ko'rish kerakligini ta'kidlash kerak.

1 Except variadics (...), those are not simple

2 Does C have a standard ABI?

3 Interfacing D to Legacy C++ code

2
qo'shib qo'ydi

Barcha javoblar haqiqiy muammoni yo'qotadi: C ++ kompilyatori "name mangling" ni joriy qiladi, shuning uchun ikkiliklar "oddiy" funktsiyalar bilan mos kelmaydi.

Barcha ABI materiallari uni standartlashtirishga urinishdan ko'ra ko'proq.

Umuman olganda, siz turli xil kompilyatorlar yordamida tuzilgan o'zaro bog'liqlik funktsiyalarini, hatto oddiy C ++-ga yopishib olsangiz ham, kafolatlangan emas. Ilgari ishonch hosil qilgan ular mos kelmas edi, lekin bugungi kunda standartlashtirish sirg'alib bormoqda;)

OTOH C "yuqori darajada assemble" bo'lib, barcha qulay interfeyslarni yaratishga mo'ljallangan. O'zaro tilni sevishni yaxshiroq muvofiqlashtirishi ajablantirmasligi kerak.

Yon eslatma: original C ++ kompilyatori (oldingi) kompilyatsiya qilinishi kerak bo'lgan C manbaini ishlab chiqardi, xuddi GCC kabi "kaput ostida" assotsiatsiyasini ishlab chiqardi.

2
qo'shib qo'ydi

Asosan u ABI standartlashtirishga tushadi. C va C ++ da standartlashtirilmagan ABI mavjud emas, lekin boshqa tillar o'zaro fayllar orasidagi o'zaro interfeyslarni ishlatish uchun ishlatilishi mumkin, C ham-fakto standartga aylandi, har kim uni biladi va har bir kishi tilda mavjud bo'lgan bir xil oddiy qoidalardan foydalanishi mumkin. turlari va funktsiya chaqiruvlari.

C ++ standarti ABIga ega bo'lishi mumkin, ammo Stroustrup birovning ehtiyojini ko'rmasligini aytdi. U shuningdek, kompilyator yozuvchilardan kelishuvga erishish qiyin bo'lishi mumkinligini aytdi (men shubhalanmasam ham - C ++ standart komiteti mavjud bo'lganlarga o'xshash ABIni chiqaradi va kompilyatorlar yozuvchilari o'z kompilyatorlarining navbatdagi versiyasini o'zgartirishi mumkin, ular ba'zan ikkiliklar bilan mos kelmaydi ularning kompilyatorlarining eski versiyalari bilan barpo etilgan - men yangi Sun kompilyatori bilan bir necha kutubxonani qayta yig'ish va eskilari bilan ishlamasliklarini topib qo'yganimni eslayman)

E'tibor bersangiz, ayrim kompaniyalar ABI standartlaridan foydalanishga o'tishgan, shunga qaramay, Microsoft 90-yillardagi ushbu usulni MAQOMOTI bilan boshlagan va bugun buni WinRT ABI (bu boshqa WinRT bilan aralashmaslik kerak emas) C yoki C ++ da yozilgan kutubxonalar bilan muloqot qilish uchun yoziladigan dasturlarga ruxsat beruvchi (masalan, Microsoft ning o'zlarining OS qatlami C ++ da yoziladi, WinRT orqali ta'sirlangan va har qanday OS ish vaqti tartibini chaqirganlarida C# ilovalari tomonidan iste'mol qilinadi)

Agar standartlar tanasi ko'tarilsa va bu vaziyatni bartaraf etmasa, hech kim hech narsa qila olmaydi. Microsoft, bu qiymatni ko'radi va ularni platforma uchun hal qilish uchun choralar ko'rdi.

Shunday qilib, javob C emas, balki tilni bog'lab turishini ta'minlaydi. Hech kim ularni quloq solmasdan va iste'mol qilmasa bo'ladi.

0
qo'shib qo'ydi