Jumat, 28 Oktober 2011

IF, IF-ELSE, IF-ELSE-IF


IF
Jika membangun adalah salah satu fitur yang paling penting dari banyak bahasa, PHP disertakan. Hal ini memungkinkan untuk eksekusi kondisional fragmen kode. PHP fitur struktur jika yang mirip dengan C:
 if (expr)
   pernyataan
Seperti dijelaskan dalam bagian mengenai ekspresi , ekspresi dievaluasi untuk nilai Boolean nya. Jika ekspresi mengevaluasi ke BENAR, PHP akan mengeksekusi pernyataan, dan jika mengevaluasi ke FALSE - itu akan mengabaikannya. Informasi lebih lanjut tentang nilai-nilai apa mengevaluasi ke FALSE dapat ditemukan di 'Konversi ke boolean' bagian.
Contoh berikut akan menampilkan lebih besar dari b jika $ a lebih besar dari $ b:
<?php
if ( $a > $b )
echo "a is bigger than b" ;
?>
Seringkali Anda ingin memiliki lebih dari satu pernyataan untuk dieksekusi kondisional. Tentu saja, tidak ada perlu untuk membungkus setiap pernyataan dengan klausa jika. Sebaliknya, Anda dapat mengelompokkan beberapa pernyataan ke dalam kelompok pernyataan. Sebagai contoh, kode ini akan menampilkan lebih besar dari b jika $ a lebih besar dari $ b, dan kemudian akan menetapkan nilai $ ke $ b:
<?php
if ( $a > $b ) {
echo "a is bigger than b" ;
$b = $a ;
}
?>
Jika laporan dapat bersarang jauh dalam lain jika pernyataan, yang memberikan Anda fleksibilitas lengkap untuk eksekusi bersyarat dari berbagai bagian dari program anda. 

IF-ELSE

Statemen IF akan bercabang sesuai dengan hasil dari operasi boolean (true & false). Pertama-tama kita akan pelajari percabangan satu arah :
if EkspresiBoolean then
  StatemenTrue;
Bila ekspresi boolen bernilai benar (true), maka statemen akan dieksekusi. Bila bernilai salah maka tidak akan dieksekusi. Berikut contohnya :
uses wincrt;
var a : integer;
begin
  a := 1;
  write('sinau');
  if a = 1 then
    write(' bersama');
end.
Hasil eksekusi:
sinau bersama
Penjelasan:
Diawal diberikan nilai pada a yaitu 1. Setelah dilakukan output (‘sinau’), nilai a diuji, karena nilai a bernilai benar (a=1) maka dilakukan output (‘ bersama’).
uses wincrt;
var a : integer;
begin
  a := 0;
  write('sinau');
  if a = 1 then
    write(' bersama');
end.
Hasil eksekusi:
sinau
Penjelasan:
Diawal diberikan nilai pada a yaitu 1. Setelah dilakukan output (‘sinau’), nilai a diuji, karena nilai a bernilai salah (a=0) maka program melewati statemen if dan selesai dieksekusi.
Bila statemen IF hanya mempunyai satu statemen saja, tidak diperlukan penanda (begin-end). Tapi bila lebih maka harus menggunakan begin-end.
uses wincrt;
var a : integer;
begin
  a := 1;
  write('sinau');
  if a = 1 then begin
    write(' bersama');
    write(' sahabat');
  end;
end.
Hasil eksekusi:
sinau bersama sahabat
Penjelasan:
Diawal diberikan nilai pada a yaitu 1. Setelah dilakukan output (‘sinau’), nilai a diuji, karena nilai a bernilai benar (a=1) maka dilakukan output (‘ bersama’) dan output (‘ sahabat’).
Juga terdapat percabangan dua arah :
if EkspresiBoolean then
  StatemenTrue
else
  StatemenFalse;
Bila ekspresi boolean menghasilkan nilai salah (false), maka akan dieksekusi statemen setelah else. Harus diperhatikan bahwa tanda titik koma (;) sebelum else harus dihilangkan.
uses wincrt;
var a : integer;
begin
  a := 0;
  write('sinau');
  if a = 1 then begin
    write(' bersama');
    write(' sahabat');
  end
  else begin
    write(' pascal');
    write(' bersama keluarga');
  end;
