Apa perbedaan antara kalkulus dan bahasa pemrograman?

13

Saya pikir saya cukup bingung tentang apa yang disebut kalkulus dan apa yang disebut bahasa pemrograman.

Saya cenderung berpikir, dan mungkin telah diberitahu, bahwa kalkulus adalah sistem formal untuk alasan tentang kesetaraan program. Program memiliki semantik operasional yang ditentukan oleh mesin, yang seharusnya (saya pikir?) Menjadi deterministik. Dengan cara ini, kalkulus (benar) untuk bahasa adalah metode bukti untuk kesetaraan program.L

Bagi saya ini sepertinya masuk akal, tetapi apakah ini makna yang diterima secara umum? Atau mungkin itu salah?

Terkait, mengapa beberapa semantik operasional nondeterministic (menganggap itu konfluen)? Apa yang didapat dari membiarkan pilihan strategi tetap terbuka?

Saya sangat menghargai beberapa klarifikasi tentang ini; dan referensi nyata bahkan lebih banyak lagi! Terima kasih!

Guido
sumber
3
Itu adalah kata-kata yang berbeda untuk cara berbeda dalam memandang hal yang sama.
Raphael
1
@ Raphael, bagaimana cara menjawab pertanyaan? Ini bukan tempat untuk berfilsafat.
fade2black
4
Terkadang filosofi kecil diperlukan, di mana saja.
André Souza Lemos

Jawaban:

10

Arti kata-katanya tidak tetap, tetapi saya bisa memberikan Anda interpretasi saya.

Sebuah kalkulus adalah sesuatu yang kita menghitung dengan dalam arti persamaan juggling (berpikir manipulasi seri Taylor atau perhitungan integral dalam analisis). Sebuah kalkulus memberi tahu kita apa aturan manipulasi itu, tetapi bukan aturan mana yang harus kita gunakan dalam situasi tertentu.

Sebuah bahasa pemrograman adalah sesuatu yang memberitahu kita bagaimana menghitung. Ini memberi tahu kita bagaimana tepatnya menggunakan aturan. Kami biasanya membiarkan komputer menggunakan aturan, karena jauh lebih cepat. Aturan mungkin non-deterministik, dan mungkin ada alasan yang sangat bagus untuk mereka menjadi non-deterministik. Mungkin dalam sifat kalkulus bahwa itu adalah non-deterministc (berpikir proses berkomunikasi bersamaan), atau memperbaiki strategi tertentu dapat merusak teknik implementasi dan optimisasi.

Sebagai contoh, -kalkulus adalah teori persamaan . Ada ekspresi dan persamaan yang memberi tahu kita ketika ekspresi sama. Persamaan tidak memberi tahu kita bagaimana menerapkannya, meskipun orang biasanya memiliki agenda tersembunyi dan mereka menyajikan persamaan sehingga nantinya mereka dapat memperoleh strategi evaluasi yang berguna dari mereka. Tetapi pada intinya λ -kalkulus adalah sekelompok persamaan. Ini bukan bahasa pemrograman.λλ

Sebaliknya, ML Standar adalah bahasa pemrograman. Ini diberikan dalam istilah semantik operasional, yaitu, aturan perhitungan. Ada gagasan turunan tentang kesetaraan (kesetaraan kontekstual, kesetaraan pengamatan, dll.) Yang dapat kita letakkan di atasnya untuk menganggapnya sebagai semacam kalkulus.

Tentu saja, sering ada hubungan yang berguna antara kalkulus dan manifestasinya sebagai bahasa pemrograman. Normalisasi konfluen hanyalah salah satu cara untuk beralih dari kalkulus ke bahasa pemrograman (meskipun sayangnya beberapa orang telah membuatnya menjadi semacam agama). Interaksi antara bate dan bahasa pemrograman adalah penting: bahasa pemrograman sebenarnya dapat digunakan, tetapi bate menjelaskan apa program itu.

Hanya untuk orang-orang yang mengganggu, izinkan saya juga menyatakan bahwa berpura-pura tidak ada perbedaan antara kalkulus dan manifestasi operasionalnya kadang-kadang mengarah pada pandangan miring tentang pemrograman dan agama mini dalam komunitas pemrograman. Anda dapat mencoba menebak bahasa apa yang ada dalam pikiran saya. (Ini bahasa yang sangat keren!)

