Apa itu perpustakaan runtime C?

158

Apa sebenarnya perpustakaan runtime C dan untuk apa digunakan? Saya mencari, Googling seperti setan, tetapi saya tidak dapat menemukan yang lebih baik daripada Microsoft: "Perpustakaan run-time Microsoft menyediakan rutin untuk pemrograman untuk sistem operasi Microsoft Windows. Rutin ini mengotomatiskan banyak tugas pemrograman umum yang tidak disediakan oleh bahasa C dan C ++. "

OK, saya mengerti, tapi misalnya, ada apa libcmt.lib? Apa fungsinya? Saya pikir bahwa perpustakaan standar C adalah bagian dari kompiler C. Jadi apakah libcmt.libimplementasi Windows dari fungsi pustaka standar C berfungsi di bawah win32?

B.Gen.Jack.O.Neill
sumber

Jawaban:

71

Ya, libcmt adalah (salah satu dari beberapa) implementasi perpustakaan standar C yang disediakan dengan kompiler Microsoft. Mereka menyediakan versi "debug" dan "rilis" dari tiga jenis pustaka dasar: single-threaded (selalu terhubung secara statis), multi-threaded yang terhubung secara statis , dan multi-threaded yang terhubung secara dinamis (meskipun, tergantung pada versi kompiler yang Anda menggunakan, beberapa di antaranya mungkin tidak ada).

Jadi, dalam nama "libcmt", "libc" adalah nama tradisional (kurang lebih) untuk pustaka C. "Mt" berarti "multi-utas". Versi "debug" akan memiliki "d" yang ditambahkan di akhir, memberikan "libcmtd".

Sejauh fungsi apa yang dicakupnya, standar C (bagian 7, jika Anda benar-benar peduli) mendefinisikan serangkaian fungsi yang harus disediakan oleh implementasi yang sesuai (dihosting). Sebagian besar vendor (termasuk Microsoft) menambahkan sendiri berbagai fungsi lainnya (untuk kompatibilitas, untuk memberikan kemampuan yang tidak ditangani oleh fungsi standar, dll.) Dalam kebanyakan kasus, ini juga akan berisi beberapa fungsi "internal" yang digunakan oleh kompiler tetapi tidak biasanya oleh pengguna akhir.

Jika Anda ingin mendapatkan daftar lengkap fungsi di "libcmt" (untuk menggunakan contoh Anda), Anda bisa membuka salah satu perintah perintah Visual Studio (di bawah "Visual Studio Tools", biasanya), beralih ke direktori di mana perpustakaan Anda berada diinstal, dan ketik sesuatu seperti: lib -list libcmt.libdan itu akan menghasilkan daftar ( panjang ) dari semua file objek di pustaka itu. Itu tidak selalu berhubungan langsung dengan nama fungsi, tetapi umumnya akan memberikan ide. Jika Anda ingin melihat file objek tertentu, Anda dapat menggunakan lib -extractuntuk mengekstrak salah satu file objek tersebut, lalu gunakan dumpbin /symbols <object file name>untuk menemukan fungsi apa yang ada dalam file objek tertentu.

Jerry Coffin
sumber
37
Anda belum memberi tahu apa "C runtime library" itu !!
onmyway133
4
@entropy: Tentu terlihat seperti yang saya lakukan, tetapi jawaban singkatnya adalah kumpulan fungsi, banyak (tapi tidak semua) yang ditentukan di bagian 7 dari standar C.
Jerry Coffin
3
Jawaban ini menyiratkan pustaka C hanyalah bagian dari kumpulan alat kompiler. Tidak akurat.
jiggunjer
@JerryCoffin Pertanyaan: jadi apakah strcpyfungsi dari pustaka standar C, misalnya, apakah implementasinya di pustaka runtime, atau apakah hanya memiliki kodenya dalam file c normal?
forumulator
@forumulator: biasanya akan ada kode sumber dalam file .c yang dikompilasi untuk menghasilkan pustaka standar yang tepat (the ..dll, lib, .a, .so, atau apa pun yang terjadi untuk diterapkan pada sistem yang Anda gunakan) .
Jerry Coffin
57

