프로그래머가 가변 범위 이전에 무엇을 했습니까?


40

그래서, 나는 주요 방법, 변수를 정의하는 몇 가지 데이터 유형, 유형을 반환하지 않는 하위 절차 (본질적으로 공법)를 가질 수있는 겉보기에는 궁극의 언어 (PowerOn이라고 함)를 처리해야합니다. 어떤 주장도 받아들이지 않습니다. 여기서 문제는 모든 것이 세계적이라는 것입니다. 나는 이런 유형의 언어를 읽었지만 대부분의 책은 "좋아요, 우리는 말과 마차를 사용하는 데 사용하지만 지금은 자동차입니다. 그래서 그 일을하는 법을 배우자!" 우리는 그 시절을 결코 다시는 살지 않을 것입니다 . " 나는 인정해야한다. 마음은 범위와 범위 밖에서 생각하는 데 어려움을 겪고 있다 .

여기 있습니다. 여러 가지 열린 메소드 에서 전역 변수를 가장 잘 관리하는 방법을 찾으려고 합니다. 그러나 for루프 반복자조차도 전역 적으로 정의해야하므로 코드의 다른 부분에서 재활용 할 수 있습니다.

내 질문 :이 유형의 경험이있는 사람들을 위해 프로그래머는 글로벌 경기장에서 많은 양의 변수를 어떻게 처리 했습니까? 나는 그것이 정신적으로 저글링하는 트릭이되었다는 느낌을 받았지만 알려진 문제가 있는지 알고 싶습니다.


71
그들은 많이기도했습니다.
Robert Harvey

15
bob_dog_fur_colour같은 이름을 칠 가능성을 줄이기 위해 범위 등 을 근사한 많은 미친 변수 이름을 상상할 수 있습니다 .
Latty

12
그들은 범위가 더 작은 프로그램을 작성했으며 많은 버그가 있습니다.
Charles E. Grant

12
@Lattyware, 실제로 초기 시절에 변수 이름을 만드는 방법에 대해 매우 제한적이었습니다. 일부 언어는 1 ~ 2 자의 변수 이름 만 허용하고 다른 언어는 최대 8자를 허용했습니다. 빨랐지만 그때 얼마나 많이 빨랐는지 몰랐습니다. 컴파일러가 제한된 양의 메모리로 압축되도록했습니다.
Charles E. Grant

17
그들은 더 나은 프로그래밍 언어를 발명했습니다 ...
wim

답변:


44

똑바로 유지하려면 일종의 정신 부기 트릭 (이름 지정 규칙 등)이 필요합니다. 또한 문서, 문서, 문서. 모든 변수는 전역 변수이므로 가능하면 모든 변수가 나열된 단일 문서를 작성하십시오.

항상 임시에 사용하는 적은 수의 변수를 사용하고 임시 변수라는 것을 기억하십시오. 동일한 것을 지속적으로 재사용함으로써 그들이 유효한 곳을 추적하는 습관을 갖게 될 것입니다.

또한 설명서를보고 변수 이름의 길이와 실제로 고유 한 문자 수를 알고 싶습니다. PowerOn에 대해서는 아무것도 알지 못하지만 전역 범위 만 가질 정도로 구식 적 인 경우 식별자의 고유 길이가 제한 될 수 있습니다.

나는 긴 식별자로 이전에 일을 보았지만 식별자는 처음 8 자에서만 고유했습니다. 따라서 RonnyRayGun과 RonnyRayBlaster를 가질 수 있으며 실제로는 SAME 변수입니다. 이러한 경우 실수로 충돌하지 않도록 변수 이름을 '고유'제한 아래로 유지하는 것이 좋습니다.


4
+1 : 어셈블리를 작성할 때 일반적으로 레지스터 이름을 지정하면 이름이 전역 적이라는 점에서 동일한 문제가 발생합니다 (추가 이름을 만들더라도 더 많은 레지스터를 얻지 못한다는 추가 된 문제에 직면합니다). 여기에는 관련이 없습니다). 임시 값 전용 레지스터가 몇 개 있으면 생성 된 변수 수를 줄이는 데 도움이되므로 모든 것을 머리에 더 쉽게 유지할 수 있습니다. 각 함수가 어떤 변수를 사용할 것인지 (가장 중요한 것이 수정 될) 문서를 작성하면 글로벌 그림을 올바르게 얻는 데 도움이됩니다.
Leo

