Apa perbedaan antara C, C99, ANSI C dan GNU C?

122

Saya sudah mulai berlatih pemrograman dengan codechef dan bingung dengan perbedaan antara C dan C99. Apa arti C di sini? Apakah C89? Periksa bahasa di bagian bawah kiriman ini . Ini berisi C dan C99.

Saya menemukan di internet sesuatu yang disebut GNU C. Apakah ada C yang berbeda untuk sistem linux / unix? Apakah ini sesuai dengan standar C oleh ANSI? Saya juga telah membaca di beberapa tempat "C99 strict". Apa ini?

Apakah ada standar C lain yang berbeda yang digunakan? Apakah ada yang disebut C 4.3.2 atau versi gcc yang digunakan saat ini?

EDIT:

Ini , Ini , Ini membantu. Saya akan mencari lebih banyak dan mengedit hal-hal yang masih belum terjawab.

Saya bukan pemula pemrograman. Saya tahu apa itu bahasa C. Saya tahu bahwa ada standar C yang berbeda oleh ANSI seperti C89, C99 dan C11.

Aseem Bansal
sumber
@Apakah saya tidak mencari banyak. Saya lakukan sekarang. Saya akan melakukan lebih banyak. dan edit pertanyaannya lagi.
Aseem Bansal
@Apakah saya tidak dapat menemukan tentang C99 yang ketat dan apakah C dalam codechef adalah C89 atau C asli non-standar sebelumnya
Aseem Bansal
1
Jangan lupa tentang POSIX C :-)
pmg

Jawaban:

216
  • Segala sesuatu sebelum standardisasi umumnya disebut "K&R C", setelah buku terkenal itu , dengan Dennis Ritchie, penemu bahasa C, sebagai salah satu penulisnya. Ini adalah "bahasa C" dari 1972-1989.

  • Standar C pertama dirilis tahun 1989 secara nasional di AS, oleh lembaga standar nasional ANSI. Rilis ini disebut C89 atau ANSI-C. Dari 1989-1990 ini disebut "bahasa C".

  • Setahun kemudian, standar Amerika diterima secara internasional dan diterbitkan oleh ISO (ISO 9899: 1990). Rilis ini disebut C90. Secara teknis, ini adalah standar yang sama dengan C89 / ANSI-C. Secara resmi, itu menggantikan C89 / ANSI-C, membuatnya usang. Dari 1990-1999, C90 adalah "bahasa C".

    Harap dicatat bahwa sejak tahun 1989, ANSI tidak ada hubungannya dengan bahasa C. Pemrogram yang masih berbicara tentang "ANSI C" umumnya tidak tahu apa artinya. ISO "memiliki" bahasa C, melalui standar ISO 9899.

  • Pembaruan kecil dirilis pada tahun 1995, kadang-kadang disebut sebagai "C95". Ini bukanlah revisi besar, melainkan amandemen teknis yang secara resmi dinamai ISO / IEC 9899: 1990 / Amd.1: 1995. Perubahan utama adalah pengenalan dukungan karakter yang luas.

  • Pada tahun 1999, standar C mengalami revisi besar (ISO 9899: 1999). Versi standar ini disebut C99. Dari 1999-2011, ini adalah "bahasa C".

  • Pada tahun 2011, standar C diubah lagi (ISO 9899: 2011). Versi ini disebut C11. Berbagai fitur baru seperti _Generic, _Static_assertdan dukungan utas ditambahkan ke bahasa. Pembaruan memiliki banyak fokus pada multi-core, multi-processing dan pengurutan ekspresi. Dari 2011-2017, ini adalah "bahasa C".

  • Pada 2017, C11 direvisi dan berbagai laporan kerusakan diselesaikan. Standar ini secara informal disebut C17 dan dirilis sebagai ISO 9899: 2018. Tidak ada fitur baru, hanya koreksi. Ini adalah versi bahasa C saat ini.


"C99 strict" kemungkinan mengacu pada pengaturan compiler yang memaksa compiler untuk mengikuti standar melalui surat. Ada istilah implementasi yang sesuai dalam standar C. Pada dasarnya ini berarti: "kompilator ini benar-benar mengimplementasikan bahasa C dengan benar". Program yang menerapkan bahasa C dengan benar secara formal disebut program yang benar- benar sesuai .

"GNU C" bisa berarti dua hal. Baik kompiler C itu sendiri yang datang sebagai bagian dari GNU Compiler Collection (GCC). Atau bisa juga berarti penyiapan default non-standar yang digunakan oleh compiler C GCC. Jika Anda mengkompilasi dengan gcc program.cmaka Anda tidak mengkompilasi sesuai dengan standar C, melainkan setup GNU non-standar, yang dapat disebut sebagai "GNU C". Misalnya, seluruh kernel Linux dibuat dengan GNU C non-standar, dan bukan C standar.