Pada awalnya, kita harus memahami apa itu Perpustakaan Runtime; dan pikirkan apa yang dimaksud dengan "Perpustakaan Microsoft C Runtime".

lihat: http://en.wikipedia.org/wiki/Runtime_library

Saya telah memposting sebagian besar artikel di sini karena mungkin akan diperbarui.

Ketika kode sumber dari program komputer diterjemahkan ke dalam bahasa target masing-masing oleh kompiler, itu akan menyebabkan pembesaran ekstrim dari kode program jika setiap perintah dalam program dan setiap panggilan ke fungsi built-in akan menyebabkan generasi in-place dari kode program masing-masing lengkap dalam bahasa target setiap kali. Sebaliknya kompiler sering menggunakan fungsi bantu spesifik-kompiler di pustaka runtime yang sebagian besar tidak dapat diakses oleh pemrogram aplikasi. Bergantung pada pembuat kompiler, pustaka runtime kadang-kadang juga akan berisi pustaka standar dari masing-masing kompiler atau terkandung di dalamnya.

Juga beberapa fungsi yang hanya dapat dilakukan (atau lebih efisien atau akurat) pada saat runtime diimplementasikan di perpustakaan runtime, misalnya beberapa kesalahan logika, pemeriksaan batas array, pemeriksaan tipe dinamis, penanganan pengecualian dan kemungkinan fungsi debugging. Untuk alasan ini, beberapa bug pemrograman tidak ditemukan sampai program diuji dalam lingkungan "langsung" dengan data nyata, meskipun pengujian waktu kompilasi dan pengujian pra-rilis yang canggih. Dalam hal ini, pengguna akhir dapat menemukan pesan kesalahan runtime.

Biasanya pustaka runtime menyadari banyak fungsi dengan mengakses sistem operasi. Banyak bahasa pemrograman memiliki fungsi bawaan yang tidak harus diwujudkan dalam kompiler, tetapi dapat diimplementasikan di perpustakaan runtime. Jadi batas antara pustaka runtime dan pustaka standar terserah pabrikan kompiler. Oleh karena itu perpustakaan runtime selalu spesifik-kompiler dan platform-spesifik.

Konsep pustaka runtime tidak boleh disamakan dengan pustaka program biasa seperti yang dibuat oleh pemrogram aplikasi atau disampaikan oleh pihak ketiga atau pustaka dinamis, artinya pustaka program yang ditautkan saat dijalankan. Sebagai contoh, bahasa pemrograman C hanya membutuhkan perpustakaan runtime minimal (umumnya disebut crt0) tetapi mendefinisikan perpustakaan standar besar (disebut perpustakaan standar C) yang harus diberikan oleh setiap implementasi.

fantagons
sumber
3
Kalimat yang disorot sebagai cara membedakan dari perpustakaan standar adalah jawaban akurat singkat pertama yang saya lihat tidak memenuhi syarat dengan "sebagian besar" atau "kadang-kadang."
nik.shornikov
@ nik.shornikov: Itu karena deskripsi lain berusaha lebih akurat. Walaupun memang benar bahwa perpustakaan standar biasanya khusus untuk kompiler dan platform, itu tidak selalu benar. Sebagai contoh, setidaknya beberapa versi kompiler C ++ Mingw dan Intel untuk Windows telah menggunakan pustaka standar Microsoft alih-alih memasok sendiri. Demikian juga, Dentang di Linux dapat (dan sering) diinstal untuk menggunakan perpustakaan standar dalam instalasi gcc yang ada daripada menginstal yang lain untuk dirinya sendiri.
Jerry Coffin
Saya cukup yakin mungkin untuk menulis implementasi dari pustaka standar C dan C ++ yang portabel untuk platform apa pun yang mendukung POSIX.
Jerry Coffin
21

Saya hanya bertanya sendiri dan melukai otak saya selama beberapa jam. Masih tidak menemukan apa pun yang benar-benar ada benarnya. Setiap orang yang menulis sesuatu pada suatu topik tidak dapat benar-benar "mengajar". Jika Anda ingin mengajar seseorang, ambillah bahasa yang paling dasar yang dipahami seseorang, jadi dia tidak perlu peduli dengan topik lain saat menangani suatu topik. Jadi saya sampai pada kesimpulan untuk diri saya sendiri yang tampaknya cocok dalam semua kekacauan ini.