end.
Hasil eksekusi:
sinau pascal bersama keluarga
Diawal diberikan nilai pada a yaitu 0. Setelah dilakukan output (‘sinau’), nilai a diuji, karena nilai a bernilai salah (a=0) maka dilakukan output (‘ pascal’) dan output (‘ bersama keluarga’).
Terkadang kita memerlukan lebih dari dua percabangan, maka kita memerlukan if bersarang (nested if).
if EkspresiBoolean1 then
  Statemen1
else
  if EkspresiBoolean2 then
    Statemen2
  else then
    Statemen3
Penulisannya lebih mudah dipahami dengan pola seperti :
if EkspresiBoolean1 then
  Statemen1
else if EkspresiBoolean2 then
  Statemen2
else then
  Statemen3
uses wincrt;
var a : integer;
begin
  a := 3;
  write('sinau');
  if a = 1 then
    write(' bersama');
  else if a = 2 then
    write(' pascal');
  else
    write(' pemrograman');
end.
Hasil eksekusi:
sinau pemrograman
Diawal diberikan nilai pada a yaitu 1. Setelah dilakukan output (‘sinau’), nilai a diuji, karena nilai a bernilai salah (a tidak sama dengan 1) maka dilakukan pengujian if berikutnya, if berikutnya pun bernilai salah (a tidak sama dengan 2) maka dilakukan statemen pada else yaitu output berupa (‘ pemrograman’).

Kata Kunci

if else, if then else pada pascal, if bersarang pascal, buatlah flowchart untuk if-then if-then-else dan if bersarang pada vb, nilai dari if condition, nota menggunakan else if pascal, pascal if menggunakan begin, pencabangan if bersarang c, penggunaan if dan and di pascal, penggunaan if else pada pascal.

IF-ELSE-IF

/*Kontrol pemrograman di bahasa JAVA antara lain adalah seleksi. Salah satu kontrol seleksi yaitu IF ELSE IF. Dengan kontrol ini, kita bisa membuat banyak keputusan berdasarkan kondisi-kondisi yang dipenuhi. Tanpa banyak teori lagi, silahkan di cek*/

/*beberapa baris dibawah ini sudah dibahas di posting sebelumnya*/
import java.io.*;
import java.util.Scanner;
public class if_else_if{
public static void main(String[] args){
Scanner masukan = new Scanner(System.in);
double nilai;
System.out.println("Masukan nilai anda");
nilai = masukan.nextDouble();

/*jika nilai lebih besar dari 90, akan tercetak "Luar biasa!!"*/
if (nilai > 90){
System.out.println("Luara biasa!!");}

/*Jika kondisi pertama terpenuhi, maka kondisi dibawahnya tidak diperiksa meskipun sebenarnya juga memenuhi*/
else if (nilai > 80){
System.out.println("Hebat!!");}
else if (nilai >= 70){
System.out.println("Bagus!!");}
else if(nilai < 70){
System.out.println("Nilai tidak cukup");}
}
}
/*mengulang lagi, jika kita masukan angka 95, maka kondisi 1, 2, 3 semuanya terpenuhi. Tapi expresi yang akan dijalankan hanyalah expresi pada kondisi pertama saja. Dengan kata lain, apabila ada beberapa kondisi yang terpenuhi, maka yang dijalankan hanyalah kondisi yang paling atas saja*/

COMPILER

Sebuah kompiler adalah sebuah program komputer (atau set program) yang mengubah kode sumber yang ditulis dalam bahasa pemrograman (bahasa sumber) ke lain bahasa komputer (bahasa target, sering kali memiliki bentuk biner yang dikenal sebagai kode objek ). Alasan paling umum untuk ingin untuk mengubah kode sumber adalah untuk menciptakan sebuah executable program.
Nama "compiler" yang terutama digunakan untuk program yang menerjemahkan kode sumber dari bahasa pemrograman tingkat tinggi ke bahasa tingkat rendah (misalnya, bahasa assembly atau kode mesin ). Jika program disusun dapat dijalankan pada komputer yang CPU atau sistem operasi ini berbeda dari satu di compiler yang berjalan, compiler dikenal sebagai cross compiler- . Sebuah program yang menerjemahkan dari bahasa tingkat rendah ke tingkat yang lebih tinggi satu adalah decompiler . Sebuah program yang menerjemahkan antara bahasa tingkat tinggi biasanya disebut penerjemah bahasa , penerjemah sumber ke sumber, atau converter bahasa. Sebuah bahasa Rewriter biasanya sebuah program yang menerjemahkan bentuk ekspresi tanpa perubahan bahasa.
Sebuah kompiler kemungkinan untuk melakukan banyak atau semua operasi berikut: analisis leksikal , preprocessing , parsing , analisis semantik ( Sintaks-diarahkan terjemahan ), generasi kode , dan kode optimasi .
Program kesalahan disebabkan oleh perilaku compiler yang salah bisa sangat sulit untuk melacak dan bekerja di sekitar, sehingga pelaksana kompilator menginvestasikan banyak waktu memastikan kebenaran perangkat lunak mereka .
Istilah kompiler-kompiler kadang-kadang digunakan untuk merujuk kepada parser generator , alat sering digunakan untuk membantu menciptakan lexer dan parser .

