Penggunaan Proses Kalkulus dan Teori PL untuk pengembangan bahasa pemrograman modern


10

Untuk sementara waktu sekarang, saya sangat tertarik dengan teori bahasa pemrograman dan proses kalkulus dan sudah mulai mempelajarinya. Sejujurnya, itu adalah sesuatu yang saya tidak keberatan untuk berkarier. Saya menemukan teorinya sangat menarik. Satu pertanyaan konstan yang terus saya temui adalah apakah Teori PL atau Kalki Proses sama sekali penting dalam pengembangan bahasa pemrograman modern. Saya melihat begitu banyak varian pada Pi-calculus di luar sana dan ada banyak penelitian aktif, tetapi akankah mereka dibutuhkan atau memiliki aplikasi penting? Alasan mengapa saya bertanya adalah karena saya suka mengembangkan bahasa pemrograman dan tujuan akhir sebenarnya adalah menggunakan teori untuk benar-benar membangun PL. Untuk hal-hal yang saya tulis, tidak ada korelasi sama sekali dengan teori sama sekali.

Jawaban:


9

Jawaban saya benar-benar hanya sebuah penjabaran dari Gilles, yang belum pernah saya baca sebelumnya. Mungkin ini sangat membantu.

Biarkan saya memulai upaya saya menjawab pertanyaan Anda dengan perbedaan antara dua dimensi pekerjaan bahasa pemrograman yang berhubungan sangat berbeda dengan teori bahasa pemrograman pada umumnya dan proses kalkulus pada khususnya.

  • Penelitian murni.

  • Penelitian dan pengembangan yang berfokus pada produk.

Yang terakhir ini biasanya terjadi di industri dengan tujuan menyediakan bahasa pemrograman sebagai produk. Tim yang mengembangkan Java di Oracle dan C # di Microsoft adalah contoh. Sebaliknya, penelitian murni tidak terikat pada produk. Tujuannya adalah untuk memahami bahasa pemrograman sebagai objek yang menarik secara intrinsik dan untuk mengeksplorasi struktur matematika yang mendasari semua bahasa pemrograman.

Karena tujuan yang berbeda, Aspek yang berbeda dari teori bahasa pemrograman relevan dalam penelitian murni dan dalam R&D yang berfokus pada produk Gambar di bawah ini dapat memberikan indikasi apa yang penting di mana.

masukkan deskripsi gambar di sini

Orang mungkin bertanya pada titik ini mengapa kedua dimensi itu tampak sangat berbeda dan bagaimana mereka saling berhubungan.

Wawasan utama adalah bahwa penelitian dan pengembangan bahasa pemrograman memiliki beberapa dimensi: teknis, sosial dan ekonomi. Hampir secara definisi, industri tertarik pada hasil ekonomi dari bahasa pemrograman. Microsoft et al tidak mengembangkan bahasa karena kebaikan hati mereka tetapi karena mereka percaya bahasa pemrograman memberi mereka keuntungan ekonomis. Dan mereka telah menyelidiki secara mendalam mengapa beberapa bahasa pemrograman berhasil, dan yang lain, yang tampaknya mirip atau dengan fitur yang lebih maju, tidak. Dan mereka menemukan bahwa tidak ada satu alasan pun. Memprogram bahasa dan lingkungannya rumit, dan demikian pula alasan untuk mengadopsi atau mengabaikan bahasa tertentu. Tetapi satu-satunya faktor terbesar untuk keberhasilan suatu bahasa pemrograman adalah perlekatan preferensi programmer ke bahasa yang sudah banyak digunakan: semakin banyak orang menggunakan bahasa, semakin banyak perpustakaan, peralatan, bahan ajar yang tersedia, dan semakin produktif seorang programmer bisa menggunakan bahasa itu. Ini juga disebut efek jaringan. Alasan lain adalah tingginya biaya alih bahasa untuk perorangan dan organisasi: menguasai bahasa, terutama untuk programmer yang tidak berpengalaman, dan ketika jarak semantik ke bahasa yang umum adalah besar, merupakan upaya serius dan menghabiskan waktu. Mengingat fakta-fakta ini, orang mungkin bertanya mengapa bahasa baru mendapatkan daya tarik sama sekali? Mengapa perusahaan mengembangkan bahasa baru? Kenapa kita tidak tinggal dengan Java atau Cobol saja? Saya pikir ada beberapa alasan utama mengapa sebuah bahasa berhasil,

  • Domain pemrograman baru terbuka yang tidak memiliki kewajiban untuk dipindahkan. Contoh utama adalah web dengan kebangkitan Javascript yang bersamaan.

  • Lengket bahasa. Maksud saya ini adalah tingginya harga bahasa yang berubah-ubah. Tetapi kadang-kadang programmer pindah ke bidang yang berbeda, mengambil bahasa pemrograman dengan mereka, dan menjadi sukses dengan bahasa lama di bidang baru.

  • Sebuah bahasa didorong oleh sebuah perusahaan besar dengan kekuatan finansial yang serius. Dukungan ini mengurangi risiko adopsi, karena pengguna awal dapat yakin bahwa bahasa tersebut masih akan didukung dalam beberapa tahun. Contoh yang baik dari ini adalah C #.

  • Suatu bahasa mungkin datang dengan alat yang menarik dan ekosistem. Di sini juga C # dan itu. Net dan Visual Studio eco-system dapat disebutkan sebagai contoh.

  • Bahasa lama mengambil fitur baru. Java muncul di benak, yang, dalam setiap iterasi, mengambil lebih banyak ide bagus dari tradisi pemrograman fungsional.

  • Akhirnya, bahasa baru mungkin memiliki keunggulan teknis intrinsik, misalnya lebih ekspresif, sintaksis lebih bagus, sistem pengetikan yang menangkap lebih banyak kesalahan, dll.

