Mengapa C ++ masih lebih disukai untuk membangun aplikasi GUI berat daripada bahasa dinamis terbaru? [Tutup]


46

Saya melihat bahwa sebagian besar aplikasi yang menyertakan konten GUI berat biasanya dikembangkan di C ++. Sebagian besar game / browser diberi kode dalam C ++.

Tidak bisakah kita mengembangkan aplikasi GUI yang lebih baik dengan bahasa dinamis terbaru? Saya tahu java tidak akan menjadi pilihan yang bagus. Tapi bagaimana dengan bahasa seperti python yang secara bawaan dibangun di atas C? Bukankah bahasa terbaru seharusnya lebih baik dari nenek moyang mereka? Mengapa kita masih harus memilih C ++ yang lebih tua daripada bahasa terbaru?

Dan saya juga ingin tahu, apa yang bertanggung jawab dalam C ++, untuk kecepatan pemrosesan GUI yang lebih baik? Di sisi lain, apa yang tidak dimiliki oleh bahasa-bahasa terbaru lainnya?


22
Jika Anda berpikir bahwa Java adalah bahasa 'dinamis', maka Anda sangat bingung tentang apa arti kata itu dalam konteks ini.
Mike Baranczak

15
@ Mike Baranczak: Ceritanya panjang. Pada dasarnya, ada proyek penelitian pertama di Stanford, kemudian di Sun Research bernama Self. Self adalah bahasa pemrograman dalam keluarga Smalltalk yang lebih sederhana, lebih kuat, lebih ekspresif dan yang paling penting secara signifikan lebih dinamis daripada Smalltalk. Karena dirancang sebagai bahasa pemrograman untuk mengembangkan seluruh sistem dalam (seperti semua dialek Smalltalk), termasuk (tetapi tidak terbatas pada) aplikasi desktop, server, sistem operasi, driver perangkat, itu sendiri, itu harus sangat cepat. Jadi, tim Self menemukan sejumlah baru ...
Jörg W Mittag

15
... teknik optimasi, dan ketika Diri VM keluar pada tahun 1987 (dan bahkan lebih lagi generasi kedua pada tahun 1992), itu adalah cepat. Itu lebih cepat daripada Smalltalk VM lainnya. Sistem Diri dikirimkan dengan banyak contoh kode, dan salah satu dari mereka contoh adalah juru Smalltalk ditulis dalam Diri, dan bahkan yang lebih cepat dari yang lain Smalltalk VM. Self lebih cepat daripada banyak implementasi C ++ pada waktu itu, dan bahkan bersaing dengan C. Yah, Anda mengerti. Itu cepat . Namun, Sun memutuskan bahwa mereka tidak membutuhkan bahasa pemrograman berorientasi objek atau VM cepat, jadi mereka ...
Jörg W Mittag

15
... pada dasarnya kelaparan proyek Self sampai mati dengan mengeringkan dana. Ketika para insinyur Self VM meninggalkan Sun karena frustrasi, mereka dengan cepat diambil oleh startup Smalltalk yang disebut LongView (lebih dikenal dengan nama sebagian besar produk mereka, sistem tipe statis opsional untuk Smalltalk: StrongTalk). LongView tahu bahwa mereka tidak akan pernah bisa menjual pengetikan statis untuk Smalltalk, jadi mereka pikir mereka lebih suka menjual Smalltalk tercepat di planet ini dan kemudian memasukkan StrongTalk ke dalam paket dalam jenis permainan Trojan Horse. Mereka juga menyadari bahwa tidak ada yang keren ...
Jörg W Mittag

