Apakah ada bahasa antara C dan C ++?


18

Saya sangat suka sifat C yang sederhana dan transparan: ketika saya menulis kode C saya merasa tidak terbebani oleh "abstraksi yang bocor" dan hampir selalu dapat membuat perkiraan yang cerdas tentang perakitan yang saya hasilkan. Saya juga suka sintaksis sederhana dan umum untuk C.

Namun, C tidak memiliki barang-barang kecil sederhana dan bermanfaat ini yang ditawarkan C ++ seperti kelas, penanganan non-cstring yang disederhanakan, dll. Saya tahu bahwa itu semua mungkin untuk diterapkan di C menggunakan tabel lompatan dan sejenisnya, tapi itu agak bertele-tele di kali , dan tidak terlalu aman untuk berbagai alasan.

Saya bukan penggemar penekanan berlebihan pada objek di C ++, dan saya malu operator 'baru' dan sejenisnya. C ++ tampaknya hanya memiliki beberapa cegukan terlalu banyak untuk, misalnya, digunakan sebagai bahasa pemrograman sistem.

Apakah ada bahasa yang berada di antara C dan C ++ pada skala widget dan barang-barang kecil?

Penafian: Maksud saya ini murni pertanyaan faktual. Saya tidak bermaksud membuat Anda marah karena saya tidak sependapat dengan Anda bahwa C {, ++} cukup baik untuk melakukan apa pun yang saya rencanakan.


10
Anda mengatakan bahwa pertanyaan Anda "murni faktual", tetapi Anda mengabaikan c ++ karena "tampaknya" terlalu banyak cegukan. Apakah cegukan ini, dan apakah itu alasan yang sah untuk mendiskon c ++?
whatsisname

2
Apa itu 'skala widget dan barang-barang kecil'? Jika Anda ingin jawaban nyata untuk pertanyaan "murni faktual", Anda harus menghindari metrik yang tidak bermakna.
Caleb

2
Dan beberapa hal yang Anda lakukan tentang C ++ mengkhianati beberapa informasi yang salah. newsebagian besar adalah perangkat tambahan mallocyang juga dapat mengatur inisialisasi memori untuk Anda. Dengan "penempatan baru" dan operator new, Anda dapat memutuskan bagaimana dan di mana memori dialokasikan. Dan untuk penekanan objek: Beberapa baris di atas Anda menyatakan bahwa Anda menganggap kelas sebagai "barang yang sederhana dan bermanfaat". Putuskan!

25
Gunakan C+ Diclaimer: Maaf, saya tidak t resist. Itdapat 1 April;)
knut

2
Ini kedengarannya sangat buruk seperti hipotesis kontinum, dan mungkin dengan jawaban yang sama. ( en.wikipedia.org/wiki/Continuum_hypothesis )
John Smith

Jawaban:


29

Ini mungkin droid yang Anda cari ...

Go - http://golang.org/

D - http://dlang.org/

Rust - http://rust-lang.org/


5
@ Dtech: D memiliki GC yang tidak berguna / "Semuanya mewarisi dari Objek" / Nilai harus menyedot crappery. Saya sudah mendapatkan C # untuk itu dan sebenarnya memiliki alat yang layak. Pergi, saya akui bahwa ingatan saya tentang mengapa saya membuangnya agak kabur, tetapi seingat saya, ini memotong beberapa fitur yang sangat berguna.
DeadMG

4
-1 untuk "seharusnya C ++". C ++ adalah apa itu dan jika Anda tidak bisa mengatasinya, itu sebagian besar masalah Anda. Anda bisa mengatasinya dengan menggunakan bahasa yang lebih cocok untuk Anda, tetapi itu tidak berarti C ++ seharusnya seperti bahasa itu.
back2dos

7
@DeadMG Pada D, Anda membuat 2 pernyataan bermakna: GC wajib dan semuanya harus menjadi objek. Keduanya salah. Ini membuat saya berpikir bahwa kesimpulan Anda lebih didasarkan pada ketidaktahuan daripada pengetahuan yang sebenarnya. Saya harus setuju dengan CodexArcanum.
deadalnix