Mengingat latar belakang ini, seharusnya tidak mengherankan bahwa ada sedikit keterputusan antara penelitian bahasa pemrograman murni, dan pengembangan bahasa pemrograman komersial. Sementara keduanya bertujuan untuk membuat pembangunan dan evolusi perangkat lunak lebih efisien, terutama untuk perangkat lunak skala besar, pekerjaan bahasa pemrograman industri harus lebih tertarik dalam memfasilitasi adopsi cepat untuk mencapai massa kritis dan mendapatkan efek jaringan. Ini mengarah pada fokus penelitian pada hal-hal yang dipedulikan oleh programmer yang bekerja. Dan itu cenderung menjadi hal-hal seperti ketersediaan perpustakaan, kecepatan kompiler, kualitas kode yang dikompilasi, portabilitas dan sebagainya. Proses kalkulus seperti yang kita praktikkan hari ini tidak banyak berguna bagi pemrogram yang mengerjakan proyek-proyek utama (walaupun saya percaya itu akan berubah di masa depan).

Penelitian bahasa pemrograman murni sangat berbeda. Ia bekerja dengan model bahasa pemrograman yang disederhanakan: -calculus adalah penyederhanaan besar pemrograman fungsional. Dengan cara yang sama, kalkulus adalah penyederhanaan besar dari pemrograman konkuren. Penyederhanaan besar-besaran ini adalah kunci untuk penelitian yang sukses. Mereka memungkinkan kita untuk fokus pada mekanisme komputasi inti (misalnyaλπβ-pengurangan untuk pemrograman fungsional, resolusi / unifikasi untuk pemrograman logika, passing-nama untuk perhitungan bersamaan). Untuk memahami jika bahasa seperti Scala dapat memiliki inferensi tipe penuh yang layak, kita tidak perlu khawatir tentang JVM. Memang berpikir tentang JVM akan mengurangi pemahaman yang lebih baik tentang tipe-inferensi. Itu sebabnya abstraksi perhitungan menjadi batu inti kecil sangat penting dan kuat.

Jadi Anda dapat menganggap penelitian bahasa pemrograman sebagai kotak pasir besar di mana orang bermain dengan mainan, dan jika mereka menemukan sesuatu yang menarik ketika bermain dengan mainan tertentu, dan telah menyelidiki mainan itu dengan saksama, maka mainan yang menarik itu memulai perjalanan panjang menuju penerimaan industri arus utama. . Saya katakan long march karena fitur bahasa yang pertama kali ditemukan oleh peneliti bahasa pemrograman cenderung memakan waktu puluhan tahun sebelum diterima secara luas. Misalnya pengumpulan sampah dikandung pada 1950-an dan menjadi tersedia secara luas dengan Jawa pada 1990-an. Pencocokan pola berasal dari tahun 1970 dan hanya digunakan secara luas sejak Scala.

