Да науча ли асемблер или C, за да разбера как работи истинското програмиране?

Аз съм уеб програмист, работещ предимно в Ruby и C#..

Искам да науча език на ниско ниво, за да не изглеждам като задник пред моя (експерт по компютърни науки) шеф.

Чувал съм много пуристки бръмчене за това как асемблерният език е единственият начин да научите как всъщност работят компютрите, но от друга страна C вероятно би бил по-полезен като език, а не само за теория.

Та въпросът ми е..

Дали изучаването на C ще ме научи на достатъчно теория на компютърните науки/програмиране на ниско ниво, за да не изглеждам като обикновен денди (пълен инструмент)?

Благодаря!

Даниел


Благодаря момчета!

Някои наистина страхотни отговори,

Мисля, че ще науча C, само за да разбера управлението на паметта, но смятам, че си прав и ще е по-добре да уча повече от езиците, които използвам!


person Daniel Upton    schedule 30.12.2010    source източник
comment
Компютърните науки и как работят компютрите са два много различни звяра.   -  person Ignacio Vazquez-Abrams    schedule 30.12.2010
comment
Това не е първият път, когато срещам тези въпроси:stackoverflow.com/questions/296/should-i- learn-c stackoverflow.com/questions/ 105190/   -  person Madhur Ahuja    schedule 30.12.2010
comment
Предлагам ви да програмирате в машинен код, тъй като Истинските програмисти пишат в машинен код, използвайки двоичен код, без помощта на компилатори, линкери или асемблери. Истинските програмисти не са загрижени за производителността, а как най-добре да използват характеристиките на машината, като използват най-малко инструкции! ;-)   -  person Thomas Matthews    schedule 31.12.2010
comment
Що се отнася до това да впечатлите шефа си, просто завършете задачите преди крайния срок и се уверете, че са стабилни и правилни (представете правилни резултати) и документирани, така че да не се налага да бъдете консултирани за минали работи.   -  person Thomas Matthews    schedule 31.12.2010
comment
@Thomas Matthews Добър вик! Предпочитам да бъда надежден разработчик, отколкото маниак пурист всеки ден!   -  person Daniel Upton    schedule 01.01.2011


Отговори (11)


Първо научете истинската теория. Изучаването на синтаксиса на C не означава нищо, ако не можете да направите нищо смислено с него. След като имате солидна представа как работят алгоритмите и структурите от данни, това знание ще бъде приложимо на повечето езици, които вероятно ще използвате.

Ако планирате да работите в C# и Ruby, не виждам смисъл да учите асемблер само заради това.

Ще се справите, ако научите само C, тъй като е C.

Можете да правите "истинско програмиране" на всеки език, стига да го правите правилно.

person darioo    schedule 30.12.2010
comment
+1 за споменаването на алгоритми и структури от данни като обща основа тук. Препоръчвам на OP да се запознае с книга по тази тема, преди да премине към управление на паметта. Особено като се има предвид, че той работи с gc. - person P.Brian.Mackey; 03.01.2011

Дали изучаването на C ще ме научи на достатъчно теория на компютърните науки / програмиране на ниско ниво, за да не изглеждам като обикновен денди (пълен инструмент)?

Използвате C#, който може да извършва неуправляема манипулация на указателя, не е твърде далеч от това, което можете да постигнете в C++. Например, игрите могат да бъдат успешно програмирани в C#, въпреки че повечето игри ще бъдат C++.

Асемблерът основно премества части от паметта и понякога върши лоша работа, ако не знаете какво правите. C++/C компилаторите създават доста добър код за сглобяване отдолу, така че защо да го правите сами, освен ако не трябва да пишете драйверен софтуер от ниско ниво. Единствената част от асемблера в нашите 2 000 000 реда смесен C++/C# код е да открива VMWare.

Не мисля, че в тази модерна епоха и като се има предвид вашето описание на вашата работа, има много нужда да знаете колко регистри можете да използвате на вашия процесор. По всякакъв начин научете C++, но както споменахме по-рано, изучаването на синтаксис не е същото като научаването как да го прилагате.

Като минимум научете и разберете модели (Бандата от четирима), OO дизайн, разберете последиците и ползите от различните методологии за тестване и въздействието на всичко това върху бизнес разходите.