Andrej Bauer
sumber
Jadi bahasa pemrograman adalah kalkulus yang dilengkapi dengan strategi / sistem penulisan ulang yang kompatibel dengannya?
xavierm02
Ya, mungkin. Apakah langkah operasional selalu mempertahankan makna? Yaitu, jika program membuat perhitungan satu langkah ke program p , apakah kita tentu ingin meminta p = p ? halhalhal=hal
Andrej Bauer
π
Anda dapat menyajikan persamaan yang tidak hanya berbicara tentang program tetapi juga tentang lingkungannya (keadaan atau transisi). Tetapi saya tidak akan mengatakan hal seperti itu sebagai kalkulus. Melainkan itu model aljabar.
Andrej Bauer
Terima kasih banyak, Andrej, ini masuk akal bagi saya. Saya menyadari itu mungkin berbeda dari orang ke orang, tetapi saya menerima jawaban ini karena (saya pikir) itu yang terbaik.
Guido
2

Tujuan dari kalkulus bukan hanya untuk mempelajari kesetaraan program, tetapi juga untuk mempelajari program. Contoh kalkulus mewah adalah ini di mana strategi (call-by-value atau call-by-name) ditentukan secara lokal. Itu bisa diimplementasikan suatu hari nanti dalam bahasa pemrograman tapi itu pertama kali dipelajari sebagai kalkulus. Anda juga menggunakan batu untuk mempelajari sistem tipe (dengan beberapa batu seperti teori tipe Martin-Löf juga tipe komputasi).


Saya percaya perbedaan utamanya adalah bahwa kalkuli dimaksudkan (relatif) mudah dipelajari secara formal sedangkan bahasa pemrograman dimaksudkan (relatif) mudah digunakan. Ini mengarah pada perbedaan-perbedaan berikut:

Kalkuli cenderung minimalis sementara PL cenderung memiliki redundansi (untuk loop ketika Anda sudah memiliki saat loop, beralih ketika Anda sudah memiliki jika, ...) untuk membuat mengekspresikan apa yang Anda inginkan lebih mudah.

Kalkuli memiliki semantik yang sepenuhnya ditentukan, sementara semantik PLs sering dijelaskan oleh penerjemah / kompiler default.


Beberapa semantik operasional bersifat non-deterministik karena memungkinkan:

  • Untuk membuktikan hal-hal tentang semua "subsemantik".
  • Untuk memungkinkan implementasi untuk memilih dan karenanya (mungkin) mempercepat hal-hal.
  • Karena kadang-kadang, Anda memiliki operasi "radnom ()", dan jika Anda tidak peduli dengan probabilitas tetapi hanya apa yang mungkin, non-determinisme adalah cara yang baik untuk mewakilinya.

Perhatikan bahwa nilai menurut panggilan bersifat non-deterministik: Anda dapat memilih untuk mengevaluasi fungsi atau argumen terlebih dahulu.

xavierm02
sumber
Nah, saya tidak setuju bahwa ini tentang tingkat formalisasi atau kecanggihan.
Andrej Bauer
2

"Bahasa pemrograman" dan "kalkulus" adalah istilah polisemik, yaitu, mereka memiliki arti berbeda tergantung pada konteksnya.

Dalam beberapa konteks, bahasa pemrograman dan kalkulus telah berkumpul untuk merujuk pada konsep yang sama, yaitu sistem penulisan ulang berdasarkan seperangkat aturan formal yang dapat "secara mekanis" diterapkan.

Alasan mengapa konvergensi ini kadang-kadang membingungkan bagi kami (tetapi tidak untuk pengembang perangkat lunak atau matematikawan yang bekerja) adalah bahwa tugas kami adalah memahami bahasa pemrograman konkret seolah-olah mereka kalkulus, dan secara fisik mewujudkan kalkuli dalam bahasa pemrograman konkret.

Untuk menjawab pertanyaan Anda secara langsung, kebingungan antara kalkulus dan bahasa pemrograman (sejauh yang ada) bukanlah kecelakaan, tetapi sebuah proyek. Proyek kita. Ini adalah bukti keberhasilan relatif kita sebagai disiplin ilmu.

André Souza Lemos
sumber