Apa perbedaan antara "STL" dan "C ++ Standard Library"?

446

Seseorang membawa artikel ini ke perhatian saya bahwa klaim (saya memparafrasekan) istilah STL disalahgunakan untuk merujuk ke seluruh Perpustakaan Standar C ++ daripada bagian-bagian yang diambil dari SGI STL.

(...) ini mengacu pada "STL", meskipun faktanya sangat sedikit orang masih menggunakan STL (yang dirancang di SGI).

Bagian dari C + + Standard Library didasarkan pada bagian dari STL, dan bagian inilah yang banyak orang (termasuk beberapa penulis dan cplusplus.com yang terkenal error-ridden) masih disebut sebagai "STL". Namun, ini tidak akurat; memang, standar C ++ tidak pernah menyebutkan "STL", dan ada perbedaan konten antara keduanya.

(...) "STL" jarang digunakan untuk merujuk pada bit stdlib yang kebetulan didasarkan pada SGI STL. Orang-orang berpikir itu adalah seluruh perpustakaan standar. Itu bisa dimasukkan pada CV. Dan itu menyesatkan.

Saya hampir tidak tahu apa-apa tentang sejarah C ++ jadi saya tidak bisa menilai kebenaran artikel itu. Haruskah saya tidak menggunakan istilah STL? Atau ini opini yang terisolasi?

Pieter
sumber
62
Orang-orang membutuhkan nama yang baik untuk menggambarkan sesuatu. Jenius Stepanov mengubah cara kita memprogram. Nama seperti "pemrograman perpustakaan standar" sama sekali tidak berguna untuk menggambarkan itu. Sebut saja "pemrograman stl" dan semua orang tahu apa yang Anda maksud. Berargumen tentang hal itu tidak tepat: kita perlu nama baik.
Hans Passant
34
@Hans: Tidak, Anda melewatkan intinya: " semua orang tahu apa yang Anda maksudkan" tidak benar .
Lightness Races dalam Orbit
16
Saya tidak tahu apa yang Anda maksud.
Hans Passant
21
Berikut ini adalah contoh sempurna dari seseorang yang menggunakan "STL" untuk merujuk ke seluruh Perpustakaan Standar C ++. Itu terus membingungkan saya bahwa begitu banyak orang bersumpah bahwa tidak ada yang pernah melakukan ini, ketika jelas terlihat hampir setiap hari.
Lightness Races di Orbit
19
2,747 hasil untuk "stl stream" di Stack Overflow .
Lightness Races di Orbit

Jawaban:

571

"STL" ditulis oleh Alexander Stepanov pada hari-hari jauh sebelum C ++ distandarisasi. C ++ ada sejak tahun 80-an, tetapi apa yang sekarang kita sebut " C ++ " adalah bahasa yang distandarisasi dalam ISO / IEC 14882: 2014 (dan versi sebelumnya, seperti ISO / IEC 14882: 2011).

STL sudah banyak digunakan sebagai perpustakaan untuk C ++, memberikan akses programmer ke wadah, iterator dan algoritma. Ketika standardisasi terjadi, komite bahasa merancang bagian-bagian dari Perpustakaan Standar C ++ (yang merupakan bagian dari standar bahasa) untuk sangat cocok dengan STL.

Selama bertahun-tahun, banyak orang - termasuk penulis buku terkemuka, dan berbagai situs web - terus menyebut Perpustakaan Standar C ++ sebagai "STL", meskipun kedua entitas itu terpisah dan ada beberapa perbedaan. Perbedaan-perbedaan ini bahkan lebih nyata dalam standar C ++ baru yang akan datang, yang mencakup berbagai fitur dan secara signifikan mengubah beberapa kelas.

STL asli sekarang sering disebut "implementasi Perpustakaan Template Standar C ++" (agak mundur ke sejarah aktual!), Dengan cara yang sama seperti Microsoft Visual Studio atau GCC Anda mengirimkan implementasi Perpustakaan Standar C ++. Tetapi "Perpustakaan Templat Standar" dan "Perpustakaan Standar" bukanlah hal yang sama.

Pertempurannya adalah tentang apakah Perpustakaan Standar saat ini harus disebut "STL" secara keseluruhan atau sebagian, dan / atau apakah itu penting apa namanya.

Untuk "STL"

