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.
new
sebagian besar adalah perangkat tambahanmalloc
yang juga dapat mengatur inisialisasi memori untuk Anda. Dengan "penempatan baru" danoperator 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!C+
Diclaimer: Maaf, saya tidakt resist. It
dapat 1 April;)Jawaban:
Ini mungkin droid yang Anda cari ...
Go - http://golang.org/
D - http://dlang.org/
Rust - http://rust-lang.org/
sumber
struct
s 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.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.
sumber
Maaf, sobat, alarm kontradiksi. Membutuhkan penanganan non-gesekan
new
. Ini merupakan kebutuhan mendasar. Anda tidak dapat memilikinyastd::string
tanpanyanew
. Dan selanjutnya,new
/delete
persis sama denganmalloc
/free
tapi lebih aman , karena menjamin pembangunan yang benar dan penghancuran tumpukan benda (benar-benar diperlukan!) Dan penggunaan pengecualian penanganan bukannyaNULL
kembali, dan karena itu unggul dalam setiap dibayangkan fashion. Dalam C ++ 11 sangat mungkin untuk menulisnew
fungsi gaya Anda sendiri , karena penerusan yang sempurna memungkinkan Anda untuk berurusan dengan konstruktor apa pun dari jenis apa pun. Jika Anda malunew
, 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.
sumber
f(g(x))
tampaknya bekerja dengan baik untuk saya. Dan saya juga percaya bahwa kari dapat dilakukan sebagai perpustakaan secara umum di C ++ 11.std::bind
mendukung hal-hal seperti itu.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.
sumber
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".
sumber
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 ++.
sumber
Dunia tertanam menetapkan Embedded C ++ , yang mungkin Anda cari. Mereka menghapus hal-hal seperti pewarisan berganda dan sejenisnya. Sejauh yang saya ketahui, hampir mati.
sumber
Anda mungkin menemukan perbandingan sisi-dalam-dalam dari C ++, Objective-C, Java dan C # ini bermanfaat. Secara pribadi saya pikir C # jauh lebih bersih untuk bekerja daripada C ++. Saya telah mem-porting beberapa (numerik / kalkulasi) fungsi C ke C # sebelumnya tanpa terlalu banyak perubahan yang diperlukan karena kesamaan dari sintaks dan tipe data numerik.
sumber