Apakah C ++ 20 mandat kode sumber disimpan dalam file?

106

Sebuah pertanyaan yang agak aneh, bagaimanapun, jika saya ingat dengan benar, kode sumber C ++ tidak memerlukan sistem file untuk menyimpan file-nya.

Memiliki kompiler yang memindai kertas tulisan tangan melalui kamera akan menjadi implementasi yang sesuai. Meski secara praktis tidak masuk akal.

Namun C ++ 20 sekarang menambahkan lokasi sumber dengan file_name. Apakah sekarang ini menyiratkan bahwa kode sumber harus selalu disimpan dalam sebuah file?

JVApen
sumber
13
Ini telah ada di C sejak selamanya - __FILE__. Kelas source_locationhanya memungkinkan Anda mendapatkannya di situs panggilan fungsi.
StaceyGirl
28
Tidak bisakah Anda memberikan nama file pada kertas tulisan tangan Anda?
Jarod42
8
Saya pikir ini adalah detail implementasi apakah kode sumber ada dalam file, atau yang lainnya. Jika kompilator dapat diberi kode sumber melalui stdin, sumber tersebut dapat berada dalam database.
Eljay
8
Contoh saya mungkin sedikit salah, tetapi jika Anda menggunakan beberapa kompiler on-the-fly, seperti TCC Anda selalu dapat menyediakan beberapa nama sumber yang dapat dibaca manusia demi pelaporan kesalahan meskipun Anda mengkompilasi langsung dari memori. Artinya, memiliki "nama file" tidak berarti disimpan sebagai file sama sekali.
user7860670
2
Tentunya file implementasi seperti <iostream> itu mungkin bukan file (jika Anda mengerti maksud saya), bukan file yang ditulis oleh pengembang?

Jawaban:

110

Tidak, kode sumber tidak harus berasal dari file (atau pergi ke file).

Anda dapat mengkompilasi (dan menautkan) C ++ sepenuhnya di dalam pipa, meletakkan kompiler Anda di tengah, mis

generate_source | g++ -o- -xc++ - | do_something_with_the_binary

dan sudah seperti itu selama beberapa dekade. Lihat juga:

Pengenalan std::source_locationdalam C ++ 20 tidak mengubah keadaan ini. Hanya saja beberapa kode tidak akan memiliki lokasi sumber yang ditentukan dengan baik (atau mungkin terdefinisi dengan baik, tetapi tidak terlalu berarti). Sebenarnya, saya akan mengatakan bahwa desakan untuk mendefinisikan std::source_locationmenggunakan file agak rabun ... meskipun dalam keadilan, itu hanya setara dengan makro __FILE__dan __LINE__yang sudah ada di C ++ (dan C).

@ HBv6 mencatat bahwa jika Anda mencetak nilai __FILE__saat mengompilasi menggunakan GCC dari aliran input standar:

echo -e '#include <iostream>\n int main(){std::cout << __FILE__ ;}' | g++ -xc++  -

menjalankan hasil cetakan yang dapat dieksekusi <stdin>.

Kode sumber bahkan dapat berasal dari Internet.

@Morwenn mencatat bahwa kode ini:

#include <https://raw.githubusercontent.com/Morwenn/poplar-heap/master/poplar.h>

// Type your code here, or load an example.
void poplar_sort(int* data, size_t size) {
    poplar::make_heap(data, data + size);
    poplar::sort_heap(data, data + size);
}

berfungsi di GodBolt (tetapi tidak akan berfungsi di mesin Anda - tidak ada kompiler populer yang mendukung ini.)

Apakah Anda seorang pengacara bahasa? Ok, jadi mari kita konsultasikan standar ..

Pertanyaan apakah sumber program C ++ harus berasal dari file tidak dijawab dengan jelas dalam standar bahasa. Melihat draf standar C ++ 17 (n4713), bagian 5.1 [lex.separate] berbunyi:

  1. Teks program disimpan dalam unit yang disebut file sumber dalam dokumen ini. File sumber bersama dengan semua header (20.5.1.2) dan file sumber yang disertakan (19.2) melalui arahan preprocessing #include, dikurangi semua baris sumber yang dilewati oleh arahan praproses inklusi bersyarat (19.1), disebut unit terjemahan.