Ada aliran pemikiran yang mengatakan bahwa semua orang sekarang tahu bahwa "STL" berarti perpustakaan standar, sama seperti semua orang sekarang tahu bahwa "C ++" adalah bahasa berstandar ISO.

Ini juga termasuk mereka yang percaya bahwa itu tidak masalah asalkan semua pihak mengerti apa yang sedang dibicarakan.

Ini adalah istilah yang dibuat lebih lazim oleh sifat binatang, banyak yang membuat penggunaan fitur C ++ dikenal sebagai "templat".

Untuk "C ++ Standard Library" (atau stdlib)

Namun, ada aliran pemikiran lain - yang saya ikuti - yang mengatakan bahwa ini membingungkan. Orang yang belajar C ++ untuk pertama kalinya tidak tahu perbedaan ini, dan mungkin tidak melihat perbedaan bahasa yang kecil.

Penulis artikel itu telah berkali-kali bertemu dengan orang-orang yang percaya bahwa seluruh C + + Standard Library adalah STL, termasuk fitur yang tidak pernah menjadi bagian dari STL itu sendiri. Sebagian besar pendukung vokal "STL", sebaliknya, tahu persis apa yang mereka maksud dengan itu dan menolak untuk percaya bahwa tidak semua orang "mendapatkannya". Jelas, penggunaan istilah ini tidak seragam.

Selain itu, ada beberapa perpustakaan seperti STL yang sebenarnya merupakan implementasi dari STL asli, bukan Perpustakaan Standar C ++. Sampai baru-baru ini, STLPort adalah salah satu dari mereka (dan bahkan di sana, kebingungan berlimpah!).

Lebih lanjut, Standar C ++ tidak mengandung teks "STL" di mana saja, dan beberapa orang terbiasa menggunakan frasa seperti "STL termasuk dalam Perpustakaan Standar C ++", yang jelas-jelas salah.

Adalah keyakinan saya bahwa terus menyebarkan penggunaan istilah dengan cara ini hanya akan menyebabkan kesalahpahaman berlangsung selamanya. Sayangnya, mungkin sama sekali tidak produktif untuk mencoba mengubah sesuatu, bahkan jika itu seharusnya menjadi lebih baik. Kita mungkin terjebak dengan makna ganda selamanya.

Kesimpulan

Saya menghargai bahwa posting ini sedikit bias: Saya menulis artikel yang Anda tautkan. :) Pokoknya, saya harap ini membantu menjelaskan pertempuran sedikit lebih baik.

Pembaruan 13/04/2011

Berikut adalah tiga contoh sempurna seseorang yang menggunakan "STL" untuk merujuk ke seluruh Perpustakaan Standar C ++. Itu terus membingungkan saya bahwa begitu banyak orang bersumpah bahwa tidak ada yang pernah melakukan ini, ketika jelas terlihat hampir setiap hari.

Lightness Races di Orbit
sumber
136
The S tandard T emplate L ibrary tidak hanya diciptakan oleh St epanov dan L ee, tapi mereka juga bekerja di S oftware T echnology L aboratory pada saat itu.
Kragen Javier Sitaker
21
Adakah seseorang hari ini yang menanyakan header apa yang std::iotaada di dalamnya, karena ia tidak dapat membuatnya berfungsi. Ini adalah ekstensi non-standar SGI , yang mereka sebut "standar" ketika cocok untuk mereka karena itu "STL", dan semua orang tahu bahwa "STL" adalah bagian dari Perpustakaan Standar C ++, kan? Dan itu diperkenalkan di C ++ 0x, tetapi tidak tersedia di C ++ 03. Grrr.
Lightness Races in Orbit
40
Dan MS STL dikelola oleh S tephan T . L avavej, alias STL.
Mihaela
26
Bjarne Stroustrup secara khusus membedakan STL dari bagian lain dari Perpustakaan Standar dalam "kanon", Bahasa Pemrograman C ++ Edisi ke-4.
codenheim
84

Tidak ada satu jawaban pun yang benar. Alexander Stepanov mengembangkan perpustakaan yang disebutnya STL (bekerja untuk HP pada saat itu). Perpustakaan itu kemudian diusulkan untuk dimasukkan dalam standar C ++.