Jika Anda ingin mengkompilasi program Anda sesuai dengan standar C, Anda harus mengetik gcc -std=c99 -pedantic-errors. Ganti c99 dengan c11 jika versi GCC Anda mendukungnya.

Lundin
sumber
8
Pengaturan compiler yang ketat dapat berarti “Nonaktifkan ekstensi; gunakan hanya bahasa C yang ditentukan oleh standar "serta, atau lebih dari," kompilasi dengan benar ". Menerima ekstensi ke bahasa tersebut sepenuhnya benar; standar didefinisikan untuk memungkinkan itu.
Eric Postpischil
5
Ada juga C94 / C95 Amandemen 1 yang menambahkan dukungan karakter yang lebih luas, terutama. Lihat juga Daftar File Header Standar di C dan C ++ .
Jonathan Leffler
2
Anda menulis bahwa banyak hal berubah dari C90 ke C99. Bisakah Anda menyebutkan beberapa?
Martin Thoma
3
@Lundin Anda menautkan buku yang salah untuk K&R; ini adalah edisi kedua yang menjelaskan standar C89.
Antti Haapala
5
Ya, tapi intinya adalah bahwa itu bukanlah versi yang mendefinisikan bahasa pemrograman C sampai pada intinya; bukan karena itu akan dijual di mana saja.
Antti Haapala
7

Saya HARUS menanggapi tentang ANSI C. Meskipun ANSI belum melakukan apa pun dengannya, compiler masih dibangun untuk itu. Kompiler PIC XC16 misalnya: "Kompilator adalah kompilator yang sepenuhnya divalidasi yang sesuai dengan standar ANSI C seperti yang didefinisikan oleh spesifikasi ANSI (ANSI x3.159-1989) dan dijelaskan dalam Bahasa Pemrograman C Kernighan dan Ritchie (edisi kedua). ... "Tidak semua pemrograman untuk komputer" besar "seperti PC. Menulis kompiler untuk biaya perangkat Anda, dan memvalidasi biaya waktu & $. ANSI C hidup & sehat & hidup di perangkat tertanam / real-time Anda.

C Lebih Baik
sumber
4
  • ANSI C: Bahasa C pertama distandarisasi oleh badan yang disebut ANSI pada tahun 1989 oleh karena itu disebut c89.

  • C99:
    dengan permintaan dari persyaratan pengembang, pada 1999-2000 kata kunci dan fitur tambahan atau lebih lanjut telah disertakan dalam C99 (mis .: inline, boolean .. Menambahkan fungsi pustaka artematik floating point)

  • GNU C: GNU adalah sistem operasi mirip unix (www.gnu.org) & di mana proyek GNU membutuhkan bahasa pemrograman C berdasarkan standar ANSI C. GNU menggunakan kompiler GCC (GNU Compiler Collection) untuk mengkompilasi kode. Ini memiliki fungsi perpustakaan C yang mendefinisikan panggilan sistem seperti malloc, calloc, exit ... dll

ANSI C adalah standar yang digunakan oleh atau mengacu pada standar lainnya.

Kapil Chittewan
sumber
Apa pun tentang C99 yang ketat dan apakah C di codechef adalah C89 atau C asli non-standar sebelumnya
Aseem Bansal
Koreksi: ANSI C adalah standar usang, yang hanya dirujuk oleh dokumen kedaluwarsa. Bahasa C disebut ISO C, atau jika Anda akan ISO / IEC 9899: 2011.
Lundin
1

Selain Jawaban Lundin

Inilah Yang Dikatakan Dennis Richie Saat Ditanyakan

"Mengapa K&R tidak menunggu final, standar ANSI yang disetujui sebelum menulis K&R edisi ke-2?"

Mengapa K&R tidak menunggu final, standar ANSI yang disetujui sebelum menulis K&R edisi ke-2? Sepertinya buku ini hanya akan menjadi standar yang benar untuk beberapa bulan sebelum digantikan oleh standar akhir ANSI. Saya tahu bahwa kemungkinan akan ada sedikit perubahan besar pada tahap akhir ini, tetapi mengapa tidak menunggu beberapa bulan dan memastikan Anda melakukannya 100% dengan benar, daripada harus segera menulis edisi ke-3 atau menjadi usang?

Kami pikir akan menyenangkan untuk menandai ulang tahun ke 10 edisi pertama. Lebih serius lagi, kami mulai bekerja musim panas lalu karena kami punya waktu dan keinginan saat itu, dan tampaknya X3J11 mendekati akhir. Pada bulan Desember dan Januari, saat kami menyelesaikannya, kami mempertimbangkan apakah kemungkinan perubahan penting memerlukan penundaan pengiriman, dan (setelah mendiskusikan masalah tersebut dengan penerbit) memutuskan bahwa tidak ada gunanya menunggu. PH menginginkannya, dan baik Brian maupun saya menginginkannya dari agenda kami.