15
... pengoptimalan yang dilakukan Self VM dengan cara tertentu khusus untuk Self, tetapi dapat diterapkan pada hampir semua bahasa berorientasi objek (atau bahkan sembarang bahasa sama sekali ). Jadi, para insinyur Self VM mulai bekerja pada Smalltalk VM yang disebut Animorphic VM. Sekali lagi, Animorphic VM sangat cepat (dan masih, sebenarnya, meskipun basis kode belum tersentuh dalam 15 tahun atau lebih, masih dapat bersaing dengan Smalltalks, JVMs dan .NET, berkinerja tinggi modern, terutama jika Anda mengambil memperhitungkan bahwa ia menggunakan sumber daya yang jauh lebih sedikit daripada yang, karena dirancang untuk 486 dengan 20 MB ...
Jörg W Mittag

Jawaban:


58

Saya salah satu dari orang-orang yang menulis aplikasi C ++ GUI (kebanyakan untuk windows). Dengan Qt, tepatnya. Alasan saya:

  • Saya suka C ++. Saya seorang freelancer dan biasanya saya dapat memilih alat saya (beruntung saya!)
  • Dalam lingkungan yang dikelola Anda mungkin mengalami kesulitan ketika Anda perlu menggunakan beberapa kode yang tidak dikelola (deklarasi WinAPI bertele-tele dalam C #, siapa pun?)
  • Lebih sedikit ketergantungan yang lebih mudah digunakan
  • Lebih banyak kontrol atas segalanya.
  • RAII (vs. GC). Dan bahkan jika saya mengalokasikan dengan new, saya jarang melakukan deleteapa pun secara eksplisit, karena saya menggunakan smart pointer atau QObjecthierarki.
  • C ++ sangat menarik hari ini, saya tidak sabar menunggu compiler untuk sepenuhnya mendukung standar baru.
  • Kecepatan (hanya di akhir daftar. Saya tahu itu tidak terlalu penting untuk GUI itu sendiri, tetapi cenderung lebih cepat karena program C ++ tidak mengalami overhead yang runtime, kode byte JIT-compiling dan teknologi serupa menambah program.)

Seperti yang Anda lihat, ini sebagian besar adalah preferensi pribadi. Saya merasa penting agar pekerjaan saya menyenangkan dan C ++ menyediakannya untuk saya.


11
+1 Speed ​​jelas merupakan alasan utama di sini, selain dari preferensi pribadi. Namun, saya suka "C ++ sangat menarik hari ini". Untuk menjawab pertanyaan-penanya , bukan @ Tamás Szelei: Tentu, menghitung perubahan dengan cepat dengan ide-ide baru, paradigma, teknologi, produk tetapi yang terbaru dan terhebat bukanlah suatu kebajikan. C ++ telah ada selama beberapa waktu dan itu tidak berarti sudah usang, melainkan memiliki rekam jejak yang terbukti panjang dibandingkan dengan teknologi yang lebih baru. Teks Stroustrup asli (buku penemu) berat, tetapi ada beberapa buku bagus di luar sana oleh orang lain - periksa oreilly.com misalnya.
therobyouknow

1
@Tarnas Saya pikir "selalu akan lebih cepat" agak sempit / otoritatif, tetapi tidak cukup untuk menjamin downvote ...
Max

2
Sebagai dukungan anekdotal: Saya telah terlibat dalam berbagai proyek untuk membuat GUI berukuran signifikan pada Windows menggunakan C ++ dan JavaScript. Saya juga pernah terlibat dalam berbagai proyek konsol game di C ++ dan JavaScript. Dalam kedua kasus, ada masalah kecepatan dan memori yang signifikan dengan JavaScript.
Gort the Robot

2
Terlambat ke pesta, tetapi dapatkah Anda menguraikan "dependensi yang kurang / mudah diterapkan"?
weberc2

2
Saya telah menggunakan C ++ selama lebih dari 20 tahun. Banyak fitur baru dan hebat ditambahkan sejak 11, 14, dan 17. Anda hampir dapat menggunakan C ++ sebagai bahasa scripting dan masih mendapatkan manfaat dari kecepatan cepat. Ketika saya bekerja dengan data BIG, saya hampir harus menggunakan C ++ karena bahasa lain akan lebih lambat 10-1000.
Kemin Zhou

32

Karena kecepatan itu penting.

  • Game menggunakan C ++ untuk tugas inti, di mana kinerjanya penting. Mereka menggunakan bahasa dinamis untuk tugas skrip di mana fleksibilitas penting.

  • Aplikasi Desktop GUI : Visual Studio, misalnya, ditulis dalam .NET dan bukan asli C ++. Tampaknya bekerja cukup baik untuk suatu IDE, karena IDE itu sendiri tidak perlu melakukan banyak tugas kinerja yang intensif. (Kompiler, tautan, dan alat-alat lain tidak harus ditulis dalam .NET - meskipun seperti yang ditunjukkan oleh wawa dalam komentar, beberapa tampaknya (misalnya VB.NET))

  • Browser juga harus cepat. Lagi pula mereka semacam OS sekunder. Di sisi lain, Anda dapat berargumen bahwa sebagian besar Firefox sebenarnya "ditulis dalam" javascript, karena kerangka kerja Mozilla tampaknya sangat bergantung pada javascript.

Singkatnya: Saya tidak akan mengatakan C ++ lebih disukai tetapi jika Anda memiliki hambatan kinerja Anda harus lebih dekat ke logam dan kemudian Anda bertemu C ++ (well, atau C). Kadang-kadang hanya akan lebih mudah untuk melakukan semuanya dalam C ++ - satu bahasa.


1
+1 Jawaban terbaik: Ini murni berkaitan dengan kecepatan sebagai alasan utama untuk menggunakan C ++. Bahkan Microsoft sendiri mengakui bahwa C ++ adalah yang terbaik untuk kinerja dibandingkan dengan c # dan visual basic - lihat ke dalam halaman Visual Studio mereka. Detik yang sangat dekat adalah portabilitas - jika Anda menggunakan pustaka lintas platform seperti Qt. Jawaban terbaik juga karena lebih objektif daripada subyektif.
therobyouknow

2
Poin kedua Anda tidak sepenuhnya benar. Kompiler VB.NET ditulis dalam VB.NET dan kompiler F # ditulis dalam F #. Kompiler C # tidak lain dari apa yang telah dirilis tentang proyek Roslyn, saya pikir kompiler C # sedang ditulis ulang dalam C #.
Wesley Wiser

5
Visual studio gui (chrome) ditulis (dari vs2010) dalam c # dan WPF. Penjelajah solusi, sistem bangun, peramban kode, dan kotak alat ditulis dalam c # / c ++ dengan winforms. Kompiler ditulis dalam c ++.
Martin Beckett

Untuk sebagian besar aplikasi desktop, hanya mesin rendering dan tata letak (yaitu, Tampilan) yang harus cepat. Model ini cenderung tidak menghabiskan banyak waktu di dalamnya, dan Pengontrol menghabiskan sebagian besar waktunya hanya menunggu pengguna untuk melakukan sesuatu (dan beberapa pengguna dapat mengklik sesering 10 kali per detik dengan keandalan apa pun).
Donal Fellows

@ MartinBa: Saya perhatikan bahwa kompiler saat ini untuk C # dan VB (Roslyn) ditulis dalam C #.
jmoreno

18

Aplikasi GUI yang Anda lihat tertulis dalam C ++ umumnya dilakukan karena alasan warisan. Python (dengan Qt atau Gtk) sangat memungkinkan untuk aplikasi GUI, seperti halnya C # jika Anda bekerja di rumah Windows. Ketika memulai sesuatu yang baru, baik yang sangat jauh lebih suka C ++ karena kurangnya pipa pekerjaan yang harus dilakukan.


5
+1 kode yang ada adalah penting. Sangat jarang untuk memulai sepenuhnya dari awal ketika mengembangkan program baru

7
bagaimana menggunakan Python dengan Qt lebih disukai daripada menggunakan C ++ dengan Qt? Jika saya memulai proyek baru hari ini, saya masih menggunakan C ++ untuk GUI. Karena: a) Itu yang saya tahu, b) melakukan pekerjaan dengan baik. Hanya karena C ++ sudah ada sejak lama tidak membuatnya "ketinggalan jaman".
TZHX