Itu pada dasarnya pengembangan "bercabang". Panitia memasukkan beberapa bagian, menolak yang lain sepenuhnya, dan mendesain ulang beberapa (dengan partisipasi Alexander). Pengembangan perpustakaan asli kemudian dipindahkan ke Silicon Graphics, tetapi dilanjutkan secara terpisah dari perpustakaan standar C ++.

Setelah potongan-potongan yang ditambahkan ke dalam perpustakaan standar, beberapa bagian lain dari perpustakaan standar yang dimodifikasi untuk lebih cocok dengan apa yang telah ditambahkan (misalnya, begin, end, rbegindan rendditambahkan ke std::stringsehingga dapat digunakan seperti wadah). Sekitar waktu yang sama, sebagian besar perpustakaan (bahkan potongan-potongan yang sama sekali tidak terkait) dibuat menjadi template untuk mengakomodasi berbagai jenis (misalnya, aliran standar).

Beberapa orang juga menggunakan STL sebagai bentuk singkat dari "Perpustakaan Standar".

Itu berarti ketika seseorang menggunakan istilah "STL" mereka bisa merujuk ke salah satu dari sekitar setengah lusin hal yang berbeda. Baik atau buruk, kebanyakan orang yang menggunakannya tampaknya mengabaikan banyaknya makna, dan menganggap bahwa semua orang akan mengenali apa yang mereka maksudkan. Hal ini menyebabkan banyak kesalahpahaman, dan setidaknya beberapa perang api serius yang membuat sebagian besar peserta terlihat bodoh karena mereka hanya membicarakan hal-hal yang sama sekali berbeda.

Sayangnya, kebingungan cenderung berlanjut tanpa henti. Jauh lebih nyaman untuk merujuk ke "STL" daripada sesuatu seperti "wadah, iterator, dan algoritme di pustaka standar C ++, tetapi tidak termasuk std::string, meskipun dapat bertindak seperti wadah." Meskipun "perpustakaan standar C ++" tidak cukup panjang dan canggung seperti itu, "STL" masih jauh lebih pendek dan lebih sederhana lagi. Sampai atau kecuali seseorang menemukan istilah yang lebih tepat (bila perlu), dan sama nyamannya, "STL" akan terus digunakan dan kebingungan akan terus terjadi.

Jerry Coffin
sumber
5
@ Jerry: Mantan; itulah arti "std". :)
Lightness Races dalam Orbit
6
@ Jerry: Tidak yakin di mana ruang nama masuk ke dalamnya. Implementasi yang sesuai tidak menambahkan apa pun ke namespace std. Saya berbicara tentang "std" di "stdlib", yang merupakan singkatan dari "standar". Saya pikir cukup jelas apa artinya itu!
Lightness Races dalam Orbit
3
@ Jerry: Saya benar-benar tidak berpikir bahwa mengharapkan seseorang untuk membaca kata sifat "standar" karena "ini dalam standar". Sementara itu, 17.4.3.1/1 cukup jelas bahwa menambahkan sesuatu ke namespace stdadalah UB kecuali dalam beberapa kasus tertentu: kasus-kasus tambahan ini disebutkan dalam standar, dan dengan demikian masih sesuai; "standar" masih berlaku.
Lightness Races dalam Orbit
1
Sejarah SGI dan HP di sini terbelakang. Stepanov di HP sebelum dia di SGI.
Kragen Javier Sitaker
2
Saya hanya membaca ulang komentar di sini dan berpikir itu layak menambahkan satu lagi (diakui minor) poin: Saya pikir itu sedikit sulit untuk mengharapkan "standar" selalu berarti "ini dalam standar". Secara khusus, banyak C ++ programmer menggunakan ungkapan "standar perpustakaan" jauh sebelum ada adalah standar. Jangan sampai mereka berpikir bahwa mereka merujuk ke perpustakaan dalam standar C, saya akan menunjukkan bahwa hal yang sama juga berlaku untuk programmer C sebelum ada (bahkan konsep) standar C.
Jerry Coffin
52

Istilah "STL" atau "Perpustakaan Templat Standar" tidak muncul di mana pun dalam standar ISO 14882 C ++. Jadi merujuk ke pustaka standar C ++ sebagai STL salah. Istilah "C ++ Standard Library" atau "library standar" adalah apa yang secara resmi digunakan oleh ISO 14882:

Standar ISO 14882 C ++:

