Ketikan dikirim ke JS. Lalu ada getar pohon, "kurang" (opsional) dan apa lagi dalam proses membuat penerapan. Tapi tidak ada yang seperti itu (afaik) yang ada hubungannya dengan "kompilasi". Semuanya dibundel dan sangat dioptimalkan, tetapi sebenarnya tidak dikompilasi, bukan?
Kompilasi berarti mengubah program yang ditulis dalam bahasa A menjadi program yang secara semantik setara yang ditulis dalam bahasa B sehingga mengevaluasi program yang dikompilasi sesuai dengan aturan bahasa B (misalnya menafsirkannya dengan penerjemah untuk B ) menghasilkan hasil yang sama dan memiliki efek samping yang sama seperti mengevaluasi program asli sesuai dengan aturan bahasa A (misalnya menafsirkannya dengan penerjemah untuk A ).
Kompilasi hanya berarti menerjemahkan program dari bahasa A ke bahasa B . Hanya itu artinya. (Juga perhatikan bahwa sangat mungkin A dan B menjadi bahasa yang sama.)
Dalam beberapa kasus, kami memiliki nama yang lebih terspesialisasi untuk jenis kompiler tertentu, bergantung pada apa itu A dan B , dan apa yang dilakukan kompilator:
- jika A dianggap sebagai bahasa assembly dan B dianggap sebagai bahasa mesin, maka kami menyebutnya assembler ,
- jika A dianggap sebagai bahasa mesin dan B dianggap sebagai bahasa assembly, maka kami menyebutnya disassembler ,
- jika A dianggap levelnya lebih rendah dari B , maka kami menyebutnya decompiler ,
- jika A dan B adalah bahasa yang sama, dan program yang dihasilkan lebih cepat atau lebih ringan, maka kami menyebutnya pengoptimal ,
- jika A dan B adalah bahasa yang sama, dan program yang dihasilkan lebih kecil, maka kita menyebutnya minifier ,
- jika A dan B adalah bahasa yang sama, dan program yang dihasilkan kurang terbaca, maka kita menyebutnya obfuscator ,
- jika A dan B dianggap berada pada tingkat abstraksi yang kira-kira sama, maka kami menyebutnya transpiler , dan
- jika A dan B dianggap berada pada tingkat abstraksi yang kira-kira sama dan program yang dihasilkan mempertahankan pemformatan, komentar, dan maksud pemrogram sedemikian rupa sehingga memungkinkan untuk mempertahankan program yang dihasilkan dengan cara yang sama seperti program aslinya, maka kita memanggil itu alat rekayasa ulang .
Juga, perhatikan bahwa sumber yang lebih lama mungkin menggunakan istilah "terjemahan" dan "penerjemah" daripada "kompilasi" dan "kompilator". Misalnya, C berbicara tentang "unit terjemahan".
Anda juga mungkin menemukan istilah "pemroses bahasa". Ini bisa berarti compiler, interpreter, atau compiler dan interpreter bergantung pada definisinya.
Javascript sendiri masih diartikan kan?
JavaScript adalah sebuah bahasa. Bahasa adalah sekumpulan aturan dan batasan logis. Bahasa tidak diinterpretasikan atau dikompilasi. Bahasa hanya merupakan .
Kompilasi dan interpretasi adalah ciri-ciri seorang compiler atau interpreter (duh!). Setiap bahasa dapat diimplementasikan dengan kompiler dan setiap bahasa dapat diimplementasikan dengan penerjemah. Banyak bahasa memiliki kompiler dan interpreter. Banyak mesin eksekusi berperforma tinggi modern memiliki setidaknya satu kompiler dan setidaknya satu interpreter.
Kedua istilah ini termasuk dalam lapisan abstraksi yang berbeda. Jika bahasa Inggris adalah bahasa yang diketik, "bahasa yang ditafsirkan" akan menjadi kesalahan jenis.
Perhatikan juga bahwa beberapa bahasa tidak memiliki interpreter atau compiler. Ada bahasa yang tidak memiliki implementasi sama sekali. Tetap saja, mereka adalah bahasa, dan Anda dapat menulis program di dalamnya. Anda tidak bisa menjalankannya.
Juga, perhatikan bahwa semuanya ditafsirkan di beberapa titik : jika Anda ingin mengeksekusi sesuatu, Anda harus menafsirkannya. Kompilasi hanya menerjemahkan kode dari satu bahasa ke bahasa lain. Itu tidak menjalankannya. Interpretasi menjalankannya. (Kadang-kadang, ketika penerjemah diimplementasikan di perangkat keras, kami menyebutnya sebagai "CPU", tetapi ini masih merupakan penerjemah.)
Contoh kasus: setiap implementasi JavaScript mainstream yang ada saat ini memiliki kompiler.
V8 dimulai sebagai kompiler murni: ia mengkompilasi JavaScript langsung ke kode mesin asli yang dioptimalkan secara moderat. Kemudian, kompiler kedua ditambahkan. Sekarang, ada dua kompiler: kompiler ringan yang menghasilkan kode yang cukup dioptimalkan tetapi kompilernya sendiri sangat cepat dan menggunakan sedikit RAM. Kompiler ini juga memasukkan kode profil ke dalam kode yang dikompilasi. Kompiler kedua adalah kompiler kelas berat, lebih lambat, lebih mahal, yang, bagaimanapun, menghasilkan kode yang jauh lebih ketat, lebih cepat. Ini juga menggunakan hasil kode profil yang dimasukkan oleh compiler pertama untuk membuat keputusan pengoptimalan dinamis. Selain itu, keputusan kode mana yang akan dikompilasi ulang menggunakan kompilator kedua dibuat berdasarkan informasi profil tersebut. Perhatikan bahwa tidak ada penerjemah yang terlibat. V8 tidak pernah menafsirkan, ia selalu dikompilasi. Itu tidak t bahkan mengandung penerjemah. (Sebenarnya, saya yakin saat ini memang demikian, saya sedang menjelaskan dua iterasi pertama.)
SpiderMonkey mengompilasi JavaScript ke bytecode SpiderMonkey, yang kemudian diinterpretasikan. Interpreter juga membuat profil kode, dan kemudian kode yang paling sering dieksekusi dikompilasi oleh compiler ke kode mesin native. Jadi, SpiderMonkey berisi dua kompiler: satu dari JavaScript ke bytecode SpiderMonkey, dan satu lagi dari bytecode SpiderMonkey ke kode mesin asli.
Hampir semua mesin eksekusi JavaScript (dengan pengecualian V8) mengikuti model kompiler AOT yang mengompilasi JavaScript ke bytecode, dan mesin mode campuran yang beralih antara menafsirkan dan mengompilasi bytecode tersebut.
Anda menulis dalam komentar:
Saya benar-benar berpikir bahwa kode mesin ada di suatu tempat yang terlibat.
Apa artinya "kode mesin"?
Apa bahasa mesin satu orang adalah bahasa perantara orang lain dan sebaliknya? Misalnya, ada CPU yang secara native dapat mengeksekusi bytecode JVM, pada CPU seperti itu, bytecode JVM adalah kode mesin native. Dan ada interpreter untuk kode mesin x86, ketika Anda menjalankan kode mesin x86 tersebut diinterpretasikan bytecode.
Ada interpreter x86 yang disebut JPC yang ditulis di Java. Jika saya menjalankan kode mesin x86 pada JPC yang berjalan pada CPU JVM asli… yang merupakan bytecode dan yang merupakan kode asli? Jika saya mengompilasi kode mesin x86 ke JavaScript (ya, ada alat yang dapat melakukannya) dan menjalankannya di browser pada ponsel saya (yang memiliki CPU ARM), yang merupakan bytecode dan yang merupakan kode mesin asli? Bagaimana jika program yang saya kompilasi adalah emulator SPARC, dan saya menggunakannya untuk menjalankan kode SPARC?
Perhatikan bahwa setiap bahasa menginduksi mesin abstrak, dan merupakan bahasa mesin untuk mesin itu. Jadi, setiap bahasa (termasuk bahasa tingkat sangat tinggi) adalah kode mesin asli. Selain itu, Anda dapat menulis penerjemah untuk setiap bahasa. Jadi, setiap bahasa (termasuk kode mesin x86) tidak asli.