2
@TZHX: "Itu yang saya tahu" adalah argumen yang masuk akal. Jika itu tidak diberikan, tidak harus mengurus manajemen memori lagi adalah peningkatan kinerja yang sangat besar, dan itu dapat mengimbangi upaya belajar Python bahkan untuk satu proyek. Alasan lain untuk menggunakan Python adalah cross-platformness - dengan C ++, Anda harus berhati-hati dan mengambil langkah-langkah khusus, sedangkan python sepertinya hanya berfungsi.
Pelaku

4
Saya tidak melihat keuntungan menggunakan PyQt daripada Qt dengan C ++ untuk seseorang yang tahu C ++.
BenjaminB

13
C ++ sepertinya hanya berfungsi, juga. Dengan Python Anda harus khawatir tentang versi python yang telah diinstal pengguna, atau khawatir tentang bundling. Sebenarnya tidak ada banyak pekerjaan yang harus dilakukan "menjaga memori" kecuali Anda membuat kesalahan bodoh. Saya pikir banyak orang memberikan "manajemen memori" sebagai hambatan besar untuk bekerja dengan C ++ tanpa benar-benar mengetahui berapa banyak perbedaan yang terjadi.
TZHX

16

Karena tidak peduli berapa banyak tes kinerja .NET dan sejenisnya menunjukkan, tidak peduli seberapa dekat mereka datang dalam tolok ukur, pada akhirnya, aplikasi C ++ keluar di atas. Lebih cepat saat boot dingin, lebih cepat, dan memiliki lebih banyak cara untuk ditingkatkan.