Isi

 [hide

[ sunting ] Sejarah

Perangkat lunak untuk komputer awal terutama ditulis dalam bahasa assembly selama bertahun-tahun. Pemrograman bahasa tingkat tinggi tidak ditemukan sampai manfaat yang dapat menggunakan kembali perangkat lunak pada berbagai jenis CPU mulai menjadi signifikan lebih besar daripada biaya penulisan kompilator. Sangat terbatas memori kapasitas awal komputer juga menciptakan banyak masalah teknis ketika mengimplementasikan kompilator.
Menjelang akhir 1950-an, mesin-independen bahasa pemrograman yang pertama kali diajukan. Selanjutnya, beberapa kompiler eksperimental dikembangkan. Compiler pertama ditulis oleh Grace Hopper , pada tahun 1952, untuk bahasa pemrograman A-0 . Para FORTRAN tim yang dipimpin oleh John Backus di IBM biasanya dikreditkan memiliki memperkenalkan compiler lengkap pertama di tahun 1957. COBOL adalah bahasa awal yang harus dikompilasi pada beberapa arsitektur, pada tahun 1960. [1]
Dalam domain aplikasi banyak ide untuk menggunakan bahasa tingkat tinggi dengan cepat tertangkap. Karena fungsi memperluas didukung oleh lebih baru bahasa pemrograman dan meningkatnya kompleksitas arsitektur komputer, compiler telah menjadi lebih dan lebih kompleks.
Kompiler awal ditulis dalam bahasa assembly. Yang pertama hosting diri compiler - mampu kompilasi sumber sendiri kode dalam bahasa tingkat tinggi - diciptakan untuk Lisp oleh Tim Hart dan Mike Levin di MIT pada tahun 1962. [2] Sejak 1970-an itu telah menjadi praktek umum untuk menerapkan compiler dalam bahasa itu mengkompilasi, meskipun keduanya Pascal dan C telah pilihan populer untuk bahasa implementasi. Membangun kompiler diri hosting adalah bootstrap masalah compiler seperti pertama untuk bahasa harus dikompilasi baik oleh compiler ditulis dalam bahasa yang berbeda, atau (seperti dalam Hart dan Levin Lisp kompiler) dikompilasi dengan menjalankan compiler dalam interpreter .

[ sunting ] Compiler dalam pendidikan

Compiler konstruksi dan optimasi compiler diajarkan di universitas dan sekolah sebagai bagian dari ilmu komputer kurikulum. Program semacam ini biasanya dilengkapi dengan pelaksanaan sebuah compiler untuk bahasa pemrograman pendidikan . Sebuah contoh yang terdokumentasi dengan baik adalah Niklaus Wirth 's PL / 0 compiler, yang Wirth digunakan untuk mengajar konstruksi compiler pada tahun 1970. [3] Terlepas dari kesederhanaan, kompilator PL / 0 memperkenalkan konsep berpengaruh beberapa bidang:
  1. Program pengembangan oleh penyempurnaan bertahap (juga judul sebuah kertas 1971 oleh Wirth) [4]
  2. Penggunaan parser keturunan rekursif
  3. Penggunaan EBNF untuk menentukan sintaks bahasa
  4. Sebuah code generator portabel memproduksi P-kode
  5. Penggunaan T-diagram [5] dalam deskripsi formal dari bootstrap masalah

[ sunting ] Kompilasi

Compiler memungkinkan pengembangan program-program yang mesin-independen. Sebelum pengembangan Formula Translator (FORTRAN), bahasa tingkat tinggi pertama, pada 1950-an, mesin tergantung bahasa assembly secara luas digunakan. Sementara bahasa assembly menghasilkan program yang lebih dapat digunakan kembali dan relocatable dari kode mesin pada arsitektur yang sama, itu harus diubah atau ditulis ulang jika program ini akan dieksekusi pada arsitektur hardware yang berbeda.
Dengan kemajuan tingkat tinggi bahasa pemrograman segera diikuti setelah FORTRAN, seperti COBOL, C, BASIC, programmer dapat menulis program mesin-independen sumber. Sebuah kompiler menerjemahkan tingkat tinggi program sumber ke dalam program target dalam bahasa mesin untuk hardware tertentu. Setelah target program dihasilkan, pengguna dapat mengeksekusi program.

[ sunting ] Struktur kompilator

Compiler source program jembatan di bahasa tingkat tinggi dengan perangkat keras yang mendasarinya. Sebuah kompiler membutuhkan 1) menentukan kebenaran sintaks program, 2) menghasilkan kode objek yang benar dan efisien, 3) run-time organisasi, dan 4) format output yang sesuai dengan konvensi assembler dan / atau linker. Sebuah kompiler terdiri dari tiga bagian utama: frontend, tengah-akhir, dan backend.
Ujung depan memeriksa apakah program ini benar ditulis dalam hal sintaks dan semantik bahasa pemrograman. Program di sini legal dan ilegal diakui. Kesalahan dilaporkan, jika ada, dalam cara yang bermanfaat. Jenis pemeriksaan juga dilakukan dengan mengumpulkan informasi jenis. Frontend kemudian menghasilkan representasi intermediate atau IR kode sumber untuk diproses oleh akhir menengah.
Ujung tengah di mana optimasi berlangsung. Transformasi khas untuk optimasi penghapusan kode tidak berguna atau tidak terjangkau, penemuan dan propagasi dari nilai-nilai konstan, perhitungan relokasi ke tempat yang kurang sering dieksekusi (misalnya, keluar dari loop), atau spesialisasi perhitungan berdasarkan konteks. Tengah-end lain menghasilkan IR untuk backend berikut. Upaya optimasi Kebanyakan berfokus pada bagian ini.
Bagian belakang bertanggung jawab untuk menerjemahkan IR dari ujung tengah-ke dalam kode perakitan. Instruksi sasaran (s) yang dipilih untuk setiap instruksi IR. Daftar Alokasi memberikan prosesor register untuk variabel program di mana mungkin. Backend menggunakan hardware dengan mencari tahu cara untuk menjaga paralel unit eksekusi sibuk, mengisi slot penundaan , dan sebagainya. Meskipun sebagian besar algoritma untuk optimasi di NP , teknik heuristik telah berkembang dengan baik.

