Definisi "bahasa C-Style" secara praktis dapat disederhanakan menjadi "menggunakan kurung kurawal ( {}
)." Mengapa kita menggunakan karakter tertentu (dan mengapa bukan sesuatu yang lebih masuk akal, seperti []
, yang tidak memerlukan tombol shift setidaknya di keyboard AS)?
Apakah ada manfaat aktual untuk produktivitas programmer yang berasal dari kawat gigi ini, atau haruskah perancang bahasa baru mencari alternatif (yaitu orang-orang di belakang Python)?
Wikipedia memberi tahu kita bahwa C menggunakan kawat gigi kata, tetapi tidak mengapa. Pernyataan dalam artikel Wikipedia tentang Daftar bahasa pemrograman berbasis C menunjukkan bahwa elemen sintaksis ini agak istimewa:
Secara umum, bahasa C-family adalah yang menggunakan sintaksis blok mirip C (termasuk kurung kurawal untuk memulai dan mengakhiri blok) ...
sumber
Jawaban:
Dua pengaruh utama C adalah keluarga bahasa Algol (Algol 60 dan Algol 68) dan BCPL (dari mana C mengambil namanya).
Dari http://www.princeton.edu/~achaney/tmve/wiki100k/docs/BCPL.html
Dari http://progopedia.com/language/bcpl/
Dalam BCPL, orang sering melihat kawat gigi keriting, tetapi tidak selalu. Ini adalah keterbatasan keyboard pada saat itu. Karakter
$(
dan$)
secara leksikografis setara dengan{
dan}
. Digraph dan trigraph dipertahankan dalam C (meskipun set berbeda untuk penggantian kurung kurawal -??<
dan??>
).Penggunaan kawat gigi keriting selanjutnya disempurnakan dalam B (yang mendahului C).
Dari Referensi Pengguna ke B oleh Ken Thompson:
Ada indikasi bahwa kurung kurawal digunakan sebagai tangan pendek untuk
begin
dan diend
dalam Algol.Dari http://www.bobbemer.com/BRACES.HTM
Penggunaan tanda kurung siku (sebagai pengganti yang disarankan dalam pertanyaan) kembali lebih jauh. Seperti disebutkan, keluarga Algol mempengaruhi C. Dalam Algol 60 dan 68 (C ditulis pada tahun 1972 dan BCPL pada tahun 1966), braket persegi digunakan untuk menunjuk indeks ke dalam array atau matriks.
Karena programmer sudah terbiasa dengan tanda kurung untuk array di Algol dan BCPL, dan kurung kurawal untuk blok di BCPL, ada sedikit kebutuhan atau keinginan untuk mengubah ini ketika membuat bahasa lain.
Pertanyaan yang diperbarui mencakup tambahan produktivitas untuk penggunaan penjepit keriting dan menyebutkan python. Ada beberapa sumber lain yang melakukan penelitian ini meskipun jawabannya bermuara pada "Ini anekdotal, dan apa yang Anda terbiasa adalah dengan apa Anda paling produktif dengan." Karena keterampilan yang sangat beragam dalam pemrograman dan keakraban dengan bahasa yang berbeda, ini menjadi sulit untuk diperhitungkan.
Lihat juga: Stack Overflow Apakah ada studi statistik yang menunjukkan bahwa Python "lebih produktif"?
Sebagian besar keuntungan akan tergantung pada IDE (atau kurangnya) yang digunakan. Pada editor berbasis vi, menempatkan kursor di atas salah satu pencocokan buka / tutup dan menekan
%
kemudian akan memindahkan kursor ke karakter pencocokan lainnya. Ini sangat efisien dengan bahasa berbasis C kembali di masa lalu - kurang begitu sekarang.Perbandingan yang lebih baik adalah antara
{}
danbegin
/end
yang merupakan pilihan hari itu (ruang horizontal sangat berharga). Banyak bahasa Wirth didasarkan pada abegin
danend
gaya (Algol (disebutkan di atas), pascal (banyak yang akrab dengan), dan keluarga Modula).Saya mengalami kesulitan menemukan yang mengisolasi fitur bahasa khusus ini - yang terbaik yang bisa saya lakukan adalah menunjukkan bahwa bahasa kurung kurawal jauh lebih populer daripada bahasa akhir dan itu adalah konstruksi umum. Seperti disebutkan dalam tautan Bob Bemer di atas, kurung kurawal digunakan untuk membuatnya lebih mudah diprogram sebagai steno.
Dari Mengapa Pascal Bukan Bahasa Pemrograman Favorit Saya
Itulah semua yang bisa dikatakan - keakraban dan preferensi.
sumber
{
dan}
sedang??<
dan??>
. Digraph (diperkenalkan oleh amandemen 1995) adalah<%
dan%>
. Trigraph diperluas dalam semua konteks, dalam fase terjemahan yang sangat awal. Digraph adalah token, dan tidak diperluas dalam string literal, konstanta karakter, atau komentar.x:=(c|s1|s2)
bukan Cx=c?s1|s2
. Demikian pula ini berlaku untuk pernyataan if & case . ¢ BTW: A68 berasal dari tempat shell mendapatkan esac & fi ¢Square braces
[]
lebih mudah diketik , sejak terminal IBM 2741 yang "banyak digunakan pada Multics" OS, yang pada gilirannya memiliki Dennis Ritchie, salah satu pembuat bahasa C sebagai anggota tim pengembang .Perhatikan tidak adanya kurung kurawal pada tata letak IBM 2741!
Dalam C, kurung siku "diambil" karena ini digunakan untuk array dan pointer . Jika perancang bahasa mengharapkan array dan pointer menjadi lebih penting / digunakan lebih sering daripada blok kode (yang kedengarannya seperti asumsi yang masuk akal di pihak mereka, lebih pada konteks historis gaya pengkodean di bawah), itu berarti kurung kurawal akan mengarah ke "kurang penting "sintaks.
Pentingnya array cukup jelas dalam artikel Pengembangan Bahasa C oleh Ritchie. Bahkan ada asumsi yang secara eksplisit menyatakan "prevalensi pointer dalam program C" .
Untuk pemahaman lebih lanjut tentang konteks historis dan gaya pengkodean waktu ketika bahasa C dibuat, orang perlu mempertimbangkan bahwa "asal C terkait erat dengan pengembangan Unix" dan, khususnya, bahwa porting OS ke PDP- 11 "mengarah pada pengembangan versi awal C" ( sumber kutipan ). Menurut Wikipedia , "pada tahun 1972, Unix ditulis ulang dalam bahasa pemrograman C" .
Kode sumber dari berbagai versi lama Unix tersedia online, misalnya di situs The Unix Tree . Dari berbagai versi yang disajikan di sana, yang paling relevan tampaknya adalah Second Edition Unix tanggal 1972-06:
Anda dapat menelusuri dan mempelajari kode sumber C dari halaman Second Edition Unix (V2) untuk mendapatkan gambaran tentang gaya pengkodean khas waktu itu.
Sebuah contoh menonjol yang mendukung gagasan bahwa pada saat itu agak penting bagi programmer untuk dapat mengetik kurung siku dengan mudah dapat ditemukan dalam kode sumber V2 / c / ncc.c :
Sangat menarik untuk dicatat bagaimana motivasi pragmatis memilih karakter untuk menunjukkan elemen sintaksis bahasa berdasarkan penggunaannya dalam aplikasi praktis yang ditargetkan menyerupai Hukum Zipf seperti yang dijelaskan dalam jawaban hebat ini ...
... dengan satu-satunya perbedaan yang panjang dalam pernyataan di atas diganti dengan / digeneralisasi sebagai kecepatan mengetik.
sumber
grep -Fo
memberi tahu saya*.c
file kode sumber CPython (rev. 4b42d7f288c5 karena itulah yang saya miliki), yang termasuk libffi, berisi 39511{
( 39508{
, tak tahu mengapa dua kawat gigi tidak ditutup), tetapi hanya 13718[
( 13702)[
). Itu menghitung kemunculan dalam string dan dalam konteks yang tidak terkait dengan pertanyaan ini, jadi ini tidak benar-benar akurat, bahkan jika kita mengabaikan bahwa basis kode mungkin tidak representatif (perhatikan bahwa bias ini bisa mengarah ke kedua arah). Namun, faktor 2,8?C (dan selanjutnya C ++ dan C #) mewarisi gaya bracing dari pendahulunya B , yang ditulis oleh Ken Thompson (dengan kontribusi dari Dennis Ritchie) pada tahun 1969.
Contoh ini dari Referensi Pengguna ke B oleh Ken Thompson (via Wikipedia ):
B sendiri sekali lagi didasarkan pada BCPL , bahasa yang ditulis oleh Martin Richards pada tahun 1966 untuk sistem Operasi Multics. Sistem bracing B hanya menggunakan kawat gigi bundar, dimodifikasi oleh karakter tambahan (Cetak faktorial contoh oleh Martin Richards, via Wikipedia ):
Kurung kurawal yang digunakan dalam bahasa B dan bahasa berikutnya "{...}" adalah peningkatan yang dibuat Ken Thompson atas gaya senyawa majemuk asli dalam BCPL "$ (...) $".
sumber
$( ... $)
Format setara dengan{ ... }
di lexer di BCPL, seperti??< ... ??>
setara dengan{ ... }
di C. Peningkatan antara dua gaya dalam hardware keyboard yang - bukan bahasa.