Dalam bahasa pemrograman C, setiap program dimulai dengan main()fungsi. Bahasa lain mungkin mendefinisikan fungsi lain di mana program dimulai. Tetapi prosesor tidak tahu main(). Sebuah prosesor hanya tahu perintah yang telah ditentukan, diwakili oleh kombinasi dari 0dan 1.

Dalam pemrograman mikroprosesor, tidak memiliki sistem operasi yang mendasarinya (Microsoft Windows, Linux, MacOS, ..), Anda perlu memberi tahu prosesor secara eksplisit di mana harus mulai dengan mengatur ProgramCounter(PC) yang diulang dan dilompati (loop, panggilan fungsi) di dalam perintah yang dikenal prosesor. Anda perlu tahu seberapa besar RAM, Anda perlu mengatur posisi tumpukan program (variabel lokal), serta posisi tumpukan (variabel dinamis) dan lokasi variabel global (saya kira itu disebut SSA ?) dalam RAM. Sebuah prosesor tunggal hanya dapat menjalankan satu program pada satu waktu.

Di situlah sistem operasi masuk. Sistem operasi itu sendiri adalah program yang berjalan pada prosesor. Program yang memungkinkan eksekusi kode khusus. Menjalankan banyak program sekaligus dengan beralih di antara kode eksekusi program (yang dimuat ke dalam RAM). Tetapi sistem operasinya ADALAH PROGRAM, setiap program ditulis secara berbeda. Cukup dengan memasukkan kode program khusus Anda ke dalam RAM tidak akan menjalankannya, sistem operasi tidak mengetahuinya. Anda perlu memanggil fungsi pada sistem operasi yang mendaftarkan program Anda, beri tahu sistem operasi berapa banyak memori yang dibutuhkan program, di mana titik masuk ke dalam program berada (main()fungsi dalam kasus C). Dan inilah yang saya kira terletak di Perpustakaan Runtime, dan menjelaskan mengapa Anda memerlukan perpustakaan khusus untuk setiap sistem operasi, karena ini hanyalah program itu sendiri dan memiliki fungsi yang berbeda untuk melakukan hal-hal ini.

Ini juga menjelaskan mengapa itu TIDAK terkait secara dinamis saat runtime seperti .dllfile, bahkan jika itu disebut Perpustakaan RUNTIME. Perpustakaan Runtime perlu ditautkan secara statis, karena itu diperlukan saat memulai program Anda. Perpustakaan Runtime menyuntikkan / menghubungkan program kustom Anda ke / ke program lain (sistem operasi) di RUNTIME. Ini benar-benar menyebabkan ...

Kesimpulan: Perpustakaan RUNTIME gagal dalam penamaan. Mungkin tidak ada .dll(menghubungkan saat runtime) di masa-masa awal dan masalah memahami perbedaan sama sekali tidak ada. Tetapi bahkan jika ini benar, nama itu dipilih dengan buruk.

Nama yang lebih baik untuk Runtime Library dapat berupa: StartupLibrary / OSEntryLibrary / SystemConnectLibrary / OSConnectLibrary

Saya harap saya benar, untuk koreksi / ekspansi. Bersulang.

Gemuruh
sumber
1
Saya masih belum mendapatkan ideia. Mengapa suatu program membutuhkan sesuatu di Runtime? Mengapa kode biner tidak dapat berjalan, 100% sendiri, tanpa ada yang mendukungnya saat runtime? Atau dengan kata lain: Apakah mungkin untuk memiliki kode yang menjalankan 100% tanpa apa pun (termasuk OS)?
MarcioAB
5
Secara teori, sebuah program tidak membutuhkan RTL. Namun, bagaimana program Anda akan menampilkan hasilnya atau mengambil input atau meminta memori tanpa kerja sama dari sistem operasi?
SN
16

C adalah bahasa dan dalam definisinya, tidak perlu ada fungsi yang tersedia untuk Anda. Tidak ada IO, tidak ada rutinitas matematika dan sebagainya. Secara konvensional, ada satu set rutin yang tersedia untuk Anda yang dapat Anda tautkan ke executable Anda, tetapi Anda tidak perlu menggunakannya. Namun, ini adalah hal yang umum dilakukan sehingga sebagian besar penghubung tidak meminta Anda untuk menautkan ke pustaka runtime C lagi.

