Bahasa Pemrograman Scheme

Ikhtisar

Scheme adalah dialek minimalis dari bahasa pemrograman Lisp, yang dirancang untuk memfasilitasi gaya pemrograman fungsional sambil mempromosikan sintaks yang sederhana dan bersih. Bahasa ini ditandai dengan penggunaan tanda kurung, sistem makro yang kuat, dan penekanan yang kuat pada rekursi serta prosedur kelas satu. Bahasa ini mendorong paradigma pemrograman fungsional dan mendukung berbagai teknik pemrograman, termasuk pemrograman fungsional, imperatif, dan logika.

Aspek Historis

Penciptaan dan Pengembangan Awal

Scheme diciptakan pada tahun 1970-an oleh Gerald Jay Sussman dan Guy L. Steele Jr. di Massachusetts Institute of Technology (MIT). Bahasa ini dikembangkan sebagai upaya untuk menyederhanakan dan memperbaiki bahasa Lisp asli, yang telah menjadi kompleks seiring waktu. Motivasi di balik Scheme adalah untuk menciptakan bahasa yang lebih mudah diimplementasikan dan diajarkan, sambil tetap cukup kuat untuk mengekspresikan ide-ide kompleks.

Evolusi dan Standarisasi

Selama bertahun-tahun, Scheme telah mengalami berbagai revisi dan upaya standarisasi. Standar yang paling terkenal adalah RnRS (Revisedn Reports on the Algorithmic Language Scheme), yang memformalkan bahasa dan fitur-fiturnya. Komunitas Scheme sejak itu terus mengembangkan bahasa ini, yang mengarah pada standar baru seperti R6RS dan R7RS, yang memperkenalkan fitur dan perbaikan baru.

Keadaan Saat Ini dan Pengaruh

Hingga saat ini, Scheme tetap populer di lingkungan akademis, terutama dalam pendidikan ilmu komputer, karena keanggunan dan sintaksnya yang bersih. Pengaruhnya dapat dilihat di banyak bahasa pemrograman dan paradigma modern. Scheme sering diasosiasikan dengan komunitas pemrograman fungsional dan telah menginspirasi bahasa-bahasa seperti Clojure dan Racket, yang dibangun berdasarkan prinsip-prinsipnya dan memperluas kemampuannya.

Fitur Sintaksis

Sintaksis Berkurung

Scheme menggunakan sintaksis yang sepenuhnya berkurung di mana kode ditulis dalam notasi prefiks; misalnya, operasi penjumlahan ditulis sebagai (+ 1 2).

Prosedur Kelas Satu

Fungsi dalam Scheme adalah warga kelas satu, yang berarti mereka dapat diteruskan sebagai argumen atau dikembalikan dari fungsi lain. Contoh:

(define (make-adder x)
  (lambda (y) (+ x y)))
(define add5 (make-adder 5))
(add5 10) ; mengembalikan 15

Optimisasi Panggilan Ekor

Scheme mendukung optimisasi panggilan ekor, memungkinkan fungsi untuk menggunakan kembali bingkai tumpukan saat panggilan rekursif terjadi di posisi ekor, mencegah tumpukan meluap.

Gaya Penerusan

Scheme memungkinkan penggunaan penerusan, memungkinkan pemrogram untuk menangkap keadaan komputasi saat ini dan memanipulasi alur kontrol:

