Pemilihan Proyek

Memilih program C++ kecil dengan rentang porting yang realistis untuk Explorer.

Daftar isi

Topik ini membahas pemilihan program C++ kecil yang realistis untuk dipindahkan ke Carbon dan dijalankan pada Carbon Explorer. Pemilihan semacam ini merupakan langkah pertama dari porting, yaitu kegiatan menerjemahkan program dari satu bahasa ke bahasa lain tanpa mengubah perilakunya. Kriteria yang digunakan diturunkan dari kemampuan interpreter Explorer yang terverifikasi lewat eksekusi nyata, kemudian kriteria tersebut dipraktikkan pada satu kandidat berupa program statistik nilai ujian lima siswa. Kandidat yang dipilih kemudian ditampilkan lengkap dengan kode sumber dan keluaran aslinya, siap dijadikan bahan terjemahan pada modul ini.

Kriteria yang diturunkan dari kemampuan Explorer#

Kriteria pertama menyangkut tipe data. Interpreter Explorer saat ini hanya mendukung i32, bool, dan String, sedangkan tipe lain dari desain bahasa, misalnya f64 untuk bilangan pecahan, masih ditolak dengan pesan Only i32 is supported for now. Program kandidat sebaiknya menyelesaikan seluruh perhitungannya pada bilangan bulat sehingga tidak ada penerjemahan pecahan yang berisiko mengubah hasil. Apabila program asli memang memerlukan pecahan, penyesuaiannya harus dirancang sejak awal, misalnya menyimpan ukuran dalam satuan yang lebih kecil agar tetap berupa bilangan bulat.

Kriteria kedua menyangkut struktur data. Percobaan eksekusi pada modul ini menunjukkan bahwa tipe kumpulan seperti array belum dapat diselesaikan oleh interpreter dengan pesan could not resolve 'array', sedangkan penulisan perulangan for-in masih ditolak tahap penguraian. Data pada program kandidat sebaiknya berupa sekumpulan kecil nilai tetap yang disimpan pada variabel skalar terpisah, dan pekerjaan berulang ditulis dengan while beserta pencacah. Program yang logika intinya menuntut koleksi besar atau akses berindeks berada di luar rentang yang realistis.

Kriteria ketiga menyangkut lingkungan eksekusi. Explorer mengeksekusi perhitungan murni tanpa masukan pengguna, tanpa pembacaan berkas, dan tanpa sumber keacakan, sehingga program kandidat harus deterministik dengan data yang tertulis tetap di dalam kode. Sifat tersebut justru menguntungkan proses porting karena keluaran program asli dapat dibandingkan dengan keluaran hasil terjemahan baris demi baris.

Kriteria keempat menyangkut kelas dan fungsinya. Kelas dengan field skalar serta metode yang hanya membaca isi objek dapat dijalankan, sedangkan metode yang mengubah isi objek belum dapat ditulis karena bentuk parameter acuan yang ditetapkan desain masih ditolak parser. Pembaruan data pada kandidat sebaiknya dinyatakan sebagai fungsi yang menerima nilai lama dan mengembalikan nilai baru, bukan sebagai prosedur yang mengubah objek milik pemanggilnya. Pola nilai masuk dan nilai keluar ini sejajar dengan semantik binding let dan var yang menjadi bawaan Carbon.

Konstruksi pada program C++Rentang yang realistis untuk Explorer
Bilangan pecahan doubledihindari, gunakan bilangan bulat i32
Koleksi seperti std::vector dan std::arraydihindari, data tetap ditulis sebagai variabel skalar
for atas koleksidiganti while dengan pencacah
Pembacaan berkas dan masukan penggunadihindari, data ditulis tetap di dalam kode
Fungsi yang mengubah objek acuannyadiganti fungsi yang mengembalikan nilai baru
Kelas dengan field skalardipertahankan sebagai kelas Carbon dengan var

Tabel di atas menjadi daftar periksa singkat ketika kandidat berikutnya dinilai, dan setiap barisnya bersumber dari percobaan eksekusi nyata atau dokumen desain yang dirujuk pada bagian akhir topik.

Kandidat yang dipilih#

Kandidat yang dipilih adalah program statistik nilai ujian untuk lima siswa dengan angka yang ditulis tetap di dalam kode. Program ini menghitung banyak data, total nilai, rata-rata yang dibulatkan ke bawah, banyak nilai yang memenuhi ambang kelulusan 70, nilai tertinggi, dan nilai terendah. Angka ujiannya dipilih agar mudah dihitung ulang, yaitu 78, 92, 65, 88, dan 71. Dengan angka tersebut, setiap baris keluaran dapat diperiksa tanpa alat bantu apa pun.