17 - Pengantar Perpustakaan [lib.library]:

  1. Klausa ini menjelaskan konten Perpustakaan Standar C ++ , bagaimana program C ++ yang terbentuk dengan baik menggunakan perpustakaan, dan bagaimana implementasi yang sesuai dapat menyediakan entitas di perpustakaan.

...

STL adalah perpustakaan yang awalnya dirancang oleh Alexander Stepanov, independen dari standar C ++. Namun, beberapa komponen dari pustaka standar C ++ menyertakan komponen seperti STL vector, listdan algoritma seperti copydan swap.

Tapi tentu saja standar C ++ mencakup lebih banyak hal di luar STL, jadi istilah "C ++ standard library" lebih tepat (dan apa yang sebenarnya digunakan oleh dokumen standar).

Dalam silico
sumber
5
+1. Meskipun, di STL, tidak ada stdnamespace (IIRC).
Lightness Races dalam Orbit
1
Pada saat itu, kebanyakan kompiler C ++ tidak mengimplementasikan ruang nama. Bahkan, saya tidak tahu apakah mereka bahkan dalam standar.
Kragen Javier Sitaker
3
@ Kragen: Ya, tidak ada standar.
Lightness Races in Orbit
3
Oh Nah, ada beberapa buku karya Stroustrup, tapi saya kira itu bukan hal yang sama, bukan?
Kragen Javier Sitaker
23

Saya telah membuat argumen yang sama baru-baru ini, tetapi saya percaya sedikit toleransi dapat diizinkan. Jika Scott Meyers membuat kesalahan yang sama, Anda berada di perusahaan yang baik.

Mark tebusan
sumber
@ Tomalak & @ Mark: Sebenarnya Scott tidak, -1dari saya. Buku ini memang tentang STL dalam arti "bagian-bagian dari std lib yang berasal dari perpustakaan Stepanov". Luangkan waktu untuk membaca buku-buku TOC. Satu-satunya hal di luar STL asli yang dapat saya temukan adalah std::string, dan itu telah dilengkapi dengan wadah STL yang penuh.
sbi
@ sbi: Anda ternyata salah mengartikan posisi saya. Saya tidak akan menggunakan "STL" dengan cara yang Scott lakukan. Tolong baca jawaban saya.
Lightness Races dalam Orbit
6
@ Tomalak, saya tidak akan menggunakan "STL" dengan cara itu, walaupun saya mungkin pernah bersalah karenanya. Aku hanya berpikir tidak ada gunanya mengalahkan orang lain.
Mark Ransom
1
Itu bisa saya hormati. Saya mendapat banyak keraguan tentang orang-orang yang menolak untuk mengakui potensi ambiguitas sama sekali. :)
Lightness Races dalam Orbit
11
Anda juga akan berada di perusahaan Bjarne Stroustrup - ref. misalnya. stroustrup.com/DnE2005.pdf : "the STL (" Standard Template Library "; yaitu, kerangka wadah dan algoritma dari perpustakaan standar ISO C ++)"
Sander De Dycker
7

Dari FAQ Perpustakaan C ++ Standar C ++ (libstdc ++) :


STL (Standard Template Library) adalah inspirasi untuk potongan besar dari C + + Standard Library, tetapi istilah tersebut tidak dapat dipertukarkan dan tidak berarti hal yang sama. C ++ Standard Library mencakup banyak hal yang tidak berasal dari STL, dan beberapa di antaranya bahkan bukan templat, seperti std::localedan std::thread.

Libstdc ++ - v3 menggabungkan banyak kode dari SGI STL (gabungan terakhir berasal dari rilis 3.3 ). Kode di libstdc ++ berisi banyak perbaikan dan perubahan dibandingkan dengan kode SGI asli.

Secara khusus, stringbukan dari SGI dan tidak menggunakan kelas "tali" mereka (meskipun itu termasuk sebagai ekstensi opsional), tidak ada valarrayjuga yang lain. Kelas-kelas seperti vector<>berasal dari SGI, tetapi telah dimodifikasi secara luas.

Informasi lebih lanjut tentang evolusi libstdc ++ dapat ditemukan di evolusi API dan dokumentasi kompatibilitas mundur .

The FAQ untuk STL SGI masih dianjurkan membaca.


FYI, per Maret 2018 bahkan situs web resmi STL www.sgi.com/tech/stl/ telah hilang .

vstepaniuk
sumber