53

데이터 사전.

중앙 리포지토리 (일반적으로 리드 프로그래머의 사무실)에는 각 전역 변수마다 하나의 페이지를 포함하는 루스 리프 바인더가있었습니다. 이 페이지에는 이름, 정의, 목적 및 설정 또는 사용 된 루틴이 나와 있습니다.

미세한 RAM을 가진 초기 임베디드 시스템은 비슷한 문제와 비슷한 솔루션을 가지고있었습니다. 리드 프로그래머는 마스터 RAM 맵을 개별 바이트로 유지하여 어떤 모듈이 어떤 목적으로 어떤 RAM을 사용했는지 보여줍니다. 전용 RAM 할당이 필요한 프로그래머는 문제를 논의한 후 적절한 노트북 항목을 작성하여 그에게 RAM을 제공 한 수석 프로그래머에게 갔다. (당신은 수석 프로그래머와 함께 RAM 바이트를 지우지 않고 RAM 바이트를 가져간 프로그래머의 입장에 서기를 원하지 않았습니다. 이것을 믿으십시오.)

이 문제는 프로그래머가 초기 버전의 BASIC에서 큰 시스템을 구축해야 할 때도 나타났습니다. Info라고 불리는 매우 원시적 인 "데이터베이스"관리자를 사용하면서 개인적으로 나타났습니다. 이 두 언어 모두 변수 이름 어휘가 매우 제한적이었습니다.


나는 언어가 기능과 같은 프로그래밍과 함께 데이터베이스와 직접 인터페이스하는 "데이터베이스"관리자라는 점에서 매우 비슷한 상황에 처해 있습니다. 이것은 매우 도움이됩니다
Chad Harrison

1
그것은 내가 BASIC을 배우고 있었을 때를 생각 나게하고 변수는 두 글자보다 긴 이름을 가질 수 없었고 상당한 규모의 프로그램에서 그것들을 추적 할 수 없었습니다 ...
Kevin Rubin

@KevinRubin, 나에게 상기시키지 마십시오. Bill Clinton이 말했던 것처럼 아픔이 느껴집니다.
John R. Strohm

8

더 빠르고 더 큰 기계가 등장함에 따라 블록 범위가있는 프로그래밍 언어의 등장은 우연의 일치가 아닙니다. 초기 컴퓨터는 MB, kB 또는 바이트 단위로 RAM을 측정했습니다. 심지어 할 기회 단순히 없었다 프로그램이 큰 왔을 때 때문에이 혼동 될 정도로 많은 변수를 프로그램이 큰 것을 가진 적이 없어이 . 프로그래밍 언어의 발전은 대개 사람들이 경기장이 훨씬 커질 때 예전의 프로그래밍 습관이 확장되지 않았다는 것을 인식했을 때 이루어졌습니다. 블록 범위는 프로그래머가 자신의 제한된 메모리에 대한 방어 메커니즘으로 발명되었습니다.

컴퓨터가 환상적으로 비쌀 때 컴퓨팅은 훨씬 더 희귀하고 이국적인 활동이었으며, 특히 수학적으로 기울고 독창적 인 개인 만이 처음에는 프로그래머가되었습니다. 초기에는 사람들이 처음에 소프트웨어를 구매하도록 설득하기 위해 일반적으로 소프트웨어가 컴퓨터와 함께 무료로 제공되었습니다. 기관 사용자가 자신의 프로그램을 작성하려고 시도한다는 생각은 처음에는 알려지지 않았습니다.


당신은 얼마나 멀리 이야기하고 있습니까? 필자는 개인적으로 60K가 넘는 레이블을 포함하는 '데이터 풀'(즉, 글로벌 변수 목록)이있는 80 년대 초의 미니 컴퓨터 몇 대를 보았습니다.
Evan Plaice

-1 : 초기에는 컴퓨터에 액세스하기 위해 월 임대료를 지불했을뿐만 아니라 프로그램에서 사용하는 CPU주기 및 메모리에 대한 비용을 지불했습니다. 소프트웨어는 무료가 아니었고 소프트웨어를 훨씬 덜 운영했습니다.
mattnz