Kalkulus proses adalah mainan yang sangat menarik. Tetapi terlalu baru untuk diselidiki secara menyeluruh. Itu akan membutuhkan satu dekade penelitian murni. Apa yang saat ini terjadi dalam penelitian teori proses adalah untuk mengambil kisah sukses tunggal terbesar dari penelitian bahasa pemrograman, teori jenis (berurutan) dan mengembangkan teori jenis untuk concurrency lewat pesan. Sistem pengetikan ekspresivitas moderat untuk pemrograman berurutan, kata Hindley-Milner, sekarang dipahami dengan baik, ada di mana-mana, dan diterima oleh para programmer yang bekerja. Kami ingin memiliki tipe yang cukup ekspresif untuk pemrograman bersamaan. Penelitian mengenai hal ini dimulai pada 1980-an oleh para pelopor seperti Milner, Sangiorgi, Turner, Kobayashi, Honda, dan lainnya, sering kali didasarkan, secara eksplisit atau implisit, pada gagasan linearitas yang berasal dari logika linier. Beberapa tahun terakhir telah melihat peningkatan besar dalam aktivitas dan saya berharap lintasan ke atas ini akan berlanjut untuk masa mendatang. Saya juga berharap pekerjaan ini mulai bocor ke R&D yang berfokus pada produk, sebagian karena alasan pragmatis bahwa peneliti muda yang telah dilatih dalam kalkulus proses akan pergi dan bekerja di laboratorium R&D industri, tetapi juga karena evolusi CPU dan arsitektur komputer jauh dari bentuk komputasi berurutan.

Singkatnya, saya tidak akan khawatir bahwa Anda tidak menemukan teori bahasa pemrograman terdepan seperti kalkulus proses berguna dalam pekerjaan Anda sendiri membangun bahasa. Itu hanya karena teori mutakhir tidak membahas masalah bahasa pemrograman saat ini. Ini tentang bahasa masa depan. Butuh waktu beberapa saat untuk 'dunia nyata' untuk mengejar ketinggalan. Pengetahuan yang Anda gunakan untuk membangun bahasa untuk hari ini adalah teori bahasa pemrograman di masa lalu. Saya mendorong Anda untuk mempelajari lebih lanjut tentang kalkulus proses karena ini adalah salah satu bidang yang paling menarik dari semua ilmu komputer teoretis.


1
Wow! Berapa banyak waktu yang diperlukan untuk membuat diagram itu, dan dapatkah saya menggunakannya di masa depan?
cody

1
@cody Butuh beberapa detik dengan OmniGraffle, dan jangan ragu untuk menggunakannya.
Martin Berger

8

Ilmu desain bahasa pemrograman masih sangat baru. Teori (studi tentang apa arti program dan ekspresifitas suatu bahasa) dan empirisme (apa yang dikelola atau tidak dikelola oleh programmer) memberikan banyak argumen kualitatif untuk menimbang satu atau lain cara ketika merancang suatu bahasa. Tetapi kami jarang memiliki alasan kuantitatif untuk memutuskan.

Ada penundaan antara waktu beberapa teori cukup stabil untuk suatu inovasi untuk dapat digunakan dalam bahasa pemrograman praktis, dan waktu inovasi ini mulai muncul dalam bahasa "arus utama". Misalnya, manajemen memori otomatis dengan pengumpulan sampah dapat dikatakan telah matang untuk keperluan industri pada pertengahan 1960-an, tetapi hanya mencapai arus utama dengan Jawa pada tahun 1995. Polimorfisme parametrik dipahami dengan baik pada akhir tahun 1970-an, dan membuatnya ke Jawa pada pertengahan 200-an. Pada skala karir seorang peneliti, 30 tahun adalah waktu yang lama.

