Poziomy podstawowe:
Spójrzmy na rzeczy na najprostszym i najbardziej podstawowym poziomie.
W przypadku matematyki mamy:
2 + 3 = 5
Dowiedziałem się o tym, gdy byłem bardzo, bardzo młody. Potrafię spojrzeć na najbardziej podstawowe elementy: dwa obiekty i trzy obiekty. Wspaniały.
Do programowania komputerów większość ludzi używa języka wysokiego poziomu. Niektóre języki wysokiego poziomu można nawet „skompilować” w jednym z niższych języków wysokiego poziomu, np. C. C można następnie przetłumaczyć na język asemblera. Język asemblera jest następnie konwertowany na kod maszynowy. Wiele osób uważa, że złożoność się na tym kończy, ale tak nie jest: nowoczesne procesory traktują kod maszynowy jako instrukcje, ale następnie uruchamiają „mikro kod”, aby faktycznie wykonać te instrukcje.
Oznacza to, że na najbardziej podstawowym poziomie (w przypadku najprostszych struktur) mamy teraz do czynienia z mikrokodem, który jest wbudowany w sprzęt i którego większość programistów nawet nie używa bezpośrednio, ani nie aktualizuje. W rzeczywistości nie tylko większość programistów nie dotyka mikrokodu (0 poziomów wyższych niż mikro kod), większość programistów nie dotyka kodu maszynowego (1 poziom wyżej niż mikro kod), ani nawet zestawu (2 poziomy wyższe niż mikro kod) ( z wyjątkiem być może nieco formalnego szkolenia podczas studiów). Większość programistów spędza czas tylko o 3 lub więcej poziomów wyżej.
Ponadto, jeśli spojrzymy na Zgromadzenie (które jest tak niskie, jak zwykle ludzie), każdy pojedynczy krok jest zazwyczaj zrozumiały dla osób przeszkolonych i posiadających zasoby do interpretacji tego kroku. W tym sensie asemblacja jest znacznie prostsza niż język wyższego poziomu. Jednak montaż jest tak prosty, że wykonywanie skomplikowanych zadań, a nawet miernych zadań, jest bardzo żmudne. Języki wyższego poziomu uwalniają nas od tego.
W prawie dotyczącym „inżynierii wstecznej” sędzia oświadczył, że nawet jeśli teoretycznie kod może być obsługiwany jeden bajt na raz, współczesne programy zawierają miliony bajtów, więc dla tego rodzaju rekordów (takich jak kopie kodu) należy utworzyć wysiłek, aby być wykonalnym. (Dlatego rozwój wewnętrzny nie został uznany za naruszenie ogólnej zasady prawa autorskiego „nie robienie kopii”). (Prawdopodobnie myślę o tworzeniu nieautoryzowanych kartridży Sega Genesis, ale mogę myśleć o czymś powiedzonym w sprawie Game Genie. )
Modernizacja:
Czy korzystasz z kodu przeznaczonego na 286s? A może uruchamiasz 64-bitowy kod?
Matematyka wykorzystuje podstawy, które sięgają tysiącleci. W przypadku komputerów ludzie zwykle uważają inwestowanie w coś sprzed dwudziestu lat za bezużyteczne marnowanie zasobów. Oznacza to, że matematyka może być o wiele dokładniej przetestowana.
Standardy używanych narzędzi:
Nauczono mnie (przez znajomego, który odbył bardziej formalne szkolenie z programowania komputerowego niż ja), że nie ma czegoś takiego jak bezbłędny kompilator C, który spełnia specyfikację C. Wynika to z faktu, że język C zasadniczo zakłada możliwość korzystania z nieskończonej pamięci na potrzeby stosu. Oczywiście od takiego niemożliwego wymogu trzeba było odstąpić, gdy ludzie próbowali stworzyć użyteczne kompilatory, które działałyby na rzeczywistych maszynach, które mają nieco bardziej skończony charakter.
W praktyce odkryłem, że dzięki JScript w Windows Script Host udało mi się osiągnąć wiele dobrych zastosowań. (Podoba mi się środowisko, ponieważ zestaw narzędzi potrzebny do wypróbowania nowego kodu jest wbudowany w nowoczesne wersje systemu Microsoft Windows). Korzystając z tego środowiska, zauważyłem, że czasami nie ma łatwo dostępnej dokumentacji dotyczącej działania obiektu. Jednak korzystanie z obiektu jest tak korzystne, że i tak to robię. Więc napisałbym kod, który może być błędny jak gniazdo szerszeni, i robiłbym to w ładnie otoczonym piaskownicą środowisku, w którym widzę efekty i dowiaduję się o zachowaniu obiektu podczas interakcji z nim.
W innych przypadkach, czasami dopiero po ustaleniu, jak zachowuje się obiekt, stwierdziłem, że obiekt (w pakiecie z systemem operacyjnym) jest wadliwy i że jest to znany problem, który Microsoft celowo zdecydował, że nie zostanie naprawiony .
W takich scenariuszach, czy polegam na OpenBSD, stworzonym przez mistrzowskich programistów, którzy regularnie tworzą nowe wydania zgodnie z harmonogramem (dwa razy w roku), ze słynnym zapisem bezpieczeństwa „tylko dwóch odległych dziur” od ponad 10 lat? (Nawet mają łatki erraty dla mniej poważnych problemów.) Nie, w żadnym wypadku. Nie polegam na takim produkcie o tak wyższej jakości, ponieważ pracuję dla firmy, która wspiera firmy dostarczające ludziom komputery korzystające z systemu Microsoft Windows, więc na tym powinien działać mój kod.
Praktyczność / użyteczność wymagają pracy na platformach, które ludzie uważają za użyteczne, i jest to platforma, która jest bardzo niebezpieczna dla bezpieczeństwa (mimo że od samego początku tysiąclecia dokonano ogromnych ulepszeń, które znacznie pogorszyły produkty tej samej firmy) .
Podsumowanie
Istnieje wiele powodów, dla których programowanie komputerowe jest bardziej podatne na błędy i jest to akceptowane przez społeczność użytkowników komputerów. W rzeczywistości większość kodu jest napisana w środowiskach, które nie będą tolerować bezbłędnych wysiłków. (Niektóre wyjątki, takie jak opracowanie protokołów bezpieczeństwa, mogą wymagać nieco więcej wysiłku w tym zakresie.) Oprócz powszechnie myślących powodów, dla których firmy nie chcą inwestować więcej pieniędzy i nie dotrzymują sztucznych terminów, aby zadowolić klientów, istnieje wpływ marsz technologii, który po prostu stwierdza, że jeśli spędzisz zbyt dużo czasu, będziesz pracować na przestarzałej platformie, ponieważ rzeczy zmieniają się znacząco w ciągu dekady.
Od razu pamiętam, jak byłem zaskoczony tym, jak krótkie były niektóre bardzo przydatne i popularne funkcje, kiedy zobaczyłem kod źródłowy strlen i strcpy. Na przykład strlen mógł być czymś w rodzaju „int strlen (char * x) {char y = x; while ( (y ++)); return (yx) -1;}”
Jednak typowe programy komputerowe są znacznie dłuższe. Ponadto wiele współczesnych programów będzie wykorzystywać inny kod, który może być mniej dokładnie przetestowany, a nawet być błędny. Dzisiejsze systemy są znacznie bardziej skomplikowane niż to, co można łatwo przemyśleć, z wyjątkiem ręcznego wymachiwania wielu drobiazgów jako „szczegółów obsługiwanych przez niższe poziomy”.
Ta obowiązkowa złożoność i pewność pracy ze złożonymi, a nawet niewłaściwymi systemami sprawia, że programowanie komputerowe jest dużo sprzętem do weryfikacji niż wiele matematyki, w których sprawy sprowadzają się do znacznie prostszych poziomów.
Kiedy rozkładasz rzeczy w matematyce, dochodzisz do pojedynczych elementów, które dzieci mogą zrozumieć. Większość ludzi ufa matematyce; przynajmniej podstawowa arytmetyka (lub przynajmniej liczenie).
Kiedy naprawdę rozkładasz programowanie komputerowe, aby zobaczyć, co dzieje się pod maską, kończysz się zepsutymi implementacjami złamanych standardów i kodu, który ostatecznie jest wykonywany elektronicznie, a ta fizyczna implementacja jest tylko o jeden krok poniżej mikrokodu, który daje większość wyszkolonych informatyków nie waż się dotykać (nawet jeśli są tego świadomi).
Rozmawiałem z niektórymi programistami, którzy są na studiach lub absolwentami, którzy wprost sprzeciwiają się pomysłowi, że można napisać kod bez błędów. Zrezygnowali z tej możliwości i chociaż przyznają, że niektóre imponujące przykłady (które udało mi się wykazać) są przekonującymi argumentami, uważają takie próbki za niereprezentatywne rzadkie błędy i nadal odrzucają możliwość liczenia na takie wyższe standardy. (Znacznie inne podejście niż o wiele bardziej wiarygodne podstawy, które widzimy w matematyce).