5
@deadalnix: Secara teknis, Anda dapat memilih untuk tidak menggunakan GC. Tetapi karena Anda tidak memiliki cara untuk mengetahui atau mengontrol fungsi pustaka atau fitur bahasa apa yang menggunakan GC, secara realistis tidak ada cara untuk menghasilkan program yang tidak menggunakannya. Dan Anda tidak bisa membuat kelas yang tidak diwariskan dari Object. Dan structs mereka benar-benar gimped dibandingkan dengan nilai C ++ - tidak ada warisan, tidak ada referensi nilai, misalnya, jadi tidak mungkin untuk menghasilkan sesuatu yang sederhana seperti kelas string nilai dalam D yang seefisien C ++ setara. Itu adalah fakta tentang bahasa D.
DeadMG

5
@DeadMG: Membuat struct tanpa warisan adalah fitur , bukan "gimping." Itu adalah sesuatu yang mereka perbaiki, sesuatu yang hampir setiap bahasa OO dalam sejarah yang tidak bernama "C ++" benar (termasuk Simula, bahasa OO asli), dan bahwa C ++ mendapat kesalahan yang sangat besar. Jenis warisan dan nilai tidak bercampur. Itu merusak identitas objek, ia menghancurkan Substitusi Liskov, itu menghancurkan seluruh paradigma OO.
Mason Wheeler

19

Ada beberapa bahasa (misalnya, Java, Go, D, Objective-C) yang kira-kira sejajar dengan C ++, atau upaya memperbaiki masalah yang penulis lihat dengan C ++.

Setidaknya IMO, bagaimanapun, semuanya bekerja jauh lebih rendah daripada C ++ untuk tujuan yang paling praktis.

Sayangnya, berdasarkan selera Anda untuk mengetahui kode perakitan apa yang akan diproduksi, kami mungkin dapat segera mengesampingkan Objective C dan Java.

Secara teoritis, saya akan mempertimbangkan Go yang paling menarik dari ini - ia memiliki beberapa ide yang benar-benar asli dan pendekatan yang menarik untuk memecahkan masalah yang membuat beberapa jenis kode lebih mudah. Sayangnya, kompiler saat ini tidak menghasilkan kode yang sangat bagus, dan belum ada banyak peningkatan dalam hal ini selama beberapa tahun terakhir.

Cukup banyak yang menjadikan D sebagai satu-satunya yang memiliki peluang. Ini mungkin yang paling mirip dengan C ++ (dari ini), tetapi juga yang paling mungkin (IMO) untuk memperbaiki apa yang Anda lihat sebagai masalah.

Itu meninggalkan satu pendekatan yang jelas: gunakan C ++, tetapi hanya gunakan bagian yang Anda inginkan, dan hindari bagian yang tidak Anda sukai.


13
+1 untuk "gunakan C ++ dan hindari bagian yang tidak Anda sukai". Dan saya akan menyarankan kepada OP untuk mempelajari lebih lanjut tentang C ++, orang sering menolak sesuatu hanya karena mereka tidak mengenal mereka dengan baik.
Doc Brown

1
@DocBrown Mungkin karena tidak mudah untuk mengetahui C ++ dengan cukup baik.
Malcolm

3
@ Malcolm: tentu saja sulit untuk mempelajari C ++ modern secara mendalam. Tetapi di sisi lain, sama sekali tidak ada alasan untuk menjadi "pemalu terhadap operator baru", yang kedengarannya hanya takhayul bagi saya.
Doc Brown

3
@ Malcolm: Mungkin karena konsepnya sangat sederhana . Apakah saya memerlukan string string UTF-32, atau string string UTF-16? Nah, itu pertanyaan yang cukup mudah dijawab, dengan asumsi Anda tahu dasar-dasar pengkodean string wtf. Dan banyak fitur sulit itu? Mereka ada karena suatu alasan . Misalnya, generik Java. Mereka menyedihkan dibandingkan dengan template. Tentu, ada yang kurang untuk dipelajari, tetapi itu hanya karena mereka tidak begitu berguna. Ini seperti memanggil sesuatu yang lebih rumit daripada Brainfuck.
DeadMG

3
@ Malcolm: Itu tidak benar sama sekali. Popularitas dipengaruhi oleh 99999 hal terlepas dari apakah bahasa tersebut baik / bermanfaat atau tidak.
DeadMG

16