1
@mattnz : 얼마 전에, 소프트웨어는 종종 번들로 제공되었는데, 이는 무료와 다소 다릅니다. 일반적으로 컴퓨터가 필요한 기업은 컴퓨터를 사거나 빌려서 기계 운영 비용을 지불하지 않지만 개별 사용자는 종종 비용을 청구합니다. 또한 내 경험이 아니었기 때문에 사람들이 자신의 소프트웨어를 작성할 것으로 예상되지 않았다는 OP의 주장에 당황했습니다. 컴퓨터를 구할 수 있다면 개발 직원을 구할 수 있으며 실제로 통조림 소프트웨어가 많지 않았습니다.
David Thornley

단일 범위 프로그래밍의 문제는 컴퓨터에 여러 메가 바이트의 메모리가 있기 훨씬 전에 이미 인식되었습니다. 어휘 범위를 가진 최초의 언어 인 ALGOL은 1958 년에 등장했습니다.
kevin cline

4

몇 년 전 나의 기억력 (기억 기억).

나는 당신이 말하는 언어를 모르지만, 일반적으로 우리는 우리가 가진 것에 적응했습니다. 실제로 큰 문제는 아니 었습니다. mIORead1파일 1에서 데이터를 읽을 수있는 핸들러가 있거나 다양한 형식이있는 경우 처럼 하위 또는 함수에 대한 참조를 포함하는 var 이름 (짧은 형식으로 바이트 수는 중요 함)에 자주주의를 기울여야했습니다. i, j, k 등과 같은 카운터 변수는 재사용 할 수 있다면 자신의 시스템으로 무엇을위한 지 알았습니다. 그것은 더 하드 코어였습니다 (그 당시 헬멧이나 장갑 없음) :-)


3

현대 PLC는 이제 프로그램에 로컬 인 "태그"(일명 변수)를 가질 수 있지만 이것은 PLC 프로그래밍과 매우 유사합니다. 여전히 많은 사람들이 모든 글로벌 태그를 사용하여 프로그래밍합니다.

나는 당신이 그렇게하려면 구조적 명명 규칙을 사용해야한다는 것을 알았습니다. 예를 들면 다음과 같습니다 Motor1_DriveContactor_Run.. 언어가 구조 (때로는 사용자 정의 형식이라고도 함)를 지원하는 경우 구조를 사용하여 다음과 같은 구조화 된 데이터 계층을 만들 수도 있습니다 Motor[1].DriveContactor.Run.

그렇게하면 모든 것이 체계적으로 유지되며 일반적으로 지능은 당신을 도울만큼 적당합니다.


2

실제로 모든 것이 전 세계인 Authorware라는 언어로 프로그래밍하는 법을 배웠습니다. 운 좋게도 Arrays가 있었고 특정 지점 후에 List라고 불리는 것이 일반 객체와 비슷했습니다.

Authorware 프로그램은 실제로 물리적 구조를 가졌으며 (Authorware는 플로우 차트 메타포를 기반으로 함), 스크립팅 언어는 구식 Pascal을 기반으로했습니다. 우리가 한 것은 물리적 구조를 Array의 인덱스와 관련시키는 것이었고 종종 Array 인덱스는 우리가 사용하고있는 물리적 조각의 로컬 객체로 취급 할 List를 포함합니다.

Authorware는 eLearning 용으로 설계되었으므로 아이콘 중 하나는 Page였습니다. 페이지는 프레임 워크에 첨부됩니다. 따라서 페이지 1의 경우 인덱스 1 (Authorware는 1 인덱싱 됨)의 일부 배열을 살펴보고 해당 페이지의 데이터를 가져와 유사 객체로 작동하는 List가 저장됩니다. 그러면 Page는 이름으로 객체의 "속성"을 끌어내는 로직을 갖게됩니다. Objects와 같은 것이 없지만 Array가있는 경우 데이터가 어디로 이동하는지에 대한 규칙을 간단히 가질 수 있습니다.

데이터베이스에서 데이터를 검색하고 의존성 주입을 수행 할 때 수행하는 작업과 크게 다르지 않습니다. 단, 모든 것이 실제로 전역 적이라는 점을 제외하고는 모든 것을 작은 상자에 넣고 단순히 하나만 보도록 선택합니다. 지금 걱정하고 있습니다.

당신이하려는 일과 언어가 지원하는 것에 따라, 적어도 일을 더 관리하기 쉬운 덩어리로 나누는 데 도움이 될 수 있습니다.