Bahkan jika ada perubahan dalam standar, sulit membayangkan bahwa mereka akan cukup ekstensif untuk menjamin edisi baru. (Kami bahkan siap untuk mengatasi entah bagaimana noalias, jika itu bertahan.) Kami siap untuk membuat perubahan yang diperlukan dalam pencetakan mendatang, tetapi ada alasan untuk berharap bahwa itu harus kecil. Anggota X3J11 sangat ingin menyelesaikan tanpa mengejutkan orang juga; banyak dari mereka bekerja untuk perusahaan yang sedang mempersiapkan kompiler ANSI.

Dennis Ritchie

Suraj Jain
sumber
1
Terlalu buruk Dennis Ritchie tidak menyadari betapa aliasing aturan akan digunakan untuk menyiratkan bahwa kompiler tidak harus membuat setiap usaha untuk mengenali bentuk yang berguna dari aliasing, tetapi berpendapat bahwa programmer yang kode rusak oleh compiler tumpul harus "terima" kompiler untuk menunjukkan kepada mereka kode mereka adalah "cacat" - jika tidak, dia bisa saja memberi tahu orang-orang yang mendorong aturan tersebut untuk menjelaskan bahwa penolakan untuk mendukung aliasing di luar persyaratan minimal Standar akan membuat kompiler tidak sesuai untuk beberapa tujuan, dan kebutuhan kode tingkat rendah untuk aliasing adalah bukan cacat.
supercat
@supercat Saya sebenarnya tidak mengerti apa arti aturan aliasing, bisakah Anda membantu saya?
Suraj Jain
1
Konsep aslinya adalah bahwa kode tertentu seperti int i; int test(double *p) { i=1; *p=2.0; return i; }kompiler tidak perlu dimuat ulang isetelah menulis ke *pjika pmungkin menyimpan alamat i. Sangat masuk akal. Masalahnya adalah compiler modern menggunakan aturan yang sama untuk membenarkan asumsi yang menulis ke a long*tidak akan memengaruhi a long long, meskipun kedua jenis memiliki ukuran dan representasi yang sama , dan bahkan jika dua struktur berbagi Common Initial Sequence, kode tidak akan pernah menggunakan penunjuk satu jenis untuk membaca anggota CIS yang ditulis melalui jenis lainnya.
supercat
-2

Pertanyaan ini tidak benar-benar dicari di internet untuk mendapatkan jawaban, bagaimanapun Anda dapat melihat ini:

  1. C adalah bahasa pemrograman serba guna yang awalnya dikembangkan oleh Dennis Ritchie antara 1969 dan 1973 di AT&T Bell Labs.
  2. C99 adalah standar bahasa C yang diterbitkan oleh ISO dan diadopsi oleh ANSI sekitar tahun 1999.
  3. GNU C hanyalah perpanjangan dari c89, sementara beberapa fitur c99 juga ditambahkan, tetapi secara keseluruhan berbeda dari standar c99 jadi ketika mengkompilasi di gcc kita harus memasukkan -std=c99yang sudah disebutkan di jawaban lain.
  4. ANSI C adalah serangkaian standar berturut-turut yang dirilis oleh ANSI.
0desimal0
sumber
Saya mencari di internet sekarang. Saya mengedit pertanyaan itu. Saya tahu tentang standar C dan ANSI sebelum memposting pertanyaan. Saya mengalami kebingungan tentang hal-hal tertentu. Saya akan mencoba lebih tepat.
Aseem Bansal
Apa pun tentang C99 yang ketat dan apakah C di codechef adalah C89 atau C asli non-standar sebelumnya
Aseem Bansal
4
Jawaban ini mengandung banyak kesalahan. C99 adalah standar yang ditetapkan oleh ISO sekitar tahun 1999. Bahasa C telah distandarisasi secara internasional selama 23 tahun. Jadi ANSI tidak ada hubungannya dengan itu, mereka belum menyentuh standar C dalam 24 tahun. Saat ini mereka hanya mencetak dan mendistribusikan standar ISO untuk pasar Amerika.
Lundin
@LinLin Oh !! ya, sebenarnya saya menulis "didefinisikan" yang tidak terjadi, itu harus "diadopsi" di sana. saya membuat koreksi, ANSI merilis standar pertama untuk C pada tahun 1989 yang diadopsi oleh ISO. setelah itu hampir semua standar dirilis oleh ISO dan diadopsi oleh ANSI, dan jawabannya singkat seperti yang ditanyakan, jadi saya hanya menyebutkan beberapa hal yang membuat jawabannya tetap singkat.
0decimal0
1
Perhatikan bahwa gccmendukung -std=c89dan -std=gnu89dan -std=c99dan -std=gnu99(dan versi yang cukup modern mendukung -std=c11dan -std=gnu11). Perbedaannya adalah berkaitan dengan ekstensi di atas Standar C yang tersedia secara otomatis atau hanya jika sumber mendorong kompilator untuk menyediakan makro yang sesuai (seperti -D_XOPEN_SOURCE=700).
Jonathan Leffler