[ sunting ] Compiler keluaran

Salah satu klasifikasi kompiler adalah dengan platform yang yang dihasilkan kode mereka dijalankan. Ini dikenal sebagai platform target.
Sebuah compiler asli atau host adalah salah satu yang output dimaksudkan untuk langsung menjalankan pada jenis yang sama dari sistem komputer dan operasi yang compiler itu sendiri berjalan pada. Output dari cross compiler dirancang untuk dijalankan pada platform yang berbeda. Cross compiler sering digunakan ketika mengembangkan perangkat lunak untuk sistem embedded yang tidak dimaksudkan untuk mendukung lingkungan pengembangan perangkat lunak.
Output dari compiler yang menghasilkan kode untuk sebuah mesin virtual (VM) dapat atau tidak dapat dijalankan pada platform yang sama sebagai compiler yang dihasilkan itu. Untuk alasan ini compiler seperti itu tidak biasanya diklasifikasikan sebagai compiler asli atau silang.
Bahasa tingkat yang lebih rendah yang target compiler mungkin sendiri menjadi bahasa pemrograman tingkat tinggi . C , seringkali dipandang sebagai semacam assembler portabel, juga bisa menjadi bahasa target kompilator. Misalnya: Cfront , compiler asli untuk C + + menggunakan C sebagai bahasa target.

[ sunting ] bahasa Disusun dibandingkan ditafsirkan