Jadi, kode sumber tidak harus disimpan dalam file itu sendiri, tetapi dalam "unit yang disebut file sumber". Tapi kemudian, dari mana asalnya? Seseorang akan berasumsi bahwa mereka berasal dari file bernama pada sistem file ... tetapi itu juga tidak diamanatkan.

Bagaimanapun, std::source_locationtampaknya tidak mengubah kata-kata ini di C ++ 20 atau mempengaruhi interpretasinya (AFAICT).

einpoklum
sumber
9
Pipa itu adalah "file sumber" untuk keperluan standar.
melpomene
5
Saya melihat pada standar C, yang mendefinisikan: "Teks program disimpan dalam unit yang disebut file sumber , (atau file preprocessing ) dalam Standar Internasional ini." Jadi dimanapun kode disimpan, itu adalah "file sumber" di Standardese. (Tambahan: Bahasa serupa ditemukan dalam standar C ++ di bawah [lex].)
melpomene
8
@melpomene: Unit hanya disebut file sumber, tidak dikatakan bahwa mereka sebenarnya harus menjadi file sumber. Tapi saya akan mengedit jawabannya untuk memasukkan ini.
einpoklum
13
Baru saja mencoba ini dengan GCC: "echo '#include <stdio.h> \ nint main () {printf ("% s \\ n ", __FILE__); return 1;}' | gcc -o test -xc -" ( tanpa tanda kutip). Ketika dijalankan, itu mencetak <stdin>.
HBv6
11
Ada hal yang lucu tentang istilah, nama, dan konsep dalam standar (dan sains): biasanya mereka atom. Artinya, "file sumber" belum tentu merupakan "file" yang merupakan "sumber", pada kenyataannya, istilah "file" mungkin tidak dapat didefinisikan - bandingkan dengan angka dalam matematika: tidak ada yang namanya "hanya" bilangan ", hanya" nmber alami "," bilangan rasional "," bilangan real ", dll.
Joker_vD
53

Bahkan sebelum C ++ 20, standarnya telah memiliki:

__FILE__

Nama yang diperkirakan dari file sumber saat ini (literal string karakter).

Definisinya sama untuk source_location::file_name.

Dengan demikian, belum ada perubahan terkait dukungan untuk implementasi tanpa sistem file di C ++ 20.

Standar tidak secara tepat mendefinisikan apa artinya "file sumber", jadi apakah itu merujuk ke sistem file mungkin tergantung interpretasi. Agaknya, itu bisa menyesuaikan untuk implementasi untuk menghasilkan "catatan tulisan tangan yang Anda berikan kepada saya saat itu" jika itu memang mengidentifikasi "file sumber" dalam implementasi bahasa itu.


Kesimpulannya: Ya, sumber disebut sebagai "file" menurut standar, tetapi apa itu "file" dan apakah sistem file yang terlibat tidak ditentukan.

eerorika
sumber
2
@Yksisarvinen Saya tidak tahu persis maksud dari kualifikasi "praduga" dari aturan tersebut, tetapi saya kira :) bahwa ini adalah klarifikasi bahwa nama file memang harus mutlak atau kanonik, melainkan nama relatif dari perspektif kompilernya cukup. Saya bisa saja salah.
eerorika
4
Saya hanya bisa melihat scanner-c++kembali "Kabinet kiri, laci ketiga, folder tab merah keempat, halaman 17" .
dmckee --- mantan moderator kucing
2
FWIW, dalam pengertian POSIX, pipa (atau file-ish lainnya) adalah "file" - dengan demikian, stdin / stdout adalah "file", hanya saja bukan file disk, dll. Dalam pengertian ini.
3
@Yksisarvinen: Komite sering memberikan kelonggaran untuk situasi di mana penerapan yang tidak jelas mungkin memiliki alasan yang baik untuk melakukan sesuatu yang bertentangan dengan perilaku biasa. Dalam melakukan itu, penulis kompilator bergantung pada penilaian apakah pelanggan mereka akan menganggap perilaku biasa lebih atau kurang berguna daripada beberapa alternatif. Fakta bahwa hal-hal seperti itu diserahkan kepada penilaian pelaksana dapat dipandang sebagai "ambiguitas", tetapi ini disengaja, karena penulis kompiler yang baik akan tahu lebih banyak tentang kebutuhan pelanggan mereka daripada yang pernah bisa dilakukan Komite.
supercat
1
@dmckee ... di toilet bekas dengan tanda di pintu bertuliskan 'Waspadalah terhadap Macan Tutul. ”
Andrew Henle