Adopsi bahasa berskala industri yang luas merupakan masalah yang harus dipelajari oleh sosiolog, dan bahwa sains bahkan lebih baru. Pertimbangan pasar merupakan faktor penting - jika Sun, Microsoft atau Apple mendorong suatu bahasa, ini memiliki dampak yang jauh lebih besar daripada sejumlah makalah POPL dan PLDI. Bahkan untuk seorang programmer yang punya pilihan, ketersediaan perpustakaan biasanya jauh lebih penting daripada desain bahasa. Yang tidak berarti bahwa desain bahasa tidak penting: memiliki bahasa yang dirancang dengan baik adalah melegakan! Biasanya bukan faktor penentu.

Kalkuli proses masih pada tahap di mana teori belum stabil. Kami percaya bahwa kami memahami perhitungan sekuensial - semua model hal yang kami sebut perhitungan sekuensial adalah setara (itulah tesis Church-Turing). Ini tidak berlaku untuk konkurensi: kalkulus proses yang berbeda cenderung memiliki perbedaan ekspresif yang halus.

Proses kalkuli memang memiliki implikasi praktis. Banyak perhitungan di luar sana didistribusikan - mereka melibatkan klien berbicara dengan server, server berbicara dengan server lain, dll. Bahkan perhitungan lokal sangat sering multithreaded untuk mengambil keuntungan dari paralelisme atas beberapa prosesor dan untuk bereaksi terhadap konkurensi lingkungan (komunikasi dengan program independen dan dengan pengguna).

Apakah kemajuan penelitian diperlukan untuk membuat perangkat lunak yang lebih baik? Lagipula ada industri bernilai miliaran dolar di luar sana yang tidak bisa membedakan kalkulus pi dari kue di langit. Kemudian lagi, industri itu menghabiskan miliaran dolar untuk memperbaiki bug.

"Akankah mereka dibutuhkan" tidak pernah menjadi pertanyaan berharga dalam penelitian. Tidak mungkin untuk memprediksi sebelumnya apa yang akan memiliki konsekuensi jangka panjang. Saya bahkan akan melangkah lebih jauh dan mengatakan bahwa ini adalah asumsi yang aman bahwa suatu penelitian akan memiliki konsekuensi suatu hari - kita tidak tahu pada saat itu apakah hari itu akan datang tahun depan atau milenium mendatang.


3

Saya melihat begitu banyak varian pada Pi-calculus di luar sana dan ada banyak penelitian aktif, tetapi akankah mereka dibutuhkan atau memiliki aplikasi penting?

Alasan mengapa saya bertanya adalah karena saya suka mengembangkan bahasa pemrograman dan tujuan akhir sebenarnya adalah menggunakan teori untuk benar-benar membangun PL. Untuk hal-hal yang saya tulis, tidak ada korelasi sama sekali dengan teori sama sekali.

Ini pertanyaan yang sulit! Saya akan memberi tahu Anda pendapat pribadi saya, dan saya menekankan bahwa ini adalah pendapat saya .

Saya tidak berpikir pi-kalkulus secara langsung cocok sebagai notasi untuk pemrograman bersamaan. Namun, saya pikir Anda harus pasti mempelajarinya sebelum merancang bahasa pemrograman konkuren. Alasannya adalah bahwa pi-calculus memberikan level rendah --- tetapi yang penting, komposisi! --- akun konkurensi. Hasilnya, ia dapat mengekspresikan semua yang Anda inginkan, tetapi tidak selalu nyaman.

Menjelaskan komentar ini membutuhkan sedikit pemikiran tentang tipe. Pertama, bahasa pemrograman yang berguna umumnya membutuhkan semacam disiplin jenis untuk membangun abstraksi. Secara khusus, Anda memerlukan beberapa jenis fungsi untuk menggunakan abstraksi prosedural ketika membangun perangkat lunak.

Sekarang, disiplin jenis alami pi-kalkulus adalah beberapa varian dari logika linier klasik. Lihat, misalnya, kertas Proses Realizability Abramsky , yang menunjukkan bagaimana Anda menafsirkan program bersamaan sederhana sebagai bukti proposisi dari logika linier. (Literatur berisi banyak pekerjaan pada tipe sesi untuk mengetik program pi-kalkulus, tetapi tipe sesi dan tipe linier sangat erat terkait.)

SEBUAHBSEBUAHB