Namun, C tidak memiliki barang-barang kecil sederhana dan bermanfaat ini yang ditawarkan C ++ seperti kelas, penanganan non-cstring yang disederhanakan, dll. Saya tahu bahwa itu semua mungkin untuk diterapkan di C menggunakan tabel lompatan dan sejenisnya, tapi itu agak bertele-tele di kali , dan tidak terlalu aman untuk berbagai alasan.

Saya bukan penggemar penekanan berlebihan pada objek di C ++, dan saya malu operator 'baru' dan sejenisnya.

Maaf, sobat, alarm kontradiksi. Membutuhkan penanganan non-gesekan new. Ini merupakan kebutuhan mendasar. Anda tidak dapat memilikinya std::stringtanpanya new. Dan selanjutnya, new/ deletepersis sama dengan malloc/ freetapi lebih aman , karena menjamin pembangunan yang benar dan penghancuran tumpukan benda (benar-benar diperlukan!) Dan penggunaan pengecualian penanganan bukannya NULLkembali, dan karena itu unggul dalam setiap dibayangkan fashion. Dalam C ++ 11 sangat mungkin untuk menulis newfungsi gaya Anda sendiri , karena penerusan yang sempurna memungkinkan Anda untuk berurusan dengan konstruktor apa pun dari jenis apa pun. Jika Anda malu new, maka saya sarankan Anda tidak benar-benar tahu apa yang Anda hadapi.

Oh, ya, dan pointer cerdas membuatnya sehingga Anda tidak pernah, harus benar-benar berurusan dengan semua ini sendiri.

Selain itu, dalam C ++ tidak ada penekanan berlebihan. Anda tidak harus menggunakan objek apa pun yang tidak Anda inginkan. Anda dapat memprogram secara fungsional dengan lambdas dan kapan saja Anda mau. Tidak ada yang memaksa Anda untuk menggunakan warisan dan fungsi virtual - pada kenyataannya, banyak program C ++ yang baik jarang menunjukkan warisan. Template adalah teknik abstraksi yang lebih kuat dan lebih berguna. Ini bukan Java.


1
Saya setuju. Jauh lebih baik menggunakan C ++ dengan cara yang Anda inginkan daripada mencari alternatif (kemungkinan lebih rendah)
dtech

1
Saya tidak berpikir bahwa lambdas cukup untuk memprogram secara fungsional. Saya juga berharap memiliki operator komposisi fungsi, kari, dan sebagainya. Lihat juga stackoverflow.com/questions/1981400/functional-programming-in-c . Bagi saya rasanya hampir seperti melakukan OOP di C ...
Giorgio

@Iorgio: Jawaban pertanyaan itu hanya mengatakan "Sulit!" Mereka tidak menunjukkan bukti bahwa itu sebenarnya sulit . Mengapa Anda ingin operator terpisah untuk komposisi fungsi? f(g(x))tampaknya bekerja dengan baik untuk saya. Dan saya juga percaya bahwa kari dapat dilakukan sebagai perpustakaan secara umum di C ++ 11.
DeadMG

1
@DeadMG: Operator komposisi fungsi adalah konsep dasar yang cukup mapan dalam pemrograman fungsional. Saya berharap menemukannya dalam bahasa yang mendukung FP. Saya merasa sangat nyaman (ringkas) untuk mendefinisikan fungsi kompleks sebagai komposisi fungsi lain (misalnya seperti yang Anda lakukan dengan pipa di Unix) tanpa menggunakan variabel: k = h. g. f
Giorgio

1
@Iorgio: std::bindmendukung hal-hal seperti itu.
DeadMG

4

C hampir merupakan himpunan bagian dari C ++, jadi Anda bisa menggunakan bagian-bagian C ++ yang Anda sukai dan mengabaikan sisanya. Bahkan dimungkinkan untuk menulis C yang valid yang juga C ++ yang valid.

Anda tidak akan menulis C ++ idiomatis, tapi itu sekitar "di antara" yang didapat.

Atau, Anda bisa memeriksa bahasa lain yang mencoba memperluas C ke arah sesuatu yang lebih kuat, terutama D dan Objective-C.

