Mengapa file Script Editor .scpt tidak disimpan sebagai file teks biasa?

16

Script Editor (sebelumnya AppleScript Editor pre-Yosemite 10.10) menyimpan .scptfile sebagai file biner, bukan file teks biasa.

Itu membuat bekerja dengan mereka dalam sistem kontrol kode sumber agak rumit.

Adakah yang tahu mengapa ini masalahnya? Apakah ada sejarah lama yang mengharuskan format file ini menjadi sesuatu selain file teks biasa?

Ian C.
sumber
Saya tidak tahu mengapa, tetapi seperti yang dikomentari di sini , Anda dapat menulis makro hotkey / skrip untuk disimpan sebagai teks. Ini menyakitkan tetapi bisa dilakukan ...
Vic
2
Di panel Simpan Anda dapat menyimpan skrip dalam beberapa format berbeda, termasuk teks biasa.
Chris Page
"Dapatkan skrip sebagai teks dari file scpt?": Lists.apple.com/archives/applescript-users/2007/Mar/…
pkamb

Jawaban:

20

Makalah William R. Cook berisi sejarah dan wawasan yang sangat baik dari mereka yang terlibat dengan AppleScript pada tahun 1989.

Berikut ini menyenangkan dan spekulatif.

Konservasi Ruang dan Pemrosesan

AppleScript ditulis pada saat setiap byte dan bit bernilai. Pengkodean malas OS X sebagai format daftar properti akan sia-sia di mata para pengembang awal tersebut.

Format biner menyediakan formulir pra-parsing yang menghindari duplikasi proses parsing kompleks, rawan kesalahan, dan memakan waktu dengan setiap beban dari disk. Lebih baik memuat langsung ke memori dan jalankan.

Adaptif

Menyimpan dalam format biner memungkinkan AppleScripts untuk diikat ke kode AppleEvent yang mendasari kamus mereka dari terminologi bentuk panjang.

Ini akan memungkinkan AppleScript ditulis dan disimpan terhadap satu versi aplikasi untuk secara otomatis memperbarui ke perubahan terminologi antara versi aplikasi yang ditargetkan.

Objek integer dapat disebut 'integer' dalam skrip tetapi disimpan sebagai kode empat karakter ' int ' dalam representasi biner. Empat kode karakter berasal dari kamus AppleScript yang disediakan oleh sistem operasi.

Jika terminologi AppleScript di masa depan memutuskan untuk mengubah kata yang menghadap pengguna untuk integer, representasi biner dapat memetakan ke nama yang lebih baru.

Sisi lain dari hal ini dimungkinkan untuk dilihat hari ini. Tulis AppleScript terhadap kamus aplikasi. Kemudian hapus aplikasi sepenuhnya dari Mac Anda. Apa yang Anda lihat di Editor Skrip saat membuka skrip?

Setidaknya dalam versi terbaru, Editor AppleScript menunjukkan chevron yang mengelilingi empat kode karakter . Kode telah diingat dan disorot. Bukan pengguna yang menghadapi terminologi.

Ini mungkin bukan manfaat utama tetapi manfaat yang mungkin.

Bias modern

Patut diakui bias modern kita untuk dokumen teks. Pengalaman telah mengajarkan banyak dari kita bahwa menyimpan konten yang berharga dalam format biner membawa risiko. Format biner seringkali tidak terdokumentasi dengan baik , buram bagi pengguna akhir, dan sulit dibuka ketika perangkat lunak yang dimiliki tidak dipelihara.

Ketika AppleScript dan format binernya dibuat, bias ini belum terbentuk. Batas penyimpanan dan komputasi sangat nyata dan setiap kilobyte atau ribuan siklus yang disimpan bermanfaat.

Sejarah dan Asal

Kisah-kisah tentang asal AppleScript luar biasa tetapi sulit dilacak akhir-akhir ini. AppleScript mencoba menjadi bahasa yang ramah, seperti bahasa Inggris, dan sangat menarik dalam visinya; implementasi aktual lebih sulit untuk diperbaiki!

