Apa artinya “bahasa A ditulis dalam bahasa B”?


31

Saya sering mendengar istilah bahwa bahasa A ditulis dalam bahasa B. Misalnya, PHP telah ditulis C , C # ditulis dalam C ++ .

Dapatkah seseorang tolong jelaskan apa artinya itu dan apakah itu benar? Apakah itu ada hubungannya dengan kompiler interpreter yang digunakan oleh bahasa?

Selain itu, faktor apa saja yang menjadi dasar pemilihan bahasa pelaksana?


19
Sebenarnya, "PHP telah ditulis dalam C" salah. Suatu bahasa pada dasarnya adalah definisi formal, oleh karena itu ia tidak ditulis dalam bahasa pemrogram lain (melainkan dalam bahasa Inggris); hanya compiler, interpreter, dan / atau library yang dapat ditulis dalam C, C ++ atau apa pun. Dalam praktiknya, untuk banyak bahasa ada satu kompiler atau juru bahasa yang dominan, dan perbedaan antara definisi dan implementasi bahasa tidak dibuat.
user281377

Menariknya BCPL sebagian besar ditulis dalam BCPL
OldCurmudgeon

7
PHP "per se", bukan definisi formal. Ini adalah program C.
Kaz

8
s/written/implemented/dan itu jauh lebih jelas.
TMN

2
@ugoren Ada banyak kompiler C yang ditulis dalam assembly. Namun, tidak begitu banyak abad ini.
Ross Patterson

Jawaban:


30

Sebagian besar bahasa pemrograman terbagi dalam dua kategori: bahasa yang ditafsirkan dan dikompilasi.

Bahasa yang dikompilasi diterjemahkan oleh kompiler ke dalam kode mesin , bahasa yang CPU secara langsung jalankan langkah demi langkah. Bahasa yang ditafsirkan, di sisi lain, menggunakan perantara, juru bahasa , untuk menjalankan kode bahasa. Interpreter itu sendiri adalah program lain, biasanya itu sendiri dikompilasi ke kode mesin.

PHP adalah bahasa yang diartikan. Anda memerlukan program terpisah untuk menjalankan kode PHP, komputer tidak menjalankan program secara langsung. Program terpisah itu, juru bahasa PHP, ditulis dengan huruf C.

C # adalah bahasa yang dikompilasi, tetapi tidak dikompilasi ke kode mesin. Sebaliknya, ini dikompilasi ke bahasa spesialis, kode byte, untuk dijalankan pada mesin virtual. Java adalah contoh lain dari pengaturan semacam itu. Anda bisa melihatnya sebagai gabungan antara kompilasi dan interpretasi, di mana mesin virtual adalah seorang juru bahasa. Mesin virtual untuk C # (CLI, atau Infrastruktur Bahasa Umum ) ditulis dalam C ++.

Contoh lain adalah:

  • Python: Interpreter Python mengkompilasi kode Python ke bytecode Python, kemudian menginterpretasikan bytecode tersebut. Interpreter itu sendiri ditulis dalam C. Implementasi baru telah ditambahkan, termasuk yang mengkompilasi python untuk berjalan pada CLI yang sama yang digunakan untuk C #, yang disebut IronPython , dan yang berjalan pada mesin virtual Java, Jython . Untuk melengkapi lingkaran, ada versi Python yang ditulis dalam (subset dari) Python, PyPy .
  • Ruby: Ruby dimulai sebagai bahasa yang ditafsirkan murni, tetapi versi terbaru beralih ke menggunakan bytecode. Untuk Ruby, juga, ada proyek yang mengkompilasi ke CLI, bernama IronRuby , dan satu untuk Java VM, JRuby .

Maaf, bagaimana perbedaan antara mesin virtual dan interpreter? Saya tidak melihat bagaimana menggunakan satu adalah titik setengah untuk kompilasi. Apakah Anda mengatakan bahwa bytecode setengah dikompilasi?
Philip

