Тёмный

Написал язык программирования с нуля. Как работает компилятор и препроцессор - IT_школьник. 

IT_Школьник
Подписаться 2,6 тыс.
Просмотров 18 тыс.
50% 1

Сегодня я расскажу как работают языки программирования с точки зрения интерпретаторов, и компиляторов. Вы узнайте как компьютер понимает код, а
в конце я поделюсь тем, как я написал собственный язык программирования. А с вами
IT_школьник, всем приятного просмотра!
ССЫЛКА НА АРХИВ - disk.yandex.ru...
ССЫЛКА НА GCC - www.equation.co...
Архив я выложил на Яндекс Диск лишь по той причине, что это ещё не полная версия, которая будет дорабатываться в дальнейшем. А потом язык скорее всего пойдёт и на мой GitHub.
Небольшая поправка на 4:40 : ENTER - (13)

Опубликовано:

 

26 сен 2024

Поделиться:

Ссылка:

Скачать:

Готовим ссылку...

Добавить в:

Мой плейлист
Посмотреть позже
Комментарии : 115   
@IT_Shkolnik
@IT_Shkolnik 3 года назад
ССЫЛКА НА АРХИВ - disk.yandex.ru/d/qHIqBk7tJOc4Uw ССЫЛКА НА GCC - www.equation.com/servlet/equation.cmd?fa=fortran
@feviend8265
@feviend8265 2 года назад
Лучше выкладывать код на github. Там есть и комменты, ветки и всё такое. А в яндекс диске нету
@IT_Shkolnik
@IT_Shkolnik 2 года назад
@@feviend8265 я уже на гитхаб все выкладываю :)
@yessimovaindira8016
@yessimovaindira8016 Год назад
Ну Президента туркмении тебе не обогнать. Он единственный кто смог написать нейросеть на html
@timofdev
@timofdev 2 года назад
Никита, случайно наткнулся на твоё видео и у меня восхищение. Ты огромный молодец!
@IT_Shkolnik
@IT_Shkolnik 2 года назад
Спасибо за приятные слова!
@ExPoSeS2811
@ExPoSeS2811 3 года назад
Спасибо, я понимал конечно что такое компиляции и интерпретация, но плохо. А теперь ты все разложил, и стало все понятно!
@IT_Shkolnik
@IT_Shkolnik 3 года назад
Я рад, что вам помогло моё объяснение! И конечно спасибо за комментарий, только так ютуб понимает что мои ролики интересны
@skill_x_8016
@skill_x_8016 3 месяца назад
Боже мой, парень, ты просто невероятно хорош! Когда смотришь твои видео, понимаешь что нет ничего невозможного) Спасибо тебе огромное и удачи в развитии канала🔥
@GOALACTION
@GOALACTION 3 года назад
Слушай было достаточно интересно! Продолжай в том же духе!😉
@IT_Shkolnik
@IT_Shkolnik 3 года назад
Спасибо, друг!
@gn0rltv311
@gn0rltv311 Год назад
О привет, как поживаешь?
@stalker32041
@stalker32041 Год назад
1:37. Разница между двумя строками в том, что верхняя хардкодится в исходник по адресу, а нижняя подменяет все a, которые появятся дальше по коду на 5.
@IT_Shkolnik
@IT_Shkolnik Год назад
Немного не так. Под верхнюю выделяется место на стеке как под обычную переменную, только её нельзя менять через её символ. А нижняя хардкодится
@stalker32041
@stalker32041 Год назад
@@IT_Shkolnik это же препроцессор... он конкретно подменяет во время работы дериктивы и их упоминания на результат. То есть все инклюды буквально компонуют несколько файлов в 1 перед обработкой остальной частью компилятора.
@IT_Shkolnik
@IT_Shkolnik Год назад
@@stalker32041 дефайн - да, согласен. Под const память выделяется
@tolikblik1
@tolikblik1 Год назад
Супер, шикарно объясняешь!
@IT_Shkolnik
@IT_Shkolnik Год назад
Спасибо!
@misterfox3464
@misterfox3464 3 месяца назад
Скажем так. Реализация и идея хрень. НО! Интеллект - это способность решать не стандартные задачи нестандартно... Мне кажется ты доказал что будь у тебя достаточно времени и знаний ты бы написал намного лучше. Продолжай )
@ВаняФилин-ф2г
@ВаняФилин-ф2г 2 месяца назад
Если ты дальше этим будешь заниматься , тебя ждет большое будущее !
@zx_gamer1381
@zx_gamer1381 Год назад
Препроцессор не "подключает" библиотеки. Препроцессор обрабатывает макросы. В частности команда #include означает, что препроцессор должен вместо этой строчки вставить содержимое файла. В заголовочных файлах (внезапно!) находятся только заголовки. А непосредственно "подключение" (правильнее сказать "связывание") скомпилированных объектных файлов осуществляет линковщик. P.S. В заголовочных файлах писать код можно, но оправданно оно только в случае написания глобальных шаблонных функций или классов на языке С++.
@IT_Shkolnik
@IT_Shkolnik Год назад
Ага. И ещё в случае однострочных инлайн функций
@itszzupart6607
@itszzupart6607 Год назад
Так то по общему определению препроцессор просто обрабатывает текст программы в другой текст программы, заместь тех же инклудов ставит текст заголовка, а заместь названий констант - их значения. Можно вообще в константы целые строки кода записывать насколько я помню
@feviend8265
@feviend8265 2 года назад
Привет. Крутое видео. Занимаюсь программированием 2 года. Сейчас мне 14. Я делал 2 своих языка программирования которые были компиляторами и переводились в c++ и c#. 2 язык был намного сложнее, там был кроме компилятора еще и лексер который разбивал код на токены и образовывал AST (абстрактное синтаксическое дерево). Hello world на моём 2 языке: main: print("Hello World") end
@lizbertarian
@lizbertarian 2 года назад
Как ты строил AST? Какой тип парсера использовал (LL или LR)?
@feviend8265
@feviend8265 2 года назад
@@lizbertarian не знаю что такое LL и LR. Лексер в моём языке это и лексер и парсер вместе. Писал его без кодогенераторов. Использовал рекурсию. Больше не помню потому что это было год назад. Надо смотреть код
@feviend8265
@feviend8265 2 года назад
@@lizbertarian у тебя есть telegram?
@lizbertarian
@lizbertarian 2 года назад
@@feviend8265 @ lizzy_weiss
@yzyteam
@yzyteam Год назад
Обзор сделаешь на свое творение ?
@endyelectrician2491
@endyelectrician2491 Год назад
Отличная работа 🚀, но кажется точнее будет называть твой "компилятор" транслятором. Бьёрн Страупструп тоже первую рабочую версию языка С++ реализовал как транслятор с С++ на С. Желаю удачи и самое главное - не бросай подобные затеи.
@IT_Shkolnik
@IT_Shkolnik Год назад
Спасибо большое. Бросать я не собирался, а вот от ютуба немного отошел. Но я возвращаюсь и буду продолжать снимать видео. Замечание про транслятор верное!
@memoryspeak
@memoryspeak Год назад
​@@IT_Shkolnik возвращайся
@romarom346
@romarom346 Год назад
Если говорить точнее, Бьярне создал транспайлер, это транслятор, транслирующий один высокоуровневый язык, в другой высокоуровневый язык, либо в самого себя, но потом он создал полноценный отдельный от Си компилятор.
@levovix
@levovix 2 года назад
1:01 Препроцессор - программа, которая выполняет предобработку кода. Библиотеки подключает, раз уж на то пошло, линковщик, который связывает символы из разных объектных файлов
@IT_Shkolnik
@IT_Shkolnik 2 года назад
Я имел ввиду что в С препроцессор подключает заголовочные файлы с функциями
@user33017
@user33017 Год назад
Ммм за 4 дня сделать свой яп с интерпретатором. Ничего себе. Я ток за минут 10 сделал калькулятор на языке си. До этого 4 года программировал на python. Понял, что задачи, для которых он сделан не подходят для меня. Потом перешёл на c++. Попробовал си. Все мифы, что якобы он очень сложный развеялись. До этого вывел строку на голом железе на fasm. А потом узнал о roadmap'ах и понял, что я нихрена не знаю, пон.😂😂😂
@IT_Shkolnik
@IT_Shkolnik Год назад
Ваш комментарий можно использовать как идеальный ответ на "Что такое программирование в двух словах"
@LightSpark75002
@LightSpark75002 4 месяца назад
Я тоже все время изучал питон, а теперь начал джаву. Я понял что она тоже больше подходит для меня.
@SerjCrimea
@SerjCrimea Год назад
У тебя по сути получился интерпретатор. Для компиляции нужно учить Ассемблер. И типа пишешь CLS а в коде Ассемблер, вызываешь очистку экрана. Ну и компилятор Ассемблера, везде участвует, даже в Си и в Си++ ;)
@tailogs5825
@tailogs5825 Год назад
Если так докапываться, то у него получился транслятор. Но по сути у него смесь транслятор/компилятор, так как в любом случае мы получаем испольняемый файл, которой не нужен интерпретатор (виртуальная машина) для работы.
@IT_Shkolnik
@IT_Shkolnik Год назад
Со всеми согласен, в моей реализации смесь из транслятора и интерпретатора. А про ассемблер видео дальше будут
@nakidai
@nakidai Год назад
Если говорить правильно, то не компилятор ассемблера, а а ассемблер :)
@ТимерланБатаев
Конвертор*
@ТимерланБатаев
Работа интерпретатора основана на VM
@lq9263
@lq9263 2 года назад
Твое решение конечно интересно, но если кто то будет пользоваться твоим языком. То пользователю придется понимать ошибки языка C. Так что предлагаю посмотреть в сторону байткод. Работает это очень просто так вот: твоя программа превращает код понятный пользователь в менее понятный для пользователя, и более простой. А потом твоя программа может выполнять этот байткод.
@IT_Shkolnik
@IT_Shkolnik 2 года назад
Спасибо за идею!
@codemonkey2190
@codemonkey2190 2 года назад
В самом с++ настолько много инструментов и возможностей что сам c++ можно переделать в другой язык.
@mr.efertyon1922
@mr.efertyon1922 7 месяцев назад
если знаешь где найти полную вики со всеми инструментами и возможностями скинь.
@haxidenti6001
@haxidenti6001 Год назад
Это не язык программирования а команды. В целом думаешь правильно. Только создавая язык, создавай язык, не его функции. А то не создав язык до конца ты уже создаёшь функции. Они будут потом, сначала создай сам фундамент, а функции придут со временем. Делать язык тупо для команд, то лучше взять какой то пайтон, он же будет лучше чем скачивать твой. Но если всерйоз то сделать свой яп было бы круто и что бы была главное сво идея, зачем кго делаешь. В противном случае язык ради языка - такое
@IT_Shkolnik
@IT_Shkolnik Год назад
Я не собирался делать серьёзный ЯП, который будет использоваться людьми по всему миру. Это тестовый язык, чтобы попробовать себя в написании транслятора и реализации
@vincentvince2136
@vincentvince2136 Год назад
​@@IT_Shkolnik ты написал детское говнище, я таким баловался еще когда начинал свой путь проганья. У тебя нет ничего, из чего обычно делают ЯП, т.е. нет лексера парсера и тд
@swiftkey1316
@swiftkey1316 Год назад
Мой язык там работает 1 программа: Code = () String =0 Event =input() Code.append(event) def FileAnalysis() : file=open("main.txt") def FileAnalysis() : File =open("main.txt") print("ошибка в коде") if('form ' (big) ') mainloop #команды языка print("input", programma) это программа выводит, то что в ней написано. IT_школьник пж заметь
@ялюблюмайнкрафт-ф2к
Я так понял ты программируешь на python'e да?
@tailogs5825
@tailogs5825 Год назад
Блин, хотелось бы поюзать
@CAXAROK2010
@CAXAROK2010 Месяц назад
Красавчик
@4edbark
@4edbark Год назад
6:53 Да это прям блюпринты в Unreal Engine. Они также работают. А вообще, у меня давно была похожая идея сделать такой компилятор, но как-то руки не доходят.
@IT_Shkolnik
@IT_Shkolnik Год назад
С блюпринтами и Unreal Engin'ом я не сильно знаком, но рад что вы нашли такую интересную связь. У меня тоже до некоторых запланированных проектов долго руки не доходят, НО. Здесь просто нужно перебороть самого себя и заняться этим делом. Когда я начинаю что-то делать то всё идёт в гору, но если я только думаю как я это буду делать то я могу потратить много времени впустую. Если вы правда хотите сделать компилятор ( любого уровня ), и у вас есть время на это, то смело делайте, таков мой совет )
@shugarok1163
@shugarok1163 Год назад
я думаю на ассемблер(вместо с) легче было бы переводить там потом все понятно команды идут сразу в проц
@IT_Shkolnik
@IT_Shkolnik 7 месяцев назад
Думаю, особой разницы не сыграло бы, ведь большую часть процессорного времени в обоих случаях будут занимать системные вызовы. Да и Ассемблер я тогда ещё не особо хорошо знал, потому выбор пал именно на Си
@artemboiarshinov
@artemboiarshinov 2 года назад
Ждем ролик о создании современного языка программирования PETOOH
@IT_Shkolnik
@IT_Shkolnik 2 года назад
Спасибо! Вы с GitHub я так понимаю?)
@PaulWide
@PaulWide 2 года назад
аааахахаххааха
@cordestandoff2358
@cordestandoff2358 2 года назад
Koo KoO koo kOk kooo
@dyze8847
@dyze8847 Год назад
Написал недавно свой интерпретатор, для выполнения json-файла😂😂 Возможно, это звучит глупо, но это ускоряет написание простых программ))
@IT_Shkolnik
@IT_Shkolnik 7 месяцев назад
Ух ты, наверное классно получилось!
@ЮрийРейковский
@ЮрийРейковский 3 месяца назад
Слушай, а расскажи как собрать установщик под программу
@mikhailreznichenko8035
@mikhailreznichenko8035 2 года назад
Сильно!
@СтепанДнепров
@СтепанДнепров Год назад
Ну, если делать прям по фен-шую, то генерировать надо не сишный код. Нет смысла спускаться на уровень ассемблера (придется тогда под разные ос и архитектуры практически заново писать), лучше использовать LLVM IR для этого
@IT_Shkolnik
@IT_Shkolnik Год назад
Вообще была у меня идея генерировать ассемблер, но на момент создания этого видео я ещё про него почти ничего не знал)
@СтепанДнепров
@СтепанДнепров Год назад
@@IT_Shkolnik ну, писать компилятор сразу в ассемблер это тяжко не только с точки зрения того, что это язык сложный, а с точки зрения того, что под каждую архитектуру нужно будет писать свой компилятор почти с нуля, а llvm будет низкоуровневой прослойкой.
@andreysedunov5154
@andreysedunov5154 Год назад
Привет, я новенький на твоём канале. Расскажи пожалуйста, сколько ты учишь С?
@IT_Shkolnik
@IT_Shkolnik Год назад
Привет, спасибо за комментарий. Я учу Си два с половиной года
@sentronawer2719
@sentronawer2719 2 года назад
силен!
@urson995
@urson995 9 месяцев назад
Очень круто! Но где-то слишком усложнил. В остальном молодец.
@IT_Shkolnik
@IT_Shkolnik 7 месяцев назад
Старался, спасибо!
@cglike
@cglike 2 года назад
1:13 это означает только то что препроцессор буквально возьмет все что есть в файле stdio.h и вставит вместо директивы include, и ничего ты тут не подключаешь
@IT_Shkolnik
@IT_Shkolnik 2 года назад
1. Копирование содержимого из 1 файла в другой называется его «включением» или «подключением». 2. В книге по С Брайана Кернигана и Денниса Ритчи это называется подключением. 3. include переводится как «включить» или «подключить».
@cglike
@cglike 2 года назад
@@IT_Shkolnik если ты напишешь #include то ты подключишь библиотеку ?
@cglike
@cglike 2 года назад
@@IT_Shkolnik include это именно "включить"(содержимое) как часть целого. В твоем случае stdio часть стандартной библиотеки а её подключать не надо. Включая заголовочный файл ты лишь копируешь определения функций и структур из этого файла в свой translation unit. + препроцессор в принципе не способен подключать библиотеки, только ctrl+c/ctrl+v
@MikeGreen-v6t
@MikeGreen-v6t 8 месяцев назад
Отлично!
@IT_Shkolnik
@IT_Shkolnik 7 месяцев назад
Спасибо!
@feviend8265
@feviend8265 2 года назад
Сейчас я делаю свою игру на движке unity. Думаю бесполезно делать свой язык программирования, т.к. есть очень много готовых языков. Даже крупной компании jetbrains, было сложно делать язык kotlin. Лучше писать библиотеки для готовых языков (например python). Думаю добавить в свою игру API для написания модов на python
@tailogs5825
@tailogs5825 Год назад
Ну как прогресс?
@ЮрийРейковский
@ЮрийРейковский 3 месяца назад
А ты хорош
@PaulWide
@PaulWide 2 года назад
у тебя it_батя? колись. монтируешь сам?
@IT_Shkolnik
@IT_Shkolnik 2 года назад
Монтирую сам. Батя - хардварщик
@cordestandoff2358
@cordestandoff2358 2 года назад
@@IT_Shkolnik азахах
@honky-tonk1060
@honky-tonk1060 Год назад
@@IT_Shkolnik - скажи, ты знаешь такого типа с юзернеймом Кибердед (а зовут его Масалович А.И. ) ? Если да - то что скажешь о нем (охота инсайдов от тех, кто общался с ним вживую ) ,
@MotorolaSP24
@MotorolaSP24 6 дней назад
А ты код пишешь на ноутбуке или ПК
@JohnHiz
@JohnHiz Год назад
Думаю что язык С не является таким уж низкоуровневым, низкоуровневый скорее Assembler
@IT_Shkolnik
@IT_Shkolnik Год назад
Тоже верно. Наверное С - средний уровень. Да и вообще попробовав Ассемблер в первый раз, потом перейдя на Си кажется что как будто за рулем летающей машины с автопилотом
@vincentvince2136
@vincentvince2136 Год назад
​@@IT_Shkolnik си - высокоуровненвый яп
@egorovsa
@egorovsa 2 года назад
Чуть чуть медленнее с расстановкой.
@IT_Shkolnik
@IT_Shkolnik 2 года назад
Спасибо за совет
@GELIC
@GELIC 2 года назад
перекинь свой компилятор на гуглдиск потому что у меня в стране заблокали всё русское😢
@IT_Shkolnik
@IT_Shkolnik 2 года назад
У меня тоже много что заблокировали
@seekyboi23
@seekyboi23 Год назад
Езжайте в укр
@addblocker6634
@addblocker6634 Год назад
​@@seekyboi23 разве это не под запретом? Только при наличии родственников. Я думаю не у каждого есть такая возможность.
@seekyboi23
@seekyboi23 Год назад
@@addblocker6634 запрет? Родители будут только рады такому событию
@honky-tonk1060
@honky-tonk1060 Год назад
поставь браузер Опера хоть на компе, хоть на телефоне (там есть встроенный VPN, включи его - и все загрузится/скачается ) ,
@Сергей-ы3д8и
@Сергей-ы3д8и Год назад
Всё круто, но звук ужасный. Купи хороший микрофон.
@IT_Shkolnik
@IT_Shkolnik Год назад
Рад что вам понравилось видео. Да, я уже подумывал над покупкой микрофона, думаю скоро куплю. В любом случае буду всем делиться в телеграмм канале
@motopers
@motopers Год назад
Получилось мего кал где ты говоришь много воды да и то не правду язык СИ никогда не был низкоуровневым это высокоуровневый яп и точка. Низкоуровневый только языки ассемблера выбираешь любой понравившийся транслятор и погнали. Интерпретируемый язык будет выполнен быстрее в первый раз, а компилятор будет долго компенлировать но после его код будет быстрее поскольку ему не нужно перекомпилировать код. Что ты написал это просто кусок кала на СИ где ты определил транслятор как if else нету никаких оптимизаций бизнес логика и интерфейсы вместе короче получился медленный переводчик встречающихся слов в команды си и это никаких образом языком яп назвать нельзя, для этого надо писать на ассемблере и знать computer science на хорошем уровне. И это не хейт просто мнение, а так ты красава учишь в начале СИ это хотябы нормальный язык, а не всякие новомодеые языки с кучей абстракцей для смузихлебов
@tailogs5825
@tailogs5825 Год назад
Не сказал бы что язык СИ высокуровневый, даже в википедии и некоторых книгах сказано, что он именно низкоуровневый, так как может работать напрямую с железом. Можно ещё точнее сказать, что он среуровый, между ассемблером и допустим питоном. По компилятор и интерпретатор согласен не полностью. Если виртуальная машина, тобишь интерпретатор будет тяжелым, то он сперва запускается долго, а потом ещё запускает исходник. Но если он написан хорошо, то по скорости после долгой загрузки он может довольно таки быстро запускать программы, которые могут быть близки к скорости компилируемых языков, но по своей природе никогда их не догонят. А компилированный файл может запуститься сразу. Как видишь вместо двух операций как в интерпретируемых языках идет только одна в компилируемом.
@tailogs5825
@tailogs5825 Год назад
И ещё, для разработчика будет проще писать именно на интерпретируемым языком по многим причинам, например, как ты и сказал, я просто неправильно сперва понял, но это не отменяет сказанные мною слова ранее. Так вот, ты говорил именно про разработку, да, на интерпретируемых языках если интерпретатор работает на фоне, то он быстрее запустить программу, так-как основная часть, тобишь интерпретатор работает, как в то время компилятор только только будет компилировать программу. Но после запуска, скомпилируемая программа будет работать быстрее интерпретируемой. И да, я знаю что VM это разновидность интерпретаторов, навсякий. Буду открыт к критике со стороны и поправке, если я где-либо ошибся
@motopers
@motopers Год назад
@@tailogs5825 Так во первых круто что ты умеешь работать с критикой. Далее язык СИ это сложный высокоуровневый яп. Я не совсем понял аргумент про то что СИ может работать напрямую с железом, любой современный по голу выпуска язык может в той или иной мере это делать даже тот же Js в окружение Node может всё то что и СИ. Только язык ассемблера является низко уровневым, поскольку он имеет возможность напрямую работать с системными вызывами, при этом он самый понятный язык пр и лёгкий в освоении как бы это глупо не звучало для тебя, я имею опыт и помимо своего мнения вижу такое у других. После языка ассемблера были созданы не менее прекрасный паскаль, бейсик, fortran, ada, которые даже по коду они имеет в себе кучу уже написанных декларативных частей, в том то и дело что и низко уровневым языке Ассемблера ты всë пишешь сам. СИ не стоит посередине между python и языком ассемблера скорее ADA
@tailogs5825
@tailogs5825 Год назад
@@motopers ​ @user-pk8hj8lp3e Я сам учил множество языков и пробовал писать программы на всех сказанных тобой языках, разве что на ассемблере поюзал на пк, но особо не зашло, так как используя реализацию в виде fasm приходилось работать именно с си функциями, а не напрямую допустим с прерываниями, как в операционной системе ms dos или тем же linux (как я слышал там это возможно) (я там не программировал не на одном языке, но пользовался самой ос). Насчет си, почему ты настолько уверен в том, что он относиться именно к высокоуровевым, если абстркции там поменьше, чем в любом из языков, да и есть множество ресурсов упомянающих его как именно среднеуровневый и низкоуровневый, стоит просто загуглить и все становиться ясно. Но после сказанных тобой слов я задумался и думаю, что все же он больше всего относиться к среднеуровневым. Во всем остальном ты прав, как и в железе, тут я сглупил.
@tailogs5825
@tailogs5825 Год назад
@@motopers А, еще забыл упомянуть, на fortran что-то да учил, но особо не пользовался, так как нет надобности в этом. Да и это косается многих языков ... У меня такая проблема, что я постоянно учу языки, чем пишу на них что-либо. Такими темпами я затронул уже больше 40 языков и продолжаю это делать ... У меня просто нет идей для программ, кроме рабочих. А если они появляются, то они слишком сложные, а простое ... ну ты понял. Но как только я выбираю какой-либо язык и убираю другой, то ощущаю фантомную боль и рано или поздно возвращаюсь к изучению языков ... Не знаешь как с этим можно справиться? Я просто устал ...
@Phantom-Soft
@Phantom-Soft 9 месяцев назад
4:40 ENTER - (17) ???
@IT_Shkolnik
@IT_Shkolnik 7 месяцев назад
Спасибо за вашу бдительность, исправил в описании
Далее
Kenji's Sushi Shop Showdown - Brawl Stars Animation
01:55
Офицер, я всё объясню
01:00
Просмотров 2 млн
КАК УСТРОЕН TCP/IP?
31:32
Просмотров 117 тыс.
DIY COMPUTER from scratch!
25:03
Просмотров 2,2 млн