(call-with-current-continuation
  (lambda (exit) 
    (exit 'done)))

Makro

Scheme memiliki sistem makro yang kuat yang memungkinkan pemrogram untuk membuat ekstensi sintaksis. Makro sederhana dapat didefinisikan sebagai berikut:

(define-syntax my-if
  (syntax-rules ()
    ((_ test then else)
     (if test then else))))

Abstraksi Data

Scheme mendukung abstraksi data melalui struktur seperti daftar, pasangan, dan fungsi tingkat tinggi, memungkinkan manipulasi data yang efisien.

Lingkup Leksikal

Scheme menerapkan lingkup leksikal, di mana lingkup variabel ditentukan oleh lokasi fisiknya dalam kode sumber. Ini menghasilkan perilaku yang dapat diprediksi terkait dengan pengikatan variabel.

Tipe Dinamis

Scheme memiliki tipe dinamis, memungkinkan variabel untuk menyimpan nilai dari tipe apa pun tanpa perlu deklarasi tipe eksplisit.

Pemrosesan Daftar Bawaan

Sebagai dialek Lisp, Scheme dioptimalkan untuk pemrosesan daftar, membuatnya mudah untuk melakukan operasi pada daftar:

(define my-list (list 1 2 3 4))
(car my-list) ; mengembalikan 1
(cdr my-list) ; mengembalikan (2 3 4)

Rekursi Ekor

Fungsi Scheme dapat didefinisikan secara rekursif dengan posisi ekor untuk mengoptimalkan penggunaan memori dan kinerja. Misalnya:

(define (factorial n)
  (define (fact-helper n acc)
    (if (zero? n)
        acc
        (fact-helper (- n 1) (* n acc))))
  (fact-helper n 1))

Alat dan Runtime Pengembang

IDE dan Lingkungan Populer

Membangun Proyek

Aplikasi Scheme umumnya dapat dibangun menggunakan lingkungan runtime dari implementasi yang dipilih. Misalnya, di Racket, Anda dapat menggunakan alat baris perintah racket untuk menjalankan file .rkt atau mengompilasinya menjadi executable.

Kompiler dan Interpreter

Beberapa kompiler dan interpreter tersedia untuk Scheme, termasuk:

Aplikasi Scheme

Scheme banyak digunakan di akademia untuk mengajarkan prinsip-prinsip pemrograman dan sebagai alat untuk penelitian dalam ilmu komputer. Ini memiliki aplikasi dalam kecerdasan buatan, desain bahasa, dan scripting, serta dalam berbagai domain yang memerlukan komputasi simbolik atau manipulasi data kompleks.

Perbandingan dengan Bahasa Terkait

Scheme vs. Python

Kedua bahasa mendukung gaya pemrograman fungsional, tetapi Python menekankan keterbacaan dan kesederhanaan, sementara Scheme fokus pada ekspresi yang kuat dan ringkas. Sintaks Scheme yang banyak menggunakan tanda kurung mungkin dianggap sebagai penghalang bagi pemula, sedangkan sintaks berbasis indentasi Python umumnya lebih mudah diakses.

Scheme vs. JavaScript

JavaScript juga mendukung pemrograman fungsional dan memiliki fungsi kelas satu. Namun, JavaScript memiliki sistem objek berbasis prototipe, sementara Scheme bergantung pada paradigma fungsional. Sistem makro Scheme menawarkan kemampuan yang tidak ada di JavaScript.

Scheme vs. C

C adalah bahasa tingkat rendah yang diketik statis yang dirancang untuk pemrograman sistem, sementara Scheme adalah bahasa tingkat tinggi yang diketik dinamis. C fokus pada kinerja dan manipulasi tingkat perangkat keras, sementara Scheme menekankan abstraksi dan aspek teoretis dari komputasi.

Scheme vs. Haskell

Kedua bahasa berakar pada pemrograman fungsional. Haskell menggunakan sistem tipe yang lebih kaku dan mendukung evaluasi malas, sedangkan tipe dinamis dan evaluasi cepat Scheme memungkinkan pemrograman yang lebih fleksibel dengan mengorbankan beberapa kinerja.

Scheme vs. Ruby

Ruby adalah bahasa pemrograman berorientasi objek yang mencampurkan fitur pemrograman fungsional, sementara Scheme adalah murni fungsional. Sintaks Ruby lebih verbose, sementara kesederhanaan Scheme berasal dari desain minimalisnya.

Tips Penerjemahan Sumber ke Sumber

Penerjemahan kode Scheme ke bahasa lain dapat difasilitasi oleh alat yang memahami sintaks Scheme dan bahasa target. Beberapa alat penerjemahan kode sumber ke sumber yang berguna termasuk:

Chicken Scheme

Chicken Scheme menyediakan kompiler yang dapat menerjemahkan kode Scheme menjadi C, memungkinkan untuk memanfaatkan pustaka C dan membuat executable yang efisien.

Fitur Bahasa Racket

Racket, turunan dari Scheme, memiliki kemampuan bawaan untuk mentransformasi dan mengompilasi kode menjadi JavaScript, membuatnya lebih mudah untuk menerapkan aplikasi web.

Alat seperti Gambit

Gambit Scheme dapat mengompilasi kode Scheme menjadi C dan executable native, menyediakan opsi penerjemahan yang efisien untuk aplikasi yang kritis terhadap kinerja.