Dan akhirnya, tergantung pada sifat proyek, Anda dapat menggunakan pendekatan polyglot: bagilah proyek Anda menjadi beberapa modul, dan pilih bahasa yang paling cocok untuk setiap bagian. Kelemahan dari ini adalah bahwa Anda perlu membuat bahasa untuk bekerja bersama, yang mungkin terlalu banyak pekerjaan untuk sepadan dengan usaha.


Memang, bekerja di industri seperti pengembangan game konsol, di mana kami benar-benar menginginkan "bahasa di antara C dan C ++", itulah yang kami lakukan. Kami menggunakan subset fungsionalitas C ++, dengan hal-hal tertentu di luar batas, atau lebih mungkin di luar batas dalam loop kinerja-kritis.
Carson63000

3

Hanya untuk menawarkan jawaban yang liar, di luar kotak: jika bahasa yang Anda inginkan tidak ada, mengapa tidak membuatnya sendiri? Ada berbagai alat pengembangan bahasa yang kuat di luar sana, langsung dari stand-bys (F) Lex dan Yacc / Bison. Karena Anda sudah tahu C, Anda hanya perlu "kompiler" untuk mengeluarkan kode C, yang kemudian Anda gunakan untuk rantai alat yang ada.

Ini bisa lebih sederhana dan lebih kuat dari yang Anda pikirkan. Mulailah dengan parser / lexer untuk C, kemudian tambahkan fitur tambahan yang menurut Anda penting. Jika tabel lompatan mengganggu menulis dengan tangan, cari konstruksi untuk mengekspresikan abstrak, dan biarkan penerjemah Anda menuliskannya untuk Anda. Pada dasarnya ini hanya level yang lebih tinggi dari metaprogramming pra-prosesor, menggunakan alat luar untuk melakukan metaprogramming. Anda akan selalu tahu persis seperti apa jadinya perakitan akhir karena Anda tahu C, dan Anda tahu apa C perluasan bahasa Anda.

Jelas ada beberapa batasan seberapa efektif hal ini tanpa banyak pekerjaan tambahan. Menambahkan sistem tipe statis penuh mungkin sedikit lebih rumit daripada yang Anda inginkan, tetapi ini merupakan opsi yang dapat Anda jelajahi jika Anda merasa memiliki selera untuk itu. Ekstensi DSL Anda sekuat dan serumit Anda punya waktu dan energi untuk membuatnya, dan siapa tahu, mungkin suatu hari nanti bahasa ekstensi Anda akan menjadi "C ++ berikutnya".


2

Anda belum mengatakan fitur C ++ apa yang mengganggu bagi Anda. toh Anda bisa mencoba Objective-C. Ini menekankan pada Object Oriented bukannya Standard Library pada C ++.


2
imho Objective-C adalah upaya yang sangat sedikit untuk memperkenalkan kelas ke dalam C dan inferior dalam banyak hal ke C ++. Selain itu sangat sedikit digunakan di luar Mac OS X / iOS.
dtech

1
@dtech: Menarik, mantan kolega saya, yang bukan penggemar Mac (bukan orang Debian / Linux) yakin bahwa Objective-C adalah ekstensi OO yang jauh lebih bersih dari C daripada C ++. Saya belum pernah mencoba Objective-C, jadi saya tidak punya pendapat tentang ini.
Giorgio

1
@ Techech: Maka saya dengan rendah hati menyarankan Anda mempertimbangkan kembali pendapat Anda;) Objective-C adalah tentang orientasi objek, dan itu melakukan pekerjaan yang jauh lebih baik pada saat itu daripada C ++, karena ia memperkenalkan pesan yang lewat. Meskipun saya setuju bahwa bahasa ini lebih rendah daripada C ++ dalam banyak hal, ia lebih unggul dalam banyak hal.
back2dos

@Giorgio Saya setuju dengan kolega Anda, meskipun Obj-C juga memiliki beberapa batasan (mungkin beberapa dari ini hilang dengan Obj-C 2.0), misalnya saya ingin memiliki kelebihan "metode" (penyeleksi) - tapi saya ingin fungsi overloading ala Fortran di C ...
ShinTakezou

2

Dunia tertanam menetapkan Embedded C ++ , yang mungkin Anda cari. Mereka menghapus hal-hal seperti pewarisan berganda dan sejenisnya. Sejauh yang saya ketahui, hampir mati.


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.