person GilesDMiddleton    schedule 30.12.2010
comment
О, и не забравяйте теорията на базите данни! - person GilesDMiddleton; 30.12.2010
comment
Съгласен съм, изучаването на синтаксис изобщо не означава, че знаете как да го използвате и да го използвате добре. - person bjd2385; 30.10.2014

Изучаването на C ще ви осигури цялата необходима информация и ще можете да постигнете нещата в разумен срок.

Предлагам ви да направите няколко смислени проекта на C, след това един или два на диалект на асемблер, може би за микроконтролер или специализиране в SSE/MMX.

person EnabrenTane    schedule 30.12.2010

В крайна сметка всичко се свежда до операционни кодове, регистри и режими на адресиране, от които C не ви учи на абсолютно нищо. Асемблерите обаче са тясно свързани с техните платформи; да научите как да пишете асемблер на x86 няма да ви помогне много, когато работите на Sparc или PA-RISC кутия.

C наистина няма да ви научи на много неща, които другите езици няма да направят по отношение на теорията. Нещото при C е, че той не предоставя много инструменти или абстракции освен голи указатели и потоци от байтове. Трябва да превъртите всичките си собствени контейнери (списъци, стекове, опашки и т.н.) и ако искате те да бъдат общи, трябва да разберете как да отделите кода, който трябва да бъде запознат с типа (присвоявания и сравнения) от общият алгоритъм. Трябва да управлявате собствената си памет. Обработката на текст е болка в задника (C дори не предоставя специален тип низ).

Това нещо полезно ли е да знаете за ежедневната си работа или за да впечатлите шефа си? Може би. Не съм сигурен как бихте приложили това знание във вашия C# или Ruby код, който работи във виртуална машина (за разлика от родните двоични файлове, генерирани от C).

Искате да впечатлите шефа си с познания по компютърни науки, прочетете за машините на Тюринг и алгоритмите на Марков.

person John Bode    schedule 30.12.2010

Не мисля, че познаването на Assembler ще ви направи по-добър Ruby / C# програмист.

Можете да стигнете до толкова ниско ниво, колкото да пишете на диск с помощта на магнетизирана игла, но ако вашите програми не работят или са несигурни, не бихте спечелили нищо от това.

Изучаването на синтаксиса на "нов" език няма да ви помогне да придобиете повече знания за дълбочината на програмирането.

person Linus Kleen    schedule 30.12.2010
comment
Не съм съгласен с теб. Познаването на сглобяването, поне малко от него, помага много, защото сте наясно какво точно се случва, дори ако никога не сте написали нито един ред от него. - person BlackBear; 30.12.2010
comment
@BlackBear: Как помага? Къде бихте приложили това знание в C# или Ruby код? - person John Bode; 30.12.2010
comment
знанията, които получавате с асемблирането (не самото асемблиране) ви помагат да пишете ефективен код. Опитайте книгата на Randall Hyde Write Great Code Volume 2 - person BlackBear; 30.12.2010

Истинското програмиране не се отнася до определен език за програмиране на ниско ниво. За да разберете как работи компютърът, не би било лошо да знаете някои инструкции на процесора и как хардуерът ги обработва.

За да станете добър програмист, абсолютно не е необходимо да знаете как работи хардуерът, освен ако искате да програмирате хардуер.

person frast    schedule 30.12.2010

Не бих се притеснявал да изглеждам като глупак пред този шеф, ако това са критериите, които вашият шеф има, за да не бъде глупак.

C и Assembler не са най-добрите езици, ако искате да научите компютърни науки. Тъй като знаете Ruby и C#, предполагам, че знаете някаква обектна ориентация.

person onemasse    schedule 30.12.2010

„Истинското програмиране“ работи еднакво на всеки език и това е, за което наистина трябва да се тревожите. Като се има предвид това, работата по нещо в C е много полезно упражнение/

Изучаването на C не е задължително да ви научи много за това как работят компютрите, но е добра врата за достъп до това, като се има предвид, че той все още е предпочитаният език за системно програмиране.