또한 @ amy-blankenship이라는 Macromedia Authorware와 함께 작업했습니다. 마지막으로 작업했을 때의 버전, 아마도 3을 기억하지 못합니다. Flash / Showckwave로 대체 되었습니까? 아니면 여전히 존재합니까?
Tulains Córdova

그들은 다른 것들이었습니다. Macromedia는 웹용으로 패키지 될 때 Director를 포함하여 Shockwave를 모두 호출하여 버전 5 (둘 다)에서 많은 혼란을 야기했습니다. Authorware는 인수 후 Adobe에서 중단되었으며 Flash는 여전히 진행 중입니다.
Amy Blankenship

1

제가 대학에있을 때 우리는 "전역 변수 문제"에 대해 오랫동안 배웠습니다. 많은 전역 변수로 인한 버그와 코드 유지 문제입니다.

어떤 변수는 다른 변수보다 더 위험합니다.

안전 : 제어 흐름에 영향을 미치지 않는 변수 (예 : 성)

위험 : 프로그램의 제어 흐름에 영향을 미치는 변수, 예 : DeliveryStatus

가장 위험한 첫 번째 :

  • 복합 상태 (모드 및 하위 모드)
  • 복합 값 (전체, 소계)
  • 단일 상태 (모드)
  • 단일 값 (개수)

"전역 변수 문제"를 피하려면

  • 각 변수 와 기능을 문서화하십시오 .
  • 소스 코드의 동일한 섹션에서 관련 변수를 사용하는 코드와 함께 가깝게 유지하십시오.
  • "위험한"변수를 숨기면 다른 프로그래머는 자신의 존재를 알지 못합니다. 특히 코드의 다른 섹션에서 직접 사용하지 마십시오.
  • 위험한 변수를 읽고 쓰는 함수를 제공하십시오 (따라서 다른 프로그래머는 필요하지 않습니다).

언어 구조가없는 경우 코드구조화 하려면 주석과 이름 지정 규칙을 사용하십시오.

/* --------------------------- Program mode ------------------------ */

var Mode_Standard = 1;      // Normal operation (SubMode unused)
var Mode_Backup   = 2;      // Backup mode      (SubMode is backup device)

var BackupMode_Disk = 1;    // SubMode: Backup to disk
var BackupMode_Tape = 2;    // SubMode: Backup to tape

var MainMode = Mode_Standard;
var SubMode = 0;

function Mode_SetBackup(backupMode)
{
    MainMode = Mode_Backup;
    SubMode = backupMode;
}

function Mode_SetStandardMode()
{
    MainMode = Mode_Standard;
    SubMode  = 0;
}

function Mode_GetBackupMode()
{
    if (MainMode != Mode_Backup)
        return 0;

    return SubMode;
}

/* --------------------------- Stock Control ------------------------ */

var Stock_Total =  123;      // Total stock       (including RingFenced)
var Stock_RingFenced = 22;   // Ring-fenced stock (always less than total)

// Adds further ring-fenced stock 
function Stock_AddRingFenced(quantity)
{
    Stock_Total      += quantity;
    Stock_RingFenced += quantity;
}

/* ------------------------- Customers ----------------------- */

var Customer_FirstName = "Tony";
var Customer_LastName  = "Stark";

0

그들이 어떻게했는지 모르겠다.

그러나 현대 OOP 언어는 이름 충돌 과 관련 하여 매우 비슷한 문제가 있다고 생각합니다 .

솔루션은 네임 스페이스를 채택하고 있습니다 . 추상 개념이지만 여러 구현 (Java 패키지, .NET 네임 스페이스, Python 모듈)에서 널리 채택됩니다.

사용하는 언어의 이름 지정에 대한 제한이 너무 좁지 않으면 네임 스페이스를 적절한 변수 이름에 적용 할 수 있습니다.

따라서 변수 이름도 변수 범위를 나타냅니다.

다음과 같은 이름 지정 패턴을 정의하십시오. order_detail_product_code, order_detail_product_unit_price. 또는 임시 카운터 또는 스왑의 경우 : tmp_i, tmp_swap.


0

언어에서는 모든 변수가 전역 적 이었으므로 변수 명명 규칙을 사용했습니다. 예를 들어, 실제로 변수를 전역 변수로 사용하려면 "m_"또는 "_"접두사를 사용할 수 있습니다. 물론 이것은 여전히이 분야를 가지고 개발자에 의존

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.