1
@ Pilip: Kode byte bukan kode mesin; jadi alih-alih memberikan instruksi langsung kepada CPU, Anda masih membutuhkan juru bahasa untuk mengambil kode byte dan menerjemahkannya, menerjemahkannya ke dalam instruksi mesin. Keuntungannya adalah bahwa mesin virtual lebih mudah untuk port ke arsitektur lain, dan Anda dapat menerapkan trik seperti kompilasi JIT .
Martijn Pieters

Adakah yang merasa istilah "dikompilasi" telah terdilusi untuk tujuan pemasaran?
Philip

2
Wah! Saya ambil itu kembali. Saya pergi ke jalan yang salah di sana untuk sementara waktu. Saya menduga bahwa "dikompilasi" berarti berubah menjadi kode mesin dan hanya kode mesin, yang sebenarnya tidak benar. Itu hanya istilah untuk menerjemahkan kode ke kode lain. Baik itu kode mesin, bytecode, atau bahasa apa pun yang Anda inginkan. Juga, ternyata ada kompiler PHP di luar sana, jadi Anda hanya bisa mengatakan itu "biasanya" ditafsirkan.
Philip

Juga sumber yang bagus: youtube.com/watch?v=e4ax90XmUBc
Adam

34

Anda pada dasarnya benar. Jika dikatakan bahwa Ruby ditulis dalam C, ini berarti bahwa penerjemah bahasa dan bagian dari perpustakaan inti ditulis dalam C.

Jadi interpreter Ruby adalah program C yang mengambil file teks sebagai input, memprosesnya dan kemudian memanggil fungsi-fungsi yang ada di file teks lain (jika ditulis dalam Ruby) atau yang menyusun kode C, sebanyak fungsionalitas dasar yang membutuhkan untuk secara langsung mengakses sumber daya sistem seperti memori, sistem file dan banyak lagi. Dan beberapa fungsi yang membutuhkan kinerja sangat tinggi.

Jadi Anda memiliki bagian berbeda dari bahasa yang dapat atau harus ditulis dalam bahasa lain. Tidak ada yang akan mencegah Anda menulis juru bahasa di C dan perpustakaan di C ++ (meskipun mungkin membuat beberapa hal lebih sulit). Anda bahkan dapat memiliki beberapa langkah dan menggunakan bahasa yang sangat bagus dalam pemrosesan teks untuk menghasilkan beberapa data perantara yang kemudian diproses oleh beberapa kode C.

Faktor-faktor untuk keputusan mungkin sama seperti untuk aplikasi kompleks lainnya. Performa adalah satu. Kemampuan untuk menulis kode yang dapat mengakses sumber daya sistem secara langsung. Jadi dalam banyak kasus itu harus bahasa yang dikompilasi (meskipun secara teori Anda bisa menulis interpreter Ruby dengan Python). Ketersediaan pada sistem yang berbeda adalah penting jika Anda ingin bahasa Anda berjalan di Linux, Win, OS X dan lainnya.


Apakah ada yang tahu mengapa saya melihat tiga upvotes untuk jawaban saya saat saya mempostingnya?
thorsten müller

1
Saya melihat empat sekarang, tapi saya tidak begitu yakin apa yang Anda tanyakan? Apakah upvotes muncul terlalu cepat? Jika demikian, ya, banyak perhatian pada pertanyaan (tiga jawaban yang hampir bersamaan), dan jawaban Anda baik.
yannis

Hmm, ya. Mungkin saya telah menyimpannya dan kemudian diedit, disimpan lagi dan lupa tentang penyimpanan pertama (saya semakin tua). Bagi saya itu tampak seolah-olah saya mendapat tiga upvotes pertama saat saya memposting.
thorsten müller

@ thorstenmüller +1 untuk "Tidak ada yang akan mencegah Anda menulis juru bahasa di C dan perpustakaan di C ++" Saya baru saja akan bertanya kepada Anda tentang hal ini. Apakah ada implementasi terkenal untuk ini di mana penerjemah / kompiler dalam satu bahasa sedangkan perpustakaan inti dalam bahasa lain?
Songo