Tingkat tinggi bahasa pemrograman umumnya dibagi untuk kenyamanan dalam bahasa dikompilasi dan bahasa ditafsirkan . Namun, dalam praktiknya jarang ada apa-apa tentang bahasa yang membutuhkan untuk secara eksklusif dikompilasi atau ditafsirkan secara eksklusif, meskipun ada kemungkinan untuk merancang bahasa yang mengandalkan re-interpretasi pada waktu berjalan. Kategorisasi biasanya mencerminkan implementasi yang paling populer atau luas dari suatu bahasa - misalnya, BASIC adalah kadang-kadang disebut bahasa ditafsirkan, dan C yang dikompilasi, meskipun keberadaan kompiler dan interpreter BASIC C.
Tren modern menuju just-in-time kompilasi dan interpretasi bytecode pada waktu mengaburkan kategorisasi tradisional kompiler dan interpreter.
Interpretasi tidak dapat sepenuhnya menggantikan kompilasi dan perakitan : meskipun seorang juru bahasa sendiri bisa ditafsirkan, program langsung dieksekusi diperlukan suatu tempat di bagian bawah tumpukan.
Beberapa spesifikasi bahasa menguraikan bahwa implementasi harus mencakup fasilitas kompilasi, misalnya, Common Lisp . Namun, tidak ada yang melekat dalam definisi Common Lisp yang berhenti dari yang ditafsirkan. Bahasa lainnya memiliki fitur yang sangat mudah untuk mengimplementasikan dalam penerjemah, namun membuat tulisan kompilator jauh lebih sulit, misalnya, APL , SNOBOL4 , dan bahasa scripting banyak memungkinkan program untuk membangun source code yang sewenang-wenang pada saat runtime dengan operasi string biasa, dan kemudian jalankan bahwa kode dengan melewatkan ke fungsi evaluasi khusus. Untuk mengimplementasikan fitur ini dalam bahasa dikompilasi, program biasanya harus dikirimkan dengan perpustakaan runtime yang mencakup versi dari kompiler sendiri.

[ sunting ] kompilasi Perangkat Keras

Output dari beberapa kompiler dapat menargetkan hardware pada tingkat yang sangat rendah, misalnya Gerbang Lapangan Programmable Array (FPGA) atau terstruktur Aplikasi spesifik sirkuit terpadu (ASIC). Kompiler tersebut dikatakan keras compiler atau alat sintesis karena kode sumber mereka kompilasi efektif mengontrol konfigurasi akhir dari perangkat keras dan bagaimana ia beroperasi, output dari kompilasi tidak instruksi yang dieksekusi dalam urutan - hanya interkoneksi transistor atau tabel lookup. Sebagai contoh, XST adalah Xilinx Sintesis Alat yang digunakan untuk mengkonfigurasi FPGA. Alat serupa yang tersedia dari altera, Synplicity, Synopsys dan vendor lainnya.

[ sunting ] Kompilator konstruksi

Pada hari-hari awal, pendekatan yang diambil untuk merancang compiler yang digunakan secara langsung dipengaruhi oleh kompleksitas pengolahan, pengalaman dari orang (s) merancang itu, dan sumber daya yang tersedia.
Sebuah compiler untuk bahasa yang relatif sederhana yang ditulis oleh satu orang mungkin sepotong, tunggal monolitik perangkat lunak. Ketika bahasa sumber besar dan kompleks, dan kualitas output tinggi diperlukan, desain dapat dibagi menjadi beberapa fase relatif independen. Setelah fase yang terpisah berarti pembangunan dapat membagi menjadi bagian-bagian kecil dan diberikan kepada orang yang berbeda. Hal ini juga menjadi jauh lebih mudah untuk mengganti fase tunggal dengan satu diperbaiki, atau untuk memasukkan fase baru nanti (misalnya, optimasi tambahan).
Pembagian proses kompilasi ke tahap diperjuangkan oleh Mutu Produksi Kompilator Kompilator-Proyek (PQCC) di Carnegie Mellon University. Proyek ini memperkenalkan istilah ujung depan, akhir tengah, dan ujung belakang.
Semua kecuali yang terkecil dari kompiler memiliki lebih dari dua fase. Namun, fase ini biasanya dianggap sebagai bagian dari front end atau back end. Titik di mana kedua ujungnya bertemu terbuka untuk diperdebatkan. Ujung depan umumnya dianggap berada di tempat pengolahan sintaksis dan semantik terjadi, bersama dengan terjemahan ke tingkat yang lebih rendah dari representasi (dari kode sumber).
Ujung tengah biasanya dirancang untuk melakukan optimasi pada bentuk lain dari kode sumber atau kode mesin. Ini source code / kode mesin kemerdekaan ini dimaksudkan untuk memungkinkan optimasi generik untuk dibagi antara versi compiler yang mendukung bahasa yang berbeda dan prosesor target.
Ujung belakang mengambil output dari tengah. Ini dapat melakukan analisis yang lebih, transformasi dan optimasi yang untuk komputer tertentu. Kemudian, itu menghasilkan kode untuk prosesor tertentu dan OS.
Pendekatan front-end/middle/back-end memungkinkan untuk menggabungkan ujung depan untuk berbagai bahasa dengan ujung kembali untuk berbagai CPU . Contoh-contoh praktis dari pendekatan ini adalah GNU Compiler Collection , LLVM , dan Amsterdam Compiler Kit , yang memiliki beberapa depan berakhir, analisis bersama dan beberapa back-berakhir.