Saya telah mendengar banyak bukti di fase awal proyek bahwa .NET adalah cara untuk pergi, tetapi setelah itu dipilih, mereka selalu berakhir dengan dendam berat.

Juga, C ++ saat ini cukup aman dan cukup mudah digunakan, terutama dengan kerangka kerja seperti Qt atau WTL.


2
+1: "Juga, C ++ saat ini cukup aman dan cukup mudah digunakan, terutama dengan kerangka kerja seperti Qt ..." Saya sangat setuju: Saya pikir kekuatan besar bukan (hanya) C ++ itu sendiri, tetapi fakta bahwa (1 ) dikompilasi ke kode asli, (2) memiliki serangkaian fitur yang masuk akal (OOP, templat), (3) memiliki kerangka kerja yang sangat baik seperti Qt. Ini mengimbangi fakta bahwa bahasanya agak besar dan sulit dipelajari: setelah Anda menguasai bagian bahasa yang layak dan beberapa perpustakaan yang baik, Anda dapat benar-benar produktif dengannya.
Giorgio

10

Sebagian besar mesin gim dikodekan dalam C ++. Juga banyak mesin peramban yang dikodekan dalam C ++. Tetapi browser GUI sering dikodekan menggunakan beberapa skrip ringan (JavaScript, Python). Dengan pengecualian dari Source Engine, kebanyakan mesin game juga menggunakan bahasa scripting (seperti Lua atau Python). [untuk referensi: daftar game yang ditulis Lua ]

Juga ambil pustaka C ++ GUI populer seperti Qt. Dalam versi saat ini (4.7) menggunakan QML untuk GUI. QML pada dasarnya adalah JavaScript dengan binding Qt.

Jadi benar-benar tidak ada bahasa C ++ vs dinamis, itu campuran.


[Rujukan?]. Saya tahu banyak game menggunakan bahasa scripting untuk memungkinkan pengguna memperluasnya, tetapi sejauh yang saya tahu tidak ada banyak game menggunakan bahasa scripting untuk fungsionalitas rilis-biner mereka.
ProdigySim

1
@ ProdigySim: Saya tahu beberapa yang melakukannya. Dari atas kepala saya, World of Warcraft (Lua + XML), seri Naughty Dog's Uncharted (Lisp), seri Unreal (UnrealScript), game berbasis pada mesin Torsi dan Persatuan, Pengepungan Penjara Bawah Tanah, Malam NeverWinter, dan banyak lainnya. Game yang digerakkan oleh data menjadi norma, di mana host scripting mengambil alih sebagian besar (jika tidak semua) fitur UI dan status game dari atas ke bawah.
greyfade

@ProdigySim: meskipun tersembunyi dari pengguna normal, bukan berarti secara internal mereka tidak menggunakan mesin skrip. Pada dasarnya pengembang game memiliki dua opsi - buat bahasa scripting mereka sendiri untuk model atau gunakan salah satu yang bertujuan umum. Lua sangat bagus untuk gim, karena umumnya bagus untuk sistem waktu nyata.
vartec

Mesin sumber menggunakan bahasa skrip Squirrel.
cubuspl42

6

Alasan pertama adalah: kebiasaan (lama)

Alasan kedua: lebih sedikit keandalan pada Mesin Virtual, juru bahasa yang perlu diinstal, dll.

Dan masih ada beberapa IDE yang bagus untuk mengembangkan kode di C ++.


1
' IDE masih sangat bagus' .. Saya berpendapat Visual Studio dan Eclipse mutakhir dan telah cukup lama.
JBRWilkinson

@ JBRWilkinson: Saya tidak mengatakan bahasa lain tidak memilikinya juga.
Roalt