Изучаването на ASM, разбира се, също е полезно, но вероятно не е необходимо, ако искате да го приложите в работата си. Все пак може да ви научи на няколко полезни концепции или поне да ви помогне да разберете по-добре как работи CLR (или като цяло как компилирането на байткод и компилираният с байткод код вършат работата си). Може би бихте могли да опитате да научите ASM за по-стара/опростена платформа; все още има тежка сцена на Atari 2600 и поради присъщите ограничения на платформата, някои от хаковете, които правят, за да вкарат някои допълнителни функции в играта, са доста страхотни. Модерната x86_64 архитектура е доста сложна и донякъде космат, въпреки че това е по-скоро лично мнение, отколкото действителен факт. Да се ​​научите да използвате микроконтролер също може да свършите работата, но бъдете предупредени, че много (повечето?) използват архитектура на Харвард (т.е. отделна памет за програми и данни), която е различна от тази на типичния CPU с общо предназначение.

person donkey_lz    schedule 30.12.2010

първо попитайте шефа си, след това правете точно това, което той ви казва, накрая поискайте отново обратна връзка и преглед на упражненията, които ще правите. Дръж се подобаващо. повтаряйте, докато той каже "вече знаете повече от мен". това е по-ефективният начин за използване на опита на истински експерт, който имате късмета да имате, и ще остави изключително положително впечатление завинаги. ще бъде толкова трудно, колкото да научите C или асемблер сам в свободното си време.

person devsmt    schedule 30.12.2010

Искам да науча език на ниско ниво, за да не изглеждам като задник пред моя (експерт по компютърни науки) шеф.

Това е толкова вярно в много аспекти, научих C++ и haskell по подобни причини, не съжалявам, тъй като те ме научиха на много неща, но разбирам натиска от връстници.

Това е въпрос отпреди 6 години и е интересно да се види, че никой не спомена добър учебник по програмиране, който да обхваща основите на компютърните науки.

Ако искате да научите "истинско програмиране", просто се опитайте да се заемете със "Структура и интерпретация на компютърни програми" от MIT Press в свободното си време. Трябва да покрива повечето, ако не и цялото ви любопитство по отношение на програмирането, каквото и да е вашето ниво.

Има и "Изкуството на компютърното програмиране" от Доналд Кнут. Кнут е особено добре запознат с машинните езици и други неща от ниско ниво.


Внимавайте, въпреки че и двете произведения са много плътни.

Ето моите два цента за това как да подходя към тях. На първо място, те не са "уроци", които захаросват пътя ви към умение, те въвеждат научна дисциплина по подходящ начин, така че настройката на ума "какво ще правя с това? Как мога да използвам това?" " трябва да се замени с "как работи това? Какво прави това? Защо го прави по този начин?".

Опитайте се да правите упражненията, включени в книгите, но не се натоварвайте твърде много. Ако не можете да го направите, всичко е наред, преминете към следващия. Въпреки това, ако не правите някое от упражненията, дадени в раздел, трябва да отделите време с главата и да я прегледате, така че да можете да направите поне няколко от упражненията, включени в раздела.

Просто продължавайте така и ще настигнете своя шеф/връстник за нула време. Някои глави/упражнения може дори да бъдат предмет на разговор, ако го чувствате. Може дори да му хареса факта, че придобивате нови умения, или не, не ми вярвайте на думата, правя програмиране, не за да имам работа с хора.

person Kaan E.    schedule 06.04.2020

Е, "Истинското програмиране" не се отнася до конкретен език или езици на ниско ниво. Според мен „истинското програмиране“ е процес на анализиране на задача, решаване на най-добрия начин за решаването й и поставяне на този метод в набор от прости стъпки, след което преразглеждане и редактиране, ако е необходимо, докато постигнете целта си. Оттук нататък езикът няма особено значение, всичко е в мисловния процес. Освен това няма нищо лошо в езиците на високо ниво, аз използвам Python през цялото време и го харесвам. Въпреки това, изучаването на езици на ниско ниво може наистина да помогне за развитието на вашите програми за разбиране и компютри като цяло. би предложил c, защото от него произлизат c# и c++ и би предоставил основа за разбиране на двата езика.

person MEv2.0    schedule 28.10.2013