[ sunting ] Satu-pass vs multi-pass compiler

Klasifikasi compiler dengan jumlah melewati memiliki latar belakang dalam keterbatasan sumber daya perangkat keras komputer. Kompilasi melibatkan melakukan banyak pekerjaan dan komputer awal tidak memiliki cukup memori untuk mengandung satu program yang melakukan semua pekerjaan ini. Jadi kompiler tersebut dibagi menjadi program kecil yang masing-masing dibuat lulus atas sumber (atau beberapa representasi dari itu) melakukan beberapa analisis yang diperlukan dan terjemahan.
Kemampuan untuk mengkompilasi dalam single pass telah klasik dilihat sebagai keuntungan karena menyederhanakan pekerjaan menulis compiler dan satu-pass compiler umumnya melakukan kompilasi lebih cepat daripada multi-pass compiler . Dengan demikian, sebagian didorong oleh keterbatasan sumber daya sistem awal, bahasa awal banyak yang dirancang khusus sehingga mereka dapat dikompilasi dalam single pass (misalnya, Pascal ).
Dalam beberapa kasus desain sebuah fitur bahasa mungkin memerlukan compiler untuk melakukan lebih dari satu melewati sumber. Sebagai contoh, pertimbangkan sebuah deklarasi yang muncul pada baris 20 dari sumber yang mempengaruhi terjemahan pernyataan yang muncul pada baris 10. Dalam hal ini, pertama perlu untuk mengumpulkan informasi tentang deklarasi muncul setelah pernyataan bahwa mereka mempengaruhi, dengan penerjemahan yang sebenarnya terjadi selama lulus berikutnya.
Kerugian dari kompilasi dalam single pass adalah bahwa hal itu tidak mungkin untuk melakukan banyak canggih optimasi yang diperlukan untuk menghasilkan kode berkualitas tinggi. Ini bisa sulit untuk menghitung persis berapa banyak melewati sebuah kompiler mengoptimalkan membuat. Misalnya, fase yang berbeda dari optimasi dapat menganalisis satu ekspresi berkali-kali tetapi hanya menganalisis ekspresi lain sekali.
Memisahkan sebuah kompiler menjadi program kecil adalah teknik yang digunakan oleh para peneliti tertarik untuk memproduksi compiler provably benar. Membuktikan kebenaran dari serangkaian program kecil sering membutuhkan usaha kurang dari membuktikan kebenaran program, lebih besar tunggal, setara.
Sedangkan multi-pass compiler output khas kode mesin dari lintas terakhir, ada beberapa jenis lainnya:
  • Sebuah " sumber-to-source compiler "adalah jenis compiler yang mengambil bahasa tingkat tinggi sebagai input dan output bahasa tingkat tinggi. Sebagai contoh, sebuah parallelizing otomatis compiler akan sering mengambil dalam program bahasa tingkat tinggi sebagai input dan kemudian mengubah kode dan menjelaskannya dengan penjelasan kode paralel (misalnya OpenMP ) atau konstruksi bahasa (misalnya Fortran yang DOALL pernyataan).
  • Tahap compiler yang mengkompilasi dengan bahasa assembly dari mesin teoritis, seperti beberapa Prolog implementasi
    • Mesin Prolog adalah juga dikenal sebagai Mesin Abstrak Warren (atau WAM).
    • Kompiler untuk bytecode Java , Python , dan banyak lagi juga merupakan subtipe ini.
  • Just-in-time compiler , yang digunakan oleh sistem Smalltalk dan Java, dan juga oleh Microsoft. NET Common Language Menengah (CIL)
    • Aplikasi yang disampaikan dalam bytecode, yang dikompilasi ke kode mesin asli sesaat sebelum eksekusi.