6

Alasannya adalah Anda memiliki kendali lebih besar atas semua yang terjadi. Jika Anda akan menulis photoshop di C #, Anda akan memiliki masalah kinerja yang serius untuk beberapa tugas. Dalam bahasa tingkat rendah dengan lebih banyak kontrol, Anda dapat mengambil jalan pintas, mengoptimalkan di mana diperlukan untuk hal-hal yang lebih intens. Tentu saja ini mengasumsikan Anda menggunakan C ++ dalam kode yang tidak dikelola, bukan C ++ di .NET.

Lihat di sini untuk contoh cepat.


2
Adobe Lightroom, yang pada dasarnya adalah bagian dari Photoshop, ditulis dalam bahasa Lua.
Jörg W Mittag

4
@ Jorg: dan sisanya adalah C ++. sebenarnya itu mungkin kombinasi terbaik yang tersedia, C ++ untuk fondasi, Lua untuk sisanya (walaupun saya masih lebih suka C daripada C ++ untuk hal-hal tingkat rendah).
Javier

2
@Javier: Ya, Lightroom pada dasarnya adalah algoritma manipulasi gambar dari Photoshop (yang mungkin sebagian besar ditulis dalam perakitan MMX / SSE) dan SQLite3 (yang ditulis dalam ANSI C pra-historis untuk portabilitas) direkatkan dengan Lua. Adobe juga mengembangkan Lua IDE mereka sendiri, sepenuhnya dalam Lua. Adakah yang tahu alat grafis apa yang mereka gunakan? AFAIR Photoshop mendahului hampir semua toolkit modern, jadi mungkin itu sesuatu yang ditanam di rumah?
Jörg W Mittag

4
jangan tersinggung, tetapi jika Anda berpikir ANSI C adalah prasejarah, Anda telah membaca contoh kode yang salah
Javier

6

C ++ diketik secara statis. Ini memungkinkan untuk mengoptimalkan eksekusi kode sebelumnya dengan memiliki kompiler yang sesuai dengan abstraksi Anda untuk proses sistem yang tersedia pada platform tertentu. Hingga kini, bahasa dinamis memerlukan lapisan perangkat lunak tambahan (= penerjemah) yang memperlambat akses ke sumber daya sistem.


4

Sebagian besar alasan yang diberikan adalah teknis atau "di atas meja" ... berikut adalah alasan bisnis atau "di bawah meja":

mendistribusikan kode yang dikompilasi vs mendistribusikan kode sumber. ketika mengembangkan c / c ++ Anda mendistribusikan binari. jika Anda berkembang dalam salah satu bahasa modern, Anda mendistribusikan sumbernya. sulit untuk menjual ide obfuscator kepada manajemen yang harus menjawab kepada pemegang saham / investor jadi jangan repot-repot.

pengguna bodoh: setidaknya di benak manajemen. mereka masih menganggap pengguna mereka nyaris tidak dapat mengklik dua kali "setup.exe". Jika Anda memasukkan instalasi juru bahasa sebagai bagian dari pengaturan, mereka akan menggelengkan kepala mereka dari sisi ke sisi.

pengembang lama: kebanyakan orang dengan pengalaman sudah ada sejak lama, dan belum memperbarui diri. mereka memprogram dalam C ++ dan bukan dalam bahasa yang lebih baru, karena mereka tidak tahu bahasa yang lebih baru.


Saya berpendapat Anda distrubuting kode sumber ketika Anda merilis aplikasi .NET. Lihatlah Visual Studio banyak antarmuka dirancang dengan bentuk WPF. Beberapa poin Anda tentu saja valid, sebagian besar manajemen hari ini adalah pengembang kemarin, kabar buruk banyak kerangka kerja hari ini tidak mungkin valid karena perubahan pada komputer saat ini.
Ramhound

Banyak orang dengan banyak pengalaman telah mendapatkan pengalaman mereka dengan terus memperbarui diri. Mereka cenderung tidak belajar bahasa baru yang panas (seperti Pascal pada awal 1980-an) hanya karena mereka panas, tetapi hanya jika mereka memiliki kegunaan untuk mereka atau mereka memiliki ide yang menarik (Haskell, misalnya).
David Thornley

4

