Ця стаття є дзеркальною статтею машинного перекладу, будь ласка, натисніть тут, щоб перейти до оригінальної статті.

Вид: 14293|Відповідь: 2

[C] Мова C така потужна, якою мовою вона написана?

[Копіювати посилання]
Опубліковано 28.09.2019 16:51:21 | | |
"Якою мовою написано сам C?"

З іншого боку, це так: перед запуском мови C її потрібно скомпілувати, то звідки взявся компілятор мови C? Якою мовою він написаний? Якщо це написано на самому C, чи спочатку яйце чи курка?

1

Припустимо, що у світі немає компіляторів, почнемо з машинної мови і подивимось, як.

Машинна мова може виконуватися безпосередньо процесором без потреби в компіляторі.

Далі є асемблер, хоча асемблер — це лише мнемоніка для машинної мови, але її також потрібно компілювати в машинну мову для виконання, тому немає вибору, окрім як використовувати машинну мову для написання цього першого компілятора (який не буде використовуватися в майбутньому).

Проблема асемблерної мови вирішена, і це великий крок уперед, наразі можливо використовувати асемблер для написання компілятора мови C, який, як ми вважаємо, є предком компілятора C.

З цим предком ви можете компілювати будь-яку програму мовою C, тож чи можете ви написати компілятор безпосередньо мовою C? Просто скомпілюйте його з предками.

Добре, після такого шару я нарешті отримав компілятор, написаний на C, що справді клопітно.

На цьому етапі компілятор C, написаний попереднім пакетом, можна залишити.

Звісно, якщо до C існували інші високорівневі мови, такі як Pascal, то Pascal можна було б використати для написання компілятора C.

Вважається, що укладач першого Паскаля був написаний фортранською. Як перша мова високого рівня, компілятор Fortran має бути написаний на асемблері.

2

Ось цікава легенда про компілятора:

За легендою, Кен Томпсон, один із винахідників Unix, впевнено заходив на будь-яку Unix-комп'ютер у Bell Labs, ввів своє ім'я користувача та пароль, і міг увійти в root-канал!

Bell Labs повна талантів, і деякі інші великі «бики» пообіцяли знайти цю вразливість, вони прочитали вихідний код Unix на C і нарешті знайшли бекдор для входу, після очищення бекдора скомпілювали Unix і запустили його, але Томпсон все одно зміг увійти.

Дехто вважає, що може бути проблема з компілятором, і під час компіляції Unix був імплантований бекдор, тому компілятор переписали на C і знову скомпілювали Unix з новим компілятором.

Але це все одно не працює, Томпсон все ще може входити через root, що дуже прикро!

Пізніше сам Томпсон розблокував секрет, це був перший компілятор на C, який зіткнувся з проблемою, цей компілятор, звісно, буде імплантований у бекдор під час компіляції вихідного коду Unix, цього недостатньо, що ще краще — якщо ви пишете новий компілятор мовою C, вам точно потрібно скомпілювати його у бінарний код, що компілювати, використовуйте лише перший компілятор, написаний Томпсоном, добре, компілятор, який ви написали, буде забруднений, ваш компілятор знову компілює Unix, Також імплантую бекдор :-)

До речі, я згадую інцидент з XcodeGhost кілька років тому, який просто означає, що в Xcode (завантажений з неофіційних каналів) був імплантований троянський конь, через що iOS-додатки, скомпільовані XCode, були забруднені, і ці додатки могли бути використані хакерами для незаконних дій.

Хоча цей XCodeGhost далекий від Томпсона, він нагадує нам, що при завантаженні програмного забезпечення слід використовувати офіційні канали, завантажувати з офіційного сайту, шукати стандарт HTTPS сайту і навіть перевіряти контрольну суму.

3

Дехто може запитати: я використовую Hui для написання абзацу Hello World, але хтось може використати його для створення складного компілятора? Чи це можливо?

Звісно, коли розроблялося перше покоління Unix, мови C не було, і Кен Томпсон з Деннісом Річі друкували Unix на конвеєрах.   Першу версію WPS написав Цю Боцзюнь у Хуей, а компілятор Turbo Pascal також написав Андерс у хуей, і здібності богів неможливі для звичайних людей.

Для компіляторів також можливо розробляти у «сніжковому» стилі:

Все ще беручи мову C як приклад, перша версія може обирати підмножину мови C, наприклад, підтримуючи лише базові типи даних, оператори керування процесами та виклики функцій...... Ми називаємо цю підмножину C0.

Потім напишіть компілятор у асемблері і отримайте лише підмножину цієї мови C0, щоб писати її було набагато легше.

Мова C0 працює, а потім ми розширюємо цю підмножину, додаючи структури, вказівники ...... і викликаючи нову мову C1.

Хто пише компілятор для мови C1?   Звісно, це C0.

Коли C1 працює, знову розширюйте функції мови, пишіть компілятор на C1 і отримайте C2.

Потім є C3, C4......  Нарешті, ви отримуєте повну мову на C.

Цей процес називається bootstrapping, а китайською — bootstrapping.





Попередній:Новий .NET Core випускає однофайловий виконуваний файл
Наступний:Чому програмісти працюють нескінченно понаднормово?
Опубліковано 29.09.2019 09:27:54 |
Якою мовою написано сам C?
Опубліковано 01.10.2019 23:54:34 |
Якою мовою написано сам C?
Застереження:
Усе програмне забезпечення, програмні матеріали або статті, опубліковані Code Farmer Network, призначені лише для навчання та досліджень; Вищезазначений контент не повинен використовуватися в комерційних чи незаконних цілях, інакше користувачі несуть усі наслідки. Інформація на цьому сайті надходить з Інтернету, і спори щодо авторських прав не мають до цього сайту. Ви повинні повністю видалити вищезазначений контент зі свого комп'ютера протягом 24 годин після завантаження. Якщо вам подобається програма, будь ласка, підтримуйте справжнє програмне забезпечення, купуйте реєстрацію та отримайте кращі справжні послуги. Якщо є будь-яке порушення, будь ласка, зв'яжіться з нами електронною поштою.

Mail To:help@itsvse.com