[ sunting ] Front end

Ujung depan menganalisis kode sumber untuk membangun representasi internal dari program, yang disebut representasi intermediate atau IR. Hal ini juga mengelola tabel simbol , struktur data pemetaan setiap simbol dalam kode sumber untuk informasi yang terkait seperti lokasi, jenis dan ruang lingkup. Hal ini dilakukan melalui beberapa tahapan, yang meliputi beberapa hal sebagai berikut:
  1. Jalur rekonstruksi. Bahasa yang kulit pengasah kata kunci mereka atau memungkinkan ruang sewenang-wenang dalam pengidentifikasi memerlukan fase sebelum parsing, yang mengubah urutan karakter input ke bentuk kanonik siap untuk parser. The top-down , rekursif-keturunan , meja-driven parser yang digunakan dalam tahun 1960-an biasanya membaca sumber satu karakter pada satu waktu dan tidak memerlukan fase tokenizing terpisah. Atlas Autocode , dan Imp (dan beberapa implementasi dari ALGOL dan Karang 66 ) adalah contoh bahasa stropped yang kompiler akan memiliki fase Rekonstruksi Line.
  2. Analisis leksikal istirahat teks kode sumber menjadi potongan-potongan kecil yang disebut token. Setiap bukti merupakan unit atom tunggal bahasa, misalnya sebuah kata kunci , identifier atau nama simbol . Sintaks token biasanya bahasa biasa , sehingga negara yang terbatas robot dibangun dari ekspresi reguler dapat digunakan untuk mengenalinya. Fase ini juga disebut lexing atau memindai, dan perangkat lunak melakukan analisis leksikal disebut penganalisis leksikal atau scanner.
  3. Preprocessing . Beberapa bahasa, misalnya, C , membutuhkan fase preprocessing yang mendukung makro substitusi dan kompilasi bersyarat. Biasanya tahap preprocessing terjadi analisis sebelum sintaksis atau semantik, misalnya dalam kasus C, preprocessor memanipulasi token leksikal daripada bentuk sintaksis. Namun, beberapa bahasa seperti Skema substitusi makro dukungan berdasarkan bentuk-bentuk sintaksis.
  4. Analisis sintaks melibatkan parsing urutan token untuk mengidentifikasi struktur sintaksis dari program ini. Fase ini biasanya membangun pohon parse , yang menggantikan urutan linier dari token dengan struktur pohon dibangun sesuai dengan aturan dari tata bahasa formal yang mendefinisikan sintaks bahasa itu. Pohon parse sering dianalisis, ditambah, dan diubah oleh fase kemudian di compiler.
  5. Analisis semantik adalah fase di mana compiler menambahkan informasi semantik ke pohon parse dan membangun tabel simbol. Fase ini melakukan pemeriksaan semantik seperti memeriksa jenis (mengecek kesalahan jenis), atau mengikat objek (variabel referensi menghubungkan dan fungsi dengan definisi mereka), atau tugas yang pasti (mengharuskan semua variabel lokal harus diinisialisasi sebelum digunakan), menolak program-program yang salah atau mengeluarkan peringatan. Analisis semantik biasanya membutuhkan pohon parsing lengkap, yang berarti bahwa fase ini secara logis mengikuti parsing fase, dan secara logis mendahului generasi kode fase, meskipun sering mungkin untuk melipat beberapa tahap menjadi satu melewati kode dalam implementasi compiler.

[ sunting ] end Kembali