Struktur programnya disusun mengikuti kriteria pada bagian sebelumnya. Kelas Statistik menyimpan lima field bilangan bulat, sedangkan fungsi catat menerima statistik lama beserta satu nilai ujian dan mengembalikan statistik baru yang sudah diperbarui. Pembaruan berjalan tanpa parameter acuan, sehingga pola ini dapat diterjemahkan secara langsung menjadi fungsi Carbon dengan parameter var dan nilai kembalian. Seluruh logika pembaruan berada pada satu fungsi, sehingga penerjemahannya cukup memetakan satu bagian kecil dengan cermat.

Beberapa kandidat yang umum terlintas sengaja disaring oleh kriteria yang sama. Penghitung kata pada sebuah teks tetap menarik, tetapi pemindaian karakter per karakter menuntut akses berindeks pada String yang belum tersedia, sehingga programnya tidak dapat diterjemahkan apa adanya. Rekap suhu harian biasanya ditulis dengan tipe pecahan dan daftar data yang panjang, sehingga penyesuaiannya menyentuh dua kriteria sekaligus. Program dengan pembacaan berkas jelas berada di luar lingkungan eksekusi Explorer, dan penyaringan ini menjaga fokus modul pada pola yang benar-benar dapat diuji.

Program lengkapnya ditampilkan berikut ini, dan keluaran aslinya ditempel tepat setelahnya. Keluaran tersebut diperoleh dari kompilasi g++ 14.2 di terminal, bukan dari perkiraan.

cpp statistik.cpp
#include <iostream>

// Statistik nilai ujian lima siswa dengan data yang tetap.
class Statistik {
 public:
  int jumlah;
  int total;
  int lulus;
  int tertinggi;
  int terendah;

  int rata_rata() const { return total / jumlah; }
};

// Mencatat satu nilai dan mengembalikan statistik yang diperbarui.
Statistik catat(Statistik s, int nilai) {
  s.jumlah += 1;
  s.total += nilai;
  if (nilai >= 70) {
    s.lulus += 1;
  }
  if (nilai > s.tertinggi) {
    s.tertinggi = nilai;
  }
  if (nilai < s.terendah) {
    s.terendah = nilai;
  }
  return s;
}

int main() {
  // nilai terendah diawali batas atas karena seluruh nilai tidak lebih dari 100
  Statistik s = {0, 0, 0, 0, 100};

  s = catat(s, 78);
  s = catat(s, 92);
  s = catat(s, 65);
  s = catat(s, 88);
  s = catat(s, 71);

  std::cout << "Jumlah nilai: " << s.jumlah << "\n";
  std::cout << "Total: " << s.total << "\n";
  std::cout << "Rata-rata: " << s.rata_rata() << "\n";
  std::cout << "Lulus (>= 70): " << s.lulus << "\n";
  std::cout << "Tertinggi: " << s.tertinggi << "\n";
  std::cout << "Terendah: " << s.terendah << "\n";
  return 0;
}
text Keluaran
Jumlah nilai: 5
Total: 394
Rata-rata: 78
Lulus (>= 70): 4
Tertinggi: 92
Terendah: 65

Setiap angka pada keluaran di atas dapat dihitung ulang dari data yang sama. Total 394 merupakan penjumlahan kelima nilai, sedangkan rata-rata 78 adalah hasil pembagian bilangan bulat 394 dengan 5. Banyak nilai yang memenuhi ambang kelulusan berjumlah 4, yaitu 78, 92, 88, dan 71, sedangkan nilai tertinggi dan terendah adalah 92 dan 65. Keluaran yang deterministik seperti ini menjadi pembanding tetap ketika terjemahan Carbon dijalankan di Explorer.

Keluaran yang sama dapat direproduksi di komputer mana pun yang memiliki kompilator C++ melalui dua perintah berikut, dan eksekusi keduanya pada sandbox menghasilkan keluaran di bawah.

bash
# kompilasi program kandidat, lalu jalankan hasilnya
g++ statistik.cpp -o statistik
./statistik
text Keluaran
Jumlah nilai: 5
Total: 394
Rata-rata: 78
Lulus (>= 70): 4
Tertinggi: 92
Terendah: 65

Ringkasan#

  • Kriteria pemilihan diturunkan dari dukungan nyata interpreter Explorer, yaitu tipe i32, bool, dan String, data tetap berupa skalar, serta eksekusi yang deterministik.
  • Koleksi, for-in, parameter acuan, dan tipe pecahan berada di luar rentang yang dapat diterjemahkan apa adanya, sehingga kandidat yang baik tidak membutuhkannya.
  • Kandidat yang dipilih adalah program statistik nilai ujian lima siswa dengan kelas berisi field skalar dan fungsi pembaruan yang mengembalikan nilai baru.
  • Keluaran program asli diperoleh dari kompilasi g++ dan berfungsi sebagai pembanding tetap bagi keluaran terjemahan Carbon.

Referensi#