Ini baik-baik saja dari teori tipe POV, tapi ini aneh ketika pemrograman. Alasannya adalah bahwa pemrogram akhirnya mengelola tidak hanya panggilan fungsi mereka, tetapi juga tumpukan panggilan. (Memang, pengkodean lambda kalkulus menjadi pi kalkulus biasanya berakhir seperti transformasi CPS.) Sekarang, mengetik memastikan bahwa mereka tidak akan pernah mengacaukan ini, tetapi bagaimanapun banyak pembukuan yang dilakukan untuk programmer.

Ini bukan masalah yang unik untuk teori konkurensi --- kalkulus mu memberikan akun teoritik-bukti yang bagus dari operator kontrol sekuensial seperti panggilan / cc, tetapi dengan harga membuat stack eksplisit, yang menjadikannya bahasa pemrograman yang canggung.

Jadi ketika merancang bahasa pemrograman bersamaan, pendapat saya adalah bahwa Anda harus mendesain bahasa Anda dengan abstraksi tingkat yang lebih tinggi daripada pi-kalkulus mentah, tetapi Anda harus memastikan bahwa itu diterjemahkan dengan bersih ke dalam kalkulus proses mengetik yang masuk akal. (Contoh terbaru yang bagus dari ini adalah Tonhino, Caires, dan Proses, Fungsi, dan Sesi Tingkat Tinggi Pfenning : A Integration Monadic .)


πλππ

λμπλ

Salah satu cara berbuah untuk berfikir tentang fungsi adalah bahwa mereka adalah interaksi client-server, di mana saluran kembali afine dan saluran server direplikasi. Ini bisa diketik dengan mudah. Tipe sesi tidak sepenuhnya menangkap ini, karena mereka sedikit terlalu lemah dalam kendala interaksi yang mereka lakukan.
Martin Berger

πλ

π

1

Anda mengatakan bahwa " tujuan akhir sebenarnya adalah menggunakan teori untuk benar-benar membangun PL." Jadi, Anda mungkin mengakui bahwa ada tujuan lain?

Dari sudut pandang saya, tujuan teori No. 1 adalah untuk memberikan pemahaman, yang dapat menjadi alasan tentang bahasa pemrograman yang ada serta program yang ditulis di dalamnya. Di waktu senggang, saya memelihara perangkat lunak yang besar, klien email, yang ditulis berabad-abad yang lalu di Lisp. Semua teori PL yang saya tahu seperti logika Hoare, Logika Pemisahan, abstraksi data, parametrisitas relasional, dan kesetaraan kontekstual, dll. Berguna dalam pekerjaan sehari-hari. Sebagai contoh, jika saya memperluas perangkat lunak dengan fitur baru, saya tahu bahwa ia masih harus mempertahankan fungsi aslinya, yang berarti bahwa ia harus berperilaku dengan cara yang sama di bawah semua konteks lama walaupun itu akan melakukan sesuatu yang baru di konteks baru. Jika saya tidak tahu apa-apa tentang kesetaraan kontekstual, saya mungkin bahkan tidak akan bisa membingkai masalah dengan cara itu.

Datang ke pertanyaan Anda tentang pi-kalkulus, saya pikir pi-kalkulus masih agak terlalu baru untuk menemukan aplikasi dalam desain bahasa. The halaman wikipedia di pi-kalkulus tidak menyebutkan BPML dan Occam-pi sebagai desain bahasa menggunakan pi-kalkulus. Tetapi Anda juga dapat melihat halaman CCS pendahulunya, dan kalki proses lainnya seperti CSP, bergabung dengan kalkulus dan lainnya, yang telah digunakan dalam banyak desain bahasa pemrograman. Anda mungkin juga melihat bagian "Objek dan pi-kalkulus" dari buku Sangiorgi dan Walker untuk melihat bagaimana pi-kalkulus berhubungan dengan bahasa pemrograman yang ada.


0

Saya suka mencari implementasi praktis dari proses kalkulus di alam :) (selain membaca tentang teori).

  1. Saluran Clojure async didasarkan pada CSP: http://clojure.com/blog/2013/06/28/clojure-core-async-channels.html
  2. Golang juga memiliki saluran berdasarkan CSP (menurut saya Rich Hickey untuk clojure): http://www.informit.com/articles/printerfriendly/1768317
  3. Ada seorang pria yang membuat ekstensi berbasis ACP ke scala (Subscript) tetapi saya tidak memiliki cukup reputasi untuk memposting tautan ...

dll.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.