Saya akan memperluas cakupan masalah dari GUI ke perangkat lunak yang diharapkan kompetitif. C ++ tidak mengenakan pajak pada platform target karena menyangkut kekuatan pemrosesan, runtime yang diinstal, kerangka kerja dll. Jadi itu akan bekerja pada perangkat keras pelanggan yang lebih terbatas daripada solusi serupa yang ditulis dalam bahasa yang dikelola / ditafsirkan. Dalam kasus perangkat lunak komersial yang sukses, biaya pengembangan (berpotensi lebih tinggi dalam kasus C ++) diamortisasi dengan jumlah penjualan.

Selain itu, C ++ biasanya menawarkan akses langsung ke sistem apis (seperti GUI) yang memberikan peluang terbaik untuk mengoptimalkan pemanfaatan dan membedakan dirinya dari solusi serupa.


3

Saya pikir banyak yang harus dilakukan dengan API untuk toolkit GUI. Semua dari mereka memiliki C / C ++ API, tetapi tidak semua dari mereka memiliki (katakanlah) binding Python. Dan kadang-kadang toolkit sendiri ditulis dengan C ++ dalam pikiran, jadi bahkan jika mereka memiliki dukungan untuk bahasa lain mereka tidak sepenuhnya mendukung mereka (misalnya, mereka tidak akan mendukung Python tuplesebagai argumen).


Oh, mereka tidak sepenuhnya mendukung mereka, karena mereka tidak mau, atau tidak punya waktu untuk mengimplementasikannya. Bukan karena itu tidak mungkin.
cubuspl42

2

Anda menyebut peramban dan permainan sebagai contoh. Keduanya adalah aplikasi yang cukup penting untuk kinerja, sehingga membuatnya dalam bahasa tingkat rendah untuk kecepatan masuk akal.

Banyak aplikasi lain yang kurang terikat kinerja dan dapat dengan mudah ditulis dalam bahasa lain. C # khususnya tampaknya banyak digunakan. (Dan Obj-C, tapi itu tidak benar-benar memenuhi syarat sebagai tingkat tinggi kurasa. Lebih baik daripada C ++.)

Namun, ada beberapa kerangka kerja untuk bahasa pemrograman terbaru. Misalnya, tidak ada perpustakaan GUI asli yang layak untuk Python, sungguh. Tentu, Anda dapat menggunakan PyQt atau PyGtk dan mereka bekerja dengan baik, tetapi pada akhirnya, itu hanya berinteraksi dengan kode C lagi. Sekali lagi, C # (dan bisa dibilang Obj-C) tampaknya menjadi pengecualian dan mungkin, MacRuby atau IronPython dapat mengubah permainan itu.


0

Agar suatu bahasa dapat menggantikan C ++ atau Java, ia harus melakukan apa yang sangat dirindukan dalam bahasa-bahasa ini selain tampil dengan kekuatan mereka sendiri. Juga, investasi besar telah masuk ke dalam bahasa-bahasa ini. Itu berarti ada pustaka C ++ standar pada banyak platform, yang dapat dengan mudah digunakan browser, permainan, dan program semacam itu. Jadi pasti ada beberapa inersia. Bahasa cenderung lepas landas secara perlahan tidak seperti perangkat lunak lain.

Jika Anda melihatnya, Anaconda (program penginstal RedHat) telah ada selama sekitar 10 tahun, ditulis dengan Python sejak awal. Python tidak sepopuler ini ketika Anaconda masih baru.

Google's Go (golang.org) berkembang sangat cepat. Kompiler belum di-bootstrap. Agar popularitasnya lepas landas, perpustakaannya harus stabil, compiler harus di-bootstrap, dan, lebih banyak orang harus menggunakannya. Saya telah mendengar satu program produksi di luar Google ditulis dalam Go dan dilaporkan tidak memiliki waktu istirahat dalam waktu lebih dari setahun.


1
Sebenarnya, ada Go compiler komersial untuk Windows yang ditulis dalam Go, jadi ada adalah sebuah compiler dinyalakan untuk Go. (Meskipun demikian, ini masih dalam versi beta tertutup.)
Jörg W Mittag

Oh, aku sudah kehilangan kontak, kalau begitu. Terima kasih telah memberi tahu :)
vpit3833

2
Ini disebut erGo dan diproduksi oleh perusahaan bernama Newquist Solutions .
Jörg W Mittag
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.