Ada kalanya Anda tidak menginginkannya - misalnya, dalam bekerja dengan sistem embedded, mungkin tidak praktis untuk memiliki malloc, misalnya. Saya dulu bekerja menanamkan PostScript ke dalam printer dan kami memiliki perpustakaan runtime kami sendiri yang jauh lebih bahagia di sistem embedded, jadi kami tidak repot dengan "standar".

alas tiang
sumber
11
Sebenarnya, standar C menjelaskan dua jenis lingkungan C - "berdiri bebas" dan "host" - dan, dalam lingkungan host, fungsi yang dijelaskan dalam standar yang ditetapkan sebagai tersedia. Dalam sistem tertanam, lingkungan C biasanya berdiri bebas, sehingga Anda mungkin tidak memiliki rutinitas perpustakaan, atau Anda mungkin dapat menghindari menggunakan beberapa dan menggunakan penggantian Anda sendiri.
10

Perpustakaan runtime adalah perpustakaan yang secara otomatis dikompilasi untuk setiap program C yang Anda jalankan. Versi pustaka yang akan Anda gunakan tergantung pada kompiler, platform, opsi debugging, dan opsi multithreading Anda.

Deskripsi yang baik dari berbagai pilihan untuk pustaka runtime: http://www.davidlenihan.com/2008/01/choosing_the_correct_cc_runtim.html

Ini mencakup fungsi-fungsi yang biasanya Anda anggap tidak perlu perpustakaan untuk memanggil:

  • malloc
  • enum, struct
  • abs, min
  • menegaskan

Microsoft memiliki daftar fungsi runtime library yang bagus:

http://msdn.microsoft.com/en-us/library/2aza74he(VS.71).aspx

Daftar fungsi yang tepat akan bervariasi tergantung pada kompiler, jadi untuk iOS Anda akan mendapatkan fungsi lain seperti dispatch_async () atau NSLog ().

arinmorf
sumber
1
Apakah struct dan enum benar-benar perpustakaan runtime?
Dean P
6

Jika Anda menggunakan alat seperti Dependency Walker pada executable yang dikompilasi dari C atau C ++, Anda akan melihat bahwa salah satu DLL yang menjadi sandarannya adalah MSVCRT.DLL. Ini adalah Perpustakaan Microsoft C Runtime. Jika Anda memeriksa MSVCRT.DLL lebih lanjut dengan DW, Anda akan melihat bahwa ini adalah tempat semua fungsi seperti printf (), menempatkan (0, mendapat (), atoi () dll hidup.


sumber
6
Hanya jika saat mengompilasi executable itu, runtime C dihubungkan secara dinamis. Jika dikaitkan secara statis, walker ketergantungan akan menunjukkan nothiing
Eli Bendersky
4

Saya pikir definisi Microsoft sangat berarti:

Implementasi Microsoft dari run-time library C standar menyediakan ...

Andrey
sumber
3

Ada tiga bentuk pustaka C Run-time yang disediakan dengan Win32 SDK:

* LIBC.LIB is a statically linked library for single-threaded programs.
* LIBCMT.LIB is a statically linked library that supports multithreaded programs.
* CRTDLL.LIB is an import library for CRTDLL.DLL that also supports multithreaded programs. CRTDLL.DLL itself is part of Windows NT. 

Microsoft Visual C ++ edisi 32-bit berisi tiga bentuk ini juga, namun, CRT dalam DLL bernama MSVCRT.LIB. DLL dapat didistribusikan kembali. Namanya tergantung pada versi VC ++ (yaitu MSVCRT10.DLL atau MSVCRT20.DLL). Perhatikan bahwa MSVCRT10.DLL tidak didukung pada Win32s, sedangkan CRTDLL.LIB didukung pada Win32s. MSVCRT20.DLL hadir dalam dua versi: satu untuk Windows NT dan yang lainnya untuk Win32s.

lihat: http://support.microsoft.com/?scid=kb%3Ben-us%3B94248&x=12&y=9

Michael
sumber