Graham Miln
sumber
16

Singkatnya, .scptmemungkinkan kompatibilitas ke belakang. Plus, applescript / javascript (dll) dapat disimpan dengan ekstensi yang sama, mengingat Script Editorsekarang mendukung javascript.

Untuk mendekompilasi .scptdalam shell:

https://github.com/rupa/applescript/blob/master/decompile.sh

Bagian yang paling relevan:

osadecompile

Textmate adalah editor pihak ketiga yang bisa membaca .scpt:

https://github.com/textmate/textmate/blob/master/Applications/decompile_as/src/decompile_as.mm

Bagian yang paling relevan:

[[OSAScript alloc] initWithCompiledData:];

Fungsi ini berasal OSAScript.h, terlepas dari OS X SDK. Di OSAScript.h, ada komentar panjang ini:

Diberi URL yang menempatkan skrip yang dikompilasi, aplikasi skrip, atau sumber skrip, membuat dan mengembalikan deskriptor data skrip autoreleased dengan kontennya. Anda dapat menggunakan deskriptor untuk membuat skrip dengan - [OSAScript initWithScriptDataDescriptor: ...]. Ini memungkinkan Anda membuat skrip dengan OSALanguageInstance spesifik. Anda dapat menggunakan + [OSALanguage languageForScriptDataDescriptor:] untuk mendapatkan bahasa untuk data skrip, yang kemudian dapat digunakan untuk membuat atau memilih contoh bahasa yang sesuai untuk OSAScript. Data sumber skrip dapat dikompilasi oleh - [OSAScript initWithScriptDataDescriptor: ...], atau Anda dapat memaksa descriptor ke string (menggunakan metode NSAppleEventDescriptor) dan secara eksplisit membuat OSAScript dengan sumbernya. + (NSAppleEventDescriptor *) scriptDataDescriptorWithContentsOfURL:

Pada dasarnya, ketika disimpan .scpt , OSALanguageInstancedeskriptor juga disimpan dalam file.

Jika suatu file disimpan sebagai .applescript / teks, sistem akan mengompilasinya dengan versi bahasa applescript terbaru. Sebuah skrip, misalnya, ditulis untuk versi OS X yang lebih lama mungkin tidak berfungsi pada versi baru karena beberapa fungsi telah menjadi usang. Dengan .scpt, sistem / aplikasi telah memilih versi applescipt untuk apa.

Dari 10.10, javascript dapat disimpan .scptdan dijalankan dengan benar.

lebih jauh
sumber
Mendapat `errOSASourceNotAvailable (-1756) .` apa artinya?
TCB13
1
+1 untuk tautan dekompilasi. @ TCB13 yang terjadi ketika file .scpt Anda bukan biner dan seharusnya jadi editor mengalami kesulitan untuk menyelesaikannya adalah dengan menutup jendela yang akan meminta Anda untuk membuat salinan. Salinan kemudian akan menyimpan informasi dalam format yang dikompilasi ke depan. Namun semua ini akan diselesaikan dalam jawaban yang akan saya posting yang saya pelajari dari jawaban yang lebih jauh ini yang berisi perintah dekompilasi.
Michael Dimmitt
Hanya untuk menambah ini, ada juga asprinttersedia dari < hasseg.org/asprint > yang akan memungkinkan Anda 'cukup mencetak' file .scpt. Satu-satunya kelemahan adalah bahwa itu tidak berfungsi pada file JavaScript .scpt, hanya yang AppleScript.
TJ Luoma
1

Setelah melihat perintah dekompilasi yang dibagikan oleh Fartheraway, saya menemukan solusinya. Jika Anda ingin file applescript (.scpt) tidak menjadi biner.

@fartheraway juga menyebutkannya di bawah jawabannya.

cukup lakukan semua pengembangan dengan ekstensi .applescript.

Editor Skrip akan dapat menjalankan kode dan tidak akan menyimpannya dalam format yang dikompilasi.

Michael Dimmitt
sumber