@ thorstenmüller Saya pernah mengalami hal itu beberapa kali. Jika beberapa orang melihat pertanyaan ketika Anda memposting, akan ada pesan kecil yang mengatakan "Sebuah jawaban baru telah diposting" dalam satu atau dua detik dari Anda yang mengirimkan, sehingga mereka dapat membaca seluruh jawaban dan terangkat dalam 10 detik. dari posting Anda itu. Selain itu, pengeditan yang dilakukan dalam 5 menit setelah memposting jawaban tidak muncul dalam riwayat sunting, yang selanjutnya dapat menyebabkan sedikit kebingungan di pihak Anda.
Izkata

10

Ini berarti bahwa sebagian besar inti dari bahasa A ditulis dalam bahasa B. Apa "inti dari bahasa A" mungkin berbeda dari bahasa ke bahasa, tetapi secara umum Anda menebak dengan benar, itu berarti kompiler atau juru bahasa. Faktor penentu dalam memilih bahasa untuk menulis bahasa lain adalah, seperti pada hampir setiap proyek, bahasa apa yang lebih dikenal oleh pengembang.

Yang mengatakan, "bahasa A ditulis dalam bahasa B" adalah penyederhanaan yang berlebihan untuk sebagian besar bahasa modern. Jika kita mengambil Python sebagai contoh, sedangkan implementasi referensi, CPython , memang ditulis dalam C ada implementasi yang ditulis dalam bahasa lain, seperti Jython (ditulis dalam Java), IronPython (ditulis dalam C #), PyPy (ditulis dalam Python), CLPython (ditulis dalam Common Lisp), Stackless Python (ditulis dalam C dan Python) dan Unladen Swallow (ditulis dalam C ++).

Bahasa pemrograman adalah sebuah definisi, dan seperti yang ditunjukkan oleh contoh Python, sebenarnya tidak ada batasan pada bahasa apa yang dapat ditulis oleh kompiler, penerjemah, dan perpustakaan. Dan tentu saja juga memungkinkan untuk bahasa yang ditulis sendiri, melalui proses yang disebut bootstrap .


2
Saya tidak akan menyebut Psyco implementasi lain, karena ini dijalankan sebagai ekstensi untuk CPython.
Martijn Pieters

@ MartijnPieters Ini juga merupakan proyek mati, menurut situsnya. Dihapus.
yannis

@YannisRizos Bukankah Unladen Swallow juga mati ?
Andres F.

1
@Songo: Selain itu string.lower(s)adalah fungsi python yang mendelegasikan itu return s.lower(), itu benar. The CPython operasi kasus 3.3 string yang diimplementasikan dalam C.
Martijn Pieters


3

Dari perspektif menggunakan bahasa pemrograman, bahasa pemrograman hanyalah sebuah program. Mungkin kompiler, atau mungkin juru bahasa, atau mungkin semacam mesin virtual. Semua itu hanyalah program komputer, dan dengan demikian dapat ditulis dalam bahasa apa pun.

Jadi, jika Anda ingin membuat versi PHP Anda sendiri, Anda bisa mulai dengan bahasa apa pun yang paling lancar Anda gunakan. Anda kemudian akan menulis program yang dapat membaca kode berformat PHP dan melakukan apa pun yang menurut spesifikasi PHP program Anda harus lakukan . Anda dengan demikian membuat bahasa PHP dalam bahasa X.


Poin yang menarik. Jadi pada dasarnya jika saya memiliki fungsi built-in di PHP explodeyang mengambil Stringdan mengembalikan sebuah Array, implementasinya (yaitu kode yang akan beroperasi pada string untuk menghasilkan array) ditulis dalam C , kan?
Songo

@Songo: benar. Sekali lagi, PHP hanyalah sebuah program, tidak ada bedanya dengan Word atau Apache atau Notepad atau vi atau emacs. Ia membaca data dan mem-parsingnya menurut spesifikasi bahasa, lalu melakukan apa pun yang menurut spesifikasi bahasa harus dilakukan.
Bryan Oakley

Jawaban ini sangat mengonfigurasi bahasa dengan implementasi.
Russell Borogove

Saya pikir ini adalah jawaban yang paling sederhana dan paling langsung dan saya tidak melihat bagaimana itu mengonfigurasi apa pun. Bahkan menunjukkan bahwa mungkin ada lebih dari satu implementasi PHP. Sebenarnya ada beberapa, PHP asli, dan Facebook thingy, dan mungkin ada yang lain.
Warren P

@RussellBorogove: apakah Anda tidak berpikir bahwa "dari perspektif menggunakan bahasa pemrograman" membantu menjelaskan jawabannya? Ingat, kita berhadapan dengan seorang pemula absolut dengan pertanyaan ini, jadi mengorbankan sedikit presisi untuk mengilustrasikan poin itu adil, IMO.
Bryan Oakley

3

Ungkapan yang sangat mirip dengan makna yang sangat berbeda adalah "menulis bahasa A dalam bahasa B", misalnya "menulis C di Jawa".

Ini menjelaskan kode yang secara sintaksis benar dalam satu bahasa, tetapi menggunakan struktur, idiom, dan konvensi dari bahasa lain. Dalam contoh "menulis C di Jawa", tanda-tanda ini akan mendeklarasikan semua variabel lokal di atas setiap metode, menggunakan konstanta integer alih-alih enum, menggunakan identifiers_with_underscores, dll.

Biasanya ini terjadi ketika seseorang telah bekerja dengan satu bahasa untuk waktu yang lama (terutama ketika mereka hanya bekerja dengan bahasa itu) dan sangat baru dengan bahasa saat ini (atau tidak tertarik untuk menulis kode bersih).


"CPython ditulis dalam C" jelas tidak berarti "pengguna ini menulis dengan Python seperti itu C". Ini berarti CPython (Python.exe di windows, / usr / bin / python di Unix) ditulis dalam C.
Warren P

@ Warren P: tentu, tetapi frasa sangat mirip, sehingga orang yang tidak terbiasa dengan salah satu dari mereka bisa dengan mudah berakhir di sini mencari penjelasan.
Michael Borgwardt

3

Teknologi adalah proses yang berulang secara inheren. Kami mulai dengan alat sederhana dan kemudian menggunakan alat itu untuk membuat yang lebih baik. Bahasa assembly pertama cukup banyak terjemahan 1: 1 dari bytecode instruksi standar untuk chip; arsitektur 8086 dan assemblernya menjadi dominan di atas arsitektur lain seperti Z80, RISC, dll, sehingga kami mulai mengembangkan bahasa yang dapat dicerna menjadi perakitan 8086, seperti FORTRAN, COBOL, Pascal dan C. Program yang menginterpretasikan kode sumber dari bahasa-bahasa ini harus ditulis dalam sesuatu yang lebih primitif, jika tidak Anda berakhir dengan argumen ayam-dan-telur; jika kode sumber untuk kompiler C pertama ditulis dalam C, lalu apa yang dikompilasi kode sumber C, dan bukankah itu, menurut definisi, menjadi kompiler C pertama?

Pada dasarnya, "C # ditulis dalam C ++" harus diartikan bahwa pustaka kompiler dan runtime / inti yang pertama dan / atau paling populer yang mematuhi spesifikasi bahasa C # (yang adalah Microsoft .NET Framework, dan kompiler baris perintah program CSC.exe) ditulis dalam C ++.


0

"Bahasa A ditulis dalam bahasa B" berarti bahwa satu-satunya implementasi bahasa A (atau satu-satunya yang banyak digunakan) adalah yang sebenarnya merupakan proyek yang dikembangkan dalam bahasa B, dan satu-satunya yang lengkap, mutakhir. spesifikasi A adalah kode sumber B yang mengimplementasikannya sehingga jika dokumentasi dan program B tidak setuju, program B biasanya dianggap benar.


Tidak ada satu implementasi C ++ yang otoritatif. Dalam kasus C ++, spek sudah benar, dan perilaku tidak terdefinisi dalam spek dapat melakukan apa pun dalam implementasi Anda. Jadi tidak, ini tidak benar.
Warren P

Saya tidak mengerti apa kaitan komentar sebelumnya dengan jawaban saya. Saya tidak membuat pernyataan terkuantifikasi universal tentang semua bahasa, dan sehingga counterexample C ++ tidak berlaku. Pernyataan bentuk "A ditulis dalam B", di mana A adalah "C ++", tidak masuk akal, kecuali ketika B adalah "Bahasa Inggris".
Kaz
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.