Istilah bagian belakang kadang-kadang bingung dengan kode generator karena tumpang tindih fungsi menghasilkan kode perakitan. Beberapa literatur menggunakan akhir tengah untuk membedakan analisis generik dan tahap optimasi di back end dari mesin tergantung generator kode.
Tahapan utama dari back end meliputi:
  1. Analisis : ini adalah pengumpulan informasi program dari representasi menengah yang berasal dari input. Analisis khas adalah analisis aliran data untuk membangun menggunakan-mendefinisikan rantai , analisis ketergantungan , alias analisis , pointer analisis , analisis melarikan diri dll Analisis yang akurat adalah dasar untuk optimasi compiler. Para grafik panggilan dan grafik kontrol aliran biasanya juga dibangun selama tahap analisis.
  2. Optimasi : representasi bahasa menengah berubah menjadi setara fungsional tapi lebih cepat (atau lebih kecil) bentuk. Optimasi populer adalah ekspansi inline , penghapusan kode mati , konstanta propagasi , transformasi lingkaran , mendaftar alokasi dan bahkan paralelisasi otomatis .
  3. Generasi kode : bahasa intermediate berubah diterjemahkan ke dalam bahasa output, biasanya asli bahasa mesin dari sistem. Hal ini melibatkan keputusan sumber daya dan penyimpanan, seperti variabel yang memutuskan untuk masuk ke dalam register dan memori dan pemilihan dan penjadwalan instruksi mesin yang tepat bersama dengan mode pengalamatan yang terkait (lihat juga Sethi-Ullman algoritma ). Data Debug juga mungkin perlu dihasilkan untuk memfasilitasi debugging .
Analisis compiler adalah prasyarat untuk setiap optimasi compiler, dan mereka erat bekerja sama. Sebagai contoh, analisis ketergantungan sangat penting untuk transformasi lingkaran .
Selain itu, lingkup analisis optimasi compiler dan sangat bervariasi, dari kecil sebagai blok dasar ke tingkat prosedur / fungsi, atau bahkan atas seluruh program ( optimasi interprosedural ). Jelas, compiler berpotensi dapat melakukan pekerjaan lebih baik dengan menggunakan pandangan yang lebih luas. Tapi itu pandangan yang luas tidak bebas: ruang lingkup analisis besar dan optimasi yang sangat mahal dalam hal waktu kompilasi dan ruang memori, ini terutama berlaku untuk analisis interprosedural dan optimasi.
Interprosedural analisis dan optimasi yang umum di compiler komersial modern dari HP , IBM , SGI , Intel , Microsoft , dan Sun Microsystems . Open source GCC dikritik untuk waktu yang lama untuk optimasi interprosedural kurang kuat, tetapi berubah dalam hal ini. Lain kompiler open source dengan analisis lengkap dan infrastruktur optimasi Open64 , yang digunakan oleh banyak organisasi untuk penelitian dan tujuan komersial.
Karena waktu tambahan dan ruang yang dibutuhkan untuk analisis compiler dan optimasi, beberapa kompiler melewatkan mereka secara default. Pengguna harus menggunakan opsi kompilasi secara eksplisit memberitahu compiler optimasi yang harus diaktifkan.

[ sunting ] Kompilator kebenaran

Kebenaran compiler adalah cabang rekayasa perangkat lunak yang berhubungan dengan berusaha untuk menunjukkan bahwa kompilator berperilaku sesuai dengan yang spesifikasi bahasa [. rujukan? ] Teknik termasuk mengembangkan kompiler menggunakan metode formal dan menggunakan pengujian ketat (validasi compiler sering disebut) pada kompiler yang ada .

[ sunting ] teknik Terkait

Bahasa assembly adalah jenis rendah tingkat bahasa dan program yang mengkompilasi itu lebih dikenal sebagai assembler, dengan program invers dikenal sebagai disassembler .
Sebuah program yang menerjemahkan dari bahasa tingkat rendah ke tingkat yang lebih tinggi satu adalah decompiler .
Sebuah program yang menerjemahkan antara bahasa tingkat tinggi biasanya disebut penerjemah bahasa, penerjemah sumber ke sumber, konverter bahasa, atau bahasa Rewriter . Istilah terakhir ini biasanya diterapkan untuk terjemahan yang tidak melibatkan perubahan bahasa.

[ sunting ] konferensi internasional dan organisasi

Setiap tahun, Konferensi Bersama Eropa tentang Teori dan Praktik Perangkat Lunak (ETAPS) mensponsori Konferensi Internasional Konstruksi Kompilator (CC), dengan kertas baik dari sektor akademis dan industri. [6]

[ sunting ] Lihat juga