После ассемблеров DEC (PDP-11) и Motorola (6800, 68000) c ассемблера x86 меня всегда тошнило и выворачивало мехом внутрь :)
За “говнориски” ты зело неправ. Видимо, ты просто в них не смог :) Но спешу тебя порадовать — их создавали не для “торчков по ассемблерам”. “говнориск” показывает ту же условную производительность, что и “шоколадциск”, только содержит при этом на два порядка меньше транзисторов, работает на порядок ниже частоте, при на два порядка меньших энергозатратах. Сама Intel не раз порывалась (432, 93x), но пипл хотел и дальше хавать говно (и это было х86), и требовал только ложку по-больше (мегагерц).
И за “разумных инженеров” замечу — ни одному действительно разумному инженеру не придёт в голову мысль сделать “что-то одно и для всего вообще”. Любое универсальное решение практически всегда и во всём проиграет частному. Почему-то в IBM в своё время не нашлось (к счастью) “разумного” инженера, который такой “А давайте видеокарту тоже на 8086 забульбеним, йопта, чё мудрить-то?!”
Есть ещё более весёлый момент: сам Торвальдс прямо говорил, что не было бы никакого Linux, если бы не копирастический наезд на BSD со стороны AT&T/SCO.
При этом сам bash — один из этих самых “убийц sh” (который IEEE Std 1003.1 aka POSIX), точно так же оказавшийся в роли ещё одного «интерактивного шелла и интерпретатора простеньких скриптов»
$ ls -d /usr/ports/shells/*sh | wc -l
24
Это ещё и к имеющемуся запросу на новый шелл (об оном запросе я слышу непрерывно с конца 80-х :)
Тот же PS собирать в интерпретаторе — это боль, нельзя просто собрать пайп
Хм… Вот я давеча решил-таки наконец грохнуть дубликаты в иерархии директорий с примерно 120,000 изображений. Ровно один пайп в PowerShell. И довольно короткий — две строки (у меня 140 символов). В нём есть всё, чтобы не накосячить с удалением лишнего — сопоставление по размерам файлов, далее совпавшие по размерам сопоставляются по хэшам, и только при совпадении — удаление. Когда я думаю о том, как бы это пришлось делать в терминале FreeNAS (где всё это и хранится, то есть FreeBSD), я понимаю, что именно это-то и было бы болью на фоне PowerShell.
по буквально каждому командлету и опции приходится гуглить, что это такое и как его использовать.
Гуглить? А Get-Help Cmdlet -Full мало разве? Больше ты всё равно вряд ли нагуглишь :)
В училище была своя собственная ЭВМ?
(вспоминая стоимость и дефицитность машинного времени в 1986 году)
Вспоминая свои поездки в пару военных училищ (одно в Ленинградской области, другое в Вильнюсе) — в главном ВЦ по ЕС-1022, на кафедрах АСУ — по две М-6000. 1981 год.
Меня не очень интересует мнение военных — они занимаются, на мой взгляд, довольно бессмысленной, а главное — ужасающе непродуктивной деятельностью
Это так и в общемировом масштабе
Огромное количество исследований, становящихся в конечном итоге национальным, а то и всемирным достоянием, финансируется US DoD. В конце концов, тот же Интернет по сути был заказан и проплачен военными США. Так что про общемировой масштаб бессмысленности и непродуктивности деятельности военных я бы аккуратнее выражался. Одна и та же “бессмысленная и непродуктивная” гонка вооружений второй половины ХХ века привела одну там сверхдержаву к её полному развалу и продолжающейся деградации “наследника традиций”, а другую — к процветанию.
На основе кода em Билл Джой разработал ex, что расшифровывается как «extended ed»
После em (который разработал Джордж Колорис) вообще-то был разработан en. Билл любит шутя говорить “Не помню, были ли там eo или ep, но в конце концов это каким-то образом стало ex”, потому и по расшифровке тоже есть вопрос, не придумана ли она кем угодно из совершенно непричастных к разработке.
Позже в операционных системах появился исполняемый файл vi, но мы по-прежнему можем пользоваться командами ex, вводя: в vi/vim. Редактор ex был выпущен в 1976 году, а исполняемый файл vi — в 1979 году
“Исполняемый файл vi” был всего лишь hardlink'ом ex. То есть vi версии 2.0 (май 1979) — это не новый редактор с возможностью исполнения команд ex, а сам ex и был, просто при запуске по имени vi он сразу оказывался в visual mode.
Очень распространён миф (их много в поддержку гениальности ряда программистов тех лет), будто vi был написан Джоем за неделю. Таки это миф. На создание vi у Джоя ушло несколько месяцев. Дело в том, что разрабатывал он его дома, сидя на “рабочей” PDP-11 через модемный линк 300 бод (в отличие от рожающего тогда emacs Столлмана, в распоряжении которого была мощнейшая (сравнительно) PDP-10 с локальным терминалом). Перерисовка экрана целиком была чудовищно долгой операцией, и Джой основные усилия затратил как раз на предельную минимизацию трафика, чтобы даже при такой скорости соединения экранный режим редактирования оставался комфортным.
А ещё у Джоя не было мышки.
Оценить vi (и влюбиться в него) сложновато большинству тех, из кто начал в фантастических по сравнению с Джоем условиях — персональный компьютер с суперскоростной консолью (даже если это Hercules), поскольку для Джоя даже 1200 бод в терминале были недоступной роскошью, а 9600 (на такой скорости человек уже не успевает читать вывод) — и вовсе фантастикой. Как говорит сам Джой, “vi был создан для мира, который сегодня исчез.”
Тем не менее, в SUS присутствует vi, таким образом любая ОС, претендующая считаться unix, обязана его иметь.
PS: Кстати, то, что Томпсон сделал grep за ночь — не миф :)
Признаться, весьма удивлён, что ему пришлось это (про whiteboarding) объяснять. Видимо, недоумение огромного числа иностранцев. С другой стороны, я тоже иностранец с очень далёким от fluent английским, но прекрасно понимаю, что whiteboarding — это про групповое чесание языков по теме у доски, а не про саму доску.
Первоисточником подобного знания являются RFC и, к счастью, они с давних времен находятся в открытом доступе.
Кхе-кхе. Пардон, а что, когда-то было иначе, RFC не были в открытом доступе? Это шутка такая, или ментальные последствия жизни в тоталитарном государстве?
Ни у кого не получилось "не читать RFC", и при этом хорошо разбираться в протоколе.
Казалось бы, немыслимой сложности задача, но на самом деле всё довольно просто: открыть (всем доступно) “Kernel Programming Guide” на сайте developer.apple.com (надеюсь, это считается авторитетным источником? :), там открыть главу “BSD Overview” и прочитать собственноглазно всего лишь половинку самого первого предложения.
The BSD portion of the OS X kernel is derived primarily from FreeBSD.
Всего лишь потому, что настоящий ANSI/ISO Pascal для реального программирования не подходил никоим образом. То есть вообще. У Pascal был международный Стандарт, но на этом стандартном Pascal никогда и ничего не было написано (студенческие “ввести два числа, вывести их сумму” не считаем). Но многим хотелось. В результате появилась куча Pascal-подобных языков. Некоторые из них даже назывались Pascal'ями, но при этом Pascal'ем с точки зрения ANSI/ISO Стандарта они не являлись. Не в том смысле, что шибко расширяли Стандарт, а в том, что вообще не реализовывали его. Apple, кстати, была в этом плане хорошей честной компанией, и не называла свой язык Pascal'ем, а в Object Pascal их Clascal превратился уже много позже (они вроде даже как с Виртом перетирали эту тему).
А у C хоть и не было международного (ANSI/ISO) стандарта, но был Unix. И этого оказалось более чем достаточно для всеобщего признания K&R C как Стандарта, который надлежит соблюдать. А потом уже ANSI/ISO подтянулись.
На “совок” и работали, на кого ж ещё. Противоракеты (В-1000) программировались проволокой :) Но ПРО же состоит не только из противоракет :) Одной только «Аргунью» управляли шесть ЭВМ (каждая в современной терминологии была гарвардской двухядерной). Одной единственной РЛС «Истра» даже без стрельбового комплекса.
Хм… Складывается впечатление, будто Вирт под прессом лет то ли подзапамятовал что-то, то ли решил, что пора бы уже прибрать всю славу к рукам. Не мне, конечно, спорить со столь уважаемым (абсолютно искренне) мэтром, но напомнить есть о чём.
“Algol 60 was intended for scientific calculations (numerical mathematics) only.”
Да ладно! Algol-60 был у меня первым в промышленном программировании. И то были не scientific calculations only, а очень даже real-time missile defense systems. В отличие от fortran (как же я признателен мирозданию за то, что первым у меня всё же был не он, а именно algol).
Pascal was easy to teach, and it covered a wide spectrum of applications, which was a significant advantage over Algol, Fortran, and Cobol. The Pascal System was efficient, compact, and easy to use.
О как! По прошествии 50 лет изначальный pascal (в том числе и стандартизованный ANSI) внезапно оказался универсальным языком! При том, что имел лишь жалкие намёки на io, и вообще не имел ничего подобного хотя бы сишной (читай “файловой”) модульности (да-да, вы правильно поняли — программа людого размера могла быть только в одном единственном исходном файле, что лишь подтверждает назначение языка, см.след.абзац), из-за чего мне в своё время пришлось написать для него препроцессор.
Дедушка Никлаус сам же и заявлял, что создавал pascal как язык не для практического программирования, но для обучения программированию (структурному). И я, кстати, преподавая программирование, с огромным удовольствием именно его и использовал, pascal для этого действительно был в те временя the best. Для работы Вирт сам же взялся за Modula-2 и Oberon. А увидев взрывную популярность pascal (куча несовместимых между собой диалектов, и при этом ни одного из опробованных мной соответствующего Стандарту ANSI), Вирт сам же и сказал что-то в стиле “Главная беда pascal в том, что очень многие восприняли его слишком всерьёз”. Спустя 50 лет это решил сделать и сам создатель? Только он путает свой pascal с тем, во что его превратили early adopters.
Впрочем, Вирта я и впредь буду уважать, не pascal'ем единственным (да и вообще не pascal'ем) ценен он отрасли. С 50-летием отпрыска тебя, дед!
Мало того, мы практически не увидим там и команд процессора (внезапно). Вместо этого, там будут сплошные вызовы макрокоманд из системных макробиблиотек.
Ну, уважаемый, столь откровенную чушь-то пороть не надо. Вот под спойлером один из модулей ядра RSX-11, отвечающий за запуск ядра.
INITL.MAC
.TITLE INITL
.IDENT /10/
;
; COPYRIGHT 1974, 1978
; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.
;
; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED
; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.
;
; VERSION 10
;
; D. N. CUTLER 23-AUG-73
;
; PREVIOUSLY MODIFIED BY:
;
; D. N. CUTLER
; T. J. MILLER
;
; MODIFIED BY:
;
; B. SCHREIBER 28-JUL-77
;
; BS004 -- CHANGE TO V3.1.
;
; T. J. MILLER 14-SEP-77
;
; TM103 -- ENHANCE CLOCK SETUP AND ALIGN POOL ON EVEN
; BOUNDARY.
;
; TM104 -- PROPERLY INITIALIZE VECTORS FOR HANDLING
; FLOATING POINT PROCESSOR EXCEPTION CONDITIONS.
;
; TM105 -- ADD SUPPORT FOR ODD CSR'S AND DEVICE UNIT
; NUMBERS OVER 127.
;
; SYSTEM START UP AND INITIALIZATION ROUTINE
;
; MACRO LIBRARY CALLS
;
.MCALL HWDDF$
HWDDF$ ;DEFINE HARDWARE REGISTERS
;
; LOCAL DATA
;
; SYSTEM IDENTIFICATION MESSAGES
;
$POOL:: ;START OF POOL
.IF NDF R$$11S
SYSMG: .ASCII <15><12>/RSX11M V3.1 BL/
.IFF
SYSMG: .ASCII <15><12>/RSX11S V2.1 BL/
.ENDC
SYSID: .ASCIZ /XXXX/<15><12><12> ;
DEVMG: .ASCIZ <15><177><177><12>/ DEVICE DDUU: NOT IN CONFIGURATION/<15> ;
PROMT: .ASCIZ <15><12>/>/ ;
.EVEN
;+
; **-$INITL-SYSTEM TRANSFER ADDRESS
;
; THIS ROUTINE CONTAINS THE TRANSFER POINT OF THE RESIDENT EXECUTIVE. WHEN
; THE SYSTEM IS BOOTED, CONTROL IS TRANSFERED HERE TO INITIALIZE AND START
; UP THE SYSTEM
;-
$INITL::RESET ;RESET PROCESSOR
MOV #$SYSIZ+2,R0 ;POINT TO SYSTEM CONFIGURATION VECTOR
MOVB R3,(R0)+ ;SAVE UNIT NUMBER
MOVB R1,(R0)+ ;SAVE LBN OF LOAD IMAGE
MOV R2,(R0)+ ;
MOV R4,(R0)+ ;SAVE DEVICE NAME
MOV R5,(R0)+ ;SAVE LENGTH OF LOAD FILE
.IF DF M$$MGE
MOV #PMODE+PR7,PS ;SET MODE BITS AND LOCK OUT INTERRUPTS
MOV #$STACK-20,SP ;SETUP EXEC STACK POINTER
MOV #KISAR0,R0 ;POINT TO KERNEL PAR 0
MOV #KISDR0,R1 ;POINT TO KERNEL PDR 0
MOV #UISAR0,R2 ;POINT TO USER PAR 0
MOV #UISDR0,R3 ;POINT TO USER PDR 0
MOV #8.,R4 ;SET LOOP COUNT
CLR R5 ;START AT BOTTOM OF MEMORY
10$: MOV R5,(R0)+ ;SET KERNEL AND USER RELOCATION BIAS
MOV R5,(R2)+ ;
MOV #77406,(R1) ;SET KERNEL AND USER DESCRIPTOR REGISTERS
MOV (R1)+,(R3)+ ;
ADD #200,R5 ;ADVANCE TO NEXT 4K BLOCK
DEC R4 ;ANY MORE REGISTERS TO LOAD?
BGT 10$ ;IF GT YES
MOV #177600,-(R0) ;SET KERNEL PAR 7 TO I/O PAGE
INC SR0 ;AND AWAY WE GO
.IF DF M$$EXT
MOV #UBMPR,R0 ;POINT TO FIRST UNIBUS MAPPING REG
CLR R1 ;SET INITIAL ADDRESS TO ZERO
MOV #5.,R2 ;SET NUMBER OF REGISTER PAIRS TO LOAD
11$: MOV R1,(R0)+ ;LOAD LOW 16 BITS OF ADDRESS
CLR (R0)+ ;CLEAR HIGH 6 BITS OF ADDRESS
ADD #20000,R1 ;ADVANCE 8K BYTES
DEC R2 ;ANY MORE TO LOAD?
BGT 11$ ;IF GT YES
MOV #60,SR3 ;ENABLE 22 BIT ADDRESSING AND UB MAP
.ENDC
.IFF
MTPS #PR7 ;LOCK OUT INTERRUPTS
MOV #$STACK-10,SP ;SETUP EXEC STACK POINTER
.IFTF
MOV @#4,-(SP) ;SAVE ADDRESS OF TRAP 4 ROUTINE
MOV #TRPRT,@#4 ;SET TRAP ADDRESS FOR NONEX MEM
MOV #$SYSID,R0 ;POINT TO SYSTEM IDENTIFICATION
MOV #SYSID,R1 ;POINT TO IDENTIFICATION MESSAGE
MOVB (R0)+,(R1)+ ;MOVE SYSTEM IDENTIFICATION INTO MESSAGE
MOVB (R0)+,(R1)+ ;
MOVB (R0)+,(R1)+ ;
MOVB (R0),(R1) ;
JSR R5,OPMSG ;TELL EVERYBODY WE'RE ON THE AIR
.WORD SYSMG ;
.IFT
MOV #140000,R0 ;SET INITIAL MEMORY ADDRESS
CLR KISAR6 ;SET ZERO RELOCATION BIAS
.IFF
CLR R0 ;SET INITIAL MEMORY ADDRESS
.IFTF
CLR R1 ;ZERO NUMBER OF 32W BLOCKS IN SYSTEM
13$: TST (R0) ;MEMORY EXIST?
BCS 17$ ;IF CS NO
ADD #40,R1 ;UPDATE NUMBER OF 32W BLOCKS
.IFT
ADD #40,KISAR6 ;UPDATE RELOCATION BIAS BY 1K
.IF DF M$$EXT
CMP KISAR6,#170000 ;END OF MEMORY?
.IFF
CMP KISAR6,#7600 ;END OF MEMORY?
.ENDC
BLO 13$ ;IF LO NO
.IFF
ADD #4000,R0 ;UPDATE MEMORY ADDRESS BY 1K
CMP R0,#160000 ;END OF MEMORY?
BLO 13$ ;IF LO NO
.IFTF
17$: MOV R1,$SYSIZ ;SET SIZE OF MEMORY IN 32W BLOCKS
.IFT
MOV #1400,KISAR6 ;RESET MAPPING RELOCATION BIAS
.ENDC
MOV #$DEVHD,R5 ;GET ADDRESS OF FIRST DCB ADDRESS
20$: MOV (R5),R5 ;GET ADDRESS OF NEXT DCB
BEQ 80$ ;IF EQ NO MORE TO SCAN
MOV D.UCB(R5),R4 ;POINT TO FIRST UCB
BIT #DV.PSE,U.CW1(R4) ;PSEUDO DEVICE?
BNE 20$ ;IF NE YES
MOVB D.UNIT(R5),-(SP) ;SET STARTING LOGICAL UNIT NUMBER
MOVB D.UNIT+1(R5),-(SP) ;CALCULATE NUMBER OF UCB'S TO SCAN
SUB D.UNIT(R5),(SP) ;
INCB (SP) ;
INCB (SP) ;
30$: DECB (SP) ;ANY MORE UCB'S TO SCAN?
BNE 40$ ;IF NE YES
CMP (SP)+,(SP)+ ;CLEAN STACK
BR 20$ ;GO AGAIN
40$: CMP $SYSIZ+6,D.NAM(R5) ;DEVICE NAMES MATCH?
BNE 45$ ;IF NE NO
CMPB $SYSIZ+2,2(SP) ;UNIT NUMBERS MATCH?
BNE 45$ ;IF NE NO
MOV R4,.SY0+2 ;REDIRECT SYSTEM DEVICE
MOV R4,.LB0+2 ;REDIRECT LB: AS WELL
45$: MOV U.SCB(R4),R2 ;GET ADDRESS OF SCB
INCB 2(SP) ;UPDATE LOGICAL UNIT NUMBER
TSTB @S.CSR(R2) ;DEVICE IN SYSTEM?
BCC 60$ ;IF CC YES
BISB #US.OFL,U.ST2(R4) ;SET DEVICE OFFLINE
MOVB D.NAM(R5),DEVMG+12. ;INSERT GENERIC DEVICE NAME
MOVB D.NAM+1(R5),DEVMG+13. ;
MOV R4,R0 ;COPY ADDRESS OF UCB
SUB D.UCB(R5),R0 ;CALCULATE ADDRESS OFFSET TO UCB
MOV D.UCBL(R5),R1 ;GET LENGTH OF UCB
CALL $DIV ;CALCULATE RELATIVE UNIT NUMBER
ADD D.UNIT(R5),R0 ;CALCULATE LOGICAL UNIT NUMBER
BIC #177400,R0 ;CLEAR EXTRANEOUS BITS
MOV #8.,R1 ;SET DIVISOR
CALL $DIV ;CONVERT UNIT NUMBER TO 2 DIGITS
ADD #'0,R0 ;ADD CHARACTER BIAS
ADD #'0,R1 ;ADD CHARACTER BIAS
MOVB R0,DEVMG+14. ;INSERT DEVICE UNIT NUMBER
MOVB R1,DEVMG+15. ;
JSR R5,OPMSG ;OUTPUT DEVICE MESSAGE
.WORD DEVMG ;
60$: ADD D.UCBL(R5),R4 ;CALCULATE ADDRESS OF NEXT UCB
BR 30$ ;GO AGAIN
80$: ;REF LABEL
.IF DF P$$RTY
MOV #$PARTB,R0 ;GET ADDRESS OF PARITY CSR ADDRESS TABLE
MOV R0,R1 ;COPY ADDRESS OF TABLE
MOV #1,(R1)+ ;INSERT A ONE IN FIRST TABLE ENTRY
MOV #MPAR-2,R2 ;GET ADDRESS OF FIRST PARITY REGISTER-2
MOV #16.,R3 ;SET NUMBER OF PARITY REGISTERS
90$: ADD #2,R2 ;ADVANCE TO NEXT PARITY CSR REGISTER
MOV R2,(R1)+ ;ASSUME PARITY REGISTER PRESENT
TST (R2) ;PARITY CSR REGISTER PRESENT?
BCC 100$ ;IF CC YES
MOV R0,-2(R1) ;POINT TO FIRST WORD OF TABLE
100$: DEC R3 ;ANY MORE TO SCAN?
BGT 90$ ;IF GT YES
MOV (R1),R1 ;11/70 CACHE PARITY CSR SEARCH DONE?
BEQ 105$ ;IF EQ YES
MOV #MPCSR-10,R2 ;POINT TO FIRST CSR ADDRESS - 2
MOV #6,R3 ;SET COUNT OF REGISTERS
BR 90$ ;SEARCH FOR THEM
105$: ;REF LABEL
.ENDC
.IF DF F$$LPP
TST PIRQ ;IS THERE A PIRQ REGISTER?
BCS 106$ ;IF CS NO
MOV #$FPPRQ,@#240 ;SET UP PIRQ VECTOR
MOV #$FPPR8,@#244 ;SET UP FLOATING POINT EXCEPTION VECTOR
106$: ;REF LABEL
.ENDC
JSR R5,OPMSG ;OUTPUT INITIAL PROMPT MESSAGE
.WORD PROMT ;
.IF DF L$$SI1
MOV #$CKINT,@#100 ;SET CLOCK INTERRUPT VECTOR
.IFF
MOV $CKCSR,R0 ;GET ADDRESS OF CLOCK CSR
TST (R0) ;IS THE GENERATED CLOCK AVAILABLE?
BCC 110$ ;IF CC YES
MOV #172540,R0 ;GET ADDRESS OF KW11-P CSR
MOV R0,$CKCSR ;SETUP FOR KW11-P
MOV #172542,$CKCNT ;
MOV #K$$LDC,$CKLDC ;SET COUNT REGISTER LOAD COUNT
MOV #K$$TPS,$TKPS ;SET TICKS PER SECOND
TST (R0) ;KW11-P?
BCC 110$ ;IF CC YES
MOV #177546,R0 ;GET ADDRESS OF KW11-L CSR
MOV R0,$CKCSR ;SETUP FOR KW11-L
MOV R0,$CKCNT ;
CLR $CKLDC ;
MOV #H$$RTZ,$TKPS ;SET TICKS PER SECOND TO LINE FREQUENCY
110$: MOV #$NONSI,@#100 ;RESET KW11-L INTERRUPT VECTOR
MOV #$CKINT,104 ;SETUP KW11-P VECTOR
CMP #172540,R0 ;KW11-P?
BEQ 120$ ;IF EQ YES
MOV #$CKINT,100 ;SETUP KW11-L VECTOR
MOV #$NONSI,104 ;RESET KW11-P VECTOR
120$: MOV $CKCNT,R1 ;GET ADDRESS OF COUNT REGISTER
MOV $CKLDC,(R1) ;SETUP CLOCK COUNT REGISTER
MOV #K$$IEN,(R0) ;START CLOCK
.ENDC
.IF DF M$$MGE
MOV #PMODE+PR7,PS ;MAKE SURE PS IS SETUP PROPERLY
.ENDC
MOV #SYSMG,R0 ;SET ADDRESS OF BLOCK TO RELEASE
ADD $CRAVL-2,R0 ;ROUND TO NEXT BOUNDARY
BIC $CRAVL-2,R0 ;
MOV #$SYBEG-SYSMG,R1 ;SET LENGTH OF BLOCK TO RELEASE
CALL $DEACB ;DEALLOCATE INITIALIZATION CODE
MOV (SP)+,@#4 ;RESTORE TRAP 4 ROUTINE ADDRESS
JMP $DIRXT ;START UP THE SYSTEM
;
; SUBROUTINE TO OUTPUT A MESSAGE TO THE SYSTEM CONSOLE TERMINAL
;
OPMSG: MOV (R5)+,R1 ;GET ADDRESS OF OUTPUT MESSAGE
10$: MOVB (R1)+,R0 ;GET NEXT BYTE TO OUTPUT
BEQ 30$ ;IF EQ DONE
MOVB R0,TPS+2 ;LOAD BYTE IN OUTPUT BUFFER
20$: TSTB TPS ;PRINTER BUSY?
BCS 30$ ;IF CS NO CONSOLE TERMINAL
BPL 20$ ;IF PL YES
BR 10$ ;GO AGAIN
30$: RTS R5 ;
;
; NONEX MEM TRAP ROUTINE
;
TRPRT: BIS #1,2(SP) ;SET CARRY BIT
RTI ;
;
; END OF DYNAMIC STORAGE REGION
;
.IF NE <.-SYSMG>&3
.BLKB <.-SYSMG>&3
.ENDC
;
; BEGINNING OF DYNAMIC STORAGE REGION
;
$SYBEG::.WORD 0 ;LINK TO NEXT BLOCK IN FREE LIST
.WORD <<<C$$ORE*2>+3>&177774> ;LENGTH OF FREE BLOCK
.BLKB <<<C$$ORE*2>+3>&177774>-4 ;ALLOCATE REMAINING STORAGE
$SYTOP:: ;LAST ADDRESS IN EXECUTIVE
.END $INITL
>
Много ты здесь видишь “сплошных вызовов макрокоманд из системных библиотек”? А я вот вижу считанные единицы — CALL (который в макросе в зависимости от некоторых условий расширяется либо в JSR PC,SUBR, либо в JSR R5,SUBR), RETURN (который просто RTS PC), MTPS (который всего лишь либо чистит PSW, если аргумент #0, CLR @#PS, либо загоняет аргумент в младший байт PSW, MOVB ARG,@#PS). Прочее — самые что ни на есть чистые команды процессора (внезапно).
Могу показать RSXMC.MAC и RSXMC0.MAC — это как раз те самые “системные макрокоманды”, активно используемые в ядре. Активность использования — где-то в районе один макрос на 50 строк кода. Далековато от “сплошных вызовов макрокоманд”.
После ассемблеров DEC (PDP-11) и Motorola (6800, 68000) c ассемблера x86 меня всегда тошнило и выворачивало мехом внутрь :)
За “говнориски” ты зело неправ. Видимо, ты просто в них не смог :) Но спешу тебя порадовать — их создавали не для “торчков по ассемблерам”. “говнориск” показывает ту же условную производительность, что и “шоколадциск”, только содержит при этом на два порядка меньше транзисторов, работает на порядок ниже частоте, при на два порядка меньших энергозатратах. Сама Intel не раз порывалась (432, 93x), но пипл хотел и дальше хавать говно (и это было х86), и требовал только ложку по-больше (мегагерц).
И за “разумных инженеров” замечу — ни одному действительно разумному инженеру не придёт в голову мысль сделать “что-то одно и для всего вообще”. Любое универсальное решение практически всегда и во всём проиграет частному. Почему-то в IBM в своё время не нашлось (к счастью) “разумного” инженера, который такой “А давайте видеокарту тоже на 8086 забульбеним, йопта, чё мудрить-то?!”
“Вперёд” в сторону чего? Без уточнения непонятно, знаешь ли. В качестве примера: “Кругом и вперёд!” — это как бы “Назад!” по своей сути :)
Это ещё и к имеющемуся запросу на новый шелл (об оном запросе я слышу непрерывно с конца 80-х :)
Хм… Вот я давеча решил-таки наконец грохнуть дубликаты в иерархии директорий с примерно 120,000 изображений. Ровно один пайп в PowerShell. И довольно короткий — две строки (у меня 140 символов). В нём есть всё, чтобы не накосячить с удалением лишнего — сопоставление по размерам файлов, далее совпавшие по размерам сопоставляются по хэшам, и только при совпадении — удаление. Когда я думаю о том, как бы это пришлось делать в терминале FreeNAS (где всё это и хранится, то есть FreeBSD), я понимаю, что именно это-то и было бы болью на фоне PowerShell.
Гуглить? А
Get-Help Cmdlet -Full
мало разве? Больше ты всё равно вряд ли нагуглишь :)Вспоминая свои поездки в пару военных училищ (одно в Ленинградской области, другое в Вильнюсе) — в главном ВЦ по ЕС-1022, на кафедрах АСУ — по две М-6000. 1981 год.
Огромное количество исследований, становящихся в конечном итоге национальным, а то и всемирным достоянием, финансируется US DoD. В конце концов, тот же Интернет по сути был заказан и проплачен военными США. Так что про общемировой масштаб бессмысленности и непродуктивности деятельности военных я бы аккуратнее выражался. Одна и та же “бессмысленная и непродуктивная” гонка вооружений второй половины ХХ века привела одну там сверхдержаву к её полному развалу и продолжающейся деградации “наследника традиций”, а другую — к процветанию.
«Я сама дочь офицера, не всё так однозначно»
После em (который разработал Джордж Колорис) вообще-то был разработан en. Билл любит шутя говорить “Не помню, были ли там eo или ep, но в конце концов это каким-то образом стало ex”, потому и по расшифровке тоже есть вопрос, не придумана ли она кем угодно из совершенно непричастных к разработке.
“Исполняемый файл vi” был всего лишь hardlink'ом ex. То есть vi версии 2.0 (май 1979) — это не новый редактор с возможностью исполнения команд ex, а сам ex и был, просто при запуске по имени vi он сразу оказывался в visual mode.
Очень распространён миф (их много в поддержку гениальности ряда программистов тех лет), будто vi был написан Джоем за неделю. Таки это миф. На создание vi у Джоя ушло несколько месяцев. Дело в том, что разрабатывал он его дома, сидя на “рабочей” PDP-11 через модемный линк 300 бод (в отличие от рожающего тогда emacs Столлмана, в распоряжении которого была мощнейшая (сравнительно) PDP-10 с локальным терминалом). Перерисовка экрана целиком была чудовищно долгой операцией, и Джой основные усилия затратил как раз на предельную минимизацию трафика, чтобы даже при такой скорости соединения экранный режим редактирования оставался комфортным.
А ещё у Джоя не было мышки.
Оценить vi (и влюбиться в него) сложновато большинству тех, из кто начал в фантастических по сравнению с Джоем условиях — персональный компьютер с суперскоростной консолью (даже если это Hercules), поскольку для Джоя даже 1200 бод в терминале были недоступной роскошью, а 9600 (на такой скорости человек уже не успевает читать вывод) — и вовсе фантастикой. Как говорит сам Джой, “vi был создан для мира, который сегодня исчез.”
Тем не менее, в SUS присутствует vi, таким образом любая ОС, претендующая считаться unix, обязана его иметь.
PS: Кстати, то, что Томпсон сделал grep за ночь — не миф :)
Кхе-кхе. Пардон, а что, когда-то было иначе, RFC не были в открытом доступе? Это шутка такая, или ментальные последствия жизни в тоталитарном государстве?
Ни у кого не получилось "не читать RFC", и при этом хорошо разбираться в протоколе.
хорошейчестной компанией, и не называла свой язык Pascal'ем, а в Object Pascal их Clascal превратился уже много позже (они вроде даже как с Виртом перетирали эту тему).А у C хоть и не было международного (ANSI/ISO) стандарта, но был Unix. И этого оказалось более чем достаточно для всеобщего признания K&R C как Стандарта, который надлежит соблюдать. А потом уже ANSI/ISO подтянулись.
Да ладно! Algol-60 был у меня первым в промышленном программировании. И то были не scientific calculations only, а очень даже real-time missile defense systems. В отличие от fortran (как же я признателен мирозданию за то, что первым у меня всё же был не он, а именно algol).
О как! По прошествии 50 лет изначальный pascal (в том числе и стандартизованный ANSI) внезапно оказался универсальным языком! При том, что имел лишь жалкие намёки на io, и вообще не имел ничего подобного хотя бы сишной (читай “файловой”) модульности (да-да, вы правильно поняли — программа людого размера могла быть только в одном единственном исходном файле, что лишь подтверждает назначение языка, см.след.абзац), из-за чего мне в своё время пришлось написать для него препроцессор.
Дедушка Никлаус сам же и заявлял, что создавал pascal как язык не для практического программирования, но для обучения программированию (структурному). И я, кстати, преподавая программирование, с огромным удовольствием именно его и использовал, pascal для этого действительно был в те временя the best. Для работы Вирт сам же взялся за Modula-2 и Oberon. А увидев взрывную популярность pascal (куча несовместимых между собой диалектов, и при этом ни одного из опробованных мной соответствующего Стандарту ANSI), Вирт сам же и сказал что-то в стиле “Главная беда pascal в том, что очень многие восприняли его слишком всерьёз”. Спустя 50 лет это решил сделать и сам создатель? Только он путает свой pascal с тем, во что его превратили early adopters.
Впрочем, Вирта я и впредь буду уважать, не pascal'ем единственным (да и вообще не pascal'ем) ценен он отрасли. С 50-летием отпрыска тебя, дед!
Ну, уважаемый, столь откровенную чушь-то пороть не надо. Вот под спойлером один из модулей ядра RSX-11, отвечающий за запуск ядра.
Много ты здесь видишь “сплошных вызовов макрокоманд из системных библиотек”? А я вот вижу считанные единицы —
CALL
(который в макросе в зависимости от некоторых условий расширяется либо вJSR PC,SUBR
, либо вJSR R5,SUBR
),RETURN
(который простоRTS PC
),MTPS
(который всего лишь либо чистит PSW, если аргумент #0,CLR @#PS
, либо загоняет аргумент в младший байт PSW,MOVB ARG,@#PS
). Прочее — самые что ни на есть чистые команды процессора (внезапно).Могу показать RSXMC.MAC и RSXMC0.MAC — это как раз те самые “системные макрокоманды”, активно используемые в ядре. Активность использования — где-то в районе один макрос на 50 строк кода. Далековато от “сплошных вызовов макрокоманд”.